19a747e4fSDavid du Colombier /* 29a747e4fSDavid du Colombier * this code is derived from the following source, 39a747e4fSDavid du Colombier * and modified to fit into the plan 9 libsec interface. 49a747e4fSDavid du Colombier * most of the changes are confined to the top section, 59a747e4fSDavid du Colombier * with the exception of converting Te4 and Td4 into u8 rather than u32 arrays. 69a747e4fSDavid du Colombier * 79a747e4fSDavid du Colombier * rijndael-alg-fst.c 89a747e4fSDavid du Colombier * 99a747e4fSDavid du Colombier * @version 3.0 (December 2000) 109a747e4fSDavid du Colombier * 119a747e4fSDavid du Colombier * Optimised ANSI C code for the Rijndael cipher (now AES) 129a747e4fSDavid du Colombier * 139a747e4fSDavid du Colombier * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be> 149a747e4fSDavid du Colombier * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be> 159a747e4fSDavid du Colombier * @author Paulo Barreto <paulo.barreto@terra.com.br> 169a747e4fSDavid du Colombier * 179a747e4fSDavid du Colombier * This code is hereby placed in the public domain. 189a747e4fSDavid du Colombier * 199a747e4fSDavid du Colombier * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS 209a747e4fSDavid du Colombier * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 219a747e4fSDavid du Colombier * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 229a747e4fSDavid du Colombier * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE 239a747e4fSDavid du Colombier * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 249a747e4fSDavid du Colombier * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 259a747e4fSDavid du Colombier * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 269a747e4fSDavid du Colombier * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 279a747e4fSDavid du Colombier * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 289a747e4fSDavid du Colombier * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 299a747e4fSDavid du Colombier * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 309a747e4fSDavid du Colombier */ 319a747e4fSDavid du Colombier #include <u.h> 329a747e4fSDavid du Colombier #include <libc.h> 339a747e4fSDavid du Colombier #include <libsec.h> 349a747e4fSDavid du Colombier 359a747e4fSDavid du Colombier typedef uchar u8; 369a747e4fSDavid du Colombier typedef u32int u32; 37*fc4036bfSDavid du Colombier 389a747e4fSDavid du Colombier #define FULL_UNROLL 399a747e4fSDavid du Colombier 409a747e4fSDavid du Colombier static const u32 Td0[256]; 419a747e4fSDavid du Colombier static const u32 Td1[256]; 429a747e4fSDavid du Colombier static const u32 Td2[256]; 439a747e4fSDavid du Colombier static const u32 Td3[256]; 449a747e4fSDavid du Colombier static const u8 Te4[256]; 459a747e4fSDavid du Colombier 469a747e4fSDavid du Colombier static int rijndaelKeySetupEnc(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits); 479a747e4fSDavid du Colombier static int rijndaelKeySetupDec(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits); 489a747e4fSDavid du Colombier static int rijndaelKeySetup(u32 erk[/*4*(Nr + 1)*/], u32 drk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits); 499a747e4fSDavid du Colombier static void rijndaelEncrypt(const u32int rk[], int Nr, const uchar pt[16], uchar ct[16]); 509a747e4fSDavid du Colombier static void rijndaelDecrypt(const u32int rk[], int Nr, const uchar ct[16], uchar pt[16]); 519a747e4fSDavid du Colombier 529a747e4fSDavid du Colombier void 539a747e4fSDavid du Colombier setupAESstate(AESstate *s, uchar key[], int keybytes, uchar *ivec) 549a747e4fSDavid du Colombier { 559a747e4fSDavid du Colombier memset(s, 0, sizeof(*s)); 569a747e4fSDavid du Colombier if(keybytes > AESmaxkey) 579a747e4fSDavid du Colombier keybytes = AESmaxkey; 589a747e4fSDavid du Colombier memmove(s->key, key, keybytes); 599a747e4fSDavid du Colombier s->keybytes = keybytes; 609a747e4fSDavid du Colombier s->rounds = rijndaelKeySetup(s->ekey, s->dkey, s->key, keybytes * 8); 619a747e4fSDavid du Colombier if(ivec != nil) 629a747e4fSDavid du Colombier memmove(s->ivec, ivec, AESbsize); 639a747e4fSDavid du Colombier if(keybytes==16 || keybytes==24 || keybytes==32) 649a747e4fSDavid du Colombier s->setup = 0xcafebabe; 65*fc4036bfSDavid du Colombier /* else rijndaelKeySetup was invalid */ 669a747e4fSDavid du Colombier } 679a747e4fSDavid du Colombier 68*fc4036bfSDavid du Colombier /* 69*fc4036bfSDavid du Colombier * Define by analogy with desCBCencrypt; AES modes are not standardized yet. 70*fc4036bfSDavid du Colombier * Because of the way that non-multiple-of-16 buffers are handled, 71*fc4036bfSDavid du Colombier * the decryptor must be fed buffers of the same size as the encryptor. 72*fc4036bfSDavid du Colombier */ 739a747e4fSDavid du Colombier void 749a747e4fSDavid du Colombier aesCBCencrypt(uchar *p, int len, AESstate *s) 759a747e4fSDavid du Colombier { 769a747e4fSDavid du Colombier uchar *p2, *ip, *eip; 779a747e4fSDavid du Colombier uchar q[AESbsize]; 789a747e4fSDavid du Colombier 799a747e4fSDavid du Colombier for(; len >= AESbsize; len -= AESbsize){ 809a747e4fSDavid du Colombier p2 = p; 819a747e4fSDavid du Colombier ip = s->ivec; 829a747e4fSDavid du Colombier for(eip = ip+AESbsize; ip < eip; ) 839a747e4fSDavid du Colombier *p2++ ^= *ip++; 849a747e4fSDavid du Colombier rijndaelEncrypt(s->ekey, s->rounds, p, q); 859a747e4fSDavid du Colombier memmove(s->ivec, q, AESbsize); 869a747e4fSDavid du Colombier memmove(p, q, AESbsize); 879a747e4fSDavid du Colombier p += AESbsize; 889a747e4fSDavid du Colombier } 899a747e4fSDavid du Colombier 909a747e4fSDavid du Colombier if(len > 0){ 919a747e4fSDavid du Colombier ip = s->ivec; 929a747e4fSDavid du Colombier rijndaelEncrypt(s->ekey, s->rounds, ip, q); 939a747e4fSDavid du Colombier memmove(s->ivec, q, AESbsize); 949a747e4fSDavid du Colombier for(eip = ip+len; ip < eip; ) 959a747e4fSDavid du Colombier *p++ ^= *ip++; 969a747e4fSDavid du Colombier } 979a747e4fSDavid du Colombier } 989a747e4fSDavid du Colombier 999a747e4fSDavid du Colombier void 1009a747e4fSDavid du Colombier aesCBCdecrypt(uchar *p, int len, AESstate *s) 1019a747e4fSDavid du Colombier { 1029a747e4fSDavid du Colombier uchar *ip, *eip, *tp; 1039a747e4fSDavid du Colombier uchar tmp[AESbsize], q[AESbsize]; 1049a747e4fSDavid du Colombier 1059a747e4fSDavid du Colombier for(; len >= AESbsize; len -= AESbsize){ 1069a747e4fSDavid du Colombier memmove(tmp, p, AESbsize); 1079a747e4fSDavid du Colombier rijndaelDecrypt(s->dkey, s->rounds, p, q); 1089a747e4fSDavid du Colombier memmove(p, q, AESbsize); 1099a747e4fSDavid du Colombier tp = tmp; 1109a747e4fSDavid du Colombier ip = s->ivec; 1119a747e4fSDavid du Colombier for(eip = ip+AESbsize; ip < eip; ){ 1129a747e4fSDavid du Colombier *p++ ^= *ip; 1139a747e4fSDavid du Colombier *ip++ = *tp++; 1149a747e4fSDavid du Colombier } 1159a747e4fSDavid du Colombier } 1169a747e4fSDavid du Colombier 1179a747e4fSDavid du Colombier if(len > 0){ 1189a747e4fSDavid du Colombier ip = s->ivec; 1199a747e4fSDavid du Colombier rijndaelEncrypt(s->ekey, s->rounds, ip, q); 1209a747e4fSDavid du Colombier memmove(s->ivec, q, AESbsize); 1219a747e4fSDavid du Colombier for(eip = ip+len; ip < eip; ) 1229a747e4fSDavid du Colombier *p++ ^= *ip++; 1239a747e4fSDavid du Colombier } 1249a747e4fSDavid du Colombier } 1259a747e4fSDavid du Colombier 1269a747e4fSDavid du Colombier /* 1279a747e4fSDavid du Colombier * this function has been changed for plan 9. 1289a747e4fSDavid du Colombier * Expand the cipher key into the encryption and decryption key schedules. 1299a747e4fSDavid du Colombier * 1309a747e4fSDavid du Colombier * @return the number of rounds for the given cipher key size. 1319a747e4fSDavid du Colombier */ 132*fc4036bfSDavid du Colombier static int 133*fc4036bfSDavid du Colombier rijndaelKeySetup(u32 erk[/* 4*(Nr + 1) */], u32 drk[/* 4*(Nr + 1) */], 134*fc4036bfSDavid du Colombier const u8 cipherKey[], int keyBits) 135*fc4036bfSDavid du Colombier { 1369a747e4fSDavid du Colombier int Nr, i; 1379a747e4fSDavid du Colombier 1389a747e4fSDavid du Colombier /* expand the cipher key: */ 1399a747e4fSDavid du Colombier Nr = rijndaelKeySetupEnc(erk, cipherKey, keyBits); 1409a747e4fSDavid du Colombier 1419a747e4fSDavid du Colombier /* 142*fc4036bfSDavid du Colombier * invert the order of the round keys and apply the inverse MixColumn 143*fc4036bfSDavid du Colombier * transform to all round keys but the first and the last 1449a747e4fSDavid du Colombier */ 1459a747e4fSDavid du Colombier drk[0 ] = erk[4*Nr ]; 1469a747e4fSDavid du Colombier drk[1 ] = erk[4*Nr + 1]; 1479a747e4fSDavid du Colombier drk[2 ] = erk[4*Nr + 2]; 1489a747e4fSDavid du Colombier drk[3 ] = erk[4*Nr + 3]; 1499a747e4fSDavid du Colombier drk[4*Nr ] = erk[0 ]; 1509a747e4fSDavid du Colombier drk[4*Nr + 1] = erk[1 ]; 1519a747e4fSDavid du Colombier drk[4*Nr + 2] = erk[2 ]; 1529a747e4fSDavid du Colombier drk[4*Nr + 3] = erk[3 ]; 1539a747e4fSDavid du Colombier erk += 4 * Nr; 1549a747e4fSDavid du Colombier for (i = 1; i < Nr; i++) { 1559a747e4fSDavid du Colombier drk += 4; 1569a747e4fSDavid du Colombier erk -= 4; 1579a747e4fSDavid du Colombier drk[0] = 1589a747e4fSDavid du Colombier Td0[Te4[(erk[0] >> 24) ]] ^ 1599a747e4fSDavid du Colombier Td1[Te4[(erk[0] >> 16) & 0xff]] ^ 1609a747e4fSDavid du Colombier Td2[Te4[(erk[0] >> 8) & 0xff]] ^ 1619a747e4fSDavid du Colombier Td3[Te4[(erk[0] ) & 0xff]]; 1629a747e4fSDavid du Colombier drk[1] = 1639a747e4fSDavid du Colombier Td0[Te4[(erk[1] >> 24) ]] ^ 1649a747e4fSDavid du Colombier Td1[Te4[(erk[1] >> 16) & 0xff]] ^ 1659a747e4fSDavid du Colombier Td2[Te4[(erk[1] >> 8) & 0xff]] ^ 1669a747e4fSDavid du Colombier Td3[Te4[(erk[1] ) & 0xff]]; 1679a747e4fSDavid du Colombier drk[2] = 1689a747e4fSDavid du Colombier Td0[Te4[(erk[2] >> 24) ]] ^ 1699a747e4fSDavid du Colombier Td1[Te4[(erk[2] >> 16) & 0xff]] ^ 1709a747e4fSDavid du Colombier Td2[Te4[(erk[2] >> 8) & 0xff]] ^ 1719a747e4fSDavid du Colombier Td3[Te4[(erk[2] ) & 0xff]]; 1729a747e4fSDavid du Colombier drk[3] = 1739a747e4fSDavid du Colombier Td0[Te4[(erk[3] >> 24) ]] ^ 1749a747e4fSDavid du Colombier Td1[Te4[(erk[3] >> 16) & 0xff]] ^ 1759a747e4fSDavid du Colombier Td2[Te4[(erk[3] >> 8) & 0xff]] ^ 1769a747e4fSDavid du Colombier Td3[Te4[(erk[3] ) & 0xff]]; 1779a747e4fSDavid du Colombier } 1789a747e4fSDavid du Colombier return Nr; 1799a747e4fSDavid du Colombier } 1809a747e4fSDavid du Colombier 1819a747e4fSDavid du Colombier /* 1829a747e4fSDavid du Colombier Te0[x] = S [x].[02, 01, 01, 03]; 1839a747e4fSDavid du Colombier Te1[x] = S [x].[03, 02, 01, 01]; 1849a747e4fSDavid du Colombier Te2[x] = S [x].[01, 03, 02, 01]; 1859a747e4fSDavid du Colombier Te3[x] = S [x].[01, 01, 03, 02]; 1869a747e4fSDavid du Colombier Te4[x] = S [x] 1879a747e4fSDavid du Colombier 1889a747e4fSDavid du Colombier Td0[x] = Si[x].[0e, 09, 0d, 0b]; 1899a747e4fSDavid du Colombier Td1[x] = Si[x].[0b, 0e, 09, 0d]; 1909a747e4fSDavid du Colombier Td2[x] = Si[x].[0d, 0b, 0e, 09]; 1919a747e4fSDavid du Colombier Td3[x] = Si[x].[09, 0d, 0b, 0e]; 1929a747e4fSDavid du Colombier Td4[x] = Si[x] 1939a747e4fSDavid du Colombier */ 1949a747e4fSDavid du Colombier 1959a747e4fSDavid du Colombier static const u32 Te0[256] = { 1969a747e4fSDavid du Colombier 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, 1979a747e4fSDavid du Colombier 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, 1989a747e4fSDavid du Colombier 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, 1999a747e4fSDavid du Colombier 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, 2009a747e4fSDavid du Colombier 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, 2019a747e4fSDavid du Colombier 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, 2029a747e4fSDavid du Colombier 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, 2039a747e4fSDavid du Colombier 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, 2049a747e4fSDavid du Colombier 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, 2059a747e4fSDavid du Colombier 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, 2069a747e4fSDavid du Colombier 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, 2079a747e4fSDavid du Colombier 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, 2089a747e4fSDavid du Colombier 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, 2099a747e4fSDavid du Colombier 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, 2109a747e4fSDavid du Colombier 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, 2119a747e4fSDavid du Colombier 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, 2129a747e4fSDavid du Colombier 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, 2139a747e4fSDavid du Colombier 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, 2149a747e4fSDavid du Colombier 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, 2159a747e4fSDavid du Colombier 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, 2169a747e4fSDavid du Colombier 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, 2179a747e4fSDavid du Colombier 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, 2189a747e4fSDavid du Colombier 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, 2199a747e4fSDavid du Colombier 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, 2209a747e4fSDavid du Colombier 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, 2219a747e4fSDavid du Colombier 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, 2229a747e4fSDavid du Colombier 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, 2239a747e4fSDavid du Colombier 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, 2249a747e4fSDavid du Colombier 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, 2259a747e4fSDavid du Colombier 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, 2269a747e4fSDavid du Colombier 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, 2279a747e4fSDavid du Colombier 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, 2289a747e4fSDavid du Colombier 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, 2299a747e4fSDavid du Colombier 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, 2309a747e4fSDavid du Colombier 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, 2319a747e4fSDavid du Colombier 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, 2329a747e4fSDavid du Colombier 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, 2339a747e4fSDavid du Colombier 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, 2349a747e4fSDavid du Colombier 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, 2359a747e4fSDavid du Colombier 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, 2369a747e4fSDavid du Colombier 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, 2379a747e4fSDavid du Colombier 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, 2389a747e4fSDavid du Colombier 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, 2399a747e4fSDavid du Colombier 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, 2409a747e4fSDavid du Colombier 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, 2419a747e4fSDavid du Colombier 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, 2429a747e4fSDavid du Colombier 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, 2439a747e4fSDavid du Colombier 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, 2449a747e4fSDavid du Colombier 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, 2459a747e4fSDavid du Colombier 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, 2469a747e4fSDavid du Colombier 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, 2479a747e4fSDavid du Colombier 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, 2489a747e4fSDavid du Colombier 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, 2499a747e4fSDavid du Colombier 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, 2509a747e4fSDavid du Colombier 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, 2519a747e4fSDavid du Colombier 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, 2529a747e4fSDavid du Colombier 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, 2539a747e4fSDavid du Colombier 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, 2549a747e4fSDavid du Colombier 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, 2559a747e4fSDavid du Colombier 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, 2569a747e4fSDavid du Colombier 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, 2579a747e4fSDavid du Colombier 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, 2589a747e4fSDavid du Colombier 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, 2599a747e4fSDavid du Colombier 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, 2609a747e4fSDavid du Colombier }; 2619a747e4fSDavid du Colombier static const u32 Te1[256] = { 2629a747e4fSDavid du Colombier 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, 2639a747e4fSDavid du Colombier 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, 2649a747e4fSDavid du Colombier 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, 2659a747e4fSDavid du Colombier 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, 2669a747e4fSDavid du Colombier 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, 2679a747e4fSDavid du Colombier 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, 2689a747e4fSDavid du Colombier 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, 2699a747e4fSDavid du Colombier 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, 2709a747e4fSDavid du Colombier 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, 2719a747e4fSDavid du Colombier 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, 2729a747e4fSDavid du Colombier 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, 2739a747e4fSDavid du Colombier 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, 2749a747e4fSDavid du Colombier 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, 2759a747e4fSDavid du Colombier 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, 2769a747e4fSDavid du Colombier 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, 2779a747e4fSDavid du Colombier 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, 2789a747e4fSDavid du Colombier 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, 2799a747e4fSDavid du Colombier 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, 2809a747e4fSDavid du Colombier 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, 2819a747e4fSDavid du Colombier 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, 2829a747e4fSDavid du Colombier 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, 2839a747e4fSDavid du Colombier 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, 2849a747e4fSDavid du Colombier 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, 2859a747e4fSDavid du Colombier 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, 2869a747e4fSDavid du Colombier 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, 2879a747e4fSDavid du Colombier 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, 2889a747e4fSDavid du Colombier 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, 2899a747e4fSDavid du Colombier 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, 2909a747e4fSDavid du Colombier 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, 2919a747e4fSDavid du Colombier 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, 2929a747e4fSDavid du Colombier 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, 2939a747e4fSDavid du Colombier 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, 2949a747e4fSDavid du Colombier 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, 2959a747e4fSDavid du Colombier 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, 2969a747e4fSDavid du Colombier 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, 2979a747e4fSDavid du Colombier 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, 2989a747e4fSDavid du Colombier 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, 2999a747e4fSDavid du Colombier 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, 3009a747e4fSDavid du Colombier 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, 3019a747e4fSDavid du Colombier 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, 3029a747e4fSDavid du Colombier 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, 3039a747e4fSDavid du Colombier 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, 3049a747e4fSDavid du Colombier 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, 3059a747e4fSDavid du Colombier 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, 3069a747e4fSDavid du Colombier 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, 3079a747e4fSDavid du Colombier 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, 3089a747e4fSDavid du Colombier 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, 3099a747e4fSDavid du Colombier 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, 3109a747e4fSDavid du Colombier 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, 3119a747e4fSDavid du Colombier 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, 3129a747e4fSDavid du Colombier 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, 3139a747e4fSDavid du Colombier 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, 3149a747e4fSDavid du Colombier 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, 3159a747e4fSDavid du Colombier 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, 3169a747e4fSDavid du Colombier 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, 3179a747e4fSDavid du Colombier 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, 3189a747e4fSDavid du Colombier 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, 3199a747e4fSDavid du Colombier 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, 3209a747e4fSDavid du Colombier 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, 3219a747e4fSDavid du Colombier 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, 3229a747e4fSDavid du Colombier 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, 3239a747e4fSDavid du Colombier 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, 3249a747e4fSDavid du Colombier 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, 3259a747e4fSDavid du Colombier 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, 3269a747e4fSDavid du Colombier }; 3279a747e4fSDavid du Colombier static const u32 Te2[256] = { 3289a747e4fSDavid du Colombier 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, 3299a747e4fSDavid du Colombier 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, 3309a747e4fSDavid du Colombier 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, 3319a747e4fSDavid du Colombier 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, 3329a747e4fSDavid du Colombier 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, 3339a747e4fSDavid du Colombier 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, 3349a747e4fSDavid du Colombier 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, 3359a747e4fSDavid du Colombier 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, 3369a747e4fSDavid du Colombier 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, 3379a747e4fSDavid du Colombier 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, 3389a747e4fSDavid du Colombier 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, 3399a747e4fSDavid du Colombier 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, 3409a747e4fSDavid du Colombier 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, 3419a747e4fSDavid du Colombier 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, 3429a747e4fSDavid du Colombier 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, 3439a747e4fSDavid du Colombier 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, 3449a747e4fSDavid du Colombier 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, 3459a747e4fSDavid du Colombier 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, 3469a747e4fSDavid du Colombier 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, 3479a747e4fSDavid du Colombier 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, 3489a747e4fSDavid du Colombier 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, 3499a747e4fSDavid du Colombier 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, 3509a747e4fSDavid du Colombier 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, 3519a747e4fSDavid du Colombier 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, 3529a747e4fSDavid du Colombier 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, 3539a747e4fSDavid du Colombier 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, 3549a747e4fSDavid du Colombier 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, 3559a747e4fSDavid du Colombier 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, 3569a747e4fSDavid du Colombier 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, 3579a747e4fSDavid du Colombier 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, 3589a747e4fSDavid du Colombier 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, 3599a747e4fSDavid du Colombier 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, 3609a747e4fSDavid du Colombier 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, 3619a747e4fSDavid du Colombier 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, 3629a747e4fSDavid du Colombier 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, 3639a747e4fSDavid du Colombier 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, 3649a747e4fSDavid du Colombier 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, 3659a747e4fSDavid du Colombier 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, 3669a747e4fSDavid du Colombier 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, 3679a747e4fSDavid du Colombier 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, 3689a747e4fSDavid du Colombier 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, 3699a747e4fSDavid du Colombier 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, 3709a747e4fSDavid du Colombier 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, 3719a747e4fSDavid du Colombier 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, 3729a747e4fSDavid du Colombier 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, 3739a747e4fSDavid du Colombier 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, 3749a747e4fSDavid du Colombier 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, 3759a747e4fSDavid du Colombier 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, 3769a747e4fSDavid du Colombier 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, 3779a747e4fSDavid du Colombier 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, 3789a747e4fSDavid du Colombier 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, 3799a747e4fSDavid du Colombier 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, 3809a747e4fSDavid du Colombier 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, 3819a747e4fSDavid du Colombier 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, 3829a747e4fSDavid du Colombier 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, 3839a747e4fSDavid du Colombier 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, 3849a747e4fSDavid du Colombier 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, 3859a747e4fSDavid du Colombier 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, 3869a747e4fSDavid du Colombier 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, 3879a747e4fSDavid du Colombier 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, 3889a747e4fSDavid du Colombier 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, 3899a747e4fSDavid du Colombier 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, 3909a747e4fSDavid du Colombier 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, 3919a747e4fSDavid du Colombier 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, 3929a747e4fSDavid du Colombier }; 3939a747e4fSDavid du Colombier static const u32 Te3[256] = { 3949a747e4fSDavid du Colombier 3959a747e4fSDavid du Colombier 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, 3969a747e4fSDavid du Colombier 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, 3979a747e4fSDavid du Colombier 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, 3989a747e4fSDavid du Colombier 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, 3999a747e4fSDavid du Colombier 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, 4009a747e4fSDavid du Colombier 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, 4019a747e4fSDavid du Colombier 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, 4029a747e4fSDavid du Colombier 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, 4039a747e4fSDavid du Colombier 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, 4049a747e4fSDavid du Colombier 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, 4059a747e4fSDavid du Colombier 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, 4069a747e4fSDavid du Colombier 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, 4079a747e4fSDavid du Colombier 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, 4089a747e4fSDavid du Colombier 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, 4099a747e4fSDavid du Colombier 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, 4109a747e4fSDavid du Colombier 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, 4119a747e4fSDavid du Colombier 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, 4129a747e4fSDavid du Colombier 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, 4139a747e4fSDavid du Colombier 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, 4149a747e4fSDavid du Colombier 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, 4159a747e4fSDavid du Colombier 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, 4169a747e4fSDavid du Colombier 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, 4179a747e4fSDavid du Colombier 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, 4189a747e4fSDavid du Colombier 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, 4199a747e4fSDavid du Colombier 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, 4209a747e4fSDavid du Colombier 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, 4219a747e4fSDavid du Colombier 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, 4229a747e4fSDavid du Colombier 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, 4239a747e4fSDavid du Colombier 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, 4249a747e4fSDavid du Colombier 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, 4259a747e4fSDavid du Colombier 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, 4269a747e4fSDavid du Colombier 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, 4279a747e4fSDavid du Colombier 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, 4289a747e4fSDavid du Colombier 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, 4299a747e4fSDavid du Colombier 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, 4309a747e4fSDavid du Colombier 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, 4319a747e4fSDavid du Colombier 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, 4329a747e4fSDavid du Colombier 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, 4339a747e4fSDavid du Colombier 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, 4349a747e4fSDavid du Colombier 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, 4359a747e4fSDavid du Colombier 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, 4369a747e4fSDavid du Colombier 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, 4379a747e4fSDavid du Colombier 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, 4389a747e4fSDavid du Colombier 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, 4399a747e4fSDavid du Colombier 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, 4409a747e4fSDavid du Colombier 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, 4419a747e4fSDavid du Colombier 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, 4429a747e4fSDavid du Colombier 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, 4439a747e4fSDavid du Colombier 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, 4449a747e4fSDavid du Colombier 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, 4459a747e4fSDavid du Colombier 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, 4469a747e4fSDavid du Colombier 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, 4479a747e4fSDavid du Colombier 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, 4489a747e4fSDavid du Colombier 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, 4499a747e4fSDavid du Colombier 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, 4509a747e4fSDavid du Colombier 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, 4519a747e4fSDavid du Colombier 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, 4529a747e4fSDavid du Colombier 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, 4539a747e4fSDavid du Colombier 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, 4549a747e4fSDavid du Colombier 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, 4559a747e4fSDavid du Colombier 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, 4569a747e4fSDavid du Colombier 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, 4579a747e4fSDavid du Colombier 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, 4589a747e4fSDavid du Colombier 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, 4599a747e4fSDavid du Colombier }; 4609a747e4fSDavid du Colombier static const u8 Te4[256] = { 4619a747e4fSDavid du Colombier 0x63U, 0x7cU, 0x77U, 0x7bU, 4629a747e4fSDavid du Colombier 0xf2U, 0x6bU, 0x6fU, 0xc5U, 4639a747e4fSDavid du Colombier 0x30U, 0x01U, 0x67U, 0x2bU, 4649a747e4fSDavid du Colombier 0xfeU, 0xd7U, 0xabU, 0x76U, 4659a747e4fSDavid du Colombier 0xcaU, 0x82U, 0xc9U, 0x7dU, 4669a747e4fSDavid du Colombier 0xfaU, 0x59U, 0x47U, 0xf0U, 4679a747e4fSDavid du Colombier 0xadU, 0xd4U, 0xa2U, 0xafU, 4689a747e4fSDavid du Colombier 0x9cU, 0xa4U, 0x72U, 0xc0U, 4699a747e4fSDavid du Colombier 0xb7U, 0xfdU, 0x93U, 0x26U, 4709a747e4fSDavid du Colombier 0x36U, 0x3fU, 0xf7U, 0xccU, 4719a747e4fSDavid du Colombier 0x34U, 0xa5U, 0xe5U, 0xf1U, 4729a747e4fSDavid du Colombier 0x71U, 0xd8U, 0x31U, 0x15U, 4739a747e4fSDavid du Colombier 0x04U, 0xc7U, 0x23U, 0xc3U, 4749a747e4fSDavid du Colombier 0x18U, 0x96U, 0x05U, 0x9aU, 4759a747e4fSDavid du Colombier 0x07U, 0x12U, 0x80U, 0xe2U, 4769a747e4fSDavid du Colombier 0xebU, 0x27U, 0xb2U, 0x75U, 4779a747e4fSDavid du Colombier 0x09U, 0x83U, 0x2cU, 0x1aU, 4789a747e4fSDavid du Colombier 0x1bU, 0x6eU, 0x5aU, 0xa0U, 4799a747e4fSDavid du Colombier 0x52U, 0x3bU, 0xd6U, 0xb3U, 4809a747e4fSDavid du Colombier 0x29U, 0xe3U, 0x2fU, 0x84U, 4819a747e4fSDavid du Colombier 0x53U, 0xd1U, 0x00U, 0xedU, 4829a747e4fSDavid du Colombier 0x20U, 0xfcU, 0xb1U, 0x5bU, 4839a747e4fSDavid du Colombier 0x6aU, 0xcbU, 0xbeU, 0x39U, 4849a747e4fSDavid du Colombier 0x4aU, 0x4cU, 0x58U, 0xcfU, 4859a747e4fSDavid du Colombier 0xd0U, 0xefU, 0xaaU, 0xfbU, 4869a747e4fSDavid du Colombier 0x43U, 0x4dU, 0x33U, 0x85U, 4879a747e4fSDavid du Colombier 0x45U, 0xf9U, 0x02U, 0x7fU, 4889a747e4fSDavid du Colombier 0x50U, 0x3cU, 0x9fU, 0xa8U, 4899a747e4fSDavid du Colombier 0x51U, 0xa3U, 0x40U, 0x8fU, 4909a747e4fSDavid du Colombier 0x92U, 0x9dU, 0x38U, 0xf5U, 4919a747e4fSDavid du Colombier 0xbcU, 0xb6U, 0xdaU, 0x21U, 4929a747e4fSDavid du Colombier 0x10U, 0xffU, 0xf3U, 0xd2U, 4939a747e4fSDavid du Colombier 0xcdU, 0x0cU, 0x13U, 0xecU, 4949a747e4fSDavid du Colombier 0x5fU, 0x97U, 0x44U, 0x17U, 4959a747e4fSDavid du Colombier 0xc4U, 0xa7U, 0x7eU, 0x3dU, 4969a747e4fSDavid du Colombier 0x64U, 0x5dU, 0x19U, 0x73U, 4979a747e4fSDavid du Colombier 0x60U, 0x81U, 0x4fU, 0xdcU, 4989a747e4fSDavid du Colombier 0x22U, 0x2aU, 0x90U, 0x88U, 4999a747e4fSDavid du Colombier 0x46U, 0xeeU, 0xb8U, 0x14U, 5009a747e4fSDavid du Colombier 0xdeU, 0x5eU, 0x0bU, 0xdbU, 5019a747e4fSDavid du Colombier 0xe0U, 0x32U, 0x3aU, 0x0aU, 5029a747e4fSDavid du Colombier 0x49U, 0x06U, 0x24U, 0x5cU, 5039a747e4fSDavid du Colombier 0xc2U, 0xd3U, 0xacU, 0x62U, 5049a747e4fSDavid du Colombier 0x91U, 0x95U, 0xe4U, 0x79U, 5059a747e4fSDavid du Colombier 0xe7U, 0xc8U, 0x37U, 0x6dU, 5069a747e4fSDavid du Colombier 0x8dU, 0xd5U, 0x4eU, 0xa9U, 5079a747e4fSDavid du Colombier 0x6cU, 0x56U, 0xf4U, 0xeaU, 5089a747e4fSDavid du Colombier 0x65U, 0x7aU, 0xaeU, 0x08U, 5099a747e4fSDavid du Colombier 0xbaU, 0x78U, 0x25U, 0x2eU, 5109a747e4fSDavid du Colombier 0x1cU, 0xa6U, 0xb4U, 0xc6U, 5119a747e4fSDavid du Colombier 0xe8U, 0xddU, 0x74U, 0x1fU, 5129a747e4fSDavid du Colombier 0x4bU, 0xbdU, 0x8bU, 0x8aU, 5139a747e4fSDavid du Colombier 0x70U, 0x3eU, 0xb5U, 0x66U, 5149a747e4fSDavid du Colombier 0x48U, 0x03U, 0xf6U, 0x0eU, 5159a747e4fSDavid du Colombier 0x61U, 0x35U, 0x57U, 0xb9U, 5169a747e4fSDavid du Colombier 0x86U, 0xc1U, 0x1dU, 0x9eU, 5179a747e4fSDavid du Colombier 0xe1U, 0xf8U, 0x98U, 0x11U, 5189a747e4fSDavid du Colombier 0x69U, 0xd9U, 0x8eU, 0x94U, 5199a747e4fSDavid du Colombier 0x9bU, 0x1eU, 0x87U, 0xe9U, 5209a747e4fSDavid du Colombier 0xceU, 0x55U, 0x28U, 0xdfU, 5219a747e4fSDavid du Colombier 0x8cU, 0xa1U, 0x89U, 0x0dU, 5229a747e4fSDavid du Colombier 0xbfU, 0xe6U, 0x42U, 0x68U, 5239a747e4fSDavid du Colombier 0x41U, 0x99U, 0x2dU, 0x0fU, 5249a747e4fSDavid du Colombier 0xb0U, 0x54U, 0xbbU, 0x16U, 5259a747e4fSDavid du Colombier }; 5269a747e4fSDavid du Colombier static const u32 Td0[256] = { 5279a747e4fSDavid du Colombier 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, 5289a747e4fSDavid du Colombier 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, 5299a747e4fSDavid du Colombier 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, 5309a747e4fSDavid du Colombier 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, 5319a747e4fSDavid du Colombier 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, 5329a747e4fSDavid du Colombier 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, 5339a747e4fSDavid du Colombier 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, 5349a747e4fSDavid du Colombier 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, 5359a747e4fSDavid du Colombier 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, 5369a747e4fSDavid du Colombier 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, 5379a747e4fSDavid du Colombier 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, 5389a747e4fSDavid du Colombier 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, 5399a747e4fSDavid du Colombier 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, 5409a747e4fSDavid du Colombier 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, 5419a747e4fSDavid du Colombier 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, 5429a747e4fSDavid du Colombier 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, 5439a747e4fSDavid du Colombier 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, 5449a747e4fSDavid du Colombier 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, 5459a747e4fSDavid du Colombier 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, 5469a747e4fSDavid du Colombier 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, 5479a747e4fSDavid du Colombier 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, 5489a747e4fSDavid du Colombier 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, 5499a747e4fSDavid du Colombier 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, 5509a747e4fSDavid du Colombier 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, 5519a747e4fSDavid du Colombier 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, 5529a747e4fSDavid du Colombier 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, 5539a747e4fSDavid du Colombier 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, 5549a747e4fSDavid du Colombier 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, 5559a747e4fSDavid du Colombier 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, 5569a747e4fSDavid du Colombier 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, 5579a747e4fSDavid du Colombier 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, 5589a747e4fSDavid du Colombier 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, 5599a747e4fSDavid du Colombier 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, 5609a747e4fSDavid du Colombier 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, 5619a747e4fSDavid du Colombier 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, 5629a747e4fSDavid du Colombier 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, 5639a747e4fSDavid du Colombier 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, 5649a747e4fSDavid du Colombier 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, 5659a747e4fSDavid du Colombier 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, 5669a747e4fSDavid du Colombier 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, 5679a747e4fSDavid du Colombier 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, 5689a747e4fSDavid du Colombier 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, 5699a747e4fSDavid du Colombier 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, 5709a747e4fSDavid du Colombier 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, 5719a747e4fSDavid du Colombier 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, 5729a747e4fSDavid du Colombier 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, 5739a747e4fSDavid du Colombier 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, 5749a747e4fSDavid du Colombier 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, 5759a747e4fSDavid du Colombier 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, 5769a747e4fSDavid du Colombier 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, 5779a747e4fSDavid du Colombier 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, 5789a747e4fSDavid du Colombier 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, 5799a747e4fSDavid du Colombier 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, 5809a747e4fSDavid du Colombier 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, 5819a747e4fSDavid du Colombier 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, 5829a747e4fSDavid du Colombier 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, 5839a747e4fSDavid du Colombier 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, 5849a747e4fSDavid du Colombier 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, 5859a747e4fSDavid du Colombier 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, 5869a747e4fSDavid du Colombier 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, 5879a747e4fSDavid du Colombier 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, 5889a747e4fSDavid du Colombier 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, 5899a747e4fSDavid du Colombier 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, 5909a747e4fSDavid du Colombier 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, 5919a747e4fSDavid du Colombier }; 5929a747e4fSDavid du Colombier static const u32 Td1[256] = { 5939a747e4fSDavid du Colombier 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, 5949a747e4fSDavid du Colombier 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U, 5959a747e4fSDavid du Colombier 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU, 5969a747e4fSDavid du Colombier 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U, 5979a747e4fSDavid du Colombier 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, 5989a747e4fSDavid du Colombier 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, 5999a747e4fSDavid du Colombier 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U, 6009a747e4fSDavid du Colombier 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U, 6019a747e4fSDavid du Colombier 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U, 6029a747e4fSDavid du Colombier 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, 6039a747e4fSDavid du Colombier 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, 6049a747e4fSDavid du Colombier 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, 6059a747e4fSDavid du Colombier 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U, 6069a747e4fSDavid du Colombier 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU, 6079a747e4fSDavid du Colombier 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, 6089a747e4fSDavid du Colombier 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, 6099a747e4fSDavid du Colombier 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, 6109a747e4fSDavid du Colombier 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU, 6119a747e4fSDavid du Colombier 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU, 6129a747e4fSDavid du Colombier 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, 6139a747e4fSDavid du Colombier 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, 6149a747e4fSDavid du Colombier 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U, 6159a747e4fSDavid du Colombier 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU, 6169a747e4fSDavid du Colombier 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU, 6179a747e4fSDavid du Colombier 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, 6189a747e4fSDavid du Colombier 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, 6199a747e4fSDavid du Colombier 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U, 6209a747e4fSDavid du Colombier 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU, 6219a747e4fSDavid du Colombier 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U, 6229a747e4fSDavid du Colombier 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, 6239a747e4fSDavid du Colombier 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, 6249a747e4fSDavid du Colombier 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, 6259a747e4fSDavid du Colombier 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U, 6269a747e4fSDavid du Colombier 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU, 6279a747e4fSDavid du Colombier 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, 6289a747e4fSDavid du Colombier 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, 6299a747e4fSDavid du Colombier 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, 6309a747e4fSDavid du Colombier 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U, 6319a747e4fSDavid du Colombier 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U, 6329a747e4fSDavid du Colombier 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, 6339a747e4fSDavid du Colombier 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, 6349a747e4fSDavid du Colombier 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, 6359a747e4fSDavid du Colombier 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U, 6369a747e4fSDavid du Colombier 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU, 6379a747e4fSDavid du Colombier 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, 6389a747e4fSDavid du Colombier 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, 6399a747e4fSDavid du Colombier 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, 6409a747e4fSDavid du Colombier 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U, 6419a747e4fSDavid du Colombier 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU, 6429a747e4fSDavid du Colombier 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, 6439a747e4fSDavid du Colombier 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, 6449a747e4fSDavid du Colombier 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, 6459a747e4fSDavid du Colombier 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U, 6469a747e4fSDavid du Colombier 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U, 6479a747e4fSDavid du Colombier 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, 6489a747e4fSDavid du Colombier 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, 6499a747e4fSDavid du Colombier 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, 6509a747e4fSDavid du Colombier 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U, 6519a747e4fSDavid du Colombier 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U, 6529a747e4fSDavid du Colombier 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, 6539a747e4fSDavid du Colombier 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, 6549a747e4fSDavid du Colombier 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, 6559a747e4fSDavid du Colombier 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U, 6569a747e4fSDavid du Colombier 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U, 6579a747e4fSDavid du Colombier }; 6589a747e4fSDavid du Colombier static const u32 Td2[256] = { 6599a747e4fSDavid du Colombier 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, 6609a747e4fSDavid du Colombier 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, 6619a747e4fSDavid du Colombier 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U, 6629a747e4fSDavid du Colombier 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U, 6639a747e4fSDavid du Colombier 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, 6649a747e4fSDavid du Colombier 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, 6659a747e4fSDavid du Colombier 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, 6669a747e4fSDavid du Colombier 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U, 6679a747e4fSDavid du Colombier 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U, 6689a747e4fSDavid du Colombier 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, 6699a747e4fSDavid du Colombier 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, 6709a747e4fSDavid du Colombier 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, 6719a747e4fSDavid du Colombier 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU, 6729a747e4fSDavid du Colombier 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U, 6739a747e4fSDavid du Colombier 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, 6749a747e4fSDavid du Colombier 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, 6759a747e4fSDavid du Colombier 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, 6769a747e4fSDavid du Colombier 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, 6779a747e4fSDavid du Colombier 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, 6789a747e4fSDavid du Colombier 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, 6799a747e4fSDavid du Colombier 6809a747e4fSDavid du Colombier 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, 6819a747e4fSDavid du Colombier 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, 6829a747e4fSDavid du Colombier 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, 6839a747e4fSDavid du Colombier 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U, 6849a747e4fSDavid du Colombier 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, 6859a747e4fSDavid du Colombier 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, 6869a747e4fSDavid du Colombier 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU, 6879a747e4fSDavid du Colombier 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U, 6889a747e4fSDavid du Colombier 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU, 6899a747e4fSDavid du Colombier 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, 6909a747e4fSDavid du Colombier 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, 6919a747e4fSDavid du Colombier 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, 6929a747e4fSDavid du Colombier 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU, 6939a747e4fSDavid du Colombier 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU, 6949a747e4fSDavid du Colombier 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, 6959a747e4fSDavid du Colombier 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, 6969a747e4fSDavid du Colombier 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, 6979a747e4fSDavid du Colombier 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U, 6989a747e4fSDavid du Colombier 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U, 6999a747e4fSDavid du Colombier 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, 7009a747e4fSDavid du Colombier 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, 7019a747e4fSDavid du Colombier 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, 7029a747e4fSDavid du Colombier 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU, 7039a747e4fSDavid du Colombier 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U, 7049a747e4fSDavid du Colombier 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, 7059a747e4fSDavid du Colombier 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, 7069a747e4fSDavid du Colombier 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, 7079a747e4fSDavid du Colombier 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U, 7089a747e4fSDavid du Colombier 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U, 7099a747e4fSDavid du Colombier 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, 7109a747e4fSDavid du Colombier 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, 7119a747e4fSDavid du Colombier 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, 7129a747e4fSDavid du Colombier 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U, 7139a747e4fSDavid du Colombier 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U, 7149a747e4fSDavid du Colombier 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, 7159a747e4fSDavid du Colombier 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, 7169a747e4fSDavid du Colombier 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, 7179a747e4fSDavid du Colombier 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U, 7189a747e4fSDavid du Colombier 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U, 7199a747e4fSDavid du Colombier 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, 7209a747e4fSDavid du Colombier 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, 7219a747e4fSDavid du Colombier 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, 7229a747e4fSDavid du Colombier 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U, 7239a747e4fSDavid du Colombier 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U, 7249a747e4fSDavid du Colombier }; 7259a747e4fSDavid du Colombier static const u32 Td3[256] = { 7269a747e4fSDavid du Colombier 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, 7279a747e4fSDavid du Colombier 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, 7289a747e4fSDavid du Colombier 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U, 7299a747e4fSDavid du Colombier 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U, 7309a747e4fSDavid du Colombier 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, 7319a747e4fSDavid du Colombier 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, 7329a747e4fSDavid du Colombier 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, 7339a747e4fSDavid du Colombier 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU, 7349a747e4fSDavid du Colombier 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U, 7359a747e4fSDavid du Colombier 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, 7369a747e4fSDavid du Colombier 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, 7379a747e4fSDavid du Colombier 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, 7389a747e4fSDavid du Colombier 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U, 7399a747e4fSDavid du Colombier 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U, 7409a747e4fSDavid du Colombier 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, 7419a747e4fSDavid du Colombier 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, 7429a747e4fSDavid du Colombier 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, 7439a747e4fSDavid du Colombier 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U, 7449a747e4fSDavid du Colombier 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U, 7459a747e4fSDavid du Colombier 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, 7469a747e4fSDavid du Colombier 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, 7479a747e4fSDavid du Colombier 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, 7489a747e4fSDavid du Colombier 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U, 7499a747e4fSDavid du Colombier 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U, 7509a747e4fSDavid du Colombier 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, 7519a747e4fSDavid du Colombier 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, 7529a747e4fSDavid du Colombier 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U, 7539a747e4fSDavid du Colombier 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U, 7549a747e4fSDavid du Colombier 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU, 7559a747e4fSDavid du Colombier 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, 7569a747e4fSDavid du Colombier 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, 7579a747e4fSDavid du Colombier 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, 7589a747e4fSDavid du Colombier 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U, 7599a747e4fSDavid du Colombier 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU, 7609a747e4fSDavid du Colombier 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, 7619a747e4fSDavid du Colombier 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, 7629a747e4fSDavid du Colombier 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, 7639a747e4fSDavid du Colombier 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U, 7649a747e4fSDavid du Colombier 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U, 7659a747e4fSDavid du Colombier 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, 7669a747e4fSDavid du Colombier 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, 7679a747e4fSDavid du Colombier 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, 7689a747e4fSDavid du Colombier 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U, 7699a747e4fSDavid du Colombier 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U, 7709a747e4fSDavid du Colombier 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, 7719a747e4fSDavid du Colombier 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, 7729a747e4fSDavid du Colombier 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, 7739a747e4fSDavid du Colombier 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU, 7749a747e4fSDavid du Colombier 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U, 7759a747e4fSDavid du Colombier 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, 7769a747e4fSDavid du Colombier 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, 7779a747e4fSDavid du Colombier 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, 7789a747e4fSDavid du Colombier 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U, 7799a747e4fSDavid du Colombier 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U, 7809a747e4fSDavid du Colombier 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, 7819a747e4fSDavid du Colombier 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, 7829a747e4fSDavid du Colombier 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, 7839a747e4fSDavid du Colombier 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU, 7849a747e4fSDavid du Colombier 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U, 7859a747e4fSDavid du Colombier 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, 7869a747e4fSDavid du Colombier 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, 7879a747e4fSDavid du Colombier 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, 7889a747e4fSDavid du Colombier 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U, 7899a747e4fSDavid du Colombier 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U, 7909a747e4fSDavid du Colombier }; 7919a747e4fSDavid du Colombier static const u8 Td4[256] = { 7929a747e4fSDavid du Colombier 0x52U, 0x09U, 0x6aU, 0xd5U, 7939a747e4fSDavid du Colombier 0x30U, 0x36U, 0xa5U, 0x38U, 7949a747e4fSDavid du Colombier 0xbfU, 0x40U, 0xa3U, 0x9eU, 7959a747e4fSDavid du Colombier 0x81U, 0xf3U, 0xd7U, 0xfbU, 7969a747e4fSDavid du Colombier 0x7cU, 0xe3U, 0x39U, 0x82U, 7979a747e4fSDavid du Colombier 0x9bU, 0x2fU, 0xffU, 0x87U, 7989a747e4fSDavid du Colombier 0x34U, 0x8eU, 0x43U, 0x44U, 7999a747e4fSDavid du Colombier 0xc4U, 0xdeU, 0xe9U, 0xcbU, 8009a747e4fSDavid du Colombier 0x54U, 0x7bU, 0x94U, 0x32U, 8019a747e4fSDavid du Colombier 0xa6U, 0xc2U, 0x23U, 0x3dU, 8029a747e4fSDavid du Colombier 0xeeU, 0x4cU, 0x95U, 0x0bU, 8039a747e4fSDavid du Colombier 0x42U, 0xfaU, 0xc3U, 0x4eU, 8049a747e4fSDavid du Colombier 0x08U, 0x2eU, 0xa1U, 0x66U, 8059a747e4fSDavid du Colombier 0x28U, 0xd9U, 0x24U, 0xb2U, 8069a747e4fSDavid du Colombier 0x76U, 0x5bU, 0xa2U, 0x49U, 8079a747e4fSDavid du Colombier 0x6dU, 0x8bU, 0xd1U, 0x25U, 8089a747e4fSDavid du Colombier 0x72U, 0xf8U, 0xf6U, 0x64U, 8099a747e4fSDavid du Colombier 0x86U, 0x68U, 0x98U, 0x16U, 8109a747e4fSDavid du Colombier 0xd4U, 0xa4U, 0x5cU, 0xccU, 8119a747e4fSDavid du Colombier 0x5dU, 0x65U, 0xb6U, 0x92U, 8129a747e4fSDavid du Colombier 0x6cU, 0x70U, 0x48U, 0x50U, 8139a747e4fSDavid du Colombier 0xfdU, 0xedU, 0xb9U, 0xdaU, 8149a747e4fSDavid du Colombier 0x5eU, 0x15U, 0x46U, 0x57U, 8159a747e4fSDavid du Colombier 0xa7U, 0x8dU, 0x9dU, 0x84U, 8169a747e4fSDavid du Colombier 0x90U, 0xd8U, 0xabU, 0x00U, 8179a747e4fSDavid du Colombier 0x8cU, 0xbcU, 0xd3U, 0x0aU, 8189a747e4fSDavid du Colombier 0xf7U, 0xe4U, 0x58U, 0x05U, 8199a747e4fSDavid du Colombier 0xb8U, 0xb3U, 0x45U, 0x06U, 8209a747e4fSDavid du Colombier 0xd0U, 0x2cU, 0x1eU, 0x8fU, 8219a747e4fSDavid du Colombier 0xcaU, 0x3fU, 0x0fU, 0x02U, 8229a747e4fSDavid du Colombier 0xc1U, 0xafU, 0xbdU, 0x03U, 8239a747e4fSDavid du Colombier 0x01U, 0x13U, 0x8aU, 0x6bU, 8249a747e4fSDavid du Colombier 0x3aU, 0x91U, 0x11U, 0x41U, 8259a747e4fSDavid du Colombier 0x4fU, 0x67U, 0xdcU, 0xeaU, 8269a747e4fSDavid du Colombier 0x97U, 0xf2U, 0xcfU, 0xceU, 8279a747e4fSDavid du Colombier 0xf0U, 0xb4U, 0xe6U, 0x73U, 8289a747e4fSDavid du Colombier 0x96U, 0xacU, 0x74U, 0x22U, 8299a747e4fSDavid du Colombier 0xe7U, 0xadU, 0x35U, 0x85U, 8309a747e4fSDavid du Colombier 0xe2U, 0xf9U, 0x37U, 0xe8U, 8319a747e4fSDavid du Colombier 0x1cU, 0x75U, 0xdfU, 0x6eU, 8329a747e4fSDavid du Colombier 0x47U, 0xf1U, 0x1aU, 0x71U, 8339a747e4fSDavid du Colombier 0x1dU, 0x29U, 0xc5U, 0x89U, 8349a747e4fSDavid du Colombier 0x6fU, 0xb7U, 0x62U, 0x0eU, 8359a747e4fSDavid du Colombier 0xaaU, 0x18U, 0xbeU, 0x1bU, 8369a747e4fSDavid du Colombier 0xfcU, 0x56U, 0x3eU, 0x4bU, 8379a747e4fSDavid du Colombier 0xc6U, 0xd2U, 0x79U, 0x20U, 8389a747e4fSDavid du Colombier 0x9aU, 0xdbU, 0xc0U, 0xfeU, 8399a747e4fSDavid du Colombier 0x78U, 0xcdU, 0x5aU, 0xf4U, 8409a747e4fSDavid du Colombier 0x1fU, 0xddU, 0xa8U, 0x33U, 8419a747e4fSDavid du Colombier 0x88U, 0x07U, 0xc7U, 0x31U, 8429a747e4fSDavid du Colombier 0xb1U, 0x12U, 0x10U, 0x59U, 8439a747e4fSDavid du Colombier 0x27U, 0x80U, 0xecU, 0x5fU, 8449a747e4fSDavid du Colombier 0x60U, 0x51U, 0x7fU, 0xa9U, 8459a747e4fSDavid du Colombier 0x19U, 0xb5U, 0x4aU, 0x0dU, 8469a747e4fSDavid du Colombier 0x2dU, 0xe5U, 0x7aU, 0x9fU, 8479a747e4fSDavid du Colombier 0x93U, 0xc9U, 0x9cU, 0xefU, 8489a747e4fSDavid du Colombier 0xa0U, 0xe0U, 0x3bU, 0x4dU, 8499a747e4fSDavid du Colombier 0xaeU, 0x2aU, 0xf5U, 0xb0U, 8509a747e4fSDavid du Colombier 0xc8U, 0xebU, 0xbbU, 0x3cU, 8519a747e4fSDavid du Colombier 0x83U, 0x53U, 0x99U, 0x61U, 8529a747e4fSDavid du Colombier 0x17U, 0x2bU, 0x04U, 0x7eU, 8539a747e4fSDavid du Colombier 0xbaU, 0x77U, 0xd6U, 0x26U, 8549a747e4fSDavid du Colombier 0xe1U, 0x69U, 0x14U, 0x63U, 8559a747e4fSDavid du Colombier 0x55U, 0x21U, 0x0cU, 0x7dU, 8569a747e4fSDavid du Colombier }; 8579a747e4fSDavid du Colombier static const u32 rcon[] = { 8589a747e4fSDavid du Colombier 0x01000000, 0x02000000, 0x04000000, 0x08000000, 8599a747e4fSDavid du Colombier 0x10000000, 0x20000000, 0x40000000, 0x80000000, 860*fc4036bfSDavid du Colombier 0x1B000000, 0x36000000, 861*fc4036bfSDavid du Colombier /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ 8629a747e4fSDavid du Colombier }; 8639a747e4fSDavid du Colombier 8649a747e4fSDavid du Colombier #define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00) 8659a747e4fSDavid du Colombier 8669a747e4fSDavid du Colombier #ifdef _MSC_VER 8679a747e4fSDavid du Colombier #define GETU32(p) SWAP(*((u32 *)(p))) 8689a747e4fSDavid du Colombier #define PUTU32(ct, st) { *((u32 *)(ct)) = SWAP((st)); } 8699a747e4fSDavid du Colombier #else 870*fc4036bfSDavid du Colombier #define GETU32(pt) (((u32)(pt)[0]<<24) ^ ((u32)(pt)[1]<<16) ^ \ 871*fc4036bfSDavid du Colombier ((u32)(pt)[2]<<8) ^ ((u32)(pt)[3])) 872*fc4036bfSDavid du Colombier #define PUTU32(ct, st) { (ct)[0] = (u8)((st)>>24); (ct)[1] = (u8)((st)>>16); \ 873*fc4036bfSDavid du Colombier (ct)[2] = (u8)((st)>> 8); (ct)[3] = (u8)(st); } 8749a747e4fSDavid du Colombier #endif 8759a747e4fSDavid du Colombier 876*fc4036bfSDavid du Colombier /* 8779a747e4fSDavid du Colombier * Expand the cipher key into the encryption key schedule. 8789a747e4fSDavid du Colombier * 8799a747e4fSDavid du Colombier * @return the number of rounds for the given cipher key size. 8809a747e4fSDavid du Colombier */ 881*fc4036bfSDavid du Colombier static int 882*fc4036bfSDavid du Colombier rijndaelKeySetupEnc(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) 883*fc4036bfSDavid du Colombier { 8849a747e4fSDavid du Colombier int i = 0; 8859a747e4fSDavid du Colombier u32 temp; 8869a747e4fSDavid du Colombier 8879a747e4fSDavid du Colombier rk[0] = GETU32(cipherKey ); 8889a747e4fSDavid du Colombier rk[1] = GETU32(cipherKey + 4); 8899a747e4fSDavid du Colombier rk[2] = GETU32(cipherKey + 8); 8909a747e4fSDavid du Colombier rk[3] = GETU32(cipherKey + 12); 8919a747e4fSDavid du Colombier if (keyBits == 128) { 8929a747e4fSDavid du Colombier for (;;) { 8939a747e4fSDavid du Colombier temp = rk[3]; 8949a747e4fSDavid du Colombier rk[4] = rk[0] ^ 8959a747e4fSDavid du Colombier (Te4[(temp >> 16) & 0xff] << 24) ^ 8969a747e4fSDavid du Colombier (Te4[(temp >> 8) & 0xff] << 16) ^ 8979a747e4fSDavid du Colombier (Te4[(temp ) & 0xff] << 8) ^ 8989a747e4fSDavid du Colombier (Te4[(temp >> 24) ] ) ^ 8999a747e4fSDavid du Colombier rcon[i]; 9009a747e4fSDavid du Colombier rk[5] = rk[1] ^ rk[4]; 9019a747e4fSDavid du Colombier rk[6] = rk[2] ^ rk[5]; 9029a747e4fSDavid du Colombier rk[7] = rk[3] ^ rk[6]; 9039a747e4fSDavid du Colombier if (++i == 10) { 9049a747e4fSDavid du Colombier return 10; 9059a747e4fSDavid du Colombier } 9069a747e4fSDavid du Colombier rk += 4; 9079a747e4fSDavid du Colombier } 9089a747e4fSDavid du Colombier } 9099a747e4fSDavid du Colombier rk[4] = GETU32(cipherKey + 16); 9109a747e4fSDavid du Colombier rk[5] = GETU32(cipherKey + 20); 9119a747e4fSDavid du Colombier if (keyBits == 192) { 9129a747e4fSDavid du Colombier for (;;) { 9139a747e4fSDavid du Colombier temp = rk[ 5]; 9149a747e4fSDavid du Colombier rk[ 6] = rk[ 0] ^ 9159a747e4fSDavid du Colombier (Te4[(temp >> 16) & 0xff] << 24) ^ 9169a747e4fSDavid du Colombier (Te4[(temp >> 8) & 0xff] << 16) ^ 9179a747e4fSDavid du Colombier (Te4[(temp ) & 0xff] << 8) ^ 9189a747e4fSDavid du Colombier (Te4[(temp >> 24) ] ) ^ 9199a747e4fSDavid du Colombier rcon[i]; 9209a747e4fSDavid du Colombier rk[ 7] = rk[ 1] ^ rk[ 6]; 9219a747e4fSDavid du Colombier rk[ 8] = rk[ 2] ^ rk[ 7]; 9229a747e4fSDavid du Colombier rk[ 9] = rk[ 3] ^ rk[ 8]; 9239a747e4fSDavid du Colombier if (++i == 8) { 9249a747e4fSDavid du Colombier return 12; 9259a747e4fSDavid du Colombier } 9269a747e4fSDavid du Colombier rk[10] = rk[ 4] ^ rk[ 9]; 9279a747e4fSDavid du Colombier rk[11] = rk[ 5] ^ rk[10]; 9289a747e4fSDavid du Colombier rk += 6; 9299a747e4fSDavid du Colombier } 9309a747e4fSDavid du Colombier } 9319a747e4fSDavid du Colombier rk[6] = GETU32(cipherKey + 24); 9329a747e4fSDavid du Colombier rk[7] = GETU32(cipherKey + 28); 9339a747e4fSDavid du Colombier if (keyBits == 256) { 9349a747e4fSDavid du Colombier for (;;) { 9359a747e4fSDavid du Colombier temp = rk[ 7]; 9369a747e4fSDavid du Colombier rk[ 8] = rk[ 0] ^ 9379a747e4fSDavid du Colombier (Te4[(temp >> 16) & 0xff] << 24) ^ 9389a747e4fSDavid du Colombier (Te4[(temp >> 8) & 0xff] << 16) ^ 9399a747e4fSDavid du Colombier (Te4[(temp ) & 0xff] << 8) ^ 9409a747e4fSDavid du Colombier (Te4[(temp >> 24) ] ) ^ 9419a747e4fSDavid du Colombier rcon[i]; 9429a747e4fSDavid du Colombier rk[ 9] = rk[ 1] ^ rk[ 8]; 9439a747e4fSDavid du Colombier rk[10] = rk[ 2] ^ rk[ 9]; 9449a747e4fSDavid du Colombier rk[11] = rk[ 3] ^ rk[10]; 9459a747e4fSDavid du Colombier if (++i == 7) { 9469a747e4fSDavid du Colombier return 14; 9479a747e4fSDavid du Colombier } 9489a747e4fSDavid du Colombier temp = rk[11]; 9499a747e4fSDavid du Colombier rk[12] = rk[ 4] ^ 9509a747e4fSDavid du Colombier (Te4[(temp >> 24) ] << 24) ^ 9519a747e4fSDavid du Colombier (Te4[(temp >> 16) & 0xff] << 16) ^ 9529a747e4fSDavid du Colombier (Te4[(temp >> 8) & 0xff] << 8) ^ 9539a747e4fSDavid du Colombier (Te4[(temp ) & 0xff] ); 9549a747e4fSDavid du Colombier rk[13] = rk[ 5] ^ rk[12]; 9559a747e4fSDavid du Colombier rk[14] = rk[ 6] ^ rk[13]; 9569a747e4fSDavid du Colombier rk[15] = rk[ 7] ^ rk[14]; 9579a747e4fSDavid du Colombier rk += 8; 9589a747e4fSDavid du Colombier } 9599a747e4fSDavid du Colombier } 9609a747e4fSDavid du Colombier return 0; 9619a747e4fSDavid du Colombier } 9629a747e4fSDavid du Colombier 9639a747e4fSDavid du Colombier /** 9649a747e4fSDavid du Colombier * Expand the cipher key into the decryption key schedule. 9659a747e4fSDavid du Colombier * 9669a747e4fSDavid du Colombier * @return the number of rounds for the given cipher key size. 9679a747e4fSDavid du Colombier */ 968*fc4036bfSDavid du Colombier static int 969*fc4036bfSDavid du Colombier rijndaelKeySetupDec(u32 rk[/* 4*(Nr + 1) */], const u8 cipherKey[], int keyBits) 970*fc4036bfSDavid du Colombier { 9719a747e4fSDavid du Colombier int Nr, i, j; 9729a747e4fSDavid du Colombier u32 temp; 9739a747e4fSDavid du Colombier 9749a747e4fSDavid du Colombier /* expand the cipher key: */ 9759a747e4fSDavid du Colombier Nr = rijndaelKeySetupEnc(rk, cipherKey, keyBits); 9769a747e4fSDavid du Colombier /* invert the order of the round keys: */ 9779a747e4fSDavid du Colombier for (i = 0, j = 4*Nr; i < j; i += 4, j -= 4) { 9789a747e4fSDavid du Colombier temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp; 9799a747e4fSDavid du Colombier temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp; 9809a747e4fSDavid du Colombier temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp; 9819a747e4fSDavid du Colombier temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp; 9829a747e4fSDavid du Colombier } 983*fc4036bfSDavid du Colombier /* 984*fc4036bfSDavid du Colombier * apply the inverse MixColumn transform to all round keys 985*fc4036bfSDavid du Colombier * but the first and the last: 986*fc4036bfSDavid du Colombier */ 9879a747e4fSDavid du Colombier for (i = 1; i < Nr; i++) { 9889a747e4fSDavid du Colombier rk += 4; 9899a747e4fSDavid du Colombier rk[0] = 9909a747e4fSDavid du Colombier Td0[Te4[(rk[0] >> 24) ]] ^ 9919a747e4fSDavid du Colombier Td1[Te4[(rk[0] >> 16) & 0xff]] ^ 9929a747e4fSDavid du Colombier Td2[Te4[(rk[0] >> 8) & 0xff]] ^ 9939a747e4fSDavid du Colombier Td3[Te4[(rk[0] ) & 0xff]]; 9949a747e4fSDavid du Colombier rk[1] = 9959a747e4fSDavid du Colombier Td0[Te4[(rk[1] >> 24) ]] ^ 9969a747e4fSDavid du Colombier Td1[Te4[(rk[1] >> 16) & 0xff]] ^ 9979a747e4fSDavid du Colombier Td2[Te4[(rk[1] >> 8) & 0xff]] ^ 9989a747e4fSDavid du Colombier Td3[Te4[(rk[1] ) & 0xff]]; 9999a747e4fSDavid du Colombier rk[2] = 10009a747e4fSDavid du Colombier Td0[Te4[(rk[2] >> 24) ]] ^ 10019a747e4fSDavid du Colombier Td1[Te4[(rk[2] >> 16) & 0xff]] ^ 10029a747e4fSDavid du Colombier Td2[Te4[(rk[2] >> 8) & 0xff]] ^ 10039a747e4fSDavid du Colombier Td3[Te4[(rk[2] ) & 0xff]]; 10049a747e4fSDavid du Colombier rk[3] = 10059a747e4fSDavid du Colombier Td0[Te4[(rk[3] >> 24) ]] ^ 10069a747e4fSDavid du Colombier Td1[Te4[(rk[3] >> 16) & 0xff]] ^ 10079a747e4fSDavid du Colombier Td2[Te4[(rk[3] >> 8) & 0xff]] ^ 10089a747e4fSDavid du Colombier Td3[Te4[(rk[3] ) & 0xff]]; 10099a747e4fSDavid du Colombier } 10109a747e4fSDavid du Colombier return Nr; 10119a747e4fSDavid du Colombier } 10129a747e4fSDavid du Colombier 1013*fc4036bfSDavid du Colombier static void 1014*fc4036bfSDavid du Colombier rijndaelEncrypt(const u32 rk[/* 4*(Nr + 1) */], int Nr, const u8 pt[16], 1015*fc4036bfSDavid du Colombier u8 ct[16]) 1016*fc4036bfSDavid du Colombier { 10179a747e4fSDavid du Colombier u32 s0, s1, s2, s3, t0, t1, t2, t3; 10189a747e4fSDavid du Colombier #ifndef FULL_UNROLL 10199a747e4fSDavid du Colombier int r; 10209a747e4fSDavid du Colombier #endif /* ?FULL_UNROLL */ 10219a747e4fSDavid du Colombier 10229a747e4fSDavid du Colombier /* 10239a747e4fSDavid du Colombier * map byte array block to cipher state 10249a747e4fSDavid du Colombier * and add initial round key: 10259a747e4fSDavid du Colombier */ 10269a747e4fSDavid du Colombier s0 = GETU32(pt ) ^ rk[0]; 10279a747e4fSDavid du Colombier s1 = GETU32(pt + 4) ^ rk[1]; 10289a747e4fSDavid du Colombier s2 = GETU32(pt + 8) ^ rk[2]; 10299a747e4fSDavid du Colombier s3 = GETU32(pt + 12) ^ rk[3]; 10309a747e4fSDavid du Colombier #ifdef FULL_UNROLL 10319a747e4fSDavid du Colombier /* round 1: */ 10329a747e4fSDavid du Colombier t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4]; 10339a747e4fSDavid du Colombier t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5]; 10349a747e4fSDavid du Colombier t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6]; 10359a747e4fSDavid du Colombier t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7]; 10369a747e4fSDavid du Colombier /* round 2: */ 10379a747e4fSDavid du Colombier s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8]; 10389a747e4fSDavid du Colombier s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9]; 10399a747e4fSDavid du Colombier s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10]; 10409a747e4fSDavid du Colombier s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11]; 10419a747e4fSDavid du Colombier /* round 3: */ 10429a747e4fSDavid du Colombier t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12]; 10439a747e4fSDavid du Colombier t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13]; 10449a747e4fSDavid du Colombier t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14]; 10459a747e4fSDavid du Colombier t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15]; 10469a747e4fSDavid du Colombier /* round 4: */ 10479a747e4fSDavid du Colombier s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16]; 10489a747e4fSDavid du Colombier s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17]; 10499a747e4fSDavid du Colombier s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18]; 10509a747e4fSDavid du Colombier s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19]; 10519a747e4fSDavid du Colombier /* round 5: */ 10529a747e4fSDavid du Colombier t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20]; 10539a747e4fSDavid du Colombier t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21]; 10549a747e4fSDavid du Colombier t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22]; 10559a747e4fSDavid du Colombier t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23]; 10569a747e4fSDavid du Colombier /* round 6: */ 10579a747e4fSDavid du Colombier s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24]; 10589a747e4fSDavid du Colombier s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25]; 10599a747e4fSDavid du Colombier s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26]; 10609a747e4fSDavid du Colombier s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27]; 10619a747e4fSDavid du Colombier /* round 7: */ 10629a747e4fSDavid du Colombier t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28]; 10639a747e4fSDavid du Colombier t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29]; 10649a747e4fSDavid du Colombier t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30]; 10659a747e4fSDavid du Colombier t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31]; 10669a747e4fSDavid du Colombier /* round 8: */ 10679a747e4fSDavid du Colombier s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32]; 10689a747e4fSDavid du Colombier s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33]; 10699a747e4fSDavid du Colombier s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34]; 10709a747e4fSDavid du Colombier s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35]; 10719a747e4fSDavid du Colombier /* round 9: */ 10729a747e4fSDavid du Colombier t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36]; 10739a747e4fSDavid du Colombier t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37]; 10749a747e4fSDavid du Colombier t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38]; 10759a747e4fSDavid du Colombier t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39]; 10769a747e4fSDavid du Colombier if (Nr > 10) { 10779a747e4fSDavid du Colombier /* round 10: */ 10789a747e4fSDavid du Colombier s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40]; 10799a747e4fSDavid du Colombier s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41]; 10809a747e4fSDavid du Colombier s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42]; 10819a747e4fSDavid du Colombier s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43]; 10829a747e4fSDavid du Colombier /* round 11: */ 10839a747e4fSDavid du Colombier t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44]; 10849a747e4fSDavid du Colombier t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45]; 10859a747e4fSDavid du Colombier t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46]; 10869a747e4fSDavid du Colombier t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47]; 10879a747e4fSDavid du Colombier if (Nr > 12) { 10889a747e4fSDavid du Colombier /* round 12: */ 10899a747e4fSDavid du Colombier s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48]; 10909a747e4fSDavid du Colombier s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49]; 10919a747e4fSDavid du Colombier s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50]; 10929a747e4fSDavid du Colombier s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51]; 10939a747e4fSDavid du Colombier /* round 13: */ 10949a747e4fSDavid du Colombier t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52]; 10959a747e4fSDavid du Colombier t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53]; 10969a747e4fSDavid du Colombier t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54]; 10979a747e4fSDavid du Colombier t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55]; 10989a747e4fSDavid du Colombier } 10999a747e4fSDavid du Colombier } 11009a747e4fSDavid du Colombier rk += Nr << 2; 11019a747e4fSDavid du Colombier #else /* !FULL_UNROLL */ 11029a747e4fSDavid du Colombier /* 11039a747e4fSDavid du Colombier * Nr - 1 full rounds: 11049a747e4fSDavid du Colombier */ 11059a747e4fSDavid du Colombier r = Nr >> 1; 11069a747e4fSDavid du Colombier for (;;) { 11079a747e4fSDavid du Colombier t0 = 11089a747e4fSDavid du Colombier Te0[(s0 >> 24) ] ^ 11099a747e4fSDavid du Colombier Te1[(s1 >> 16) & 0xff] ^ 11109a747e4fSDavid du Colombier Te2[(s2 >> 8) & 0xff] ^ 11119a747e4fSDavid du Colombier Te3[(s3 ) & 0xff] ^ 11129a747e4fSDavid du Colombier rk[4]; 11139a747e4fSDavid du Colombier t1 = 11149a747e4fSDavid du Colombier Te0[(s1 >> 24) ] ^ 11159a747e4fSDavid du Colombier Te1[(s2 >> 16) & 0xff] ^ 11169a747e4fSDavid du Colombier Te2[(s3 >> 8) & 0xff] ^ 11179a747e4fSDavid du Colombier Te3[(s0 ) & 0xff] ^ 11189a747e4fSDavid du Colombier rk[5]; 11199a747e4fSDavid du Colombier t2 = 11209a747e4fSDavid du Colombier Te0[(s2 >> 24) ] ^ 11219a747e4fSDavid du Colombier Te1[(s3 >> 16) & 0xff] ^ 11229a747e4fSDavid du Colombier Te2[(s0 >> 8) & 0xff] ^ 11239a747e4fSDavid du Colombier Te3[(s1 ) & 0xff] ^ 11249a747e4fSDavid du Colombier rk[6]; 11259a747e4fSDavid du Colombier t3 = 11269a747e4fSDavid du Colombier Te0[(s3 >> 24) ] ^ 11279a747e4fSDavid du Colombier Te1[(s0 >> 16) & 0xff] ^ 11289a747e4fSDavid du Colombier Te2[(s1 >> 8) & 0xff] ^ 11299a747e4fSDavid du Colombier Te3[(s2 ) & 0xff] ^ 11309a747e4fSDavid du Colombier rk[7]; 11319a747e4fSDavid du Colombier 11329a747e4fSDavid du Colombier rk += 8; 1133*fc4036bfSDavid du Colombier if (--r == 0) 11349a747e4fSDavid du Colombier break; 11359a747e4fSDavid du Colombier 11369a747e4fSDavid du Colombier s0 = 11379a747e4fSDavid du Colombier Te0[(t0 >> 24) ] ^ 11389a747e4fSDavid du Colombier Te1[(t1 >> 16) & 0xff] ^ 11399a747e4fSDavid du Colombier Te2[(t2 >> 8) & 0xff] ^ 11409a747e4fSDavid du Colombier Te3[(t3 ) & 0xff] ^ 11419a747e4fSDavid du Colombier rk[0]; 11429a747e4fSDavid du Colombier s1 = 11439a747e4fSDavid du Colombier Te0[(t1 >> 24) ] ^ 11449a747e4fSDavid du Colombier Te1[(t2 >> 16) & 0xff] ^ 11459a747e4fSDavid du Colombier Te2[(t3 >> 8) & 0xff] ^ 11469a747e4fSDavid du Colombier Te3[(t0 ) & 0xff] ^ 11479a747e4fSDavid du Colombier rk[1]; 11489a747e4fSDavid du Colombier s2 = 11499a747e4fSDavid du Colombier Te0[(t2 >> 24) ] ^ 11509a747e4fSDavid du Colombier Te1[(t3 >> 16) & 0xff] ^ 11519a747e4fSDavid du Colombier Te2[(t0 >> 8) & 0xff] ^ 11529a747e4fSDavid du Colombier Te3[(t1 ) & 0xff] ^ 11539a747e4fSDavid du Colombier rk[2]; 11549a747e4fSDavid du Colombier s3 = 11559a747e4fSDavid du Colombier Te0[(t3 >> 24) ] ^ 11569a747e4fSDavid du Colombier Te1[(t0 >> 16) & 0xff] ^ 11579a747e4fSDavid du Colombier Te2[(t1 >> 8) & 0xff] ^ 11589a747e4fSDavid du Colombier Te3[(t2 ) & 0xff] ^ 11599a747e4fSDavid du Colombier rk[3]; 11609a747e4fSDavid du Colombier } 11619a747e4fSDavid du Colombier #endif /* ?FULL_UNROLL */ 11629a747e4fSDavid du Colombier /* 11639a747e4fSDavid du Colombier * apply last round and 11649a747e4fSDavid du Colombier * map cipher state to byte array block: 11659a747e4fSDavid du Colombier */ 11669a747e4fSDavid du Colombier s0 = 11679a747e4fSDavid du Colombier (Te4[(t0 >> 24) ] << 24) ^ 11689a747e4fSDavid du Colombier (Te4[(t1 >> 16) & 0xff] << 16) ^ 11699a747e4fSDavid du Colombier (Te4[(t2 >> 8) & 0xff] << 8) ^ 11709a747e4fSDavid du Colombier (Te4[(t3 ) & 0xff] ) ^ 11719a747e4fSDavid du Colombier rk[0]; 11729a747e4fSDavid du Colombier PUTU32(ct , s0); 11739a747e4fSDavid du Colombier s1 = 11749a747e4fSDavid du Colombier (Te4[(t1 >> 24) ] << 24) ^ 11759a747e4fSDavid du Colombier (Te4[(t2 >> 16) & 0xff] << 16) ^ 11769a747e4fSDavid du Colombier (Te4[(t3 >> 8) & 0xff] << 8) ^ 11779a747e4fSDavid du Colombier (Te4[(t0 ) & 0xff] ) ^ 11789a747e4fSDavid du Colombier rk[1]; 11799a747e4fSDavid du Colombier PUTU32(ct + 4, s1); 11809a747e4fSDavid du Colombier s2 = 11819a747e4fSDavid du Colombier (Te4[(t2 >> 24) ] << 24) ^ 11829a747e4fSDavid du Colombier (Te4[(t3 >> 16) & 0xff] << 16) ^ 11839a747e4fSDavid du Colombier (Te4[(t0 >> 8) & 0xff] << 8) ^ 11849a747e4fSDavid du Colombier (Te4[(t1 ) & 0xff] ) ^ 11859a747e4fSDavid du Colombier rk[2]; 11869a747e4fSDavid du Colombier PUTU32(ct + 8, s2); 11879a747e4fSDavid du Colombier s3 = 11889a747e4fSDavid du Colombier (Te4[(t3 >> 24) ] << 24) ^ 11899a747e4fSDavid du Colombier (Te4[(t0 >> 16) & 0xff] << 16) ^ 11909a747e4fSDavid du Colombier (Te4[(t1 >> 8) & 0xff] << 8) ^ 11919a747e4fSDavid du Colombier (Te4[(t2 ) & 0xff] ) ^ 11929a747e4fSDavid du Colombier rk[3]; 11939a747e4fSDavid du Colombier PUTU32(ct + 12, s3); 11949a747e4fSDavid du Colombier } 11959a747e4fSDavid du Colombier 1196*fc4036bfSDavid du Colombier static void 1197*fc4036bfSDavid du Colombier rijndaelDecrypt(const u32 rk[/* 4*(Nr + 1) */], int Nr, const u8 ct[16], 1198*fc4036bfSDavid du Colombier u8 pt[16]) 1199*fc4036bfSDavid du Colombier { 12009a747e4fSDavid du Colombier u32 s0, s1, s2, s3, t0, t1, t2, t3; 12019a747e4fSDavid du Colombier #ifndef FULL_UNROLL 12029a747e4fSDavid du Colombier int r; 12039a747e4fSDavid du Colombier #endif /* ?FULL_UNROLL */ 12049a747e4fSDavid du Colombier 12059a747e4fSDavid du Colombier /* 12069a747e4fSDavid du Colombier * map byte array block to cipher state 12079a747e4fSDavid du Colombier * and add initial round key: 12089a747e4fSDavid du Colombier */ 12099a747e4fSDavid du Colombier s0 = GETU32(ct ) ^ rk[0]; 12109a747e4fSDavid du Colombier s1 = GETU32(ct + 4) ^ rk[1]; 12119a747e4fSDavid du Colombier s2 = GETU32(ct + 8) ^ rk[2]; 12129a747e4fSDavid du Colombier s3 = GETU32(ct + 12) ^ rk[3]; 12139a747e4fSDavid du Colombier #ifdef FULL_UNROLL 12149a747e4fSDavid du Colombier /* round 1: */ 12159a747e4fSDavid du Colombier t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4]; 12169a747e4fSDavid du Colombier t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5]; 12179a747e4fSDavid du Colombier t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6]; 12189a747e4fSDavid du Colombier t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7]; 12199a747e4fSDavid du Colombier /* round 2: */ 12209a747e4fSDavid du Colombier s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8]; 12219a747e4fSDavid du Colombier s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9]; 12229a747e4fSDavid du Colombier s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10]; 12239a747e4fSDavid du Colombier s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11]; 12249a747e4fSDavid du Colombier /* round 3: */ 12259a747e4fSDavid du Colombier t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12]; 12269a747e4fSDavid du Colombier t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13]; 12279a747e4fSDavid du Colombier t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14]; 12289a747e4fSDavid du Colombier t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15]; 12299a747e4fSDavid du Colombier /* round 4: */ 12309a747e4fSDavid du Colombier s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16]; 12319a747e4fSDavid du Colombier s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17]; 12329a747e4fSDavid du Colombier s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18]; 12339a747e4fSDavid du Colombier s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19]; 12349a747e4fSDavid du Colombier /* round 5: */ 12359a747e4fSDavid du Colombier t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20]; 12369a747e4fSDavid du Colombier t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21]; 12379a747e4fSDavid du Colombier t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22]; 12389a747e4fSDavid du Colombier t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23]; 12399a747e4fSDavid du Colombier /* round 6: */ 12409a747e4fSDavid du Colombier s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24]; 12419a747e4fSDavid du Colombier s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25]; 12429a747e4fSDavid du Colombier s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26]; 12439a747e4fSDavid du Colombier s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27]; 12449a747e4fSDavid du Colombier /* round 7: */ 12459a747e4fSDavid du Colombier t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28]; 12469a747e4fSDavid du Colombier t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29]; 12479a747e4fSDavid du Colombier t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30]; 12489a747e4fSDavid du Colombier t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31]; 12499a747e4fSDavid du Colombier /* round 8: */ 12509a747e4fSDavid du Colombier s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32]; 12519a747e4fSDavid du Colombier s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33]; 12529a747e4fSDavid du Colombier s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34]; 12539a747e4fSDavid du Colombier s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35]; 12549a747e4fSDavid du Colombier /* round 9: */ 12559a747e4fSDavid du Colombier t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36]; 12569a747e4fSDavid du Colombier t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37]; 12579a747e4fSDavid du Colombier t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38]; 12589a747e4fSDavid du Colombier t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39]; 12599a747e4fSDavid du Colombier if (Nr > 10) { 12609a747e4fSDavid du Colombier /* round 10: */ 12619a747e4fSDavid du Colombier s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40]; 12629a747e4fSDavid du Colombier s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41]; 12639a747e4fSDavid du Colombier s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42]; 12649a747e4fSDavid du Colombier s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43]; 12659a747e4fSDavid du Colombier /* round 11: */ 12669a747e4fSDavid du Colombier t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44]; 12679a747e4fSDavid du Colombier t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45]; 12689a747e4fSDavid du Colombier t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46]; 12699a747e4fSDavid du Colombier t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47]; 12709a747e4fSDavid du Colombier if (Nr > 12) { 12719a747e4fSDavid du Colombier /* round 12: */ 12729a747e4fSDavid du Colombier s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48]; 12739a747e4fSDavid du Colombier s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49]; 12749a747e4fSDavid du Colombier s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50]; 12759a747e4fSDavid du Colombier s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51]; 12769a747e4fSDavid du Colombier /* round 13: */ 12779a747e4fSDavid du Colombier t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52]; 12789a747e4fSDavid du Colombier t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53]; 12799a747e4fSDavid du Colombier t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54]; 12809a747e4fSDavid du Colombier t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55]; 12819a747e4fSDavid du Colombier } 12829a747e4fSDavid du Colombier } 12839a747e4fSDavid du Colombier rk += Nr << 2; 12849a747e4fSDavid du Colombier #else /* !FULL_UNROLL */ 12859a747e4fSDavid du Colombier /* 12869a747e4fSDavid du Colombier * Nr - 1 full rounds: 12879a747e4fSDavid du Colombier */ 12889a747e4fSDavid du Colombier r = Nr >> 1; 12899a747e4fSDavid du Colombier for (;;) { 12909a747e4fSDavid du Colombier t0 = 12919a747e4fSDavid du Colombier Td0[(s0 >> 24) ] ^ 12929a747e4fSDavid du Colombier Td1[(s3 >> 16) & 0xff] ^ 12939a747e4fSDavid du Colombier Td2[(s2 >> 8) & 0xff] ^ 12949a747e4fSDavid du Colombier Td3[(s1 ) & 0xff] ^ 12959a747e4fSDavid du Colombier rk[4]; 12969a747e4fSDavid du Colombier t1 = 12979a747e4fSDavid du Colombier Td0[(s1 >> 24) ] ^ 12989a747e4fSDavid du Colombier Td1[(s0 >> 16) & 0xff] ^ 12999a747e4fSDavid du Colombier Td2[(s3 >> 8) & 0xff] ^ 13009a747e4fSDavid du Colombier Td3[(s2 ) & 0xff] ^ 13019a747e4fSDavid du Colombier rk[5]; 13029a747e4fSDavid du Colombier t2 = 13039a747e4fSDavid du Colombier Td0[(s2 >> 24) ] ^ 13049a747e4fSDavid du Colombier Td1[(s1 >> 16) & 0xff] ^ 13059a747e4fSDavid du Colombier Td2[(s0 >> 8) & 0xff] ^ 13069a747e4fSDavid du Colombier Td3[(s3 ) & 0xff] ^ 13079a747e4fSDavid du Colombier rk[6]; 13089a747e4fSDavid du Colombier t3 = 13099a747e4fSDavid du Colombier Td0[(s3 >> 24) ] ^ 13109a747e4fSDavid du Colombier Td1[(s2 >> 16) & 0xff] ^ 13119a747e4fSDavid du Colombier Td2[(s1 >> 8) & 0xff] ^ 13129a747e4fSDavid du Colombier Td3[(s0 ) & 0xff] ^ 13139a747e4fSDavid du Colombier rk[7]; 13149a747e4fSDavid du Colombier 13159a747e4fSDavid du Colombier rk += 8; 1316*fc4036bfSDavid du Colombier if (--r == 0) 13179a747e4fSDavid du Colombier break; 13189a747e4fSDavid du Colombier 13199a747e4fSDavid du Colombier s0 = 13209a747e4fSDavid du Colombier Td0[(t0 >> 24) ] ^ 13219a747e4fSDavid du Colombier Td1[(t3 >> 16) & 0xff] ^ 13229a747e4fSDavid du Colombier Td2[(t2 >> 8) & 0xff] ^ 13239a747e4fSDavid du Colombier Td3[(t1 ) & 0xff] ^ 13249a747e4fSDavid du Colombier rk[0]; 13259a747e4fSDavid du Colombier s1 = 13269a747e4fSDavid du Colombier Td0[(t1 >> 24) ] ^ 13279a747e4fSDavid du Colombier Td1[(t0 >> 16) & 0xff] ^ 13289a747e4fSDavid du Colombier Td2[(t3 >> 8) & 0xff] ^ 13299a747e4fSDavid du Colombier Td3[(t2 ) & 0xff] ^ 13309a747e4fSDavid du Colombier rk[1]; 13319a747e4fSDavid du Colombier s2 = 13329a747e4fSDavid du Colombier Td0[(t2 >> 24) ] ^ 13339a747e4fSDavid du Colombier Td1[(t1 >> 16) & 0xff] ^ 13349a747e4fSDavid du Colombier Td2[(t0 >> 8) & 0xff] ^ 13359a747e4fSDavid du Colombier Td3[(t3 ) & 0xff] ^ 13369a747e4fSDavid du Colombier rk[2]; 13379a747e4fSDavid du Colombier s3 = 13389a747e4fSDavid du Colombier Td0[(t3 >> 24) ] ^ 13399a747e4fSDavid du Colombier Td1[(t2 >> 16) & 0xff] ^ 13409a747e4fSDavid du Colombier Td2[(t1 >> 8) & 0xff] ^ 13419a747e4fSDavid du Colombier Td3[(t0 ) & 0xff] ^ 13429a747e4fSDavid du Colombier rk[3]; 13439a747e4fSDavid du Colombier } 13449a747e4fSDavid du Colombier #endif /* ?FULL_UNROLL */ 13459a747e4fSDavid du Colombier /* 13469a747e4fSDavid du Colombier * apply last round and 13479a747e4fSDavid du Colombier * map cipher state to byte array block: 13489a747e4fSDavid du Colombier */ 13499a747e4fSDavid du Colombier s0 = 13509a747e4fSDavid du Colombier (Td4[(t0 >> 24) ] << 24) ^ 13519a747e4fSDavid du Colombier (Td4[(t3 >> 16) & 0xff] << 16) ^ 13529a747e4fSDavid du Colombier (Td4[(t2 >> 8) & 0xff] << 8) ^ 13539a747e4fSDavid du Colombier (Td4[(t1 ) & 0xff] ) ^ 13549a747e4fSDavid du Colombier rk[0]; 13559a747e4fSDavid du Colombier PUTU32(pt , s0); 13569a747e4fSDavid du Colombier s1 = 13579a747e4fSDavid du Colombier (Td4[(t1 >> 24) ] << 24) ^ 13589a747e4fSDavid du Colombier (Td4[(t0 >> 16) & 0xff] << 16) ^ 13599a747e4fSDavid du Colombier (Td4[(t3 >> 8) & 0xff] << 8) ^ 13609a747e4fSDavid du Colombier (Td4[(t2 ) & 0xff] ) ^ 13619a747e4fSDavid du Colombier rk[1]; 13629a747e4fSDavid du Colombier PUTU32(pt + 4, s1); 13639a747e4fSDavid du Colombier s2 = 13649a747e4fSDavid du Colombier (Td4[(t2 >> 24) ] << 24) ^ 13659a747e4fSDavid du Colombier (Td4[(t1 >> 16) & 0xff] << 16) ^ 13669a747e4fSDavid du Colombier (Td4[(t0 >> 8) & 0xff] << 8) ^ 13679a747e4fSDavid du Colombier (Td4[(t3 ) & 0xff] ) ^ 13689a747e4fSDavid du Colombier rk[2]; 13699a747e4fSDavid du Colombier PUTU32(pt + 8, s2); 13709a747e4fSDavid du Colombier s3 = 13719a747e4fSDavid du Colombier (Td4[(t3 >> 24) ] << 24) ^ 13729a747e4fSDavid du Colombier (Td4[(t2 >> 16) & 0xff] << 16) ^ 13739a747e4fSDavid du Colombier (Td4[(t1 >> 8) & 0xff] << 8) ^ 13749a747e4fSDavid du Colombier (Td4[(t0 ) & 0xff] ) ^ 13759a747e4fSDavid du Colombier rk[3]; 13769a747e4fSDavid du Colombier PUTU32(pt + 12, s3); 13779a747e4fSDavid du Colombier } 13789a747e4fSDavid du Colombier 13799a747e4fSDavid du Colombier #ifdef INTERMEDIATE_VALUE_KAT 13809a747e4fSDavid du Colombier 1381*fc4036bfSDavid du Colombier static void 1382*fc4036bfSDavid du Colombier rijndaelEncryptRound(const u32 rk[/* 4*(Nr + 1) */], int Nr, u8 block[16], 1383*fc4036bfSDavid du Colombier int rounds) 1384*fc4036bfSDavid du Colombier { 13859a747e4fSDavid du Colombier int r; 13869a747e4fSDavid du Colombier u32 s0, s1, s2, s3, t0, t1, t2, t3; 13879a747e4fSDavid du Colombier 13889a747e4fSDavid du Colombier /* 13899a747e4fSDavid du Colombier * map byte array block to cipher state 13909a747e4fSDavid du Colombier * and add initial round key: 13919a747e4fSDavid du Colombier */ 13929a747e4fSDavid du Colombier s0 = GETU32(block ) ^ rk[0]; 13939a747e4fSDavid du Colombier s1 = GETU32(block + 4) ^ rk[1]; 13949a747e4fSDavid du Colombier s2 = GETU32(block + 8) ^ rk[2]; 13959a747e4fSDavid du Colombier s3 = GETU32(block + 12) ^ rk[3]; 13969a747e4fSDavid du Colombier rk += 4; 13979a747e4fSDavid du Colombier 13989a747e4fSDavid du Colombier /* 13999a747e4fSDavid du Colombier * Nr - 1 full rounds: 14009a747e4fSDavid du Colombier */ 14019a747e4fSDavid du Colombier for (r = (rounds < Nr ? rounds : Nr - 1); r > 0; r--) { 14029a747e4fSDavid du Colombier t0 = 14039a747e4fSDavid du Colombier Te0[(s0 >> 24) ] ^ 14049a747e4fSDavid du Colombier Te1[(s1 >> 16) & 0xff] ^ 14059a747e4fSDavid du Colombier Te2[(s2 >> 8) & 0xff] ^ 14069a747e4fSDavid du Colombier Te3[(s3 ) & 0xff] ^ 14079a747e4fSDavid du Colombier rk[0]; 14089a747e4fSDavid du Colombier t1 = 14099a747e4fSDavid du Colombier Te0[(s1 >> 24) ] ^ 14109a747e4fSDavid du Colombier Te1[(s2 >> 16) & 0xff] ^ 14119a747e4fSDavid du Colombier Te2[(s3 >> 8) & 0xff] ^ 14129a747e4fSDavid du Colombier Te3[(s0 ) & 0xff] ^ 14139a747e4fSDavid du Colombier rk[1]; 14149a747e4fSDavid du Colombier t2 = 14159a747e4fSDavid du Colombier Te0[(s2 >> 24) ] ^ 14169a747e4fSDavid du Colombier Te1[(s3 >> 16) & 0xff] ^ 14179a747e4fSDavid du Colombier Te2[(s0 >> 8) & 0xff] ^ 14189a747e4fSDavid du Colombier Te3[(s1 ) & 0xff] ^ 14199a747e4fSDavid du Colombier rk[2]; 14209a747e4fSDavid du Colombier t3 = 14219a747e4fSDavid du Colombier Te0[(s3 >> 24) ] ^ 14229a747e4fSDavid du Colombier Te1[(s0 >> 16) & 0xff] ^ 14239a747e4fSDavid du Colombier Te2[(s1 >> 8) & 0xff] ^ 14249a747e4fSDavid du Colombier Te3[(s2 ) & 0xff] ^ 14259a747e4fSDavid du Colombier rk[3]; 14269a747e4fSDavid du Colombier s0 = t0; 14279a747e4fSDavid du Colombier s1 = t1; 14289a747e4fSDavid du Colombier s2 = t2; 14299a747e4fSDavid du Colombier s3 = t3; 14309a747e4fSDavid du Colombier rk += 4; 14319a747e4fSDavid du Colombier } 14329a747e4fSDavid du Colombier 14339a747e4fSDavid du Colombier /* 14349a747e4fSDavid du Colombier * apply last round and 14359a747e4fSDavid du Colombier * map cipher state to byte array block: 14369a747e4fSDavid du Colombier */ 14379a747e4fSDavid du Colombier if (rounds == Nr) { 14389a747e4fSDavid du Colombier t0 = 14399a747e4fSDavid du Colombier (Te4[(s0 >> 24) ] << 24) ^ 14409a747e4fSDavid du Colombier (Te4[(s1 >> 16) & 0xff] << 16) ^ 14419a747e4fSDavid du Colombier (Te4[(s2 >> 8) & 0xff] << 8) ^ 14429a747e4fSDavid du Colombier (Te4[(s3 ) & 0xff] ) ^ 14439a747e4fSDavid du Colombier rk[0]; 14449a747e4fSDavid du Colombier t1 = 14459a747e4fSDavid du Colombier (Te4[(s1 >> 24) ] << 24) ^ 14469a747e4fSDavid du Colombier (Te4[(s2 >> 16) & 0xff] << 16) ^ 14479a747e4fSDavid du Colombier (Te4[(s3 >> 8) & 0xff] << 8) ^ 14489a747e4fSDavid du Colombier (Te4[(s0 ) & 0xff] ) ^ 14499a747e4fSDavid du Colombier rk[1]; 14509a747e4fSDavid du Colombier t2 = 14519a747e4fSDavid du Colombier (Te4[(s2 >> 24) ] << 24) ^ 14529a747e4fSDavid du Colombier (Te4[(s3 >> 16) & 0xff] << 16) ^ 14539a747e4fSDavid du Colombier (Te4[(s0 >> 8) & 0xff] << 8) ^ 14549a747e4fSDavid du Colombier (Te4[(s1 ) & 0xff] ) ^ 14559a747e4fSDavid du Colombier rk[2]; 14569a747e4fSDavid du Colombier t3 = 14579a747e4fSDavid du Colombier (Te4[(s3 >> 24) ] << 24) ^ 14589a747e4fSDavid du Colombier (Te4[(s0 >> 16) & 0xff] << 16) ^ 14599a747e4fSDavid du Colombier (Te4[(s1 >> 8) & 0xff] << 8) ^ 14609a747e4fSDavid du Colombier (Te4[(s2 ) & 0xff] ) ^ 14619a747e4fSDavid du Colombier rk[3]; 14629a747e4fSDavid du Colombier s0 = t0; 14639a747e4fSDavid du Colombier s1 = t1; 14649a747e4fSDavid du Colombier s2 = t2; 14659a747e4fSDavid du Colombier s3 = t3; 14669a747e4fSDavid du Colombier } 14679a747e4fSDavid du Colombier 14689a747e4fSDavid du Colombier PUTU32(block , s0); 14699a747e4fSDavid du Colombier PUTU32(block + 4, s1); 14709a747e4fSDavid du Colombier PUTU32(block + 8, s2); 14719a747e4fSDavid du Colombier PUTU32(block + 12, s3); 14729a747e4fSDavid du Colombier } 14739a747e4fSDavid du Colombier 1474*fc4036bfSDavid du Colombier static void 1475*fc4036bfSDavid du Colombier rijndaelDecryptRound(const u32 rk[/* 4*(Nr + 1) */], int Nr, u8 block[16], 1476*fc4036bfSDavid du Colombier int rounds) 1477*fc4036bfSDavid du Colombier { 14789a747e4fSDavid du Colombier int r; 14799a747e4fSDavid du Colombier u32 s0, s1, s2, s3, t0, t1, t2, t3; 14809a747e4fSDavid du Colombier 14819a747e4fSDavid du Colombier /* 14829a747e4fSDavid du Colombier * map byte array block to cipher state 14839a747e4fSDavid du Colombier * and add initial round key: 14849a747e4fSDavid du Colombier */ 14859a747e4fSDavid du Colombier s0 = GETU32(block ) ^ rk[0]; 14869a747e4fSDavid du Colombier s1 = GETU32(block + 4) ^ rk[1]; 14879a747e4fSDavid du Colombier s2 = GETU32(block + 8) ^ rk[2]; 14889a747e4fSDavid du Colombier s3 = GETU32(block + 12) ^ rk[3]; 14899a747e4fSDavid du Colombier rk += 4; 14909a747e4fSDavid du Colombier 14919a747e4fSDavid du Colombier /* 14929a747e4fSDavid du Colombier * Nr - 1 full rounds: 14939a747e4fSDavid du Colombier */ 14949a747e4fSDavid du Colombier for (r = (rounds < Nr ? rounds : Nr) - 1; r > 0; r--) { 14959a747e4fSDavid du Colombier t0 = 14969a747e4fSDavid du Colombier Td0[(s0 >> 24) ] ^ 14979a747e4fSDavid du Colombier Td1[(s3 >> 16) & 0xff] ^ 14989a747e4fSDavid du Colombier Td2[(s2 >> 8) & 0xff] ^ 14999a747e4fSDavid du Colombier Td3[(s1 ) & 0xff] ^ 15009a747e4fSDavid du Colombier rk[0]; 15019a747e4fSDavid du Colombier t1 = 15029a747e4fSDavid du Colombier Td0[(s1 >> 24) ] ^ 15039a747e4fSDavid du Colombier Td1[(s0 >> 16) & 0xff] ^ 15049a747e4fSDavid du Colombier Td2[(s3 >> 8) & 0xff] ^ 15059a747e4fSDavid du Colombier Td3[(s2 ) & 0xff] ^ 15069a747e4fSDavid du Colombier rk[1]; 15079a747e4fSDavid du Colombier t2 = 15089a747e4fSDavid du Colombier Td0[(s2 >> 24) ] ^ 15099a747e4fSDavid du Colombier Td1[(s1 >> 16) & 0xff] ^ 15109a747e4fSDavid du Colombier Td2[(s0 >> 8) & 0xff] ^ 15119a747e4fSDavid du Colombier Td3[(s3 ) & 0xff] ^ 15129a747e4fSDavid du Colombier rk[2]; 15139a747e4fSDavid du Colombier t3 = 15149a747e4fSDavid du Colombier Td0[(s3 >> 24) ] ^ 15159a747e4fSDavid du Colombier Td1[(s2 >> 16) & 0xff] ^ 15169a747e4fSDavid du Colombier Td2[(s1 >> 8) & 0xff] ^ 15179a747e4fSDavid du Colombier Td3[(s0 ) & 0xff] ^ 15189a747e4fSDavid du Colombier rk[3]; 15199a747e4fSDavid du Colombier 15209a747e4fSDavid du Colombier s0 = t0; 15219a747e4fSDavid du Colombier s1 = t1; 15229a747e4fSDavid du Colombier s2 = t2; 15239a747e4fSDavid du Colombier s3 = t3; 15249a747e4fSDavid du Colombier rk += 4; 15259a747e4fSDavid du Colombier } 15269a747e4fSDavid du Colombier 15279a747e4fSDavid du Colombier /* 15289a747e4fSDavid du Colombier * complete the last round and 15299a747e4fSDavid du Colombier * map cipher state to byte array block: 15309a747e4fSDavid du Colombier */ 15319a747e4fSDavid du Colombier t0 = 15329a747e4fSDavid du Colombier (Td4[(s0 >> 24) ] << 24) ^ 15339a747e4fSDavid du Colombier (Td4[(s3 >> 16) & 0xff] << 16) ^ 15349a747e4fSDavid du Colombier (Td4[(s2 >> 8) & 0xff] << 8) ^ 15359a747e4fSDavid du Colombier (Td4[(s1 ) & 0xff] ); 15369a747e4fSDavid du Colombier t1 = 15379a747e4fSDavid du Colombier (Td4[(s1 >> 24) ] << 24) ^ 15389a747e4fSDavid du Colombier (Td4[(s0 >> 16) & 0xff] << 16) ^ 15399a747e4fSDavid du Colombier (Td4[(s3 >> 8) & 0xff] << 8) ^ 15409a747e4fSDavid du Colombier (Td4[(s2 ) & 0xff] ); 15419a747e4fSDavid du Colombier t2 = 15429a747e4fSDavid du Colombier (Td4[(s2 >> 24) ] << 24) ^ 15439a747e4fSDavid du Colombier (Td4[(s1 >> 16) & 0xff] << 16) ^ 15449a747e4fSDavid du Colombier (Td4[(s0 >> 8) & 0xff] << 8) ^ 15459a747e4fSDavid du Colombier (Td4[(s3 ) & 0xff] ); 15469a747e4fSDavid du Colombier t3 = 15479a747e4fSDavid du Colombier (Td4[(s3 >> 24) ] << 24) ^ 15489a747e4fSDavid du Colombier (Td4[(s2 >> 16) & 0xff] << 16) ^ 15499a747e4fSDavid du Colombier (Td4[(s1 >> 8) & 0xff] << 8) ^ 15509a747e4fSDavid du Colombier (Td4[(s0 ) & 0xff] ); 15519a747e4fSDavid du Colombier 15529a747e4fSDavid du Colombier if (rounds == Nr) { 15539a747e4fSDavid du Colombier t0 ^= rk[0]; 15549a747e4fSDavid du Colombier t1 ^= rk[1]; 15559a747e4fSDavid du Colombier t2 ^= rk[2]; 15569a747e4fSDavid du Colombier t3 ^= rk[3]; 15579a747e4fSDavid du Colombier } 15589a747e4fSDavid du Colombier 15599a747e4fSDavid du Colombier PUTU32(block , t0); 15609a747e4fSDavid du Colombier PUTU32(block + 4, t1); 15619a747e4fSDavid du Colombier PUTU32(block + 8, t2); 15629a747e4fSDavid du Colombier PUTU32(block + 12, t3); 15639a747e4fSDavid du Colombier } 15649a747e4fSDavid du Colombier 15659a747e4fSDavid du Colombier #endif /* INTERMEDIATE_VALUE_KAT */ 1566