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