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