xref: /plan9/sys/src/libsec/port/aes.c (revision fc4036bfdba6447763ab0851a99ddf98ca46e814)
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