From e309942b29c873c9cdf5ed3264e4828a7efb074c Mon Sep 17 00:00:00 2001 From: Tom St Denis Date: Thu, 19 Jun 2003 15:23:20 +0000 Subject: [PATCH] added libtomcrypt-0.87 --- aes.c | 486 ++++++-------- aes_tab.c | 1581 +++++++++++++++++++++++++++------------------- blowfish.c | 43 +- cast5.c | 18 +- changes | 5 + config.pl | 4 +- crypt.pdf | Bin 412364 -> 412260 bytes crypt.tex | 2 +- demos/x86_prof.c | 213 +++++-- makefile | 12 +- makefile.msvc | 3 +- md5.c | 2 +- mycrypt_custom.h | 3 +- mycrypt_macros.h | 18 + noekeon.c | 13 +- rc5.c | 43 +- rc6.c | 50 +- tiger.c | 23 +- twofish.c | 376 +++++++---- 19 files changed, 1697 insertions(+), 1198 deletions(-) diff --git a/aes.c b/aes.c index 3165704..462cd44 100644 --- a/aes.c +++ b/aes.c @@ -48,7 +48,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; - unsigned long temp, *rk; + unsigned long temp, *rk, *rrk; _ARGCHK(key != NULL); _ARGCHK(skey != NULL); @@ -70,13 +70,14 @@ int rijndael_setup(const unsigned char *key, int keylen, int rounds, symmetric_k LOAD32H(rk[2], key + 8); LOAD32H(rk[3], key + 12); if (keylen == 16) { + j = 44; for (;;) { temp = rk[3]; rk[4] = rk[0] ^ - (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ - (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ - (Te4[(temp ) & 0xff] & 0x0000ff00) ^ - (Te4[(temp >> 24) ] & 0x000000ff) ^ + (Te4_3[byte(temp, 2)]) ^ + (Te4_2[byte(temp, 1)]) ^ + (Te4_1[byte(temp, 0)]) ^ + (Te4_0[byte(temp, 3)]) ^ rcon[i]; rk[5] = rk[1] ^ rk[4]; rk[6] = rk[2] ^ rk[5]; @@ -87,6 +88,7 @@ int rijndael_setup(const unsigned char *key, int keylen, int rounds, symmetric_k rk += 4; } } else if (keylen == 24) { + j = 52; LOAD32H(rk[4], key + 16); LOAD32H(rk[5], key + 20); for (;;) { @@ -96,10 +98,10 @@ int rijndael_setup(const unsigned char *key, int keylen, int rounds, symmetric_k temp = rk[5]; #endif rk[ 6] = rk[ 0] ^ - (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ - (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ - (Te4[(temp ) & 0xff] & 0x0000ff00) ^ - (Te4[(temp >> 24) ] & 0x000000ff) ^ + (Te4_3[byte(temp, 2)]) ^ + (Te4_2[byte(temp, 1)]) ^ + (Te4_1[byte(temp, 0)]) ^ + (Te4_0[byte(temp, 3)]) ^ rcon[i]; rk[ 7] = rk[ 1] ^ rk[ 6]; rk[ 8] = rk[ 2] ^ rk[ 7]; @@ -112,6 +114,7 @@ int rijndael_setup(const unsigned char *key, int keylen, int rounds, symmetric_k rk += 6; } } else if (keylen == 32) { + j = 60; LOAD32H(rk[4], key + 16); LOAD32H(rk[5], key + 20); LOAD32H(rk[6], key + 24); @@ -123,10 +126,10 @@ int rijndael_setup(const unsigned char *key, int keylen, int rounds, symmetric_k temp = rk[7]; #endif rk[ 8] = rk[ 0] ^ - (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ - (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ - (Te4[(temp ) & 0xff] & 0x0000ff00) ^ - (Te4[(temp >> 24) ] & 0x000000ff) ^ + (Te4_3[byte(temp, 2)]) ^ + (Te4_2[byte(temp, 1)]) ^ + (Te4_1[byte(temp, 0)]) ^ + (Te4_0[byte(temp, 3)]) ^ rcon[i]; rk[ 9] = rk[ 1] ^ rk[ 8]; rk[10] = rk[ 2] ^ rk[ 9]; @@ -136,64 +139,105 @@ int rijndael_setup(const unsigned char *key, int keylen, int rounds, symmetric_k } temp = rk[11]; rk[12] = rk[ 4] ^ - (Te4[(temp >> 24) ] & 0xff000000) ^ - (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^ - (Te4[(temp >> 8) & 0xff] & 0x0000ff00) ^ - (Te4[(temp ) & 0xff] & 0x000000ff); + (Te4_3[byte(temp, 3)]) ^ + (Te4_2[byte(temp, 2)]) ^ + (Te4_1[byte(temp, 1)]) ^ + (Te4_0[byte(temp, 0)]); rk[13] = rk[ 5] ^ rk[12]; rk[14] = rk[ 6] ^ rk[13]; rk[15] = rk[ 7] ^ rk[14]; rk += 8; } + } else { + /* this can't happen */ + j = 4; } /* setup the inverse key now */ - memcpy(skey->rijndael.dK, skey->rijndael.eK, sizeof(skey->rijndael.eK)); - rk = skey->rijndael.dK; + rk = skey->rijndael.dK; + rrk = skey->rijndael.eK + j - 4; - for (i = 0, j = 4*skey->rijndael.Nr; i < j; i += 4, j -= 4) { - temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp; - temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp; - temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp; - temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp; - } /* apply the inverse MixColumn transform to all round keys but the first and the last: */ - for (i = 1; i < skey->rijndael.Nr; i++) { - rk += 4; - rk[0] = - Td0[Te4[(rk[0] >> 24) ] & 0xff] ^ - Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^ - Td2[Te4[(rk[0] >> 8) & 0xff] & 0xff] ^ - Td3[Te4[(rk[0] ) & 0xff] & 0xff]; - rk[1] = - Td0[Te4[(rk[1] >> 24) ] & 0xff] ^ - Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^ - Td2[Te4[(rk[1] >> 8) & 0xff] & 0xff] ^ - Td3[Te4[(rk[1] ) & 0xff] & 0xff]; - rk[2] = - Td0[Te4[(rk[2] >> 24) ] & 0xff] ^ - Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^ - Td2[Te4[(rk[2] >> 8) & 0xff] & 0xff] ^ - Td3[Te4[(rk[2] ) & 0xff] & 0xff]; - rk[3] = - Td0[Te4[(rk[3] >> 24) ] & 0xff] ^ - Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^ - Td2[Te4[(rk[3] >> 8) & 0xff] & 0xff] ^ - Td3[Te4[(rk[3] ) & 0xff] & 0xff]; - } + /* copy first */ + *rk++ = *rrk++; + *rk++ = *rrk++; + *rk++ = *rrk++; + *rk = *rrk; + rk -= 3; rrk -= 3; + for (i = 1; i < skey->rijndael.Nr; i++) { + rrk -= 4; + rk += 4; + #ifdef SMALL_CODE + temp = rrk[0]; + rk[0] = + Td0[255 & Te4[byte(temp, 3)]] ^ + Td1[255 & Te4[byte(temp, 2)]] ^ + Td2[255 & Te4[byte(temp, 1)]] ^ + Td3[255 & Te4[byte(temp, 0)]]; + temp = rrk[1]; + rk[1] = + Td0[255 & Te4[byte(temp, 3)]] ^ + Td1[255 & Te4[byte(temp, 2)]] ^ + Td2[255 & Te4[byte(temp, 1)]] ^ + Td3[255 & Te4[byte(temp, 0)]]; + temp = rrk[2]; + rk[2] = + Td0[255 & Te4[byte(temp, 3)]] ^ + Td1[255 & Te4[byte(temp, 2)]] ^ + Td2[255 & Te4[byte(temp, 1)]] ^ + Td3[255 & Te4[byte(temp, 0)]]; + temp = rrk[3]; + rk[3] = + Td0[255 & Te4[byte(temp, 3)]] ^ + Td1[255 & Te4[byte(temp, 2)]] ^ + Td2[255 & Te4[byte(temp, 1)]] ^ + Td3[255 & Te4[byte(temp, 0)]]; + #else + temp = rrk[0]; + rk[0] = + Tks0[byte(temp, 3)] ^ + Tks1[byte(temp, 2)] ^ + Tks2[byte(temp, 1)] ^ + Tks3[byte(temp, 0)]; + temp = rrk[1]; + rk[1] = + Tks0[byte(temp, 3)] ^ + Tks1[byte(temp, 2)] ^ + Tks2[byte(temp, 1)] ^ + Tks3[byte(temp, 0)]; + temp = rrk[2]; + rk[2] = + Tks0[byte(temp, 3)] ^ + Tks1[byte(temp, 2)] ^ + Tks2[byte(temp, 1)] ^ + Tks3[byte(temp, 0)]; + temp = rrk[3]; + rk[3] = + Tks0[byte(temp, 3)] ^ + Tks1[byte(temp, 2)] ^ + Tks2[byte(temp, 1)] ^ + Tks3[byte(temp, 0)]; + #endif + + } + + /* copy last */ + rrk -= 4; + rk += 4; + *rk++ = *rrk++; + *rk++ = *rrk++; + *rk++ = *rrk++; + *rk = *rrk; + return CRYPT_OK; } void rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey) { unsigned long s0, s1, s2, s3, t0, t1, t2, t3, *rk; - int Nr; - -#ifdef SMALL_CODE - int r; -#endif - + int Nr, r; + _ARGCHK(pt != NULL); _ARGCHK(ct != NULL); _ARGCHK(skey != NULL); @@ -209,78 +253,7 @@ void rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_ LOAD32H(s1, pt + 4); s1 ^= rk[1]; LOAD32H(s2, pt + 8); s2 ^= rk[2]; LOAD32H(s3, pt + 12); s3 ^= rk[3]; -#ifndef SMALL_CODE - /* round 1: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7]; - /* round 2: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11]; - /* round 3: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15]; - /* round 4: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19]; - /* round 5: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23]; - /* round 6: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27]; - /* round 7: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31]; - /* round 8: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35]; - /* round 9: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39]; - if (Nr > 10) { - /* round 10: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43]; - /* round 11: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47]; - if (Nr > 12) { - /* round 12: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51]; - /* round 13: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55]; - } - } - rk += Nr << 2; -#else /* SMALL_CODE */ + /* * Nr - 1 full rounds: */ @@ -288,36 +261,36 @@ void rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_ for (;;) { /* Both of these blocks are equivalent except the top is more friendlier for x86 processors */ -#if 1 +#if defined(__GNUC__) t0 = rk[4]; t1 = rk[5]; t2 = rk[6]; t3 = rk[7]; - t1 ^= Te3[(s0 ) & 0xFF]; t2 ^= Te2[(s0 >> 8) & 0xFF]; t3 ^= Te1[(s0 >> 16) & 0xFF]; t0 ^= Te0[(s0 >> 24)]; - t2 ^= Te3[(s1 ) & 0xFF]; t3 ^= Te2[(s1 >> 8) & 0xFF]; t0 ^= Te1[(s1 >> 16) & 0xFF]; t1 ^= Te0[(s1 >> 24)]; - t3 ^= Te3[(s2 ) & 0xFF]; t0 ^= Te2[(s2 >> 8) & 0xFF]; t1 ^= Te1[(s2 >> 16) & 0xFF]; t2 ^= Te0[(s2 >> 24)]; - t0 ^= Te3[(s3 ) & 0xFF]; t1 ^= Te2[(s3 >> 8) & 0xFF]; t2 ^= Te1[(s3 >> 16) & 0xFF]; t3 ^= Te0[(s3 >> 24)]; + t1 ^= Te3[byte(s0, 0)]; t2 ^= Te2[byte(s0, 1)]; t3 ^= Te1[byte(s0, 2)]; t0 ^= Te0[byte(s0, 3)]; + t2 ^= Te3[byte(s1, 0)]; t3 ^= Te2[byte(s1, 1)]; t0 ^= Te1[byte(s1, 2)]; t1 ^= Te0[byte(s1, 3)]; + t3 ^= Te3[byte(s2, 0)]; t0 ^= Te2[byte(s2, 1)]; t1 ^= Te1[byte(s2, 2)]; t2 ^= Te0[byte(s2, 3)]; + t0 ^= Te3[byte(s3, 0)]; t1 ^= Te2[byte(s3, 1)]; t2 ^= Te1[byte(s3, 2)]; t3 ^= Te0[byte(s3, 3)]; #else t0 = - Te0[(s0 >> 24) ] ^ - Te1[(s1 >> 16) & 0xff] ^ - Te2[(s2 >> 8) & 0xff] ^ - Te3[(s3 ) & 0xff] ^ + Te0[byte(s0, 3)] ^ + Te1[byte(s1, 2)] ^ + Te2[byte(s2, 1)] ^ + Te3[byte(s3, 0)] ^ rk[4]; t1 = - Te0[(s1 >> 24) ] ^ - Te1[(s2 >> 16) & 0xff] ^ - Te2[(s3 >> 8) & 0xff] ^ - Te3[(s0 ) & 0xff] ^ + Te0[byte(s1, 3)] ^ + Te1[byte(s2, 2)] ^ + Te2[byte(s3, 1)] ^ + Te3[byte(s0, 0)] ^ rk[5]; t2 = - Te0[(s2 >> 24) ] ^ - Te1[(s3 >> 16) & 0xff] ^ - Te2[(s0 >> 8) & 0xff] ^ - Te3[(s1 ) & 0xff] ^ + Te0[byte(s2, 3)] ^ + Te1[byte(s3, 2)] ^ + Te2[byte(s0, 1)] ^ + Te3[byte(s1, 0)] ^ rk[6]; t3 = - Te0[(s3 >> 24) ] ^ - Te1[(s0 >> 16) & 0xff] ^ - Te2[(s1 >> 8) & 0xff] ^ - Te3[(s2 ) & 0xff] ^ + Te0[byte(s3, 3)] ^ + Te1[byte(s0, 2)] ^ + Te2[byte(s1, 1)] ^ + Te3[byte(s2, 0)] ^ rk[7]; #endif @@ -329,78 +302,74 @@ void rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_ /* this second half optimization actually makes it slower on the Athlon, use with caution. */ #if 0 s1 = rk[1]; s2 = rk[2]; s3 = rk[3]; s0 = rk[0]; - s1 ^= Te3[(t0 ) & 0xFF]; s2 ^= Te2[(t0 >> 8) & 0xFF]; s3 ^= Te1[(t0 >> 16) & 0xFF]; s0 ^= Te0[(t0 >> 24)]; - s2 ^= Te3[(t1 ) & 0xFF]; s3 ^= Te2[(t1 >> 8) & 0xFF]; s0 ^= Te1[(t1 >> 16) & 0xFF]; s1 ^= Te0[(t1 >> 24)]; - s3 ^= Te3[(t2 ) & 0xFF]; s0 ^= Te2[(t2 >> 8) & 0xFF]; s1 ^= Te1[(t2 >> 16) & 0xFF]; s2 ^= Te0[(t2 >> 24)]; - s0 ^= Te3[(t3 ) & 0xFF]; s1 ^= Te2[(t3 >> 8) & 0xFF]; s2 ^= Te1[(t3 >> 16) & 0xFF]; s3 ^= Te0[(t3 >> 24)]; + s1 ^= Te3[byte(t0, 0)]; s2 ^= Te2[byte(t0, 1)]; s3 ^= Te1[byte(t0, 2)]; s0 ^= Te0[byte(t0, 3)]; + s2 ^= Te3[byte(t1, 0)]; s3 ^= Te2[byte(t1, 1)]; s0 ^= Te1[byte(t1, 2)]; s1 ^= Te0[byte(t1, 3)]; + s3 ^= Te3[byte(t2, 0)]; s0 ^= Te2[byte(t2, 1)]; s1 ^= Te1[byte(t2, 2)]; s2 ^= Te0[byte(t2, 3)]; + s0 ^= Te3[byte(t3, 0)]; s1 ^= Te2[byte(t3, 1)]; s2 ^= Te1[byte(t3, 2)]; s3 ^= Te0[byte(t3, 3)]; #else s0 = - Te0[(t0 >> 24) ] ^ - Te1[(t1 >> 16) & 0xff] ^ - Te2[(t2 >> 8) & 0xff] ^ - Te3[(t3 ) & 0xff] ^ + Te0[byte(t0, 3)] ^ + Te1[byte(t1, 2)] ^ + Te2[byte(t2, 1)] ^ + Te3[byte(t3, 0)] ^ rk[0]; s1 = - Te0[(t1 >> 24) ] ^ - Te1[(t2 >> 16) & 0xff] ^ - Te2[(t3 >> 8) & 0xff] ^ - Te3[(t0 ) & 0xff] ^ + Te0[byte(t1, 3)] ^ + Te1[byte(t2, 2)] ^ + Te2[byte(t3, 1)] ^ + Te3[byte(t0, 0)] ^ rk[1]; s2 = - Te0[(t2 >> 24) ] ^ - Te1[(t3 >> 16) & 0xff] ^ - Te2[(t0 >> 8) & 0xff] ^ - Te3[(t1 ) & 0xff] ^ + Te0[byte(t2, 3)] ^ + Te1[byte(t3, 2)] ^ + Te2[byte(t0, 1)] ^ + Te3[byte(t1, 0)] ^ rk[2]; s3 = - Te0[(t3 >> 24) ] ^ - Te1[(t0 >> 16) & 0xff] ^ - Te2[(t1 >> 8) & 0xff] ^ - Te3[(t2 ) & 0xff] ^ + Te0[byte(t3, 3)] ^ + Te1[byte(t0, 2)] ^ + Te2[byte(t1, 1)] ^ + Te3[byte(t2, 0)] ^ rk[3]; #endif } -#endif /* SMALL_CODE */ /* * apply last round and * map cipher state to byte array block: */ s0 = - (Te4[(t0 >> 24) ] & 0xff000000) ^ - (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ - (Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ - (Te4[(t3 ) & 0xff] & 0x000000ff) ^ + (Te4_3[(t0 >> 24) ]) ^ + (Te4_2[(t1 >> 16) & 0xff]) ^ + (Te4_1[(t2 >> 8) & 0xff]) ^ + (Te4_0[(t3 ) & 0xff]) ^ rk[0]; STORE32H(s0, ct); s1 = - (Te4[(t1 >> 24) ] & 0xff000000) ^ - (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ - (Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ - (Te4[(t0 ) & 0xff] & 0x000000ff) ^ + (Te4_3[(t1 >> 24) ]) ^ + (Te4_2[(t2 >> 16) & 0xff]) ^ + (Te4_1[(t3 >> 8) & 0xff]) ^ + (Te4_0[(t0 ) & 0xff]) ^ rk[1]; STORE32H(s1, ct+4); s2 = - (Te4[(t2 >> 24) ] & 0xff000000) ^ - (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ - (Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ - (Te4[(t1 ) & 0xff] & 0x000000ff) ^ + (Te4_3[(t2 >> 24) ]) ^ + (Te4_2[(t3 >> 16) & 0xff]) ^ + (Te4_1[(t0 >> 8) & 0xff]) ^ + (Te4_0[(t1 ) & 0xff]) ^ rk[2]; STORE32H(s2, ct+8); s3 = - (Te4[(t3 >> 24) ] & 0xff000000) ^ - (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ - (Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ - (Te4[(t2 ) & 0xff] & 0x000000ff) ^ + (Te4_3[(t3 >> 24) ]) ^ + (Te4_2[(t0 >> 16) & 0xff]) ^ + (Te4_1[(t1 >> 8) & 0xff]) ^ + (Te4_0[(t2 ) & 0xff]) ^ rk[3]; STORE32H(s3, ct+12); } void rijndael_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey) { unsigned long s0, s1, s2, s3, t0, t1, t2, t3, *rk; - int Nr; -#ifdef SMALL_CODE - int r; -#endif /* SMALL_CODE */ + int Nr, r; _ARGCHK(pt != NULL); _ARGCHK(ct != NULL); @@ -417,106 +386,36 @@ void rijndael_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_ LOAD32H(s1, ct + 4); s1 ^= rk[1]; LOAD32H(s2, ct + 8); s2 ^= rk[2]; LOAD32H(s3, ct + 12); s3 ^= rk[3]; -#ifndef SMALL_CODE - /* round 1: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7]; - /* round 2: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11]; - /* round 3: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15]; - /* round 4: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19]; - /* round 5: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23]; - /* round 6: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27]; - /* round 7: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31]; - /* round 8: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35]; - /* round 9: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39]; - if (Nr > 10) { - /* round 10: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43]; - /* round 11: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47]; - if (Nr > 12) { - /* round 12: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51]; - /* round 13: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55]; - } - } - rk += Nr << 2; -#else /* SMALL_CODE */ + /* * Nr - 1 full rounds: */ r = Nr >> 1; for (;;) { + t0 = - Td0[(s0 >> 24) ] ^ - Td1[(s3 >> 16) & 0xff] ^ - Td2[(s2 >> 8) & 0xff] ^ - Td3[(s1 ) & 0xff] ^ + Td0[byte(s0, 3)] ^ + Td1[byte(s3, 2)] ^ + Td2[byte(s2, 1)] ^ + Td3[byte(s1, 0)] ^ rk[4]; t1 = - Td0[(s1 >> 24) ] ^ - Td1[(s0 >> 16) & 0xff] ^ - Td2[(s3 >> 8) & 0xff] ^ - Td3[(s2 ) & 0xff] ^ + Td0[byte(s1, 3)] ^ + Td1[byte(s0, 2)] ^ + Td2[byte(s3, 1)] ^ + Td3[byte(s2, 0)] ^ rk[5]; t2 = - Td0[(s2 >> 24) ] ^ - Td1[(s1 >> 16) & 0xff] ^ - Td2[(s0 >> 8) & 0xff] ^ - Td3[(s3 ) & 0xff] ^ + Td0[byte(s2, 3)] ^ + Td1[byte(s1, 2)] ^ + Td2[byte(s0, 1)] ^ + Td3[byte(s3, 0)] ^ rk[6]; t3 = - Td0[(s3 >> 24) ] ^ - Td1[(s2 >> 16) & 0xff] ^ - Td2[(s1 >> 8) & 0xff] ^ - Td3[(s0 ) & 0xff] ^ + Td0[byte(s3, 3)] ^ + Td1[byte(s2, 2)] ^ + Td2[byte(s1, 1)] ^ + Td3[byte(s0, 0)] ^ rk[7]; rk += 8; @@ -524,32 +423,33 @@ void rijndael_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_ break; } + s0 = - Td0[(t0 >> 24) ] ^ - Td1[(t3 >> 16) & 0xff] ^ - Td2[(t2 >> 8) & 0xff] ^ - Td3[(t1 ) & 0xff] ^ + Td0[byte(t0, 3)] ^ + Td1[byte(t3, 2)] ^ + Td2[byte(t2, 1)] ^ + Td3[byte(t1, 0)] ^ rk[0]; s1 = - Td0[(t1 >> 24) ] ^ - Td1[(t0 >> 16) & 0xff] ^ - Td2[(t3 >> 8) & 0xff] ^ - Td3[(t2 ) & 0xff] ^ + Td0[byte(t1, 3)] ^ + Td1[byte(t0, 2)] ^ + Td2[byte(t3, 1)] ^ + Td3[byte(t2, 0)] ^ rk[1]; s2 = - Td0[(t2 >> 24) ] ^ - Td1[(t1 >> 16) & 0xff] ^ - Td2[(t0 >> 8) & 0xff] ^ - Td3[(t3 ) & 0xff] ^ + Td0[byte(t2, 3)] ^ + Td1[byte(t1, 2)] ^ + Td2[byte(t0, 1)] ^ + Td3[byte(t3, 0)] ^ rk[2]; s3 = - Td0[(t3 >> 24) ] ^ - Td1[(t2 >> 16) & 0xff] ^ - Td2[(t1 >> 8) & 0xff] ^ - Td3[(t0 ) & 0xff] ^ + Td0[byte(t3, 3)] ^ + Td1[byte(t2, 2)] ^ + Td2[byte(t1, 1)] ^ + Td3[byte(t0, 0)] ^ rk[3]; } -#endif /* SMALL_CODE */ + /* * apply last round and * map cipher state to byte array block: diff --git a/aes_tab.c b/aes_tab.c index 98cf63b..78860c3 100644 --- a/aes_tab.c +++ b/aes_tab.c @@ -14,669 +14,964 @@ Td4[x] = Si[x].[01, 01, 01, 01]; */ static const unsigned long Te0[256] = { - 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, - 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, - 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, - 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, - 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, - 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, - 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, - 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, - 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, - 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, - 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, - 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, - 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, - 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, - 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, - 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, - 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, - 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, - 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, - 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, - 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, - 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, - 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, - 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, - 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, - 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, - 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, - 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, - 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, - 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, - 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, - 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, - 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, - 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, - 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, - 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, - 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, - 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, - 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, - 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, - 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, - 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, - 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, - 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, - 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, - 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, - 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, - 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, - 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, - 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, - 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, - 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, - 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, - 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, - 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, - 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, - 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, - 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, - 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, - 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, - 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, - 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, - 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, - 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, + 0xc66363a5UL, 0xf87c7c84UL, 0xee777799UL, 0xf67b7b8dUL, + 0xfff2f20dUL, 0xd66b6bbdUL, 0xde6f6fb1UL, 0x91c5c554UL, + 0x60303050UL, 0x02010103UL, 0xce6767a9UL, 0x562b2b7dUL, + 0xe7fefe19UL, 0xb5d7d762UL, 0x4dababe6UL, 0xec76769aUL, + 0x8fcaca45UL, 0x1f82829dUL, 0x89c9c940UL, 0xfa7d7d87UL, + 0xeffafa15UL, 0xb25959ebUL, 0x8e4747c9UL, 0xfbf0f00bUL, + 0x41adadecUL, 0xb3d4d467UL, 0x5fa2a2fdUL, 0x45afafeaUL, + 0x239c9cbfUL, 0x53a4a4f7UL, 0xe4727296UL, 0x9bc0c05bUL, + 0x75b7b7c2UL, 0xe1fdfd1cUL, 0x3d9393aeUL, 0x4c26266aUL, + 0x6c36365aUL, 0x7e3f3f41UL, 0xf5f7f702UL, 0x83cccc4fUL, + 0x6834345cUL, 0x51a5a5f4UL, 0xd1e5e534UL, 0xf9f1f108UL, + 0xe2717193UL, 0xabd8d873UL, 0x62313153UL, 0x2a15153fUL, + 0x0804040cUL, 0x95c7c752UL, 0x46232365UL, 0x9dc3c35eUL, + 0x30181828UL, 0x379696a1UL, 0x0a05050fUL, 0x2f9a9ab5UL, + 0x0e070709UL, 0x24121236UL, 0x1b80809bUL, 0xdfe2e23dUL, + 0xcdebeb26UL, 0x4e272769UL, 0x7fb2b2cdUL, 0xea75759fUL, + 0x1209091bUL, 0x1d83839eUL, 0x582c2c74UL, 0x341a1a2eUL, + 0x361b1b2dUL, 0xdc6e6eb2UL, 0xb45a5aeeUL, 0x5ba0a0fbUL, + 0xa45252f6UL, 0x763b3b4dUL, 0xb7d6d661UL, 0x7db3b3ceUL, + 0x5229297bUL, 0xdde3e33eUL, 0x5e2f2f71UL, 0x13848497UL, + 0xa65353f5UL, 0xb9d1d168UL, 0x00000000UL, 0xc1eded2cUL, + 0x40202060UL, 0xe3fcfc1fUL, 0x79b1b1c8UL, 0xb65b5bedUL, + 0xd46a6abeUL, 0x8dcbcb46UL, 0x67bebed9UL, 0x7239394bUL, + 0x944a4adeUL, 0x984c4cd4UL, 0xb05858e8UL, 0x85cfcf4aUL, + 0xbbd0d06bUL, 0xc5efef2aUL, 0x4faaaae5UL, 0xedfbfb16UL, + 0x864343c5UL, 0x9a4d4dd7UL, 0x66333355UL, 0x11858594UL, + 0x8a4545cfUL, 0xe9f9f910UL, 0x04020206UL, 0xfe7f7f81UL, + 0xa05050f0UL, 0x783c3c44UL, 0x259f9fbaUL, 0x4ba8a8e3UL, + 0xa25151f3UL, 0x5da3a3feUL, 0x804040c0UL, 0x058f8f8aUL, + 0x3f9292adUL, 0x219d9dbcUL, 0x70383848UL, 0xf1f5f504UL, + 0x63bcbcdfUL, 0x77b6b6c1UL, 0xafdada75UL, 0x42212163UL, + 0x20101030UL, 0xe5ffff1aUL, 0xfdf3f30eUL, 0xbfd2d26dUL, + 0x81cdcd4cUL, 0x180c0c14UL, 0x26131335UL, 0xc3ecec2fUL, + 0xbe5f5fe1UL, 0x359797a2UL, 0x884444ccUL, 0x2e171739UL, + 0x93c4c457UL, 0x55a7a7f2UL, 0xfc7e7e82UL, 0x7a3d3d47UL, + 0xc86464acUL, 0xba5d5de7UL, 0x3219192bUL, 0xe6737395UL, + 0xc06060a0UL, 0x19818198UL, 0x9e4f4fd1UL, 0xa3dcdc7fUL, + 0x44222266UL, 0x542a2a7eUL, 0x3b9090abUL, 0x0b888883UL, + 0x8c4646caUL, 0xc7eeee29UL, 0x6bb8b8d3UL, 0x2814143cUL, + 0xa7dede79UL, 0xbc5e5ee2UL, 0x160b0b1dUL, 0xaddbdb76UL, + 0xdbe0e03bUL, 0x64323256UL, 0x743a3a4eUL, 0x140a0a1eUL, + 0x924949dbUL, 0x0c06060aUL, 0x4824246cUL, 0xb85c5ce4UL, + 0x9fc2c25dUL, 0xbdd3d36eUL, 0x43acacefUL, 0xc46262a6UL, + 0x399191a8UL, 0x319595a4UL, 0xd3e4e437UL, 0xf279798bUL, + 0xd5e7e732UL, 0x8bc8c843UL, 0x6e373759UL, 0xda6d6db7UL, + 0x018d8d8cUL, 0xb1d5d564UL, 0x9c4e4ed2UL, 0x49a9a9e0UL, + 0xd86c6cb4UL, 0xac5656faUL, 0xf3f4f407UL, 0xcfeaea25UL, + 0xca6565afUL, 0xf47a7a8eUL, 0x47aeaee9UL, 0x10080818UL, + 0x6fbabad5UL, 0xf0787888UL, 0x4a25256fUL, 0x5c2e2e72UL, + 0x381c1c24UL, 0x57a6a6f1UL, 0x73b4b4c7UL, 0x97c6c651UL, + 0xcbe8e823UL, 0xa1dddd7cUL, 0xe874749cUL, 0x3e1f1f21UL, + 0x964b4bddUL, 0x61bdbddcUL, 0x0d8b8b86UL, 0x0f8a8a85UL, + 0xe0707090UL, 0x7c3e3e42UL, 0x71b5b5c4UL, 0xcc6666aaUL, + 0x904848d8UL, 0x06030305UL, 0xf7f6f601UL, 0x1c0e0e12UL, + 0xc26161a3UL, 0x6a35355fUL, 0xae5757f9UL, 0x69b9b9d0UL, + 0x17868691UL, 0x99c1c158UL, 0x3a1d1d27UL, 0x279e9eb9UL, + 0xd9e1e138UL, 0xebf8f813UL, 0x2b9898b3UL, 0x22111133UL, + 0xd26969bbUL, 0xa9d9d970UL, 0x078e8e89UL, 0x339494a7UL, + 0x2d9b9bb6UL, 0x3c1e1e22UL, 0x15878792UL, 0xc9e9e920UL, + 0x87cece49UL, 0xaa5555ffUL, 0x50282878UL, 0xa5dfdf7aUL, + 0x038c8c8fUL, 0x59a1a1f8UL, 0x09898980UL, 0x1a0d0d17UL, + 0x65bfbfdaUL, 0xd7e6e631UL, 0x844242c6UL, 0xd06868b8UL, + 0x824141c3UL, 0x299999b0UL, 0x5a2d2d77UL, 0x1e0f0f11UL, + 0x7bb0b0cbUL, 0xa85454fcUL, 0x6dbbbbd6UL, 0x2c16163aUL, }; static const unsigned long Te1[256] = { - 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, - 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, - 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, - 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, - 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, - 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, - 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, - 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, - 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, - 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, - 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, - 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, - 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, - 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, - 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, - 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, - 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, - 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, - 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, - 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, - 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, - 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, - 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, - 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, - 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, - 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, - 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, - 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, - 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, - 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, - 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, - 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, - 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, - 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, - 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, - 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, - 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, - 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, - 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, - 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, - 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, - 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, - 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, - 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, - 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, - 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, - 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, - 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, - 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, - 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, - 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, - 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, - 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, - 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, - 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, - 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, - 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, - 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, - 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, - 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, - 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, - 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, - 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, - 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, + 0xa5c66363UL, 0x84f87c7cUL, 0x99ee7777UL, 0x8df67b7bUL, + 0x0dfff2f2UL, 0xbdd66b6bUL, 0xb1de6f6fUL, 0x5491c5c5UL, + 0x50603030UL, 0x03020101UL, 0xa9ce6767UL, 0x7d562b2bUL, + 0x19e7fefeUL, 0x62b5d7d7UL, 0xe64dababUL, 0x9aec7676UL, + 0x458fcacaUL, 0x9d1f8282UL, 0x4089c9c9UL, 0x87fa7d7dUL, + 0x15effafaUL, 0xebb25959UL, 0xc98e4747UL, 0x0bfbf0f0UL, + 0xec41adadUL, 0x67b3d4d4UL, 0xfd5fa2a2UL, 0xea45afafUL, + 0xbf239c9cUL, 0xf753a4a4UL, 0x96e47272UL, 0x5b9bc0c0UL, + 0xc275b7b7UL, 0x1ce1fdfdUL, 0xae3d9393UL, 0x6a4c2626UL, + 0x5a6c3636UL, 0x417e3f3fUL, 0x02f5f7f7UL, 0x4f83ccccUL, + 0x5c683434UL, 0xf451a5a5UL, 0x34d1e5e5UL, 0x08f9f1f1UL, + 0x93e27171UL, 0x73abd8d8UL, 0x53623131UL, 0x3f2a1515UL, + 0x0c080404UL, 0x5295c7c7UL, 0x65462323UL, 0x5e9dc3c3UL, + 0x28301818UL, 0xa1379696UL, 0x0f0a0505UL, 0xb52f9a9aUL, + 0x090e0707UL, 0x36241212UL, 0x9b1b8080UL, 0x3ddfe2e2UL, + 0x26cdebebUL, 0x694e2727UL, 0xcd7fb2b2UL, 0x9fea7575UL, + 0x1b120909UL, 0x9e1d8383UL, 0x74582c2cUL, 0x2e341a1aUL, + 0x2d361b1bUL, 0xb2dc6e6eUL, 0xeeb45a5aUL, 0xfb5ba0a0UL, + 0xf6a45252UL, 0x4d763b3bUL, 0x61b7d6d6UL, 0xce7db3b3UL, + 0x7b522929UL, 0x3edde3e3UL, 0x715e2f2fUL, 0x97138484UL, + 0xf5a65353UL, 0x68b9d1d1UL, 0x00000000UL, 0x2cc1ededUL, + 0x60402020UL, 0x1fe3fcfcUL, 0xc879b1b1UL, 0xedb65b5bUL, + 0xbed46a6aUL, 0x468dcbcbUL, 0xd967bebeUL, 0x4b723939UL, + 0xde944a4aUL, 0xd4984c4cUL, 0xe8b05858UL, 0x4a85cfcfUL, + 0x6bbbd0d0UL, 0x2ac5efefUL, 0xe54faaaaUL, 0x16edfbfbUL, + 0xc5864343UL, 0xd79a4d4dUL, 0x55663333UL, 0x94118585UL, + 0xcf8a4545UL, 0x10e9f9f9UL, 0x06040202UL, 0x81fe7f7fUL, + 0xf0a05050UL, 0x44783c3cUL, 0xba259f9fUL, 0xe34ba8a8UL, + 0xf3a25151UL, 0xfe5da3a3UL, 0xc0804040UL, 0x8a058f8fUL, + 0xad3f9292UL, 0xbc219d9dUL, 0x48703838UL, 0x04f1f5f5UL, + 0xdf63bcbcUL, 0xc177b6b6UL, 0x75afdadaUL, 0x63422121UL, + 0x30201010UL, 0x1ae5ffffUL, 0x0efdf3f3UL, 0x6dbfd2d2UL, + 0x4c81cdcdUL, 0x14180c0cUL, 0x35261313UL, 0x2fc3ececUL, + 0xe1be5f5fUL, 0xa2359797UL, 0xcc884444UL, 0x392e1717UL, + 0x5793c4c4UL, 0xf255a7a7UL, 0x82fc7e7eUL, 0x477a3d3dUL, + 0xacc86464UL, 0xe7ba5d5dUL, 0x2b321919UL, 0x95e67373UL, + 0xa0c06060UL, 0x98198181UL, 0xd19e4f4fUL, 0x7fa3dcdcUL, + 0x66442222UL, 0x7e542a2aUL, 0xab3b9090UL, 0x830b8888UL, + 0xca8c4646UL, 0x29c7eeeeUL, 0xd36bb8b8UL, 0x3c281414UL, + 0x79a7dedeUL, 0xe2bc5e5eUL, 0x1d160b0bUL, 0x76addbdbUL, + 0x3bdbe0e0UL, 0x56643232UL, 0x4e743a3aUL, 0x1e140a0aUL, + 0xdb924949UL, 0x0a0c0606UL, 0x6c482424UL, 0xe4b85c5cUL, + 0x5d9fc2c2UL, 0x6ebdd3d3UL, 0xef43acacUL, 0xa6c46262UL, + 0xa8399191UL, 0xa4319595UL, 0x37d3e4e4UL, 0x8bf27979UL, + 0x32d5e7e7UL, 0x438bc8c8UL, 0x596e3737UL, 0xb7da6d6dUL, + 0x8c018d8dUL, 0x64b1d5d5UL, 0xd29c4e4eUL, 0xe049a9a9UL, + 0xb4d86c6cUL, 0xfaac5656UL, 0x07f3f4f4UL, 0x25cfeaeaUL, + 0xafca6565UL, 0x8ef47a7aUL, 0xe947aeaeUL, 0x18100808UL, + 0xd56fbabaUL, 0x88f07878UL, 0x6f4a2525UL, 0x725c2e2eUL, + 0x24381c1cUL, 0xf157a6a6UL, 0xc773b4b4UL, 0x5197c6c6UL, + 0x23cbe8e8UL, 0x7ca1ddddUL, 0x9ce87474UL, 0x213e1f1fUL, + 0xdd964b4bUL, 0xdc61bdbdUL, 0x860d8b8bUL, 0x850f8a8aUL, + 0x90e07070UL, 0x427c3e3eUL, 0xc471b5b5UL, 0xaacc6666UL, + 0xd8904848UL, 0x05060303UL, 0x01f7f6f6UL, 0x121c0e0eUL, + 0xa3c26161UL, 0x5f6a3535UL, 0xf9ae5757UL, 0xd069b9b9UL, + 0x91178686UL, 0x5899c1c1UL, 0x273a1d1dUL, 0xb9279e9eUL, + 0x38d9e1e1UL, 0x13ebf8f8UL, 0xb32b9898UL, 0x33221111UL, + 0xbbd26969UL, 0x70a9d9d9UL, 0x89078e8eUL, 0xa7339494UL, + 0xb62d9b9bUL, 0x223c1e1eUL, 0x92158787UL, 0x20c9e9e9UL, + 0x4987ceceUL, 0xffaa5555UL, 0x78502828UL, 0x7aa5dfdfUL, + 0x8f038c8cUL, 0xf859a1a1UL, 0x80098989UL, 0x171a0d0dUL, + 0xda65bfbfUL, 0x31d7e6e6UL, 0xc6844242UL, 0xb8d06868UL, + 0xc3824141UL, 0xb0299999UL, 0x775a2d2dUL, 0x111e0f0fUL, + 0xcb7bb0b0UL, 0xfca85454UL, 0xd66dbbbbUL, 0x3a2c1616UL, }; static const unsigned long Te2[256] = { - 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, - 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, - 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, - 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, - 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, - 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, - 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, - 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, - 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, - 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, - 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, - 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, - 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, - 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, - 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, - 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, - 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, - 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, - 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, - 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, - 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, - 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, - 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, - 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, - 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, - 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, - 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, - 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, - 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, - 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, - 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, - 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, - 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, - 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, - 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, - 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, - 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, - 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, - 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, - 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, - 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, - 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, - 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, - 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, - 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, - 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, - 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, - 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, - 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, - 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, - 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, - 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, - 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, - 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, - 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, - 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, - 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, - 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, - 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, - 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, - 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, - 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, - 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, - 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, + 0x63a5c663UL, 0x7c84f87cUL, 0x7799ee77UL, 0x7b8df67bUL, + 0xf20dfff2UL, 0x6bbdd66bUL, 0x6fb1de6fUL, 0xc55491c5UL, + 0x30506030UL, 0x01030201UL, 0x67a9ce67UL, 0x2b7d562bUL, + 0xfe19e7feUL, 0xd762b5d7UL, 0xabe64dabUL, 0x769aec76UL, + 0xca458fcaUL, 0x829d1f82UL, 0xc94089c9UL, 0x7d87fa7dUL, + 0xfa15effaUL, 0x59ebb259UL, 0x47c98e47UL, 0xf00bfbf0UL, + 0xadec41adUL, 0xd467b3d4UL, 0xa2fd5fa2UL, 0xafea45afUL, + 0x9cbf239cUL, 0xa4f753a4UL, 0x7296e472UL, 0xc05b9bc0UL, + 0xb7c275b7UL, 0xfd1ce1fdUL, 0x93ae3d93UL, 0x266a4c26UL, + 0x365a6c36UL, 0x3f417e3fUL, 0xf702f5f7UL, 0xcc4f83ccUL, + 0x345c6834UL, 0xa5f451a5UL, 0xe534d1e5UL, 0xf108f9f1UL, + 0x7193e271UL, 0xd873abd8UL, 0x31536231UL, 0x153f2a15UL, + 0x040c0804UL, 0xc75295c7UL, 0x23654623UL, 0xc35e9dc3UL, + 0x18283018UL, 0x96a13796UL, 0x050f0a05UL, 0x9ab52f9aUL, + 0x07090e07UL, 0x12362412UL, 0x809b1b80UL, 0xe23ddfe2UL, + 0xeb26cdebUL, 0x27694e27UL, 0xb2cd7fb2UL, 0x759fea75UL, + 0x091b1209UL, 0x839e1d83UL, 0x2c74582cUL, 0x1a2e341aUL, + 0x1b2d361bUL, 0x6eb2dc6eUL, 0x5aeeb45aUL, 0xa0fb5ba0UL, + 0x52f6a452UL, 0x3b4d763bUL, 0xd661b7d6UL, 0xb3ce7db3UL, + 0x297b5229UL, 0xe33edde3UL, 0x2f715e2fUL, 0x84971384UL, + 0x53f5a653UL, 0xd168b9d1UL, 0x00000000UL, 0xed2cc1edUL, + 0x20604020UL, 0xfc1fe3fcUL, 0xb1c879b1UL, 0x5bedb65bUL, + 0x6abed46aUL, 0xcb468dcbUL, 0xbed967beUL, 0x394b7239UL, + 0x4ade944aUL, 0x4cd4984cUL, 0x58e8b058UL, 0xcf4a85cfUL, + 0xd06bbbd0UL, 0xef2ac5efUL, 0xaae54faaUL, 0xfb16edfbUL, + 0x43c58643UL, 0x4dd79a4dUL, 0x33556633UL, 0x85941185UL, + 0x45cf8a45UL, 0xf910e9f9UL, 0x02060402UL, 0x7f81fe7fUL, + 0x50f0a050UL, 0x3c44783cUL, 0x9fba259fUL, 0xa8e34ba8UL, + 0x51f3a251UL, 0xa3fe5da3UL, 0x40c08040UL, 0x8f8a058fUL, + 0x92ad3f92UL, 0x9dbc219dUL, 0x38487038UL, 0xf504f1f5UL, + 0xbcdf63bcUL, 0xb6c177b6UL, 0xda75afdaUL, 0x21634221UL, + 0x10302010UL, 0xff1ae5ffUL, 0xf30efdf3UL, 0xd26dbfd2UL, + 0xcd4c81cdUL, 0x0c14180cUL, 0x13352613UL, 0xec2fc3ecUL, + 0x5fe1be5fUL, 0x97a23597UL, 0x44cc8844UL, 0x17392e17UL, + 0xc45793c4UL, 0xa7f255a7UL, 0x7e82fc7eUL, 0x3d477a3dUL, + 0x64acc864UL, 0x5de7ba5dUL, 0x192b3219UL, 0x7395e673UL, + 0x60a0c060UL, 0x81981981UL, 0x4fd19e4fUL, 0xdc7fa3dcUL, + 0x22664422UL, 0x2a7e542aUL, 0x90ab3b90UL, 0x88830b88UL, + 0x46ca8c46UL, 0xee29c7eeUL, 0xb8d36bb8UL, 0x143c2814UL, + 0xde79a7deUL, 0x5ee2bc5eUL, 0x0b1d160bUL, 0xdb76addbUL, + 0xe03bdbe0UL, 0x32566432UL, 0x3a4e743aUL, 0x0a1e140aUL, + 0x49db9249UL, 0x060a0c06UL, 0x246c4824UL, 0x5ce4b85cUL, + 0xc25d9fc2UL, 0xd36ebdd3UL, 0xacef43acUL, 0x62a6c462UL, + 0x91a83991UL, 0x95a43195UL, 0xe437d3e4UL, 0x798bf279UL, + 0xe732d5e7UL, 0xc8438bc8UL, 0x37596e37UL, 0x6db7da6dUL, + 0x8d8c018dUL, 0xd564b1d5UL, 0x4ed29c4eUL, 0xa9e049a9UL, + 0x6cb4d86cUL, 0x56faac56UL, 0xf407f3f4UL, 0xea25cfeaUL, + 0x65afca65UL, 0x7a8ef47aUL, 0xaee947aeUL, 0x08181008UL, + 0xbad56fbaUL, 0x7888f078UL, 0x256f4a25UL, 0x2e725c2eUL, + 0x1c24381cUL, 0xa6f157a6UL, 0xb4c773b4UL, 0xc65197c6UL, + 0xe823cbe8UL, 0xdd7ca1ddUL, 0x749ce874UL, 0x1f213e1fUL, + 0x4bdd964bUL, 0xbddc61bdUL, 0x8b860d8bUL, 0x8a850f8aUL, + 0x7090e070UL, 0x3e427c3eUL, 0xb5c471b5UL, 0x66aacc66UL, + 0x48d89048UL, 0x03050603UL, 0xf601f7f6UL, 0x0e121c0eUL, + 0x61a3c261UL, 0x355f6a35UL, 0x57f9ae57UL, 0xb9d069b9UL, + 0x86911786UL, 0xc15899c1UL, 0x1d273a1dUL, 0x9eb9279eUL, + 0xe138d9e1UL, 0xf813ebf8UL, 0x98b32b98UL, 0x11332211UL, + 0x69bbd269UL, 0xd970a9d9UL, 0x8e89078eUL, 0x94a73394UL, + 0x9bb62d9bUL, 0x1e223c1eUL, 0x87921587UL, 0xe920c9e9UL, + 0xce4987ceUL, 0x55ffaa55UL, 0x28785028UL, 0xdf7aa5dfUL, + 0x8c8f038cUL, 0xa1f859a1UL, 0x89800989UL, 0x0d171a0dUL, + 0xbfda65bfUL, 0xe631d7e6UL, 0x42c68442UL, 0x68b8d068UL, + 0x41c38241UL, 0x99b02999UL, 0x2d775a2dUL, 0x0f111e0fUL, + 0xb0cb7bb0UL, 0x54fca854UL, 0xbbd66dbbUL, 0x163a2c16UL, }; static const unsigned long Te3[256] = { - 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, - 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, - 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, - 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, - 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, - 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, - 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, - 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, - 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, - 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, - 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, - 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, - 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, - 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, - 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, - 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, - 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, - 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, - 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, - 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, - 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, - 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, - 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, - 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, - 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, - 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, - 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, - 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, - 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, - 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, - 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, - 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, - 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, - 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, - 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, - 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, - 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, - 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, - 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, - 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, - 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, - 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, - 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, - 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, - 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, - 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, - 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, - 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, - 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, - 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, - 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, - 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, - 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, - 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, - 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, - 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, - 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, - 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, - 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, - 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, - 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, - 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, - 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, - 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, + 0x6363a5c6UL, 0x7c7c84f8UL, 0x777799eeUL, 0x7b7b8df6UL, + 0xf2f20dffUL, 0x6b6bbdd6UL, 0x6f6fb1deUL, 0xc5c55491UL, + 0x30305060UL, 0x01010302UL, 0x6767a9ceUL, 0x2b2b7d56UL, + 0xfefe19e7UL, 0xd7d762b5UL, 0xababe64dUL, 0x76769aecUL, + 0xcaca458fUL, 0x82829d1fUL, 0xc9c94089UL, 0x7d7d87faUL, + 0xfafa15efUL, 0x5959ebb2UL, 0x4747c98eUL, 0xf0f00bfbUL, + 0xadadec41UL, 0xd4d467b3UL, 0xa2a2fd5fUL, 0xafafea45UL, + 0x9c9cbf23UL, 0xa4a4f753UL, 0x727296e4UL, 0xc0c05b9bUL, + 0xb7b7c275UL, 0xfdfd1ce1UL, 0x9393ae3dUL, 0x26266a4cUL, + 0x36365a6cUL, 0x3f3f417eUL, 0xf7f702f5UL, 0xcccc4f83UL, + 0x34345c68UL, 0xa5a5f451UL, 0xe5e534d1UL, 0xf1f108f9UL, + 0x717193e2UL, 0xd8d873abUL, 0x31315362UL, 0x15153f2aUL, + 0x04040c08UL, 0xc7c75295UL, 0x23236546UL, 0xc3c35e9dUL, + 0x18182830UL, 0x9696a137UL, 0x05050f0aUL, 0x9a9ab52fUL, + 0x0707090eUL, 0x12123624UL, 0x80809b1bUL, 0xe2e23ddfUL, + 0xebeb26cdUL, 0x2727694eUL, 0xb2b2cd7fUL, 0x75759feaUL, + 0x09091b12UL, 0x83839e1dUL, 0x2c2c7458UL, 0x1a1a2e34UL, + 0x1b1b2d36UL, 0x6e6eb2dcUL, 0x5a5aeeb4UL, 0xa0a0fb5bUL, + 0x5252f6a4UL, 0x3b3b4d76UL, 0xd6d661b7UL, 0xb3b3ce7dUL, + 0x29297b52UL, 0xe3e33eddUL, 0x2f2f715eUL, 0x84849713UL, + 0x5353f5a6UL, 0xd1d168b9UL, 0x00000000UL, 0xeded2cc1UL, + 0x20206040UL, 0xfcfc1fe3UL, 0xb1b1c879UL, 0x5b5bedb6UL, + 0x6a6abed4UL, 0xcbcb468dUL, 0xbebed967UL, 0x39394b72UL, + 0x4a4ade94UL, 0x4c4cd498UL, 0x5858e8b0UL, 0xcfcf4a85UL, + 0xd0d06bbbUL, 0xefef2ac5UL, 0xaaaae54fUL, 0xfbfb16edUL, + 0x4343c586UL, 0x4d4dd79aUL, 0x33335566UL, 0x85859411UL, + 0x4545cf8aUL, 0xf9f910e9UL, 0x02020604UL, 0x7f7f81feUL, + 0x5050f0a0UL, 0x3c3c4478UL, 0x9f9fba25UL, 0xa8a8e34bUL, + 0x5151f3a2UL, 0xa3a3fe5dUL, 0x4040c080UL, 0x8f8f8a05UL, + 0x9292ad3fUL, 0x9d9dbc21UL, 0x38384870UL, 0xf5f504f1UL, + 0xbcbcdf63UL, 0xb6b6c177UL, 0xdada75afUL, 0x21216342UL, + 0x10103020UL, 0xffff1ae5UL, 0xf3f30efdUL, 0xd2d26dbfUL, + 0xcdcd4c81UL, 0x0c0c1418UL, 0x13133526UL, 0xecec2fc3UL, + 0x5f5fe1beUL, 0x9797a235UL, 0x4444cc88UL, 0x1717392eUL, + 0xc4c45793UL, 0xa7a7f255UL, 0x7e7e82fcUL, 0x3d3d477aUL, + 0x6464acc8UL, 0x5d5de7baUL, 0x19192b32UL, 0x737395e6UL, + 0x6060a0c0UL, 0x81819819UL, 0x4f4fd19eUL, 0xdcdc7fa3UL, + 0x22226644UL, 0x2a2a7e54UL, 0x9090ab3bUL, 0x8888830bUL, + 0x4646ca8cUL, 0xeeee29c7UL, 0xb8b8d36bUL, 0x14143c28UL, + 0xdede79a7UL, 0x5e5ee2bcUL, 0x0b0b1d16UL, 0xdbdb76adUL, + 0xe0e03bdbUL, 0x32325664UL, 0x3a3a4e74UL, 0x0a0a1e14UL, + 0x4949db92UL, 0x06060a0cUL, 0x24246c48UL, 0x5c5ce4b8UL, + 0xc2c25d9fUL, 0xd3d36ebdUL, 0xacacef43UL, 0x6262a6c4UL, + 0x9191a839UL, 0x9595a431UL, 0xe4e437d3UL, 0x79798bf2UL, + 0xe7e732d5UL, 0xc8c8438bUL, 0x3737596eUL, 0x6d6db7daUL, + 0x8d8d8c01UL, 0xd5d564b1UL, 0x4e4ed29cUL, 0xa9a9e049UL, + 0x6c6cb4d8UL, 0x5656faacUL, 0xf4f407f3UL, 0xeaea25cfUL, + 0x6565afcaUL, 0x7a7a8ef4UL, 0xaeaee947UL, 0x08081810UL, + 0xbabad56fUL, 0x787888f0UL, 0x25256f4aUL, 0x2e2e725cUL, + 0x1c1c2438UL, 0xa6a6f157UL, 0xb4b4c773UL, 0xc6c65197UL, + 0xe8e823cbUL, 0xdddd7ca1UL, 0x74749ce8UL, 0x1f1f213eUL, + 0x4b4bdd96UL, 0xbdbddc61UL, 0x8b8b860dUL, 0x8a8a850fUL, + 0x707090e0UL, 0x3e3e427cUL, 0xb5b5c471UL, 0x6666aaccUL, + 0x4848d890UL, 0x03030506UL, 0xf6f601f7UL, 0x0e0e121cUL, + 0x6161a3c2UL, 0x35355f6aUL, 0x5757f9aeUL, 0xb9b9d069UL, + 0x86869117UL, 0xc1c15899UL, 0x1d1d273aUL, 0x9e9eb927UL, + 0xe1e138d9UL, 0xf8f813ebUL, 0x9898b32bUL, 0x11113322UL, + 0x6969bbd2UL, 0xd9d970a9UL, 0x8e8e8907UL, 0x9494a733UL, + 0x9b9bb62dUL, 0x1e1e223cUL, 0x87879215UL, 0xe9e920c9UL, + 0xcece4987UL, 0x5555ffaaUL, 0x28287850UL, 0xdfdf7aa5UL, + 0x8c8c8f03UL, 0xa1a1f859UL, 0x89898009UL, 0x0d0d171aUL, + 0xbfbfda65UL, 0xe6e631d7UL, 0x4242c684UL, 0x6868b8d0UL, + 0x4141c382UL, 0x9999b029UL, 0x2d2d775aUL, 0x0f0f111eUL, + 0xb0b0cb7bUL, 0x5454fca8UL, 0xbbbbd66dUL, 0x16163a2cUL, }; static const unsigned long Te4[256] = { - 0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU, - 0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U, - 0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU, - 0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U, - 0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU, - 0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U, - 0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU, - 0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U, - 0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U, - 0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU, - 0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U, - 0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U, - 0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U, - 0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU, - 0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U, - 0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U, - 0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU, - 0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U, - 0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U, - 0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U, - 0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU, - 0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU, - 0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U, - 0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU, - 0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU, - 0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U, - 0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU, - 0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U, - 0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU, - 0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U, - 0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U, - 0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U, - 0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU, - 0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U, - 0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU, - 0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U, - 0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU, - 0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U, - 0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U, - 0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU, - 0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU, - 0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU, - 0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U, - 0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U, - 0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU, - 0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U, - 0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU, - 0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U, - 0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU, - 0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U, - 0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU, - 0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU, - 0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U, - 0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU, - 0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U, - 0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU, - 0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U, - 0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U, - 0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U, - 0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU, - 0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU, - 0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U, - 0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU, - 0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U, + 0x63636363UL, 0x7c7c7c7cUL, 0x77777777UL, 0x7b7b7b7bUL, + 0xf2f2f2f2UL, 0x6b6b6b6bUL, 0x6f6f6f6fUL, 0xc5c5c5c5UL, + 0x30303030UL, 0x01010101UL, 0x67676767UL, 0x2b2b2b2bUL, + 0xfefefefeUL, 0xd7d7d7d7UL, 0xababababUL, 0x76767676UL, + 0xcacacacaUL, 0x82828282UL, 0xc9c9c9c9UL, 0x7d7d7d7dUL, + 0xfafafafaUL, 0x59595959UL, 0x47474747UL, 0xf0f0f0f0UL, + 0xadadadadUL, 0xd4d4d4d4UL, 0xa2a2a2a2UL, 0xafafafafUL, + 0x9c9c9c9cUL, 0xa4a4a4a4UL, 0x72727272UL, 0xc0c0c0c0UL, + 0xb7b7b7b7UL, 0xfdfdfdfdUL, 0x93939393UL, 0x26262626UL, + 0x36363636UL, 0x3f3f3f3fUL, 0xf7f7f7f7UL, 0xccccccccUL, + 0x34343434UL, 0xa5a5a5a5UL, 0xe5e5e5e5UL, 0xf1f1f1f1UL, + 0x71717171UL, 0xd8d8d8d8UL, 0x31313131UL, 0x15151515UL, + 0x04040404UL, 0xc7c7c7c7UL, 0x23232323UL, 0xc3c3c3c3UL, + 0x18181818UL, 0x96969696UL, 0x05050505UL, 0x9a9a9a9aUL, + 0x07070707UL, 0x12121212UL, 0x80808080UL, 0xe2e2e2e2UL, + 0xebebebebUL, 0x27272727UL, 0xb2b2b2b2UL, 0x75757575UL, + 0x09090909UL, 0x83838383UL, 0x2c2c2c2cUL, 0x1a1a1a1aUL, + 0x1b1b1b1bUL, 0x6e6e6e6eUL, 0x5a5a5a5aUL, 0xa0a0a0a0UL, + 0x52525252UL, 0x3b3b3b3bUL, 0xd6d6d6d6UL, 0xb3b3b3b3UL, + 0x29292929UL, 0xe3e3e3e3UL, 0x2f2f2f2fUL, 0x84848484UL, + 0x53535353UL, 0xd1d1d1d1UL, 0x00000000UL, 0xededededUL, + 0x20202020UL, 0xfcfcfcfcUL, 0xb1b1b1b1UL, 0x5b5b5b5bUL, + 0x6a6a6a6aUL, 0xcbcbcbcbUL, 0xbebebebeUL, 0x39393939UL, + 0x4a4a4a4aUL, 0x4c4c4c4cUL, 0x58585858UL, 0xcfcfcfcfUL, + 0xd0d0d0d0UL, 0xefefefefUL, 0xaaaaaaaaUL, 0xfbfbfbfbUL, + 0x43434343UL, 0x4d4d4d4dUL, 0x33333333UL, 0x85858585UL, + 0x45454545UL, 0xf9f9f9f9UL, 0x02020202UL, 0x7f7f7f7fUL, + 0x50505050UL, 0x3c3c3c3cUL, 0x9f9f9f9fUL, 0xa8a8a8a8UL, + 0x51515151UL, 0xa3a3a3a3UL, 0x40404040UL, 0x8f8f8f8fUL, + 0x92929292UL, 0x9d9d9d9dUL, 0x38383838UL, 0xf5f5f5f5UL, + 0xbcbcbcbcUL, 0xb6b6b6b6UL, 0xdadadadaUL, 0x21212121UL, + 0x10101010UL, 0xffffffffUL, 0xf3f3f3f3UL, 0xd2d2d2d2UL, + 0xcdcdcdcdUL, 0x0c0c0c0cUL, 0x13131313UL, 0xececececUL, + 0x5f5f5f5fUL, 0x97979797UL, 0x44444444UL, 0x17171717UL, + 0xc4c4c4c4UL, 0xa7a7a7a7UL, 0x7e7e7e7eUL, 0x3d3d3d3dUL, + 0x64646464UL, 0x5d5d5d5dUL, 0x19191919UL, 0x73737373UL, + 0x60606060UL, 0x81818181UL, 0x4f4f4f4fUL, 0xdcdcdcdcUL, + 0x22222222UL, 0x2a2a2a2aUL, 0x90909090UL, 0x88888888UL, + 0x46464646UL, 0xeeeeeeeeUL, 0xb8b8b8b8UL, 0x14141414UL, + 0xdedededeUL, 0x5e5e5e5eUL, 0x0b0b0b0bUL, 0xdbdbdbdbUL, + 0xe0e0e0e0UL, 0x32323232UL, 0x3a3a3a3aUL, 0x0a0a0a0aUL, + 0x49494949UL, 0x06060606UL, 0x24242424UL, 0x5c5c5c5cUL, + 0xc2c2c2c2UL, 0xd3d3d3d3UL, 0xacacacacUL, 0x62626262UL, + 0x91919191UL, 0x95959595UL, 0xe4e4e4e4UL, 0x79797979UL, + 0xe7e7e7e7UL, 0xc8c8c8c8UL, 0x37373737UL, 0x6d6d6d6dUL, + 0x8d8d8d8dUL, 0xd5d5d5d5UL, 0x4e4e4e4eUL, 0xa9a9a9a9UL, + 0x6c6c6c6cUL, 0x56565656UL, 0xf4f4f4f4UL, 0xeaeaeaeaUL, + 0x65656565UL, 0x7a7a7a7aUL, 0xaeaeaeaeUL, 0x08080808UL, + 0xbabababaUL, 0x78787878UL, 0x25252525UL, 0x2e2e2e2eUL, + 0x1c1c1c1cUL, 0xa6a6a6a6UL, 0xb4b4b4b4UL, 0xc6c6c6c6UL, + 0xe8e8e8e8UL, 0xddddddddUL, 0x74747474UL, 0x1f1f1f1fUL, + 0x4b4b4b4bUL, 0xbdbdbdbdUL, 0x8b8b8b8bUL, 0x8a8a8a8aUL, + 0x70707070UL, 0x3e3e3e3eUL, 0xb5b5b5b5UL, 0x66666666UL, + 0x48484848UL, 0x03030303UL, 0xf6f6f6f6UL, 0x0e0e0e0eUL, + 0x61616161UL, 0x35353535UL, 0x57575757UL, 0xb9b9b9b9UL, + 0x86868686UL, 0xc1c1c1c1UL, 0x1d1d1d1dUL, 0x9e9e9e9eUL, + 0xe1e1e1e1UL, 0xf8f8f8f8UL, 0x98989898UL, 0x11111111UL, + 0x69696969UL, 0xd9d9d9d9UL, 0x8e8e8e8eUL, 0x94949494UL, + 0x9b9b9b9bUL, 0x1e1e1e1eUL, 0x87878787UL, 0xe9e9e9e9UL, + 0xcecececeUL, 0x55555555UL, 0x28282828UL, 0xdfdfdfdfUL, + 0x8c8c8c8cUL, 0xa1a1a1a1UL, 0x89898989UL, 0x0d0d0d0dUL, + 0xbfbfbfbfUL, 0xe6e6e6e6UL, 0x42424242UL, 0x68686868UL, + 0x41414141UL, 0x99999999UL, 0x2d2d2d2dUL, 0x0f0f0f0fUL, + 0xb0b0b0b0UL, 0x54545454UL, 0xbbbbbbbbUL, 0x16161616UL, }; + +#ifdef SMALL_CODE + +#define Te4_0 0x000000FF & Te4 +#define Te4_1 0x0000FF00 & Te4 +#define Te4_2 0x00FF0000 & Te4 +#define Te4_3 0xFF000000 & Te4 + +#else + +static const unsigned long Te4_0[] = { +0x00000063UL, 0x0000007cUL, 0x00000077UL, 0x0000007bUL, 0x000000f2UL, 0x0000006bUL, 0x0000006fUL, 0x000000c5UL, +0x00000030UL, 0x00000001UL, 0x00000067UL, 0x0000002bUL, 0x000000feUL, 0x000000d7UL, 0x000000abUL, 0x00000076UL, +0x000000caUL, 0x00000082UL, 0x000000c9UL, 0x0000007dUL, 0x000000faUL, 0x00000059UL, 0x00000047UL, 0x000000f0UL, +0x000000adUL, 0x000000d4UL, 0x000000a2UL, 0x000000afUL, 0x0000009cUL, 0x000000a4UL, 0x00000072UL, 0x000000c0UL, +0x000000b7UL, 0x000000fdUL, 0x00000093UL, 0x00000026UL, 0x00000036UL, 0x0000003fUL, 0x000000f7UL, 0x000000ccUL, +0x00000034UL, 0x000000a5UL, 0x000000e5UL, 0x000000f1UL, 0x00000071UL, 0x000000d8UL, 0x00000031UL, 0x00000015UL, +0x00000004UL, 0x000000c7UL, 0x00000023UL, 0x000000c3UL, 0x00000018UL, 0x00000096UL, 0x00000005UL, 0x0000009aUL, +0x00000007UL, 0x00000012UL, 0x00000080UL, 0x000000e2UL, 0x000000ebUL, 0x00000027UL, 0x000000b2UL, 0x00000075UL, +0x00000009UL, 0x00000083UL, 0x0000002cUL, 0x0000001aUL, 0x0000001bUL, 0x0000006eUL, 0x0000005aUL, 0x000000a0UL, +0x00000052UL, 0x0000003bUL, 0x000000d6UL, 0x000000b3UL, 0x00000029UL, 0x000000e3UL, 0x0000002fUL, 0x00000084UL, +0x00000053UL, 0x000000d1UL, 0x00000000UL, 0x000000edUL, 0x00000020UL, 0x000000fcUL, 0x000000b1UL, 0x0000005bUL, +0x0000006aUL, 0x000000cbUL, 0x000000beUL, 0x00000039UL, 0x0000004aUL, 0x0000004cUL, 0x00000058UL, 0x000000cfUL, +0x000000d0UL, 0x000000efUL, 0x000000aaUL, 0x000000fbUL, 0x00000043UL, 0x0000004dUL, 0x00000033UL, 0x00000085UL, +0x00000045UL, 0x000000f9UL, 0x00000002UL, 0x0000007fUL, 0x00000050UL, 0x0000003cUL, 0x0000009fUL, 0x000000a8UL, +0x00000051UL, 0x000000a3UL, 0x00000040UL, 0x0000008fUL, 0x00000092UL, 0x0000009dUL, 0x00000038UL, 0x000000f5UL, +0x000000bcUL, 0x000000b6UL, 0x000000daUL, 0x00000021UL, 0x00000010UL, 0x000000ffUL, 0x000000f3UL, 0x000000d2UL, +0x000000cdUL, 0x0000000cUL, 0x00000013UL, 0x000000ecUL, 0x0000005fUL, 0x00000097UL, 0x00000044UL, 0x00000017UL, +0x000000c4UL, 0x000000a7UL, 0x0000007eUL, 0x0000003dUL, 0x00000064UL, 0x0000005dUL, 0x00000019UL, 0x00000073UL, +0x00000060UL, 0x00000081UL, 0x0000004fUL, 0x000000dcUL, 0x00000022UL, 0x0000002aUL, 0x00000090UL, 0x00000088UL, +0x00000046UL, 0x000000eeUL, 0x000000b8UL, 0x00000014UL, 0x000000deUL, 0x0000005eUL, 0x0000000bUL, 0x000000dbUL, +0x000000e0UL, 0x00000032UL, 0x0000003aUL, 0x0000000aUL, 0x00000049UL, 0x00000006UL, 0x00000024UL, 0x0000005cUL, +0x000000c2UL, 0x000000d3UL, 0x000000acUL, 0x00000062UL, 0x00000091UL, 0x00000095UL, 0x000000e4UL, 0x00000079UL, +0x000000e7UL, 0x000000c8UL, 0x00000037UL, 0x0000006dUL, 0x0000008dUL, 0x000000d5UL, 0x0000004eUL, 0x000000a9UL, +0x0000006cUL, 0x00000056UL, 0x000000f4UL, 0x000000eaUL, 0x00000065UL, 0x0000007aUL, 0x000000aeUL, 0x00000008UL, +0x000000baUL, 0x00000078UL, 0x00000025UL, 0x0000002eUL, 0x0000001cUL, 0x000000a6UL, 0x000000b4UL, 0x000000c6UL, +0x000000e8UL, 0x000000ddUL, 0x00000074UL, 0x0000001fUL, 0x0000004bUL, 0x000000bdUL, 0x0000008bUL, 0x0000008aUL, +0x00000070UL, 0x0000003eUL, 0x000000b5UL, 0x00000066UL, 0x00000048UL, 0x00000003UL, 0x000000f6UL, 0x0000000eUL, +0x00000061UL, 0x00000035UL, 0x00000057UL, 0x000000b9UL, 0x00000086UL, 0x000000c1UL, 0x0000001dUL, 0x0000009eUL, +0x000000e1UL, 0x000000f8UL, 0x00000098UL, 0x00000011UL, 0x00000069UL, 0x000000d9UL, 0x0000008eUL, 0x00000094UL, +0x0000009bUL, 0x0000001eUL, 0x00000087UL, 0x000000e9UL, 0x000000ceUL, 0x00000055UL, 0x00000028UL, 0x000000dfUL, +0x0000008cUL, 0x000000a1UL, 0x00000089UL, 0x0000000dUL, 0x000000bfUL, 0x000000e6UL, 0x00000042UL, 0x00000068UL, +0x00000041UL, 0x00000099UL, 0x0000002dUL, 0x0000000fUL, 0x000000b0UL, 0x00000054UL, 0x000000bbUL, 0x00000016UL +}; + +static const unsigned long Te4_1[] = { +0x00006300UL, 0x00007c00UL, 0x00007700UL, 0x00007b00UL, 0x0000f200UL, 0x00006b00UL, 0x00006f00UL, 0x0000c500UL, +0x00003000UL, 0x00000100UL, 0x00006700UL, 0x00002b00UL, 0x0000fe00UL, 0x0000d700UL, 0x0000ab00UL, 0x00007600UL, +0x0000ca00UL, 0x00008200UL, 0x0000c900UL, 0x00007d00UL, 0x0000fa00UL, 0x00005900UL, 0x00004700UL, 0x0000f000UL, +0x0000ad00UL, 0x0000d400UL, 0x0000a200UL, 0x0000af00UL, 0x00009c00UL, 0x0000a400UL, 0x00007200UL, 0x0000c000UL, +0x0000b700UL, 0x0000fd00UL, 0x00009300UL, 0x00002600UL, 0x00003600UL, 0x00003f00UL, 0x0000f700UL, 0x0000cc00UL, +0x00003400UL, 0x0000a500UL, 0x0000e500UL, 0x0000f100UL, 0x00007100UL, 0x0000d800UL, 0x00003100UL, 0x00001500UL, +0x00000400UL, 0x0000c700UL, 0x00002300UL, 0x0000c300UL, 0x00001800UL, 0x00009600UL, 0x00000500UL, 0x00009a00UL, +0x00000700UL, 0x00001200UL, 0x00008000UL, 0x0000e200UL, 0x0000eb00UL, 0x00002700UL, 0x0000b200UL, 0x00007500UL, +0x00000900UL, 0x00008300UL, 0x00002c00UL, 0x00001a00UL, 0x00001b00UL, 0x00006e00UL, 0x00005a00UL, 0x0000a000UL, +0x00005200UL, 0x00003b00UL, 0x0000d600UL, 0x0000b300UL, 0x00002900UL, 0x0000e300UL, 0x00002f00UL, 0x00008400UL, +0x00005300UL, 0x0000d100UL, 0x00000000UL, 0x0000ed00UL, 0x00002000UL, 0x0000fc00UL, 0x0000b100UL, 0x00005b00UL, +0x00006a00UL, 0x0000cb00UL, 0x0000be00UL, 0x00003900UL, 0x00004a00UL, 0x00004c00UL, 0x00005800UL, 0x0000cf00UL, +0x0000d000UL, 0x0000ef00UL, 0x0000aa00UL, 0x0000fb00UL, 0x00004300UL, 0x00004d00UL, 0x00003300UL, 0x00008500UL, +0x00004500UL, 0x0000f900UL, 0x00000200UL, 0x00007f00UL, 0x00005000UL, 0x00003c00UL, 0x00009f00UL, 0x0000a800UL, +0x00005100UL, 0x0000a300UL, 0x00004000UL, 0x00008f00UL, 0x00009200UL, 0x00009d00UL, 0x00003800UL, 0x0000f500UL, +0x0000bc00UL, 0x0000b600UL, 0x0000da00UL, 0x00002100UL, 0x00001000UL, 0x0000ff00UL, 0x0000f300UL, 0x0000d200UL, +0x0000cd00UL, 0x00000c00UL, 0x00001300UL, 0x0000ec00UL, 0x00005f00UL, 0x00009700UL, 0x00004400UL, 0x00001700UL, +0x0000c400UL, 0x0000a700UL, 0x00007e00UL, 0x00003d00UL, 0x00006400UL, 0x00005d00UL, 0x00001900UL, 0x00007300UL, +0x00006000UL, 0x00008100UL, 0x00004f00UL, 0x0000dc00UL, 0x00002200UL, 0x00002a00UL, 0x00009000UL, 0x00008800UL, +0x00004600UL, 0x0000ee00UL, 0x0000b800UL, 0x00001400UL, 0x0000de00UL, 0x00005e00UL, 0x00000b00UL, 0x0000db00UL, +0x0000e000UL, 0x00003200UL, 0x00003a00UL, 0x00000a00UL, 0x00004900UL, 0x00000600UL, 0x00002400UL, 0x00005c00UL, +0x0000c200UL, 0x0000d300UL, 0x0000ac00UL, 0x00006200UL, 0x00009100UL, 0x00009500UL, 0x0000e400UL, 0x00007900UL, +0x0000e700UL, 0x0000c800UL, 0x00003700UL, 0x00006d00UL, 0x00008d00UL, 0x0000d500UL, 0x00004e00UL, 0x0000a900UL, +0x00006c00UL, 0x00005600UL, 0x0000f400UL, 0x0000ea00UL, 0x00006500UL, 0x00007a00UL, 0x0000ae00UL, 0x00000800UL, +0x0000ba00UL, 0x00007800UL, 0x00002500UL, 0x00002e00UL, 0x00001c00UL, 0x0000a600UL, 0x0000b400UL, 0x0000c600UL, +0x0000e800UL, 0x0000dd00UL, 0x00007400UL, 0x00001f00UL, 0x00004b00UL, 0x0000bd00UL, 0x00008b00UL, 0x00008a00UL, +0x00007000UL, 0x00003e00UL, 0x0000b500UL, 0x00006600UL, 0x00004800UL, 0x00000300UL, 0x0000f600UL, 0x00000e00UL, +0x00006100UL, 0x00003500UL, 0x00005700UL, 0x0000b900UL, 0x00008600UL, 0x0000c100UL, 0x00001d00UL, 0x00009e00UL, +0x0000e100UL, 0x0000f800UL, 0x00009800UL, 0x00001100UL, 0x00006900UL, 0x0000d900UL, 0x00008e00UL, 0x00009400UL, +0x00009b00UL, 0x00001e00UL, 0x00008700UL, 0x0000e900UL, 0x0000ce00UL, 0x00005500UL, 0x00002800UL, 0x0000df00UL, +0x00008c00UL, 0x0000a100UL, 0x00008900UL, 0x00000d00UL, 0x0000bf00UL, 0x0000e600UL, 0x00004200UL, 0x00006800UL, +0x00004100UL, 0x00009900UL, 0x00002d00UL, 0x00000f00UL, 0x0000b000UL, 0x00005400UL, 0x0000bb00UL, 0x00001600UL +}; + +static const unsigned long Te4_2[] = { +0x00630000UL, 0x007c0000UL, 0x00770000UL, 0x007b0000UL, 0x00f20000UL, 0x006b0000UL, 0x006f0000UL, 0x00c50000UL, +0x00300000UL, 0x00010000UL, 0x00670000UL, 0x002b0000UL, 0x00fe0000UL, 0x00d70000UL, 0x00ab0000UL, 0x00760000UL, +0x00ca0000UL, 0x00820000UL, 0x00c90000UL, 0x007d0000UL, 0x00fa0000UL, 0x00590000UL, 0x00470000UL, 0x00f00000UL, +0x00ad0000UL, 0x00d40000UL, 0x00a20000UL, 0x00af0000UL, 0x009c0000UL, 0x00a40000UL, 0x00720000UL, 0x00c00000UL, +0x00b70000UL, 0x00fd0000UL, 0x00930000UL, 0x00260000UL, 0x00360000UL, 0x003f0000UL, 0x00f70000UL, 0x00cc0000UL, +0x00340000UL, 0x00a50000UL, 0x00e50000UL, 0x00f10000UL, 0x00710000UL, 0x00d80000UL, 0x00310000UL, 0x00150000UL, +0x00040000UL, 0x00c70000UL, 0x00230000UL, 0x00c30000UL, 0x00180000UL, 0x00960000UL, 0x00050000UL, 0x009a0000UL, +0x00070000UL, 0x00120000UL, 0x00800000UL, 0x00e20000UL, 0x00eb0000UL, 0x00270000UL, 0x00b20000UL, 0x00750000UL, +0x00090000UL, 0x00830000UL, 0x002c0000UL, 0x001a0000UL, 0x001b0000UL, 0x006e0000UL, 0x005a0000UL, 0x00a00000UL, +0x00520000UL, 0x003b0000UL, 0x00d60000UL, 0x00b30000UL, 0x00290000UL, 0x00e30000UL, 0x002f0000UL, 0x00840000UL, +0x00530000UL, 0x00d10000UL, 0x00000000UL, 0x00ed0000UL, 0x00200000UL, 0x00fc0000UL, 0x00b10000UL, 0x005b0000UL, +0x006a0000UL, 0x00cb0000UL, 0x00be0000UL, 0x00390000UL, 0x004a0000UL, 0x004c0000UL, 0x00580000UL, 0x00cf0000UL, +0x00d00000UL, 0x00ef0000UL, 0x00aa0000UL, 0x00fb0000UL, 0x00430000UL, 0x004d0000UL, 0x00330000UL, 0x00850000UL, +0x00450000UL, 0x00f90000UL, 0x00020000UL, 0x007f0000UL, 0x00500000UL, 0x003c0000UL, 0x009f0000UL, 0x00a80000UL, +0x00510000UL, 0x00a30000UL, 0x00400000UL, 0x008f0000UL, 0x00920000UL, 0x009d0000UL, 0x00380000UL, 0x00f50000UL, +0x00bc0000UL, 0x00b60000UL, 0x00da0000UL, 0x00210000UL, 0x00100000UL, 0x00ff0000UL, 0x00f30000UL, 0x00d20000UL, +0x00cd0000UL, 0x000c0000UL, 0x00130000UL, 0x00ec0000UL, 0x005f0000UL, 0x00970000UL, 0x00440000UL, 0x00170000UL, +0x00c40000UL, 0x00a70000UL, 0x007e0000UL, 0x003d0000UL, 0x00640000UL, 0x005d0000UL, 0x00190000UL, 0x00730000UL, +0x00600000UL, 0x00810000UL, 0x004f0000UL, 0x00dc0000UL, 0x00220000UL, 0x002a0000UL, 0x00900000UL, 0x00880000UL, +0x00460000UL, 0x00ee0000UL, 0x00b80000UL, 0x00140000UL, 0x00de0000UL, 0x005e0000UL, 0x000b0000UL, 0x00db0000UL, +0x00e00000UL, 0x00320000UL, 0x003a0000UL, 0x000a0000UL, 0x00490000UL, 0x00060000UL, 0x00240000UL, 0x005c0000UL, +0x00c20000UL, 0x00d30000UL, 0x00ac0000UL, 0x00620000UL, 0x00910000UL, 0x00950000UL, 0x00e40000UL, 0x00790000UL, +0x00e70000UL, 0x00c80000UL, 0x00370000UL, 0x006d0000UL, 0x008d0000UL, 0x00d50000UL, 0x004e0000UL, 0x00a90000UL, +0x006c0000UL, 0x00560000UL, 0x00f40000UL, 0x00ea0000UL, 0x00650000UL, 0x007a0000UL, 0x00ae0000UL, 0x00080000UL, +0x00ba0000UL, 0x00780000UL, 0x00250000UL, 0x002e0000UL, 0x001c0000UL, 0x00a60000UL, 0x00b40000UL, 0x00c60000UL, +0x00e80000UL, 0x00dd0000UL, 0x00740000UL, 0x001f0000UL, 0x004b0000UL, 0x00bd0000UL, 0x008b0000UL, 0x008a0000UL, +0x00700000UL, 0x003e0000UL, 0x00b50000UL, 0x00660000UL, 0x00480000UL, 0x00030000UL, 0x00f60000UL, 0x000e0000UL, +0x00610000UL, 0x00350000UL, 0x00570000UL, 0x00b90000UL, 0x00860000UL, 0x00c10000UL, 0x001d0000UL, 0x009e0000UL, +0x00e10000UL, 0x00f80000UL, 0x00980000UL, 0x00110000UL, 0x00690000UL, 0x00d90000UL, 0x008e0000UL, 0x00940000UL, +0x009b0000UL, 0x001e0000UL, 0x00870000UL, 0x00e90000UL, 0x00ce0000UL, 0x00550000UL, 0x00280000UL, 0x00df0000UL, +0x008c0000UL, 0x00a10000UL, 0x00890000UL, 0x000d0000UL, 0x00bf0000UL, 0x00e60000UL, 0x00420000UL, 0x00680000UL, +0x00410000UL, 0x00990000UL, 0x002d0000UL, 0x000f0000UL, 0x00b00000UL, 0x00540000UL, 0x00bb0000UL, 0x00160000UL +}; + +static const unsigned long Te4_3[] = { +0x63000000UL, 0x7c000000UL, 0x77000000UL, 0x7b000000UL, 0xf2000000UL, 0x6b000000UL, 0x6f000000UL, 0xc5000000UL, +0x30000000UL, 0x01000000UL, 0x67000000UL, 0x2b000000UL, 0xfe000000UL, 0xd7000000UL, 0xab000000UL, 0x76000000UL, +0xca000000UL, 0x82000000UL, 0xc9000000UL, 0x7d000000UL, 0xfa000000UL, 0x59000000UL, 0x47000000UL, 0xf0000000UL, +0xad000000UL, 0xd4000000UL, 0xa2000000UL, 0xaf000000UL, 0x9c000000UL, 0xa4000000UL, 0x72000000UL, 0xc0000000UL, +0xb7000000UL, 0xfd000000UL, 0x93000000UL, 0x26000000UL, 0x36000000UL, 0x3f000000UL, 0xf7000000UL, 0xcc000000UL, +0x34000000UL, 0xa5000000UL, 0xe5000000UL, 0xf1000000UL, 0x71000000UL, 0xd8000000UL, 0x31000000UL, 0x15000000UL, +0x04000000UL, 0xc7000000UL, 0x23000000UL, 0xc3000000UL, 0x18000000UL, 0x96000000UL, 0x05000000UL, 0x9a000000UL, +0x07000000UL, 0x12000000UL, 0x80000000UL, 0xe2000000UL, 0xeb000000UL, 0x27000000UL, 0xb2000000UL, 0x75000000UL, +0x09000000UL, 0x83000000UL, 0x2c000000UL, 0x1a000000UL, 0x1b000000UL, 0x6e000000UL, 0x5a000000UL, 0xa0000000UL, +0x52000000UL, 0x3b000000UL, 0xd6000000UL, 0xb3000000UL, 0x29000000UL, 0xe3000000UL, 0x2f000000UL, 0x84000000UL, +0x53000000UL, 0xd1000000UL, 0x00000000UL, 0xed000000UL, 0x20000000UL, 0xfc000000UL, 0xb1000000UL, 0x5b000000UL, +0x6a000000UL, 0xcb000000UL, 0xbe000000UL, 0x39000000UL, 0x4a000000UL, 0x4c000000UL, 0x58000000UL, 0xcf000000UL, +0xd0000000UL, 0xef000000UL, 0xaa000000UL, 0xfb000000UL, 0x43000000UL, 0x4d000000UL, 0x33000000UL, 0x85000000UL, +0x45000000UL, 0xf9000000UL, 0x02000000UL, 0x7f000000UL, 0x50000000UL, 0x3c000000UL, 0x9f000000UL, 0xa8000000UL, +0x51000000UL, 0xa3000000UL, 0x40000000UL, 0x8f000000UL, 0x92000000UL, 0x9d000000UL, 0x38000000UL, 0xf5000000UL, +0xbc000000UL, 0xb6000000UL, 0xda000000UL, 0x21000000UL, 0x10000000UL, 0xff000000UL, 0xf3000000UL, 0xd2000000UL, +0xcd000000UL, 0x0c000000UL, 0x13000000UL, 0xec000000UL, 0x5f000000UL, 0x97000000UL, 0x44000000UL, 0x17000000UL, +0xc4000000UL, 0xa7000000UL, 0x7e000000UL, 0x3d000000UL, 0x64000000UL, 0x5d000000UL, 0x19000000UL, 0x73000000UL, +0x60000000UL, 0x81000000UL, 0x4f000000UL, 0xdc000000UL, 0x22000000UL, 0x2a000000UL, 0x90000000UL, 0x88000000UL, +0x46000000UL, 0xee000000UL, 0xb8000000UL, 0x14000000UL, 0xde000000UL, 0x5e000000UL, 0x0b000000UL, 0xdb000000UL, +0xe0000000UL, 0x32000000UL, 0x3a000000UL, 0x0a000000UL, 0x49000000UL, 0x06000000UL, 0x24000000UL, 0x5c000000UL, +0xc2000000UL, 0xd3000000UL, 0xac000000UL, 0x62000000UL, 0x91000000UL, 0x95000000UL, 0xe4000000UL, 0x79000000UL, +0xe7000000UL, 0xc8000000UL, 0x37000000UL, 0x6d000000UL, 0x8d000000UL, 0xd5000000UL, 0x4e000000UL, 0xa9000000UL, +0x6c000000UL, 0x56000000UL, 0xf4000000UL, 0xea000000UL, 0x65000000UL, 0x7a000000UL, 0xae000000UL, 0x08000000UL, +0xba000000UL, 0x78000000UL, 0x25000000UL, 0x2e000000UL, 0x1c000000UL, 0xa6000000UL, 0xb4000000UL, 0xc6000000UL, +0xe8000000UL, 0xdd000000UL, 0x74000000UL, 0x1f000000UL, 0x4b000000UL, 0xbd000000UL, 0x8b000000UL, 0x8a000000UL, +0x70000000UL, 0x3e000000UL, 0xb5000000UL, 0x66000000UL, 0x48000000UL, 0x03000000UL, 0xf6000000UL, 0x0e000000UL, +0x61000000UL, 0x35000000UL, 0x57000000UL, 0xb9000000UL, 0x86000000UL, 0xc1000000UL, 0x1d000000UL, 0x9e000000UL, +0xe1000000UL, 0xf8000000UL, 0x98000000UL, 0x11000000UL, 0x69000000UL, 0xd9000000UL, 0x8e000000UL, 0x94000000UL, +0x9b000000UL, 0x1e000000UL, 0x87000000UL, 0xe9000000UL, 0xce000000UL, 0x55000000UL, 0x28000000UL, 0xdf000000UL, +0x8c000000UL, 0xa1000000UL, 0x89000000UL, 0x0d000000UL, 0xbf000000UL, 0xe6000000UL, 0x42000000UL, 0x68000000UL, +0x41000000UL, 0x99000000UL, 0x2d000000UL, 0x0f000000UL, 0xb0000000UL, 0x54000000UL, 0xbb000000UL, 0x16000000UL +}; + +#endif + static const unsigned long Td0[256] = { - 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, - 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, - 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, - 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, - 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, - 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, - 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, - 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, - 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, - 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, - 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, - 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, - 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, - 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, - 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, - 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, - 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, - 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, - 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, - 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, - 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, - 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, - 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, - 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, - 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, - 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, - 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, - 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, - 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, - 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, - 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, - 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, - 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, - 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, - 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, - 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, - 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, - 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, - 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, - 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, - 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, - 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, - 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, - 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, - 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, - 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, - 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, - 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, - 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, - 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, - 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, - 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, - 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, - 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, - 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, - 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, - 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, - 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, - 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, - 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, - 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, - 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, - 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, - 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, + 0x51f4a750UL, 0x7e416553UL, 0x1a17a4c3UL, 0x3a275e96UL, + 0x3bab6bcbUL, 0x1f9d45f1UL, 0xacfa58abUL, 0x4be30393UL, + 0x2030fa55UL, 0xad766df6UL, 0x88cc7691UL, 0xf5024c25UL, + 0x4fe5d7fcUL, 0xc52acbd7UL, 0x26354480UL, 0xb562a38fUL, + 0xdeb15a49UL, 0x25ba1b67UL, 0x45ea0e98UL, 0x5dfec0e1UL, + 0xc32f7502UL, 0x814cf012UL, 0x8d4697a3UL, 0x6bd3f9c6UL, + 0x038f5fe7UL, 0x15929c95UL, 0xbf6d7aebUL, 0x955259daUL, + 0xd4be832dUL, 0x587421d3UL, 0x49e06929UL, 0x8ec9c844UL, + 0x75c2896aUL, 0xf48e7978UL, 0x99583e6bUL, 0x27b971ddUL, + 0xbee14fb6UL, 0xf088ad17UL, 0xc920ac66UL, 0x7dce3ab4UL, + 0x63df4a18UL, 0xe51a3182UL, 0x97513360UL, 0x62537f45UL, + 0xb16477e0UL, 0xbb6bae84UL, 0xfe81a01cUL, 0xf9082b94UL, + 0x70486858UL, 0x8f45fd19UL, 0x94de6c87UL, 0x527bf8b7UL, + 0xab73d323UL, 0x724b02e2UL, 0xe31f8f57UL, 0x6655ab2aUL, + 0xb2eb2807UL, 0x2fb5c203UL, 0x86c57b9aUL, 0xd33708a5UL, + 0x302887f2UL, 0x23bfa5b2UL, 0x02036abaUL, 0xed16825cUL, + 0x8acf1c2bUL, 0xa779b492UL, 0xf307f2f0UL, 0x4e69e2a1UL, + 0x65daf4cdUL, 0x0605bed5UL, 0xd134621fUL, 0xc4a6fe8aUL, + 0x342e539dUL, 0xa2f355a0UL, 0x058ae132UL, 0xa4f6eb75UL, + 0x0b83ec39UL, 0x4060efaaUL, 0x5e719f06UL, 0xbd6e1051UL, + 0x3e218af9UL, 0x96dd063dUL, 0xdd3e05aeUL, 0x4de6bd46UL, + 0x91548db5UL, 0x71c45d05UL, 0x0406d46fUL, 0x605015ffUL, + 0x1998fb24UL, 0xd6bde997UL, 0x894043ccUL, 0x67d99e77UL, + 0xb0e842bdUL, 0x07898b88UL, 0xe7195b38UL, 0x79c8eedbUL, + 0xa17c0a47UL, 0x7c420fe9UL, 0xf8841ec9UL, 0x00000000UL, + 0x09808683UL, 0x322bed48UL, 0x1e1170acUL, 0x6c5a724eUL, + 0xfd0efffbUL, 0x0f853856UL, 0x3daed51eUL, 0x362d3927UL, + 0x0a0fd964UL, 0x685ca621UL, 0x9b5b54d1UL, 0x24362e3aUL, + 0x0c0a67b1UL, 0x9357e70fUL, 0xb4ee96d2UL, 0x1b9b919eUL, + 0x80c0c54fUL, 0x61dc20a2UL, 0x5a774b69UL, 0x1c121a16UL, + 0xe293ba0aUL, 0xc0a02ae5UL, 0x3c22e043UL, 0x121b171dUL, + 0x0e090d0bUL, 0xf28bc7adUL, 0x2db6a8b9UL, 0x141ea9c8UL, + 0x57f11985UL, 0xaf75074cUL, 0xee99ddbbUL, 0xa37f60fdUL, + 0xf701269fUL, 0x5c72f5bcUL, 0x44663bc5UL, 0x5bfb7e34UL, + 0x8b432976UL, 0xcb23c6dcUL, 0xb6edfc68UL, 0xb8e4f163UL, + 0xd731dccaUL, 0x42638510UL, 0x13972240UL, 0x84c61120UL, + 0x854a247dUL, 0xd2bb3df8UL, 0xaef93211UL, 0xc729a16dUL, + 0x1d9e2f4bUL, 0xdcb230f3UL, 0x0d8652ecUL, 0x77c1e3d0UL, + 0x2bb3166cUL, 0xa970b999UL, 0x119448faUL, 0x47e96422UL, + 0xa8fc8cc4UL, 0xa0f03f1aUL, 0x567d2cd8UL, 0x223390efUL, + 0x87494ec7UL, 0xd938d1c1UL, 0x8ccaa2feUL, 0x98d40b36UL, + 0xa6f581cfUL, 0xa57ade28UL, 0xdab78e26UL, 0x3fadbfa4UL, + 0x2c3a9de4UL, 0x5078920dUL, 0x6a5fcc9bUL, 0x547e4662UL, + 0xf68d13c2UL, 0x90d8b8e8UL, 0x2e39f75eUL, 0x82c3aff5UL, + 0x9f5d80beUL, 0x69d0937cUL, 0x6fd52da9UL, 0xcf2512b3UL, + 0xc8ac993bUL, 0x10187da7UL, 0xe89c636eUL, 0xdb3bbb7bUL, + 0xcd267809UL, 0x6e5918f4UL, 0xec9ab701UL, 0x834f9aa8UL, + 0xe6956e65UL, 0xaaffe67eUL, 0x21bccf08UL, 0xef15e8e6UL, + 0xbae79bd9UL, 0x4a6f36ceUL, 0xea9f09d4UL, 0x29b07cd6UL, + 0x31a4b2afUL, 0x2a3f2331UL, 0xc6a59430UL, 0x35a266c0UL, + 0x744ebc37UL, 0xfc82caa6UL, 0xe090d0b0UL, 0x33a7d815UL, + 0xf104984aUL, 0x41ecdaf7UL, 0x7fcd500eUL, 0x1791f62fUL, + 0x764dd68dUL, 0x43efb04dUL, 0xccaa4d54UL, 0xe49604dfUL, + 0x9ed1b5e3UL, 0x4c6a881bUL, 0xc12c1fb8UL, 0x4665517fUL, + 0x9d5eea04UL, 0x018c355dUL, 0xfa877473UL, 0xfb0b412eUL, + 0xb3671d5aUL, 0x92dbd252UL, 0xe9105633UL, 0x6dd64713UL, + 0x9ad7618cUL, 0x37a10c7aUL, 0x59f8148eUL, 0xeb133c89UL, + 0xcea927eeUL, 0xb761c935UL, 0xe11ce5edUL, 0x7a47b13cUL, + 0x9cd2df59UL, 0x55f2733fUL, 0x1814ce79UL, 0x73c737bfUL, + 0x53f7cdeaUL, 0x5ffdaa5bUL, 0xdf3d6f14UL, 0x7844db86UL, + 0xcaaff381UL, 0xb968c43eUL, 0x3824342cUL, 0xc2a3405fUL, + 0x161dc372UL, 0xbce2250cUL, 0x283c498bUL, 0xff0d9541UL, + 0x39a80171UL, 0x080cb3deUL, 0xd8b4e49cUL, 0x6456c190UL, + 0x7bcb8461UL, 0xd532b670UL, 0x486c5c74UL, 0xd0b85742UL, }; static const unsigned long Td1[256] = { - 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, - 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U, - 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU, - 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U, - 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, - 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, - 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U, - 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U, - 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U, - 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, - 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, - 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, - 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U, - 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU, - 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, - 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, - 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, - 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU, - 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU, - 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, - 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, - 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U, - 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU, - 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU, - 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, - 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, - 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U, - 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU, - 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U, - 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, - 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, - 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, - 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U, - 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU, - 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, - 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, - 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, - 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U, - 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U, - 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, - 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, - 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, - 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U, - 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU, - 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, - 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, - 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, - 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U, - 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU, - 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, - 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, - 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, - 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U, - 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U, - 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, - 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, - 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, - 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U, - 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U, - 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, - 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, - 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, - 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U, - 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U, + 0x5051f4a7UL, 0x537e4165UL, 0xc31a17a4UL, 0x963a275eUL, + 0xcb3bab6bUL, 0xf11f9d45UL, 0xabacfa58UL, 0x934be303UL, + 0x552030faUL, 0xf6ad766dUL, 0x9188cc76UL, 0x25f5024cUL, + 0xfc4fe5d7UL, 0xd7c52acbUL, 0x80263544UL, 0x8fb562a3UL, + 0x49deb15aUL, 0x6725ba1bUL, 0x9845ea0eUL, 0xe15dfec0UL, + 0x02c32f75UL, 0x12814cf0UL, 0xa38d4697UL, 0xc66bd3f9UL, + 0xe7038f5fUL, 0x9515929cUL, 0xebbf6d7aUL, 0xda955259UL, + 0x2dd4be83UL, 0xd3587421UL, 0x2949e069UL, 0x448ec9c8UL, + 0x6a75c289UL, 0x78f48e79UL, 0x6b99583eUL, 0xdd27b971UL, + 0xb6bee14fUL, 0x17f088adUL, 0x66c920acUL, 0xb47dce3aUL, + 0x1863df4aUL, 0x82e51a31UL, 0x60975133UL, 0x4562537fUL, + 0xe0b16477UL, 0x84bb6baeUL, 0x1cfe81a0UL, 0x94f9082bUL, + 0x58704868UL, 0x198f45fdUL, 0x8794de6cUL, 0xb7527bf8UL, + 0x23ab73d3UL, 0xe2724b02UL, 0x57e31f8fUL, 0x2a6655abUL, + 0x07b2eb28UL, 0x032fb5c2UL, 0x9a86c57bUL, 0xa5d33708UL, + 0xf2302887UL, 0xb223bfa5UL, 0xba02036aUL, 0x5ced1682UL, + 0x2b8acf1cUL, 0x92a779b4UL, 0xf0f307f2UL, 0xa14e69e2UL, + 0xcd65daf4UL, 0xd50605beUL, 0x1fd13462UL, 0x8ac4a6feUL, + 0x9d342e53UL, 0xa0a2f355UL, 0x32058ae1UL, 0x75a4f6ebUL, + 0x390b83ecUL, 0xaa4060efUL, 0x065e719fUL, 0x51bd6e10UL, + 0xf93e218aUL, 0x3d96dd06UL, 0xaedd3e05UL, 0x464de6bdUL, + 0xb591548dUL, 0x0571c45dUL, 0x6f0406d4UL, 0xff605015UL, + 0x241998fbUL, 0x97d6bde9UL, 0xcc894043UL, 0x7767d99eUL, + 0xbdb0e842UL, 0x8807898bUL, 0x38e7195bUL, 0xdb79c8eeUL, + 0x47a17c0aUL, 0xe97c420fUL, 0xc9f8841eUL, 0x00000000UL, + 0x83098086UL, 0x48322bedUL, 0xac1e1170UL, 0x4e6c5a72UL, + 0xfbfd0effUL, 0x560f8538UL, 0x1e3daed5UL, 0x27362d39UL, + 0x640a0fd9UL, 0x21685ca6UL, 0xd19b5b54UL, 0x3a24362eUL, + 0xb10c0a67UL, 0x0f9357e7UL, 0xd2b4ee96UL, 0x9e1b9b91UL, + 0x4f80c0c5UL, 0xa261dc20UL, 0x695a774bUL, 0x161c121aUL, + 0x0ae293baUL, 0xe5c0a02aUL, 0x433c22e0UL, 0x1d121b17UL, + 0x0b0e090dUL, 0xadf28bc7UL, 0xb92db6a8UL, 0xc8141ea9UL, + 0x8557f119UL, 0x4caf7507UL, 0xbbee99ddUL, 0xfda37f60UL, + 0x9ff70126UL, 0xbc5c72f5UL, 0xc544663bUL, 0x345bfb7eUL, + 0x768b4329UL, 0xdccb23c6UL, 0x68b6edfcUL, 0x63b8e4f1UL, + 0xcad731dcUL, 0x10426385UL, 0x40139722UL, 0x2084c611UL, + 0x7d854a24UL, 0xf8d2bb3dUL, 0x11aef932UL, 0x6dc729a1UL, + 0x4b1d9e2fUL, 0xf3dcb230UL, 0xec0d8652UL, 0xd077c1e3UL, + 0x6c2bb316UL, 0x99a970b9UL, 0xfa119448UL, 0x2247e964UL, + 0xc4a8fc8cUL, 0x1aa0f03fUL, 0xd8567d2cUL, 0xef223390UL, + 0xc787494eUL, 0xc1d938d1UL, 0xfe8ccaa2UL, 0x3698d40bUL, + 0xcfa6f581UL, 0x28a57adeUL, 0x26dab78eUL, 0xa43fadbfUL, + 0xe42c3a9dUL, 0x0d507892UL, 0x9b6a5fccUL, 0x62547e46UL, + 0xc2f68d13UL, 0xe890d8b8UL, 0x5e2e39f7UL, 0xf582c3afUL, + 0xbe9f5d80UL, 0x7c69d093UL, 0xa96fd52dUL, 0xb3cf2512UL, + 0x3bc8ac99UL, 0xa710187dUL, 0x6ee89c63UL, 0x7bdb3bbbUL, + 0x09cd2678UL, 0xf46e5918UL, 0x01ec9ab7UL, 0xa8834f9aUL, + 0x65e6956eUL, 0x7eaaffe6UL, 0x0821bccfUL, 0xe6ef15e8UL, + 0xd9bae79bUL, 0xce4a6f36UL, 0xd4ea9f09UL, 0xd629b07cUL, + 0xaf31a4b2UL, 0x312a3f23UL, 0x30c6a594UL, 0xc035a266UL, + 0x37744ebcUL, 0xa6fc82caUL, 0xb0e090d0UL, 0x1533a7d8UL, + 0x4af10498UL, 0xf741ecdaUL, 0x0e7fcd50UL, 0x2f1791f6UL, + 0x8d764dd6UL, 0x4d43efb0UL, 0x54ccaa4dUL, 0xdfe49604UL, + 0xe39ed1b5UL, 0x1b4c6a88UL, 0xb8c12c1fUL, 0x7f466551UL, + 0x049d5eeaUL, 0x5d018c35UL, 0x73fa8774UL, 0x2efb0b41UL, + 0x5ab3671dUL, 0x5292dbd2UL, 0x33e91056UL, 0x136dd647UL, + 0x8c9ad761UL, 0x7a37a10cUL, 0x8e59f814UL, 0x89eb133cUL, + 0xeecea927UL, 0x35b761c9UL, 0xede11ce5UL, 0x3c7a47b1UL, + 0x599cd2dfUL, 0x3f55f273UL, 0x791814ceUL, 0xbf73c737UL, + 0xea53f7cdUL, 0x5b5ffdaaUL, 0x14df3d6fUL, 0x867844dbUL, + 0x81caaff3UL, 0x3eb968c4UL, 0x2c382434UL, 0x5fc2a340UL, + 0x72161dc3UL, 0x0cbce225UL, 0x8b283c49UL, 0x41ff0d95UL, + 0x7139a801UL, 0xde080cb3UL, 0x9cd8b4e4UL, 0x906456c1UL, + 0x617bcb84UL, 0x70d532b6UL, 0x74486c5cUL, 0x42d0b857UL, }; static const unsigned long Td2[256] = { - 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, - 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, - 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U, - 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U, - 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, - 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, - 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, - 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U, - 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U, - 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, - 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, - 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, - 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU, - 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U, - 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, - 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, - 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, - 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, - 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, - 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, + 0xa75051f4UL, 0x65537e41UL, 0xa4c31a17UL, 0x5e963a27UL, + 0x6bcb3babUL, 0x45f11f9dUL, 0x58abacfaUL, 0x03934be3UL, + 0xfa552030UL, 0x6df6ad76UL, 0x769188ccUL, 0x4c25f502UL, + 0xd7fc4fe5UL, 0xcbd7c52aUL, 0x44802635UL, 0xa38fb562UL, + 0x5a49deb1UL, 0x1b6725baUL, 0x0e9845eaUL, 0xc0e15dfeUL, + 0x7502c32fUL, 0xf012814cUL, 0x97a38d46UL, 0xf9c66bd3UL, + 0x5fe7038fUL, 0x9c951592UL, 0x7aebbf6dUL, 0x59da9552UL, + 0x832dd4beUL, 0x21d35874UL, 0x692949e0UL, 0xc8448ec9UL, + 0x896a75c2UL, 0x7978f48eUL, 0x3e6b9958UL, 0x71dd27b9UL, + 0x4fb6bee1UL, 0xad17f088UL, 0xac66c920UL, 0x3ab47dceUL, + 0x4a1863dfUL, 0x3182e51aUL, 0x33609751UL, 0x7f456253UL, + 0x77e0b164UL, 0xae84bb6bUL, 0xa01cfe81UL, 0x2b94f908UL, + 0x68587048UL, 0xfd198f45UL, 0x6c8794deUL, 0xf8b7527bUL, + 0xd323ab73UL, 0x02e2724bUL, 0x8f57e31fUL, 0xab2a6655UL, + 0x2807b2ebUL, 0xc2032fb5UL, 0x7b9a86c5UL, 0x08a5d337UL, + 0x87f23028UL, 0xa5b223bfUL, 0x6aba0203UL, 0x825ced16UL, + 0x1c2b8acfUL, 0xb492a779UL, 0xf2f0f307UL, 0xe2a14e69UL, + 0xf4cd65daUL, 0xbed50605UL, 0x621fd134UL, 0xfe8ac4a6UL, + 0x539d342eUL, 0x55a0a2f3UL, 0xe132058aUL, 0xeb75a4f6UL, + 0xec390b83UL, 0xefaa4060UL, 0x9f065e71UL, 0x1051bd6eUL, - 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, - 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, - 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, - 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U, - 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, - 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, - 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU, - 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U, - 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU, - 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, - 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, - 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, - 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU, - 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU, - 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, - 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, - 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, - 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U, - 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U, - 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, - 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, - 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, - 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU, - 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U, - 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, - 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, - 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, - 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U, - 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U, - 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, - 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, - 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, - 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U, - 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U, - 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, - 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, - 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, - 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U, - 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U, - 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, - 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, - 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, - 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U, - 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U, + 0x8af93e21UL, 0x063d96ddUL, 0x05aedd3eUL, 0xbd464de6UL, + 0x8db59154UL, 0x5d0571c4UL, 0xd46f0406UL, 0x15ff6050UL, + 0xfb241998UL, 0xe997d6bdUL, 0x43cc8940UL, 0x9e7767d9UL, + 0x42bdb0e8UL, 0x8b880789UL, 0x5b38e719UL, 0xeedb79c8UL, + 0x0a47a17cUL, 0x0fe97c42UL, 0x1ec9f884UL, 0x00000000UL, + 0x86830980UL, 0xed48322bUL, 0x70ac1e11UL, 0x724e6c5aUL, + 0xfffbfd0eUL, 0x38560f85UL, 0xd51e3daeUL, 0x3927362dUL, + 0xd9640a0fUL, 0xa621685cUL, 0x54d19b5bUL, 0x2e3a2436UL, + 0x67b10c0aUL, 0xe70f9357UL, 0x96d2b4eeUL, 0x919e1b9bUL, + 0xc54f80c0UL, 0x20a261dcUL, 0x4b695a77UL, 0x1a161c12UL, + 0xba0ae293UL, 0x2ae5c0a0UL, 0xe0433c22UL, 0x171d121bUL, + 0x0d0b0e09UL, 0xc7adf28bUL, 0xa8b92db6UL, 0xa9c8141eUL, + 0x198557f1UL, 0x074caf75UL, 0xddbbee99UL, 0x60fda37fUL, + 0x269ff701UL, 0xf5bc5c72UL, 0x3bc54466UL, 0x7e345bfbUL, + 0x29768b43UL, 0xc6dccb23UL, 0xfc68b6edUL, 0xf163b8e4UL, + 0xdccad731UL, 0x85104263UL, 0x22401397UL, 0x112084c6UL, + 0x247d854aUL, 0x3df8d2bbUL, 0x3211aef9UL, 0xa16dc729UL, + 0x2f4b1d9eUL, 0x30f3dcb2UL, 0x52ec0d86UL, 0xe3d077c1UL, + 0x166c2bb3UL, 0xb999a970UL, 0x48fa1194UL, 0x642247e9UL, + 0x8cc4a8fcUL, 0x3f1aa0f0UL, 0x2cd8567dUL, 0x90ef2233UL, + 0x4ec78749UL, 0xd1c1d938UL, 0xa2fe8ccaUL, 0x0b3698d4UL, + 0x81cfa6f5UL, 0xde28a57aUL, 0x8e26dab7UL, 0xbfa43fadUL, + 0x9de42c3aUL, 0x920d5078UL, 0xcc9b6a5fUL, 0x4662547eUL, + 0x13c2f68dUL, 0xb8e890d8UL, 0xf75e2e39UL, 0xaff582c3UL, + 0x80be9f5dUL, 0x937c69d0UL, 0x2da96fd5UL, 0x12b3cf25UL, + 0x993bc8acUL, 0x7da71018UL, 0x636ee89cUL, 0xbb7bdb3bUL, + 0x7809cd26UL, 0x18f46e59UL, 0xb701ec9aUL, 0x9aa8834fUL, + 0x6e65e695UL, 0xe67eaaffUL, 0xcf0821bcUL, 0xe8e6ef15UL, + 0x9bd9bae7UL, 0x36ce4a6fUL, 0x09d4ea9fUL, 0x7cd629b0UL, + 0xb2af31a4UL, 0x23312a3fUL, 0x9430c6a5UL, 0x66c035a2UL, + 0xbc37744eUL, 0xcaa6fc82UL, 0xd0b0e090UL, 0xd81533a7UL, + 0x984af104UL, 0xdaf741ecUL, 0x500e7fcdUL, 0xf62f1791UL, + 0xd68d764dUL, 0xb04d43efUL, 0x4d54ccaaUL, 0x04dfe496UL, + 0xb5e39ed1UL, 0x881b4c6aUL, 0x1fb8c12cUL, 0x517f4665UL, + 0xea049d5eUL, 0x355d018cUL, 0x7473fa87UL, 0x412efb0bUL, + 0x1d5ab367UL, 0xd25292dbUL, 0x5633e910UL, 0x47136dd6UL, + 0x618c9ad7UL, 0x0c7a37a1UL, 0x148e59f8UL, 0x3c89eb13UL, + 0x27eecea9UL, 0xc935b761UL, 0xe5ede11cUL, 0xb13c7a47UL, + 0xdf599cd2UL, 0x733f55f2UL, 0xce791814UL, 0x37bf73c7UL, + 0xcdea53f7UL, 0xaa5b5ffdUL, 0x6f14df3dUL, 0xdb867844UL, + 0xf381caafUL, 0xc43eb968UL, 0x342c3824UL, 0x405fc2a3UL, + 0xc372161dUL, 0x250cbce2UL, 0x498b283cUL, 0x9541ff0dUL, + 0x017139a8UL, 0xb3de080cUL, 0xe49cd8b4UL, 0xc1906456UL, + 0x84617bcbUL, 0xb670d532UL, 0x5c74486cUL, 0x5742d0b8UL, }; static const unsigned long Td3[256] = { - 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, - 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, - 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U, - 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U, - 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, - 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, - 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, - 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU, - 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U, - 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, - 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, - 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, - 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U, - 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U, - 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, - 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, - 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, - 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U, - 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U, - 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, - 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, - 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, - 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U, - 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U, - 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, - 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, - 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U, - 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U, - 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU, - 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, - 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, - 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, - 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U, - 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU, - 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, - 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, - 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, - 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U, - 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U, - 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, - 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, - 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, - 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U, - 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U, - 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, - 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, - 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, - 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU, - 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U, - 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, - 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, - 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, - 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U, - 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U, - 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, - 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, - 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, - 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU, - 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U, - 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, - 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, - 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, - 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U, - 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U, + 0xf4a75051UL, 0x4165537eUL, 0x17a4c31aUL, 0x275e963aUL, + 0xab6bcb3bUL, 0x9d45f11fUL, 0xfa58abacUL, 0xe303934bUL, + 0x30fa5520UL, 0x766df6adUL, 0xcc769188UL, 0x024c25f5UL, + 0xe5d7fc4fUL, 0x2acbd7c5UL, 0x35448026UL, 0x62a38fb5UL, + 0xb15a49deUL, 0xba1b6725UL, 0xea0e9845UL, 0xfec0e15dUL, + 0x2f7502c3UL, 0x4cf01281UL, 0x4697a38dUL, 0xd3f9c66bUL, + 0x8f5fe703UL, 0x929c9515UL, 0x6d7aebbfUL, 0x5259da95UL, + 0xbe832dd4UL, 0x7421d358UL, 0xe0692949UL, 0xc9c8448eUL, + 0xc2896a75UL, 0x8e7978f4UL, 0x583e6b99UL, 0xb971dd27UL, + 0xe14fb6beUL, 0x88ad17f0UL, 0x20ac66c9UL, 0xce3ab47dUL, + 0xdf4a1863UL, 0x1a3182e5UL, 0x51336097UL, 0x537f4562UL, + 0x6477e0b1UL, 0x6bae84bbUL, 0x81a01cfeUL, 0x082b94f9UL, + 0x48685870UL, 0x45fd198fUL, 0xde6c8794UL, 0x7bf8b752UL, + 0x73d323abUL, 0x4b02e272UL, 0x1f8f57e3UL, 0x55ab2a66UL, + 0xeb2807b2UL, 0xb5c2032fUL, 0xc57b9a86UL, 0x3708a5d3UL, + 0x2887f230UL, 0xbfa5b223UL, 0x036aba02UL, 0x16825cedUL, + 0xcf1c2b8aUL, 0x79b492a7UL, 0x07f2f0f3UL, 0x69e2a14eUL, + 0xdaf4cd65UL, 0x05bed506UL, 0x34621fd1UL, 0xa6fe8ac4UL, + 0x2e539d34UL, 0xf355a0a2UL, 0x8ae13205UL, 0xf6eb75a4UL, + 0x83ec390bUL, 0x60efaa40UL, 0x719f065eUL, 0x6e1051bdUL, + 0x218af93eUL, 0xdd063d96UL, 0x3e05aeddUL, 0xe6bd464dUL, + 0x548db591UL, 0xc45d0571UL, 0x06d46f04UL, 0x5015ff60UL, + 0x98fb2419UL, 0xbde997d6UL, 0x4043cc89UL, 0xd99e7767UL, + 0xe842bdb0UL, 0x898b8807UL, 0x195b38e7UL, 0xc8eedb79UL, + 0x7c0a47a1UL, 0x420fe97cUL, 0x841ec9f8UL, 0x00000000UL, + 0x80868309UL, 0x2bed4832UL, 0x1170ac1eUL, 0x5a724e6cUL, + 0x0efffbfdUL, 0x8538560fUL, 0xaed51e3dUL, 0x2d392736UL, + 0x0fd9640aUL, 0x5ca62168UL, 0x5b54d19bUL, 0x362e3a24UL, + 0x0a67b10cUL, 0x57e70f93UL, 0xee96d2b4UL, 0x9b919e1bUL, + 0xc0c54f80UL, 0xdc20a261UL, 0x774b695aUL, 0x121a161cUL, + 0x93ba0ae2UL, 0xa02ae5c0UL, 0x22e0433cUL, 0x1b171d12UL, + 0x090d0b0eUL, 0x8bc7adf2UL, 0xb6a8b92dUL, 0x1ea9c814UL, + 0xf1198557UL, 0x75074cafUL, 0x99ddbbeeUL, 0x7f60fda3UL, + 0x01269ff7UL, 0x72f5bc5cUL, 0x663bc544UL, 0xfb7e345bUL, + 0x4329768bUL, 0x23c6dccbUL, 0xedfc68b6UL, 0xe4f163b8UL, + 0x31dccad7UL, 0x63851042UL, 0x97224013UL, 0xc6112084UL, + 0x4a247d85UL, 0xbb3df8d2UL, 0xf93211aeUL, 0x29a16dc7UL, + 0x9e2f4b1dUL, 0xb230f3dcUL, 0x8652ec0dUL, 0xc1e3d077UL, + 0xb3166c2bUL, 0x70b999a9UL, 0x9448fa11UL, 0xe9642247UL, + 0xfc8cc4a8UL, 0xf03f1aa0UL, 0x7d2cd856UL, 0x3390ef22UL, + 0x494ec787UL, 0x38d1c1d9UL, 0xcaa2fe8cUL, 0xd40b3698UL, + 0xf581cfa6UL, 0x7ade28a5UL, 0xb78e26daUL, 0xadbfa43fUL, + 0x3a9de42cUL, 0x78920d50UL, 0x5fcc9b6aUL, 0x7e466254UL, + 0x8d13c2f6UL, 0xd8b8e890UL, 0x39f75e2eUL, 0xc3aff582UL, + 0x5d80be9fUL, 0xd0937c69UL, 0xd52da96fUL, 0x2512b3cfUL, + 0xac993bc8UL, 0x187da710UL, 0x9c636ee8UL, 0x3bbb7bdbUL, + 0x267809cdUL, 0x5918f46eUL, 0x9ab701ecUL, 0x4f9aa883UL, + 0x956e65e6UL, 0xffe67eaaUL, 0xbccf0821UL, 0x15e8e6efUL, + 0xe79bd9baUL, 0x6f36ce4aUL, 0x9f09d4eaUL, 0xb07cd629UL, + 0xa4b2af31UL, 0x3f23312aUL, 0xa59430c6UL, 0xa266c035UL, + 0x4ebc3774UL, 0x82caa6fcUL, 0x90d0b0e0UL, 0xa7d81533UL, + 0x04984af1UL, 0xecdaf741UL, 0xcd500e7fUL, 0x91f62f17UL, + 0x4dd68d76UL, 0xefb04d43UL, 0xaa4d54ccUL, 0x9604dfe4UL, + 0xd1b5e39eUL, 0x6a881b4cUL, 0x2c1fb8c1UL, 0x65517f46UL, + 0x5eea049dUL, 0x8c355d01UL, 0x877473faUL, 0x0b412efbUL, + 0x671d5ab3UL, 0xdbd25292UL, 0x105633e9UL, 0xd647136dUL, + 0xd7618c9aUL, 0xa10c7a37UL, 0xf8148e59UL, 0x133c89ebUL, + 0xa927eeceUL, 0x61c935b7UL, 0x1ce5ede1UL, 0x47b13c7aUL, + 0xd2df599cUL, 0xf2733f55UL, 0x14ce7918UL, 0xc737bf73UL, + 0xf7cdea53UL, 0xfdaa5b5fUL, 0x3d6f14dfUL, 0x44db8678UL, + 0xaff381caUL, 0x68c43eb9UL, 0x24342c38UL, 0xa3405fc2UL, + 0x1dc37216UL, 0xe2250cbcUL, 0x3c498b28UL, 0x0d9541ffUL, + 0xa8017139UL, 0x0cb3de08UL, 0xb4e49cd8UL, 0x56c19064UL, + 0xcb84617bUL, 0x32b670d5UL, 0x6c5c7448UL, 0xb85742d0UL, }; static const unsigned long Td4[256] = { - 0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U, - 0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U, - 0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU, - 0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU, - 0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U, - 0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U, - 0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U, - 0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU, - 0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U, - 0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU, - 0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU, - 0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU, - 0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U, - 0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U, - 0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U, - 0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U, - 0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U, - 0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U, - 0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU, - 0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U, - 0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U, - 0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU, - 0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U, - 0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U, - 0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U, - 0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU, - 0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U, - 0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U, - 0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU, - 0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U, - 0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U, - 0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU, - 0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U, - 0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU, - 0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU, - 0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U, - 0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U, - 0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U, - 0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U, - 0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU, - 0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U, - 0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U, - 0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU, - 0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU, - 0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU, - 0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U, - 0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU, - 0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U, - 0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U, - 0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U, - 0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U, - 0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU, - 0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U, - 0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU, - 0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU, - 0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU, - 0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU, - 0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U, - 0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU, - 0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U, - 0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU, - 0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U, - 0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U, - 0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU, + 0x52525252UL, 0x09090909UL, 0x6a6a6a6aUL, 0xd5d5d5d5UL, + 0x30303030UL, 0x36363636UL, 0xa5a5a5a5UL, 0x38383838UL, + 0xbfbfbfbfUL, 0x40404040UL, 0xa3a3a3a3UL, 0x9e9e9e9eUL, + 0x81818181UL, 0xf3f3f3f3UL, 0xd7d7d7d7UL, 0xfbfbfbfbUL, + 0x7c7c7c7cUL, 0xe3e3e3e3UL, 0x39393939UL, 0x82828282UL, + 0x9b9b9b9bUL, 0x2f2f2f2fUL, 0xffffffffUL, 0x87878787UL, + 0x34343434UL, 0x8e8e8e8eUL, 0x43434343UL, 0x44444444UL, + 0xc4c4c4c4UL, 0xdedededeUL, 0xe9e9e9e9UL, 0xcbcbcbcbUL, + 0x54545454UL, 0x7b7b7b7bUL, 0x94949494UL, 0x32323232UL, + 0xa6a6a6a6UL, 0xc2c2c2c2UL, 0x23232323UL, 0x3d3d3d3dUL, + 0xeeeeeeeeUL, 0x4c4c4c4cUL, 0x95959595UL, 0x0b0b0b0bUL, + 0x42424242UL, 0xfafafafaUL, 0xc3c3c3c3UL, 0x4e4e4e4eUL, + 0x08080808UL, 0x2e2e2e2eUL, 0xa1a1a1a1UL, 0x66666666UL, + 0x28282828UL, 0xd9d9d9d9UL, 0x24242424UL, 0xb2b2b2b2UL, + 0x76767676UL, 0x5b5b5b5bUL, 0xa2a2a2a2UL, 0x49494949UL, + 0x6d6d6d6dUL, 0x8b8b8b8bUL, 0xd1d1d1d1UL, 0x25252525UL, + 0x72727272UL, 0xf8f8f8f8UL, 0xf6f6f6f6UL, 0x64646464UL, + 0x86868686UL, 0x68686868UL, 0x98989898UL, 0x16161616UL, + 0xd4d4d4d4UL, 0xa4a4a4a4UL, 0x5c5c5c5cUL, 0xccccccccUL, + 0x5d5d5d5dUL, 0x65656565UL, 0xb6b6b6b6UL, 0x92929292UL, + 0x6c6c6c6cUL, 0x70707070UL, 0x48484848UL, 0x50505050UL, + 0xfdfdfdfdUL, 0xededededUL, 0xb9b9b9b9UL, 0xdadadadaUL, + 0x5e5e5e5eUL, 0x15151515UL, 0x46464646UL, 0x57575757UL, + 0xa7a7a7a7UL, 0x8d8d8d8dUL, 0x9d9d9d9dUL, 0x84848484UL, + 0x90909090UL, 0xd8d8d8d8UL, 0xababababUL, 0x00000000UL, + 0x8c8c8c8cUL, 0xbcbcbcbcUL, 0xd3d3d3d3UL, 0x0a0a0a0aUL, + 0xf7f7f7f7UL, 0xe4e4e4e4UL, 0x58585858UL, 0x05050505UL, + 0xb8b8b8b8UL, 0xb3b3b3b3UL, 0x45454545UL, 0x06060606UL, + 0xd0d0d0d0UL, 0x2c2c2c2cUL, 0x1e1e1e1eUL, 0x8f8f8f8fUL, + 0xcacacacaUL, 0x3f3f3f3fUL, 0x0f0f0f0fUL, 0x02020202UL, + 0xc1c1c1c1UL, 0xafafafafUL, 0xbdbdbdbdUL, 0x03030303UL, + 0x01010101UL, 0x13131313UL, 0x8a8a8a8aUL, 0x6b6b6b6bUL, + 0x3a3a3a3aUL, 0x91919191UL, 0x11111111UL, 0x41414141UL, + 0x4f4f4f4fUL, 0x67676767UL, 0xdcdcdcdcUL, 0xeaeaeaeaUL, + 0x97979797UL, 0xf2f2f2f2UL, 0xcfcfcfcfUL, 0xcecececeUL, + 0xf0f0f0f0UL, 0xb4b4b4b4UL, 0xe6e6e6e6UL, 0x73737373UL, + 0x96969696UL, 0xacacacacUL, 0x74747474UL, 0x22222222UL, + 0xe7e7e7e7UL, 0xadadadadUL, 0x35353535UL, 0x85858585UL, + 0xe2e2e2e2UL, 0xf9f9f9f9UL, 0x37373737UL, 0xe8e8e8e8UL, + 0x1c1c1c1cUL, 0x75757575UL, 0xdfdfdfdfUL, 0x6e6e6e6eUL, + 0x47474747UL, 0xf1f1f1f1UL, 0x1a1a1a1aUL, 0x71717171UL, + 0x1d1d1d1dUL, 0x29292929UL, 0xc5c5c5c5UL, 0x89898989UL, + 0x6f6f6f6fUL, 0xb7b7b7b7UL, 0x62626262UL, 0x0e0e0e0eUL, + 0xaaaaaaaaUL, 0x18181818UL, 0xbebebebeUL, 0x1b1b1b1bUL, + 0xfcfcfcfcUL, 0x56565656UL, 0x3e3e3e3eUL, 0x4b4b4b4bUL, + 0xc6c6c6c6UL, 0xd2d2d2d2UL, 0x79797979UL, 0x20202020UL, + 0x9a9a9a9aUL, 0xdbdbdbdbUL, 0xc0c0c0c0UL, 0xfefefefeUL, + 0x78787878UL, 0xcdcdcdcdUL, 0x5a5a5a5aUL, 0xf4f4f4f4UL, + 0x1f1f1f1fUL, 0xddddddddUL, 0xa8a8a8a8UL, 0x33333333UL, + 0x88888888UL, 0x07070707UL, 0xc7c7c7c7UL, 0x31313131UL, + 0xb1b1b1b1UL, 0x12121212UL, 0x10101010UL, 0x59595959UL, + 0x27272727UL, 0x80808080UL, 0xececececUL, 0x5f5f5f5fUL, + 0x60606060UL, 0x51515151UL, 0x7f7f7f7fUL, 0xa9a9a9a9UL, + 0x19191919UL, 0xb5b5b5b5UL, 0x4a4a4a4aUL, 0x0d0d0d0dUL, + 0x2d2d2d2dUL, 0xe5e5e5e5UL, 0x7a7a7a7aUL, 0x9f9f9f9fUL, + 0x93939393UL, 0xc9c9c9c9UL, 0x9c9c9c9cUL, 0xefefefefUL, + 0xa0a0a0a0UL, 0xe0e0e0e0UL, 0x3b3b3b3bUL, 0x4d4d4d4dUL, + 0xaeaeaeaeUL, 0x2a2a2a2aUL, 0xf5f5f5f5UL, 0xb0b0b0b0UL, + 0xc8c8c8c8UL, 0xebebebebUL, 0xbbbbbbbbUL, 0x3c3c3c3cUL, + 0x83838383UL, 0x53535353UL, 0x99999999UL, 0x61616161UL, + 0x17171717UL, 0x2b2b2b2bUL, 0x04040404UL, 0x7e7e7e7eUL, + 0xbabababaUL, 0x77777777UL, 0xd6d6d6d6UL, 0x26262626UL, + 0xe1e1e1e1UL, 0x69696969UL, 0x14141414UL, 0x63636363UL, + 0x55555555UL, 0x21212121UL, 0x0c0c0c0cUL, 0x7d7d7d7dUL, }; static const unsigned long rcon[] = { - 0x01000000, 0x02000000, 0x04000000, 0x08000000, - 0x10000000, 0x20000000, 0x40000000, 0x80000000, - 0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ + 0x01000000UL, 0x02000000UL, 0x04000000UL, 0x08000000UL, + 0x10000000UL, 0x20000000UL, 0x40000000UL, 0x80000000UL, + 0x1B000000UL, 0x36000000UL, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ }; + +#ifndef SMALL_CODE +static const unsigned long Tks0[] = { +0x00000000UL, 0x0e090d0bUL, 0x1c121a16UL, 0x121b171dUL, 0x3824342cUL, 0x362d3927UL, 0x24362e3aUL, 0x2a3f2331UL, +0x70486858UL, 0x7e416553UL, 0x6c5a724eUL, 0x62537f45UL, 0x486c5c74UL, 0x4665517fUL, 0x547e4662UL, 0x5a774b69UL, +0xe090d0b0UL, 0xee99ddbbUL, 0xfc82caa6UL, 0xf28bc7adUL, 0xd8b4e49cUL, 0xd6bde997UL, 0xc4a6fe8aUL, 0xcaaff381UL, +0x90d8b8e8UL, 0x9ed1b5e3UL, 0x8ccaa2feUL, 0x82c3aff5UL, 0xa8fc8cc4UL, 0xa6f581cfUL, 0xb4ee96d2UL, 0xbae79bd9UL, +0xdb3bbb7bUL, 0xd532b670UL, 0xc729a16dUL, 0xc920ac66UL, 0xe31f8f57UL, 0xed16825cUL, 0xff0d9541UL, 0xf104984aUL, +0xab73d323UL, 0xa57ade28UL, 0xb761c935UL, 0xb968c43eUL, 0x9357e70fUL, 0x9d5eea04UL, 0x8f45fd19UL, 0x814cf012UL, +0x3bab6bcbUL, 0x35a266c0UL, 0x27b971ddUL, 0x29b07cd6UL, 0x038f5fe7UL, 0x0d8652ecUL, 0x1f9d45f1UL, 0x119448faUL, +0x4be30393UL, 0x45ea0e98UL, 0x57f11985UL, 0x59f8148eUL, 0x73c737bfUL, 0x7dce3ab4UL, 0x6fd52da9UL, 0x61dc20a2UL, +0xad766df6UL, 0xa37f60fdUL, 0xb16477e0UL, 0xbf6d7aebUL, 0x955259daUL, 0x9b5b54d1UL, 0x894043ccUL, 0x87494ec7UL, +0xdd3e05aeUL, 0xd33708a5UL, 0xc12c1fb8UL, 0xcf2512b3UL, 0xe51a3182UL, 0xeb133c89UL, 0xf9082b94UL, 0xf701269fUL, +0x4de6bd46UL, 0x43efb04dUL, 0x51f4a750UL, 0x5ffdaa5bUL, 0x75c2896aUL, 0x7bcb8461UL, 0x69d0937cUL, 0x67d99e77UL, +0x3daed51eUL, 0x33a7d815UL, 0x21bccf08UL, 0x2fb5c203UL, 0x058ae132UL, 0x0b83ec39UL, 0x1998fb24UL, 0x1791f62fUL, +0x764dd68dUL, 0x7844db86UL, 0x6a5fcc9bUL, 0x6456c190UL, 0x4e69e2a1UL, 0x4060efaaUL, 0x527bf8b7UL, 0x5c72f5bcUL, +0x0605bed5UL, 0x080cb3deUL, 0x1a17a4c3UL, 0x141ea9c8UL, 0x3e218af9UL, 0x302887f2UL, 0x223390efUL, 0x2c3a9de4UL, +0x96dd063dUL, 0x98d40b36UL, 0x8acf1c2bUL, 0x84c61120UL, 0xaef93211UL, 0xa0f03f1aUL, 0xb2eb2807UL, 0xbce2250cUL, +0xe6956e65UL, 0xe89c636eUL, 0xfa877473UL, 0xf48e7978UL, 0xdeb15a49UL, 0xd0b85742UL, 0xc2a3405fUL, 0xccaa4d54UL, +0x41ecdaf7UL, 0x4fe5d7fcUL, 0x5dfec0e1UL, 0x53f7cdeaUL, 0x79c8eedbUL, 0x77c1e3d0UL, 0x65daf4cdUL, 0x6bd3f9c6UL, +0x31a4b2afUL, 0x3fadbfa4UL, 0x2db6a8b9UL, 0x23bfa5b2UL, 0x09808683UL, 0x07898b88UL, 0x15929c95UL, 0x1b9b919eUL, +0xa17c0a47UL, 0xaf75074cUL, 0xbd6e1051UL, 0xb3671d5aUL, 0x99583e6bUL, 0x97513360UL, 0x854a247dUL, 0x8b432976UL, +0xd134621fUL, 0xdf3d6f14UL, 0xcd267809UL, 0xc32f7502UL, 0xe9105633UL, 0xe7195b38UL, 0xf5024c25UL, 0xfb0b412eUL, +0x9ad7618cUL, 0x94de6c87UL, 0x86c57b9aUL, 0x88cc7691UL, 0xa2f355a0UL, 0xacfa58abUL, 0xbee14fb6UL, 0xb0e842bdUL, +0xea9f09d4UL, 0xe49604dfUL, 0xf68d13c2UL, 0xf8841ec9UL, 0xd2bb3df8UL, 0xdcb230f3UL, 0xcea927eeUL, 0xc0a02ae5UL, +0x7a47b13cUL, 0x744ebc37UL, 0x6655ab2aUL, 0x685ca621UL, 0x42638510UL, 0x4c6a881bUL, 0x5e719f06UL, 0x5078920dUL, +0x0a0fd964UL, 0x0406d46fUL, 0x161dc372UL, 0x1814ce79UL, 0x322bed48UL, 0x3c22e043UL, 0x2e39f75eUL, 0x2030fa55UL, +0xec9ab701UL, 0xe293ba0aUL, 0xf088ad17UL, 0xfe81a01cUL, 0xd4be832dUL, 0xdab78e26UL, 0xc8ac993bUL, 0xc6a59430UL, +0x9cd2df59UL, 0x92dbd252UL, 0x80c0c54fUL, 0x8ec9c844UL, 0xa4f6eb75UL, 0xaaffe67eUL, 0xb8e4f163UL, 0xb6edfc68UL, +0x0c0a67b1UL, 0x02036abaUL, 0x10187da7UL, 0x1e1170acUL, 0x342e539dUL, 0x3a275e96UL, 0x283c498bUL, 0x26354480UL, +0x7c420fe9UL, 0x724b02e2UL, 0x605015ffUL, 0x6e5918f4UL, 0x44663bc5UL, 0x4a6f36ceUL, 0x587421d3UL, 0x567d2cd8UL, +0x37a10c7aUL, 0x39a80171UL, 0x2bb3166cUL, 0x25ba1b67UL, 0x0f853856UL, 0x018c355dUL, 0x13972240UL, 0x1d9e2f4bUL, +0x47e96422UL, 0x49e06929UL, 0x5bfb7e34UL, 0x55f2733fUL, 0x7fcd500eUL, 0x71c45d05UL, 0x63df4a18UL, 0x6dd64713UL, +0xd731dccaUL, 0xd938d1c1UL, 0xcb23c6dcUL, 0xc52acbd7UL, 0xef15e8e6UL, 0xe11ce5edUL, 0xf307f2f0UL, 0xfd0efffbUL, +0xa779b492UL, 0xa970b999UL, 0xbb6bae84UL, 0xb562a38fUL, 0x9f5d80beUL, 0x91548db5UL, 0x834f9aa8UL, 0x8d4697a3UL +}; + +static const unsigned long Tks1[] = { +0x00000000UL, 0x0b0e090dUL, 0x161c121aUL, 0x1d121b17UL, 0x2c382434UL, 0x27362d39UL, 0x3a24362eUL, 0x312a3f23UL, +0x58704868UL, 0x537e4165UL, 0x4e6c5a72UL, 0x4562537fUL, 0x74486c5cUL, 0x7f466551UL, 0x62547e46UL, 0x695a774bUL, +0xb0e090d0UL, 0xbbee99ddUL, 0xa6fc82caUL, 0xadf28bc7UL, 0x9cd8b4e4UL, 0x97d6bde9UL, 0x8ac4a6feUL, 0x81caaff3UL, +0xe890d8b8UL, 0xe39ed1b5UL, 0xfe8ccaa2UL, 0xf582c3afUL, 0xc4a8fc8cUL, 0xcfa6f581UL, 0xd2b4ee96UL, 0xd9bae79bUL, +0x7bdb3bbbUL, 0x70d532b6UL, 0x6dc729a1UL, 0x66c920acUL, 0x57e31f8fUL, 0x5ced1682UL, 0x41ff0d95UL, 0x4af10498UL, +0x23ab73d3UL, 0x28a57adeUL, 0x35b761c9UL, 0x3eb968c4UL, 0x0f9357e7UL, 0x049d5eeaUL, 0x198f45fdUL, 0x12814cf0UL, +0xcb3bab6bUL, 0xc035a266UL, 0xdd27b971UL, 0xd629b07cUL, 0xe7038f5fUL, 0xec0d8652UL, 0xf11f9d45UL, 0xfa119448UL, +0x934be303UL, 0x9845ea0eUL, 0x8557f119UL, 0x8e59f814UL, 0xbf73c737UL, 0xb47dce3aUL, 0xa96fd52dUL, 0xa261dc20UL, +0xf6ad766dUL, 0xfda37f60UL, 0xe0b16477UL, 0xebbf6d7aUL, 0xda955259UL, 0xd19b5b54UL, 0xcc894043UL, 0xc787494eUL, +0xaedd3e05UL, 0xa5d33708UL, 0xb8c12c1fUL, 0xb3cf2512UL, 0x82e51a31UL, 0x89eb133cUL, 0x94f9082bUL, 0x9ff70126UL, +0x464de6bdUL, 0x4d43efb0UL, 0x5051f4a7UL, 0x5b5ffdaaUL, 0x6a75c289UL, 0x617bcb84UL, 0x7c69d093UL, 0x7767d99eUL, +0x1e3daed5UL, 0x1533a7d8UL, 0x0821bccfUL, 0x032fb5c2UL, 0x32058ae1UL, 0x390b83ecUL, 0x241998fbUL, 0x2f1791f6UL, +0x8d764dd6UL, 0x867844dbUL, 0x9b6a5fccUL, 0x906456c1UL, 0xa14e69e2UL, 0xaa4060efUL, 0xb7527bf8UL, 0xbc5c72f5UL, +0xd50605beUL, 0xde080cb3UL, 0xc31a17a4UL, 0xc8141ea9UL, 0xf93e218aUL, 0xf2302887UL, 0xef223390UL, 0xe42c3a9dUL, +0x3d96dd06UL, 0x3698d40bUL, 0x2b8acf1cUL, 0x2084c611UL, 0x11aef932UL, 0x1aa0f03fUL, 0x07b2eb28UL, 0x0cbce225UL, +0x65e6956eUL, 0x6ee89c63UL, 0x73fa8774UL, 0x78f48e79UL, 0x49deb15aUL, 0x42d0b857UL, 0x5fc2a340UL, 0x54ccaa4dUL, +0xf741ecdaUL, 0xfc4fe5d7UL, 0xe15dfec0UL, 0xea53f7cdUL, 0xdb79c8eeUL, 0xd077c1e3UL, 0xcd65daf4UL, 0xc66bd3f9UL, +0xaf31a4b2UL, 0xa43fadbfUL, 0xb92db6a8UL, 0xb223bfa5UL, 0x83098086UL, 0x8807898bUL, 0x9515929cUL, 0x9e1b9b91UL, +0x47a17c0aUL, 0x4caf7507UL, 0x51bd6e10UL, 0x5ab3671dUL, 0x6b99583eUL, 0x60975133UL, 0x7d854a24UL, 0x768b4329UL, +0x1fd13462UL, 0x14df3d6fUL, 0x09cd2678UL, 0x02c32f75UL, 0x33e91056UL, 0x38e7195bUL, 0x25f5024cUL, 0x2efb0b41UL, +0x8c9ad761UL, 0x8794de6cUL, 0x9a86c57bUL, 0x9188cc76UL, 0xa0a2f355UL, 0xabacfa58UL, 0xb6bee14fUL, 0xbdb0e842UL, +0xd4ea9f09UL, 0xdfe49604UL, 0xc2f68d13UL, 0xc9f8841eUL, 0xf8d2bb3dUL, 0xf3dcb230UL, 0xeecea927UL, 0xe5c0a02aUL, +0x3c7a47b1UL, 0x37744ebcUL, 0x2a6655abUL, 0x21685ca6UL, 0x10426385UL, 0x1b4c6a88UL, 0x065e719fUL, 0x0d507892UL, +0x640a0fd9UL, 0x6f0406d4UL, 0x72161dc3UL, 0x791814ceUL, 0x48322bedUL, 0x433c22e0UL, 0x5e2e39f7UL, 0x552030faUL, +0x01ec9ab7UL, 0x0ae293baUL, 0x17f088adUL, 0x1cfe81a0UL, 0x2dd4be83UL, 0x26dab78eUL, 0x3bc8ac99UL, 0x30c6a594UL, +0x599cd2dfUL, 0x5292dbd2UL, 0x4f80c0c5UL, 0x448ec9c8UL, 0x75a4f6ebUL, 0x7eaaffe6UL, 0x63b8e4f1UL, 0x68b6edfcUL, +0xb10c0a67UL, 0xba02036aUL, 0xa710187dUL, 0xac1e1170UL, 0x9d342e53UL, 0x963a275eUL, 0x8b283c49UL, 0x80263544UL, +0xe97c420fUL, 0xe2724b02UL, 0xff605015UL, 0xf46e5918UL, 0xc544663bUL, 0xce4a6f36UL, 0xd3587421UL, 0xd8567d2cUL, +0x7a37a10cUL, 0x7139a801UL, 0x6c2bb316UL, 0x6725ba1bUL, 0x560f8538UL, 0x5d018c35UL, 0x40139722UL, 0x4b1d9e2fUL, +0x2247e964UL, 0x2949e069UL, 0x345bfb7eUL, 0x3f55f273UL, 0x0e7fcd50UL, 0x0571c45dUL, 0x1863df4aUL, 0x136dd647UL, +0xcad731dcUL, 0xc1d938d1UL, 0xdccb23c6UL, 0xd7c52acbUL, 0xe6ef15e8UL, 0xede11ce5UL, 0xf0f307f2UL, 0xfbfd0effUL, +0x92a779b4UL, 0x99a970b9UL, 0x84bb6baeUL, 0x8fb562a3UL, 0xbe9f5d80UL, 0xb591548dUL, 0xa8834f9aUL, 0xa38d4697UL +}; + +static const unsigned long Tks2[] = { +0x00000000UL, 0x0d0b0e09UL, 0x1a161c12UL, 0x171d121bUL, 0x342c3824UL, 0x3927362dUL, 0x2e3a2436UL, 0x23312a3fUL, +0x68587048UL, 0x65537e41UL, 0x724e6c5aUL, 0x7f456253UL, 0x5c74486cUL, 0x517f4665UL, 0x4662547eUL, 0x4b695a77UL, +0xd0b0e090UL, 0xddbbee99UL, 0xcaa6fc82UL, 0xc7adf28bUL, 0xe49cd8b4UL, 0xe997d6bdUL, 0xfe8ac4a6UL, 0xf381caafUL, +0xb8e890d8UL, 0xb5e39ed1UL, 0xa2fe8ccaUL, 0xaff582c3UL, 0x8cc4a8fcUL, 0x81cfa6f5UL, 0x96d2b4eeUL, 0x9bd9bae7UL, +0xbb7bdb3bUL, 0xb670d532UL, 0xa16dc729UL, 0xac66c920UL, 0x8f57e31fUL, 0x825ced16UL, 0x9541ff0dUL, 0x984af104UL, +0xd323ab73UL, 0xde28a57aUL, 0xc935b761UL, 0xc43eb968UL, 0xe70f9357UL, 0xea049d5eUL, 0xfd198f45UL, 0xf012814cUL, +0x6bcb3babUL, 0x66c035a2UL, 0x71dd27b9UL, 0x7cd629b0UL, 0x5fe7038fUL, 0x52ec0d86UL, 0x45f11f9dUL, 0x48fa1194UL, +0x03934be3UL, 0x0e9845eaUL, 0x198557f1UL, 0x148e59f8UL, 0x37bf73c7UL, 0x3ab47dceUL, 0x2da96fd5UL, 0x20a261dcUL, +0x6df6ad76UL, 0x60fda37fUL, 0x77e0b164UL, 0x7aebbf6dUL, 0x59da9552UL, 0x54d19b5bUL, 0x43cc8940UL, 0x4ec78749UL, +0x05aedd3eUL, 0x08a5d337UL, 0x1fb8c12cUL, 0x12b3cf25UL, 0x3182e51aUL, 0x3c89eb13UL, 0x2b94f908UL, 0x269ff701UL, +0xbd464de6UL, 0xb04d43efUL, 0xa75051f4UL, 0xaa5b5ffdUL, 0x896a75c2UL, 0x84617bcbUL, 0x937c69d0UL, 0x9e7767d9UL, +0xd51e3daeUL, 0xd81533a7UL, 0xcf0821bcUL, 0xc2032fb5UL, 0xe132058aUL, 0xec390b83UL, 0xfb241998UL, 0xf62f1791UL, +0xd68d764dUL, 0xdb867844UL, 0xcc9b6a5fUL, 0xc1906456UL, 0xe2a14e69UL, 0xefaa4060UL, 0xf8b7527bUL, 0xf5bc5c72UL, +0xbed50605UL, 0xb3de080cUL, 0xa4c31a17UL, 0xa9c8141eUL, 0x8af93e21UL, 0x87f23028UL, 0x90ef2233UL, 0x9de42c3aUL, +0x063d96ddUL, 0x0b3698d4UL, 0x1c2b8acfUL, 0x112084c6UL, 0x3211aef9UL, 0x3f1aa0f0UL, 0x2807b2ebUL, 0x250cbce2UL, +0x6e65e695UL, 0x636ee89cUL, 0x7473fa87UL, 0x7978f48eUL, 0x5a49deb1UL, 0x5742d0b8UL, 0x405fc2a3UL, 0x4d54ccaaUL, +0xdaf741ecUL, 0xd7fc4fe5UL, 0xc0e15dfeUL, 0xcdea53f7UL, 0xeedb79c8UL, 0xe3d077c1UL, 0xf4cd65daUL, 0xf9c66bd3UL, +0xb2af31a4UL, 0xbfa43fadUL, 0xa8b92db6UL, 0xa5b223bfUL, 0x86830980UL, 0x8b880789UL, 0x9c951592UL, 0x919e1b9bUL, +0x0a47a17cUL, 0x074caf75UL, 0x1051bd6eUL, 0x1d5ab367UL, 0x3e6b9958UL, 0x33609751UL, 0x247d854aUL, 0x29768b43UL, +0x621fd134UL, 0x6f14df3dUL, 0x7809cd26UL, 0x7502c32fUL, 0x5633e910UL, 0x5b38e719UL, 0x4c25f502UL, 0x412efb0bUL, +0x618c9ad7UL, 0x6c8794deUL, 0x7b9a86c5UL, 0x769188ccUL, 0x55a0a2f3UL, 0x58abacfaUL, 0x4fb6bee1UL, 0x42bdb0e8UL, +0x09d4ea9fUL, 0x04dfe496UL, 0x13c2f68dUL, 0x1ec9f884UL, 0x3df8d2bbUL, 0x30f3dcb2UL, 0x27eecea9UL, 0x2ae5c0a0UL, +0xb13c7a47UL, 0xbc37744eUL, 0xab2a6655UL, 0xa621685cUL, 0x85104263UL, 0x881b4c6aUL, 0x9f065e71UL, 0x920d5078UL, +0xd9640a0fUL, 0xd46f0406UL, 0xc372161dUL, 0xce791814UL, 0xed48322bUL, 0xe0433c22UL, 0xf75e2e39UL, 0xfa552030UL, +0xb701ec9aUL, 0xba0ae293UL, 0xad17f088UL, 0xa01cfe81UL, 0x832dd4beUL, 0x8e26dab7UL, 0x993bc8acUL, 0x9430c6a5UL, +0xdf599cd2UL, 0xd25292dbUL, 0xc54f80c0UL, 0xc8448ec9UL, 0xeb75a4f6UL, 0xe67eaaffUL, 0xf163b8e4UL, 0xfc68b6edUL, +0x67b10c0aUL, 0x6aba0203UL, 0x7da71018UL, 0x70ac1e11UL, 0x539d342eUL, 0x5e963a27UL, 0x498b283cUL, 0x44802635UL, +0x0fe97c42UL, 0x02e2724bUL, 0x15ff6050UL, 0x18f46e59UL, 0x3bc54466UL, 0x36ce4a6fUL, 0x21d35874UL, 0x2cd8567dUL, +0x0c7a37a1UL, 0x017139a8UL, 0x166c2bb3UL, 0x1b6725baUL, 0x38560f85UL, 0x355d018cUL, 0x22401397UL, 0x2f4b1d9eUL, +0x642247e9UL, 0x692949e0UL, 0x7e345bfbUL, 0x733f55f2UL, 0x500e7fcdUL, 0x5d0571c4UL, 0x4a1863dfUL, 0x47136dd6UL, +0xdccad731UL, 0xd1c1d938UL, 0xc6dccb23UL, 0xcbd7c52aUL, 0xe8e6ef15UL, 0xe5ede11cUL, 0xf2f0f307UL, 0xfffbfd0eUL, +0xb492a779UL, 0xb999a970UL, 0xae84bb6bUL, 0xa38fb562UL, 0x80be9f5dUL, 0x8db59154UL, 0x9aa8834fUL, 0x97a38d46UL +}; + +static const unsigned long Tks3[] = { +0x00000000UL, 0x090d0b0eUL, 0x121a161cUL, 0x1b171d12UL, 0x24342c38UL, 0x2d392736UL, 0x362e3a24UL, 0x3f23312aUL, +0x48685870UL, 0x4165537eUL, 0x5a724e6cUL, 0x537f4562UL, 0x6c5c7448UL, 0x65517f46UL, 0x7e466254UL, 0x774b695aUL, +0x90d0b0e0UL, 0x99ddbbeeUL, 0x82caa6fcUL, 0x8bc7adf2UL, 0xb4e49cd8UL, 0xbde997d6UL, 0xa6fe8ac4UL, 0xaff381caUL, +0xd8b8e890UL, 0xd1b5e39eUL, 0xcaa2fe8cUL, 0xc3aff582UL, 0xfc8cc4a8UL, 0xf581cfa6UL, 0xee96d2b4UL, 0xe79bd9baUL, +0x3bbb7bdbUL, 0x32b670d5UL, 0x29a16dc7UL, 0x20ac66c9UL, 0x1f8f57e3UL, 0x16825cedUL, 0x0d9541ffUL, 0x04984af1UL, +0x73d323abUL, 0x7ade28a5UL, 0x61c935b7UL, 0x68c43eb9UL, 0x57e70f93UL, 0x5eea049dUL, 0x45fd198fUL, 0x4cf01281UL, +0xab6bcb3bUL, 0xa266c035UL, 0xb971dd27UL, 0xb07cd629UL, 0x8f5fe703UL, 0x8652ec0dUL, 0x9d45f11fUL, 0x9448fa11UL, +0xe303934bUL, 0xea0e9845UL, 0xf1198557UL, 0xf8148e59UL, 0xc737bf73UL, 0xce3ab47dUL, 0xd52da96fUL, 0xdc20a261UL, +0x766df6adUL, 0x7f60fda3UL, 0x6477e0b1UL, 0x6d7aebbfUL, 0x5259da95UL, 0x5b54d19bUL, 0x4043cc89UL, 0x494ec787UL, +0x3e05aeddUL, 0x3708a5d3UL, 0x2c1fb8c1UL, 0x2512b3cfUL, 0x1a3182e5UL, 0x133c89ebUL, 0x082b94f9UL, 0x01269ff7UL, +0xe6bd464dUL, 0xefb04d43UL, 0xf4a75051UL, 0xfdaa5b5fUL, 0xc2896a75UL, 0xcb84617bUL, 0xd0937c69UL, 0xd99e7767UL, +0xaed51e3dUL, 0xa7d81533UL, 0xbccf0821UL, 0xb5c2032fUL, 0x8ae13205UL, 0x83ec390bUL, 0x98fb2419UL, 0x91f62f17UL, +0x4dd68d76UL, 0x44db8678UL, 0x5fcc9b6aUL, 0x56c19064UL, 0x69e2a14eUL, 0x60efaa40UL, 0x7bf8b752UL, 0x72f5bc5cUL, +0x05bed506UL, 0x0cb3de08UL, 0x17a4c31aUL, 0x1ea9c814UL, 0x218af93eUL, 0x2887f230UL, 0x3390ef22UL, 0x3a9de42cUL, +0xdd063d96UL, 0xd40b3698UL, 0xcf1c2b8aUL, 0xc6112084UL, 0xf93211aeUL, 0xf03f1aa0UL, 0xeb2807b2UL, 0xe2250cbcUL, +0x956e65e6UL, 0x9c636ee8UL, 0x877473faUL, 0x8e7978f4UL, 0xb15a49deUL, 0xb85742d0UL, 0xa3405fc2UL, 0xaa4d54ccUL, +0xecdaf741UL, 0xe5d7fc4fUL, 0xfec0e15dUL, 0xf7cdea53UL, 0xc8eedb79UL, 0xc1e3d077UL, 0xdaf4cd65UL, 0xd3f9c66bUL, +0xa4b2af31UL, 0xadbfa43fUL, 0xb6a8b92dUL, 0xbfa5b223UL, 0x80868309UL, 0x898b8807UL, 0x929c9515UL, 0x9b919e1bUL, +0x7c0a47a1UL, 0x75074cafUL, 0x6e1051bdUL, 0x671d5ab3UL, 0x583e6b99UL, 0x51336097UL, 0x4a247d85UL, 0x4329768bUL, +0x34621fd1UL, 0x3d6f14dfUL, 0x267809cdUL, 0x2f7502c3UL, 0x105633e9UL, 0x195b38e7UL, 0x024c25f5UL, 0x0b412efbUL, +0xd7618c9aUL, 0xde6c8794UL, 0xc57b9a86UL, 0xcc769188UL, 0xf355a0a2UL, 0xfa58abacUL, 0xe14fb6beUL, 0xe842bdb0UL, +0x9f09d4eaUL, 0x9604dfe4UL, 0x8d13c2f6UL, 0x841ec9f8UL, 0xbb3df8d2UL, 0xb230f3dcUL, 0xa927eeceUL, 0xa02ae5c0UL, +0x47b13c7aUL, 0x4ebc3774UL, 0x55ab2a66UL, 0x5ca62168UL, 0x63851042UL, 0x6a881b4cUL, 0x719f065eUL, 0x78920d50UL, +0x0fd9640aUL, 0x06d46f04UL, 0x1dc37216UL, 0x14ce7918UL, 0x2bed4832UL, 0x22e0433cUL, 0x39f75e2eUL, 0x30fa5520UL, +0x9ab701ecUL, 0x93ba0ae2UL, 0x88ad17f0UL, 0x81a01cfeUL, 0xbe832dd4UL, 0xb78e26daUL, 0xac993bc8UL, 0xa59430c6UL, +0xd2df599cUL, 0xdbd25292UL, 0xc0c54f80UL, 0xc9c8448eUL, 0xf6eb75a4UL, 0xffe67eaaUL, 0xe4f163b8UL, 0xedfc68b6UL, +0x0a67b10cUL, 0x036aba02UL, 0x187da710UL, 0x1170ac1eUL, 0x2e539d34UL, 0x275e963aUL, 0x3c498b28UL, 0x35448026UL, +0x420fe97cUL, 0x4b02e272UL, 0x5015ff60UL, 0x5918f46eUL, 0x663bc544UL, 0x6f36ce4aUL, 0x7421d358UL, 0x7d2cd856UL, +0xa10c7a37UL, 0xa8017139UL, 0xb3166c2bUL, 0xba1b6725UL, 0x8538560fUL, 0x8c355d01UL, 0x97224013UL, 0x9e2f4b1dUL, +0xe9642247UL, 0xe0692949UL, 0xfb7e345bUL, 0xf2733f55UL, 0xcd500e7fUL, 0xc45d0571UL, 0xdf4a1863UL, 0xd647136dUL, +0x31dccad7UL, 0x38d1c1d9UL, 0x23c6dccbUL, 0x2acbd7c5UL, 0x15e8e6efUL, 0x1ce5ede1UL, 0x07f2f0f3UL, 0x0efffbfdUL, +0x79b492a7UL, 0x70b999a9UL, 0x6bae84bbUL, 0x62a38fb5UL, 0x5d80be9fUL, 0x548db591UL, 0x4f9aa883UL, 0x4697a38dUL +}; +#endif + diff --git a/blowfish.c b/blowfish.c index 3b27e39..72b2d8f 100644 --- a/blowfish.c +++ b/blowfish.c @@ -347,7 +347,14 @@ int blowfish_setup(const unsigned char *key, int keylen, int num_rounds, return CRYPT_OK; } -#define F(x) ((((key->blowfish.S[0][((x)>>24)&255] + key->blowfish.S[1][((x)>>16)&255]) ^ key->blowfish.S[2][((x)>>8)&255]) + key->blowfish.S[3][((x)>>0)&255])) +#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 static void _blowfish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key) @@ -357,10 +364,20 @@ void blowfish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_ { unsigned long L, R; int r; +#if !defined(TWOFISH_SMALL) && !defined(__GNUC__) + unsigned long *S1, *S2, *S3, *S4; +#endif - _ARGCHK(pt != NULL); - _ARGCHK(ct != NULL); - _ARGCHK(key != NULL); + _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]); @@ -399,10 +416,20 @@ void blowfish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_ { unsigned long L, R; int r; - - _ARGCHK(pt != NULL); - _ARGCHK(ct != NULL); - _ARGCHK(key != NULL); +#if !defined(TWOFISH_SMALL) && !defined(__GNUC__) + unsigned long *S1, *S2, *S3, *S4; +#endif + + _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]); diff --git a/cast5.c b/cast5.c index 0969aaf..c85cd68 100644 --- a/cast5.c +++ b/cast5.c @@ -458,28 +458,34 @@ int cast5_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_ return CRYPT_OK; } -static unsigned long FI(unsigned long R, unsigned long Km, unsigned long Kr) +#ifdef _MSC_VER + #define INLINE __inline +#else + #define INLINE +#endif + +INLINE static unsigned long FI(unsigned long R, unsigned long Km, unsigned long Kr) { unsigned long I; I = (Km + R); I = ROL(I, Kr); - return ((S1[(I>>24)&255] ^ S2[(I>>16)&255]) - S3[(I>>8)&255]) + S4[I&255]; + return ((S1[byte(I, 3)] ^ S2[byte(I,2)]) - S3[byte(I,1)]) + S4[byte(I,0)]; } -static unsigned long FII(unsigned long R, unsigned long Km, unsigned long Kr) +INLINE static unsigned long FII(unsigned long R, unsigned long Km, unsigned long Kr) { unsigned long I; I = (Km ^ R); I = ROL(I, Kr); - return ((S1[(I>>24)&255] - S2[(I>>16)&255]) + S3[(I>>8)&255]) ^ S4[I&255]; + return ((S1[byte(I, 3)] - S2[byte(I,2)]) + S3[byte(I,1)]) ^ S4[byte(I,0)]; } -static unsigned long FIII(unsigned long R, unsigned long Km, unsigned long Kr) +INLINE static unsigned long FIII(unsigned long R, unsigned long Km, unsigned long Kr) { unsigned long I; I = (Km - R); I = ROL(I, Kr); - return ((S1[(I>>24)&255] + S2[(I>>16)&255]) ^ S3[(I>>8)&255]) - S4[I&255]; + return ((S1[byte(I, 3)] + S2[byte(I,2)]) ^ S3[byte(I,1)]) - S4[byte(I,0)]; } void cast5_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key) diff --git a/changes b/changes index 044a4d3..5acc5f5 100644 --- a/changes +++ b/changes @@ -1,3 +1,8 @@ +Jun 19th, 2003 +v0.87 -- Many MSVC optimizations to the code base + -- Improved the AES and Twofish key schedule [faster, more constant time] + -- Tons of optimizations here and there. + Jun 15th, 2003 v0.86 -- Fixed up AES to workaround MSVC optimizer bug -- Merged in fresh LTM base [based on v0.20] so there are no warnings with MSVC diff --git a/config.pl b/config.pl index c00fcb5..92392eb 100644 --- a/config.pl +++ b/config.pl @@ -21,7 +21,7 @@ ); @opts = ( - "SMALL_CODE,Use small code where possible (slower code),y", + "SMALL_CODE,Use small code where possible (slower code),n", "NO_FILE,Avoid file I/O calls,n", "CLEAN_STACK,Clean the stack within functions,n", "LTC_TEST,Include Test Vector Routines,y", @@ -36,7 +36,7 @@ "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,n", + "TWOFISH_TABLES,Include Use precomputed tables to speed up the low-ram variant,y", "DES,Include DES and 3DES block ciphers,y", "CAST5,Include CAST5 (aka CAST-128) block cipher,y", "NOEKEON,Include Noekeon block cipher,y", diff --git a/crypt.pdf b/crypt.pdf index a718d5cf8ca3e566484a085a875dc07c016a7da6..f5133baf87cfa81b534437979f2e77ac7a5e3e08 100644 GIT binary patch delta 99693 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

}oC;RLS64*{`m`{XANq`Z)KQ~9 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 diff --git a/crypt.tex b/crypt.tex index 26ad62c..d040e73 100644 --- a/crypt.tex +++ b/crypt.tex @@ -47,7 +47,7 @@ \def\gap{\vspace{0.5ex}} \makeindex \begin{document} -\title{A Tiny Crypto Library, \\ LibTomCrypt \\ Version 0.86} +\title{A Tiny Crypto Library, \\ LibTomCrypt \\ Version 0.87} \author{Tom St Denis \\ Algonquin College \\ \\ diff --git a/demos/x86_prof.c b/demos/x86_prof.c index 2d4a9a3..87d6caf 100644 --- a/demos/x86_prof.c +++ b/demos/x86_prof.c @@ -1,7 +1,69 @@ #include -extern void t_start(void); -extern ulong64 t_read(void); +#define KTIMES 25 +#define TIMES 10000 + +/* RDTSC from Scott Duplichan */ +static ulong64 rdtsc (void) + { + #if defined __GNUC__ + #ifdef i386 + ulong64 a; + asm volatile("rdtsc ":"=A" (a)); + return a; + #else /* gcc-IA64 version */ + unsigned long result; + __asm__ __volatile__("mov %0=ar.itc" : "=r"(result) :: "memory"); + while (__builtin_expect ((int) result == -1, 0)) + __asm__ __volatile__("mov %0=ar.itc" : "=r"(result) :: "memory"); + return result; + #endif + + // Microsoft and Intel Windows compilers + #elif defined _M_IX86 + __asm rdtsc + #elif defined _M_AMD64 + return __rdtsc (); + #elif defined _M_IA64 + #if defined __INTEL_COMPILER + #include + #endif + return __getReg (3116); + #else + #error need rdtsc function for this build + #endif + } + +ulong64 timer, skew = 0; + +void t_start(void) +{ + timer = rdtsc(); +} + +ulong64 t_read(void) +{ + return rdtsc() - timer; +} + +void init_timer(void) +{ + ulong64 c1, c2, t1, t2, t3; + unsigned long y1; + + c1 = c2 = (ulong64)-1; + for (y1 = 0; y1 < TIMES*100; y1++) { + t_start(); + t1 = t_read(); + t3 = t_read(); + t2 = t_read() - t1; + + c1 = (c1 > t1) ? t1 : c1; + c2 = (c2 > t2) ? t2 : c2; + } + skew = c2 - c1; + printf("Clock Skew: %lu\n", (unsigned long)skew); +} void reg_algs(void) { @@ -73,12 +135,50 @@ void reg_algs(void) } -#define TIMES 20 +int time_keysched(void) +{ + unsigned long x, i, y1; + ulong64 t1, c1; + symmetric_key skey; + int kl; + int (*func) (const unsigned char *, int , int , symmetric_key *); + unsigned char key[256][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++) { +#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++) { + for (i = 0; i < 256; i++) { + rng_get_bytes(key[i], kl, NULL); + } + + t_start(); + for (i = 0; i < 256; i++) { + DO1(key[i]); + } + t1 = t_read() >> 8; + if (t1 < c1) { if (y1 > 0) --y1; } + c1 = (t1 > c1) ? c1 : t1; + } + t1 = c1 - skew; + printf + ("%-20s: Schedule at %6lu\n", cipher_descriptor[x].name, (unsigned long)t1); + +#undef DO1 + } + + return 0; +} int time_cipher(void) { unsigned long x, y1; - ulong64 t1, t2; + ulong64 t1, t2, c1, c2, a1, a2; symmetric_key skey; void (*func) (const unsigned char *, unsigned char *, symmetric_key *); unsigned char key[MAXBLOCKSIZE], pt[MAXBLOCKSIZE]; @@ -91,43 +191,41 @@ int time_cipher(void) #define DO1 func(pt,pt,&skey); #define DO2 DO1 DO1 -#define DO4 DO2 DO2 -#define DO8 DO4 DO4 -#define DO16 DO8 DO8 -#define DO32 DO16 DO16 -#define DO64 DO32 DO32 -#define DO128 DO64 DO64 -#define DO256 DO128 DO128 func = cipher_descriptor[x].ecb_encrypt; - y1 = 1< 0); - t1 = t_read(); - + c1 = c2 = (ulong64)-1; + for (y1 = 0; y1 < TIMES; y1++) { + t_start(); + DO1; + t1 = t_read(); + DO2; + t2 = t_read(); + t2 -= t1; + + c1 = (t1 > c1 ? c1 : t1); + c2 = (t2 > c2 ? c2 : t2); + } + a1 = c2 - c1 - skew; + + func = cipher_descriptor[x].ecb_decrypt; - y1 = 1< 0); - t2 = t_read(); - - t1 = ((t1 * CONST64(1000)) >> TIMES) / ((ulong64)cipher_descriptor[x].block_length); - t2 = ((t2 * CONST64(1000)) >> TIMES) / ((ulong64)cipher_descriptor[x].block_length); + c1 = c2 = (ulong64)-1; + for (y1 = 0; y1 < TIMES; y1++) { + t_start(); + DO1; + t1 = t_read(); + DO2; + t2 = t_read(); + t2 -= t1; + + c1 = (t1 > c1 ? c1 : t1); + c2 = (t2 > c2 ? c2 : t2); + } + a2 = c2 - c1 - skew; printf - ("%-20s: Encrypt at %5.3f, Decrypt at %5.3f\n", cipher_descriptor[x].name, t1/1000.0, t2/1000.0); + ("%-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); -#undef DO256 -#undef DO128 -#undef DO64 -#undef DO32 -#undef DO16 -#undef DO8 -#undef DO4 #undef DO2 #undef DO1 } @@ -138,47 +236,38 @@ int time_cipher(void) int time_hash(void) { unsigned long x, y1, len; - ulong64 t1; + ulong64 t1, t2, c1, c2; hash_state md; void (*func)(hash_state *, const unsigned char *, unsigned long); unsigned char pt[MAXBLOCKSIZE]; - printf ("HASH Time Trials for:\n"); + printf ("\n\nHASH Time Trials for:\n"); for (x = 0; hash_descriptor[x].name != NULL; x++) { hash_descriptor[x].init(&md); #define DO1 func(&md,pt,len); #define DO2 DO1 DO1 -#define DO4 DO2 DO2 -#define DO8 DO4 DO4 -#define DO16 DO8 DO8 -#define DO32 DO16 DO16 -#define DO64 DO32 DO32 -#define DO128 DO64 DO64 -#define DO256 DO128 DO128 func = hash_descriptor[x].process; len = hash_descriptor[x].blocksize; - y1 = 1< 0); - t1 = t_read(); - - t1 = ((t1 * CONST64(1000)) >> TIMES) / ((ulong64)hash_descriptor[x].blocksize); + + c1 = c2 = (ulong64)-1; + for (y1 = 0; y1 < TIMES; y1++) { + t_start(); + DO1; + t1 = t_read(); + DO2; + t2 = t_read() - t1; + c1 = (t1 > c1) ? c1 : t1; + c2 = (t2 > c2) ? c2 : t2; + } + t1 = c2 - c1 - skew; + t1 = ((t1 * CONST64(1000))) / ((ulong64)hash_descriptor[x].blocksize); printf - ("%-20s: Process at %5.3f\n", hash_descriptor[x].name, t1 / 1000.0); + ("%-20s: Process at %9.3f\n", hash_descriptor[x].name, t1 / 1000.0); -#undef DO256 -#undef DO128 -#undef DO64 -#undef DO32 -#undef DO16 -#undef DO8 -#undef DO4 #undef DO2 #undef DO1 } @@ -192,8 +281,10 @@ int main(void) printf("Timings for ciphers and hashes. Times are listed as cycles per byte processed.\n\n"); - time_hash(); +// init_timer(); + time_keysched(); time_cipher(); + time_hash(); return EXIT_SUCCESS; } diff --git a/makefile b/makefile index 7e076ab..cfec020 100644 --- a/makefile +++ b/makefile @@ -9,7 +9,7 @@ # a build. This is easy to remedy though, for those that have problems. # The version -VERSION=0.86 +VERSION=0.87 #ch1-01-1 # Compiler and Linker Names @@ -91,7 +91,7 @@ dh.o: dh.c dh_sys.c aes.o: aes.c aes_tab.c sha512.o: sha512.c sha384.c -#These are objects that are known to build with -fomit-frame-pointer successfully +#These are objects that are known to build with -fomit-frame-pointer successfully [RISK!] aes.o: aes.c $(CC) $(CFLAGS) $(EXT_CFLAGS) -c aes.c @@ -150,13 +150,7 @@ small: library $(SMALLOBJECTS) $(CC) $(SMALLOBJECTS) $(LIBNAME) -o $(SMALL) $(WARN) x86_prof: library $(PROFS) - nasm -f coff demos/timer.asm - $(CC) demos/x86_prof.o demos/timer.o $(LIBNAME) -o $(PROF) - -#for linux -x86_profl: library $(PROFS) - nasm -f elf -DUSE_ELF demos/timer.asm - $(CC) demos/x86_prof.o demos/timer.o $(LIBNAME) -o $(PROF) + $(CC) demos/x86_prof.o $(LIBNAME) -o $(PROF) #This rule installs the library and the header files. This must be run #as root in order to have a high enough permission to write to the correct diff --git a/makefile.msvc b/makefile.msvc index 379f81c..3af1440 100644 --- a/makefile.msvc +++ b/makefile.msvc @@ -24,5 +24,4 @@ test: library test.obj cl test.obj tomcrypt.lib advapi32.lib x86_prof: demos/x86_prof.c library - nasm -f win32 demos/timer.asm - cl $(CFLAGS) demos/x86_prof.c demos/timer.obj tomcrypt.lib advapi32.lib \ No newline at end of file + cl $(CFLAGS) demos/x86_prof.c tomcrypt.lib advapi32.lib \ No newline at end of file diff --git a/md5.c b/md5.c index 9b78fa3..71481ae 100644 --- a/md5.c +++ b/md5.c @@ -15,7 +15,7 @@ const struct _hash_descriptor md5_desc = }; #define F(x,y,z) (z ^ (x & (y ^ z))) -#define G(x,y,z) ((x&z)|(y&(~z))) +#define G(x,y,z) (y ^ (z & (y ^ x))) #define H(x,y,z) (x^y^z) #define I(x,y,z) (y^(x|(~z))) diff --git a/mycrypt_custom.h b/mycrypt_custom.h index c6c8fc0..2429329 100644 --- a/mycrypt_custom.h +++ b/mycrypt_custom.h @@ -15,7 +15,8 @@ #define XFREE free #define XCLOCK clock #define XCLOCKS_PER_SEC CLOCKS_PER_SEC -#define SMALL_CODE +#define TWOFISH_TABLES +//#define SMALL_CODE #define LTC_TEST #define BLOWFISH #define RC2 diff --git a/mycrypt_macros.h b/mycrypt_macros.h index c89318d..43c90c7 100644 --- a/mycrypt_macros.h +++ b/mycrypt_macros.h @@ -183,9 +183,20 @@ extern char *crypt_error; #define BSWAP(x) ( ((x>>24)&0x000000FFUL) | ((x<<24)&0xFF000000UL) | \ ((x>>8)&0x0000FF00UL) | ((x<<8)&0x00FF0000UL) ) +#ifdef _MSC_VER + +# include +# pragma intrinsic(_lrotr,_lrotl) +# define ROR(x,n) _lrotr(x,n) +# define ROL(x,n) _lrotl(x,n) + +#else + #define ROL(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL) #define ROR(x, y) ( ((((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)((y)&31)) | ((unsigned long)(x)<<(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL) +#endif + #define ROL64(x, y) \ ( (((x)<<((ulong64)(y)&63)) | \ (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)64-((y)&63)))) & CONST64(0xFFFFFFFFFFFFFFFF)) @@ -198,3 +209,10 @@ extern char *crypt_error; #undef MIN #define MAX(x, y) ( ((x)>(y))?(x):(y) ) #define MIN(x, y) ( ((x)<(y))?(x):(y) ) + +/* extract a byte portably */ +#if (CHAR_BIT == 8) + #define byte(x, n) ((unsigned char)((x) >> (8 * (n)))) +#else + #define byte(x, n) (((x) >> (8 * (n))) & 255) +#endif diff --git a/noekeon.c b/noekeon.c index 8f4428e..8d6f0c8 100644 --- a/noekeon.c +++ b/noekeon.c @@ -23,7 +23,12 @@ static const unsigned long RC[] = { 0x000000d4UL }; -static const unsigned long zero[] = { 0, 0, 0, 0 }; + +#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); \ + a ^= temp; c ^= temp; #define THETA(k, a, b, c, d) \ temp = a^c; temp = temp ^ ROL(temp, 8) ^ ROR(temp, 8); \ @@ -72,7 +77,7 @@ int noekeon_setup(const unsigned char *key, int keylen, int num_rounds, symmetri LOAD32L(skey->noekeon.dK[2],&key[8]); LOAD32L(skey->noekeon.dK[3],&key[12]); - THETA(zero, skey->noekeon.dK[0], skey->noekeon.dK[1], skey->noekeon.dK[2], skey->noekeon.dK[3]); + kTHETA(skey->noekeon.dK[0], skey->noekeon.dK[1], skey->noekeon.dK[2], skey->noekeon.dK[3]); return CRYPT_OK; } @@ -100,9 +105,11 @@ void noekeon_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_k GAMMA(a,b,c,d); \ PI2(a,b,c,d); - for (r = 0; r < 16; r += 2) { + for (r = 0; r < 16; r += 4) { ROUND(0); ROUND(1); + ROUND(2); + ROUND(3); } #undef ROUND diff --git a/rc5.c b/rc5.c index dc2e577..51ebba5 100644 --- a/rc5.c +++ b/rc5.c @@ -92,7 +92,7 @@ static void _rc5_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetr void rc5_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key) #endif { - unsigned long A, B; + unsigned long A, B, *K; int r; _ARGCHK(key != NULL); _ARGCHK(pt != NULL); @@ -102,9 +102,22 @@ void rc5_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key * LOAD32L(B, &pt[4]); A += key->rc5.K[0]; B += key->rc5.K[1]; - for (r = 0; r < key->rc5.rounds; r++) { - A = ROL(A ^ B, B) + key->rc5.K[r+r+2]; - B = ROL(B ^ A, A) + key->rc5.K[r+r+3]; + K = key->rc5.K + 2; + + if ((key->rc5.rounds & 1) == 0) { + for (r = 0; r < key->rc5.rounds; r += 2) { + A = ROL(A ^ B, B) + K[0]; + B = ROL(B ^ A, A) + K[1]; + A = ROL(A ^ B, B) + K[2]; + B = ROL(B ^ A, A) + K[3]; + K += 4; + } + } else { + for (r = 0; r < key->rc5.rounds; r++) { + A = ROL(A ^ B, B) + K[0]; + B = ROL(B ^ A, A) + K[1]; + K += 2; + } } STORE32L(A, &ct[0]); STORE32L(B, &ct[4]); @@ -124,7 +137,7 @@ static void _rc5_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetr void rc5_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key) #endif { - unsigned long A, B; + unsigned long A, B, *K; int r; _ARGCHK(key != NULL); _ARGCHK(pt != NULL); @@ -132,9 +145,23 @@ void rc5_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key * LOAD32L(A, &ct[0]); LOAD32L(B, &ct[4]); - for (r = key->rc5.rounds - 1; r >= 0; r--) { - B = ROR(B - key->rc5.K[r+r+3], A) ^ A; - A = ROR(A - key->rc5.K[r+r+2], B) ^ B; + K = key->rc5.K + (key->rc5.rounds << 1); + + if ((key->rc5.rounds & 1) == 0) { + K -= 2; + for (r = key->rc5.rounds - 1; r >= 0; r -= 2) { + B = ROR(B - K[3], A) ^ A; + A = ROR(A - K[2], B) ^ B; + B = ROR(B - K[1], A) ^ A; + A = ROR(A - K[0], B) ^ B; + K -= 4; + } + } else { + for (r = key->rc5.rounds - 1; r >= 0; r--) { + B = ROR(B - K[1], A) ^ A; + A = ROR(A - K[0], B) ^ B; + K -= 2; + } } A -= key->rc5.K[0]; B -= key->rc5.K[1]; diff --git a/rc6.c b/rc6.c index 7f26c0b..720bdf3 100644 --- a/rc6.c +++ b/rc6.c @@ -89,22 +89,33 @@ static void _rc6_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetr void rc6_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key) #endif { - unsigned long a,b,c,d,t,u; + unsigned long a,b,c,d,t,u, *K; int r; _ARGCHK(key != NULL); _ARGCHK(pt != NULL); _ARGCHK(ct != NULL); LOAD32L(a,&pt[0]);LOAD32L(b,&pt[4]);LOAD32L(c,&pt[8]);LOAD32L(d,&pt[12]); + b += key->rc6.K[0]; d += key->rc6.K[1]; - for (r = 0; r < 20; r++) { - t = (b * (b + b + 1)); t = ROL(t, 5); - u = (d * (d + d + 1)); u = ROL(u, 5); - a = ROL(a^t,u) + key->rc6.K[r+r+2]; - c = ROL(c^u,t) + key->rc6.K[r+r+3]; - t = a; a = b; b = c; c = d; d = t; + +#define RND(a,b,c,d) \ + t = (b * (b + b + 1)); t = ROL(t, 5); \ + u = (d * (d + d + 1)); u = ROL(u, 5); \ + a = ROL(a^t,u) + K[0]; \ + c = ROL(c^u,t) + K[1]; K += 2; + + K = key->rc6.K + 2; + for (r = 0; r < 20; r += 4) { + RND(a,b,c,d); + RND(b,c,d,a); + RND(c,d,a,b); + RND(d,a,b,c); } + +#undef RND + a += key->rc6.K[42]; c += key->rc6.K[43]; STORE32L(a,&ct[0]);STORE32L(b,&ct[4]);STORE32L(c,&ct[8]);STORE32L(d,&ct[12]); @@ -124,7 +135,7 @@ static void _rc6_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetr void rc6_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key) #endif { - unsigned long a,b,c,d,t,u; + unsigned long a,b,c,d,t,u, *K; int r; _ARGCHK(key != NULL); @@ -134,13 +145,24 @@ void rc6_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key * LOAD32L(a,&ct[0]);LOAD32L(b,&ct[4]);LOAD32L(c,&ct[8]);LOAD32L(d,&ct[12]); a -= key->rc6.K[42]; c -= key->rc6.K[43]; - for (r = 19; r >= 0; r--) { - t = d; d = c; c = b; b = a; a = t; - t = (b * (b + b + 1)); t = ROL(t, 5); - u = (d * (d + d + 1)); u = ROL(u, 5); - c = ROR(c - key->rc6.K[r+r+3], t) ^ u; - a = ROR(a - key->rc6.K[r+r+2], u) ^ t; + +#define RND(a,b,c,d) \ + t = (b * (b + b + 1)); t = ROL(t, 5); \ + u = (d * (d + d + 1)); u = ROL(u, 5); \ + c = ROR(c - K[1], t) ^ u; \ + a = ROR(a - K[0], u) ^ t; K -= 2; + + K = key->rc6.K + 40; + + for (r = 0; r < 20; r += 4) { + RND(d,a,b,c); + RND(c,d,a,b); + RND(b,c,d,a); + RND(a,b,c,d); } + +#undef RND + b -= key->rc6.K[0]; d -= key->rc6.K[1]; STORE32L(a,&pt[0]);STORE32L(b,&pt[4]);STORE32L(c,&pt[8]);STORE32L(d,&pt[12]); diff --git a/tiger.c b/tiger.c index cd0dd4c..de131b3 100644 --- a/tiger.c +++ b/tiger.c @@ -533,17 +533,28 @@ static const ulong64 table[4*256] = { CONST64(0xCD56D9430EA8280E) /* 1020 */, CONST64(0xC12591D7535F5065) /* 1021 */, CONST64(0xC83223F1720AEF96) /* 1022 */, CONST64(0xC3A0396F7363A51F) /* 1023 */}; +#ifdef _MSC_VER + #define INLINE __inline +#else + #define INLINE +#endif + /* one round of the hash function */ -static void round(ulong64 *a, ulong64 *b, ulong64 *c, ulong64 x, ulong64 mul) +INLINE static void round(ulong64 *a, ulong64 *b, ulong64 *c, ulong64 x, int mul) { - *c ^= x; - *a -= t1[(*c)&255] ^ t2[((*c)>>16)&255] ^ t3[((*c)>>32)&255] ^ t4[((*c)>>48)&255]; - *b += t4[((*c)>>8)&255] ^ t3[((*c)>>24)&255] ^ t2[((*c)>>40)&255] ^ t1[((*c)>>56)&255]; - *b *= mul; + ulong64 tmp; + tmp = (*c ^= x); + *a -= t1[byte(tmp, 0)] ^ t2[byte(tmp, 2)] ^ t3[byte(tmp, 4)] ^ t4[byte(tmp, 6)]; + tmp = (*b += t4[byte(tmp, 1)] ^ t3[byte(tmp, 3)] ^ t2[byte(tmp,5)] ^ t1[byte(tmp,7)]); + switch (mul) { + case 5: *b = (tmp << 2) + tmp; break; + case 7: *b = (tmp << 3) - tmp; break; + case 9: *b = (tmp << 3) + tmp; break; + } } /* one complete pass */ -static void pass(ulong64 *a, ulong64 *b, ulong64 *c, ulong64 *x, ulong64 mul) +static void pass(ulong64 *a, ulong64 *b, ulong64 *c, ulong64 *x, int mul) { round(a,b,c,x[0],mul); round(b,c,a,x[1],mul); diff --git a/twofish.c b/twofish.c index bfc77fc..eb2ea93 100644 --- a/twofish.c +++ b/twofish.c @@ -101,61 +101,143 @@ static const unsigned char SBOX[2][256] = { 0x86, 0x56, 0x55, 0x09, 0xbe, 0x91} }; -static const unsigned char GF_EF[256] = { - 0x00, 0xef, 0xb7, 0x58, 0x07, 0xe8, 0xb0, 0x5f, 0x0e, 0xe1, - 0xb9, 0x56, 0x09, 0xe6, 0xbe, 0x51, 0x1c, 0xf3, 0xab, 0x44, - 0x1b, 0xf4, 0xac, 0x43, 0x12, 0xfd, 0xa5, 0x4a, 0x15, 0xfa, - 0xa2, 0x4d, 0x38, 0xd7, 0x8f, 0x60, 0x3f, 0xd0, 0x88, 0x67, - 0x36, 0xd9, 0x81, 0x6e, 0x31, 0xde, 0x86, 0x69, 0x24, 0xcb, - 0x93, 0x7c, 0x23, 0xcc, 0x94, 0x7b, 0x2a, 0xc5, 0x9d, 0x72, - 0x2d, 0xc2, 0x9a, 0x75, 0x70, 0x9f, 0xc7, 0x28, 0x77, 0x98, - 0xc0, 0x2f, 0x7e, 0x91, 0xc9, 0x26, 0x79, 0x96, 0xce, 0x21, - 0x6c, 0x83, 0xdb, 0x34, 0x6b, 0x84, 0xdc, 0x33, 0x62, 0x8d, - 0xd5, 0x3a, 0x65, 0x8a, 0xd2, 0x3d, 0x48, 0xa7, 0xff, 0x10, - 0x4f, 0xa0, 0xf8, 0x17, 0x46, 0xa9, 0xf1, 0x1e, 0x41, 0xae, - 0xf6, 0x19, 0x54, 0xbb, 0xe3, 0x0c, 0x53, 0xbc, 0xe4, 0x0b, - 0x5a, 0xb5, 0xed, 0x02, 0x5d, 0xb2, 0xea, 0x05, 0xe0, 0x0f, - 0x57, 0xb8, 0xe7, 0x08, 0x50, 0xbf, 0xee, 0x01, 0x59, 0xb6, - 0xe9, 0x06, 0x5e, 0xb1, 0xfc, 0x13, 0x4b, 0xa4, 0xfb, 0x14, - 0x4c, 0xa3, 0xf2, 0x1d, 0x45, 0xaa, 0xf5, 0x1a, 0x42, 0xad, - 0xd8, 0x37, 0x6f, 0x80, 0xdf, 0x30, 0x68, 0x87, 0xd6, 0x39, - 0x61, 0x8e, 0xd1, 0x3e, 0x66, 0x89, 0xc4, 0x2b, 0x73, 0x9c, - 0xc3, 0x2c, 0x74, 0x9b, 0xca, 0x25, 0x7d, 0x92, 0xcd, 0x22, - 0x7a, 0x95, 0x90, 0x7f, 0x27, 0xc8, 0x97, 0x78, 0x20, 0xcf, - 0x9e, 0x71, 0x29, 0xc6, 0x99, 0x76, 0x2e, 0xc1, 0x8c, 0x63, - 0x3b, 0xd4, 0x8b, 0x64, 0x3c, 0xd3, 0x82, 0x6d, 0x35, 0xda, - 0x85, 0x6a, 0x32, 0xdd, 0xa8, 0x47, 0x1f, 0xf0, 0xaf, 0x40, - 0x18, 0xf7, 0xa6, 0x49, 0x11, 0xfe, 0xa1, 0x4e, 0x16, 0xf9, - 0xb4, 0x5b, 0x03, 0xec, 0xb3, 0x5c, 0x04, 0xeb, 0xba, 0x55, - 0x0d, 0xe2, 0xbd, 0x52, 0x0a, 0xe5}; - -static const unsigned char GF_5B[256] = { - 0x00, 0x5b, 0xb6, 0xed, 0x05, 0x5e, 0xb3, 0xe8, 0x0a, 0x51, - 0xbc, 0xe7, 0x0f, 0x54, 0xb9, 0xe2, 0x14, 0x4f, 0xa2, 0xf9, - 0x11, 0x4a, 0xa7, 0xfc, 0x1e, 0x45, 0xa8, 0xf3, 0x1b, 0x40, - 0xad, 0xf6, 0x28, 0x73, 0x9e, 0xc5, 0x2d, 0x76, 0x9b, 0xc0, - 0x22, 0x79, 0x94, 0xcf, 0x27, 0x7c, 0x91, 0xca, 0x3c, 0x67, - 0x8a, 0xd1, 0x39, 0x62, 0x8f, 0xd4, 0x36, 0x6d, 0x80, 0xdb, - 0x33, 0x68, 0x85, 0xde, 0x50, 0x0b, 0xe6, 0xbd, 0x55, 0x0e, - 0xe3, 0xb8, 0x5a, 0x01, 0xec, 0xb7, 0x5f, 0x04, 0xe9, 0xb2, - 0x44, 0x1f, 0xf2, 0xa9, 0x41, 0x1a, 0xf7, 0xac, 0x4e, 0x15, - 0xf8, 0xa3, 0x4b, 0x10, 0xfd, 0xa6, 0x78, 0x23, 0xce, 0x95, - 0x7d, 0x26, 0xcb, 0x90, 0x72, 0x29, 0xc4, 0x9f, 0x77, 0x2c, - 0xc1, 0x9a, 0x6c, 0x37, 0xda, 0x81, 0x69, 0x32, 0xdf, 0x84, - 0x66, 0x3d, 0xd0, 0x8b, 0x63, 0x38, 0xd5, 0x8e, 0xa0, 0xfb, - 0x16, 0x4d, 0xa5, 0xfe, 0x13, 0x48, 0xaa, 0xf1, 0x1c, 0x47, - 0xaf, 0xf4, 0x19, 0x42, 0xb4, 0xef, 0x02, 0x59, 0xb1, 0xea, - 0x07, 0x5c, 0xbe, 0xe5, 0x08, 0x53, 0xbb, 0xe0, 0x0d, 0x56, - 0x88, 0xd3, 0x3e, 0x65, 0x8d, 0xd6, 0x3b, 0x60, 0x82, 0xd9, - 0x34, 0x6f, 0x87, 0xdc, 0x31, 0x6a, 0x9c, 0xc7, 0x2a, 0x71, - 0x99, 0xc2, 0x2f, 0x74, 0x96, 0xcd, 0x20, 0x7b, 0x93, 0xc8, - 0x25, 0x7e, 0xf0, 0xab, 0x46, 0x1d, 0xf5, 0xae, 0x43, 0x18, - 0xfa, 0xa1, 0x4c, 0x17, 0xff, 0xa4, 0x49, 0x12, 0xe4, 0xbf, - 0x52, 0x09, 0xe1, 0xba, 0x57, 0x0c, 0xee, 0xb5, 0x58, 0x03, - 0xeb, 0xb0, 0x5d, 0x06, 0xd8, 0x83, 0x6e, 0x35, 0xdd, 0x86, - 0x6b, 0x30, 0xd2, 0x89, 0x64, 0x3f, 0xd7, 0x8c, 0x61, 0x3a, - 0xcc, 0x97, 0x7a, 0x21, 0xc9, 0x92, 0x7f, 0x24, 0xc6, 0x9d, - 0x70, 0x2b, 0xc3, 0x98, 0x75, 0x2e}; +static const unsigned long 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 +}}; #define sbox(i, x) ((unsigned long)SBOX[i][(x)&255]) @@ -232,69 +314,34 @@ static unsigned long sbox(int i, unsigned long x) /* computes ab mod p */ static unsigned long gf_mult(unsigned long a, unsigned long b, unsigned long p) { - unsigned long result = 0; - while (a > 0) { - if ((a & 1) == 1) - result ^= b; - a >>= 1; - b <<= 1; - if ((b & 0x100) == 0x100) - b ^= p; - } - return result & 255; -} + unsigned long result = 0, B[2], P[2]; + + P[1] = p; + B[1] = b; + P[0] = B[0] = 0; + + /* unrolled branchless GF multiplier */ + result ^= B[a&1]; a >>= 1; B[1] <<= 1; B[1] ^= P[B[1]>>8]; + result ^= B[a&1]; a >>= 1; B[1] <<= 1; B[1] ^= P[B[1]>>8]; + result ^= B[a&1]; a >>= 1; B[1] <<= 1; B[1] ^= P[B[1]>>8]; + result ^= B[a&1]; a >>= 1; B[1] <<= 1; B[1] ^= P[B[1]>>8]; + result ^= B[a&1]; a >>= 1; B[1] <<= 1; B[1] ^= P[B[1]>>8]; + result ^= B[a&1]; a >>= 1; B[1] <<= 1; B[1] ^= P[B[1]>>8]; + result ^= B[a&1]; a >>= 1; B[1] <<= 1; B[1] ^= P[B[1]>>8]; + result ^= B[a&1]; - -/* Computes [y0 y1 y2 y3] = MDS . [x0 x1 x2 x3] */ -static void mds_mult(const unsigned char *in, unsigned char *out) -{ - int x, y; - unsigned char tmp[4]; - - for (x = 0; x < 4; x++) { - tmp[x] = (unsigned char)0; - for (y = 0; y < 4; y++) - tmp[x] ^= gf_mult(in[y], MDS[x][y], MDS_POLY); - } - for (x = 0; x < 4; x++) - out[x] = tmp[x]; - zeromem(tmp, 4); -} - -/* 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; - unsigned char tmp[4]; - - for (x = 0; x < 4; x++) { - tmp[x] = 0; - for (y = 0; y < 8; y++) - tmp[x] ^= gf_mult(in[y], RS[x][y], RS_POLY); - } - for (x = 0; x < 4; x++) - out[x] = tmp[x]; - zeromem(tmp, 4); + return result; } /* computes [y0 y1 y2 y3] = MDS . [x0] */ #ifndef TWOFISH_TABLES static unsigned long mds_column_mult(unsigned char in, int col) -{ - return - (gf_mult(in, MDS[0][col], MDS_POLY) << 0) | - (gf_mult(in, MDS[1][col], MDS_POLY) << 8) | - (gf_mult(in, MDS[2][col], MDS_POLY) << 16) | - (gf_mult(in, MDS[3][col], MDS_POLY) << 24); -} -#else -static unsigned long mds_column_mult(unsigned char in, int col) { unsigned long x01, x5B, xEF; x01 = in; - x5B = GF_5B[in]; - xEF = GF_EF[in]; + x5B = gf_mult(in, 0x5B, MDS_POLY); + xEF = gf_mult(in, 0xEF, MDS_POLY); switch (col) { case 0: @@ -321,14 +368,40 @@ static unsigned long mds_column_mult(unsigned char in, int col) /* avoid warnings, we'd never get here normally but just to calm compiler warnings... */ return 0; } -#endif + +#else /* TWOFISH_TABLES */ + +#define mds_column_mult(x, i) mds_tab[i][x] + +#endif /* TWOFISH_TABLES */ + +/* Computes [y0 y1 y2 y3] = MDS . [x0 x1 x2 x3] */ +static void mds_mult(const unsigned char *in, unsigned char *out) +{ + int x; + unsigned long tmp; + for (tmp = x = 0; x < 4; x++) { + tmp ^= mds_column_mult(in[x], x); + } + STORE32L(tmp, out); +} + +/* 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++) + out[x] ^= gf_mult(in[y], RS[x][y], RS_POLY); + } +} /* 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++) y[x] = in[x]; @@ -354,14 +427,24 @@ static void h_func(const unsigned char *in, unsigned char *out, unsigned char *M #ifndef TWOFISH_SMALL -#define g_func(x,dum) (key->twofish.S[0][((x)>>0)&255] ^ key->twofish.S[1][((x)>>8)&255] ^ key->twofish.S[2][((x)>>16)&255] ^ key->twofish.S[3][((x)>>24)&255]) +/* for GCC we don't use pointer aliases */ +#if defined(__GNUC__) + #define S1 key->twofish.S[0] + #define S2 key->twofish.S[1] + #define S3 key->twofish.S[2] + #define S4 key->twofish.S[3] +#endif + +/* the G function */ +#define g_func(x, dum) (S1[byte(x,0)] ^ S2[byte(x,1)] ^ S3[byte(x,2)] ^ S4[byte(x,3)]) +#define g1_func(x, dum) (S2[byte(x,0)] ^ S3[byte(x,1)] ^ S4[byte(x,2)] ^ S1[byte(x,3)]) #else #ifdef CLEAN_STACK static unsigned long _g_func(unsigned long x, symmetric_key *key) #else -unsigned long g_func(unsigned long x, symmetric_key *key) +static unsigned long g_func(unsigned long x, symmetric_key *key) #endif { unsigned char g, i, y, z; @@ -389,6 +472,8 @@ unsigned long g_func(unsigned long x, symmetric_key *key) return res; } +#define g1_func(x, key) g_func(ROL(x, 8), key) + #ifdef CLEAN_STACK static unsigned long g_func(unsigned long x, symmetric_key *key) { @@ -487,8 +572,7 @@ int twofish_setup(const unsigned char *key, int keylen, int num_rounds, symmetri /* do key mixing+sbox until z==5 */ while (z != 5) { - g = g ^ S[4*i++ + y]; - g = sbox((int)qord[y][z++], g); + g = sbox((int)qord[y][z++], g ^ S[4*i++ + y]); } /* multiply g by a column of the MDS */ @@ -520,10 +604,20 @@ void twofish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_k { unsigned long a,b,c,d,ta,tb,tc,td,t1,t2, *k; int r; +#if !defined(TWOFISH_SMALL) && !defined(__GNUC__) + unsigned long *S1, *S2, *S3, *S4; +#endif _ARGCHK(pt != NULL); _ARGCHK(ct != NULL); _ARGCHK(key != NULL); + +#if !defined(TWOFISH_SMALL) && !defined(__GNUC__) + S1 = key->twofish.S[0]; + S2 = key->twofish.S[1]; + S3 = key->twofish.S[2]; + S4 = key->twofish.S[3]; +#endif LOAD32L(a,&pt[0]); LOAD32L(b,&pt[4]); LOAD32L(c,&pt[8]); LOAD32L(d,&pt[12]); @@ -535,20 +629,16 @@ void twofish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_k k = key->twofish.K + 8; for (r = 0; r < 16; r += 2) { t1 = g_func(a, key); - t2 = g_func(ROL(b, 8), key); - t2 += (t1 += t2); - t1 += *k++; - t2 += *k++; - c ^= t1; c = ROR(c, 1); - d = ROL(d, 1) ^ t2; - + t2 = g1_func(b, key); + c = ROR(c ^ (t1 + t2 + k[0]), 1); + d = ROL(d, 1) ^ (t2 + t2 + t1 + k[1]); + k += 2; + t1 = g_func(c, key); - t2 = g_func(ROL(d, 8), key); - t2 += (t1 += t2); - t1 += *k++; - t2 += *k++; - a ^= t1; a = ROR(a, 1); - b = ROL(b, 1) ^ t2; + t2 = g1_func(d, key); + a = ROR(a ^ (t1 + t2 + k[0]), 1); + b = ROL(b, 1) ^ (t2 + t2 + t1 + k[1]); + k += 2; } /* output with "undo last swap" */ @@ -578,10 +668,20 @@ void twofish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_k { unsigned long a,b,c,d,ta,tb,tc,td,t1,t2, *k; int r; +#if !defined(TWOFISH_SMALL) && !defined(__GNUC__) + unsigned long *S1, *S2, *S3, *S4; +#endif _ARGCHK(pt != NULL); _ARGCHK(ct != NULL); _ARGCHK(key != NULL); + +#if !defined(TWOFISH_SMALL) && !defined(__GNUC__) + S1 = key->twofish.S[0]; + S2 = key->twofish.S[1]; + S3 = key->twofish.S[2]; + S4 = key->twofish.S[3]; +#endif /* load input */ LOAD32L(ta,&ct[0]); LOAD32L(tb,&ct[4]); @@ -593,23 +693,19 @@ void twofish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_k c = ta ^ key->twofish.K[4]; d = tb ^ key->twofish.K[5]; - k = key->twofish.K + 39; + k = key->twofish.K + 38; for (r = 14; r >= 0; r -= 2) { t1 = g_func(c, key); - t2 = g_func(ROL(d, 8), key); - t2 += (t1 += t2); - t2 += *k--; - t1 += *k--; - a = ROL(a, 1) ^ t1; - b = b ^ t2; b = ROR(b, 1); + t2 = g1_func(d, key); + a = ROL(a, 1) ^ (t1 + t2 + k[0]); + b = ROR(b ^ (t2 + t2 + t1 + k[1]), 1); + k -= 2; t1 = g_func(a, key); - t2 = g_func(ROL(b, 8), key); - t2 += (t1 += t2); - t2 += *k--; - t1 += *k--; - c = ROL(c, 1) ^ t1; - d = d ^ t2; d = ROR(d, 1); + t2 = g1_func(b, key); + c = ROL(c, 1) ^ (t1 + t2 + k[0]); + d = ROR(d ^ (t2 + t2 + t1 + k[1]), 1); + k -= 2; } /* pre-white */