History

libsec: sync with 9front

cinap_lenrek committed 8 years ago

Commit eb4ce561 parent df8c7d813 files · +1318 −1463Browse files

Unified · Split

13 files
  1. include/libsec.h +21 −11
  2. libsec/Makefile +2 −2
  3. libsec/aes.c +1000 −1346
  4. libsec/aesCBC.c +60 −0
  5. libsec/aesCFB.c +50 −0
  6. libsec/aesOFB.c +28 −0
  7. libsec/aes_gcm.c +4 −3
  8. libsec/aes_xts.c +63 −49
  9. libsec/aesni.c +5 −0
  10. libsec/chacha.c +5 −34
  11. libsec/chachablock.c +29 −0
  12. libsec/decodepem.c +4 −2
  13. libsec/x509.c +47 −16
include/libsec.h+21−11
@@ -17,25 +17,27 @@ typedef struct AESstate AESstate; · 16 unmodified lines
17struct AESstate17struct AESstate
18{18{
19 ulong setup;19 ulong setup;
20 ulong offset;
20 int rounds;21 int rounds;
21 int keybytes;22 int keybytes;
23 void *ekey; /* expanded encryption round key */
24 void *dkey; /* expanded decryption round key */
22 uchar key[AESmaxkey]; /* unexpanded key */25 uchar key[AESmaxkey]; /* unexpanded key */
23 ulong ekey[4*(AESmaxrounds + 1)]; /* encryption key */
24 ulong dkey[4*(AESmaxrounds + 1)]; /* decryption key */
25 uchar ivec[AESbsize]; /* initialization vector */26 uchar ivec[AESbsize]; /* initialization vector */
26 uchar mackey[3 * AESbsize]; /* 3 XCBC mac 96 keys */27 uchar storage[512]; /* storage for expanded keys */
27};28};
28 29
29/* block ciphers */30/* block ciphers */
30void aes_encrypt(ulong rk[], int Nr, uchar pt[16], uchar ct[16]);31extern void (*aes_encrypt)(ulong rk[], int Nr, uchar pt[16], uchar ct[16]);
31void aes_decrypt(ulong rk[], int Nr, uchar ct[16], uchar pt[16]);32extern void (*aes_decrypt)(ulong rk[], int Nr, uchar ct[16], uchar pt[16]);
33
34void setupAESstate(AESstate *s, uchar key[], int nkey, uchar *ivec);
32 35
33void setupAESstate(AESstate *s, uchar key[], int keybytes, uchar *ivec);
34void aesCBCencrypt(uchar *p, int len, AESstate *s);36void aesCBCencrypt(uchar *p, int len, AESstate *s);
35void aesCBCdecrypt(uchar *p, int len, AESstate *s);37void aesCBCdecrypt(uchar *p, int len, AESstate *s);
36 38void aesCFBencrypt(uchar *p, int len, AESstate *s);
37void setupAESXCBCstate(AESstate *s);39void aesCFBdecrypt(uchar *p, int len, AESstate *s);
38uchar* aesXCBCmac(uchar *p, int len, AESstate *s);40void aesOFBencrypt(uchar *p, int len, AESstate *s);
39 41
40typedef struct AESGCMstate AESGCMstate;42typedef struct AESGCMstate AESGCMstate;
41struct AESGCMstate43struct AESGCMstate
@@ -351,6 +353,7 @@ RSApriv* rsaprivalloc(void); · 309 unmodified lines
351void rsaprivfree(RSApriv*);353void rsaprivfree(RSApriv*);
352RSApub* rsaprivtopub(RSApriv*);354RSApub* rsaprivtopub(RSApriv*);
353RSApub* X509toRSApub(uchar*, int, char*, int);355RSApub* X509toRSApub(uchar*, int, char*, int);
356RSApub* asn1toRSApub(uchar*, int);
354RSApriv* asn1toRSApriv(uchar*, int);357RSApriv* asn1toRSApriv(uchar*, int);
355void asn1dump(uchar *der, int len);358void asn1dump(uchar *der, int len);
356uchar* decodePEM(char *s, char *type, int *len, char **new_s);359uchar* decodePEM(char *s, char *type, int *len, char **new_s);
@@ -362,6 +365,13 @@ char* X509rsaverifydigest(uchar *sig, int siglen, uchar *edigest, int edigestle · 5 unmodified lines
362 365
363void X509dump(uchar *cert, int ncert);366void X509dump(uchar *cert, int ncert);
364 367
368mpint* pkcs1padbuf(uchar *buf, int len, mpint *modulus, int blocktype);
369int pkcs1unpadbuf(uchar *buf, int len, mpint *modulus, int blocktype);
370int asn1encodeRSApub(RSApub *pk, uchar *buf, int len);
371int asn1encodedigest(DigestState* (*fun)(uchar*, ulong, uchar*, DigestState*),
372 uchar *digest, uchar *buf, int len);
373
374
365/*375/*
366 * elgamal376 * elgamal
367 */377 */
@@ -486,8 +496,8 @@ uchar *readcert(char *filename, int *pcertlen); · 118 unmodified lines
486PEMChain*readcertchain(char *filename);496PEMChain*readcertchain(char *filename);
487 497
488/* aes_xts.c */498/* aes_xts.c */
489int aes_xts_encrypt(ulong tweak[], ulong ecb[], vlong sectorNumber, uchar *input, uchar *output, ulong len) ;499void aes_xts_encrypt(AESstate *tweak, AESstate *ecb, uvlong sectorNumber, uchar *input, uchar *output, ulong len);
490int aes_xts_decrypt(ulong tweak[], ulong ecb[], vlong sectorNumber, uchar *input, uchar *output, ulong len);500void aes_xts_decrypt(AESstate *tweak, AESstate *ecb, uvlong sectorNumber, uchar *input, uchar *output, ulong len);
491 501
492typedef struct ECpoint{502typedef struct ECpoint{
493 int inf;503 int inf;
libsec/Makefile+2−2
@@ -3,12 +3,12 @@ include ../Make.config · 2 unmodified lines
3LIB=libsec.a3LIB=libsec.a
4 4
5OFILES=\5OFILES=\
6 aes.$O\6 aes.$O aesni.$O aesCBC.$O aesCFB.$O aesOFB.$O\
7 aes_gcm.$O\7 aes_gcm.$O\
8 aes_xts.$O\8 aes_xts.$O\
9 blowfish.$O\9 blowfish.$O\
10 ccpoly.$O\10 ccpoly.$O\
11 chacha.$O\11 chacha.$O chachablock.$O\
12 curve25519.$O\12 curve25519.$O\
13 curve25519_dh.$O\13 curve25519_dh.$O\
14 decodepem.$O\14 decodepem.$O\
libsec/aes.c+1000−1346
@@ -34,243 +34,12 @@ · 33 unmodified lines
34typedef uchar u8;34typedef uchar u8;
35typedef ulong u32;35typedef ulong u32;
36 36
37#define FULL_UNROLL37#define GETU32(pt) (((u32)(pt)[0]<<24) ^ ((u32)(pt)[1]<<16) ^ \
38#define const38 ((u32)(pt)[2]<< 8) ^ ((u32)(pt)[3]))
39 39#define PUTU32(ct, st) { (ct)[0] = (u8)((st)>>24); (ct)[1] = (u8)((st)>>16); \
40static const u32 Td0[256];40 (ct)[2] = (u8)((st)>> 8); (ct)[3] = (u8)(st); }
41static const u32 Td1[256];
42static const u32 Td2[256];
43static const u32 Td3[256];
44static const u8 Te4[256];
45static uchar basekey[3][16] = {
46 {
47 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
48 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
49 },
50 {
51 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
52 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
53 },
54 {
55 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
56 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
57 },
58};
59
60static int aes_setupEnc(ulong rk[/*4*(Nr + 1)*/], const uchar cipherKey[],
61 int keyBits);
62static int aes_setup(ulong erk[/*4*(Nr + 1)*/], ulong drk[/*4*(Nr + 1)*/],
63 const uchar cipherKey[], int keyBits);
64
65void aes_encrypt(const ulong rk[], int Nr, const uchar pt[16], uchar ct[16]);
66void aes_decrypt(const ulong rk[], int Nr, const uchar ct[16], uchar pt[16]);
67
68void
69setupAESstate(AESstate *s, uchar key[], int keybytes, uchar *ivec)
70{
71 memset(s, 0, sizeof(*s));
72 if(keybytes > AESmaxkey)
73 keybytes = AESmaxkey;
74 memmove(s->key, key, keybytes);
75 s->keybytes = keybytes;
76 s->rounds = aes_setup(s->ekey, s->dkey, s->key, keybytes * 8);
77 if(ivec != nil)
78 memmove(s->ivec, ivec, AESbsize);
79 if(keybytes==16 || keybytes==24 || keybytes==32)
80 s->setup = 0xcafebabe;
81 /* else aes_setup was invalid */
82}
83
84/*
85 * AES-XCBC-MAC-96 message authentication, per rfc3566.
86 */
87
88void
89setupAESXCBCstate(AESstate *s) /* was setupmac96 */
90{
91 int i, j;
92 uint q[16 / sizeof(uint)];
93 uchar *p;
94
95 assert(s->keybytes == 16);
96 for(i = 0; i < 3; i++)
97 aes_encrypt(s->ekey, s->rounds, basekey[i],
98 s->mackey + AESbsize*i);
99
100 p = s->mackey;
101 memset(q, 0, AESbsize);
102
103 /*
104 * put the in the right endian. once figured, probably better
105 * to use some fcall macros.
106 * keys for encryption in local endianness for the algorithm...
107 * only key1 is used for encryption;
108 * BUG!!: I think this is what I got wrong.
109 */
110 for(i = 0; i < 16 / sizeof(uint); i ++){
111 for(j = 0; j < sizeof(uint); j++)
112 q[i] |= p[sizeof(uint)-j-1] << 8*j;
113 p += sizeof(uint);
114 }
115 memmove(s->mackey, q, 16);
116}
117
118/*
119 * Not dealing with > 128-bit keys, not dealing with strange corner cases like
120 * empty message. Should be fine for AES-XCBC-MAC-96.
121 */
122uchar*
123aesXCBCmac(uchar *p, int len, AESstate *s)
124{
125 uchar *p2, *ip, *eip, *mackey;
126 uchar q[AESbsize];
127
128 assert(s->keybytes == 16); /* more complicated for bigger */
129 memset(s->ivec, 0, AESbsize); /* E[0] is 0+ */
130
131 for(; len > AESbsize; len -= AESbsize){
132 memmove(q, p, AESbsize);
133 p2 = q;
134 ip = s->ivec;
135 for(eip = ip + AESbsize; ip < eip; )
136 *p2++ ^= *ip++;
137 aes_encrypt((ulong *)s->mackey, s->rounds, q, s->ivec);
138 p += AESbsize;
139 }
140 /* the last one */
141
142 memmove(q, p, len);
143 p2 = q+len;
144 if(len == AESbsize)
145 mackey = s->mackey + AESbsize; /* k2 */
146 else{
147 mackey = s->mackey+2*AESbsize; /* k3 */
148 *p2++ = 1 << 7; /* padding */
149 len = AESbsize - len - 1;
150 memset(p2, 0, len);
151 }
152
153 ip = s->ivec;
154 p2 = q;
155 for(eip = ip + AESbsize; ip < eip; )
156 *p2++ ^= *ip++ ^ *mackey++;
157 aes_encrypt((ulong *)s->mackey, s->rounds, q, s->ivec);
158 return s->ivec; /* only the 12 bytes leftmost */
159}
160
161/*
162 * Define by analogy with desCBCencrypt; AES modes are not standardized yet.
163 * Because of the way that non-multiple-of-16 buffers are handled,
164 * the decryptor must be fed buffers of the same size as the encryptor.
165 */
166void
167aesCBCencrypt(uchar *p, int len, AESstate *s)
168{
169 uchar *p2, *ip, *eip;
170 uchar q[AESbsize];
171
172 for(; len >= AESbsize; len -= AESbsize){
173 p2 = p;
174 ip = s->ivec;
175 for(eip = ip+AESbsize; ip < eip; )
176 *p2++ ^= *ip++;
177 aes_encrypt(s->ekey, s->rounds, p, q);
178 memmove(s->ivec, q, AESbsize);
179 memmove(p, q, AESbsize);
180 p += AESbsize;
181 }
182
183 if(len > 0){
184 ip = s->ivec;
185 aes_encrypt(s->ekey, s->rounds, ip, q);
186 memmove(s->ivec, q, AESbsize);
187 for(eip = ip+len; ip < eip; )
188 *p++ ^= *ip++;
189 }
190}
191
192void
193aesCBCdecrypt(uchar *p, int len, AESstate *s)
194{
195 uchar *ip, *eip, *tp;
196 uchar tmp[AESbsize], q[AESbsize];
197
198 for(; len >= AESbsize; len -= AESbsize){
199 memmove(tmp, p, AESbsize);
200 aes_decrypt(s->dkey, s->rounds, p, q);
201 memmove(p, q, AESbsize);
202 tp = tmp;
203 ip = s->ivec;
204 for(eip = ip+AESbsize; ip < eip; ){
205 *p++ ^= *ip;
206 *ip++ = *tp++;
207 }
208 }
209
210 if(len > 0){
211 ip = s->ivec;
212 aes_encrypt(s->ekey, s->rounds, ip, q);
213 memmove(s->ivec, q, AESbsize);
214 for(eip = ip+len; ip < eip; )
215 *p++ ^= *ip++;
216 }
217}
218
219/*
220 * this function has been changed for plan 9.
221 * Expand the cipher key into the encryption and decryption key schedules.
222 *
223 * @return the number of rounds for the given cipher key size.
224 */
225static int
226aes_setup(ulong erk[/* 4*(Nr + 1) */], ulong drk[/* 4*(Nr + 1) */],
227 const uchar cipherKey[], int keyBits)
228{
229 int Nr, i;
230
231 /* expand the cipher key: */
232 Nr = aes_setupEnc(erk, cipherKey, keyBits);
233
234 /*
235 * invert the order of the round keys and apply the inverse MixColumn
236 * transform to all round keys but the first and the last
237 */
238 drk[0 ] = erk[4*Nr ];
239 drk[1 ] = erk[4*Nr + 1];
240 drk[2 ] = erk[4*Nr + 2];
241 drk[3 ] = erk[4*Nr + 3];
242 drk[4*Nr ] = erk[0 ];
243 drk[4*Nr + 1] = erk[1 ];
244 drk[4*Nr + 2] = erk[2 ];
245 drk[4*Nr + 3] = erk[3 ];
246 erk += 4 * Nr;
247 for (i = 1; i < Nr; i++) {
248 drk += 4;
249 erk -= 4;
250 drk[0] =
251 Td0[Te4[(erk[0] >> 24) ]] ^
252 Td1[Te4[(erk[0] >> 16) & 0xff]] ^
253 Td2[Te4[(erk[0] >> 8) & 0xff]] ^
254 Td3[Te4[(erk[0] ) & 0xff]];
255 drk[1] =
256 Td0[Te4[(erk[1] >> 24) ]] ^
257 Td1[Te4[(erk[1] >> 16) & 0xff]] ^
258 Td2[Te4[(erk[1] >> 8) & 0xff]] ^
259 Td3[Te4[(erk[1] ) & 0xff]];
260 drk[2] =
261 Td0[Te4[(erk[2] >> 24) ]] ^
262 Td1[Te4[(erk[2] >> 16) & 0xff]] ^
263 Td2[Te4[(erk[2] >> 8) & 0xff]] ^
264 Td3[Te4[(erk[2] ) & 0xff]];
265 drk[3] =
266 Td0[Te4[(erk[3] >> 24) ]] ^
267 Td1[Te4[(erk[3] >> 16) & 0xff]] ^
268 Td2[Te4[(erk[3] >> 8) & 0xff]] ^
269 Td3[Te4[(erk[3] ) & 0xff]];
270 }
271 return Nr;
272}
273 41
42#define FULL_UNROLL
274 43
275/*44/*
276Te0[x] = S [x].[02, 01, 01, 03];45Te0[x] = S [x].[02, 01, 01, 03];
@@ -286,696 +55,691 @@ Td3[x] = Si[x].[09, 0d, 0b, 0e]; · 9 unmodified lines
286Td4[x] = Si[x]55Td4[x] = Si[x]
287*/56*/
288 57
289static const u32 Te0[256] = {58static u32 Te0[256] = {
290 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,59 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
291 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,60 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
292 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,61 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
293 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,62 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
294 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,63 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
295 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,64 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
296 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,65 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
297 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,66 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
298 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,67 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
299 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,68 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
300 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,69 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
301 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,70 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
302 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,71 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
303 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,72 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
304 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,73 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
305 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,74 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
306 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,75 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
307 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,76 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
308 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,77 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
309 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,78 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
310 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,79 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
311 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,80 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
312 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,81 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
313 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,82 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
314 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,83 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
315 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,84 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
316 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,85 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
317 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,86 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
318 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,87 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
319 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,88 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
320 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,89 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
321 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,90 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
322 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,91 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
323 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,92 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
324 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,93 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
325 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,94 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
326 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,95 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
327 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,96 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
328 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,97 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
329 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,98 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
330 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,99 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
331 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,100 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
332 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,101 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
333 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,102 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
334 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,103 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
335 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,104 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
336 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,105 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
337 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,106 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
338 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,107 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
339 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,108 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
340 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,109 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
341 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,110 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
342 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,111 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
343 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,112 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
344 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,113 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
345 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,114 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
346 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,115 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
347 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,116 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
348 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,117 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
349 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,118 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
350 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,119 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
351 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,120 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
352 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,121 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
353 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,122 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
354};123};
355static const u32 Te1[256] = {124static u32 Te1[256] = {
356 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,125 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,
357 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,126 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,
358 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,127 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,
359 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,128 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,
360 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,129 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
361 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,130 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,
362 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,131 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,
363 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,132 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,
364 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,133 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,
365 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,134 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
366 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,135 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,
367 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,136 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,
368 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,137 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,
369 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,138 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,
370 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,139 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
371 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,140 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,
372 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,141 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,
373 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,142 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,
374 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,143 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,
375 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,144 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
376 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,145 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,
377 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,146 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,
378 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,147 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,
379 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,148 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,
380 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,149 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
381 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,150 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,
382 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,151 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,
383 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,152 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,
384 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,153 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,
385 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,154 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
386 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,155 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,
387 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,156 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,
388 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,157 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,
389 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,158 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,
390 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,159 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
391 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,160 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,
392 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,161 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,
393 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,162 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,
394 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,163 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,
395 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,164 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
396 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,165 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,
397 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,166 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,
398 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,167 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,
399 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,168 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,
400 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,169 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
401 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,170 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,
402 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,171 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,
403 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,172 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,
404 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,173 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,
405 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,174 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
406 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,175 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,
407 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,176 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,
408 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,177 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,
409 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,178 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,
410 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,179 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
411 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,180 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,
412 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,181 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,
413 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,182 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,
414 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,183 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,
415 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,184 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
416 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,185 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,
417 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,186 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,
418 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,187 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,
419 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,188 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,
420};189};
421static const u32 Te2[256] = {190static u32 Te2[256] = {
422 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,191 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,
423 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,192 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,
424 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,193 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,
425 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,194 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,
426 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,195 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
427 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,196 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,
428 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,197 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,
429 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,198 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,
430 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,199 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,
431 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,200 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
432 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,201 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,
433 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,202 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,
434 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,203 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,
435 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,204 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,
436 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,205 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
437 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,206 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,
438 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,207 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,
439 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,208 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,
440 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,209 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,
441 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,210 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
442 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,211 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,
443 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,212 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,
444 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,213 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,
445 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,214 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,
446 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,215 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
447 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,216 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,
448 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,217 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,
449 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,218 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,
450 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,219 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,
451 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,220 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
452 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,221 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,
453 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,222 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,
454 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,223 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,
455 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,224 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,
456 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,225 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
457 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,226 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,
458 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,227 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,
459 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,228 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,
460 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,229 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,
461 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,230 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
462 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,231 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,
463 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,232 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,
464 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,233 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,
465 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,234 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,
466 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,235 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
467 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,236 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,
468 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,237 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,
469 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,238 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,
470 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,239 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,
471 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,240 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
472 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,241 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,
473 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,242 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,
474 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,243 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,
475 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,244 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,
476 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,245 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
477 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,246 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,
478 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,247 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,
479 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,248 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,
480 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,249 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,
481 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,250 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
482 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,251 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,
483 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,252 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,
484 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,253 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,
485 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,254 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,
486};255};
487static const u32 Te3[256] = {256static u32 Te3[256] = {
488 257
489 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,258 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,
490 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,259 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,
491 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,260 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,
492 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,261 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,
493 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,262 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
494 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,263 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,
495 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,264 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,
496 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,265 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,
497 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,266 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,
498 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,267 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
499 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,268 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,
500 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,269 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,
501 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,270 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,
502 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,271 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,
503 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,272 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
504 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,273 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,
505 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,274 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,
506 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,275 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,
507 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,276 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,
508 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,277 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
509 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,278 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,
510 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,279 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,
511 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,280 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,
512 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,281 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,
513 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,282 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
514 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,283 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,
515 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,284 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,
516 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,285 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,
517 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,286 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,
518 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,287 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
519 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,288 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,
520 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,289 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,
521 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,290 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,
522 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,291 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,
523 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,292 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
524 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,293 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,
525 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,294 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,
526 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,295 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,
527 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,296 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,
528 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,297 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
529 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,298 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,
530 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,299 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,
531 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,300 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,
532 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,301 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,
533 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,302 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
534 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,303 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,
535 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,304 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,
536 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,305 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,
537 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,306 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,
538 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,307 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
539 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,308 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,
540 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,309 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,
541 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,310 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,
542 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,311 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,
543 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,312 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
544 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,313 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,
545 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,314 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,
546 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,315 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,
547 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,316 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,
548 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,317 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
549 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,318 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,
550 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,319 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,
551 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,320 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,
552 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,321 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,
553};322};
554static const u8 Te4[256] = {323static u8 Te4[256] = {
555 0x63U, 0x7cU, 0x77U, 0x7bU,324 0x63U, 0x7cU, 0x77U, 0x7bU,
556 0xf2U, 0x6bU, 0x6fU, 0xc5U,325 0xf2U, 0x6bU, 0x6fU, 0xc5U,
557 0x30U, 0x01U, 0x67U, 0x2bU,326 0x30U, 0x01U, 0x67U, 0x2bU,
558 0xfeU, 0xd7U, 0xabU, 0x76U,327 0xfeU, 0xd7U, 0xabU, 0x76U,
559 0xcaU, 0x82U, 0xc9U, 0x7dU,328 0xcaU, 0x82U, 0xc9U, 0x7dU,
560 0xfaU, 0x59U, 0x47U, 0xf0U,329 0xfaU, 0x59U, 0x47U, 0xf0U,
561 0xadU, 0xd4U, 0xa2U, 0xafU,330 0xadU, 0xd4U, 0xa2U, 0xafU,
562 0x9cU, 0xa4U, 0x72U, 0xc0U,331 0x9cU, 0xa4U, 0x72U, 0xc0U,
563 0xb7U, 0xfdU, 0x93U, 0x26U,332 0xb7U, 0xfdU, 0x93U, 0x26U,
564 0x36U, 0x3fU, 0xf7U, 0xccU,333 0x36U, 0x3fU, 0xf7U, 0xccU,
565 0x34U, 0xa5U, 0xe5U, 0xf1U,334 0x34U, 0xa5U, 0xe5U, 0xf1U,
566 0x71U, 0xd8U, 0x31U, 0x15U,335 0x71U, 0xd8U, 0x31U, 0x15U,
567 0x04U, 0xc7U, 0x23U, 0xc3U,336 0x04U, 0xc7U, 0x23U, 0xc3U,
568 0x18U, 0x96U, 0x05U, 0x9aU,337 0x18U, 0x96U, 0x05U, 0x9aU,
569 0x07U, 0x12U, 0x80U, 0xe2U,338 0x07U, 0x12U, 0x80U, 0xe2U,
570 0xebU, 0x27U, 0xb2U, 0x75U,339 0xebU, 0x27U, 0xb2U, 0x75U,
571 0x09U, 0x83U, 0x2cU, 0x1aU,340 0x09U, 0x83U, 0x2cU, 0x1aU,
572 0x1bU, 0x6eU, 0x5aU, 0xa0U,341 0x1bU, 0x6eU, 0x5aU, 0xa0U,
573 0x52U, 0x3bU, 0xd6U, 0xb3U,342 0x52U, 0x3bU, 0xd6U, 0xb3U,
574 0x29U, 0xe3U, 0x2fU, 0x84U,343 0x29U, 0xe3U, 0x2fU, 0x84U,
575 0x53U, 0xd1U, 0x00U, 0xedU,344 0x53U, 0xd1U, 0x00U, 0xedU,
576 0x20U, 0xfcU, 0xb1U, 0x5bU,345 0x20U, 0xfcU, 0xb1U, 0x5bU,
577 0x6aU, 0xcbU, 0xbeU, 0x39U,346 0x6aU, 0xcbU, 0xbeU, 0x39U,
578 0x4aU, 0x4cU, 0x58U, 0xcfU,347 0x4aU, 0x4cU, 0x58U, 0xcfU,
579 0xd0U, 0xefU, 0xaaU, 0xfbU,348 0xd0U, 0xefU, 0xaaU, 0xfbU,
580 0x43U, 0x4dU, 0x33U, 0x85U,349 0x43U, 0x4dU, 0x33U, 0x85U,
581 0x45U, 0xf9U, 0x02U, 0x7fU,350 0x45U, 0xf9U, 0x02U, 0x7fU,
582 0x50U, 0x3cU, 0x9fU, 0xa8U,351 0x50U, 0x3cU, 0x9fU, 0xa8U,
583 0x51U, 0xa3U, 0x40U, 0x8fU,352 0x51U, 0xa3U, 0x40U, 0x8fU,
584 0x92U, 0x9dU, 0x38U, 0xf5U,353 0x92U, 0x9dU, 0x38U, 0xf5U,
585 0xbcU, 0xb6U, 0xdaU, 0x21U,354 0xbcU, 0xb6U, 0xdaU, 0x21U,
586 0x10U, 0xffU, 0xf3U, 0xd2U,355 0x10U, 0xffU, 0xf3U, 0xd2U,
587 0xcdU, 0x0cU, 0x13U, 0xecU,356 0xcdU, 0x0cU, 0x13U, 0xecU,
588 0x5fU, 0x97U, 0x44U, 0x17U,357 0x5fU, 0x97U, 0x44U, 0x17U,
589 0xc4U, 0xa7U, 0x7eU, 0x3dU,358 0xc4U, 0xa7U, 0x7eU, 0x3dU,
590 0x64U, 0x5dU, 0x19U, 0x73U,359 0x64U, 0x5dU, 0x19U, 0x73U,
591 0x60U, 0x81U, 0x4fU, 0xdcU,360 0x60U, 0x81U, 0x4fU, 0xdcU,
592 0x22U, 0x2aU, 0x90U, 0x88U,361 0x22U, 0x2aU, 0x90U, 0x88U,
593 0x46U, 0xeeU, 0xb8U, 0x14U,362 0x46U, 0xeeU, 0xb8U, 0x14U,
594 0xdeU, 0x5eU, 0x0bU, 0xdbU,363 0xdeU, 0x5eU, 0x0bU, 0xdbU,
595 0xe0U, 0x32U, 0x3aU, 0x0aU,364 0xe0U, 0x32U, 0x3aU, 0x0aU,
596 0x49U, 0x06U, 0x24U, 0x5cU,365 0x49U, 0x06U, 0x24U, 0x5cU,
597 0xc2U, 0xd3U, 0xacU, 0x62U,366 0xc2U, 0xd3U, 0xacU, 0x62U,
598 0x91U, 0x95U, 0xe4U, 0x79U,367 0x91U, 0x95U, 0xe4U, 0x79U,
599 0xe7U, 0xc8U, 0x37U, 0x6dU,368 0xe7U, 0xc8U, 0x37U, 0x6dU,
600 0x8dU, 0xd5U, 0x4eU, 0xa9U,369 0x8dU, 0xd5U, 0x4eU, 0xa9U,
601 0x6cU, 0x56U, 0xf4U, 0xeaU,370 0x6cU, 0x56U, 0xf4U, 0xeaU,
602 0x65U, 0x7aU, 0xaeU, 0x08U,371 0x65U, 0x7aU, 0xaeU, 0x08U,
603 0xbaU, 0x78U, 0x25U, 0x2eU,372 0xbaU, 0x78U, 0x25U, 0x2eU,
604 0x1cU, 0xa6U, 0xb4U, 0xc6U,373 0x1cU, 0xa6U, 0xb4U, 0xc6U,
605 0xe8U, 0xddU, 0x74U, 0x1fU,374 0xe8U, 0xddU, 0x74U, 0x1fU,
606 0x4bU, 0xbdU, 0x8bU, 0x8aU,375 0x4bU, 0xbdU, 0x8bU, 0x8aU,
607 0x70U, 0x3eU, 0xb5U, 0x66U,376 0x70U, 0x3eU, 0xb5U, 0x66U,
608 0x48U, 0x03U, 0xf6U, 0x0eU,377 0x48U, 0x03U, 0xf6U, 0x0eU,
609 0x61U, 0x35U, 0x57U, 0xb9U,378 0x61U, 0x35U, 0x57U, 0xb9U,
610 0x86U, 0xc1U, 0x1dU, 0x9eU,379 0x86U, 0xc1U, 0x1dU, 0x9eU,
611 0xe1U, 0xf8U, 0x98U, 0x11U,380 0xe1U, 0xf8U, 0x98U, 0x11U,
612 0x69U, 0xd9U, 0x8eU, 0x94U,381 0x69U, 0xd9U, 0x8eU, 0x94U,
613 0x9bU, 0x1eU, 0x87U, 0xe9U,382 0x9bU, 0x1eU, 0x87U, 0xe9U,
614 0xceU, 0x55U, 0x28U, 0xdfU,383 0xceU, 0x55U, 0x28U, 0xdfU,
615 0x8cU, 0xa1U, 0x89U, 0x0dU,384 0x8cU, 0xa1U, 0x89U, 0x0dU,
616 0xbfU, 0xe6U, 0x42U, 0x68U,385 0xbfU, 0xe6U, 0x42U, 0x68U,
617 0x41U, 0x99U, 0x2dU, 0x0fU,386 0x41U, 0x99U, 0x2dU, 0x0fU,
618 0xb0U, 0x54U, 0xbbU, 0x16U,387 0xb0U, 0x54U, 0xbbU, 0x16U,
619};388};
620static const u32 Td0[256] = {389static u32 Td0[256] = {
621 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,390 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
622 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,391 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
623 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,392 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
624 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,393 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,
625 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,394 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
626 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,395 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,
627 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,396 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,
628 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,397 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,
629 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,398 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,
630 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,399 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
631 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,400 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,
632 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,401 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,
633 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,402 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,
634 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,403 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,
635 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,404 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
636 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,405 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,
637 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,406 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,
638 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,407 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,
639 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,408 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,
640 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,409 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
641 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,410 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,
642 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,411 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,
643 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,412 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,
644 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,413 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,
645 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,414 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
646 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,415 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,
647 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,416 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,
648 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,417 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,
649 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,418 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,
650 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,419 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
651 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,420 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,
652 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,421 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,
653 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,422 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,
654 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,423 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,
655 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,424 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
656 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,425 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,
657 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,426 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,
658 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,427 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,
659 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,428 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,
660 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,429 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
661 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,430 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,
662 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,431 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,
663 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,432 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,
664 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,433 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,
665 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,434 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
666 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,435 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,
667 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,436 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,
668 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,437 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,
669 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,438 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,
670 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,439 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
671 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,440 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,
672 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,441 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,
673 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,442 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,
674 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,443 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,
675 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,444 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
676 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,445 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,
677 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,446 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,
678 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,447 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,
679 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,448 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,
680 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,449 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
681 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,450 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,
682 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,451 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,
683 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,452 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
684 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,453 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
685};454};
686static const u32 Td1[256] = {455static u32 Td1[256] = {
687 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,456 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,
688 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,457 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,
689 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU,458 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU,
690 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U,459 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U,
691 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,460 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,
692 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U,461 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U,
693 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U,462 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U,
694 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U,463 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U,
695 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U,464 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U,
696 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,465 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,
697 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU,466 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU,
698 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU,467 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU,
699 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U,468 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U,
700 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU,469 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU,
701 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,470 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,
702 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U,471 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U,
703 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U,472 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U,
704 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU,473 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU,
705 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU,474 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU,
706 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,475 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,
707 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU,476 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU,
708 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U,477 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U,
709 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU,478 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU,
710 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU,479 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU,
711 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,480 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,
712 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U,481 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U,
713 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U,482 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U,
714 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU,483 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU,
715 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U,484 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U,
716 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,485 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,
717 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U,486 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U,
718 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U,487 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U,
719 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U,488 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U,
720 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU,489 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU,
721 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,490 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,
722 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U,491 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U,
723 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U,492 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U,
724 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U,493 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U,
725 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U,494 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U,
726 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,495 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,
727 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU,496 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU,
728 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU,497 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU,
729 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U,498 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U,
730 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU,499 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU,
731 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,500 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,
732 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU,501 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU,
733 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU,502 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU,
734 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U,503 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U,
735 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU,504 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU,
736 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,505 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,
737 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U,506 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U,
738 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U,507 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U,
739 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U,508 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U,
740 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U,509 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U,
741 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,510 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,
742 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U,511 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U,
743 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU,512 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU,
744 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U,513 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U,
745 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U,514 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U,
746 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,515 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,
747 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U,516 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U,
748 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U,517 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U,
749 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,518 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,
750 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,519 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,
751};520};
752static const u32 Td2[256] = {521static u32 Td2[256] = {
753 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,522 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,
754 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,523 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,
755 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U,524 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U,
756 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U,525 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U,
757 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,526 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,
758 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U,527 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U,
759 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U,528 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U,
760 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U,529 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U,
761 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U,530 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U,
762 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,531 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,
763 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U,532 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U,
764 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U,533 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U,
765 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU,534 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU,
766 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U,535 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U,
767 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,536 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,
768 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U,537 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U,
769 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U,538 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U,
770 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U,539 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U,
771 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U,540 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U,
772 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,541 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,
773 542
774 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U,543 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U,
775 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U,544 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U,
776 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U,545 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U,
777 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U,546 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U,
778 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,547 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,
779 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU,548 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU,
780 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU,549 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU,
781 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U,550 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U,
782 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU,551 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU,
783 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,552 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,
784 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU,553 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU,
785 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU,554 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU,
786 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU,555 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU,
787 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU,556 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU,
788 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,557 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,
789 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U,558 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U,
790 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U,559 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U,
791 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U,560 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U,
792 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U,561 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U,
793 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,562 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,
794 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U,563 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U,
795 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU,564 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU,
796 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU,565 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU,
797 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U,566 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U,
798 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,567 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,
799 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU,568 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU,
800 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU,569 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU,
801 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U,570 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U,
802 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U,571 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U,
803 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,572 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,
804 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U,573 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U,
805 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U,574 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U,
806 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U,575 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U,
807 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U,576 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U,
808 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,577 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,
809 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U,578 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U,
810 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U,579 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U,
811 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U,580 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U,
812 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U,581 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U,
813 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,582 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,
814 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U,583 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U,
815 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU,584 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU,
816 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,585 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,
817 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,586 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,
818};587};
819static const u32 Td3[256] = {588static u32 Td3[256] = {
820 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,589 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,
821 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,590 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,
822 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U,591 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U,
823 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U,592 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U,
824 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,593 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,
825 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU,594 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU,
826 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U,595 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U,
827 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU,596 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU,
828 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U,597 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U,
829 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,598 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,
830 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U,599 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U,
831 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U,600 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U,
832 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U,601 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U,
833 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U,602 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U,
834 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,603 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,
835 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU,604 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU,
836 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU,605 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU,
837 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U,606 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U,
838 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U,607 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U,
839 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,608 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,
840 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU,609 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU,
841 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U,610 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U,
842 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U,611 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U,
843 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U,612 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U,
844 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,613 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,
845 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU,614 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU,
846 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U,615 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U,
847 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U,616 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U,
848 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU,617 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU,
849 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,618 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,
850 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U,619 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U,
851 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U,620 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U,
852 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U,621 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U,
853 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU,622 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU,
854 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,623 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,
855 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U,624 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U,
856 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U,625 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U,
857 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U,626 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U,
858 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U,627 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U,
859 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,628 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,
860 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U,629 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U,
861 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU,630 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU,
862 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U,631 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U,
863 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U,632 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U,
864 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,633 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,
865 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU,634 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU,
866 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U,635 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U,
867 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU,636 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU,
868 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U,637 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U,
869 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,638 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,
870 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U,639 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U,
871 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U,640 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U,
872 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U,641 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U,
873 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U,642 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U,
874 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,643 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,
875 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU,644 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU,
876 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU,645 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU,
877 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU,646 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU,
878 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U,647 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U,
879 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,648 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,
880 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U,649 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U,
881 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU,650 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU,
882 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,651 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,
883 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,652 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,
884};653};
885static const u8 Td4[256] = {654static u8 Td4[256] = {
886 0x52U, 0x09U, 0x6aU, 0xd5U,655 0x52U, 0x09U, 0x6aU, 0xd5U,
887 0x30U, 0x36U, 0xa5U, 0x38U,656 0x30U, 0x36U, 0xa5U, 0x38U,
888 0xbfU, 0x40U, 0xa3U, 0x9eU,657 0xbfU, 0x40U, 0xa3U, 0x9eU,
889 0x81U, 0xf3U, 0xd7U, 0xfbU,658 0x81U, 0xf3U, 0xd7U, 0xfbU,
890 0x7cU, 0xe3U, 0x39U, 0x82U,659 0x7cU, 0xe3U, 0x39U, 0x82U,
891 0x9bU, 0x2fU, 0xffU, 0x87U,660 0x9bU, 0x2fU, 0xffU, 0x87U,
892 0x34U, 0x8eU, 0x43U, 0x44U,661 0x34U, 0x8eU, 0x43U, 0x44U,
893 0xc4U, 0xdeU, 0xe9U, 0xcbU,662 0xc4U, 0xdeU, 0xe9U, 0xcbU,
894 0x54U, 0x7bU, 0x94U, 0x32U,663 0x54U, 0x7bU, 0x94U, 0x32U,
895 0xa6U, 0xc2U, 0x23U, 0x3dU,664 0xa6U, 0xc2U, 0x23U, 0x3dU,
896 0xeeU, 0x4cU, 0x95U, 0x0bU,665 0xeeU, 0x4cU, 0x95U, 0x0bU,
897 0x42U, 0xfaU, 0xc3U, 0x4eU,666 0x42U, 0xfaU, 0xc3U, 0x4eU,
898 0x08U, 0x2eU, 0xa1U, 0x66U,667 0x08U, 0x2eU, 0xa1U, 0x66U,
899 0x28U, 0xd9U, 0x24U, 0xb2U,668 0x28U, 0xd9U, 0x24U, 0xb2U,
900 0x76U, 0x5bU, 0xa2U, 0x49U,669 0x76U, 0x5bU, 0xa2U, 0x49U,
901 0x6dU, 0x8bU, 0xd1U, 0x25U,670 0x6dU, 0x8bU, 0xd1U, 0x25U,
902 0x72U, 0xf8U, 0xf6U, 0x64U,671 0x72U, 0xf8U, 0xf6U, 0x64U,
903 0x86U, 0x68U, 0x98U, 0x16U,672 0x86U, 0x68U, 0x98U, 0x16U,
904 0xd4U, 0xa4U, 0x5cU, 0xccU,673 0xd4U, 0xa4U, 0x5cU, 0xccU,
905 0x5dU, 0x65U, 0xb6U, 0x92U,674 0x5dU, 0x65U, 0xb6U, 0x92U,
906 0x6cU, 0x70U, 0x48U, 0x50U,675 0x6cU, 0x70U, 0x48U, 0x50U,
907 0xfdU, 0xedU, 0xb9U, 0xdaU,676 0xfdU, 0xedU, 0xb9U, 0xdaU,
908 0x5eU, 0x15U, 0x46U, 0x57U,677 0x5eU, 0x15U, 0x46U, 0x57U,
909 0xa7U, 0x8dU, 0x9dU, 0x84U,678 0xa7U, 0x8dU, 0x9dU, 0x84U,
910 0x90U, 0xd8U, 0xabU, 0x00U,679 0x90U, 0xd8U, 0xabU, 0x00U,
911 0x8cU, 0xbcU, 0xd3U, 0x0aU,680 0x8cU, 0xbcU, 0xd3U, 0x0aU,
912 0xf7U, 0xe4U, 0x58U, 0x05U,681 0xf7U, 0xe4U, 0x58U, 0x05U,
913 0xb8U, 0xb3U, 0x45U, 0x06U,682 0xb8U, 0xb3U, 0x45U, 0x06U,
914 0xd0U, 0x2cU, 0x1eU, 0x8fU,683 0xd0U, 0x2cU, 0x1eU, 0x8fU,
915 0xcaU, 0x3fU, 0x0fU, 0x02U,684 0xcaU, 0x3fU, 0x0fU, 0x02U,
916 0xc1U, 0xafU, 0xbdU, 0x03U,685 0xc1U, 0xafU, 0xbdU, 0x03U,
917 0x01U, 0x13U, 0x8aU, 0x6bU,686 0x01U, 0x13U, 0x8aU, 0x6bU,
918 0x3aU, 0x91U, 0x11U, 0x41U,687 0x3aU, 0x91U, 0x11U, 0x41U,
919 0x4fU, 0x67U, 0xdcU, 0xeaU,688 0x4fU, 0x67U, 0xdcU, 0xeaU,
920 0x97U, 0xf2U, 0xcfU, 0xceU,689 0x97U, 0xf2U, 0xcfU, 0xceU,
921 0xf0U, 0xb4U, 0xe6U, 0x73U,690 0xf0U, 0xb4U, 0xe6U, 0x73U,
922 0x96U, 0xacU, 0x74U, 0x22U,691 0x96U, 0xacU, 0x74U, 0x22U,
923 0xe7U, 0xadU, 0x35U, 0x85U,692 0xe7U, 0xadU, 0x35U, 0x85U,
924 0xe2U, 0xf9U, 0x37U, 0xe8U,693 0xe2U, 0xf9U, 0x37U, 0xe8U,
925 0x1cU, 0x75U, 0xdfU, 0x6eU,694 0x1cU, 0x75U, 0xdfU, 0x6eU,
926 0x47U, 0xf1U, 0x1aU, 0x71U,695 0x47U, 0xf1U, 0x1aU, 0x71U,
927 0x1dU, 0x29U, 0xc5U, 0x89U,696 0x1dU, 0x29U, 0xc5U, 0x89U,
928 0x6fU, 0xb7U, 0x62U, 0x0eU,697 0x6fU, 0xb7U, 0x62U, 0x0eU,
929 0xaaU, 0x18U, 0xbeU, 0x1bU,698 0xaaU, 0x18U, 0xbeU, 0x1bU,
930 0xfcU, 0x56U, 0x3eU, 0x4bU,699 0xfcU, 0x56U, 0x3eU, 0x4bU,
931 0xc6U, 0xd2U, 0x79U, 0x20U,700 0xc6U, 0xd2U, 0x79U, 0x20U,
932 0x9aU, 0xdbU, 0xc0U, 0xfeU,701 0x9aU, 0xdbU, 0xc0U, 0xfeU,
933 0x78U, 0xcdU, 0x5aU, 0xf4U,702 0x78U, 0xcdU, 0x5aU, 0xf4U,
934 0x1fU, 0xddU, 0xa8U, 0x33U,703 0x1fU, 0xddU, 0xa8U, 0x33U,
935 0x88U, 0x07U, 0xc7U, 0x31U,704 0x88U, 0x07U, 0xc7U, 0x31U,
936 0xb1U, 0x12U, 0x10U, 0x59U,705 0xb1U, 0x12U, 0x10U, 0x59U,
937 0x27U, 0x80U, 0xecU, 0x5fU,706 0x27U, 0x80U, 0xecU, 0x5fU,
938 0x60U, 0x51U, 0x7fU, 0xa9U,707 0x60U, 0x51U, 0x7fU, 0xa9U,
939 0x19U, 0xb5U, 0x4aU, 0x0dU,708 0x19U, 0xb5U, 0x4aU, 0x0dU,
940 0x2dU, 0xe5U, 0x7aU, 0x9fU,709 0x2dU, 0xe5U, 0x7aU, 0x9fU,
941 0x93U, 0xc9U, 0x9cU, 0xefU,710 0x93U, 0xc9U, 0x9cU, 0xefU,
942 0xa0U, 0xe0U, 0x3bU, 0x4dU,711 0xa0U, 0xe0U, 0x3bU, 0x4dU,
943 0xaeU, 0x2aU, 0xf5U, 0xb0U,712 0xaeU, 0x2aU, 0xf5U, 0xb0U,
944 0xc8U, 0xebU, 0xbbU, 0x3cU,713 0xc8U, 0xebU, 0xbbU, 0x3cU,
945 0x83U, 0x53U, 0x99U, 0x61U,714 0x83U, 0x53U, 0x99U, 0x61U,
946 0x17U, 0x2bU, 0x04U, 0x7eU,715 0x17U, 0x2bU, 0x04U, 0x7eU,
947 0xbaU, 0x77U, 0xd6U, 0x26U,716 0xbaU, 0x77U, 0xd6U, 0x26U,
948 0xe1U, 0x69U, 0x14U, 0x63U,717 0xe1U, 0x69U, 0x14U, 0x63U,
949 0x55U, 0x21U, 0x0cU, 0x7dU,718 0x55U, 0x21U, 0x0cU, 0x7dU,
950};719};
951static const u32 rcon[] = {720static u32 rcon[] = {
952 0x01000000, 0x02000000, 0x04000000, 0x08000000,721 0x01000000, 0x02000000, 0x04000000, 0x08000000,
953 0x10000000, 0x20000000, 0x40000000, 0x80000000,722 0x10000000, 0x20000000, 0x40000000, 0x80000000,
954 0x1B000000, 0x36000000,723 0x1B000000, 0x36000000,
955 /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */724 /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
956};725};
957 726
958#define GETU32(pt) (((u32)(pt)[0]<<24) ^ ((u32)(pt)[1]<<16) ^ \
959 ((u32)(pt)[2]<< 8) ^ ((u32)(pt)[3]))
960#define PUTU32(ct, st) { (ct)[0] = (u8)((st)>>24); (ct)[1] = (u8)((st)>>16); \
961 (ct)[2] = (u8)((st)>> 8); (ct)[3] = (u8)(st); }
962
963/*727/*
964 * Expand the cipher key into the encryption key schedule.728 * Expand the cipher key into the encryption key schedule.
965 *729 *
966 * @return the number of rounds for the given cipher key size.730 * @return the number of rounds for the given cipher key size.
967 */731 */
968static int732static int
969aes_setupEnc(ulong rk[/*4*(Nr + 1)*/], const uchar cipherKey[], int keyBits)733setupEnc(ulong rk[/*4*(Nr + 1)*/], uchar key[], int nkey)
970{734{
971 int i = 0;735 int i = 0;
972 u32 temp;736 u32 temp;
973 737
974 rk[0] = GETU32(cipherKey );738 rk[0] = GETU32(key );
975 rk[1] = GETU32(cipherKey + 4);739 rk[1] = GETU32(key + 4);
976 rk[2] = GETU32(cipherKey + 8);740 rk[2] = GETU32(key + 8);
977 rk[3] = GETU32(cipherKey + 12);741 rk[3] = GETU32(key + 12);
978 if (keyBits == 128) {742 if (nkey == 16) {
979 for (;;) {743 for (;;) {
980 temp = rk[3];744 temp = rk[3];
981 rk[4] = rk[0] ^745 rk[4] = rk[0] ^
@@ -993,9 +757,9 @@ aes_setupEnc(ulong rk[/*4*(Nr + 1)*/], const uchar cipherKey[], int keyBits) · 11 unmodified lines
993 rk += 4;757 rk += 4;
994 }758 }
995 }759 }
996 rk[4] = GETU32(cipherKey + 16);760 rk[4] = GETU32(key + 16);
997 rk[5] = GETU32(cipherKey + 20);761 rk[5] = GETU32(key + 20);
998 if (keyBits == 192) {762 if (nkey == 24) {
999 for (;;) {763 for (;;) {
1000 temp = rk[ 5];764 temp = rk[ 5];
1001 rk[ 6] = rk[ 0] ^765 rk[ 6] = rk[ 0] ^
@@ -1015,42 +779,94 @@ aes_setupEnc(ulong rk[/*4*(Nr + 1)*/], const uchar cipherKey[], int keyBits) · 13 unmodified lines
1015 rk += 6;779 rk += 6;
1016 }780 }
1017 }781 }
1018 rk[6] = GETU32(cipherKey + 24);782 rk[6] = GETU32(key + 24);
1019 rk[7] = GETU32(cipherKey + 28);783 rk[7] = GETU32(key + 28);
1020 if (keyBits == 256) {784 if (nkey == 32) {
1021 for (;;) {785 for (;;) {
1022 temp = rk[ 7];786 temp = rk[ 7];
1023 rk[ 8] = rk[ 0] ^787 rk[ 8] = rk[ 0] ^
1024 (Te4[(temp >> 16) & 0xff] << 24) ^788 (Te4[(temp >> 16) & 0xff] << 24) ^
1025 (Te4[(temp >> 8) & 0xff] << 16) ^789 (Te4[(temp >> 8) & 0xff] << 16) ^
1026 (Te4[(temp ) & 0xff] << 8) ^790 (Te4[(temp ) & 0xff] << 8) ^
1027 (Te4[(temp >> 24) ] ) ^791 (Te4[(temp >> 24) ] ) ^
1028 rcon[i];792 rcon[i];
1029 rk[ 9] = rk[ 1] ^ rk[ 8];793 rk[ 9] = rk[ 1] ^ rk[ 8];
1030 rk[10] = rk[ 2] ^ rk[ 9];794 rk[10] = rk[ 2] ^ rk[ 9];
1031 rk[11] = rk[ 3] ^ rk[10];795 rk[11] = rk[ 3] ^ rk[10];
1032 if (++i == 7) {796 if (++i == 7) {
1033 return 14;797 return 14;
1034 }798 }
1035 temp = rk[11];799 temp = rk[11];
1036 rk[12] = rk[ 4] ^800 rk[12] = rk[ 4] ^
1037 (Te4[(temp >> 24) ] << 24) ^801 (Te4[(temp >> 24) ] << 24) ^
1038 (Te4[(temp >> 16) & 0xff] << 16) ^802 (Te4[(temp >> 16) & 0xff] << 16) ^
1039 (Te4[(temp >> 8) & 0xff] << 8) ^803 (Te4[(temp >> 8) & 0xff] << 8) ^
1040 (Te4[(temp ) & 0xff] );804 (Te4[(temp ) & 0xff] );
1041 rk[13] = rk[ 5] ^ rk[12];805 rk[13] = rk[ 5] ^ rk[12];
1042 rk[14] = rk[ 6] ^ rk[13];806 rk[14] = rk[ 6] ^ rk[13];
1043 rk[15] = rk[ 7] ^ rk[14];807 rk[15] = rk[ 7] ^ rk[14];
1044 rk += 8;808 rk += 8;
1045 }809 }
1046 }810 }
1047 return 0;811 return 0;
1048}812}
1049 813
814/*
815 * Expand the cipher key into the encryption and decryption key schedules.
816 *
817 * @return the number of rounds for the given cipher key size.
818 */
819static int
820AESsetup(ulong erk[/* 4*(Nr + 1) */], ulong drk[/* 4*(Nr + 1) */], uchar key[], int nkey)
821{
822 int Nr, i;
823
824 /* expand the cipher key: */
825 Nr = setupEnc(erk, key, nkey);
826
827 /*
828 * invert the order of the round keys and apply the inverse MixColumn
829 * transform to all round keys but the first and the last
830 */
831 drk[0 ] = erk[4*Nr ];
832 drk[1 ] = erk[4*Nr + 1];
833 drk[2 ] = erk[4*Nr + 2];
834 drk[3 ] = erk[4*Nr + 3];
835 drk[4*Nr ] = erk[0 ];
836 drk[4*Nr + 1] = erk[1 ];
837 drk[4*Nr + 2] = erk[2 ];
838 drk[4*Nr + 3] = erk[3 ];
839 erk += 4 * Nr;
840 for (i = 1; i < Nr; i++) {
841 drk += 4;
842 erk -= 4;
843 drk[0] =
844 Td0[Te4[(erk[0] >> 24) ]] ^
845 Td1[Te4[(erk[0] >> 16) & 0xff]] ^
846 Td2[Te4[(erk[0] >> 8) & 0xff]] ^
847 Td3[Te4[(erk[0] ) & 0xff]];
848 drk[1] =
849 Td0[Te4[(erk[1] >> 24) ]] ^
850 Td1[Te4[(erk[1] >> 16) & 0xff]] ^
851 Td2[Te4[(erk[1] >> 8) & 0xff]] ^
852 Td3[Te4[(erk[1] ) & 0xff]];
853 drk[2] =
854 Td0[Te4[(erk[2] >> 24) ]] ^
855 Td1[Te4[(erk[2] >> 16) & 0xff]] ^
856 Td2[Te4[(erk[2] >> 8) & 0xff]] ^
857 Td3[Te4[(erk[2] ) & 0xff]];
858 drk[3] =
859 Td0[Te4[(erk[3] >> 24) ]] ^
860 Td1[Te4[(erk[3] >> 16) & 0xff]] ^
861 Td2[Te4[(erk[3] >> 8) & 0xff]] ^
862 Td3[Te4[(erk[3] ) & 0xff]];
863 }
864 return Nr;
865}
866
1050/* using round keys in rk, perform Nr rounds of encrypting pt into ct */867/* using round keys in rk, perform Nr rounds of encrypting pt into ct */
1051void868static void
1052aes_encrypt(const ulong rk[/* 4*(Nr + 1) */], int Nr, const uchar pt[16],869AESencrypt(ulong rk[/* 4*(Nr + 1) */], int Nr, uchar pt[16], uchar ct[16])
1053 uchar ct[16])
1054{870{
1055 ulong s0, s1, s2, s3, t0, t1, t2, t3;871 ulong s0, s1, s2, s3, t0, t1, t2, t3;
1056#ifndef FULL_UNROLL872#ifndef FULL_UNROLL
@@ -1067,50 +883,50 @@ aes_encrypt(const ulong rk[/* 4*(Nr + 1) */], int Nr, const uchar pt[16], · 10 unmodified lines
1067 s3 = GETU32(pt + 12) ^ rk[3];883 s3 = GETU32(pt + 12) ^ rk[3];
1068#ifdef FULL_UNROLL884#ifdef FULL_UNROLL
1069 /* round 1: */885 /* round 1: */
1070 t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4];886 t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4];
1071 t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5];887 t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5];
1072 t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6];888 t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6];
1073 t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7];889 t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7];
1074 /* round 2: */890 /* round 2: */
1075 s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8];891 s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8];
1076 s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9];892 s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9];
1077 s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10];893 s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10];
1078 s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11];894 s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11];
1079 /* round 3: */895 /* round 3: */
1080 t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12];896 t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12];
1081 t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13];897 t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13];
1082 t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14];898 t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14];
1083 t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15];899 t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15];
1084 /* round 4: */900 /* round 4: */
1085 s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16];901 s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16];
1086 s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17];902 s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17];
1087 s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18];903 s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18];
1088 s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19];904 s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19];
1089 /* round 5: */905 /* round 5: */
1090 t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20];906 t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20];
1091 t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21];907 t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21];
1092 t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22];908 t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22];
1093 t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23];909 t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23];
1094 /* round 6: */910 /* round 6: */
1095 s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24];911 s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24];
1096 s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25];912 s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25];
1097 s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26];913 s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26];
1098 s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27];914 s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27];
1099 /* round 7: */915 /* round 7: */
1100 t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28];916 t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28];
1101 t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29];917 t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29];
1102 t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30];918 t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30];
1103 t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31];919 t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31];
1104 /* round 8: */920 /* round 8: */
1105 s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32];921 s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32];
1106 s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33];922 s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33];
1107 s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34];923 s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34];
1108 s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35];924 s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35];
1109 /* round 9: */925 /* round 9: */
1110 t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36];926 t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36];
1111 t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37];927 t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37];
1112 t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38];928 t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38];
1113 t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39];929 t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39];
1114 if (Nr > 10) {930 if (Nr > 10) {
1115 /* round 10: */931 /* round 10: */
1116 s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40];932 s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40];
@@ -1142,59 +958,59 @@ aes_encrypt(const ulong rk[/* 4*(Nr + 1) */], int Nr, const uchar pt[16], · 25 unmodified lines
1142 */958 */
1143 r = Nr >> 1;959 r = Nr >> 1;
1144 for (;;) {960 for (;;) {
1145 t0 =961 t0 =
1146 Te0[(s0 >> 24) ] ^962 Te0[(s0 >> 24) ] ^
1147 Te1[(s1 >> 16) & 0xff] ^963 Te1[(s1 >> 16) & 0xff] ^
1148 Te2[(s2 >> 8) & 0xff] ^964 Te2[(s2 >> 8) & 0xff] ^
1149 Te3[(s3 ) & 0xff] ^965 Te3[(s3 ) & 0xff] ^
1150 rk[4];966 rk[4];
1151 t1 =967 t1 =
1152 Te0[(s1 >> 24) ] ^968 Te0[(s1 >> 24) ] ^
1153 Te1[(s2 >> 16) & 0xff] ^969 Te1[(s2 >> 16) & 0xff] ^
1154 Te2[(s3 >> 8) & 0xff] ^970 Te2[(s3 >> 8) & 0xff] ^
1155 Te3[(s0 ) & 0xff] ^971 Te3[(s0 ) & 0xff] ^
1156 rk[5];972 rk[5];
1157 t2 =973 t2 =
1158 Te0[(s2 >> 24) ] ^974 Te0[(s2 >> 24) ] ^
1159 Te1[(s3 >> 16) & 0xff] ^975 Te1[(s3 >> 16) & 0xff] ^
1160 Te2[(s0 >> 8) & 0xff] ^976 Te2[(s0 >> 8) & 0xff] ^
1161 Te3[(s1 ) & 0xff] ^977 Te3[(s1 ) & 0xff] ^
1162 rk[6];978 rk[6];
1163 t3 =979 t3 =
1164 Te0[(s3 >> 24) ] ^980 Te0[(s3 >> 24) ] ^
1165 Te1[(s0 >> 16) & 0xff] ^981 Te1[(s0 >> 16) & 0xff] ^
1166 Te2[(s1 >> 8) & 0xff] ^982 Te2[(s1 >> 8) & 0xff] ^
1167 Te3[(s2 ) & 0xff] ^983 Te3[(s2 ) & 0xff] ^
1168 rk[7];984 rk[7];
1169 985
1170 rk += 8;986 rk += 8;
1171 if (--r == 0)987 if (--r == 0)
1172 break;988 break;
1173 989
1174 s0 =990 s0 =
1175 Te0[(t0 >> 24) ] ^991 Te0[(t0 >> 24) ] ^
1176 Te1[(t1 >> 16) & 0xff] ^992 Te1[(t1 >> 16) & 0xff] ^
1177 Te2[(t2 >> 8) & 0xff] ^993 Te2[(t2 >> 8) & 0xff] ^
1178 Te3[(t3 ) & 0xff] ^994 Te3[(t3 ) & 0xff] ^
1179 rk[0];995 rk[0];
1180 s1 =996 s1 =
1181 Te0[(t1 >> 24) ] ^997 Te0[(t1 >> 24) ] ^
1182 Te1[(t2 >> 16) & 0xff] ^998 Te1[(t2 >> 16) & 0xff] ^
1183 Te2[(t3 >> 8) & 0xff] ^999 Te2[(t3 >> 8) & 0xff] ^
1184 Te3[(t0 ) & 0xff] ^1000 Te3[(t0 ) & 0xff] ^
1185 rk[1];1001 rk[1];
1186 s2 =1002 s2 =
1187 Te0[(t2 >> 24) ] ^1003 Te0[(t2 >> 24) ] ^
1188 Te1[(t3 >> 16) & 0xff] ^1004 Te1[(t3 >> 16) & 0xff] ^
1189 Te2[(t0 >> 8) & 0xff] ^1005 Te2[(t0 >> 8) & 0xff] ^
1190 Te3[(t1 ) & 0xff] ^1006 Te3[(t1 ) & 0xff] ^
1191 rk[2];1007 rk[2];
1192 s3 =1008 s3 =
1193 Te0[(t3 >> 24) ] ^1009 Te0[(t3 >> 24) ] ^
1194 Te1[(t0 >> 16) & 0xff] ^1010 Te1[(t0 >> 16) & 0xff] ^
1195 Te2[(t1 >> 8) & 0xff] ^1011 Te2[(t1 >> 8) & 0xff] ^
1196 Te3[(t2 ) & 0xff] ^1012 Te3[(t2 ) & 0xff] ^
1197 rk[3];1013 rk[3];
1198 }1014 }
1199#endif /* ?FULL_UNROLL */1015#endif /* ?FULL_UNROLL */
1200 /*1016 /*
@@ -1231,9 +1047,8 @@ aes_encrypt(const ulong rk[/* 4*(Nr + 1) */], int Nr, const uchar pt[16], · 30 unmodified lines
1231 PUTU32(ct + 12, s3);1047 PUTU32(ct + 12, s3);
1232}1048}
1233 1049
1234void1050static void
1235aes_decrypt(const ulong rk[/* 4*(Nr + 1) */], int Nr, const uchar ct[16],1051AESdecrypt(ulong rk[/* 4*(Nr + 1) */], int Nr, uchar ct[16], uchar pt[16])
1236 uchar pt[16])
1237{1052{
1238 ulong s0, s1, s2, s3, t0, t1, t2, t3;1053 ulong s0, s1, s2, s3, t0, t1, t2, t3;
1239#ifndef FULL_UNROLL1054#ifndef FULL_UNROLL
@@ -1244,360 +1059,199 @@ aes_decrypt(const ulong rk[/* 4*(Nr + 1) */], int Nr, const uchar ct[16], · 4 unmodified lines
1244 * map byte array block to cipher state1059 * map byte array block to cipher state
1245 * and add initial round key:1060 * and add initial round key:
1246 */1061 */
1247 s0 = GETU32(ct ) ^ rk[0];1062 s0 = GETU32(ct ) ^ rk[0];
1248 s1 = GETU32(ct + 4) ^ rk[1];1063 s1 = GETU32(ct + 4) ^ rk[1];
1249 s2 = GETU32(ct + 8) ^ rk[2];1064 s2 = GETU32(ct + 8) ^ rk[2];
1250 s3 = GETU32(ct + 12) ^ rk[3];1065 s3 = GETU32(ct + 12) ^ rk[3];
1251#ifdef FULL_UNROLL1066#ifdef FULL_UNROLL
1252 /* round 1: */1067 /* round 1: */
1253 t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4];1068 t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4];
1254 t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5];1069 t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5];
1255 t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6];1070 t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6];
1256 t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7];1071 t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7];
1257 /* round 2: */1072 /* round 2: */
1258 s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8];1073 s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8];
1259 s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9];1074 s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9];
1260 s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10];1075 s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10];
1261 s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11];1076 s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11];
1262 /* round 3: */1077 /* round 3: */
1263 t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12];1078 t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12];
1264 t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13];1079 t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13];
1265 t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14];1080 t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14];
1266 t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15];1081 t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15];
1267 /* round 4: */1082 /* round 4: */
1268 s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16];1083 s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16];
1269 s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17];1084 s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17];
1270 s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18];1085 s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18];
1271 s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19];1086 s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19];
1272 /* round 5: */1087 /* round 5: */
1273 t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20];1088 t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20];
1274 t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21];1089 t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21];
1275 t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22];1090 t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22];
1276 t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23];1091 t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23];
1277 /* round 6: */1092 /* round 6: */
1278 s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24];1093 s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24];
1279 s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25];1094 s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25];
1280 s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26];1095 s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26];
1281 s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27];1096 s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27];
1282 /* round 7: */1097 /* round 7: */
1283 t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28];1098 t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28];
1284 t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29];1099 t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29];
1285 t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30];1100 t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30];
1286 t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31];1101 t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31];
1287 /* round 8: */1102 /* round 8: */
1288 s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32];1103 s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32];
1289 s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33];1104 s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33];
1290 s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34];1105 s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34];
1291 s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35];1106 s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35];
1292 /* round 9: */1107 /* round 9: */
1293 t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36];1108 t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36];
1294 t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37];1109 t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37];
1295 t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38];1110 t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38];
1296 t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39];1111 t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39];
1297 if (Nr > 10) {1112 if (Nr > 10) {
1298 /* round 10: */1113 /* round 10: */
1299 s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40];1114 s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40];
1300 s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41];1115 s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41];
1301 s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42];1116 s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42];
1302 s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43];1117 s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43];
1303 /* round 11: */1118 /* round 11: */
1304 t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44];1119 t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44];
1305 t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45];1120 t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45];
1306 t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46];1121 t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46];
1307 t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47];1122 t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47];
1308 if (Nr > 12) {1123 if (Nr > 12) {
1309 /* round 12: */1124 /* round 12: */
1310 s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48];1125 s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48];
1311 s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49];1126 s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49];
1312 s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50];1127 s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50];
1313 s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51];1128 s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51];
1314 /* round 13: */1129 /* round 13: */
1315 t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52];1130 t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52];
1316 t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53];1131 t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53];
1317 t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54];1132 t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54];
1318 t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55];1133 t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55];
1319 }1134 }
1320 }
1321 rk += Nr << 2;
1322#else /* !FULL_UNROLL */
1323 /*
1324 * Nr - 1 full rounds:
1325 */
1326 r = Nr >> 1;
1327 for (;;) {
1328 t0 =
1329 Td0[(s0 >> 24) ] ^
1330 Td1[(s3 >> 16) & 0xff] ^
1331 Td2[(s2 >> 8) & 0xff] ^
1332 Td3[(s1 ) & 0xff] ^
1333 rk[4];
1334 t1 =
1335 Td0[(s1 >> 24) ] ^
1336 Td1[(s0 >> 16) & 0xff] ^
1337 Td2[(s3 >> 8) & 0xff] ^
1338 Td3[(s2 ) & 0xff] ^
1339 rk[5];
1340 t2 =
1341 Td0[(s2 >> 24) ] ^
1342 Td1[(s1 >> 16) & 0xff] ^
1343 Td2[(s0 >> 8) & 0xff] ^
1344 Td3[(s3 ) & 0xff] ^
1345 rk[6];
1346 t3 =
1347 Td0[(s3 >> 24) ] ^
1348 Td1[(s2 >> 16) & 0xff] ^
1349 Td2[(s1 >> 8) & 0xff] ^
1350 Td3[(s0 ) & 0xff] ^
1351 rk[7];
1352
1353 rk += 8;
1354 if (--r == 0)
1355 break;
1356
1357 s0 =
1358 Td0[(t0 >> 24) ] ^
1359 Td1[(t3 >> 16) & 0xff] ^
1360 Td2[(t2 >> 8) & 0xff] ^
1361 Td3[(t1 ) & 0xff] ^
1362 rk[0];
1363 s1 =
1364 Td0[(t1 >> 24) ] ^
1365 Td1[(t0 >> 16) & 0xff] ^
1366 Td2[(t3 >> 8) & 0xff] ^
1367 Td3[(t2 ) & 0xff] ^
1368 rk[1];
1369 s2 =
1370 Td0[(t2 >> 24) ] ^
1371 Td1[(t1 >> 16) & 0xff] ^
1372 Td2[(t0 >> 8) & 0xff] ^
1373 Td3[(t3 ) & 0xff] ^
1374 rk[2];
1375 s3 =
1376 Td0[(t3 >> 24) ] ^
1377 Td1[(t2 >> 16) & 0xff] ^
1378 Td2[(t1 >> 8) & 0xff] ^
1379 Td3[(t0 ) & 0xff] ^
1380 rk[3];
1381 }
1382#endif /* ?FULL_UNROLL */
1383 /*
1384 * apply last round and
1385 * map cipher state to byte array block:
1386 */
1387 s0 =
1388 (Td4[(t0 >> 24) ] << 24) ^
1389 (Td4[(t3 >> 16) & 0xff] << 16) ^
1390 (Td4[(t2 >> 8) & 0xff] << 8) ^
1391 (Td4[(t1 ) & 0xff] ) ^
1392 rk[0];
1393 PUTU32(pt , s0);
1394 s1 =
1395 (Td4[(t1 >> 24) ] << 24) ^
1396 (Td4[(t0 >> 16) & 0xff] << 16) ^
1397 (Td4[(t3 >> 8) & 0xff] << 8) ^
1398 (Td4[(t2 ) & 0xff] ) ^
1399 rk[1];
1400 PUTU32(pt + 4, s1);
1401 s2 =
1402 (Td4[(t2 >> 24) ] << 24) ^
1403 (Td4[(t1 >> 16) & 0xff] << 16) ^
1404 (Td4[(t0 >> 8) & 0xff] << 8) ^
1405 (Td4[(t3 ) & 0xff] ) ^
1406 rk[2];
1407 PUTU32(pt + 8, s2);
1408 s3 =
1409 (Td4[(t3 >> 24) ] << 24) ^
1410 (Td4[(t2 >> 16) & 0xff] << 16) ^
1411 (Td4[(t1 >> 8) & 0xff] << 8) ^
1412 (Td4[(t0 ) & 0xff] ) ^
1413 rk[3];
1414 PUTU32(pt + 12, s3);
1415}
1416
1417#ifdef INTERMEDIATE_VALUE_KAT
1418
1419static void
1420aes_encryptRound(const u32 rk[/* 4*(Nr + 1) */], int Nr, u8 block[16],
1421 int rounds)
1422{
1423 int r;
1424 u32 s0, s1, s2, s3, t0, t1, t2, t3;
1425
1426 /*
1427 * map byte array block to cipher state
1428 * and add initial round key:
1429 */
1430 s0 = GETU32(block ) ^ rk[0];
1431 s1 = GETU32(block + 4) ^ rk[1];
1432 s2 = GETU32(block + 8) ^ rk[2];
1433 s3 = GETU32(block + 12) ^ rk[3];
1434 rk += 4;
1435
1436 /*
1437 * Nr - 1 full rounds:
1438 */
1439 for (r = (rounds < Nr ? rounds : Nr - 1); r > 0; r--) {
1440 t0 =
1441 Te0[(s0 >> 24) ] ^
1442 Te1[(s1 >> 16) & 0xff] ^
1443 Te2[(s2 >> 8) & 0xff] ^
1444 Te3[(s3 ) & 0xff] ^
1445 rk[0];
1446 t1 =
1447 Te0[(s1 >> 24) ] ^
1448 Te1[(s2 >> 16) & 0xff] ^
1449 Te2[(s3 >> 8) & 0xff] ^
1450 Te3[(s0 ) & 0xff] ^
1451 rk[1];
1452 t2 =
1453 Te0[(s2 >> 24) ] ^
1454 Te1[(s3 >> 16) & 0xff] ^
1455 Te2[(s0 >> 8) & 0xff] ^
1456 Te3[(s1 ) & 0xff] ^
1457 rk[2];
1458 t3 =
1459 Te0[(s3 >> 24) ] ^
1460 Te1[(s0 >> 16) & 0xff] ^
1461 Te2[(s1 >> 8) & 0xff] ^
1462 Te3[(s2 ) & 0xff] ^
1463 rk[3];
1464 s0 = t0;
1465 s1 = t1;
1466 s2 = t2;
1467 s3 = t3;
1468 rk += 4;
1469 }
1470
1471 /*
1472 * apply last round and
1473 * map cipher state to byte array block:
1474 */
1475 if (rounds == Nr) {
1476 t0 =
1477 (Te4[(s0 >> 24) ] << 24) ^
1478 (Te4[(s1 >> 16) & 0xff] << 16) ^
1479 (Te4[(s2 >> 8) & 0xff] << 8) ^
1480 (Te4[(s3 ) & 0xff] ) ^
1481 rk[0];
1482 t1 =
1483 (Te4[(s1 >> 24) ] << 24) ^
1484 (Te4[(s2 >> 16) & 0xff] << 16) ^
1485 (Te4[(s3 >> 8) & 0xff] << 8) ^
1486 (Te4[(s0 ) & 0xff] ) ^
1487 rk[1];
1488 t2 =
1489 (Te4[(s2 >> 24) ] << 24) ^
1490 (Te4[(s3 >> 16) & 0xff] << 16) ^
1491 (Te4[(s0 >> 8) & 0xff] << 8) ^
1492 (Te4[(s1 ) & 0xff] ) ^
1493 rk[2];
1494 t3 =
1495 (Te4[(s3 >> 24) ] << 24) ^
1496 (Te4[(s0 >> 16) & 0xff] << 16) ^
1497 (Te4[(s1 >> 8) & 0xff] << 8) ^
1498 (Te4[(s2 ) & 0xff] ) ^
1499 rk[3];
1500 s0 = t0;
1501 s1 = t1;
1502 s2 = t2;
1503 s3 = t3;
1504 }1135 }
1505 1136 rk += Nr << 2;
1506 PUTU32(block , s0);1137#else /* !FULL_UNROLL */
1507 PUTU32(block + 4, s1);
1508 PUTU32(block + 8, s2);
1509 PUTU32(block + 12, s3);
1510}
1511
1512static void
1513aes_decryptRound(const u32 rk[/* 4*(Nr + 1) */], int Nr, u8 block[16],
1514 int rounds)
1515{
1516 int r;
1517 u32 s0, s1, s2, s3, t0, t1, t2, t3;
1518
1519 /*
1520 * map byte array block to cipher state
1521 * and add initial round key:
1522 */
1523 s0 = GETU32(block ) ^ rk[0];
1524 s1 = GETU32(block + 4) ^ rk[1];
1525 s2 = GETU32(block + 8) ^ rk[2];
1526 s3 = GETU32(block + 12) ^ rk[3];
1527 rk += 4;
1528
1529 /*1138 /*
1530 * Nr - 1 full rounds:1139 * Nr - 1 full rounds:
1531 */1140 */
1532 for (r = (rounds < Nr ? rounds : Nr) - 1; r > 0; r--) {1141 r = Nr >> 1;
1142 for (;;) {
1533 t0 =1143 t0 =
1534 Td0[(s0 >> 24) ] ^1144 Td0[(s0 >> 24) ] ^
1535 Td1[(s3 >> 16) & 0xff] ^1145 Td1[(s3 >> 16) & 0xff] ^
1536 Td2[(s2 >> 8) & 0xff] ^1146 Td2[(s2 >> 8) & 0xff] ^
1537 Td3[(s1 ) & 0xff] ^1147 Td3[(s1 ) & 0xff] ^
1538 rk[0];1148 rk[4];
1539 t1 =1149 t1 =
1540 Td0[(s1 >> 24) ] ^1150 Td0[(s1 >> 24) ] ^
1541 Td1[(s0 >> 16) & 0xff] ^1151 Td1[(s0 >> 16) & 0xff] ^
1542 Td2[(s3 >> 8) & 0xff] ^1152 Td2[(s3 >> 8) & 0xff] ^
1543 Td3[(s2 ) & 0xff] ^1153 Td3[(s2 ) & 0xff] ^
1544 rk[1];1154 rk[5];
1545 t2 =1155 t2 =
1546 Td0[(s2 >> 24) ] ^1156 Td0[(s2 >> 24) ] ^
1547 Td1[(s1 >> 16) & 0xff] ^1157 Td1[(s1 >> 16) & 0xff] ^
1548 Td2[(s0 >> 8) & 0xff] ^1158 Td2[(s0 >> 8) & 0xff] ^
1549 Td3[(s3 ) & 0xff] ^1159 Td3[(s3 ) & 0xff] ^
1550 rk[2];1160 rk[6];
1551 t3 =1161 t3 =
1552 Td0[(s3 >> 24) ] ^1162 Td0[(s3 >> 24) ] ^
1553 Td1[(s2 >> 16) & 0xff] ^1163 Td1[(s2 >> 16) & 0xff] ^
1554 Td2[(s1 >> 8) & 0xff] ^1164 Td2[(s1 >> 8) & 0xff] ^
1555 Td3[(s0 ) & 0xff] ^1165 Td3[(s0 ) & 0xff] ^
1556 rk[3];1166 rk[7];
1557 1167
1558 s0 = t0;1168 rk += 8;
1559 s1 = t1;1169 if (--r == 0)
1560 s2 = t2;1170 break;
1561 s3 = t3;
1562 rk += 4;
1563 }
1564 1171
1172 s0 =
1173 Td0[(t0 >> 24) ] ^
1174 Td1[(t3 >> 16) & 0xff] ^
1175 Td2[(t2 >> 8) & 0xff] ^
1176 Td3[(t1 ) & 0xff] ^
1177 rk[0];
1178 s1 =
1179 Td0[(t1 >> 24) ] ^
1180 Td1[(t0 >> 16) & 0xff] ^
1181 Td2[(t3 >> 8) & 0xff] ^
1182 Td3[(t2 ) & 0xff] ^
1183 rk[1];
1184 s2 =
1185 Td0[(t2 >> 24) ] ^
1186 Td1[(t1 >> 16) & 0xff] ^
1187 Td2[(t0 >> 8) & 0xff] ^
1188 Td3[(t3 ) & 0xff] ^
1189 rk[2];
1190 s3 =
1191 Td0[(t3 >> 24) ] ^
1192 Td1[(t2 >> 16) & 0xff] ^
1193 Td2[(t1 >> 8) & 0xff] ^
1194 Td3[(t0 ) & 0xff] ^
1195 rk[3];
1196 }
1197#endif /* ?FULL_UNROLL */
1565 /*1198 /*
1566 * complete the last round and1199 * apply last round and
1567 * map cipher state to byte array block:1200 * map cipher state to byte array block:
1568 */1201 */
1569 t0 =1202 s0 =
1570 (Td4[(s0 >> 24) ] << 24) ^1203 (Td4[(t0 >> 24) ] << 24) ^
1571 (Td4[(s3 >> 16) & 0xff] << 16) ^1204 (Td4[(t3 >> 16) & 0xff] << 16) ^
1572 (Td4[(s2 >> 8) & 0xff] << 8) ^1205 (Td4[(t2 >> 8) & 0xff] << 8) ^
1573 (Td4[(s1 ) & 0xff] );1206 (Td4[(t1 ) & 0xff] ) ^
1574 t1 =1207 rk[0];
1575 (Td4[(s1 >> 24) ] << 24) ^1208 PUTU32(pt , s0);
1576 (Td4[(s0 >> 16) & 0xff] << 16) ^1209 s1 =
1577 (Td4[(s3 >> 8) & 0xff] << 8) ^1210 (Td4[(t1 >> 24) ] << 24) ^
1578 (Td4[(s2 ) & 0xff] );1211 (Td4[(t0 >> 16) & 0xff] << 16) ^
1579 t2 =1212 (Td4[(t3 >> 8) & 0xff] << 8) ^
1580 (Td4[(s2 >> 24) ] << 24) ^1213 (Td4[(t2 ) & 0xff] ) ^
1581 (Td4[(s1 >> 16) & 0xff] << 16) ^1214 rk[1];
1582 (Td4[(s0 >> 8) & 0xff] << 8) ^1215 PUTU32(pt + 4, s1);
1583 (Td4[(s3 ) & 0xff] );1216 s2 =
1584 t3 =1217 (Td4[(t2 >> 24) ] << 24) ^
1585 (Td4[(s3 >> 24) ] << 24) ^1218 (Td4[(t1 >> 16) & 0xff] << 16) ^
1586 (Td4[(s2 >> 16) & 0xff] << 16) ^1219 (Td4[(t0 >> 8) & 0xff] << 8) ^
1587 (Td4[(s1 >> 8) & 0xff] << 8) ^1220 (Td4[(t3 ) & 0xff] ) ^
1588 (Td4[(s0 ) & 0xff] );1221 rk[2];
1222 PUTU32(pt + 8, s2);
1223 s3 =
1224 (Td4[(t3 >> 24) ] << 24) ^
1225 (Td4[(t2 >> 16) & 0xff] << 16) ^
1226 (Td4[(t1 >> 8) & 0xff] << 8) ^
1227 (Td4[(t0 ) & 0xff] ) ^
1228 rk[3];
1229 PUTU32(pt + 12, s3);
1230}
1589 1231
1590 if (rounds == Nr) {1232void (*aes_encrypt)(ulong rk[], int Nr, uchar pt[16], uchar ct[16]) = AESencrypt;
1591 t0 ^= rk[0];1233void (*aes_decrypt)(ulong rk[], int Nr, uchar ct[16], uchar pt[16]) = AESdecrypt;
1592 t1 ^= rk[1];
1593 t2 ^= rk[2];
1594 t3 ^= rk[3];
1595 }
1596 1234
1597 PUTU32(block , t0);1235void
1598 PUTU32(block + 4, t1);1236setupAESstate(AESstate *s, uchar key[], int nkey, uchar *ivec)
1599 PUTU32(block + 8, t2);1237{
1600 PUTU32(block + 12, t3);1238 static int (*aes_setup)(ulong erk[/* 4*(Nr + 1) */], ulong drk[/* 4*(Nr + 1) */], uchar key[], int nkey);
1601}
1602 1239
1603#endif /* INTERMEDIATE_VALUE_KAT */1240 if(aes_setup == nil){
1241 extern void *aesni_init(void);
1242 if((aes_setup = aesni_init()) == nil)
1243 aes_setup = AESsetup;
1244 }
1245 memset(s, 0, sizeof(*s));
1246 if(nkey > AESmaxkey)
1247 nkey = AESmaxkey;
1248 memmove(s->key, key, nkey);
1249 s->keybytes = nkey;
1250 s->ekey = s->storage+16 - (s->storage - (uchar*)0 & 15);
1251 s->dkey = (uchar*)s->ekey + 16*(AESmaxrounds+1);
1252 s->rounds = (*aes_setup)(s->ekey, s->dkey, s->key, nkey);
1253 if(ivec != nil)
1254 memmove(s->ivec, ivec, AESbsize);
1255 if(s->rounds != 0)
1256 s->setup = 0xcafebabe;
1257}
libsec/aesCBC.c+60−0
@@ -0,0 +1,60 @@
1#include "os.h"
2#include <libsec.h>
3
4/*
5 * Define by analogy with desCBCencrypt; AES modes are not standardized yet.
6 * Because of the way that non-multiple-of-16 buffers are handled,
7 * the decryptor must be fed buffers of the same size as the encryptor.
8 */
9void
10aesCBCencrypt(uchar *p, int len, AESstate *s)
11{
12 uchar *p2, *ip, *eip;
13 uchar q[AESbsize];
14
15 for(; len >= AESbsize; len -= AESbsize){
16 p2 = p;
17 ip = s->ivec;
18 for(eip = ip+AESbsize; ip < eip; )
19 *p2++ ^= *ip++;
20 aes_encrypt(s->ekey, s->rounds, p, q);
21 memmove(s->ivec, q, AESbsize);
22 memmove(p, q, AESbsize);
23 p += AESbsize;
24 }
25
26 if(len > 0){
27 ip = s->ivec;
28 aes_encrypt(s->ekey, s->rounds, ip, q);
29 memmove(s->ivec, q, AESbsize);
30 for(eip = ip+len; ip < eip; )
31 *p++ ^= *ip++;
32 }
33}
34
35void
36aesCBCdecrypt(uchar *p, int len, AESstate *s)
37{
38 uchar *ip, *eip, *tp;
39 uchar tmp[AESbsize], q[AESbsize];
40
41 for(; len >= AESbsize; len -= AESbsize){
42 memmove(tmp, p, AESbsize);
43 aes_decrypt(s->dkey, s->rounds, p, q);
44 memmove(p, q, AESbsize);
45 tp = tmp;
46 ip = s->ivec;
47 for(eip = ip+AESbsize; ip < eip; ){
48 *p++ ^= *ip;
49 *ip++ = *tp++;
50 }
51 }
52
53 if(len > 0){
54 ip = s->ivec;
55 aes_encrypt(s->ekey, s->rounds, ip, q);
56 memmove(s->ivec, q, AESbsize);
57 for(eip = ip+len; ip < eip; )
58 *p++ ^= *ip++;
59 }
60}
libsec/aesCFB.c+50−0
@@ -0,0 +1,50 @@
1#include "os.h"
2#include <libsec.h>
3
4typedef ulong u32;
5
6void
7aesCFBencrypt(uchar *p, int len, AESstate *s)
8{
9 u32 a, o = s->offset;
10
11 while(len > 0){
12 if(o % 16){
13 Odd:
14 a = (s->ivec[o++ % 16] ^= *p), *p++ = a, len--;
15 continue;
16 }
17 aes_encrypt(s->ekey, s->rounds, s->ivec, s->ivec);
18 if(len < 16 || ((p-(uchar*)0) & 3) != 0)
19 goto Odd;
20 ((u32*)p)[0] = (((u32*)s->ivec)[0] ^= ((u32*)p)[0]);
21 ((u32*)p)[1] = (((u32*)s->ivec)[1] ^= ((u32*)p)[1]);
22 ((u32*)p)[2] = (((u32*)s->ivec)[2] ^= ((u32*)p)[2]);
23 ((u32*)p)[3] = (((u32*)s->ivec)[3] ^= ((u32*)p)[3]);
24 o += 16, p += 16, len -= 16;
25 }
26 s->offset = o;
27}
28
29void
30aesCFBdecrypt(uchar *p, int len, AESstate *s)
31{
32 u32 a, o = s->offset;
33
34 while(len > 0){
35 if(o % 16){
36 Odd:
37 a = *p, *p++ ^= s->ivec[o % 16], s->ivec[o++ % 16] = a, len--;
38 continue;
39 }
40 aes_encrypt(s->ekey, s->rounds, s->ivec, s->ivec);
41 if(len < 16 || ((p-(uchar*)0) & 3) != 0)
42 goto Odd;
43 a = ((u32*)p)[0], ((u32*)p)[0] ^= ((u32*)s->ivec)[0], ((u32*)s->ivec)[0] = a;
44 a = ((u32*)p)[1], ((u32*)p)[1] ^= ((u32*)s->ivec)[1], ((u32*)s->ivec)[1] = a;
45 a = ((u32*)p)[2], ((u32*)p)[2] ^= ((u32*)s->ivec)[2], ((u32*)s->ivec)[2] = a;
46 a = ((u32*)p)[3], ((u32*)p)[3] ^= ((u32*)s->ivec)[3], ((u32*)s->ivec)[3] = a;
47 o += 16, p += 16, len -= 16;
48 }
49 s->offset = o;
50}
libsec/aesOFB.c+28−0
@@ -0,0 +1,28 @@
1#include "os.h"
2#include <libsec.h>
3
4typedef ulong u32;
5
6void
7aesOFBencrypt(uchar *p, int len, AESstate *s)
8{
9 u32 o = s->offset;
10
11 while(len > 0){
12 if(o % 16){
13 Odd:
14 *p++ ^= s->ivec[o++ % 16], len--;
15 continue;
16 }
17 aes_encrypt(s->ekey, s->rounds, s->ivec, s->ivec);
18 if(len < 16 || ((p-(uchar*)0) & 3) != 0)
19 goto Odd;
20 ((u32*)p)[0] ^= ((u32*)s->ivec)[0];
21 ((u32*)p)[1] ^= ((u32*)s->ivec)[1];
22 ((u32*)p)[2] ^= ((u32*)s->ivec)[2];
23 ((u32*)p)[3] ^= ((u32*)s->ivec)[3];
24 o += 16, p += 16, len -= 16;
25 }
26 s->offset = o;
27}
28
libsec/aes_gcm.c+4−3
@@ -150,9 +150,10 @@ setupAESGCMstate(AESGCMstate *s, uchar *key, int keylen, uchar *iv, int ivlen) · 149 unmodified lines
150{150{
151 setupAESstate(&s->a, key, keylen, nil);151 setupAESstate(&s->a, key, keylen, nil);
152 152
153 memset(s->a.mackey, 0, AESbsize);153 memset(s->a.ivec, 0, AESbsize);
154 aes_encrypt(s->a.ekey, s->a.rounds, s->a.mackey, s->a.mackey);154 aes_encrypt(s->a.ekey, s->a.rounds, s->a.ivec, s->a.ivec);
155 load128(s->a.mackey, s->H);155 load128(s->a.ivec, s->H);
156 memset(s->a.ivec, 0, AESbsize);
156 prepareM(s->H, s->M);157 prepareM(s->H, s->M);
157 158
158 if(iv != nil && ivlen > 0)159 if(iv != nil && ivlen > 0)
libsec/aes_xts.c+63−49
@@ -1,69 +1,83 @@
1// Author Taru Karttunen <taruti@taruti.net>
2// This file can be used as both Public Domain or Creative Commons CC0.
3#include "os.h"1#include "os.h"
4#include <libsec.h>2#include <libsec.h>
5 3
6#define AesBlockSize 164/* little-endian data order */
5#define GET4(p) ((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24))
6#define PUT4(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24
7 7
8static void xor128(uchar* o,uchar* i1,uchar* i2) {8static void
9 ((ulong*)o)[0] = ((ulong*)i1)[0] ^ ((ulong*)i2)[0];9gf_mulx(uchar *x)
10 ((ulong*)o)[1] = ((ulong*)i1)[1] ^ ((ulong*)i2)[1];10{
11 ((ulong*)o)[2] = ((ulong*)i1)[2] ^ ((ulong*)i2)[2];11 ulong t0, t1, t2, t3, t4;
12 ((ulong*)o)[3] = ((ulong*)i1)[3] ^ ((ulong*)i2)[3];12
13}13 t0 = GET4(x);
14 t1 = GET4(x+4);
15 t2 = GET4(x+8);
16 t3 = GET4(x+12);
14 17
15static void gf_mulx(uchar* x) {18 t4 = (t3 >> 31);
16 ulong t = ((((ulong*)(x))[3] & 0x80000000u) ? 0x00000087u : 0);;19 t3 = (t3 << 1) | (t2 >> 31);
17 ((ulong*)(x))[3] = (((ulong*)(x))[3] << 1) | (((ulong*)(x))[2] & 0x80000000u ? 1 : 0);20 t2 = (t2 << 1) | (t1 >> 31);
18 ((ulong*)(x))[2] = (((ulong*)(x))[2] << 1) | (((ulong*)(x))[1] & 0x80000000u ? 1 : 0);21 t1 = (t1 << 1) | (t0 >> 31);
19 ((ulong*)(x))[1] = (((ulong*)(x))[1] << 1) | (((ulong*)(x))[0] & 0x80000000u ? 1 : 0);22 t0 = (t0 << 1) ^ (t4*135);
20 ((ulong*)(x))[0] = (((ulong*)(x))[0] << 1) ^ t;
21 23
24 PUT4(x, t0);
25 PUT4(x+4, t1);
26 PUT4(x+8, t2);
27 PUT4(x+12, t3);
22}28}
23 29
24int aes_xts_encrypt(ulong tweak[], ulong ecb[], vlong sectorNumber, uchar *input, uchar *output, ulong len) {30static void
25 uchar T[16], x[16];31xor128(uchar *o, uchar *i1, uchar *i2)
32{
26 int i;33 int i;
27
28 if(len % 16 != 0)
29 return -1;
30 34
31 for(i=0; i<AesBlockSize; i++) {35 for(i=0; i<16; i++)
32 T[i] = (uchar)(sectorNumber & 0xFF);36 o[i] = i1[i] ^ i2[i];
33 sectorNumber = sectorNumber >> 8;37}
34 }
35
36 aes_encrypt(tweak, 10, T, T);
37 38
38 for (i=0; i<len; i+=AesBlockSize) {39static void
39 xor128(&x[0], &input[i], &T[0]);40setupT(AESstate *tweak, uvlong sectorNumber, uchar T[AESbsize])
40 aes_encrypt(ecb, 10, x, x);41{
41 xor128(&output[i], &x[0], &T[0]);42 PUT4(T+0, (ulong)sectorNumber), sectorNumber >>= 32;
42 gf_mulx(&T[0]);43 PUT4(T+4, (ulong)sectorNumber);
43 }44 PUT4(T+8, 0);
44 return 0;45 PUT4(T+12, 0);
46 aes_encrypt(tweak->ekey, tweak->rounds, T, T);
45}47}
46 48
47int aes_xts_decrypt(ulong tweak[], ulong ecb[], vlong sectorNumber, uchar *input, uchar *output, ulong len) {49void
48 uchar T[16], x[16];50aes_xts_encrypt(AESstate *tweak, AESstate *ecb,
49 int i;51 uvlong sectorNumber, uchar *input, uchar *output, ulong len)
52{
53 uchar T[AESbsize], x[AESbsize];
50 54
51 if(len % 16 != 0)55 if(len % AESbsize)
52 return -1;56 abort();
53 57
54 for(i=0; i<AesBlockSize; i++) {58 setupT(tweak, sectorNumber, T);
55 T[i] = (uchar)(sectorNumber & 0xFF);59 for (; len > 0; len -= AESbsize, input += AESbsize, output += AESbsize) {
56 sectorNumber = sectorNumber >> 8;60 xor128(x, input, T);
61 aes_encrypt(ecb->ekey, ecb->rounds, x, x);
62 xor128(output, x, T);
63 gf_mulx(T);
57 }64 }
65}
66
67void
68aes_xts_decrypt(AESstate *tweak, AESstate *ecb,
69 uvlong sectorNumber, uchar *input, uchar *output, ulong len)
70{
71 uchar T[AESbsize], x[AESbsize];
58 72
59 aes_encrypt(tweak, 10, T, T);73 if(len % AESbsize)
74 abort();
60 75
61 for (i=0; i<len; i+=AesBlockSize) {76 setupT(tweak, sectorNumber, T);
62 xor128(&x[0], &input[i], &T[0]);77 for (; len > 0; len -= AESbsize, input += AESbsize, output += AESbsize) {
63 aes_decrypt(ecb, 10, x, x);78 xor128(x, input, T);
64 xor128(&output[i], &x[0], &T[0]);79 aes_decrypt(ecb->dkey, ecb->rounds, x, x);
65 gf_mulx(&T[0]);80 xor128(output, x, T);
81 gf_mulx(T);
66 }82 }
67 return 0;
68}83}
69
libsec/aesni.c+5−0
@@ -0,0 +1,5 @@
1void*
2aesni_init(void)
3{
4 return 0;
5}
libsec/chacha.c+5−34
@@ -10,26 +10,13 @@ and including the changes to block number and nonce defined in RFC7539 · 9 unmodified lines
10#include "os.h"10#include "os.h"
11#include <libsec.h>11#include <libsec.h>
12 12
13enum{13/* from chachablock.$O */
14 Blockwords= ChachaBsize/sizeof(u32int)14extern void _chachablock(u32int x[16], int rounds);
15};
16 15
17/* little-endian data order */16/* little-endian data order */
18#define GET4(p) ((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24))17#define GET4(p) ((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24))
19#define PUT4(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>2418#define PUT4(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24
20 19
21#define ROTATE(v,c) ((u32int)((v) << (c)) | ((v) >> (32 - (c))))
22
23#define QUARTERROUND(ia,ib,ic,id) { \
24 u32int a, b, c, d, t; \
25 a = x[ia]; b = x[ib]; c = x[ic]; d = x[id]; \
26 a += b; t = d^a; d = ROTATE(t,16); \
27 c += d; t = b^c; b = ROTATE(t,12); \
28 a += b; t = d^a; d = ROTATE(t, 8); \
29 c += d; t = b^c; b = ROTATE(t, 7); \
30 x[ia] = a; x[ib] = b; x[ic] = c; x[id] = d; \
31}
32
33#define ENCRYPT(s, x, y, d) {\20#define ENCRYPT(s, x, y, d) {\
34 u32int v; \21 u32int v; \
35 v = GET4(s); \22 v = GET4(s); \
@@ -87,22 +74,6 @@ setupChachastate(Chachastate *s, uchar *key, ulong keylen, uchar *iv, ulong ivle · 51 unmodified lines
87 chacha_setiv(s, iv);74 chacha_setiv(s, iv);
88}75}
89 76
90static void
91dorounds(u32int x[Blockwords], int rounds)
92{
93 for(; rounds > 0; rounds -= 2) {
94 QUARTERROUND(0, 4, 8,12)
95 QUARTERROUND(1, 5, 9,13)
96 QUARTERROUND(2, 6,10,14)
97 QUARTERROUND(3, 7,11,15)
98
99 QUARTERROUND(0, 5,10,15)
100 QUARTERROUND(1, 6,11,12)
101 QUARTERROUND(2, 7, 8,13)
102 QUARTERROUND(3, 4, 9,14)
103 }
104}
105
106static void77static void
107hchachablock(uchar h[32], Chachastate *s)78hchachablock(uchar h[32], Chachastate *s)
108{79{
@@ -125,7 +96,7 @@ hchachablock(uchar h[32], Chachastate *s) · 16 unmodified lines
125 x[14] = s->input[14];96 x[14] = s->input[14];
126 x[15] = s->input[15];97 x[15] = s->input[15];
127 98
128 dorounds(x, s->rounds);99 _chachablock(x, s->rounds);
129 100
130 PUT4(h+0*4, x[0]);101 PUT4(h+0*4, x[0]);
131 PUT4(h+1*4, x[1]);102 PUT4(h+1*4, x[1]);
@@ -183,7 +154,7 @@ chacha_setblock(Chachastate *s, u64int blockno) · 51 unmodified lines
183static void154static void
184encryptblock(Chachastate *s, uchar *src, uchar *dst)155encryptblock(Chachastate *s, uchar *src, uchar *dst)
185{156{
186 u32int x[Blockwords];157 u32int x[16];
187 int i;158 int i;
188 159
189 x[0] = s->input[0];160 x[0] = s->input[0];
@@ -202,7 +173,7 @@ encryptblock(Chachastate *s, uchar *src, uchar *dst) · 12 unmodified lines
202 x[13] = s->input[13];173 x[13] = s->input[13];
203 x[14] = s->input[14];174 x[14] = s->input[14];
204 x[15] = s->input[15];175 x[15] = s->input[15];
205 dorounds(x, s->rounds);176 _chachablock(x, s->rounds);
206 177
207 for(i=0; i<nelem(x); i+=4){178 for(i=0; i<nelem(x); i+=4){
208 ENCRYPT(src, x[i], s->input[i], dst);179 ENCRYPT(src, x[i], s->input[i], dst);
libsec/chachablock.c+29−0
@@ -0,0 +1,29 @@
1#include "os.h"
2
3#define ROTATE(v,c) ((u32int)((v) << (c)) | ((v) >> (32 - (c))))
4
5#define QUARTERROUND(ia,ib,ic,id) { \
6 u32int a, b, c, d, t; \
7 a = x[ia]; b = x[ib]; c = x[ic]; d = x[id]; \
8 a += b; t = d^a; d = ROTATE(t,16); \
9 c += d; t = b^c; b = ROTATE(t,12); \
10 a += b; t = d^a; d = ROTATE(t, 8); \
11 c += d; t = b^c; b = ROTATE(t, 7); \
12 x[ia] = a; x[ib] = b; x[ic] = c; x[id] = d; \
13}
14
15void
16_chachablock(u32int x[16], int rounds)
17{
18 for(; rounds > 0; rounds -= 2) {
19 QUARTERROUND(0, 4, 8,12)
20 QUARTERROUND(1, 5, 9,13)
21 QUARTERROUND(2, 6,10,14)
22 QUARTERROUND(3, 7,11,15)
23
24 QUARTERROUND(0, 5,10,15)
25 QUARTERROUND(1, 6,11,12)
26 QUARTERROUND(2, 7, 8,13)
27 QUARTERROUND(3, 4, 9,14)
28 }
29}
libsec/decodepem.c+4−2
@@ -25,13 +25,15 @@ decodePEM(char *s, char *type, int *len, char **new_s) · 24 unmodified lines
25 t++;25 t++;
26 if(strncmp(tt, "-----BEGIN ", STRLEN("-----BEGIN ")) == 026 if(strncmp(tt, "-----BEGIN ", STRLEN("-----BEGIN ")) == 0
27 && strncmp(&tt[STRLEN("-----BEGIN ")], type, n) == 027 && strncmp(&tt[STRLEN("-----BEGIN ")], type, n) == 0
28 && strncmp(&tt[STRLEN("-----BEGIN ")+n], "-----\n", STRLEN("-----\n")) == 0)28 && strncmp(&tt[STRLEN("-----BEGIN ")+n], "-----", STRLEN("-----")) == 0
29 && strchr("\r\n", tt[STRLEN("-----BEGIN ")+n+STRLEN("-----")]) != nil)
29 break;30 break;
30 }31 }
31 for(tt = t; tt != nil && tt < e; tt++){32 for(tt = t; tt != nil && tt < e; tt++){
32 if(strncmp(tt, "-----END ", STRLEN("-----END ")) == 033 if(strncmp(tt, "-----END ", STRLEN("-----END ")) == 0
33 && strncmp(&tt[STRLEN("-----END ")], type, n) == 034 && strncmp(&tt[STRLEN("-----END ")], type, n) == 0
34 && strncmp(&tt[STRLEN("-----END ")+n], "-----\n", STRLEN("-----\n")) == 0)35 && strncmp(&tt[STRLEN("-----END ")+n], "-----", STRLEN("-----")) == 0
36 && strchr("\r\n", tt[STRLEN("-----END ")+n+STRLEN("-----")]) != nil)
35 break;37 break;
36 tt = strchr(tt, '\n');38 tt = strchr(tt, '\n');
37 if(tt == nil)39 if(tt == nil)
libsec/x509.c+47−16
@@ -1971,15 +1971,15 @@ errret: · 1970 unmodified lines
1971 * publicExponent INTEGER1971 * publicExponent INTEGER
1972 * }1972 * }
1973 */1973 */
1974static RSApub*1974RSApub*
1975decode_rsapubkey(Bytes* a)1975asn1toRSApub(uchar *buf, int len)
1976{1976{
1977 Elem e;1977 Elem e;
1978 Elist *el;1978 Elist *el;
1979 RSApub* key;1979 RSApub* key;
1980 1980
1981 key = nil;1981 key = nil;
1982 if(decode(a->data, a->len, &e) != ASN_OK)1982 if(decode(buf, len, &e) != ASN_OK)
1983 goto errret;1983 goto errret;
1984 if(!is_seq(&e, &el) || elistlen(el) != 2)1984 if(!is_seq(&e, &el) || elistlen(el) != 2)
1985 goto errret;1985 goto errret;
@@ -1997,6 +1997,13 @@ errret: · 11 unmodified lines
1997 freevalfields(&e.val);1997 freevalfields(&e.val);
1998 rsapubfree(key);1998 rsapubfree(key);
1999 return nil;1999 return nil;
2000
2001}
2002
2003static RSApub*
2004decode_rsapubkey(Bytes* a)
2005{
2006 return asn1toRSApub(a->data, a->len);
2000}2007}
2001 2008
2002/*2009/*
@@ -2777,12 +2784,40 @@ splitalts(char *s) · 774 unmodified lines
2777 return nil;2784 return nil;
2778}2785}
2779 2786
2787static Bytes*
2788encode_rsapubkey(RSApub *pk)
2789{
2790 Bytes *b = nil;
2791 Elem e = mkseq(
2792 mkel(mkbigint(pk->n),
2793 mkel(mpsignif(pk->ek)<32 ? mkint(mptoi(pk->ek)) : mkbigint(pk->ek),
2794 nil)));
2795 encode(e, &b);
2796 freevalfields(&e.val);
2797 return b;
2798}
2799
2800int
2801asn1encodeRSApub(RSApub *pk, uchar *buf, int len)
2802{
2803 Bytes *b = encode_rsapubkey(pk);
2804 if(b == nil)
2805 return -1;
2806 if(b->len > len){
2807 freebytes(b);
2808 werrstr("buffer too small");
2809 return -1;
2810 }
2811 memmove(buf, b->data, len = b->len);
2812 freebytes(b);
2813 return len;
2814}
2815
2780uchar*2816uchar*
2781X509rsagen(RSApriv *priv, char *subj, ulong valid[2], int *certlen)2817X509rsagen(RSApriv *priv, char *subj, ulong valid[2], int *certlen)
2782{2818{
2783 int serial = 0, sigalg = ALG_sha256WithRSAEncryption;2819 int serial = 0, sigalg = ALG_sha256WithRSAEncryption;
2784 uchar *cert = nil;2820 uchar *cert = nil;
2785 RSApub *pk = rsaprivtopub(priv);
2786 Bytes *certbytes, *pkbytes, *certinfobytes, *sigbytes;2821 Bytes *certbytes, *pkbytes, *certinfobytes, *sigbytes;
2787 Elem e, certinfo;2822 Elem e, certinfo;
2788 DigestAlg *da;2823 DigestAlg *da;
@@ -2791,14 +2826,12 @@ X509rsagen(RSApriv *priv, char *subj, ulong valid[2], int *certlen) · 2 unmodified lines
2791 mpint *pkcs1;2826 mpint *pkcs1;
2792 char *alts;2827 char *alts;
2793 2828
2829 if((pkbytes = encode_rsapubkey(&priv->pub)) == nil)
2830 return nil;
2831
2794 subj = estrdup(subj);2832 subj = estrdup(subj);
2795 alts = splitalts(subj);2833 alts = splitalts(subj);
2796 2834
2797 e = mkseq(mkel(mkbigint(pk->n),mkel(mkint(mptoi(pk->ek)),nil)));
2798 if(encode(e, &pkbytes) != ASN_OK)
2799 goto errret;
2800 freevalfields(&e.val);
2801
2802 e = mkseq(2835 e = mkseq(
2803 mkel(mkcont(mkint(2), 0),2836 mkel(mkcont(mkint(2), 0),
2804 mkel(mkint(serial),2837 mkel(mkint(serial),
@@ -2826,7 +2859,7 @@ X509rsagen(RSApriv *priv, char *subj, ulong valid[2], int *certlen) · 21 unmodified lines
2826 sigbytes = encode_digest(da, digest);2859 sigbytes = encode_digest(da, digest);
2827 if(sigbytes == nil)2860 if(sigbytes == nil)
2828 goto errret;2861 goto errret;
2829 pkcs1 = pkcs1padbuf(sigbytes->data, sigbytes->len, pk->n, 1);2862 pkcs1 = pkcs1padbuf(sigbytes->data, sigbytes->len, priv->pub.n, 1);
2830 freebytes(sigbytes);2863 freebytes(sigbytes);
2831 if(pkcs1 == nil)2864 if(pkcs1 == nil)
2832 goto errret;2865 goto errret;
@@ -2860,7 +2893,6 @@ X509rsareq(RSApriv *priv, char *subj, int *certlen) · 27 unmodified lines
2860 /* RFC 2314, PKCS #10 Certification Request Syntax */2893 /* RFC 2314, PKCS #10 Certification Request Syntax */
2861 int version = 0, sigalg = ALG_sha256WithRSAEncryption;2894 int version = 0, sigalg = ALG_sha256WithRSAEncryption;
2862 uchar *cert = nil;2895 uchar *cert = nil;
2863 RSApub *pk = rsaprivtopub(priv);
2864 Bytes *certbytes, *pkbytes, *certinfobytes, *sigbytes;2896 Bytes *certbytes, *pkbytes, *certinfobytes, *sigbytes;
2865 Elem e, certinfo;2897 Elem e, certinfo;
2866 DigestAlg *da;2898 DigestAlg *da;
@@ -2869,13 +2901,12 @@ X509rsareq(RSApriv *priv, char *subj, int *certlen) · 2 unmodified lines
2869 mpint *pkcs1;2901 mpint *pkcs1;
2870 char *alts;2902 char *alts;
2871 2903
2904 if((pkbytes = encode_rsapubkey(&priv->pub)) == nil)
2905 return nil;
2906
2872 subj = estrdup(subj);2907 subj = estrdup(subj);
2873 alts = splitalts(subj);2908 alts = splitalts(subj);
2874 2909
2875 e = mkseq(mkel(mkbigint(pk->n),mkel(mkint(mptoi(pk->ek)),nil)));
2876 if(encode(e, &pkbytes) != ASN_OK)
2877 goto errret;
2878 freevalfields(&e.val);
2879 e = mkseq(2910 e = mkseq(
2880 mkel(mkint(version),2911 mkel(mkint(version),
2881 mkel(mkDN(subj),2912 mkel(mkDN(subj),
@@ -2895,7 +2926,7 @@ X509rsareq(RSApriv *priv, char *subj, int *certlen) · 13 unmodified lines
2895 sigbytes = encode_digest(da, digest);2926 sigbytes = encode_digest(da, digest);
2896 if(sigbytes == nil)2927 if(sigbytes == nil)
2897 goto errret;2928 goto errret;
2898 pkcs1 = pkcs1padbuf(sigbytes->data, sigbytes->len, pk->n, 1);2929 pkcs1 = pkcs1padbuf(sigbytes->data, sigbytes->len, priv->pub.n, 1);
2899 freebytes(sigbytes);2930 freebytes(sigbytes);
2900 if(pkcs1 == nil)2931 if(pkcs1 == nil)
2901 goto errret;2932 goto errret;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t