xref: /plan9-contrib/sys/src/libsec/port/aes.c (revision c77838d532b0fe1e231546e9aada64c47acaab0b)
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>
33410ea80bSDavid du Colombier #include <mp.h>
349a747e4fSDavid du Colombier #include <libsec.h>
359a747e4fSDavid du Colombier 
369a747e4fSDavid du Colombier typedef uchar	u8;
375544e2dfSDavid du Colombier typedef ulong	u32;
38fc4036bfSDavid du Colombier 
399a747e4fSDavid du Colombier #define FULL_UNROLL
405544e2dfSDavid du Colombier #define const
419a747e4fSDavid du Colombier 
429a747e4fSDavid du Colombier static const u32 Td0[256];
439a747e4fSDavid du Colombier static const u32 Td1[256];
449a747e4fSDavid du Colombier static const u32 Td2[256];
459a747e4fSDavid du Colombier static const u32 Td3[256];
469a747e4fSDavid du Colombier static const u8  Te4[256];
47410ea80bSDavid du Colombier static uchar basekey[3][16] = {
48410ea80bSDavid du Colombier 	{
49410ea80bSDavid du Colombier 	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
50410ea80bSDavid du Colombier 	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
51410ea80bSDavid du Colombier 	},
52410ea80bSDavid du Colombier 	{
53410ea80bSDavid du Colombier 	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
54410ea80bSDavid du Colombier 	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
55410ea80bSDavid du Colombier 	},
56410ea80bSDavid du Colombier 	{
57410ea80bSDavid du Colombier 	0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
58410ea80bSDavid du Colombier 	0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
59410ea80bSDavid du Colombier 	},
60410ea80bSDavid du Colombier };
619a747e4fSDavid du Colombier 
62e5442215SDavid du Colombier static int aes_setupEnc(ulong rk[/*4*(Nr + 1)*/], const uchar cipherKey[],
63410ea80bSDavid du Colombier 		int keyBits);
64410ea80bSDavid du Colombier static int aes_setupDec(ulong rk[/*4*(Nr + 1)*/], const uchar cipherKey[],
65410ea80bSDavid du Colombier 		int keyBits);
66410ea80bSDavid du Colombier static int aes_setup(ulong erk[/*4*(Nr + 1)*/], ulong drk[/*4*(Nr + 1)*/],
67410ea80bSDavid du Colombier 		const uchar cipherKey[], int keyBits);
68410ea80bSDavid du Colombier 
69410ea80bSDavid du Colombier void	aes_encrypt(const ulong rk[], int Nr, const uchar pt[16], uchar ct[16]);
70410ea80bSDavid du Colombier void	aes_decrypt(const ulong rk[], int Nr, const uchar ct[16], uchar pt[16]);
719a747e4fSDavid du Colombier 
729a747e4fSDavid du Colombier void
setupAESstate(AESstate * s,uchar key[],int keybytes,uchar * ivec)739a747e4fSDavid du Colombier setupAESstate(AESstate *s, uchar key[], int keybytes, uchar *ivec)
749a747e4fSDavid du Colombier {
759a747e4fSDavid du Colombier 	memset(s, 0, sizeof(*s));
769a747e4fSDavid du Colombier 	if(keybytes > AESmaxkey)
779a747e4fSDavid du Colombier 		keybytes = AESmaxkey;
789a747e4fSDavid du Colombier 	memmove(s->key, key, keybytes);
799a747e4fSDavid du Colombier 	s->keybytes = keybytes;
80*c77838d5SDavid du Colombier 	s->ctrsz = 4;	/* default counter size from rfc3686 */
81410ea80bSDavid du Colombier 	s->rounds = aes_setup(s->ekey, s->dkey, s->key, keybytes * 8);
829a747e4fSDavid du Colombier 	if(ivec != nil)
839a747e4fSDavid du Colombier 		memmove(s->ivec, ivec, AESbsize);
849a747e4fSDavid du Colombier 	if(keybytes==16 || keybytes==24 || keybytes==32)
859a747e4fSDavid du Colombier 		s->setup = 0xcafebabe;
86410ea80bSDavid du Colombier 	/* else aes_setup was invalid */
87410ea80bSDavid du Colombier }
88410ea80bSDavid du Colombier 
89410ea80bSDavid du Colombier /*
90410ea80bSDavid du Colombier  * AES-XCBC-MAC-96 message authentication, per rfc3566.
91410ea80bSDavid du Colombier  */
92410ea80bSDavid du Colombier 
93410ea80bSDavid du Colombier void
setupAESXCBCstate(AESstate * s)94410ea80bSDavid du Colombier setupAESXCBCstate(AESstate *s)		/* was setupmac96 */
95410ea80bSDavid du Colombier {
96410ea80bSDavid du Colombier 	int i, j;
97410ea80bSDavid du Colombier 	uint q[16 / sizeof(uint)];
98410ea80bSDavid du Colombier 	uchar *p;
99410ea80bSDavid du Colombier 
100410ea80bSDavid du Colombier 	assert(s->keybytes == 16);
101410ea80bSDavid du Colombier 	for(i = 0; i < 3; i++)
102410ea80bSDavid du Colombier 		aes_encrypt(s->ekey, s->rounds, basekey[i],
103410ea80bSDavid du Colombier 			s->mackey + AESbsize*i);
104410ea80bSDavid du Colombier 
105410ea80bSDavid du Colombier 	p = s->mackey;
106410ea80bSDavid du Colombier 	memset(q, 0, AESbsize);
107410ea80bSDavid du Colombier 
108410ea80bSDavid du Colombier 	/*
109410ea80bSDavid du Colombier 	 * put the in the right endian.  once figured, probably better
110410ea80bSDavid du Colombier 	 * to use some fcall macros.
111410ea80bSDavid du Colombier 	 * keys for encryption in local endianness for the algorithm...
112410ea80bSDavid du Colombier 	 * only key1 is used for encryption;
113410ea80bSDavid du Colombier 	 * BUG!!: I think this is what I got wrong.
114410ea80bSDavid du Colombier 	 */
115410ea80bSDavid du Colombier 	for(i = 0; i < 16 / sizeof(uint); i ++){
116410ea80bSDavid du Colombier 		for(j = 0; j < sizeof(uint); j++)
117410ea80bSDavid du Colombier 			q[i] |= p[sizeof(uint)-j-1] << 8*j;
118410ea80bSDavid du Colombier 		p += sizeof(uint);
119410ea80bSDavid du Colombier 	}
120410ea80bSDavid du Colombier 	memmove(s->mackey, q, 16);
121410ea80bSDavid du Colombier }
122410ea80bSDavid du Colombier 
123410ea80bSDavid du Colombier /*
124410ea80bSDavid du Colombier  * Not dealing with > 128-bit keys, not dealing with strange corner cases like
125410ea80bSDavid du Colombier  * empty message.  Should be fine for AES-XCBC-MAC-96.
126410ea80bSDavid du Colombier  */
127410ea80bSDavid du Colombier uchar*
aesXCBCmac(uchar * p,int len,AESstate * s)128410ea80bSDavid du Colombier aesXCBCmac(uchar *p, int len, AESstate *s)
129410ea80bSDavid du Colombier {
130410ea80bSDavid du Colombier 	uchar *p2, *ip, *eip, *mackey;
131410ea80bSDavid du Colombier 	uchar q[AESbsize];
132410ea80bSDavid du Colombier 
133410ea80bSDavid du Colombier 	assert(s->keybytes == 16);	/* more complicated for bigger */
134410ea80bSDavid du Colombier 	memset(s->ivec, 0, AESbsize);	/* E[0] is 0+ */
135410ea80bSDavid du Colombier 
136410ea80bSDavid du Colombier 	for(; len > AESbsize; len -= AESbsize){
137410ea80bSDavid du Colombier 		memmove(q, p, AESbsize);
138410ea80bSDavid du Colombier 		p2 = q;
139410ea80bSDavid du Colombier 		ip = s->ivec;
140410ea80bSDavid du Colombier 		for(eip = ip + AESbsize; ip < eip; )
141410ea80bSDavid du Colombier 			*p2++ ^= *ip++;
142410ea80bSDavid du Colombier 		aes_encrypt((ulong *)s->mackey, s->rounds, q, s->ivec);
143410ea80bSDavid du Colombier 		p += AESbsize;
144410ea80bSDavid du Colombier 	}
145410ea80bSDavid du Colombier 	/* the last one */
146410ea80bSDavid du Colombier 
147410ea80bSDavid du Colombier 	memmove(q, p, len);
148410ea80bSDavid du Colombier 	p2 = q+len;
149410ea80bSDavid du Colombier 	if(len == AESbsize)
150410ea80bSDavid du Colombier 		mackey = s->mackey + AESbsize;	/* k2 */
151410ea80bSDavid du Colombier 	else{
152410ea80bSDavid du Colombier 		mackey = s->mackey+2*AESbsize;	/* k3 */
153410ea80bSDavid du Colombier 		*p2++ = 1 << 7;			/* padding */
154410ea80bSDavid du Colombier 		len = AESbsize - len - 1;
155410ea80bSDavid du Colombier 		memset(p2, 0, len);
156410ea80bSDavid du Colombier 	}
157410ea80bSDavid du Colombier 
158410ea80bSDavid du Colombier 	ip = s->ivec;
159410ea80bSDavid du Colombier 	p2 = q;
160410ea80bSDavid du Colombier 	for(eip = ip + AESbsize; ip < eip; )
161410ea80bSDavid du Colombier 		*p2++ ^= *ip++ ^ *mackey++;
162410ea80bSDavid du Colombier 	aes_encrypt((ulong *)s->mackey, s->rounds, q, s->ivec);
163410ea80bSDavid du Colombier 	return s->ivec;			/* only the 12 bytes leftmost */
1649a747e4fSDavid du Colombier }
1659a747e4fSDavid du Colombier 
166fc4036bfSDavid du Colombier /*
167fc4036bfSDavid du Colombier  * Define by analogy with desCBCencrypt;  AES modes are not standardized yet.
168fc4036bfSDavid du Colombier  * Because of the way that non-multiple-of-16 buffers are handled,
169fc4036bfSDavid du Colombier  * the decryptor must be fed buffers of the same size as the encryptor.
170fc4036bfSDavid du Colombier  */
1719a747e4fSDavid du Colombier void
aesCBCencrypt(uchar * p,int len,AESstate * s)1729a747e4fSDavid du Colombier aesCBCencrypt(uchar *p, int len, AESstate *s)
1739a747e4fSDavid du Colombier {
1749a747e4fSDavid du Colombier 	uchar *p2, *ip, *eip;
1759a747e4fSDavid du Colombier 	uchar q[AESbsize];
1769a747e4fSDavid du Colombier 
1779a747e4fSDavid du Colombier 	for(; len >= AESbsize; len -= AESbsize){
1789a747e4fSDavid du Colombier 		p2 = p;
1799a747e4fSDavid du Colombier 		ip = s->ivec;
1809a747e4fSDavid du Colombier 		for(eip = ip+AESbsize; ip < eip; )
1819a747e4fSDavid du Colombier 			*p2++ ^= *ip++;
182410ea80bSDavid du Colombier 		aes_encrypt(s->ekey, s->rounds, p, q);
1839a747e4fSDavid du Colombier 		memmove(s->ivec, q, AESbsize);
1849a747e4fSDavid du Colombier 		memmove(p, q, AESbsize);
1859a747e4fSDavid du Colombier 		p += AESbsize;
1869a747e4fSDavid du Colombier 	}
1879a747e4fSDavid du Colombier 
1889a747e4fSDavid du Colombier 	if(len > 0){
1899a747e4fSDavid du Colombier 		ip = s->ivec;
190410ea80bSDavid du Colombier 		aes_encrypt(s->ekey, s->rounds, ip, q);
1919a747e4fSDavid du Colombier 		memmove(s->ivec, q, AESbsize);
1929a747e4fSDavid du Colombier 		for(eip = ip+len; ip < eip; )
1939a747e4fSDavid du Colombier 			*p++ ^= *ip++;
1949a747e4fSDavid du Colombier 	}
1959a747e4fSDavid du Colombier }
1969a747e4fSDavid du Colombier 
1979a747e4fSDavid du Colombier void
aesCBCdecrypt(uchar * p,int len,AESstate * s)1989a747e4fSDavid du Colombier aesCBCdecrypt(uchar *p, int len, AESstate *s)
1999a747e4fSDavid du Colombier {
2009a747e4fSDavid du Colombier 	uchar *ip, *eip, *tp;
2019a747e4fSDavid du Colombier 	uchar tmp[AESbsize], q[AESbsize];
2029a747e4fSDavid du Colombier 
2039a747e4fSDavid du Colombier 	for(; len >= AESbsize; len -= AESbsize){
2049a747e4fSDavid du Colombier 		memmove(tmp, p, AESbsize);
205410ea80bSDavid du Colombier 		aes_decrypt(s->dkey, s->rounds, p, q);
2069a747e4fSDavid du Colombier 		memmove(p, q, AESbsize);
2079a747e4fSDavid du Colombier 		tp = tmp;
2089a747e4fSDavid du Colombier 		ip = s->ivec;
2099a747e4fSDavid du Colombier 		for(eip = ip+AESbsize; ip < eip; ){
2109a747e4fSDavid du Colombier 			*p++ ^= *ip;
2119a747e4fSDavid du Colombier 			*ip++ = *tp++;
2129a747e4fSDavid du Colombier 		}
2139a747e4fSDavid du Colombier 	}
2149a747e4fSDavid du Colombier 
2159a747e4fSDavid du Colombier 	if(len > 0){
2169a747e4fSDavid du Colombier 		ip = s->ivec;
217410ea80bSDavid du Colombier 		aes_encrypt(s->ekey, s->rounds, ip, q);
2189a747e4fSDavid du Colombier 		memmove(s->ivec, q, AESbsize);
2199a747e4fSDavid du Colombier 		for(eip = ip+len; ip < eip; )
2209a747e4fSDavid du Colombier 			*p++ ^= *ip++;
2219a747e4fSDavid du Colombier 	}
2229a747e4fSDavid du Colombier }
2239a747e4fSDavid du Colombier 
224410ea80bSDavid du Colombier /*
225410ea80bSDavid du Colombier  * AES-CTR mode, per rfc3686.
226410ea80bSDavid du Colombier  * CTRs could be precalculated for efficiency
227410ea80bSDavid du Colombier  * and there would also be less back and forth mp
228410ea80bSDavid du Colombier  */
229410ea80bSDavid du Colombier 
230410ea80bSDavid du Colombier static void
incrementCTR(uchar * p,uint ctrsz)231410ea80bSDavid du Colombier incrementCTR(uchar *p, uint ctrsz)
232410ea80bSDavid du Colombier {
233410ea80bSDavid du Colombier 	int len;
234*c77838d5SDavid du Colombier 	ulong c;
235410ea80bSDavid du Colombier 	uchar *ctr;
236410ea80bSDavid du Colombier 	mpint *mpctr, *mpctrsz;
237410ea80bSDavid du Colombier 
238410ea80bSDavid du Colombier 	ctr = p + AESbsize - ctrsz;
239*c77838d5SDavid du Colombier 	if(ctrsz == 4){
240*c77838d5SDavid du Colombier 		/*
241*c77838d5SDavid du Colombier 		 * If counter is 32 bits (as in rfc3686 and ssh2) there's
242*c77838d5SDavid du Colombier 		 * no need to use extended precision.
243*c77838d5SDavid du Colombier 		 */
244*c77838d5SDavid du Colombier 		c = 1 + (ctr[0]<<24 | ctr[1]<<16 | ctr[2]<<8 | ctr[3]);
245*c77838d5SDavid du Colombier 		ctr[0] = c>>24; ctr[1] = c>>16; ctr[2] = c>>8; ctr[3] = c;
246*c77838d5SDavid du Colombier 		return;
247*c77838d5SDavid du Colombier 	}
248410ea80bSDavid du Colombier 	mpctr = betomp(ctr, ctrsz, nil);
249*c77838d5SDavid du Colombier 	mpctrsz = mpnew(ctrsz*8 + 1);
250*c77838d5SDavid du Colombier 	mpleft(mpone, ctrsz*8, mpctrsz);
251410ea80bSDavid du Colombier 	mpadd(mpctr, mpone, mpctr);
252410ea80bSDavid du Colombier 	mpmod(mpctr, mpctrsz, mpctr);
253410ea80bSDavid du Colombier 	len = mptobe(mpctr, ctr, ctrsz, nil);
254410ea80bSDavid du Colombier 	assert(len == ctrsz);
255410ea80bSDavid du Colombier 	mpfree(mpctrsz);
256410ea80bSDavid du Colombier 	mpfree(mpctr);
257410ea80bSDavid du Colombier }
258410ea80bSDavid du Colombier 
259410ea80bSDavid du Colombier void
aesCTRencrypt(uchar * p,int len,AESstate * s)260410ea80bSDavid du Colombier aesCTRencrypt(uchar *p, int len, AESstate *s)
261410ea80bSDavid du Colombier {
262410ea80bSDavid du Colombier 	uchar q[AESbsize];
263410ea80bSDavid du Colombier 	uchar *ip, *eip, *ctr;
264410ea80bSDavid du Colombier 
265410ea80bSDavid du Colombier 	ctr = s->ivec;
266410ea80bSDavid du Colombier 	for(; len >= AESbsize; len -= AESbsize){
267410ea80bSDavid du Colombier 		ip = q;
268410ea80bSDavid du Colombier 		aes_encrypt(s->ekey, s->rounds, ctr, q);
269410ea80bSDavid du Colombier 		for(eip = p + AESbsize; p < eip; )
270410ea80bSDavid du Colombier 			*p++ ^= *ip++;
271410ea80bSDavid du Colombier 		incrementCTR(ctr, s->ctrsz);
272410ea80bSDavid du Colombier 	}
273410ea80bSDavid du Colombier 
274410ea80bSDavid du Colombier 	if(len > 0){
275410ea80bSDavid du Colombier 		ip = q;
276410ea80bSDavid du Colombier 		aes_encrypt(s->ekey, s->rounds, ctr, q);
277410ea80bSDavid du Colombier 		for(eip = p + len; p < eip; )
278410ea80bSDavid du Colombier 			*p++ ^= *ip++;
279410ea80bSDavid du Colombier 		incrementCTR(ctr, s->ctrsz);
280410ea80bSDavid du Colombier 	}
281410ea80bSDavid du Colombier }
282410ea80bSDavid du Colombier 
283410ea80bSDavid du Colombier void
aesCTRdecrypt(uchar * p,int len,AESstate * s)284410ea80bSDavid du Colombier aesCTRdecrypt(uchar *p, int len, AESstate *s)
285410ea80bSDavid du Colombier {
286410ea80bSDavid du Colombier 	aesCTRencrypt(p, len, s);
287410ea80bSDavid du Colombier }
288410ea80bSDavid du Colombier 
289410ea80bSDavid du Colombier 
290410ea80bSDavid du Colombier /* taken from sha1; TODO: verify suitability (esp. byte order) for aes */
291410ea80bSDavid du Colombier /*
292410ea80bSDavid du Colombier  *	encodes input (ulong) into output (uchar). Assumes len is
293410ea80bSDavid du Colombier  *	a multiple of 4.
294410ea80bSDavid du Colombier  */
295410ea80bSDavid du Colombier static void
encode(uchar * output,ulong * input,ulong len)296410ea80bSDavid du Colombier encode(uchar *output, ulong *input, ulong len)
297410ea80bSDavid du Colombier {
298410ea80bSDavid du Colombier 	ulong x;
299410ea80bSDavid du Colombier 	uchar *e;
300410ea80bSDavid du Colombier 
301410ea80bSDavid du Colombier 	for(e = output + len; output < e;) {
302410ea80bSDavid du Colombier 		x = *input++;
303410ea80bSDavid du Colombier 		*output++ = x >> 24;
304410ea80bSDavid du Colombier 		*output++ = x >> 16;
305410ea80bSDavid du Colombier 		*output++ = x >> 8;
306410ea80bSDavid du Colombier 		*output++ = x;
307410ea80bSDavid du Colombier 	}
308410ea80bSDavid du Colombier }
309410ea80bSDavid du Colombier 
310410ea80bSDavid du Colombier /* TODO: verify use of aes_encrypt here */
311ff55b41dSDavid du Colombier AEShstate*
aes(uchar * p,ulong len,uchar * digest,AEShstate * s)312ff55b41dSDavid du Colombier aes(uchar *p, ulong len, uchar *digest, AEShstate *s)
313ff55b41dSDavid du Colombier {
314410ea80bSDavid du Colombier 	uchar buf[128];
315410ea80bSDavid du Colombier 	ulong x[16];
316410ea80bSDavid du Colombier 	int i;
317410ea80bSDavid du Colombier 	uchar *e;
318410ea80bSDavid du Colombier 
319410ea80bSDavid du Colombier 	if(s == nil){
320410ea80bSDavid du Colombier 		s = malloc(sizeof(*s));
321410ea80bSDavid du Colombier 		if(s == nil)
322410ea80bSDavid du Colombier 			return nil;
323410ea80bSDavid du Colombier 		memset(s, 0, sizeof(*s));
324410ea80bSDavid du Colombier 		s->malloced = 1;
325410ea80bSDavid du Colombier 	}
326410ea80bSDavid du Colombier 
327410ea80bSDavid du Colombier 	if(s->seeded == 0){
328410ea80bSDavid du Colombier 		/* seed the state, these constants would look nicer big-endian */
329410ea80bSDavid du Colombier 		s->state[0] = 0x67452301;
330410ea80bSDavid du Colombier 		s->state[1] = 0xefcdab89;
331410ea80bSDavid du Colombier 		s->state[2] = 0x98badcfe;
332410ea80bSDavid du Colombier 		s->state[3] = 0x10325476;
333410ea80bSDavid du Colombier 		/* in sha1 (20-byte digest), but not md5 (16 bytes)*/
334410ea80bSDavid du Colombier 		s->state[4] = 0xc3d2e1f0;
335410ea80bSDavid du Colombier 		s->seeded = 1;
336410ea80bSDavid du Colombier 	}
337410ea80bSDavid du Colombier 
338410ea80bSDavid du Colombier 	/* fill out the partial 64 byte block from previous calls */
339410ea80bSDavid du Colombier 	if(s->blen){
340410ea80bSDavid du Colombier 		i = 64 - s->blen;
341410ea80bSDavid du Colombier 		if(len < i)
342410ea80bSDavid du Colombier 			i = len;
343410ea80bSDavid du Colombier 		memmove(s->buf + s->blen, p, i);
344410ea80bSDavid du Colombier 		len -= i;
345410ea80bSDavid du Colombier 		s->blen += i;
346410ea80bSDavid du Colombier 		p += i;
347410ea80bSDavid du Colombier 		if(s->blen == 64){
348410ea80bSDavid du Colombier 			/* encrypt s->buf into s->state */
349410ea80bSDavid du Colombier 			// _sha1block(s->buf, s->blen, s->state);
350410ea80bSDavid du Colombier 			aes_encrypt((ulong *)s->buf, 1, s->buf, (uchar *)s->state);
351410ea80bSDavid du Colombier 			s->len += s->blen;
352410ea80bSDavid du Colombier 			s->blen = 0;
353410ea80bSDavid du Colombier 		}
354410ea80bSDavid du Colombier 	}
355410ea80bSDavid du Colombier 
356410ea80bSDavid du Colombier 	/* do 64 byte blocks */
357410ea80bSDavid du Colombier 	i = len & ~0x3f;
358410ea80bSDavid du Colombier 	if(i){
359410ea80bSDavid du Colombier 		/* encrypt p into s->state */
360410ea80bSDavid du Colombier 		// _sha1block(p, i, s->state);
361410ea80bSDavid du Colombier 		aes_encrypt((ulong *)s->buf, 1, p, (uchar *)s->state);
362410ea80bSDavid du Colombier 		s->len += i;
363410ea80bSDavid du Colombier 		len -= i;
364410ea80bSDavid du Colombier 		p += i;
365410ea80bSDavid du Colombier 	}
366410ea80bSDavid du Colombier 
367410ea80bSDavid du Colombier 	/* save the left overs if not last call */
368410ea80bSDavid du Colombier 	if(digest == 0){
369410ea80bSDavid du Colombier 		if(len){
370410ea80bSDavid du Colombier 			memmove(s->buf, p, len);
371410ea80bSDavid du Colombier 			s->blen += len;
372410ea80bSDavid du Colombier 		}
373410ea80bSDavid du Colombier 		return s;
374410ea80bSDavid du Colombier 	}
375410ea80bSDavid du Colombier 
376410ea80bSDavid du Colombier 	/*
377410ea80bSDavid du Colombier 	 *  this is the last time through, pad what's left with 0x80,
378410ea80bSDavid du Colombier 	 *  0's, and the input count to create a multiple of 64 bytes
379410ea80bSDavid du Colombier 	 */
380410ea80bSDavid du Colombier 	if(s->blen){
381410ea80bSDavid du Colombier 		p = s->buf;
382410ea80bSDavid du Colombier 		len = s->blen;
383410ea80bSDavid du Colombier 	} else {
384410ea80bSDavid du Colombier 		memmove(buf, p, len);
385410ea80bSDavid du Colombier 		p = buf;
386410ea80bSDavid du Colombier 	}
387410ea80bSDavid du Colombier 	s->len += len;
388410ea80bSDavid du Colombier 	e = p + len;
389410ea80bSDavid du Colombier 	if(len < 56)
390410ea80bSDavid du Colombier 		i = 56 - len;
391410ea80bSDavid du Colombier 	else
392410ea80bSDavid du Colombier 		i = 120 - len;
393410ea80bSDavid du Colombier 	memset(e, 0, i);
394410ea80bSDavid du Colombier 	*e = 0x80;
395410ea80bSDavid du Colombier 	len += i;
396410ea80bSDavid du Colombier 
397410ea80bSDavid du Colombier 	/* append the count */
398410ea80bSDavid du Colombier 	x[0] = s->len>>29;		/* byte-order dependent */
399410ea80bSDavid du Colombier 	x[1] = s->len<<3;
400410ea80bSDavid du Colombier 	encode(p+len, x, 8);
401410ea80bSDavid du Colombier 
402410ea80bSDavid du Colombier 	/* digest the last part */
403410ea80bSDavid du Colombier 	/* encrypt p into s->state */
404410ea80bSDavid du Colombier 	// _sha1block(p, len+8, s->state);
405410ea80bSDavid du Colombier 	aes_encrypt((ulong *)s->buf, 1, p, (uchar *)s->state);
406410ea80bSDavid du Colombier 	s->len += len+8;		/* sha1: +8 */
407410ea80bSDavid du Colombier 
408410ea80bSDavid du Colombier 	/* return result and free state */
409410ea80bSDavid du Colombier 	encode((uchar *)digest, (ulong *)s->state, AESdlen);
410410ea80bSDavid du Colombier 	if(s->malloced == 1)
411410ea80bSDavid du Colombier 		free(s);
412410ea80bSDavid du Colombier 	return nil;
413ff55b41dSDavid du Colombier }
414ff55b41dSDavid du Colombier 
415ff55b41dSDavid du Colombier DigestState*
hmac_aes(uchar * p,ulong len,uchar * key,ulong klen,uchar * digest,DigestState * s)416ff55b41dSDavid du Colombier hmac_aes(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest,
417ff55b41dSDavid du Colombier 	DigestState *s)
418ff55b41dSDavid du Colombier {
419ff55b41dSDavid du Colombier 	return hmac_x(p, len, key, klen, digest, s, aes, AESdlen);
420ff55b41dSDavid du Colombier }
421ff55b41dSDavid du Colombier 
422ff55b41dSDavid du Colombier 
423ff55b41dSDavid du Colombier 
4249a747e4fSDavid du Colombier /*
4259a747e4fSDavid du Colombier  * this function has been changed for plan 9.
4269a747e4fSDavid du Colombier  * Expand the cipher key into the encryption and decryption key schedules.
4279a747e4fSDavid du Colombier  *
4289a747e4fSDavid du Colombier  * @return	the number of rounds for the given cipher key size.
4299a747e4fSDavid du Colombier  */
430fc4036bfSDavid du Colombier static int
aes_setup(ulong erk[],ulong drk[],const uchar cipherKey[],int keyBits)431410ea80bSDavid du Colombier aes_setup(ulong erk[/* 4*(Nr + 1) */], ulong drk[/* 4*(Nr + 1) */],
432410ea80bSDavid du Colombier 	const uchar cipherKey[], int keyBits)
433fc4036bfSDavid du Colombier {
4349a747e4fSDavid du Colombier 	int Nr, i;
4359a747e4fSDavid du Colombier 
4369a747e4fSDavid du Colombier 	/* expand the cipher key: */
437410ea80bSDavid du Colombier 	Nr = aes_setupEnc(erk, cipherKey, keyBits);
4389a747e4fSDavid du Colombier 
4399a747e4fSDavid du Colombier 	/*
440fc4036bfSDavid du Colombier 	 * invert the order of the round keys and apply the inverse MixColumn
441fc4036bfSDavid du Colombier 	 * transform to all round keys but the first and the last
4429a747e4fSDavid du Colombier 	 */
4439a747e4fSDavid du Colombier 	drk[0       ] = erk[4*Nr    ];
4449a747e4fSDavid du Colombier 	drk[1       ] = erk[4*Nr + 1];
4459a747e4fSDavid du Colombier 	drk[2       ] = erk[4*Nr + 2];
4469a747e4fSDavid du Colombier 	drk[3       ] = erk[4*Nr + 3];
4479a747e4fSDavid du Colombier 	drk[4*Nr    ] = erk[0       ];
4489a747e4fSDavid du Colombier 	drk[4*Nr + 1] = erk[1       ];
4499a747e4fSDavid du Colombier 	drk[4*Nr + 2] = erk[2       ];
4509a747e4fSDavid du Colombier 	drk[4*Nr + 3] = erk[3       ];
4519a747e4fSDavid du Colombier 	erk += 4 * Nr;
4529a747e4fSDavid du Colombier 	for (i = 1; i < Nr; i++) {
4539a747e4fSDavid du Colombier 		drk += 4;
4549a747e4fSDavid du Colombier 		erk -= 4;
4559a747e4fSDavid du Colombier 		drk[0] =
4569a747e4fSDavid du Colombier 		    Td0[Te4[(erk[0] >> 24)       ]] ^
4579a747e4fSDavid du Colombier 		    Td1[Te4[(erk[0] >> 16) & 0xff]] ^
4589a747e4fSDavid du Colombier 		    Td2[Te4[(erk[0] >>  8) & 0xff]] ^
4599a747e4fSDavid du Colombier 		    Td3[Te4[(erk[0]      ) & 0xff]];
4609a747e4fSDavid du Colombier 		drk[1] =
4619a747e4fSDavid du Colombier 		    Td0[Te4[(erk[1] >> 24)       ]] ^
4629a747e4fSDavid du Colombier 		    Td1[Te4[(erk[1] >> 16) & 0xff]] ^
4639a747e4fSDavid du Colombier 		    Td2[Te4[(erk[1] >>  8) & 0xff]] ^
4649a747e4fSDavid du Colombier 		    Td3[Te4[(erk[1]      ) & 0xff]];
4659a747e4fSDavid du Colombier 		drk[2] =
4669a747e4fSDavid du Colombier 		    Td0[Te4[(erk[2] >> 24)       ]] ^
4679a747e4fSDavid du Colombier 		    Td1[Te4[(erk[2] >> 16) & 0xff]] ^
4689a747e4fSDavid du Colombier 		    Td2[Te4[(erk[2] >>  8) & 0xff]] ^
4699a747e4fSDavid du Colombier 		    Td3[Te4[(erk[2]      ) & 0xff]];
4709a747e4fSDavid du Colombier 		drk[3] =
4719a747e4fSDavid du Colombier 		    Td0[Te4[(erk[3] >> 24)       ]] ^
4729a747e4fSDavid du Colombier 		    Td1[Te4[(erk[3] >> 16) & 0xff]] ^
4739a747e4fSDavid du Colombier 		    Td2[Te4[(erk[3] >>  8) & 0xff]] ^
4749a747e4fSDavid du Colombier 		    Td3[Te4[(erk[3]      ) & 0xff]];
4759a747e4fSDavid du Colombier 	}
4769a747e4fSDavid du Colombier 	return Nr;
4779a747e4fSDavid du Colombier }
4789a747e4fSDavid du Colombier 
479ff55b41dSDavid du Colombier 
4809a747e4fSDavid du Colombier /*
4819a747e4fSDavid du Colombier Te0[x] = S [x].[02, 01, 01, 03];
4829a747e4fSDavid du Colombier Te1[x] = S [x].[03, 02, 01, 01];
4839a747e4fSDavid du Colombier Te2[x] = S [x].[01, 03, 02, 01];
4849a747e4fSDavid du Colombier Te3[x] = S [x].[01, 01, 03, 02];
4859a747e4fSDavid du Colombier Te4[x] = S [x]
4869a747e4fSDavid du Colombier 
4879a747e4fSDavid du Colombier Td0[x] = Si[x].[0e, 09, 0d, 0b];
4889a747e4fSDavid du Colombier Td1[x] = Si[x].[0b, 0e, 09, 0d];
4899a747e4fSDavid du Colombier Td2[x] = Si[x].[0d, 0b, 0e, 09];
4909a747e4fSDavid du Colombier Td3[x] = Si[x].[09, 0d, 0b, 0e];
4919a747e4fSDavid du Colombier Td4[x] = Si[x]
4929a747e4fSDavid du Colombier */
4939a747e4fSDavid du Colombier 
4949a747e4fSDavid du Colombier static const u32 Te0[256] = {
4959a747e4fSDavid du Colombier     0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
4969a747e4fSDavid du Colombier     0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
4979a747e4fSDavid du Colombier     0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
4989a747e4fSDavid du Colombier     0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
4999a747e4fSDavid du Colombier     0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
5009a747e4fSDavid du Colombier     0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
5019a747e4fSDavid du Colombier     0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
5029a747e4fSDavid du Colombier     0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
5039a747e4fSDavid du Colombier     0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
5049a747e4fSDavid du Colombier     0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
5059a747e4fSDavid du Colombier     0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
5069a747e4fSDavid du Colombier     0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
5079a747e4fSDavid du Colombier     0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
5089a747e4fSDavid du Colombier     0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
5099a747e4fSDavid du Colombier     0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
5109a747e4fSDavid du Colombier     0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
5119a747e4fSDavid du Colombier     0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
5129a747e4fSDavid du Colombier     0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
5139a747e4fSDavid du Colombier     0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
5149a747e4fSDavid du Colombier     0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
5159a747e4fSDavid du Colombier     0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
5169a747e4fSDavid du Colombier     0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
5179a747e4fSDavid du Colombier     0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
5189a747e4fSDavid du Colombier     0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
5199a747e4fSDavid du Colombier     0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
5209a747e4fSDavid du Colombier     0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
5219a747e4fSDavid du Colombier     0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
5229a747e4fSDavid du Colombier     0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
5239a747e4fSDavid du Colombier     0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
5249a747e4fSDavid du Colombier     0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
5259a747e4fSDavid du Colombier     0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
5269a747e4fSDavid du Colombier     0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
5279a747e4fSDavid du Colombier     0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
5289a747e4fSDavid du Colombier     0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
5299a747e4fSDavid du Colombier     0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
5309a747e4fSDavid du Colombier     0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
5319a747e4fSDavid du Colombier     0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
5329a747e4fSDavid du Colombier     0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
5339a747e4fSDavid du Colombier     0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
5349a747e4fSDavid du Colombier     0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
5359a747e4fSDavid du Colombier     0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
5369a747e4fSDavid du Colombier     0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
5379a747e4fSDavid du Colombier     0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
5389a747e4fSDavid du Colombier     0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
5399a747e4fSDavid du Colombier     0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
5409a747e4fSDavid du Colombier     0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
5419a747e4fSDavid du Colombier     0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
5429a747e4fSDavid du Colombier     0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
5439a747e4fSDavid du Colombier     0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
5449a747e4fSDavid du Colombier     0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
5459a747e4fSDavid du Colombier     0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
5469a747e4fSDavid du Colombier     0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
5479a747e4fSDavid du Colombier     0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
5489a747e4fSDavid du Colombier     0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
5499a747e4fSDavid du Colombier     0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
5509a747e4fSDavid du Colombier     0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
5519a747e4fSDavid du Colombier     0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
5529a747e4fSDavid du Colombier     0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
5539a747e4fSDavid du Colombier     0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
5549a747e4fSDavid du Colombier     0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
5559a747e4fSDavid du Colombier     0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
5569a747e4fSDavid du Colombier     0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
5579a747e4fSDavid du Colombier     0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
5589a747e4fSDavid du Colombier     0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
5599a747e4fSDavid du Colombier };
5609a747e4fSDavid du Colombier static const u32 Te1[256] = {
5619a747e4fSDavid du Colombier     0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,
5629a747e4fSDavid du Colombier     0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,
5639a747e4fSDavid du Colombier     0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,
5649a747e4fSDavid du Colombier     0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,
5659a747e4fSDavid du Colombier     0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
5669a747e4fSDavid du Colombier     0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,
5679a747e4fSDavid du Colombier     0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,
5689a747e4fSDavid du Colombier     0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,
5699a747e4fSDavid du Colombier     0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,
5709a747e4fSDavid du Colombier     0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
5719a747e4fSDavid du Colombier     0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,
5729a747e4fSDavid du Colombier     0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,
5739a747e4fSDavid du Colombier     0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,
5749a747e4fSDavid du Colombier     0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,
5759a747e4fSDavid du Colombier     0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
5769a747e4fSDavid du Colombier     0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,
5779a747e4fSDavid du Colombier     0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,
5789a747e4fSDavid du Colombier     0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,
5799a747e4fSDavid du Colombier     0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,
5809a747e4fSDavid du Colombier     0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
5819a747e4fSDavid du Colombier     0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,
5829a747e4fSDavid du Colombier     0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,
5839a747e4fSDavid du Colombier     0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,
5849a747e4fSDavid du Colombier     0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,
5859a747e4fSDavid du Colombier     0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
5869a747e4fSDavid du Colombier     0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,
5879a747e4fSDavid du Colombier     0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,
5889a747e4fSDavid du Colombier     0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,
5899a747e4fSDavid du Colombier     0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,
5909a747e4fSDavid du Colombier     0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
5919a747e4fSDavid du Colombier     0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,
5929a747e4fSDavid du Colombier     0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,
5939a747e4fSDavid du Colombier     0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,
5949a747e4fSDavid du Colombier     0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,
5959a747e4fSDavid du Colombier     0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
5969a747e4fSDavid du Colombier     0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,
5979a747e4fSDavid du Colombier     0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,
5989a747e4fSDavid du Colombier     0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,
5999a747e4fSDavid du Colombier     0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,
6009a747e4fSDavid du Colombier     0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
6019a747e4fSDavid du Colombier     0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,
6029a747e4fSDavid du Colombier     0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,
6039a747e4fSDavid du Colombier     0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,
6049a747e4fSDavid du Colombier     0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,
6059a747e4fSDavid du Colombier     0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
6069a747e4fSDavid du Colombier     0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,
6079a747e4fSDavid du Colombier     0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,
6089a747e4fSDavid du Colombier     0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,
6099a747e4fSDavid du Colombier     0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,
6109a747e4fSDavid du Colombier     0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
6119a747e4fSDavid du Colombier     0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,
6129a747e4fSDavid du Colombier     0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,
6139a747e4fSDavid du Colombier     0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,
6149a747e4fSDavid du Colombier     0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,
6159a747e4fSDavid du Colombier     0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
6169a747e4fSDavid du Colombier     0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,
6179a747e4fSDavid du Colombier     0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,
6189a747e4fSDavid du Colombier     0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,
6199a747e4fSDavid du Colombier     0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,
6209a747e4fSDavid du Colombier     0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
6219a747e4fSDavid du Colombier     0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,
6229a747e4fSDavid du Colombier     0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,
6239a747e4fSDavid du Colombier     0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,
6249a747e4fSDavid du Colombier     0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,
6259a747e4fSDavid du Colombier };
6269a747e4fSDavid du Colombier static const u32 Te2[256] = {
6279a747e4fSDavid du Colombier     0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,
6289a747e4fSDavid du Colombier     0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,
6299a747e4fSDavid du Colombier     0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,
6309a747e4fSDavid du Colombier     0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,
6319a747e4fSDavid du Colombier     0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
6329a747e4fSDavid du Colombier     0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,
6339a747e4fSDavid du Colombier     0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,
6349a747e4fSDavid du Colombier     0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,
6359a747e4fSDavid du Colombier     0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,
6369a747e4fSDavid du Colombier     0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
6379a747e4fSDavid du Colombier     0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,
6389a747e4fSDavid du Colombier     0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,
6399a747e4fSDavid du Colombier     0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,
6409a747e4fSDavid du Colombier     0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,
6419a747e4fSDavid du Colombier     0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
6429a747e4fSDavid du Colombier     0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,
6439a747e4fSDavid du Colombier     0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,
6449a747e4fSDavid du Colombier     0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,
6459a747e4fSDavid du Colombier     0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,
6469a747e4fSDavid du Colombier     0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
6479a747e4fSDavid du Colombier     0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,
6489a747e4fSDavid du Colombier     0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,
6499a747e4fSDavid du Colombier     0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,
6509a747e4fSDavid du Colombier     0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,
6519a747e4fSDavid du Colombier     0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
6529a747e4fSDavid du Colombier     0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,
6539a747e4fSDavid du Colombier     0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,
6549a747e4fSDavid du Colombier     0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,
6559a747e4fSDavid du Colombier     0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,
6569a747e4fSDavid du Colombier     0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
6579a747e4fSDavid du Colombier     0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,
6589a747e4fSDavid du Colombier     0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,
6599a747e4fSDavid du Colombier     0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,
6609a747e4fSDavid du Colombier     0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,
6619a747e4fSDavid du Colombier     0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
6629a747e4fSDavid du Colombier     0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,
6639a747e4fSDavid du Colombier     0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,
6649a747e4fSDavid du Colombier     0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,
6659a747e4fSDavid du Colombier     0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,
6669a747e4fSDavid du Colombier     0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
6679a747e4fSDavid du Colombier     0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,
6689a747e4fSDavid du Colombier     0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,
6699a747e4fSDavid du Colombier     0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,
6709a747e4fSDavid du Colombier     0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,
6719a747e4fSDavid du Colombier     0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
6729a747e4fSDavid du Colombier     0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,
6739a747e4fSDavid du Colombier     0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,
6749a747e4fSDavid du Colombier     0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,
6759a747e4fSDavid du Colombier     0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,
6769a747e4fSDavid du Colombier     0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
6779a747e4fSDavid du Colombier     0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,
6789a747e4fSDavid du Colombier     0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,
6799a747e4fSDavid du Colombier     0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,
6809a747e4fSDavid du Colombier     0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,
6819a747e4fSDavid du Colombier     0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
6829a747e4fSDavid du Colombier     0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,
6839a747e4fSDavid du Colombier     0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,
6849a747e4fSDavid du Colombier     0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,
6859a747e4fSDavid du Colombier     0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,
6869a747e4fSDavid du Colombier     0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
6879a747e4fSDavid du Colombier     0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,
6889a747e4fSDavid du Colombier     0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,
6899a747e4fSDavid du Colombier     0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,
6909a747e4fSDavid du Colombier     0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,
6919a747e4fSDavid du Colombier };
6929a747e4fSDavid du Colombier static const u32 Te3[256] = {
6939a747e4fSDavid du Colombier 
6949a747e4fSDavid du Colombier     0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,
6959a747e4fSDavid du Colombier     0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,
6969a747e4fSDavid du Colombier     0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,
6979a747e4fSDavid du Colombier     0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,
6989a747e4fSDavid du Colombier     0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
6999a747e4fSDavid du Colombier     0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,
7009a747e4fSDavid du Colombier     0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,
7019a747e4fSDavid du Colombier     0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,
7029a747e4fSDavid du Colombier     0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,
7039a747e4fSDavid du Colombier     0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
7049a747e4fSDavid du Colombier     0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,
7059a747e4fSDavid du Colombier     0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,
7069a747e4fSDavid du Colombier     0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,
7079a747e4fSDavid du Colombier     0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,
7089a747e4fSDavid du Colombier     0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
7099a747e4fSDavid du Colombier     0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,
7109a747e4fSDavid du Colombier     0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,
7119a747e4fSDavid du Colombier     0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,
7129a747e4fSDavid du Colombier     0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,
7139a747e4fSDavid du Colombier     0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
7149a747e4fSDavid du Colombier     0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,
7159a747e4fSDavid du Colombier     0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,
7169a747e4fSDavid du Colombier     0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,
7179a747e4fSDavid du Colombier     0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,
7189a747e4fSDavid du Colombier     0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
7199a747e4fSDavid du Colombier     0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,
7209a747e4fSDavid du Colombier     0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,
7219a747e4fSDavid du Colombier     0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,
7229a747e4fSDavid du Colombier     0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,
7239a747e4fSDavid du Colombier     0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
7249a747e4fSDavid du Colombier     0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,
7259a747e4fSDavid du Colombier     0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,
7269a747e4fSDavid du Colombier     0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,
7279a747e4fSDavid du Colombier     0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,
7289a747e4fSDavid du Colombier     0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
7299a747e4fSDavid du Colombier     0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,
7309a747e4fSDavid du Colombier     0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,
7319a747e4fSDavid du Colombier     0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,
7329a747e4fSDavid du Colombier     0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,
7339a747e4fSDavid du Colombier     0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
7349a747e4fSDavid du Colombier     0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,
7359a747e4fSDavid du Colombier     0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,
7369a747e4fSDavid du Colombier     0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,
7379a747e4fSDavid du Colombier     0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,
7389a747e4fSDavid du Colombier     0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
7399a747e4fSDavid du Colombier     0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,
7409a747e4fSDavid du Colombier     0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,
7419a747e4fSDavid du Colombier     0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,
7429a747e4fSDavid du Colombier     0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,
7439a747e4fSDavid du Colombier     0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
7449a747e4fSDavid du Colombier     0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,
7459a747e4fSDavid du Colombier     0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,
7469a747e4fSDavid du Colombier     0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,
7479a747e4fSDavid du Colombier     0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,
7489a747e4fSDavid du Colombier     0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
7499a747e4fSDavid du Colombier     0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,
7509a747e4fSDavid du Colombier     0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,
7519a747e4fSDavid du Colombier     0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,
7529a747e4fSDavid du Colombier     0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,
7539a747e4fSDavid du Colombier     0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
7549a747e4fSDavid du Colombier     0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,
7559a747e4fSDavid du Colombier     0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,
7569a747e4fSDavid du Colombier     0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,
7579a747e4fSDavid du Colombier     0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,
7589a747e4fSDavid du Colombier };
7599a747e4fSDavid du Colombier static const u8 Te4[256] = {
7609a747e4fSDavid du Colombier     0x63U, 0x7cU, 0x77U, 0x7bU,
7619a747e4fSDavid du Colombier     0xf2U, 0x6bU, 0x6fU, 0xc5U,
7629a747e4fSDavid du Colombier     0x30U, 0x01U, 0x67U, 0x2bU,
7639a747e4fSDavid du Colombier     0xfeU, 0xd7U, 0xabU, 0x76U,
7649a747e4fSDavid du Colombier     0xcaU, 0x82U, 0xc9U, 0x7dU,
7659a747e4fSDavid du Colombier     0xfaU, 0x59U, 0x47U, 0xf0U,
7669a747e4fSDavid du Colombier     0xadU, 0xd4U, 0xa2U, 0xafU,
7679a747e4fSDavid du Colombier     0x9cU, 0xa4U, 0x72U, 0xc0U,
7689a747e4fSDavid du Colombier     0xb7U, 0xfdU, 0x93U, 0x26U,
7699a747e4fSDavid du Colombier     0x36U, 0x3fU, 0xf7U, 0xccU,
7709a747e4fSDavid du Colombier     0x34U, 0xa5U, 0xe5U, 0xf1U,
7719a747e4fSDavid du Colombier     0x71U, 0xd8U, 0x31U, 0x15U,
7729a747e4fSDavid du Colombier     0x04U, 0xc7U, 0x23U, 0xc3U,
7739a747e4fSDavid du Colombier     0x18U, 0x96U, 0x05U, 0x9aU,
7749a747e4fSDavid du Colombier     0x07U, 0x12U, 0x80U, 0xe2U,
7759a747e4fSDavid du Colombier     0xebU, 0x27U, 0xb2U, 0x75U,
7769a747e4fSDavid du Colombier     0x09U, 0x83U, 0x2cU, 0x1aU,
7779a747e4fSDavid du Colombier     0x1bU, 0x6eU, 0x5aU, 0xa0U,
7789a747e4fSDavid du Colombier     0x52U, 0x3bU, 0xd6U, 0xb3U,
7799a747e4fSDavid du Colombier     0x29U, 0xe3U, 0x2fU, 0x84U,
7809a747e4fSDavid du Colombier     0x53U, 0xd1U, 0x00U, 0xedU,
7819a747e4fSDavid du Colombier     0x20U, 0xfcU, 0xb1U, 0x5bU,
7829a747e4fSDavid du Colombier     0x6aU, 0xcbU, 0xbeU, 0x39U,
7839a747e4fSDavid du Colombier     0x4aU, 0x4cU, 0x58U, 0xcfU,
7849a747e4fSDavid du Colombier     0xd0U, 0xefU, 0xaaU, 0xfbU,
7859a747e4fSDavid du Colombier     0x43U, 0x4dU, 0x33U, 0x85U,
7869a747e4fSDavid du Colombier     0x45U, 0xf9U, 0x02U, 0x7fU,
7879a747e4fSDavid du Colombier     0x50U, 0x3cU, 0x9fU, 0xa8U,
7889a747e4fSDavid du Colombier     0x51U, 0xa3U, 0x40U, 0x8fU,
7899a747e4fSDavid du Colombier     0x92U, 0x9dU, 0x38U, 0xf5U,
7909a747e4fSDavid du Colombier     0xbcU, 0xb6U, 0xdaU, 0x21U,
7919a747e4fSDavid du Colombier     0x10U, 0xffU, 0xf3U, 0xd2U,
7929a747e4fSDavid du Colombier     0xcdU, 0x0cU, 0x13U, 0xecU,
7939a747e4fSDavid du Colombier     0x5fU, 0x97U, 0x44U, 0x17U,
7949a747e4fSDavid du Colombier     0xc4U, 0xa7U, 0x7eU, 0x3dU,
7959a747e4fSDavid du Colombier     0x64U, 0x5dU, 0x19U, 0x73U,
7969a747e4fSDavid du Colombier     0x60U, 0x81U, 0x4fU, 0xdcU,
7979a747e4fSDavid du Colombier     0x22U, 0x2aU, 0x90U, 0x88U,
7989a747e4fSDavid du Colombier     0x46U, 0xeeU, 0xb8U, 0x14U,
7999a747e4fSDavid du Colombier     0xdeU, 0x5eU, 0x0bU, 0xdbU,
8009a747e4fSDavid du Colombier     0xe0U, 0x32U, 0x3aU, 0x0aU,
8019a747e4fSDavid du Colombier     0x49U, 0x06U, 0x24U, 0x5cU,
8029a747e4fSDavid du Colombier     0xc2U, 0xd3U, 0xacU, 0x62U,
8039a747e4fSDavid du Colombier     0x91U, 0x95U, 0xe4U, 0x79U,
8049a747e4fSDavid du Colombier     0xe7U, 0xc8U, 0x37U, 0x6dU,
8059a747e4fSDavid du Colombier     0x8dU, 0xd5U, 0x4eU, 0xa9U,
8069a747e4fSDavid du Colombier     0x6cU, 0x56U, 0xf4U, 0xeaU,
8079a747e4fSDavid du Colombier     0x65U, 0x7aU, 0xaeU, 0x08U,
8089a747e4fSDavid du Colombier     0xbaU, 0x78U, 0x25U, 0x2eU,
8099a747e4fSDavid du Colombier     0x1cU, 0xa6U, 0xb4U, 0xc6U,
8109a747e4fSDavid du Colombier     0xe8U, 0xddU, 0x74U, 0x1fU,
8119a747e4fSDavid du Colombier     0x4bU, 0xbdU, 0x8bU, 0x8aU,
8129a747e4fSDavid du Colombier     0x70U, 0x3eU, 0xb5U, 0x66U,
8139a747e4fSDavid du Colombier     0x48U, 0x03U, 0xf6U, 0x0eU,
8149a747e4fSDavid du Colombier     0x61U, 0x35U, 0x57U, 0xb9U,
8159a747e4fSDavid du Colombier     0x86U, 0xc1U, 0x1dU, 0x9eU,
8169a747e4fSDavid du Colombier     0xe1U, 0xf8U, 0x98U, 0x11U,
8179a747e4fSDavid du Colombier     0x69U, 0xd9U, 0x8eU, 0x94U,
8189a747e4fSDavid du Colombier     0x9bU, 0x1eU, 0x87U, 0xe9U,
8199a747e4fSDavid du Colombier     0xceU, 0x55U, 0x28U, 0xdfU,
8209a747e4fSDavid du Colombier     0x8cU, 0xa1U, 0x89U, 0x0dU,
8219a747e4fSDavid du Colombier     0xbfU, 0xe6U, 0x42U, 0x68U,
8229a747e4fSDavid du Colombier     0x41U, 0x99U, 0x2dU, 0x0fU,
8239a747e4fSDavid du Colombier     0xb0U, 0x54U, 0xbbU, 0x16U,
8249a747e4fSDavid du Colombier };
8259a747e4fSDavid du Colombier static const u32 Td0[256] = {
8269a747e4fSDavid du Colombier     0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
8279a747e4fSDavid du Colombier     0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
8289a747e4fSDavid du Colombier     0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
8299a747e4fSDavid du Colombier     0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,
8309a747e4fSDavid du Colombier     0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
8319a747e4fSDavid du Colombier     0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,
8329a747e4fSDavid du Colombier     0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,
8339a747e4fSDavid du Colombier     0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,
8349a747e4fSDavid du Colombier     0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,
8359a747e4fSDavid du Colombier     0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
8369a747e4fSDavid du Colombier     0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,
8379a747e4fSDavid du Colombier     0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,
8389a747e4fSDavid du Colombier     0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,
8399a747e4fSDavid du Colombier     0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,
8409a747e4fSDavid du Colombier     0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
8419a747e4fSDavid du Colombier     0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,
8429a747e4fSDavid du Colombier     0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,
8439a747e4fSDavid du Colombier     0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,
8449a747e4fSDavid du Colombier     0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,
8459a747e4fSDavid du Colombier     0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
8469a747e4fSDavid du Colombier     0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,
8479a747e4fSDavid du Colombier     0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,
8489a747e4fSDavid du Colombier     0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,
8499a747e4fSDavid du Colombier     0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,
8509a747e4fSDavid du Colombier     0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
8519a747e4fSDavid du Colombier     0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,
8529a747e4fSDavid du Colombier     0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,
8539a747e4fSDavid du Colombier     0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,
8549a747e4fSDavid du Colombier     0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,
8559a747e4fSDavid du Colombier     0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
8569a747e4fSDavid du Colombier     0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,
8579a747e4fSDavid du Colombier     0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,
8589a747e4fSDavid du Colombier     0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,
8599a747e4fSDavid du Colombier     0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,
8609a747e4fSDavid du Colombier     0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
8619a747e4fSDavid du Colombier     0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,
8629a747e4fSDavid du Colombier     0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,
8639a747e4fSDavid du Colombier     0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,
8649a747e4fSDavid du Colombier     0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,
8659a747e4fSDavid du Colombier     0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
8669a747e4fSDavid du Colombier     0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,
8679a747e4fSDavid du Colombier     0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,
8689a747e4fSDavid du Colombier     0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,
8699a747e4fSDavid du Colombier     0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,
8709a747e4fSDavid du Colombier     0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
8719a747e4fSDavid du Colombier     0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,
8729a747e4fSDavid du Colombier     0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,
8739a747e4fSDavid du Colombier     0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,
8749a747e4fSDavid du Colombier     0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,
8759a747e4fSDavid du Colombier     0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
8769a747e4fSDavid du Colombier     0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,
8779a747e4fSDavid du Colombier     0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,
8789a747e4fSDavid du Colombier     0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,
8799a747e4fSDavid du Colombier     0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,
8809a747e4fSDavid du Colombier     0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
8819a747e4fSDavid du Colombier     0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,
8829a747e4fSDavid du Colombier     0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,
8839a747e4fSDavid du Colombier     0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,
8849a747e4fSDavid du Colombier     0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,
8859a747e4fSDavid du Colombier     0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
8869a747e4fSDavid du Colombier     0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,
8879a747e4fSDavid du Colombier     0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,
8889a747e4fSDavid du Colombier     0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
8899a747e4fSDavid du Colombier     0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
8909a747e4fSDavid du Colombier };
8919a747e4fSDavid du Colombier static const u32 Td1[256] = {
8929a747e4fSDavid du Colombier     0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,
8939a747e4fSDavid du Colombier     0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,
8949a747e4fSDavid du Colombier     0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU,
8959a747e4fSDavid du Colombier     0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U,
8969a747e4fSDavid du Colombier     0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,
8979a747e4fSDavid du Colombier     0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U,
8989a747e4fSDavid du Colombier     0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U,
8999a747e4fSDavid du Colombier     0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U,
9009a747e4fSDavid du Colombier     0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U,
9019a747e4fSDavid du Colombier     0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,
9029a747e4fSDavid du Colombier     0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU,
9039a747e4fSDavid du Colombier     0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU,
9049a747e4fSDavid du Colombier     0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U,
9059a747e4fSDavid du Colombier     0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU,
9069a747e4fSDavid du Colombier     0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,
9079a747e4fSDavid du Colombier     0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U,
9089a747e4fSDavid du Colombier     0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U,
9099a747e4fSDavid du Colombier     0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU,
9109a747e4fSDavid du Colombier     0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU,
9119a747e4fSDavid du Colombier     0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,
9129a747e4fSDavid du Colombier     0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU,
9139a747e4fSDavid du Colombier     0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U,
9149a747e4fSDavid du Colombier     0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU,
9159a747e4fSDavid du Colombier     0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU,
9169a747e4fSDavid du Colombier     0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,
9179a747e4fSDavid du Colombier     0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U,
9189a747e4fSDavid du Colombier     0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U,
9199a747e4fSDavid du Colombier     0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU,
9209a747e4fSDavid du Colombier     0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U,
9219a747e4fSDavid du Colombier     0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,
9229a747e4fSDavid du Colombier     0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U,
9239a747e4fSDavid du Colombier     0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U,
9249a747e4fSDavid du Colombier     0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U,
9259a747e4fSDavid du Colombier     0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU,
9269a747e4fSDavid du Colombier     0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,
9279a747e4fSDavid du Colombier     0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U,
9289a747e4fSDavid du Colombier     0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U,
9299a747e4fSDavid du Colombier     0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U,
9309a747e4fSDavid du Colombier     0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U,
9319a747e4fSDavid du Colombier     0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,
9329a747e4fSDavid du Colombier     0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU,
9339a747e4fSDavid du Colombier     0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU,
9349a747e4fSDavid du Colombier     0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U,
9359a747e4fSDavid du Colombier     0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU,
9369a747e4fSDavid du Colombier     0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,
9379a747e4fSDavid du Colombier     0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU,
9389a747e4fSDavid du Colombier     0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU,
9399a747e4fSDavid du Colombier     0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U,
9409a747e4fSDavid du Colombier     0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU,
9419a747e4fSDavid du Colombier     0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,
9429a747e4fSDavid du Colombier     0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U,
9439a747e4fSDavid du Colombier     0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U,
9449a747e4fSDavid du Colombier     0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U,
9459a747e4fSDavid du Colombier     0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U,
9469a747e4fSDavid du Colombier     0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,
9479a747e4fSDavid du Colombier     0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U,
9489a747e4fSDavid du Colombier     0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU,
9499a747e4fSDavid du Colombier     0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U,
9509a747e4fSDavid du Colombier     0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U,
9519a747e4fSDavid du Colombier     0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,
9529a747e4fSDavid du Colombier     0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U,
9539a747e4fSDavid du Colombier     0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U,
9549a747e4fSDavid du Colombier     0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,
9559a747e4fSDavid du Colombier     0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,
9569a747e4fSDavid du Colombier };
9579a747e4fSDavid du Colombier static const u32 Td2[256] = {
9589a747e4fSDavid du Colombier     0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,
9599a747e4fSDavid du Colombier     0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,
9609a747e4fSDavid du Colombier     0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U,
9619a747e4fSDavid du Colombier     0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U,
9629a747e4fSDavid du Colombier     0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,
9639a747e4fSDavid du Colombier     0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U,
9649a747e4fSDavid du Colombier     0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U,
9659a747e4fSDavid du Colombier     0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U,
9669a747e4fSDavid du Colombier     0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U,
9679a747e4fSDavid du Colombier     0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,
9689a747e4fSDavid du Colombier     0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U,
9699a747e4fSDavid du Colombier     0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U,
9709a747e4fSDavid du Colombier     0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU,
9719a747e4fSDavid du Colombier     0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U,
9729a747e4fSDavid du Colombier     0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,
9739a747e4fSDavid du Colombier     0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U,
9749a747e4fSDavid du Colombier     0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U,
9759a747e4fSDavid du Colombier     0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U,
9769a747e4fSDavid du Colombier     0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U,
9779a747e4fSDavid du Colombier     0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,
9789a747e4fSDavid du Colombier 
9799a747e4fSDavid du Colombier     0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U,
9809a747e4fSDavid du Colombier     0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U,
9819a747e4fSDavid du Colombier     0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U,
9829a747e4fSDavid du Colombier     0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U,
9839a747e4fSDavid du Colombier     0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,
9849a747e4fSDavid du Colombier     0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU,
9859a747e4fSDavid du Colombier     0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU,
9869a747e4fSDavid du Colombier     0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U,
9879a747e4fSDavid du Colombier     0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU,
9889a747e4fSDavid du Colombier     0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,
9899a747e4fSDavid du Colombier     0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU,
9909a747e4fSDavid du Colombier     0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU,
9919a747e4fSDavid du Colombier     0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU,
9929a747e4fSDavid du Colombier     0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU,
9939a747e4fSDavid du Colombier     0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,
9949a747e4fSDavid du Colombier     0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U,
9959a747e4fSDavid du Colombier     0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U,
9969a747e4fSDavid du Colombier     0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U,
9979a747e4fSDavid du Colombier     0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U,
9989a747e4fSDavid du Colombier     0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,
9999a747e4fSDavid du Colombier     0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U,
10009a747e4fSDavid du Colombier     0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU,
10019a747e4fSDavid du Colombier     0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU,
10029a747e4fSDavid du Colombier     0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U,
10039a747e4fSDavid du Colombier     0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,
10049a747e4fSDavid du Colombier     0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU,
10059a747e4fSDavid du Colombier     0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU,
10069a747e4fSDavid du Colombier     0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U,
10079a747e4fSDavid du Colombier     0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U,
10089a747e4fSDavid du Colombier     0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,
10099a747e4fSDavid du Colombier     0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U,
10109a747e4fSDavid du Colombier     0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U,
10119a747e4fSDavid du Colombier     0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U,
10129a747e4fSDavid du Colombier     0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U,
10139a747e4fSDavid du Colombier     0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,
10149a747e4fSDavid du Colombier     0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U,
10159a747e4fSDavid du Colombier     0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U,
10169a747e4fSDavid du Colombier     0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U,
10179a747e4fSDavid du Colombier     0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U,
10189a747e4fSDavid du Colombier     0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,
10199a747e4fSDavid du Colombier     0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U,
10209a747e4fSDavid du Colombier     0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU,
10219a747e4fSDavid du Colombier     0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,
10229a747e4fSDavid du Colombier     0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,
10239a747e4fSDavid du Colombier };
10249a747e4fSDavid du Colombier static const u32 Td3[256] = {
10259a747e4fSDavid du Colombier     0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,
10269a747e4fSDavid du Colombier     0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,
10279a747e4fSDavid du Colombier     0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U,
10289a747e4fSDavid du Colombier     0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U,
10299a747e4fSDavid du Colombier     0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,
10309a747e4fSDavid du Colombier     0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU,
10319a747e4fSDavid du Colombier     0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U,
10329a747e4fSDavid du Colombier     0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU,
10339a747e4fSDavid du Colombier     0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U,
10349a747e4fSDavid du Colombier     0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,
10359a747e4fSDavid du Colombier     0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U,
10369a747e4fSDavid du Colombier     0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U,
10379a747e4fSDavid du Colombier     0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U,
10389a747e4fSDavid du Colombier     0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U,
10399a747e4fSDavid du Colombier     0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,
10409a747e4fSDavid du Colombier     0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU,
10419a747e4fSDavid du Colombier     0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU,
10429a747e4fSDavid du Colombier     0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U,
10439a747e4fSDavid du Colombier     0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U,
10449a747e4fSDavid du Colombier     0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,
10459a747e4fSDavid du Colombier     0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU,
10469a747e4fSDavid du Colombier     0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U,
10479a747e4fSDavid du Colombier     0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U,
10489a747e4fSDavid du Colombier     0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U,
10499a747e4fSDavid du Colombier     0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,
10509a747e4fSDavid du Colombier     0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU,
10519a747e4fSDavid du Colombier     0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U,
10529a747e4fSDavid du Colombier     0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U,
10539a747e4fSDavid du Colombier     0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU,
10549a747e4fSDavid du Colombier     0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,
10559a747e4fSDavid du Colombier     0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U,
10569a747e4fSDavid du Colombier     0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U,
10579a747e4fSDavid du Colombier     0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U,
10589a747e4fSDavid du Colombier     0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU,
10599a747e4fSDavid du Colombier     0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,
10609a747e4fSDavid du Colombier     0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U,
10619a747e4fSDavid du Colombier     0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U,
10629a747e4fSDavid du Colombier     0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U,
10639a747e4fSDavid du Colombier     0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U,
10649a747e4fSDavid du Colombier     0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,
10659a747e4fSDavid du Colombier     0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U,
10669a747e4fSDavid du Colombier     0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU,
10679a747e4fSDavid du Colombier     0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U,
10689a747e4fSDavid du Colombier     0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U,
10699a747e4fSDavid du Colombier     0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,
10709a747e4fSDavid du Colombier     0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU,
10719a747e4fSDavid du Colombier     0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U,
10729a747e4fSDavid du Colombier     0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU,
10739a747e4fSDavid du Colombier     0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U,
10749a747e4fSDavid du Colombier     0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,
10759a747e4fSDavid du Colombier     0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U,
10769a747e4fSDavid du Colombier     0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U,
10779a747e4fSDavid du Colombier     0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U,
10789a747e4fSDavid du Colombier     0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U,
10799a747e4fSDavid du Colombier     0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,
10809a747e4fSDavid du Colombier     0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU,
10819a747e4fSDavid du Colombier     0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU,
10829a747e4fSDavid du Colombier     0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU,
10839a747e4fSDavid du Colombier     0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U,
10849a747e4fSDavid du Colombier     0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,
10859a747e4fSDavid du Colombier     0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U,
10869a747e4fSDavid du Colombier     0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU,
10879a747e4fSDavid du Colombier     0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,
10889a747e4fSDavid du Colombier     0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,
10899a747e4fSDavid du Colombier };
10909a747e4fSDavid du Colombier static const u8 Td4[256] = {
10919a747e4fSDavid du Colombier     0x52U, 0x09U, 0x6aU, 0xd5U,
10929a747e4fSDavid du Colombier     0x30U, 0x36U, 0xa5U, 0x38U,
10939a747e4fSDavid du Colombier     0xbfU, 0x40U, 0xa3U, 0x9eU,
10949a747e4fSDavid du Colombier     0x81U, 0xf3U, 0xd7U, 0xfbU,
10959a747e4fSDavid du Colombier     0x7cU, 0xe3U, 0x39U, 0x82U,
10969a747e4fSDavid du Colombier     0x9bU, 0x2fU, 0xffU, 0x87U,
10979a747e4fSDavid du Colombier     0x34U, 0x8eU, 0x43U, 0x44U,
10989a747e4fSDavid du Colombier     0xc4U, 0xdeU, 0xe9U, 0xcbU,
10999a747e4fSDavid du Colombier     0x54U, 0x7bU, 0x94U, 0x32U,
11009a747e4fSDavid du Colombier     0xa6U, 0xc2U, 0x23U, 0x3dU,
11019a747e4fSDavid du Colombier     0xeeU, 0x4cU, 0x95U, 0x0bU,
11029a747e4fSDavid du Colombier     0x42U, 0xfaU, 0xc3U, 0x4eU,
11039a747e4fSDavid du Colombier     0x08U, 0x2eU, 0xa1U, 0x66U,
11049a747e4fSDavid du Colombier     0x28U, 0xd9U, 0x24U, 0xb2U,
11059a747e4fSDavid du Colombier     0x76U, 0x5bU, 0xa2U, 0x49U,
11069a747e4fSDavid du Colombier     0x6dU, 0x8bU, 0xd1U, 0x25U,
11079a747e4fSDavid du Colombier     0x72U, 0xf8U, 0xf6U, 0x64U,
11089a747e4fSDavid du Colombier     0x86U, 0x68U, 0x98U, 0x16U,
11099a747e4fSDavid du Colombier     0xd4U, 0xa4U, 0x5cU, 0xccU,
11109a747e4fSDavid du Colombier     0x5dU, 0x65U, 0xb6U, 0x92U,
11119a747e4fSDavid du Colombier     0x6cU, 0x70U, 0x48U, 0x50U,
11129a747e4fSDavid du Colombier     0xfdU, 0xedU, 0xb9U, 0xdaU,
11139a747e4fSDavid du Colombier     0x5eU, 0x15U, 0x46U, 0x57U,
11149a747e4fSDavid du Colombier     0xa7U, 0x8dU, 0x9dU, 0x84U,
11159a747e4fSDavid du Colombier     0x90U, 0xd8U, 0xabU, 0x00U,
11169a747e4fSDavid du Colombier     0x8cU, 0xbcU, 0xd3U, 0x0aU,
11179a747e4fSDavid du Colombier     0xf7U, 0xe4U, 0x58U, 0x05U,
11189a747e4fSDavid du Colombier     0xb8U, 0xb3U, 0x45U, 0x06U,
11199a747e4fSDavid du Colombier     0xd0U, 0x2cU, 0x1eU, 0x8fU,
11209a747e4fSDavid du Colombier     0xcaU, 0x3fU, 0x0fU, 0x02U,
11219a747e4fSDavid du Colombier     0xc1U, 0xafU, 0xbdU, 0x03U,
11229a747e4fSDavid du Colombier     0x01U, 0x13U, 0x8aU, 0x6bU,
11239a747e4fSDavid du Colombier     0x3aU, 0x91U, 0x11U, 0x41U,
11249a747e4fSDavid du Colombier     0x4fU, 0x67U, 0xdcU, 0xeaU,
11259a747e4fSDavid du Colombier     0x97U, 0xf2U, 0xcfU, 0xceU,
11269a747e4fSDavid du Colombier     0xf0U, 0xb4U, 0xe6U, 0x73U,
11279a747e4fSDavid du Colombier     0x96U, 0xacU, 0x74U, 0x22U,
11289a747e4fSDavid du Colombier     0xe7U, 0xadU, 0x35U, 0x85U,
11299a747e4fSDavid du Colombier     0xe2U, 0xf9U, 0x37U, 0xe8U,
11309a747e4fSDavid du Colombier     0x1cU, 0x75U, 0xdfU, 0x6eU,
11319a747e4fSDavid du Colombier     0x47U, 0xf1U, 0x1aU, 0x71U,
11329a747e4fSDavid du Colombier     0x1dU, 0x29U, 0xc5U, 0x89U,
11339a747e4fSDavid du Colombier     0x6fU, 0xb7U, 0x62U, 0x0eU,
11349a747e4fSDavid du Colombier     0xaaU, 0x18U, 0xbeU, 0x1bU,
11359a747e4fSDavid du Colombier     0xfcU, 0x56U, 0x3eU, 0x4bU,
11369a747e4fSDavid du Colombier     0xc6U, 0xd2U, 0x79U, 0x20U,
11379a747e4fSDavid du Colombier     0x9aU, 0xdbU, 0xc0U, 0xfeU,
11389a747e4fSDavid du Colombier     0x78U, 0xcdU, 0x5aU, 0xf4U,
11399a747e4fSDavid du Colombier     0x1fU, 0xddU, 0xa8U, 0x33U,
11409a747e4fSDavid du Colombier     0x88U, 0x07U, 0xc7U, 0x31U,
11419a747e4fSDavid du Colombier     0xb1U, 0x12U, 0x10U, 0x59U,
11429a747e4fSDavid du Colombier     0x27U, 0x80U, 0xecU, 0x5fU,
11439a747e4fSDavid du Colombier     0x60U, 0x51U, 0x7fU, 0xa9U,
11449a747e4fSDavid du Colombier     0x19U, 0xb5U, 0x4aU, 0x0dU,
11459a747e4fSDavid du Colombier     0x2dU, 0xe5U, 0x7aU, 0x9fU,
11469a747e4fSDavid du Colombier     0x93U, 0xc9U, 0x9cU, 0xefU,
11479a747e4fSDavid du Colombier     0xa0U, 0xe0U, 0x3bU, 0x4dU,
11489a747e4fSDavid du Colombier     0xaeU, 0x2aU, 0xf5U, 0xb0U,
11499a747e4fSDavid du Colombier     0xc8U, 0xebU, 0xbbU, 0x3cU,
11509a747e4fSDavid du Colombier     0x83U, 0x53U, 0x99U, 0x61U,
11519a747e4fSDavid du Colombier     0x17U, 0x2bU, 0x04U, 0x7eU,
11529a747e4fSDavid du Colombier     0xbaU, 0x77U, 0xd6U, 0x26U,
11539a747e4fSDavid du Colombier     0xe1U, 0x69U, 0x14U, 0x63U,
11549a747e4fSDavid du Colombier     0x55U, 0x21U, 0x0cU, 0x7dU,
11559a747e4fSDavid du Colombier };
11569a747e4fSDavid du Colombier static const u32 rcon[] = {
11579a747e4fSDavid du Colombier 	0x01000000, 0x02000000, 0x04000000, 0x08000000,
11589a747e4fSDavid du Colombier 	0x10000000, 0x20000000, 0x40000000, 0x80000000,
1159fc4036bfSDavid du Colombier 	0x1B000000, 0x36000000,
1160fc4036bfSDavid du Colombier 	/* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
11619a747e4fSDavid du Colombier };
11629a747e4fSDavid du Colombier 
1163fc4036bfSDavid du Colombier #define GETU32(pt) (((u32)(pt)[0]<<24) ^ ((u32)(pt)[1]<<16) ^ \
1164fc4036bfSDavid du Colombier 		    ((u32)(pt)[2]<< 8) ^ ((u32)(pt)[3]))
1165fc4036bfSDavid du Colombier #define PUTU32(ct, st) { (ct)[0] = (u8)((st)>>24); (ct)[1] = (u8)((st)>>16); \
1166fc4036bfSDavid du Colombier 			 (ct)[2] = (u8)((st)>> 8); (ct)[3] = (u8)(st); }
11679a747e4fSDavid du Colombier 
1168fc4036bfSDavid du Colombier /*
11699a747e4fSDavid du Colombier  * Expand the cipher key into the encryption key schedule.
11709a747e4fSDavid du Colombier  *
11719a747e4fSDavid du Colombier  * @return	the number of rounds for the given cipher key size.
11729a747e4fSDavid du Colombier  */
1173e5442215SDavid du Colombier static int
aes_setupEnc(ulong rk[],const uchar cipherKey[],int keyBits)1174410ea80bSDavid du Colombier aes_setupEnc(ulong rk[/*4*(Nr + 1)*/], const uchar cipherKey[], int keyBits)
1175fc4036bfSDavid du Colombier {
11769a747e4fSDavid du Colombier 	int i = 0;
11779a747e4fSDavid du Colombier 	u32 temp;
11789a747e4fSDavid du Colombier 
11799a747e4fSDavid du Colombier 	rk[0] = GETU32(cipherKey     );
11809a747e4fSDavid du Colombier 	rk[1] = GETU32(cipherKey +  4);
11819a747e4fSDavid du Colombier 	rk[2] = GETU32(cipherKey +  8);
11829a747e4fSDavid du Colombier 	rk[3] = GETU32(cipherKey + 12);
11839a747e4fSDavid du Colombier 	if (keyBits == 128) {
11849a747e4fSDavid du Colombier 		for (;;) {
11859a747e4fSDavid du Colombier 			temp  = rk[3];
11869a747e4fSDavid du Colombier 			rk[4] = rk[0] ^
11879a747e4fSDavid du Colombier 				(Te4[(temp >> 16) & 0xff] << 24) ^
11889a747e4fSDavid du Colombier 				(Te4[(temp >>  8) & 0xff] << 16) ^
11899a747e4fSDavid du Colombier 				(Te4[(temp      ) & 0xff] <<  8) ^
11909a747e4fSDavid du Colombier 				(Te4[(temp >> 24)       ]      ) ^
11919a747e4fSDavid du Colombier 				rcon[i];
11929a747e4fSDavid du Colombier 			rk[5] = rk[1] ^ rk[4];
11939a747e4fSDavid du Colombier 			rk[6] = rk[2] ^ rk[5];
11949a747e4fSDavid du Colombier 			rk[7] = rk[3] ^ rk[6];
11959a747e4fSDavid du Colombier 			if (++i == 10) {
11969a747e4fSDavid du Colombier 				return 10;
11979a747e4fSDavid du Colombier 			}
11989a747e4fSDavid du Colombier 			rk += 4;
11999a747e4fSDavid du Colombier 		}
12009a747e4fSDavid du Colombier 	}
12019a747e4fSDavid du Colombier 	rk[4] = GETU32(cipherKey + 16);
12029a747e4fSDavid du Colombier 	rk[5] = GETU32(cipherKey + 20);
12039a747e4fSDavid du Colombier 	if (keyBits == 192) {
12049a747e4fSDavid du Colombier 		for (;;) {
12059a747e4fSDavid du Colombier 			temp = rk[ 5];
12069a747e4fSDavid du Colombier 			rk[ 6] = rk[ 0] ^
12079a747e4fSDavid du Colombier 				(Te4[(temp >> 16) & 0xff] << 24) ^
12089a747e4fSDavid du Colombier 				(Te4[(temp >>  8) & 0xff] << 16) ^
12099a747e4fSDavid du Colombier 				(Te4[(temp      ) & 0xff] <<  8) ^
12109a747e4fSDavid du Colombier 				(Te4[(temp >> 24)       ]      ) ^
12119a747e4fSDavid du Colombier 				rcon[i];
12129a747e4fSDavid du Colombier 			rk[ 7] = rk[ 1] ^ rk[ 6];
12139a747e4fSDavid du Colombier 			rk[ 8] = rk[ 2] ^ rk[ 7];
12149a747e4fSDavid du Colombier 			rk[ 9] = rk[ 3] ^ rk[ 8];
12159a747e4fSDavid du Colombier 			if (++i == 8) {
12169a747e4fSDavid du Colombier 				return 12;
12179a747e4fSDavid du Colombier 			}
12189a747e4fSDavid du Colombier 			rk[10] = rk[ 4] ^ rk[ 9];
12199a747e4fSDavid du Colombier 			rk[11] = rk[ 5] ^ rk[10];
12209a747e4fSDavid du Colombier 			rk += 6;
12219a747e4fSDavid du Colombier 		}
12229a747e4fSDavid du Colombier 	}
12239a747e4fSDavid du Colombier 	rk[6] = GETU32(cipherKey + 24);
12249a747e4fSDavid du Colombier 	rk[7] = GETU32(cipherKey + 28);
12259a747e4fSDavid du Colombier 	if (keyBits == 256) {
12269a747e4fSDavid du Colombier 	        for (;;) {
12279a747e4fSDavid du Colombier 	        	temp = rk[ 7];
12289a747e4fSDavid du Colombier 	        	rk[ 8] = rk[ 0] ^
12299a747e4fSDavid du Colombier 	        		(Te4[(temp >> 16) & 0xff] << 24) ^
12309a747e4fSDavid du Colombier 	        		(Te4[(temp >>  8) & 0xff] << 16) ^
12319a747e4fSDavid du Colombier 	        		(Te4[(temp      ) & 0xff] <<  8) ^
12329a747e4fSDavid du Colombier 	        		(Te4[(temp >> 24)       ]      ) ^
12339a747e4fSDavid du Colombier 	        		rcon[i];
12349a747e4fSDavid du Colombier 	        	rk[ 9] = rk[ 1] ^ rk[ 8];
12359a747e4fSDavid du Colombier 	        	rk[10] = rk[ 2] ^ rk[ 9];
12369a747e4fSDavid du Colombier 	        	rk[11] = rk[ 3] ^ rk[10];
12379a747e4fSDavid du Colombier 			if (++i == 7) {
12389a747e4fSDavid du Colombier 				return 14;
12399a747e4fSDavid du Colombier 			}
12409a747e4fSDavid du Colombier 	        	temp = rk[11];
12419a747e4fSDavid du Colombier 	        	rk[12] = rk[ 4] ^
12429a747e4fSDavid du Colombier 	        		(Te4[(temp >> 24)       ] << 24) ^
12439a747e4fSDavid du Colombier 	        		(Te4[(temp >> 16) & 0xff] << 16) ^
12449a747e4fSDavid du Colombier 	        		(Te4[(temp >>  8) & 0xff] <<  8) ^
12459a747e4fSDavid du Colombier 	        		(Te4[(temp      ) & 0xff]      );
12469a747e4fSDavid du Colombier 	        	rk[13] = rk[ 5] ^ rk[12];
12479a747e4fSDavid du Colombier 	        	rk[14] = rk[ 6] ^ rk[13];
12489a747e4fSDavid du Colombier 	        	rk[15] = rk[ 7] ^ rk[14];
12499a747e4fSDavid du Colombier 			rk += 8;
12509a747e4fSDavid du Colombier 	        }
12519a747e4fSDavid du Colombier 	}
12529a747e4fSDavid du Colombier 	return 0;
12539a747e4fSDavid du Colombier }
12549a747e4fSDavid du Colombier 
12559a747e4fSDavid du Colombier /**
12569a747e4fSDavid du Colombier  * Expand the cipher key into the decryption key schedule.
12579a747e4fSDavid du Colombier  *
12589a747e4fSDavid du Colombier  * @return	the number of rounds for the given cipher key size.
12599a747e4fSDavid du Colombier  */
1260fc4036bfSDavid du Colombier static int
aes_setupDec(ulong rk[],const uchar cipherKey[],int keyBits)1261410ea80bSDavid du Colombier aes_setupDec(ulong rk[/* 4*(Nr + 1) */], const uchar cipherKey[], int keyBits)
1262fc4036bfSDavid du Colombier {
12639a747e4fSDavid du Colombier 	int Nr, i, j;
1264410ea80bSDavid du Colombier 	ulong temp;
12659a747e4fSDavid du Colombier 
12669a747e4fSDavid du Colombier 	/* expand the cipher key: */
1267410ea80bSDavid du Colombier 	Nr = aes_setupEnc(rk, cipherKey, keyBits);
12689a747e4fSDavid du Colombier 	/* invert the order of the round keys: */
12699a747e4fSDavid du Colombier 	for (i = 0, j = 4*Nr; i < j; i += 4, j -= 4) {
12709a747e4fSDavid du Colombier 		temp = rk[i    ]; rk[i    ] = rk[j    ]; rk[j    ] = temp;
12719a747e4fSDavid du Colombier 		temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
12729a747e4fSDavid du Colombier 		temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
12739a747e4fSDavid du Colombier 		temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
12749a747e4fSDavid du Colombier 	}
1275fc4036bfSDavid du Colombier 	/*
1276fc4036bfSDavid du Colombier 	 * apply the inverse MixColumn transform to all round keys
1277fc4036bfSDavid du Colombier 	 * but the first and the last:
1278fc4036bfSDavid du Colombier 	 */
12799a747e4fSDavid du Colombier 	for (i = 1; i < Nr; i++) {
12809a747e4fSDavid du Colombier 		rk += 4;
12819a747e4fSDavid du Colombier 		rk[0] =
12829a747e4fSDavid du Colombier 			Td0[Te4[(rk[0] >> 24)       ]] ^
12839a747e4fSDavid du Colombier 			Td1[Te4[(rk[0] >> 16) & 0xff]] ^
12849a747e4fSDavid du Colombier 			Td2[Te4[(rk[0] >>  8) & 0xff]] ^
12859a747e4fSDavid du Colombier 			Td3[Te4[(rk[0]      ) & 0xff]];
12869a747e4fSDavid du Colombier 		rk[1] =
12879a747e4fSDavid du Colombier 			Td0[Te4[(rk[1] >> 24)       ]] ^
12889a747e4fSDavid du Colombier 			Td1[Te4[(rk[1] >> 16) & 0xff]] ^
12899a747e4fSDavid du Colombier 			Td2[Te4[(rk[1] >>  8) & 0xff]] ^
12909a747e4fSDavid du Colombier 			Td3[Te4[(rk[1]      ) & 0xff]];
12919a747e4fSDavid du Colombier 		rk[2] =
12929a747e4fSDavid du Colombier 			Td0[Te4[(rk[2] >> 24)       ]] ^
12939a747e4fSDavid du Colombier 			Td1[Te4[(rk[2] >> 16) & 0xff]] ^
12949a747e4fSDavid du Colombier 			Td2[Te4[(rk[2] >>  8) & 0xff]] ^
12959a747e4fSDavid du Colombier 			Td3[Te4[(rk[2]      ) & 0xff]];
12969a747e4fSDavid du Colombier 		rk[3] =
12979a747e4fSDavid du Colombier 			Td0[Te4[(rk[3] >> 24)       ]] ^
12989a747e4fSDavid du Colombier 			Td1[Te4[(rk[3] >> 16) & 0xff]] ^
12999a747e4fSDavid du Colombier 			Td2[Te4[(rk[3] >>  8) & 0xff]] ^
13009a747e4fSDavid du Colombier 			Td3[Te4[(rk[3]      ) & 0xff]];
13019a747e4fSDavid du Colombier 	}
13029a747e4fSDavid du Colombier 	return Nr;
13039a747e4fSDavid du Colombier }
13049a747e4fSDavid du Colombier 
1305410ea80bSDavid du Colombier /* using round keys in rk, perform Nr rounds of encrypting pt into ct */
1306410ea80bSDavid du Colombier void
aes_encrypt(const ulong rk[],int Nr,const uchar pt[16],uchar ct[16])1307410ea80bSDavid du Colombier aes_encrypt(const ulong rk[/* 4*(Nr + 1) */], int Nr, const uchar pt[16],
1308410ea80bSDavid du Colombier 	uchar ct[16])
1309fc4036bfSDavid du Colombier {
1310410ea80bSDavid du Colombier 	ulong s0, s1, s2, s3, t0, t1, t2, t3;
13119a747e4fSDavid du Colombier #ifndef FULL_UNROLL
13129a747e4fSDavid du Colombier 	int r;
13139a747e4fSDavid du Colombier #endif /* ?FULL_UNROLL */
13149a747e4fSDavid du Colombier 
13159a747e4fSDavid du Colombier 	/*
13169a747e4fSDavid du Colombier 	 * map byte array block to cipher state
13179a747e4fSDavid du Colombier 	 * and add initial round key:
13189a747e4fSDavid du Colombier 	 */
13199a747e4fSDavid du Colombier 	s0 = GETU32(pt     ) ^ rk[0];
13209a747e4fSDavid du Colombier 	s1 = GETU32(pt +  4) ^ rk[1];
13219a747e4fSDavid du Colombier 	s2 = GETU32(pt +  8) ^ rk[2];
13229a747e4fSDavid du Colombier 	s3 = GETU32(pt + 12) ^ rk[3];
13239a747e4fSDavid du Colombier #ifdef FULL_UNROLL
13249a747e4fSDavid du Colombier 	/* round 1: */
13259a747e4fSDavid du Colombier    	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4];
13269a747e4fSDavid du Colombier    	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5];
13279a747e4fSDavid du Colombier    	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6];
13289a747e4fSDavid du Colombier    	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7];
13299a747e4fSDavid du Colombier    	/* round 2: */
13309a747e4fSDavid du Colombier    	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8];
13319a747e4fSDavid du Colombier    	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9];
13329a747e4fSDavid du Colombier    	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10];
13339a747e4fSDavid du Colombier    	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11];
13349a747e4fSDavid du Colombier 	/* round 3: */
13359a747e4fSDavid du Colombier    	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12];
13369a747e4fSDavid du Colombier    	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13];
13379a747e4fSDavid du Colombier    	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14];
13389a747e4fSDavid du Colombier    	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15];
13399a747e4fSDavid du Colombier    	/* round 4: */
13409a747e4fSDavid du Colombier    	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16];
13419a747e4fSDavid du Colombier    	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17];
13429a747e4fSDavid du Colombier    	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18];
13439a747e4fSDavid du Colombier    	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19];
13449a747e4fSDavid du Colombier 	/* round 5: */
13459a747e4fSDavid du Colombier    	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20];
13469a747e4fSDavid du Colombier    	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21];
13479a747e4fSDavid du Colombier    	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22];
13489a747e4fSDavid du Colombier    	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23];
13499a747e4fSDavid du Colombier    	/* round 6: */
13509a747e4fSDavid du Colombier    	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24];
13519a747e4fSDavid du Colombier    	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25];
13529a747e4fSDavid du Colombier    	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26];
13539a747e4fSDavid du Colombier    	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27];
13549a747e4fSDavid du Colombier 	/* round 7: */
13559a747e4fSDavid du Colombier    	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28];
13569a747e4fSDavid du Colombier    	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29];
13579a747e4fSDavid du Colombier    	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30];
13589a747e4fSDavid du Colombier    	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31];
13599a747e4fSDavid du Colombier    	/* round 8: */
13609a747e4fSDavid du Colombier    	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32];
13619a747e4fSDavid du Colombier    	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33];
13629a747e4fSDavid du Colombier    	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34];
13639a747e4fSDavid du Colombier    	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35];
13649a747e4fSDavid du Colombier 	/* round 9: */
13659a747e4fSDavid du Colombier    	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36];
13669a747e4fSDavid du Colombier    	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37];
13679a747e4fSDavid du Colombier    	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38];
13689a747e4fSDavid du Colombier    	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39];
13699a747e4fSDavid du Colombier 	if (Nr > 10) {
13709a747e4fSDavid du Colombier 		/* round 10: */
13719a747e4fSDavid du Colombier 		s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40];
13729a747e4fSDavid du Colombier 		s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41];
13739a747e4fSDavid du Colombier 		s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42];
13749a747e4fSDavid du Colombier 		s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43];
13759a747e4fSDavid du Colombier 		/* round 11: */
13769a747e4fSDavid du Colombier 		t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44];
13779a747e4fSDavid du Colombier 		t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45];
13789a747e4fSDavid du Colombier 		t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46];
13799a747e4fSDavid du Colombier 		t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47];
13809a747e4fSDavid du Colombier 		if (Nr > 12) {
13819a747e4fSDavid du Colombier 			/* round 12: */
13829a747e4fSDavid du Colombier 			s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48];
13839a747e4fSDavid du Colombier 			s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49];
13849a747e4fSDavid du Colombier 			s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50];
13859a747e4fSDavid du Colombier 			s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51];
13869a747e4fSDavid du Colombier 			/* round 13: */
13879a747e4fSDavid du Colombier 			t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52];
13889a747e4fSDavid du Colombier 			t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53];
13899a747e4fSDavid du Colombier 			t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54];
13909a747e4fSDavid du Colombier 			t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55];
13919a747e4fSDavid du Colombier 		}
13929a747e4fSDavid du Colombier 	}
13939a747e4fSDavid du Colombier 	rk += Nr << 2;
13949a747e4fSDavid du Colombier #else					/* !FULL_UNROLL */
13959a747e4fSDavid du Colombier 	/*
13969a747e4fSDavid du Colombier 	 * Nr - 1 full rounds:
13979a747e4fSDavid du Colombier 	 */
13989a747e4fSDavid du Colombier 	r = Nr >> 1;
13999a747e4fSDavid du Colombier 	for (;;) {
14009a747e4fSDavid du Colombier 	        t0 =
14019a747e4fSDavid du Colombier 	            Te0[(s0 >> 24)       ] ^
14029a747e4fSDavid du Colombier 	            Te1[(s1 >> 16) & 0xff] ^
14039a747e4fSDavid du Colombier 	            Te2[(s2 >>  8) & 0xff] ^
14049a747e4fSDavid du Colombier 	            Te3[(s3      ) & 0xff] ^
14059a747e4fSDavid du Colombier 	            rk[4];
14069a747e4fSDavid du Colombier 	        t1 =
14079a747e4fSDavid du Colombier 	            Te0[(s1 >> 24)       ] ^
14089a747e4fSDavid du Colombier 	            Te1[(s2 >> 16) & 0xff] ^
14099a747e4fSDavid du Colombier 	            Te2[(s3 >>  8) & 0xff] ^
14109a747e4fSDavid du Colombier 	            Te3[(s0      ) & 0xff] ^
14119a747e4fSDavid du Colombier 	            rk[5];
14129a747e4fSDavid du Colombier 	        t2 =
14139a747e4fSDavid du Colombier 	            Te0[(s2 >> 24)       ] ^
14149a747e4fSDavid du Colombier 	            Te1[(s3 >> 16) & 0xff] ^
14159a747e4fSDavid du Colombier 	            Te2[(s0 >>  8) & 0xff] ^
14169a747e4fSDavid du Colombier 	            Te3[(s1      ) & 0xff] ^
14179a747e4fSDavid du Colombier 	            rk[6];
14189a747e4fSDavid du Colombier 	        t3 =
14199a747e4fSDavid du Colombier 	            Te0[(s3 >> 24)       ] ^
14209a747e4fSDavid du Colombier 	            Te1[(s0 >> 16) & 0xff] ^
14219a747e4fSDavid du Colombier 	            Te2[(s1 >>  8) & 0xff] ^
14229a747e4fSDavid du Colombier 	            Te3[(s2      ) & 0xff] ^
14239a747e4fSDavid du Colombier 	            rk[7];
14249a747e4fSDavid du Colombier 
14259a747e4fSDavid du Colombier 	        rk += 8;
1426fc4036bfSDavid du Colombier 	        if (--r == 0)
14279a747e4fSDavid du Colombier 	            break;
14289a747e4fSDavid du Colombier 
14299a747e4fSDavid du Colombier 	        s0 =
14309a747e4fSDavid du Colombier 	            Te0[(t0 >> 24)       ] ^
14319a747e4fSDavid du Colombier 	            Te1[(t1 >> 16) & 0xff] ^
14329a747e4fSDavid du Colombier 	            Te2[(t2 >>  8) & 0xff] ^
14339a747e4fSDavid du Colombier 	            Te3[(t3      ) & 0xff] ^
14349a747e4fSDavid du Colombier 	            rk[0];
14359a747e4fSDavid du Colombier 	        s1 =
14369a747e4fSDavid du Colombier 	            Te0[(t1 >> 24)       ] ^
14379a747e4fSDavid du Colombier 	            Te1[(t2 >> 16) & 0xff] ^
14389a747e4fSDavid du Colombier 	            Te2[(t3 >>  8) & 0xff] ^
14399a747e4fSDavid du Colombier 	            Te3[(t0      ) & 0xff] ^
14409a747e4fSDavid du Colombier 	            rk[1];
14419a747e4fSDavid du Colombier 	        s2 =
14429a747e4fSDavid du Colombier 	            Te0[(t2 >> 24)       ] ^
14439a747e4fSDavid du Colombier 	            Te1[(t3 >> 16) & 0xff] ^
14449a747e4fSDavid du Colombier 	            Te2[(t0 >>  8) & 0xff] ^
14459a747e4fSDavid du Colombier 	            Te3[(t1      ) & 0xff] ^
14469a747e4fSDavid du Colombier 	            rk[2];
14479a747e4fSDavid du Colombier 	        s3 =
14489a747e4fSDavid du Colombier 	            Te0[(t3 >> 24)       ] ^
14499a747e4fSDavid du Colombier 	            Te1[(t0 >> 16) & 0xff] ^
14509a747e4fSDavid du Colombier 	            Te2[(t1 >>  8) & 0xff] ^
14519a747e4fSDavid du Colombier 	            Te3[(t2      ) & 0xff] ^
14529a747e4fSDavid du Colombier 	            rk[3];
14539a747e4fSDavid du Colombier 	}
14549a747e4fSDavid du Colombier #endif					/* ?FULL_UNROLL */
14559a747e4fSDavid du Colombier 	/*
14569a747e4fSDavid du Colombier 	 * apply last round and
14579a747e4fSDavid du Colombier 	 * map cipher state to byte array block:
14589a747e4fSDavid du Colombier 	 */
14599a747e4fSDavid du Colombier 	s0 =
14609a747e4fSDavid du Colombier 		(Te4[(t0 >> 24)       ] << 24) ^
14619a747e4fSDavid du Colombier 		(Te4[(t1 >> 16) & 0xff] << 16) ^
14629a747e4fSDavid du Colombier 		(Te4[(t2 >>  8) & 0xff] <<  8) ^
14639a747e4fSDavid du Colombier 		(Te4[(t3      ) & 0xff]      ) ^
14649a747e4fSDavid du Colombier 		rk[0];
14659a747e4fSDavid du Colombier 	PUTU32(ct     , s0);
14669a747e4fSDavid du Colombier 	s1 =
14679a747e4fSDavid du Colombier 		(Te4[(t1 >> 24)       ] << 24) ^
14689a747e4fSDavid du Colombier 		(Te4[(t2 >> 16) & 0xff] << 16) ^
14699a747e4fSDavid du Colombier 		(Te4[(t3 >>  8) & 0xff] <<  8) ^
14709a747e4fSDavid du Colombier 		(Te4[(t0      ) & 0xff]      ) ^
14719a747e4fSDavid du Colombier 		rk[1];
14729a747e4fSDavid du Colombier 	PUTU32(ct +  4, s1);
14739a747e4fSDavid du Colombier 	s2 =
14749a747e4fSDavid du Colombier 		(Te4[(t2 >> 24)       ] << 24) ^
14759a747e4fSDavid du Colombier 		(Te4[(t3 >> 16) & 0xff] << 16) ^
14769a747e4fSDavid du Colombier 		(Te4[(t0 >>  8) & 0xff] <<  8) ^
14779a747e4fSDavid du Colombier 		(Te4[(t1      ) & 0xff]      ) ^
14789a747e4fSDavid du Colombier 		rk[2];
14799a747e4fSDavid du Colombier 	PUTU32(ct +  8, s2);
14809a747e4fSDavid du Colombier 	s3 =
14819a747e4fSDavid du Colombier 		(Te4[(t3 >> 24)       ] << 24) ^
14829a747e4fSDavid du Colombier 		(Te4[(t0 >> 16) & 0xff] << 16) ^
14839a747e4fSDavid du Colombier 		(Te4[(t1 >>  8) & 0xff] <<  8) ^
14849a747e4fSDavid du Colombier 		(Te4[(t2      ) & 0xff]      ) ^
14859a747e4fSDavid du Colombier 		rk[3];
14869a747e4fSDavid du Colombier 	PUTU32(ct + 12, s3);
14879a747e4fSDavid du Colombier }
14889a747e4fSDavid du Colombier 
1489410ea80bSDavid du Colombier void
aes_decrypt(const ulong rk[],int Nr,const uchar ct[16],uchar pt[16])1490410ea80bSDavid du Colombier aes_decrypt(const ulong rk[/* 4*(Nr + 1) */], int Nr, const uchar ct[16],
1491410ea80bSDavid du Colombier 	uchar pt[16])
1492fc4036bfSDavid du Colombier {
1493410ea80bSDavid du Colombier 	ulong s0, s1, s2, s3, t0, t1, t2, t3;
14949a747e4fSDavid du Colombier #ifndef FULL_UNROLL
14959a747e4fSDavid du Colombier 	int r;
14969a747e4fSDavid du Colombier #endif		/* ?FULL_UNROLL */
14979a747e4fSDavid du Colombier 
14989a747e4fSDavid du Colombier 	/*
14999a747e4fSDavid du Colombier 	 * map byte array block to cipher state
15009a747e4fSDavid du Colombier 	 * and add initial round key:
15019a747e4fSDavid du Colombier 	 */
15029a747e4fSDavid du Colombier     s0 = GETU32(ct     ) ^ rk[0];
15039a747e4fSDavid du Colombier     s1 = GETU32(ct +  4) ^ rk[1];
15049a747e4fSDavid du Colombier     s2 = GETU32(ct +  8) ^ rk[2];
15059a747e4fSDavid du Colombier     s3 = GETU32(ct + 12) ^ rk[3];
15069a747e4fSDavid du Colombier #ifdef FULL_UNROLL
15079a747e4fSDavid du Colombier     /* round 1: */
15089a747e4fSDavid du Colombier     t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4];
15099a747e4fSDavid du Colombier     t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5];
15109a747e4fSDavid du Colombier     t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6];
15119a747e4fSDavid du Colombier     t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7];
15129a747e4fSDavid du Colombier     /* round 2: */
15139a747e4fSDavid du Colombier     s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8];
15149a747e4fSDavid du Colombier     s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9];
15159a747e4fSDavid du Colombier     s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10];
15169a747e4fSDavid du Colombier     s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11];
15179a747e4fSDavid du Colombier     /* round 3: */
15189a747e4fSDavid du Colombier     t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12];
15199a747e4fSDavid du Colombier     t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13];
15209a747e4fSDavid du Colombier     t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14];
15219a747e4fSDavid du Colombier     t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15];
15229a747e4fSDavid du Colombier     /* round 4: */
15239a747e4fSDavid du Colombier     s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16];
15249a747e4fSDavid du Colombier     s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17];
15259a747e4fSDavid du Colombier     s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18];
15269a747e4fSDavid du Colombier     s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19];
15279a747e4fSDavid du Colombier     /* round 5: */
15289a747e4fSDavid du Colombier     t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20];
15299a747e4fSDavid du Colombier     t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21];
15309a747e4fSDavid du Colombier     t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22];
15319a747e4fSDavid du Colombier     t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23];
15329a747e4fSDavid du Colombier     /* round 6: */
15339a747e4fSDavid du Colombier     s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24];
15349a747e4fSDavid du Colombier     s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25];
15359a747e4fSDavid du Colombier     s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26];
15369a747e4fSDavid du Colombier     s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27];
15379a747e4fSDavid du Colombier     /* round 7: */
15389a747e4fSDavid du Colombier     t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28];
15399a747e4fSDavid du Colombier     t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29];
15409a747e4fSDavid du Colombier     t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30];
15419a747e4fSDavid du Colombier     t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31];
15429a747e4fSDavid du Colombier     /* round 8: */
15439a747e4fSDavid du Colombier     s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32];
15449a747e4fSDavid du Colombier     s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33];
15459a747e4fSDavid du Colombier     s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34];
15469a747e4fSDavid du Colombier     s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35];
15479a747e4fSDavid du Colombier     /* round 9: */
15489a747e4fSDavid du Colombier     t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36];
15499a747e4fSDavid du Colombier     t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37];
15509a747e4fSDavid du Colombier     t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38];
15519a747e4fSDavid du Colombier     t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39];
15529a747e4fSDavid du Colombier     if (Nr > 10) {
15539a747e4fSDavid du Colombier         /* round 10: */
15549a747e4fSDavid du Colombier         s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40];
15559a747e4fSDavid du Colombier         s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41];
15569a747e4fSDavid du Colombier         s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42];
15579a747e4fSDavid du Colombier         s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43];
15589a747e4fSDavid du Colombier         /* round 11: */
15599a747e4fSDavid du Colombier         t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44];
15609a747e4fSDavid du Colombier         t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45];
15619a747e4fSDavid du Colombier         t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46];
15629a747e4fSDavid du Colombier         t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47];
15639a747e4fSDavid du Colombier         if (Nr > 12) {
15649a747e4fSDavid du Colombier             /* round 12: */
15659a747e4fSDavid du Colombier             s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48];
15669a747e4fSDavid du Colombier             s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49];
15679a747e4fSDavid du Colombier             s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50];
15689a747e4fSDavid du Colombier             s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51];
15699a747e4fSDavid du Colombier             /* round 13: */
15709a747e4fSDavid du Colombier             t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52];
15719a747e4fSDavid du Colombier             t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53];
15729a747e4fSDavid du Colombier             t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54];
15739a747e4fSDavid du Colombier             t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55];
15749a747e4fSDavid du Colombier         }
15759a747e4fSDavid du Colombier     }
15769a747e4fSDavid du Colombier     rk += Nr << 2;
15779a747e4fSDavid du Colombier #else					/* !FULL_UNROLL */
15789a747e4fSDavid du Colombier     /*
15799a747e4fSDavid du Colombier      * Nr - 1 full rounds:
15809a747e4fSDavid du Colombier      */
15819a747e4fSDavid du Colombier     r = Nr >> 1;
15829a747e4fSDavid du Colombier     for (;;) {
15839a747e4fSDavid du Colombier         t0 =
15849a747e4fSDavid du Colombier             Td0[(s0 >> 24)       ] ^
15859a747e4fSDavid du Colombier             Td1[(s3 >> 16) & 0xff] ^
15869a747e4fSDavid du Colombier             Td2[(s2 >>  8) & 0xff] ^
15879a747e4fSDavid du Colombier             Td3[(s1      ) & 0xff] ^
15889a747e4fSDavid du Colombier             rk[4];
15899a747e4fSDavid du Colombier         t1 =
15909a747e4fSDavid du Colombier             Td0[(s1 >> 24)       ] ^
15919a747e4fSDavid du Colombier             Td1[(s0 >> 16) & 0xff] ^
15929a747e4fSDavid du Colombier             Td2[(s3 >>  8) & 0xff] ^
15939a747e4fSDavid du Colombier             Td3[(s2      ) & 0xff] ^
15949a747e4fSDavid du Colombier             rk[5];
15959a747e4fSDavid du Colombier         t2 =
15969a747e4fSDavid du Colombier             Td0[(s2 >> 24)       ] ^
15979a747e4fSDavid du Colombier             Td1[(s1 >> 16) & 0xff] ^
15989a747e4fSDavid du Colombier             Td2[(s0 >>  8) & 0xff] ^
15999a747e4fSDavid du Colombier             Td3[(s3      ) & 0xff] ^
16009a747e4fSDavid du Colombier             rk[6];
16019a747e4fSDavid du Colombier         t3 =
16029a747e4fSDavid du Colombier             Td0[(s3 >> 24)       ] ^
16039a747e4fSDavid du Colombier             Td1[(s2 >> 16) & 0xff] ^
16049a747e4fSDavid du Colombier             Td2[(s1 >>  8) & 0xff] ^
16059a747e4fSDavid du Colombier             Td3[(s0      ) & 0xff] ^
16069a747e4fSDavid du Colombier             rk[7];
16079a747e4fSDavid du Colombier 
16089a747e4fSDavid du Colombier         rk += 8;
1609fc4036bfSDavid du Colombier         if (--r == 0)
16109a747e4fSDavid du Colombier             break;
16119a747e4fSDavid du Colombier 
16129a747e4fSDavid du Colombier         s0 =
16139a747e4fSDavid du Colombier             Td0[(t0 >> 24)       ] ^
16149a747e4fSDavid du Colombier             Td1[(t3 >> 16) & 0xff] ^
16159a747e4fSDavid du Colombier             Td2[(t2 >>  8) & 0xff] ^
16169a747e4fSDavid du Colombier             Td3[(t1      ) & 0xff] ^
16179a747e4fSDavid du Colombier             rk[0];
16189a747e4fSDavid du Colombier         s1 =
16199a747e4fSDavid du Colombier             Td0[(t1 >> 24)       ] ^
16209a747e4fSDavid du Colombier             Td1[(t0 >> 16) & 0xff] ^
16219a747e4fSDavid du Colombier             Td2[(t3 >>  8) & 0xff] ^
16229a747e4fSDavid du Colombier             Td3[(t2      ) & 0xff] ^
16239a747e4fSDavid du Colombier             rk[1];
16249a747e4fSDavid du Colombier         s2 =
16259a747e4fSDavid du Colombier             Td0[(t2 >> 24)       ] ^
16269a747e4fSDavid du Colombier             Td1[(t1 >> 16) & 0xff] ^
16279a747e4fSDavid du Colombier             Td2[(t0 >>  8) & 0xff] ^
16289a747e4fSDavid du Colombier             Td3[(t3      ) & 0xff] ^
16299a747e4fSDavid du Colombier             rk[2];
16309a747e4fSDavid du Colombier         s3 =
16319a747e4fSDavid du Colombier             Td0[(t3 >> 24)       ] ^
16329a747e4fSDavid du Colombier             Td1[(t2 >> 16) & 0xff] ^
16339a747e4fSDavid du Colombier             Td2[(t1 >>  8) & 0xff] ^
16349a747e4fSDavid du Colombier             Td3[(t0      ) & 0xff] ^
16359a747e4fSDavid du Colombier             rk[3];
16369a747e4fSDavid du Colombier     }
16379a747e4fSDavid du Colombier #endif					/* ?FULL_UNROLL */
16389a747e4fSDavid du Colombier 	/*
16399a747e4fSDavid du Colombier 	 * apply last round and
16409a747e4fSDavid du Colombier 	 * map cipher state to byte array block:
16419a747e4fSDavid du Colombier 	 */
16429a747e4fSDavid du Colombier    	s0 =
16439a747e4fSDavid du Colombier    		(Td4[(t0 >> 24)       ] << 24) ^
16449a747e4fSDavid du Colombier    		(Td4[(t3 >> 16) & 0xff] << 16) ^
16459a747e4fSDavid du Colombier    		(Td4[(t2 >>  8) & 0xff] <<  8) ^
16469a747e4fSDavid du Colombier    		(Td4[(t1      ) & 0xff]      ) ^
16479a747e4fSDavid du Colombier    		rk[0];
16489a747e4fSDavid du Colombier 	PUTU32(pt     , s0);
16499a747e4fSDavid du Colombier    	s1 =
16509a747e4fSDavid du Colombier    		(Td4[(t1 >> 24)       ] << 24) ^
16519a747e4fSDavid du Colombier    		(Td4[(t0 >> 16) & 0xff] << 16) ^
16529a747e4fSDavid du Colombier    		(Td4[(t3 >>  8) & 0xff] <<  8) ^
16539a747e4fSDavid du Colombier    		(Td4[(t2      ) & 0xff]      ) ^
16549a747e4fSDavid du Colombier    		rk[1];
16559a747e4fSDavid du Colombier 	PUTU32(pt +  4, s1);
16569a747e4fSDavid du Colombier    	s2 =
16579a747e4fSDavid du Colombier    		(Td4[(t2 >> 24)       ] << 24) ^
16589a747e4fSDavid du Colombier    		(Td4[(t1 >> 16) & 0xff] << 16) ^
16599a747e4fSDavid du Colombier    		(Td4[(t0 >>  8) & 0xff] <<  8) ^
16609a747e4fSDavid du Colombier    		(Td4[(t3      ) & 0xff]      ) ^
16619a747e4fSDavid du Colombier    		rk[2];
16629a747e4fSDavid du Colombier 	PUTU32(pt +  8, s2);
16639a747e4fSDavid du Colombier    	s3 =
16649a747e4fSDavid du Colombier    		(Td4[(t3 >> 24)       ] << 24) ^
16659a747e4fSDavid du Colombier    		(Td4[(t2 >> 16) & 0xff] << 16) ^
16669a747e4fSDavid du Colombier    		(Td4[(t1 >>  8) & 0xff] <<  8) ^
16679a747e4fSDavid du Colombier    		(Td4[(t0      ) & 0xff]      ) ^
16689a747e4fSDavid du Colombier    		rk[3];
16699a747e4fSDavid du Colombier 	PUTU32(pt + 12, s3);
16709a747e4fSDavid du Colombier }
16719a747e4fSDavid du Colombier 
16729a747e4fSDavid du Colombier #ifdef INTERMEDIATE_VALUE_KAT
16739a747e4fSDavid du Colombier 
1674fc4036bfSDavid du Colombier static void
aes_encryptRound(const u32 rk[],int Nr,u8 block[16],int rounds)1675410ea80bSDavid du Colombier aes_encryptRound(const u32 rk[/* 4*(Nr + 1) */], int Nr, u8 block[16],
1676fc4036bfSDavid du Colombier 	int rounds)
1677fc4036bfSDavid du Colombier {
16789a747e4fSDavid du Colombier 	int r;
16799a747e4fSDavid du Colombier 	u32 s0, s1, s2, s3, t0, t1, t2, t3;
16809a747e4fSDavid du Colombier 
16819a747e4fSDavid du Colombier 	/*
16829a747e4fSDavid du Colombier 	 * map byte array block to cipher state
16839a747e4fSDavid du Colombier 	 * and add initial round key:
16849a747e4fSDavid du Colombier 	 */
16859a747e4fSDavid du Colombier 	s0 = GETU32(block     ) ^ rk[0];
16869a747e4fSDavid du Colombier 	s1 = GETU32(block +  4) ^ rk[1];
16879a747e4fSDavid du Colombier 	s2 = GETU32(block +  8) ^ rk[2];
16889a747e4fSDavid du Colombier 	s3 = GETU32(block + 12) ^ rk[3];
16899a747e4fSDavid du Colombier 	rk += 4;
16909a747e4fSDavid du Colombier 
16919a747e4fSDavid du Colombier 	/*
16929a747e4fSDavid du Colombier 	 * Nr - 1 full rounds:
16939a747e4fSDavid du Colombier 	 */
16949a747e4fSDavid du Colombier 	for (r = (rounds < Nr ? rounds : Nr - 1); r > 0; r--) {
16959a747e4fSDavid du Colombier 		t0 =
16969a747e4fSDavid du Colombier 			Te0[(s0 >> 24)       ] ^
16979a747e4fSDavid du Colombier 			Te1[(s1 >> 16) & 0xff] ^
16989a747e4fSDavid du Colombier 			Te2[(s2 >>  8) & 0xff] ^
16999a747e4fSDavid du Colombier 			Te3[(s3      ) & 0xff] ^
17009a747e4fSDavid du Colombier 			rk[0];
17019a747e4fSDavid du Colombier 		t1 =
17029a747e4fSDavid du Colombier 			Te0[(s1 >> 24)       ] ^
17039a747e4fSDavid du Colombier 			Te1[(s2 >> 16) & 0xff] ^
17049a747e4fSDavid du Colombier 			Te2[(s3 >>  8) & 0xff] ^
17059a747e4fSDavid du Colombier 			Te3[(s0      ) & 0xff] ^
17069a747e4fSDavid du Colombier 			rk[1];
17079a747e4fSDavid du Colombier 		t2 =
17089a747e4fSDavid du Colombier 			Te0[(s2 >> 24)       ] ^
17099a747e4fSDavid du Colombier 			Te1[(s3 >> 16) & 0xff] ^
17109a747e4fSDavid du Colombier 			Te2[(s0 >>  8) & 0xff] ^
17119a747e4fSDavid du Colombier 			Te3[(s1      ) & 0xff] ^
17129a747e4fSDavid du Colombier 			rk[2];
17139a747e4fSDavid du Colombier 		t3 =
17149a747e4fSDavid du Colombier 			Te0[(s3 >> 24)       ] ^
17159a747e4fSDavid du Colombier 			Te1[(s0 >> 16) & 0xff] ^
17169a747e4fSDavid du Colombier 			Te2[(s1 >>  8) & 0xff] ^
17179a747e4fSDavid du Colombier 			Te3[(s2      ) & 0xff] ^
17189a747e4fSDavid du Colombier 			rk[3];
17199a747e4fSDavid du Colombier 		s0 = t0;
17209a747e4fSDavid du Colombier 		s1 = t1;
17219a747e4fSDavid du Colombier 		s2 = t2;
17229a747e4fSDavid du Colombier 		s3 = t3;
17239a747e4fSDavid du Colombier 		rk += 4;
17249a747e4fSDavid du Colombier 	}
17259a747e4fSDavid du Colombier 
17269a747e4fSDavid du Colombier 	/*
17279a747e4fSDavid du Colombier 	 * apply last round and
17289a747e4fSDavid du Colombier 	 * map cipher state to byte array block:
17299a747e4fSDavid du Colombier 	 */
17309a747e4fSDavid du Colombier 	if (rounds == Nr) {
17319a747e4fSDavid du Colombier 	    	t0 =
17329a747e4fSDavid du Colombier 	    		(Te4[(s0 >> 24)       ] << 24) ^
17339a747e4fSDavid du Colombier 	    		(Te4[(s1 >> 16) & 0xff] << 16) ^
17349a747e4fSDavid du Colombier 	    		(Te4[(s2 >>  8) & 0xff] <<  8) ^
17359a747e4fSDavid du Colombier 	    		(Te4[(s3      ) & 0xff]      ) ^
17369a747e4fSDavid du Colombier 	    		rk[0];
17379a747e4fSDavid du Colombier 	    	t1 =
17389a747e4fSDavid du Colombier 	    		(Te4[(s1 >> 24)       ] << 24) ^
17399a747e4fSDavid du Colombier 	    		(Te4[(s2 >> 16) & 0xff] << 16) ^
17409a747e4fSDavid du Colombier 	    		(Te4[(s3 >>  8) & 0xff] <<  8) ^
17419a747e4fSDavid du Colombier 	    		(Te4[(s0      ) & 0xff]      ) ^
17429a747e4fSDavid du Colombier 	    		rk[1];
17439a747e4fSDavid du Colombier 	    	t2 =
17449a747e4fSDavid du Colombier 	    		(Te4[(s2 >> 24)       ] << 24) ^
17459a747e4fSDavid du Colombier 	    		(Te4[(s3 >> 16) & 0xff] << 16) ^
17469a747e4fSDavid du Colombier 	    		(Te4[(s0 >>  8) & 0xff] <<  8) ^
17479a747e4fSDavid du Colombier 	    		(Te4[(s1      ) & 0xff]      ) ^
17489a747e4fSDavid du Colombier 	    		rk[2];
17499a747e4fSDavid du Colombier 	    	t3 =
17509a747e4fSDavid du Colombier 	    		(Te4[(s3 >> 24)       ] << 24) ^
17519a747e4fSDavid du Colombier 	    		(Te4[(s0 >> 16) & 0xff] << 16) ^
17529a747e4fSDavid du Colombier 	    		(Te4[(s1 >>  8) & 0xff] <<  8) ^
17539a747e4fSDavid du Colombier 	    		(Te4[(s2      ) & 0xff]      ) ^
17549a747e4fSDavid du Colombier 	    		rk[3];
17559a747e4fSDavid du Colombier 		s0 = t0;
17569a747e4fSDavid du Colombier 		s1 = t1;
17579a747e4fSDavid du Colombier 		s2 = t2;
17589a747e4fSDavid du Colombier 		s3 = t3;
17599a747e4fSDavid du Colombier 	}
17609a747e4fSDavid du Colombier 
17619a747e4fSDavid du Colombier 	PUTU32(block     , s0);
17629a747e4fSDavid du Colombier 	PUTU32(block +  4, s1);
17639a747e4fSDavid du Colombier 	PUTU32(block +  8, s2);
17649a747e4fSDavid du Colombier 	PUTU32(block + 12, s3);
17659a747e4fSDavid du Colombier }
17669a747e4fSDavid du Colombier 
1767fc4036bfSDavid du Colombier static void
aes_decryptRound(const u32 rk[],int Nr,u8 block[16],int rounds)1768410ea80bSDavid du Colombier aes_decryptRound(const u32 rk[/* 4*(Nr + 1) */], int Nr, u8 block[16],
1769fc4036bfSDavid du Colombier 	int rounds)
1770fc4036bfSDavid du Colombier {
17719a747e4fSDavid du Colombier 	int r;
17729a747e4fSDavid du Colombier 	u32 s0, s1, s2, s3, t0, t1, t2, t3;
17739a747e4fSDavid du Colombier 
17749a747e4fSDavid du Colombier 	/*
17759a747e4fSDavid du Colombier 	 * map byte array block to cipher state
17769a747e4fSDavid du Colombier 	 * and add initial round key:
17779a747e4fSDavid du Colombier 	 */
17789a747e4fSDavid du Colombier 	s0 = GETU32(block     ) ^ rk[0];
17799a747e4fSDavid du Colombier 	s1 = GETU32(block +  4) ^ rk[1];
17809a747e4fSDavid du Colombier 	s2 = GETU32(block +  8) ^ rk[2];
17819a747e4fSDavid du Colombier 	s3 = GETU32(block + 12) ^ rk[3];
17829a747e4fSDavid du Colombier 	rk += 4;
17839a747e4fSDavid du Colombier 
17849a747e4fSDavid du Colombier 	/*
17859a747e4fSDavid du Colombier 	 * Nr - 1 full rounds:
17869a747e4fSDavid du Colombier 	 */
17879a747e4fSDavid du Colombier 	for (r = (rounds < Nr ? rounds : Nr) - 1; r > 0; r--) {
17889a747e4fSDavid du Colombier 		t0 =
17899a747e4fSDavid du Colombier 			Td0[(s0 >> 24)       ] ^
17909a747e4fSDavid du Colombier 			Td1[(s3 >> 16) & 0xff] ^
17919a747e4fSDavid du Colombier 			Td2[(s2 >>  8) & 0xff] ^
17929a747e4fSDavid du Colombier 			Td3[(s1      ) & 0xff] ^
17939a747e4fSDavid du Colombier 			rk[0];
17949a747e4fSDavid du Colombier 		t1 =
17959a747e4fSDavid du Colombier 			Td0[(s1 >> 24)       ] ^
17969a747e4fSDavid du Colombier 			Td1[(s0 >> 16) & 0xff] ^
17979a747e4fSDavid du Colombier 			Td2[(s3 >>  8) & 0xff] ^
17989a747e4fSDavid du Colombier 			Td3[(s2      ) & 0xff] ^
17999a747e4fSDavid du Colombier 			rk[1];
18009a747e4fSDavid du Colombier 		t2 =
18019a747e4fSDavid du Colombier 			Td0[(s2 >> 24)       ] ^
18029a747e4fSDavid du Colombier 			Td1[(s1 >> 16) & 0xff] ^
18039a747e4fSDavid du Colombier 			Td2[(s0 >>  8) & 0xff] ^
18049a747e4fSDavid du Colombier 			Td3[(s3      ) & 0xff] ^
18059a747e4fSDavid du Colombier 			rk[2];
18069a747e4fSDavid du Colombier 		t3 =
18079a747e4fSDavid du Colombier 			Td0[(s3 >> 24)       ] ^
18089a747e4fSDavid du Colombier 			Td1[(s2 >> 16) & 0xff] ^
18099a747e4fSDavid du Colombier 			Td2[(s1 >>  8) & 0xff] ^
18109a747e4fSDavid du Colombier 			Td3[(s0      ) & 0xff] ^
18119a747e4fSDavid du Colombier 			rk[3];
18129a747e4fSDavid du Colombier 
18139a747e4fSDavid du Colombier 		s0 = t0;
18149a747e4fSDavid du Colombier 		s1 = t1;
18159a747e4fSDavid du Colombier 		s2 = t2;
18169a747e4fSDavid du Colombier 		s3 = t3;
18179a747e4fSDavid du Colombier 		rk += 4;
18189a747e4fSDavid du Colombier 	}
18199a747e4fSDavid du Colombier 
18209a747e4fSDavid du Colombier 	/*
18219a747e4fSDavid du Colombier 	 * complete the last round and
18229a747e4fSDavid du Colombier 	 * map cipher state to byte array block:
18239a747e4fSDavid du Colombier 	 */
18249a747e4fSDavid du Colombier 	t0 =
18259a747e4fSDavid du Colombier 		(Td4[(s0 >> 24)       ] << 24) ^
18269a747e4fSDavid du Colombier 		(Td4[(s3 >> 16) & 0xff] << 16) ^
18279a747e4fSDavid du Colombier 		(Td4[(s2 >>  8) & 0xff] <<  8) ^
18289a747e4fSDavid du Colombier 		(Td4[(s1      ) & 0xff]      );
18299a747e4fSDavid du Colombier 	t1 =
18309a747e4fSDavid du Colombier 		(Td4[(s1 >> 24)       ] << 24) ^
18319a747e4fSDavid du Colombier 		(Td4[(s0 >> 16) & 0xff] << 16) ^
18329a747e4fSDavid du Colombier 		(Td4[(s3 >>  8) & 0xff] <<  8) ^
18339a747e4fSDavid du Colombier 		(Td4[(s2      ) & 0xff]      );
18349a747e4fSDavid du Colombier 	t2 =
18359a747e4fSDavid du Colombier 		(Td4[(s2 >> 24)       ] << 24) ^
18369a747e4fSDavid du Colombier 		(Td4[(s1 >> 16) & 0xff] << 16) ^
18379a747e4fSDavid du Colombier 		(Td4[(s0 >>  8) & 0xff] <<  8) ^
18389a747e4fSDavid du Colombier 		(Td4[(s3      ) & 0xff]      );
18399a747e4fSDavid du Colombier 	t3 =
18409a747e4fSDavid du Colombier 		(Td4[(s3 >> 24)       ] << 24) ^
18419a747e4fSDavid du Colombier 		(Td4[(s2 >> 16) & 0xff] << 16) ^
18429a747e4fSDavid du Colombier 		(Td4[(s1 >>  8) & 0xff] <<  8) ^
18439a747e4fSDavid du Colombier 		(Td4[(s0      ) & 0xff]      );
18449a747e4fSDavid du Colombier 
18459a747e4fSDavid du Colombier 	if (rounds == Nr) {
18469a747e4fSDavid du Colombier 		t0 ^= rk[0];
18479a747e4fSDavid du Colombier 		t1 ^= rk[1];
18489a747e4fSDavid du Colombier 		t2 ^= rk[2];
18499a747e4fSDavid du Colombier 		t3 ^= rk[3];
18509a747e4fSDavid du Colombier 	}
18519a747e4fSDavid du Colombier 
18529a747e4fSDavid du Colombier 	PUTU32(block     , t0);
18539a747e4fSDavid du Colombier 	PUTU32(block +  4, t1);
18549a747e4fSDavid du Colombier 	PUTU32(block +  8, t2);
18559a747e4fSDavid du Colombier 	PUTU32(block + 12, t3);
18569a747e4fSDavid du Colombier }
18579a747e4fSDavid du Colombier 
18589a747e4fSDavid du Colombier #endif			/* INTERMEDIATE_VALUE_KAT */
1859