File Coverage

inc/matrixssl-3-9-3-open/crypto/symmetric/aes.c
Criterion Covered Total %
statement 282 307 91.8
branch 10 12 83.3
condition n/a
subroutine n/a
pod n/a
total 292 319 91.5


line stmt bran cond sub pod time code
1             /**
2             * @file aes.c
3             * @version 950bba4 (HEAD -> master)
4             *
5             * AES block cipher implementation.
6             */
7             /*
8             * Copyright (c) 2013-2017 INSIDE Secure Corporation
9             * Copyright (c) PeerSec Networks, 2002-2011
10             * All Rights Reserved
11             *
12             * The latest version of this code is available at http://www.matrixssl.org
13             *
14             * This software is open source; you can redistribute it and/or modify
15             * it under the terms of the GNU General Public License as published by
16             * the Free Software Foundation; either version 2 of the License, or
17             * (at your option) any later version.
18             *
19             * This General Public License does NOT permit incorporating this software
20             * into proprietary programs. If you are unable to comply with the GPL, a
21             * commercial license for this software may be purchased from INSIDE at
22             * http://www.insidesecure.com/
23             *
24             * This program is distributed in WITHOUT ANY WARRANTY; without even the
25             * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
26             * See the GNU General Public License for more details.
27             *
28             * You should have received a copy of the GNU General Public License
29             * along with this program; if not, write to the Free Software
30             * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
31             * http://www.gnu.org/copyleft/gpl.html
32             */
33             /******************************************************************************/
34              
35             #include "../cryptoImpl.h"
36              
37             #ifdef USE_MATRIX_AES_BLOCK
38              
39             /******************************************************************************/
40              
41             __inline static void invertKeySchedule(psAesKey_t *key);
42             static uint32 setup_mix(uint32 temp);
43              
44             static const uint32 rcon[] = {
45             0x01000000UL, 0x02000000UL, 0x04000000UL, 0x08000000UL,
46             0x10000000UL, 0x20000000UL, 0x40000000UL, 0x80000000UL,
47             0x1B000000UL, 0x36000000UL
48             /* for 128-bit blocks, AES never uses more than 10 rcon values */
49             };
50              
51             # define byte(x, n) (((x) >> (8 * (n))) & 255)
52              
53             /******************************************************************************/
54             /**
55             Initialize the key schedule of an AES (Rijndael) block cipher.
56             The initilaized key can be used only for encrypt or decrypt.
57             If the same key bytes need to be used for both, two psAesKey_t structures
58             should be initialized.
59              
60             @param[in,out] key Pointer to an allocated key structure to be initialized.
61             @param[in] ckey The symmetric key as bytes.
62             @param[in] keylen The number of bytes in 'ckey'.
63             @param[in] flags PS_AES_ENCRYPT or PS_AES_DECRYPT.
64             @return PS_SUCCESS on success, < 0 on failure.
65              
66             @security psAesClearBlockKey() should be called as soon as the key is no
67             longer needed.
68             @security If 'ckey' is no longer needed after this api call, it should be
69             cleared.
70             */
71 4238           int32_t psAesInitBlockKey(psAesKey_t *key,
72             const unsigned char ckey[AES_MAXKEYLEN], uint8_t keylen,
73             uint32_t flags)
74             {
75             int i;
76             uint32 temp, *rk;
77              
78             # ifdef CRYPTO_ASSERT
79             if (ckey == NULL || key == NULL ||
80             !(flags & (PS_AES_ENCRYPT | PS_AES_DECRYPT)))
81             {
82              
83             psTraceCrypto("Bad args to psAesInitBlockKey\n");
84             return PS_ARG_FAIL;
85             }
86             if (keylen != AES128_KEYLEN && keylen != AES192_KEYLEN &&
87             keylen != AES256_KEYLEN)
88             {
89             psTraceCrypto("Invalid AES key length\n");
90             return PS_ARG_FAIL;
91             }
92             # endif
93             /*
94             Setup the forward (encrypt) key schedule. If flags & PS_AES_DECRYPT we
95             will calculate the inverse (decrypt) key schedule from this forward
96             schedule and replace it.
97             */
98 4238           i = 0;
99 4238           rk = key->skey;
100 4238           LOAD32H(rk[0], ckey );
101 4238           LOAD32H(rk[1], ckey + 4);
102 4238           LOAD32H(rk[2], ckey + 8);
103 4238           LOAD32H(rk[3], ckey + 12);
104 4238           switch (keylen)
105             {
106             case 16:
107 2           key->rounds = 10;
108             for (;; )
109             {
110 20           temp = rk[3];
111 20           rk[4] = rk[0] ^ setup_mix(temp) ^ rcon[i];
112 20           rk[5] = rk[1] ^ rk[4];
113 20           rk[6] = rk[2] ^ rk[5];
114 20           rk[7] = rk[3] ^ rk[6];
115 20 100         if (++i == 10)
116             {
117 2           break;
118             }
119 18           rk += 4;
120 18           }
121 2           break;
122              
123             case 24:
124 0           key->rounds = 12;
125 0           LOAD32H(rk[4], ckey + 16);
126 0           LOAD32H(rk[5], ckey + 20);
127             for (;; )
128             {
129             # ifdef _MSC_VER
130             temp = key->skey[rk - key->skey + 5];
131             # else
132 0           temp = rk[5];
133             # endif /* _MSC_VER */
134 0           rk[ 6] = rk[ 0] ^ setup_mix(temp) ^ rcon[i];
135 0           rk[ 7] = rk[ 1] ^ rk[ 6];
136 0           rk[ 8] = rk[ 2] ^ rk[ 7];
137 0           rk[ 9] = rk[ 3] ^ rk[ 8];
138 0 0         if (++i == 8)
139             {
140 0           break;
141             }
142 0           rk[10] = rk[ 4] ^ rk[ 9];
143 0           rk[11] = rk[ 5] ^ rk[10];
144 0           rk += 6;
145 0           }
146 0           break;
147              
148             case 32:
149 4236           key->rounds = 14;
150 4236           LOAD32H(rk[4], ckey + 16);
151 4236           LOAD32H(rk[5], ckey + 20);
152 4236           LOAD32H(rk[6], ckey + 24);
153 4236           LOAD32H(rk[7], ckey + 28);
154             for (;; )
155             {
156             # ifdef _MSC_VER
157             temp = key->skey[rk - key->skey + 7];
158             # else
159 29652           temp = rk[7];
160             # endif /* _MSC_VER */
161 29652           rk[ 8] = rk[ 0] ^ setup_mix(temp) ^ rcon[i];
162 29652           rk[ 9] = rk[ 1] ^ rk[ 8];
163 29652           rk[10] = rk[ 2] ^ rk[ 9];
164 29652           rk[11] = rk[ 3] ^ rk[10];
165 29652 100         if (++i == 7)
166             {
167 4236           break;
168             }
169 25416           temp = rk[11];
170 25416           rk[12] = rk[ 4] ^ setup_mix(ROR(temp, 8));
171 25416           rk[13] = rk[ 5] ^ rk[12];
172 25416           rk[14] = rk[ 6] ^ rk[13];
173 25416           rk[15] = rk[ 7] ^ rk[14];
174 25416           rk += 8;
175 25416           }
176 4236           break;
177              
178             default:
179             psTraceCrypto("Invalid AES key length\n");
180 0           return CRYPT_INVALID_KEYSIZE;
181             }
182              
183 4238           switch (flags)
184             {
185              
186             case PS_AES_ENCRYPT:
187 4236           key->type = PS_AES_ENCRYPT;
188 4236           break;
189              
190             case PS_AES_DECRYPT:
191 2           key->type = PS_AES_DECRYPT;
192             /* Replace the key schedule with the inverse key schedule */
193 2           invertKeySchedule(key);
194 2           break;
195              
196             default:
197 0           return PS_ARG_FAIL;
198             }
199              
200 4238           return PS_SUCCESS;
201             }
202              
203             /******************************************************************************/
204              
205 0           void psAesClearBlockKey(psAesKey_t *key)
206             {
207 0           memset_s(key, sizeof(psAesKey_t), 0x0, sizeof(psAesKey_t));
208 0           }
209              
210             /******************************************************************************/
211             /*
212             AES constants
213             */
214              
215             /* The precomputed tables for AES */
216             /*
217             Te0[x] = S [x].[02, 01, 01, 03];
218             Te1[x] = S [x].[03, 02, 01, 01];
219             Te2[x] = S [x].[01, 03, 02, 01];
220             Te3[x] = S [x].[01, 01, 03, 02];
221             Te4[x] = S [x].[01, 01, 01, 01];
222              
223             Td0[x] = Si[x].[0e, 09, 0d, 0b];
224             Td1[x] = Si[x].[0b, 0e, 09, 0d];
225             Td2[x] = Si[x].[0d, 0b, 0e, 09];
226             Td3[x] = Si[x].[09, 0d, 0b, 0e];
227             Td4[x] = Si[x].[01, 01, 01, 01];
228             */
229              
230             static const uint32 TE0[] = {
231             0xc66363a5UL, 0xf87c7c84UL, 0xee777799UL, 0xf67b7b8dUL,
232             0xfff2f20dUL, 0xd66b6bbdUL, 0xde6f6fb1UL, 0x91c5c554UL,
233             0x60303050UL, 0x02010103UL, 0xce6767a9UL, 0x562b2b7dUL,
234             0xe7fefe19UL, 0xb5d7d762UL, 0x4dababe6UL, 0xec76769aUL,
235             0x8fcaca45UL, 0x1f82829dUL, 0x89c9c940UL, 0xfa7d7d87UL,
236             0xeffafa15UL, 0xb25959ebUL, 0x8e4747c9UL, 0xfbf0f00bUL,
237             0x41adadecUL, 0xb3d4d467UL, 0x5fa2a2fdUL, 0x45afafeaUL,
238             0x239c9cbfUL, 0x53a4a4f7UL, 0xe4727296UL, 0x9bc0c05bUL,
239             0x75b7b7c2UL, 0xe1fdfd1cUL, 0x3d9393aeUL, 0x4c26266aUL,
240             0x6c36365aUL, 0x7e3f3f41UL, 0xf5f7f702UL, 0x83cccc4fUL,
241             0x6834345cUL, 0x51a5a5f4UL, 0xd1e5e534UL, 0xf9f1f108UL,
242             0xe2717193UL, 0xabd8d873UL, 0x62313153UL, 0x2a15153fUL,
243             0x0804040cUL, 0x95c7c752UL, 0x46232365UL, 0x9dc3c35eUL,
244             0x30181828UL, 0x379696a1UL, 0x0a05050fUL, 0x2f9a9ab5UL,
245             0x0e070709UL, 0x24121236UL, 0x1b80809bUL, 0xdfe2e23dUL,
246             0xcdebeb26UL, 0x4e272769UL, 0x7fb2b2cdUL, 0xea75759fUL,
247             0x1209091bUL, 0x1d83839eUL, 0x582c2c74UL, 0x341a1a2eUL,
248             0x361b1b2dUL, 0xdc6e6eb2UL, 0xb45a5aeeUL, 0x5ba0a0fbUL,
249             0xa45252f6UL, 0x763b3b4dUL, 0xb7d6d661UL, 0x7db3b3ceUL,
250             0x5229297bUL, 0xdde3e33eUL, 0x5e2f2f71UL, 0x13848497UL,
251             0xa65353f5UL, 0xb9d1d168UL, 0x00000000UL, 0xc1eded2cUL,
252             0x40202060UL, 0xe3fcfc1fUL, 0x79b1b1c8UL, 0xb65b5bedUL,
253             0xd46a6abeUL, 0x8dcbcb46UL, 0x67bebed9UL, 0x7239394bUL,
254             0x944a4adeUL, 0x984c4cd4UL, 0xb05858e8UL, 0x85cfcf4aUL,
255             0xbbd0d06bUL, 0xc5efef2aUL, 0x4faaaae5UL, 0xedfbfb16UL,
256             0x864343c5UL, 0x9a4d4dd7UL, 0x66333355UL, 0x11858594UL,
257             0x8a4545cfUL, 0xe9f9f910UL, 0x04020206UL, 0xfe7f7f81UL,
258             0xa05050f0UL, 0x783c3c44UL, 0x259f9fbaUL, 0x4ba8a8e3UL,
259             0xa25151f3UL, 0x5da3a3feUL, 0x804040c0UL, 0x058f8f8aUL,
260             0x3f9292adUL, 0x219d9dbcUL, 0x70383848UL, 0xf1f5f504UL,
261             0x63bcbcdfUL, 0x77b6b6c1UL, 0xafdada75UL, 0x42212163UL,
262             0x20101030UL, 0xe5ffff1aUL, 0xfdf3f30eUL, 0xbfd2d26dUL,
263             0x81cdcd4cUL, 0x180c0c14UL, 0x26131335UL, 0xc3ecec2fUL,
264             0xbe5f5fe1UL, 0x359797a2UL, 0x884444ccUL, 0x2e171739UL,
265             0x93c4c457UL, 0x55a7a7f2UL, 0xfc7e7e82UL, 0x7a3d3d47UL,
266             0xc86464acUL, 0xba5d5de7UL, 0x3219192bUL, 0xe6737395UL,
267             0xc06060a0UL, 0x19818198UL, 0x9e4f4fd1UL, 0xa3dcdc7fUL,
268             0x44222266UL, 0x542a2a7eUL, 0x3b9090abUL, 0x0b888883UL,
269             0x8c4646caUL, 0xc7eeee29UL, 0x6bb8b8d3UL, 0x2814143cUL,
270             0xa7dede79UL, 0xbc5e5ee2UL, 0x160b0b1dUL, 0xaddbdb76UL,
271             0xdbe0e03bUL, 0x64323256UL, 0x743a3a4eUL, 0x140a0a1eUL,
272             0x924949dbUL, 0x0c06060aUL, 0x4824246cUL, 0xb85c5ce4UL,
273             0x9fc2c25dUL, 0xbdd3d36eUL, 0x43acacefUL, 0xc46262a6UL,
274             0x399191a8UL, 0x319595a4UL, 0xd3e4e437UL, 0xf279798bUL,
275             0xd5e7e732UL, 0x8bc8c843UL, 0x6e373759UL, 0xda6d6db7UL,
276             0x018d8d8cUL, 0xb1d5d564UL, 0x9c4e4ed2UL, 0x49a9a9e0UL,
277             0xd86c6cb4UL, 0xac5656faUL, 0xf3f4f407UL, 0xcfeaea25UL,
278             0xca6565afUL, 0xf47a7a8eUL, 0x47aeaee9UL, 0x10080818UL,
279             0x6fbabad5UL, 0xf0787888UL, 0x4a25256fUL, 0x5c2e2e72UL,
280             0x381c1c24UL, 0x57a6a6f1UL, 0x73b4b4c7UL, 0x97c6c651UL,
281             0xcbe8e823UL, 0xa1dddd7cUL, 0xe874749cUL, 0x3e1f1f21UL,
282             0x964b4bddUL, 0x61bdbddcUL, 0x0d8b8b86UL, 0x0f8a8a85UL,
283             0xe0707090UL, 0x7c3e3e42UL, 0x71b5b5c4UL, 0xcc6666aaUL,
284             0x904848d8UL, 0x06030305UL, 0xf7f6f601UL, 0x1c0e0e12UL,
285             0xc26161a3UL, 0x6a35355fUL, 0xae5757f9UL, 0x69b9b9d0UL,
286             0x17868691UL, 0x99c1c158UL, 0x3a1d1d27UL, 0x279e9eb9UL,
287             0xd9e1e138UL, 0xebf8f813UL, 0x2b9898b3UL, 0x22111133UL,
288             0xd26969bbUL, 0xa9d9d970UL, 0x078e8e89UL, 0x339494a7UL,
289             0x2d9b9bb6UL, 0x3c1e1e22UL, 0x15878792UL, 0xc9e9e920UL,
290             0x87cece49UL, 0xaa5555ffUL, 0x50282878UL, 0xa5dfdf7aUL,
291             0x038c8c8fUL, 0x59a1a1f8UL, 0x09898980UL, 0x1a0d0d17UL,
292             0x65bfbfdaUL, 0xd7e6e631UL, 0x844242c6UL, 0xd06868b8UL,
293             0x824141c3UL, 0x299999b0UL, 0x5a2d2d77UL, 0x1e0f0f11UL,
294             0x7bb0b0cbUL, 0xa85454fcUL, 0x6dbbbbd6UL, 0x2c16163aUL,
295             };
296              
297             # ifndef PS_AES_IMPROVE_PERF_INCREASE_CODESIZE
298             static const uint32 Te4[] = {
299             0x63636363UL, 0x7c7c7c7cUL, 0x77777777UL, 0x7b7b7b7bUL,
300             0xf2f2f2f2UL, 0x6b6b6b6bUL, 0x6f6f6f6fUL, 0xc5c5c5c5UL,
301             0x30303030UL, 0x01010101UL, 0x67676767UL, 0x2b2b2b2bUL,
302             0xfefefefeUL, 0xd7d7d7d7UL, 0xababababUL, 0x76767676UL,
303             0xcacacacaUL, 0x82828282UL, 0xc9c9c9c9UL, 0x7d7d7d7dUL,
304             0xfafafafaUL, 0x59595959UL, 0x47474747UL, 0xf0f0f0f0UL,
305             0xadadadadUL, 0xd4d4d4d4UL, 0xa2a2a2a2UL, 0xafafafafUL,
306             0x9c9c9c9cUL, 0xa4a4a4a4UL, 0x72727272UL, 0xc0c0c0c0UL,
307             0xb7b7b7b7UL, 0xfdfdfdfdUL, 0x93939393UL, 0x26262626UL,
308             0x36363636UL, 0x3f3f3f3fUL, 0xf7f7f7f7UL, 0xccccccccUL,
309             0x34343434UL, 0xa5a5a5a5UL, 0xe5e5e5e5UL, 0xf1f1f1f1UL,
310             0x71717171UL, 0xd8d8d8d8UL, 0x31313131UL, 0x15151515UL,
311             0x04040404UL, 0xc7c7c7c7UL, 0x23232323UL, 0xc3c3c3c3UL,
312             0x18181818UL, 0x96969696UL, 0x05050505UL, 0x9a9a9a9aUL,
313             0x07070707UL, 0x12121212UL, 0x80808080UL, 0xe2e2e2e2UL,
314             0xebebebebUL, 0x27272727UL, 0xb2b2b2b2UL, 0x75757575UL,
315             0x09090909UL, 0x83838383UL, 0x2c2c2c2cUL, 0x1a1a1a1aUL,
316             0x1b1b1b1bUL, 0x6e6e6e6eUL, 0x5a5a5a5aUL, 0xa0a0a0a0UL,
317             0x52525252UL, 0x3b3b3b3bUL, 0xd6d6d6d6UL, 0xb3b3b3b3UL,
318             0x29292929UL, 0xe3e3e3e3UL, 0x2f2f2f2fUL, 0x84848484UL,
319             0x53535353UL, 0xd1d1d1d1UL, 0x00000000UL, 0xededededUL,
320             0x20202020UL, 0xfcfcfcfcUL, 0xb1b1b1b1UL, 0x5b5b5b5bUL,
321             0x6a6a6a6aUL, 0xcbcbcbcbUL, 0xbebebebeUL, 0x39393939UL,
322             0x4a4a4a4aUL, 0x4c4c4c4cUL, 0x58585858UL, 0xcfcfcfcfUL,
323             0xd0d0d0d0UL, 0xefefefefUL, 0xaaaaaaaaUL, 0xfbfbfbfbUL,
324             0x43434343UL, 0x4d4d4d4dUL, 0x33333333UL, 0x85858585UL,
325             0x45454545UL, 0xf9f9f9f9UL, 0x02020202UL, 0x7f7f7f7fUL,
326             0x50505050UL, 0x3c3c3c3cUL, 0x9f9f9f9fUL, 0xa8a8a8a8UL,
327             0x51515151UL, 0xa3a3a3a3UL, 0x40404040UL, 0x8f8f8f8fUL,
328             0x92929292UL, 0x9d9d9d9dUL, 0x38383838UL, 0xf5f5f5f5UL,
329             0xbcbcbcbcUL, 0xb6b6b6b6UL, 0xdadadadaUL, 0x21212121UL,
330             0x10101010UL, 0xffffffffUL, 0xf3f3f3f3UL, 0xd2d2d2d2UL,
331             0xcdcdcdcdUL, 0x0c0c0c0cUL, 0x13131313UL, 0xececececUL,
332             0x5f5f5f5fUL, 0x97979797UL, 0x44444444UL, 0x17171717UL,
333             0xc4c4c4c4UL, 0xa7a7a7a7UL, 0x7e7e7e7eUL, 0x3d3d3d3dUL,
334             0x64646464UL, 0x5d5d5d5dUL, 0x19191919UL, 0x73737373UL,
335             0x60606060UL, 0x81818181UL, 0x4f4f4f4fUL, 0xdcdcdcdcUL,
336             0x22222222UL, 0x2a2a2a2aUL, 0x90909090UL, 0x88888888UL,
337             0x46464646UL, 0xeeeeeeeeUL, 0xb8b8b8b8UL, 0x14141414UL,
338             0xdedededeUL, 0x5e5e5e5eUL, 0x0b0b0b0bUL, 0xdbdbdbdbUL,
339             0xe0e0e0e0UL, 0x32323232UL, 0x3a3a3a3aUL, 0x0a0a0a0aUL,
340             0x49494949UL, 0x06060606UL, 0x24242424UL, 0x5c5c5c5cUL,
341             0xc2c2c2c2UL, 0xd3d3d3d3UL, 0xacacacacUL, 0x62626262UL,
342             0x91919191UL, 0x95959595UL, 0xe4e4e4e4UL, 0x79797979UL,
343             0xe7e7e7e7UL, 0xc8c8c8c8UL, 0x37373737UL, 0x6d6d6d6dUL,
344             0x8d8d8d8dUL, 0xd5d5d5d5UL, 0x4e4e4e4eUL, 0xa9a9a9a9UL,
345             0x6c6c6c6cUL, 0x56565656UL, 0xf4f4f4f4UL, 0xeaeaeaeaUL,
346             0x65656565UL, 0x7a7a7a7aUL, 0xaeaeaeaeUL, 0x08080808UL,
347             0xbabababaUL, 0x78787878UL, 0x25252525UL, 0x2e2e2e2eUL,
348             0x1c1c1c1cUL, 0xa6a6a6a6UL, 0xb4b4b4b4UL, 0xc6c6c6c6UL,
349             0xe8e8e8e8UL, 0xddddddddUL, 0x74747474UL, 0x1f1f1f1fUL,
350             0x4b4b4b4bUL, 0xbdbdbdbdUL, 0x8b8b8b8bUL, 0x8a8a8a8aUL,
351             0x70707070UL, 0x3e3e3e3eUL, 0xb5b5b5b5UL, 0x66666666UL,
352             0x48484848UL, 0x03030303UL, 0xf6f6f6f6UL, 0x0e0e0e0eUL,
353             0x61616161UL, 0x35353535UL, 0x57575757UL, 0xb9b9b9b9UL,
354             0x86868686UL, 0xc1c1c1c1UL, 0x1d1d1d1dUL, 0x9e9e9e9eUL,
355             0xe1e1e1e1UL, 0xf8f8f8f8UL, 0x98989898UL, 0x11111111UL,
356             0x69696969UL, 0xd9d9d9d9UL, 0x8e8e8e8eUL, 0x94949494UL,
357             0x9b9b9b9bUL, 0x1e1e1e1eUL, 0x87878787UL, 0xe9e9e9e9UL,
358             0xcecececeUL, 0x55555555UL, 0x28282828UL, 0xdfdfdfdfUL,
359             0x8c8c8c8cUL, 0xa1a1a1a1UL, 0x89898989UL, 0x0d0d0d0dUL,
360             0xbfbfbfbfUL, 0xe6e6e6e6UL, 0x42424242UL, 0x68686868UL,
361             0x41414141UL, 0x99999999UL, 0x2d2d2d2dUL, 0x0f0f0f0fUL,
362             0xb0b0b0b0UL, 0x54545454UL, 0xbbbbbbbbUL, 0x16161616UL,
363             };
364             # endif /* PS_AES_IMPROVE_PERF_INCREASE_CODESIZE */
365              
366             static const uint32 TD0[] = {
367             0x51f4a750UL, 0x7e416553UL, 0x1a17a4c3UL, 0x3a275e96UL,
368             0x3bab6bcbUL, 0x1f9d45f1UL, 0xacfa58abUL, 0x4be30393UL,
369             0x2030fa55UL, 0xad766df6UL, 0x88cc7691UL, 0xf5024c25UL,
370             0x4fe5d7fcUL, 0xc52acbd7UL, 0x26354480UL, 0xb562a38fUL,
371             0xdeb15a49UL, 0x25ba1b67UL, 0x45ea0e98UL, 0x5dfec0e1UL,
372             0xc32f7502UL, 0x814cf012UL, 0x8d4697a3UL, 0x6bd3f9c6UL,
373             0x038f5fe7UL, 0x15929c95UL, 0xbf6d7aebUL, 0x955259daUL,
374             0xd4be832dUL, 0x587421d3UL, 0x49e06929UL, 0x8ec9c844UL,
375             0x75c2896aUL, 0xf48e7978UL, 0x99583e6bUL, 0x27b971ddUL,
376             0xbee14fb6UL, 0xf088ad17UL, 0xc920ac66UL, 0x7dce3ab4UL,
377             0x63df4a18UL, 0xe51a3182UL, 0x97513360UL, 0x62537f45UL,
378             0xb16477e0UL, 0xbb6bae84UL, 0xfe81a01cUL, 0xf9082b94UL,
379             0x70486858UL, 0x8f45fd19UL, 0x94de6c87UL, 0x527bf8b7UL,
380             0xab73d323UL, 0x724b02e2UL, 0xe31f8f57UL, 0x6655ab2aUL,
381             0xb2eb2807UL, 0x2fb5c203UL, 0x86c57b9aUL, 0xd33708a5UL,
382             0x302887f2UL, 0x23bfa5b2UL, 0x02036abaUL, 0xed16825cUL,
383             0x8acf1c2bUL, 0xa779b492UL, 0xf307f2f0UL, 0x4e69e2a1UL,
384             0x65daf4cdUL, 0x0605bed5UL, 0xd134621fUL, 0xc4a6fe8aUL,
385             0x342e539dUL, 0xa2f355a0UL, 0x058ae132UL, 0xa4f6eb75UL,
386             0x0b83ec39UL, 0x4060efaaUL, 0x5e719f06UL, 0xbd6e1051UL,
387             0x3e218af9UL, 0x96dd063dUL, 0xdd3e05aeUL, 0x4de6bd46UL,
388             0x91548db5UL, 0x71c45d05UL, 0x0406d46fUL, 0x605015ffUL,
389             0x1998fb24UL, 0xd6bde997UL, 0x894043ccUL, 0x67d99e77UL,
390             0xb0e842bdUL, 0x07898b88UL, 0xe7195b38UL, 0x79c8eedbUL,
391             0xa17c0a47UL, 0x7c420fe9UL, 0xf8841ec9UL, 0x00000000UL,
392             0x09808683UL, 0x322bed48UL, 0x1e1170acUL, 0x6c5a724eUL,
393             0xfd0efffbUL, 0x0f853856UL, 0x3daed51eUL, 0x362d3927UL,
394             0x0a0fd964UL, 0x685ca621UL, 0x9b5b54d1UL, 0x24362e3aUL,
395             0x0c0a67b1UL, 0x9357e70fUL, 0xb4ee96d2UL, 0x1b9b919eUL,
396             0x80c0c54fUL, 0x61dc20a2UL, 0x5a774b69UL, 0x1c121a16UL,
397             0xe293ba0aUL, 0xc0a02ae5UL, 0x3c22e043UL, 0x121b171dUL,
398             0x0e090d0bUL, 0xf28bc7adUL, 0x2db6a8b9UL, 0x141ea9c8UL,
399             0x57f11985UL, 0xaf75074cUL, 0xee99ddbbUL, 0xa37f60fdUL,
400             0xf701269fUL, 0x5c72f5bcUL, 0x44663bc5UL, 0x5bfb7e34UL,
401             0x8b432976UL, 0xcb23c6dcUL, 0xb6edfc68UL, 0xb8e4f163UL,
402             0xd731dccaUL, 0x42638510UL, 0x13972240UL, 0x84c61120UL,
403             0x854a247dUL, 0xd2bb3df8UL, 0xaef93211UL, 0xc729a16dUL,
404             0x1d9e2f4bUL, 0xdcb230f3UL, 0x0d8652ecUL, 0x77c1e3d0UL,
405             0x2bb3166cUL, 0xa970b999UL, 0x119448faUL, 0x47e96422UL,
406             0xa8fc8cc4UL, 0xa0f03f1aUL, 0x567d2cd8UL, 0x223390efUL,
407             0x87494ec7UL, 0xd938d1c1UL, 0x8ccaa2feUL, 0x98d40b36UL,
408             0xa6f581cfUL, 0xa57ade28UL, 0xdab78e26UL, 0x3fadbfa4UL,
409             0x2c3a9de4UL, 0x5078920dUL, 0x6a5fcc9bUL, 0x547e4662UL,
410             0xf68d13c2UL, 0x90d8b8e8UL, 0x2e39f75eUL, 0x82c3aff5UL,
411             0x9f5d80beUL, 0x69d0937cUL, 0x6fd52da9UL, 0xcf2512b3UL,
412             0xc8ac993bUL, 0x10187da7UL, 0xe89c636eUL, 0xdb3bbb7bUL,
413             0xcd267809UL, 0x6e5918f4UL, 0xec9ab701UL, 0x834f9aa8UL,
414             0xe6956e65UL, 0xaaffe67eUL, 0x21bccf08UL, 0xef15e8e6UL,
415             0xbae79bd9UL, 0x4a6f36ceUL, 0xea9f09d4UL, 0x29b07cd6UL,
416             0x31a4b2afUL, 0x2a3f2331UL, 0xc6a59430UL, 0x35a266c0UL,
417             0x744ebc37UL, 0xfc82caa6UL, 0xe090d0b0UL, 0x33a7d815UL,
418             0xf104984aUL, 0x41ecdaf7UL, 0x7fcd500eUL, 0x1791f62fUL,
419             0x764dd68dUL, 0x43efb04dUL, 0xccaa4d54UL, 0xe49604dfUL,
420             0x9ed1b5e3UL, 0x4c6a881bUL, 0xc12c1fb8UL, 0x4665517fUL,
421             0x9d5eea04UL, 0x018c355dUL, 0xfa877473UL, 0xfb0b412eUL,
422             0xb3671d5aUL, 0x92dbd252UL, 0xe9105633UL, 0x6dd64713UL,
423             0x9ad7618cUL, 0x37a10c7aUL, 0x59f8148eUL, 0xeb133c89UL,
424             0xcea927eeUL, 0xb761c935UL, 0xe11ce5edUL, 0x7a47b13cUL,
425             0x9cd2df59UL, 0x55f2733fUL, 0x1814ce79UL, 0x73c737bfUL,
426             0x53f7cdeaUL, 0x5ffdaa5bUL, 0xdf3d6f14UL, 0x7844db86UL,
427             0xcaaff381UL, 0xb968c43eUL, 0x3824342cUL, 0xc2a3405fUL,
428             0x161dc372UL, 0xbce2250cUL, 0x283c498bUL, 0xff0d9541UL,
429             0x39a80171UL, 0x080cb3deUL, 0xd8b4e49cUL, 0x6456c190UL,
430             0x7bcb8461UL, 0xd532b670UL, 0x486c5c74UL, 0xd0b85742UL,
431             };
432              
433             static const uint32 Td4[] = {
434             0x52525252UL, 0x09090909UL, 0x6a6a6a6aUL, 0xd5d5d5d5UL,
435             0x30303030UL, 0x36363636UL, 0xa5a5a5a5UL, 0x38383838UL,
436             0xbfbfbfbfUL, 0x40404040UL, 0xa3a3a3a3UL, 0x9e9e9e9eUL,
437             0x81818181UL, 0xf3f3f3f3UL, 0xd7d7d7d7UL, 0xfbfbfbfbUL,
438             0x7c7c7c7cUL, 0xe3e3e3e3UL, 0x39393939UL, 0x82828282UL,
439             0x9b9b9b9bUL, 0x2f2f2f2fUL, 0xffffffffUL, 0x87878787UL,
440             0x34343434UL, 0x8e8e8e8eUL, 0x43434343UL, 0x44444444UL,
441             0xc4c4c4c4UL, 0xdedededeUL, 0xe9e9e9e9UL, 0xcbcbcbcbUL,
442             0x54545454UL, 0x7b7b7b7bUL, 0x94949494UL, 0x32323232UL,
443             0xa6a6a6a6UL, 0xc2c2c2c2UL, 0x23232323UL, 0x3d3d3d3dUL,
444             0xeeeeeeeeUL, 0x4c4c4c4cUL, 0x95959595UL, 0x0b0b0b0bUL,
445             0x42424242UL, 0xfafafafaUL, 0xc3c3c3c3UL, 0x4e4e4e4eUL,
446             0x08080808UL, 0x2e2e2e2eUL, 0xa1a1a1a1UL, 0x66666666UL,
447             0x28282828UL, 0xd9d9d9d9UL, 0x24242424UL, 0xb2b2b2b2UL,
448             0x76767676UL, 0x5b5b5b5bUL, 0xa2a2a2a2UL, 0x49494949UL,
449             0x6d6d6d6dUL, 0x8b8b8b8bUL, 0xd1d1d1d1UL, 0x25252525UL,
450             0x72727272UL, 0xf8f8f8f8UL, 0xf6f6f6f6UL, 0x64646464UL,
451             0x86868686UL, 0x68686868UL, 0x98989898UL, 0x16161616UL,
452             0xd4d4d4d4UL, 0xa4a4a4a4UL, 0x5c5c5c5cUL, 0xccccccccUL,
453             0x5d5d5d5dUL, 0x65656565UL, 0xb6b6b6b6UL, 0x92929292UL,
454             0x6c6c6c6cUL, 0x70707070UL, 0x48484848UL, 0x50505050UL,
455             0xfdfdfdfdUL, 0xededededUL, 0xb9b9b9b9UL, 0xdadadadaUL,
456             0x5e5e5e5eUL, 0x15151515UL, 0x46464646UL, 0x57575757UL,
457             0xa7a7a7a7UL, 0x8d8d8d8dUL, 0x9d9d9d9dUL, 0x84848484UL,
458             0x90909090UL, 0xd8d8d8d8UL, 0xababababUL, 0x00000000UL,
459             0x8c8c8c8cUL, 0xbcbcbcbcUL, 0xd3d3d3d3UL, 0x0a0a0a0aUL,
460             0xf7f7f7f7UL, 0xe4e4e4e4UL, 0x58585858UL, 0x05050505UL,
461             0xb8b8b8b8UL, 0xb3b3b3b3UL, 0x45454545UL, 0x06060606UL,
462             0xd0d0d0d0UL, 0x2c2c2c2cUL, 0x1e1e1e1eUL, 0x8f8f8f8fUL,
463             0xcacacacaUL, 0x3f3f3f3fUL, 0x0f0f0f0fUL, 0x02020202UL,
464             0xc1c1c1c1UL, 0xafafafafUL, 0xbdbdbdbdUL, 0x03030303UL,
465             0x01010101UL, 0x13131313UL, 0x8a8a8a8aUL, 0x6b6b6b6bUL,
466             0x3a3a3a3aUL, 0x91919191UL, 0x11111111UL, 0x41414141UL,
467             0x4f4f4f4fUL, 0x67676767UL, 0xdcdcdcdcUL, 0xeaeaeaeaUL,
468             0x97979797UL, 0xf2f2f2f2UL, 0xcfcfcfcfUL, 0xcecececeUL,
469             0xf0f0f0f0UL, 0xb4b4b4b4UL, 0xe6e6e6e6UL, 0x73737373UL,
470             0x96969696UL, 0xacacacacUL, 0x74747474UL, 0x22222222UL,
471             0xe7e7e7e7UL, 0xadadadadUL, 0x35353535UL, 0x85858585UL,
472             0xe2e2e2e2UL, 0xf9f9f9f9UL, 0x37373737UL, 0xe8e8e8e8UL,
473             0x1c1c1c1cUL, 0x75757575UL, 0xdfdfdfdfUL, 0x6e6e6e6eUL,
474             0x47474747UL, 0xf1f1f1f1UL, 0x1a1a1a1aUL, 0x71717171UL,
475             0x1d1d1d1dUL, 0x29292929UL, 0xc5c5c5c5UL, 0x89898989UL,
476             0x6f6f6f6fUL, 0xb7b7b7b7UL, 0x62626262UL, 0x0e0e0e0eUL,
477             0xaaaaaaaaUL, 0x18181818UL, 0xbebebebeUL, 0x1b1b1b1bUL,
478             0xfcfcfcfcUL, 0x56565656UL, 0x3e3e3e3eUL, 0x4b4b4b4bUL,
479             0xc6c6c6c6UL, 0xd2d2d2d2UL, 0x79797979UL, 0x20202020UL,
480             0x9a9a9a9aUL, 0xdbdbdbdbUL, 0xc0c0c0c0UL, 0xfefefefeUL,
481             0x78787878UL, 0xcdcdcdcdUL, 0x5a5a5a5aUL, 0xf4f4f4f4UL,
482             0x1f1f1f1fUL, 0xddddddddUL, 0xa8a8a8a8UL, 0x33333333UL,
483             0x88888888UL, 0x07070707UL, 0xc7c7c7c7UL, 0x31313131UL,
484             0xb1b1b1b1UL, 0x12121212UL, 0x10101010UL, 0x59595959UL,
485             0x27272727UL, 0x80808080UL, 0xececececUL, 0x5f5f5f5fUL,
486             0x60606060UL, 0x51515151UL, 0x7f7f7f7fUL, 0xa9a9a9a9UL,
487             0x19191919UL, 0xb5b5b5b5UL, 0x4a4a4a4aUL, 0x0d0d0d0dUL,
488             0x2d2d2d2dUL, 0xe5e5e5e5UL, 0x7a7a7a7aUL, 0x9f9f9f9fUL,
489             0x93939393UL, 0xc9c9c9c9UL, 0x9c9c9c9cUL, 0xefefefefUL,
490             0xa0a0a0a0UL, 0xe0e0e0e0UL, 0x3b3b3b3bUL, 0x4d4d4d4dUL,
491             0xaeaeaeaeUL, 0x2a2a2a2aUL, 0xf5f5f5f5UL, 0xb0b0b0b0UL,
492             0xc8c8c8c8UL, 0xebebebebUL, 0xbbbbbbbbUL, 0x3c3c3c3cUL,
493             0x83838383UL, 0x53535353UL, 0x99999999UL, 0x61616161UL,
494             0x17171717UL, 0x2b2b2b2bUL, 0x04040404UL, 0x7e7e7e7eUL,
495             0xbabababaUL, 0x77777777UL, 0xd6d6d6d6UL, 0x26262626UL,
496             0xe1e1e1e1UL, 0x69696969UL, 0x14141414UL, 0x63636363UL,
497             0x55555555UL, 0x21212121UL, 0x0c0c0c0cUL, 0x7d7d7d7dUL,
498             0xe1f27f3aUL, 0xf5710fb0UL, 0xada0e5c4UL, 0x98e4c919UL
499             };
500              
501             # ifdef PS_AES_IMPROVE_PERF_INCREASE_CODESIZE
502              
503             static const uint32 TE1[256] = {
504             0xa5c66363UL, 0x84f87c7cUL, 0x99ee7777UL, 0x8df67b7bUL,
505             0x0dfff2f2UL, 0xbdd66b6bUL, 0xb1de6f6fUL, 0x5491c5c5UL,
506             0x50603030UL, 0x03020101UL, 0xa9ce6767UL, 0x7d562b2bUL,
507             0x19e7fefeUL, 0x62b5d7d7UL, 0xe64dababUL, 0x9aec7676UL,
508             0x458fcacaUL, 0x9d1f8282UL, 0x4089c9c9UL, 0x87fa7d7dUL,
509             0x15effafaUL, 0xebb25959UL, 0xc98e4747UL, 0x0bfbf0f0UL,
510             0xec41adadUL, 0x67b3d4d4UL, 0xfd5fa2a2UL, 0xea45afafUL,
511             0xbf239c9cUL, 0xf753a4a4UL, 0x96e47272UL, 0x5b9bc0c0UL,
512             0xc275b7b7UL, 0x1ce1fdfdUL, 0xae3d9393UL, 0x6a4c2626UL,
513             0x5a6c3636UL, 0x417e3f3fUL, 0x02f5f7f7UL, 0x4f83ccccUL,
514             0x5c683434UL, 0xf451a5a5UL, 0x34d1e5e5UL, 0x08f9f1f1UL,
515             0x93e27171UL, 0x73abd8d8UL, 0x53623131UL, 0x3f2a1515UL,
516             0x0c080404UL, 0x5295c7c7UL, 0x65462323UL, 0x5e9dc3c3UL,
517             0x28301818UL, 0xa1379696UL, 0x0f0a0505UL, 0xb52f9a9aUL,
518             0x090e0707UL, 0x36241212UL, 0x9b1b8080UL, 0x3ddfe2e2UL,
519             0x26cdebebUL, 0x694e2727UL, 0xcd7fb2b2UL, 0x9fea7575UL,
520             0x1b120909UL, 0x9e1d8383UL, 0x74582c2cUL, 0x2e341a1aUL,
521             0x2d361b1bUL, 0xb2dc6e6eUL, 0xeeb45a5aUL, 0xfb5ba0a0UL,
522             0xf6a45252UL, 0x4d763b3bUL, 0x61b7d6d6UL, 0xce7db3b3UL,
523             0x7b522929UL, 0x3edde3e3UL, 0x715e2f2fUL, 0x97138484UL,
524             0xf5a65353UL, 0x68b9d1d1UL, 0x00000000UL, 0x2cc1ededUL,
525             0x60402020UL, 0x1fe3fcfcUL, 0xc879b1b1UL, 0xedb65b5bUL,
526             0xbed46a6aUL, 0x468dcbcbUL, 0xd967bebeUL, 0x4b723939UL,
527             0xde944a4aUL, 0xd4984c4cUL, 0xe8b05858UL, 0x4a85cfcfUL,
528             0x6bbbd0d0UL, 0x2ac5efefUL, 0xe54faaaaUL, 0x16edfbfbUL,
529             0xc5864343UL, 0xd79a4d4dUL, 0x55663333UL, 0x94118585UL,
530             0xcf8a4545UL, 0x10e9f9f9UL, 0x06040202UL, 0x81fe7f7fUL,
531             0xf0a05050UL, 0x44783c3cUL, 0xba259f9fUL, 0xe34ba8a8UL,
532             0xf3a25151UL, 0xfe5da3a3UL, 0xc0804040UL, 0x8a058f8fUL,
533             0xad3f9292UL, 0xbc219d9dUL, 0x48703838UL, 0x04f1f5f5UL,
534             0xdf63bcbcUL, 0xc177b6b6UL, 0x75afdadaUL, 0x63422121UL,
535             0x30201010UL, 0x1ae5ffffUL, 0x0efdf3f3UL, 0x6dbfd2d2UL,
536             0x4c81cdcdUL, 0x14180c0cUL, 0x35261313UL, 0x2fc3ececUL,
537             0xe1be5f5fUL, 0xa2359797UL, 0xcc884444UL, 0x392e1717UL,
538             0x5793c4c4UL, 0xf255a7a7UL, 0x82fc7e7eUL, 0x477a3d3dUL,
539             0xacc86464UL, 0xe7ba5d5dUL, 0x2b321919UL, 0x95e67373UL,
540             0xa0c06060UL, 0x98198181UL, 0xd19e4f4fUL, 0x7fa3dcdcUL,
541             0x66442222UL, 0x7e542a2aUL, 0xab3b9090UL, 0x830b8888UL,
542             0xca8c4646UL, 0x29c7eeeeUL, 0xd36bb8b8UL, 0x3c281414UL,
543             0x79a7dedeUL, 0xe2bc5e5eUL, 0x1d160b0bUL, 0x76addbdbUL,
544             0x3bdbe0e0UL, 0x56643232UL, 0x4e743a3aUL, 0x1e140a0aUL,
545             0xdb924949UL, 0x0a0c0606UL, 0x6c482424UL, 0xe4b85c5cUL,
546             0x5d9fc2c2UL, 0x6ebdd3d3UL, 0xef43acacUL, 0xa6c46262UL,
547             0xa8399191UL, 0xa4319595UL, 0x37d3e4e4UL, 0x8bf27979UL,
548             0x32d5e7e7UL, 0x438bc8c8UL, 0x596e3737UL, 0xb7da6d6dUL,
549             0x8c018d8dUL, 0x64b1d5d5UL, 0xd29c4e4eUL, 0xe049a9a9UL,
550             0xb4d86c6cUL, 0xfaac5656UL, 0x07f3f4f4UL, 0x25cfeaeaUL,
551             0xafca6565UL, 0x8ef47a7aUL, 0xe947aeaeUL, 0x18100808UL,
552             0xd56fbabaUL, 0x88f07878UL, 0x6f4a2525UL, 0x725c2e2eUL,
553             0x24381c1cUL, 0xf157a6a6UL, 0xc773b4b4UL, 0x5197c6c6UL,
554             0x23cbe8e8UL, 0x7ca1ddddUL, 0x9ce87474UL, 0x213e1f1fUL,
555             0xdd964b4bUL, 0xdc61bdbdUL, 0x860d8b8bUL, 0x850f8a8aUL,
556             0x90e07070UL, 0x427c3e3eUL, 0xc471b5b5UL, 0xaacc6666UL,
557             0xd8904848UL, 0x05060303UL, 0x01f7f6f6UL, 0x121c0e0eUL,
558             0xa3c26161UL, 0x5f6a3535UL, 0xf9ae5757UL, 0xd069b9b9UL,
559             0x91178686UL, 0x5899c1c1UL, 0x273a1d1dUL, 0xb9279e9eUL,
560             0x38d9e1e1UL, 0x13ebf8f8UL, 0xb32b9898UL, 0x33221111UL,
561             0xbbd26969UL, 0x70a9d9d9UL, 0x89078e8eUL, 0xa7339494UL,
562             0xb62d9b9bUL, 0x223c1e1eUL, 0x92158787UL, 0x20c9e9e9UL,
563             0x4987ceceUL, 0xffaa5555UL, 0x78502828UL, 0x7aa5dfdfUL,
564             0x8f038c8cUL, 0xf859a1a1UL, 0x80098989UL, 0x171a0d0dUL,
565             0xda65bfbfUL, 0x31d7e6e6UL, 0xc6844242UL, 0xb8d06868UL,
566             0xc3824141UL, 0xb0299999UL, 0x775a2d2dUL, 0x111e0f0fUL,
567             0xcb7bb0b0UL, 0xfca85454UL, 0xd66dbbbbUL, 0x3a2c1616UL,
568             };
569             static const uint32 TE2[256] = {
570             0x63a5c663UL, 0x7c84f87cUL, 0x7799ee77UL, 0x7b8df67bUL,
571             0xf20dfff2UL, 0x6bbdd66bUL, 0x6fb1de6fUL, 0xc55491c5UL,
572             0x30506030UL, 0x01030201UL, 0x67a9ce67UL, 0x2b7d562bUL,
573             0xfe19e7feUL, 0xd762b5d7UL, 0xabe64dabUL, 0x769aec76UL,
574             0xca458fcaUL, 0x829d1f82UL, 0xc94089c9UL, 0x7d87fa7dUL,
575             0xfa15effaUL, 0x59ebb259UL, 0x47c98e47UL, 0xf00bfbf0UL,
576             0xadec41adUL, 0xd467b3d4UL, 0xa2fd5fa2UL, 0xafea45afUL,
577             0x9cbf239cUL, 0xa4f753a4UL, 0x7296e472UL, 0xc05b9bc0UL,
578             0xb7c275b7UL, 0xfd1ce1fdUL, 0x93ae3d93UL, 0x266a4c26UL,
579             0x365a6c36UL, 0x3f417e3fUL, 0xf702f5f7UL, 0xcc4f83ccUL,
580             0x345c6834UL, 0xa5f451a5UL, 0xe534d1e5UL, 0xf108f9f1UL,
581             0x7193e271UL, 0xd873abd8UL, 0x31536231UL, 0x153f2a15UL,
582             0x040c0804UL, 0xc75295c7UL, 0x23654623UL, 0xc35e9dc3UL,
583             0x18283018UL, 0x96a13796UL, 0x050f0a05UL, 0x9ab52f9aUL,
584             0x07090e07UL, 0x12362412UL, 0x809b1b80UL, 0xe23ddfe2UL,
585             0xeb26cdebUL, 0x27694e27UL, 0xb2cd7fb2UL, 0x759fea75UL,
586             0x091b1209UL, 0x839e1d83UL, 0x2c74582cUL, 0x1a2e341aUL,
587             0x1b2d361bUL, 0x6eb2dc6eUL, 0x5aeeb45aUL, 0xa0fb5ba0UL,
588             0x52f6a452UL, 0x3b4d763bUL, 0xd661b7d6UL, 0xb3ce7db3UL,
589             0x297b5229UL, 0xe33edde3UL, 0x2f715e2fUL, 0x84971384UL,
590             0x53f5a653UL, 0xd168b9d1UL, 0x00000000UL, 0xed2cc1edUL,
591             0x20604020UL, 0xfc1fe3fcUL, 0xb1c879b1UL, 0x5bedb65bUL,
592             0x6abed46aUL, 0xcb468dcbUL, 0xbed967beUL, 0x394b7239UL,
593             0x4ade944aUL, 0x4cd4984cUL, 0x58e8b058UL, 0xcf4a85cfUL,
594             0xd06bbbd0UL, 0xef2ac5efUL, 0xaae54faaUL, 0xfb16edfbUL,
595             0x43c58643UL, 0x4dd79a4dUL, 0x33556633UL, 0x85941185UL,
596             0x45cf8a45UL, 0xf910e9f9UL, 0x02060402UL, 0x7f81fe7fUL,
597             0x50f0a050UL, 0x3c44783cUL, 0x9fba259fUL, 0xa8e34ba8UL,
598             0x51f3a251UL, 0xa3fe5da3UL, 0x40c08040UL, 0x8f8a058fUL,
599             0x92ad3f92UL, 0x9dbc219dUL, 0x38487038UL, 0xf504f1f5UL,
600             0xbcdf63bcUL, 0xb6c177b6UL, 0xda75afdaUL, 0x21634221UL,
601             0x10302010UL, 0xff1ae5ffUL, 0xf30efdf3UL, 0xd26dbfd2UL,
602             0xcd4c81cdUL, 0x0c14180cUL, 0x13352613UL, 0xec2fc3ecUL,
603             0x5fe1be5fUL, 0x97a23597UL, 0x44cc8844UL, 0x17392e17UL,
604             0xc45793c4UL, 0xa7f255a7UL, 0x7e82fc7eUL, 0x3d477a3dUL,
605             0x64acc864UL, 0x5de7ba5dUL, 0x192b3219UL, 0x7395e673UL,
606             0x60a0c060UL, 0x81981981UL, 0x4fd19e4fUL, 0xdc7fa3dcUL,
607             0x22664422UL, 0x2a7e542aUL, 0x90ab3b90UL, 0x88830b88UL,
608             0x46ca8c46UL, 0xee29c7eeUL, 0xb8d36bb8UL, 0x143c2814UL,
609             0xde79a7deUL, 0x5ee2bc5eUL, 0x0b1d160bUL, 0xdb76addbUL,
610             0xe03bdbe0UL, 0x32566432UL, 0x3a4e743aUL, 0x0a1e140aUL,
611             0x49db9249UL, 0x060a0c06UL, 0x246c4824UL, 0x5ce4b85cUL,
612             0xc25d9fc2UL, 0xd36ebdd3UL, 0xacef43acUL, 0x62a6c462UL,
613             0x91a83991UL, 0x95a43195UL, 0xe437d3e4UL, 0x798bf279UL,
614             0xe732d5e7UL, 0xc8438bc8UL, 0x37596e37UL, 0x6db7da6dUL,
615             0x8d8c018dUL, 0xd564b1d5UL, 0x4ed29c4eUL, 0xa9e049a9UL,
616             0x6cb4d86cUL, 0x56faac56UL, 0xf407f3f4UL, 0xea25cfeaUL,
617             0x65afca65UL, 0x7a8ef47aUL, 0xaee947aeUL, 0x08181008UL,
618             0xbad56fbaUL, 0x7888f078UL, 0x256f4a25UL, 0x2e725c2eUL,
619             0x1c24381cUL, 0xa6f157a6UL, 0xb4c773b4UL, 0xc65197c6UL,
620             0xe823cbe8UL, 0xdd7ca1ddUL, 0x749ce874UL, 0x1f213e1fUL,
621             0x4bdd964bUL, 0xbddc61bdUL, 0x8b860d8bUL, 0x8a850f8aUL,
622             0x7090e070UL, 0x3e427c3eUL, 0xb5c471b5UL, 0x66aacc66UL,
623             0x48d89048UL, 0x03050603UL, 0xf601f7f6UL, 0x0e121c0eUL,
624             0x61a3c261UL, 0x355f6a35UL, 0x57f9ae57UL, 0xb9d069b9UL,
625             0x86911786UL, 0xc15899c1UL, 0x1d273a1dUL, 0x9eb9279eUL,
626             0xe138d9e1UL, 0xf813ebf8UL, 0x98b32b98UL, 0x11332211UL,
627             0x69bbd269UL, 0xd970a9d9UL, 0x8e89078eUL, 0x94a73394UL,
628             0x9bb62d9bUL, 0x1e223c1eUL, 0x87921587UL, 0xe920c9e9UL,
629             0xce4987ceUL, 0x55ffaa55UL, 0x28785028UL, 0xdf7aa5dfUL,
630             0x8c8f038cUL, 0xa1f859a1UL, 0x89800989UL, 0x0d171a0dUL,
631             0xbfda65bfUL, 0xe631d7e6UL, 0x42c68442UL, 0x68b8d068UL,
632             0x41c38241UL, 0x99b02999UL, 0x2d775a2dUL, 0x0f111e0fUL,
633             0xb0cb7bb0UL, 0x54fca854UL, 0xbbd66dbbUL, 0x163a2c16UL,
634             };
635             static const uint32 TE3[256] = {
636              
637             0x6363a5c6UL, 0x7c7c84f8UL, 0x777799eeUL, 0x7b7b8df6UL,
638             0xf2f20dffUL, 0x6b6bbdd6UL, 0x6f6fb1deUL, 0xc5c55491UL,
639             0x30305060UL, 0x01010302UL, 0x6767a9ceUL, 0x2b2b7d56UL,
640             0xfefe19e7UL, 0xd7d762b5UL, 0xababe64dUL, 0x76769aecUL,
641             0xcaca458fUL, 0x82829d1fUL, 0xc9c94089UL, 0x7d7d87faUL,
642             0xfafa15efUL, 0x5959ebb2UL, 0x4747c98eUL, 0xf0f00bfbUL,
643             0xadadec41UL, 0xd4d467b3UL, 0xa2a2fd5fUL, 0xafafea45UL,
644             0x9c9cbf23UL, 0xa4a4f753UL, 0x727296e4UL, 0xc0c05b9bUL,
645             0xb7b7c275UL, 0xfdfd1ce1UL, 0x9393ae3dUL, 0x26266a4cUL,
646             0x36365a6cUL, 0x3f3f417eUL, 0xf7f702f5UL, 0xcccc4f83UL,
647             0x34345c68UL, 0xa5a5f451UL, 0xe5e534d1UL, 0xf1f108f9UL,
648             0x717193e2UL, 0xd8d873abUL, 0x31315362UL, 0x15153f2aUL,
649             0x04040c08UL, 0xc7c75295UL, 0x23236546UL, 0xc3c35e9dUL,
650             0x18182830UL, 0x9696a137UL, 0x05050f0aUL, 0x9a9ab52fUL,
651             0x0707090eUL, 0x12123624UL, 0x80809b1bUL, 0xe2e23ddfUL,
652             0xebeb26cdUL, 0x2727694eUL, 0xb2b2cd7fUL, 0x75759feaUL,
653             0x09091b12UL, 0x83839e1dUL, 0x2c2c7458UL, 0x1a1a2e34UL,
654             0x1b1b2d36UL, 0x6e6eb2dcUL, 0x5a5aeeb4UL, 0xa0a0fb5bUL,
655             0x5252f6a4UL, 0x3b3b4d76UL, 0xd6d661b7UL, 0xb3b3ce7dUL,
656             0x29297b52UL, 0xe3e33eddUL, 0x2f2f715eUL, 0x84849713UL,
657             0x5353f5a6UL, 0xd1d168b9UL, 0x00000000UL, 0xeded2cc1UL,
658             0x20206040UL, 0xfcfc1fe3UL, 0xb1b1c879UL, 0x5b5bedb6UL,
659             0x6a6abed4UL, 0xcbcb468dUL, 0xbebed967UL, 0x39394b72UL,
660             0x4a4ade94UL, 0x4c4cd498UL, 0x5858e8b0UL, 0xcfcf4a85UL,
661             0xd0d06bbbUL, 0xefef2ac5UL, 0xaaaae54fUL, 0xfbfb16edUL,
662             0x4343c586UL, 0x4d4dd79aUL, 0x33335566UL, 0x85859411UL,
663             0x4545cf8aUL, 0xf9f910e9UL, 0x02020604UL, 0x7f7f81feUL,
664             0x5050f0a0UL, 0x3c3c4478UL, 0x9f9fba25UL, 0xa8a8e34bUL,
665             0x5151f3a2UL, 0xa3a3fe5dUL, 0x4040c080UL, 0x8f8f8a05UL,
666             0x9292ad3fUL, 0x9d9dbc21UL, 0x38384870UL, 0xf5f504f1UL,
667             0xbcbcdf63UL, 0xb6b6c177UL, 0xdada75afUL, 0x21216342UL,
668             0x10103020UL, 0xffff1ae5UL, 0xf3f30efdUL, 0xd2d26dbfUL,
669             0xcdcd4c81UL, 0x0c0c1418UL, 0x13133526UL, 0xecec2fc3UL,
670             0x5f5fe1beUL, 0x9797a235UL, 0x4444cc88UL, 0x1717392eUL,
671             0xc4c45793UL, 0xa7a7f255UL, 0x7e7e82fcUL, 0x3d3d477aUL,
672             0x6464acc8UL, 0x5d5de7baUL, 0x19192b32UL, 0x737395e6UL,
673             0x6060a0c0UL, 0x81819819UL, 0x4f4fd19eUL, 0xdcdc7fa3UL,
674             0x22226644UL, 0x2a2a7e54UL, 0x9090ab3bUL, 0x8888830bUL,
675             0x4646ca8cUL, 0xeeee29c7UL, 0xb8b8d36bUL, 0x14143c28UL,
676             0xdede79a7UL, 0x5e5ee2bcUL, 0x0b0b1d16UL, 0xdbdb76adUL,
677             0xe0e03bdbUL, 0x32325664UL, 0x3a3a4e74UL, 0x0a0a1e14UL,
678             0x4949db92UL, 0x06060a0cUL, 0x24246c48UL, 0x5c5ce4b8UL,
679             0xc2c25d9fUL, 0xd3d36ebdUL, 0xacacef43UL, 0x6262a6c4UL,
680             0x9191a839UL, 0x9595a431UL, 0xe4e437d3UL, 0x79798bf2UL,
681             0xe7e732d5UL, 0xc8c8438bUL, 0x3737596eUL, 0x6d6db7daUL,
682             0x8d8d8c01UL, 0xd5d564b1UL, 0x4e4ed29cUL, 0xa9a9e049UL,
683             0x6c6cb4d8UL, 0x5656faacUL, 0xf4f407f3UL, 0xeaea25cfUL,
684             0x6565afcaUL, 0x7a7a8ef4UL, 0xaeaee947UL, 0x08081810UL,
685             0xbabad56fUL, 0x787888f0UL, 0x25256f4aUL, 0x2e2e725cUL,
686             0x1c1c2438UL, 0xa6a6f157UL, 0xb4b4c773UL, 0xc6c65197UL,
687             0xe8e823cbUL, 0xdddd7ca1UL, 0x74749ce8UL, 0x1f1f213eUL,
688             0x4b4bdd96UL, 0xbdbddc61UL, 0x8b8b860dUL, 0x8a8a850fUL,
689             0x707090e0UL, 0x3e3e427cUL, 0xb5b5c471UL, 0x6666aaccUL,
690             0x4848d890UL, 0x03030506UL, 0xf6f601f7UL, 0x0e0e121cUL,
691             0x6161a3c2UL, 0x35355f6aUL, 0x5757f9aeUL, 0xb9b9d069UL,
692             0x86869117UL, 0xc1c15899UL, 0x1d1d273aUL, 0x9e9eb927UL,
693             0xe1e138d9UL, 0xf8f813ebUL, 0x9898b32bUL, 0x11113322UL,
694             0x6969bbd2UL, 0xd9d970a9UL, 0x8e8e8907UL, 0x9494a733UL,
695             0x9b9bb62dUL, 0x1e1e223cUL, 0x87879215UL, 0xe9e920c9UL,
696             0xcece4987UL, 0x5555ffaaUL, 0x28287850UL, 0xdfdf7aa5UL,
697             0x8c8c8f03UL, 0xa1a1f859UL, 0x89898009UL, 0x0d0d171aUL,
698             0xbfbfda65UL, 0xe6e631d7UL, 0x4242c684UL, 0x6868b8d0UL,
699             0x4141c382UL, 0x9999b029UL, 0x2d2d775aUL, 0x0f0f111eUL,
700             0xb0b0cb7bUL, 0x5454fca8UL, 0xbbbbd66dUL, 0x16163a2cUL,
701             };
702              
703             static const uint32 Te4_0[] = {
704             0x00000063UL, 0x0000007cUL, 0x00000077UL, 0x0000007bUL, 0x000000f2UL, 0x0000006bUL, 0x0000006fUL, 0x000000c5UL,
705             0x00000030UL, 0x00000001UL, 0x00000067UL, 0x0000002bUL, 0x000000feUL, 0x000000d7UL, 0x000000abUL, 0x00000076UL,
706             0x000000caUL, 0x00000082UL, 0x000000c9UL, 0x0000007dUL, 0x000000faUL, 0x00000059UL, 0x00000047UL, 0x000000f0UL,
707             0x000000adUL, 0x000000d4UL, 0x000000a2UL, 0x000000afUL, 0x0000009cUL, 0x000000a4UL, 0x00000072UL, 0x000000c0UL,
708             0x000000b7UL, 0x000000fdUL, 0x00000093UL, 0x00000026UL, 0x00000036UL, 0x0000003fUL, 0x000000f7UL, 0x000000ccUL,
709             0x00000034UL, 0x000000a5UL, 0x000000e5UL, 0x000000f1UL, 0x00000071UL, 0x000000d8UL, 0x00000031UL, 0x00000015UL,
710             0x00000004UL, 0x000000c7UL, 0x00000023UL, 0x000000c3UL, 0x00000018UL, 0x00000096UL, 0x00000005UL, 0x0000009aUL,
711             0x00000007UL, 0x00000012UL, 0x00000080UL, 0x000000e2UL, 0x000000ebUL, 0x00000027UL, 0x000000b2UL, 0x00000075UL,
712             0x00000009UL, 0x00000083UL, 0x0000002cUL, 0x0000001aUL, 0x0000001bUL, 0x0000006eUL, 0x0000005aUL, 0x000000a0UL,
713             0x00000052UL, 0x0000003bUL, 0x000000d6UL, 0x000000b3UL, 0x00000029UL, 0x000000e3UL, 0x0000002fUL, 0x00000084UL,
714             0x00000053UL, 0x000000d1UL, 0x00000000UL, 0x000000edUL, 0x00000020UL, 0x000000fcUL, 0x000000b1UL, 0x0000005bUL,
715             0x0000006aUL, 0x000000cbUL, 0x000000beUL, 0x00000039UL, 0x0000004aUL, 0x0000004cUL, 0x00000058UL, 0x000000cfUL,
716             0x000000d0UL, 0x000000efUL, 0x000000aaUL, 0x000000fbUL, 0x00000043UL, 0x0000004dUL, 0x00000033UL, 0x00000085UL,
717             0x00000045UL, 0x000000f9UL, 0x00000002UL, 0x0000007fUL, 0x00000050UL, 0x0000003cUL, 0x0000009fUL, 0x000000a8UL,
718             0x00000051UL, 0x000000a3UL, 0x00000040UL, 0x0000008fUL, 0x00000092UL, 0x0000009dUL, 0x00000038UL, 0x000000f5UL,
719             0x000000bcUL, 0x000000b6UL, 0x000000daUL, 0x00000021UL, 0x00000010UL, 0x000000ffUL, 0x000000f3UL, 0x000000d2UL,
720             0x000000cdUL, 0x0000000cUL, 0x00000013UL, 0x000000ecUL, 0x0000005fUL, 0x00000097UL, 0x00000044UL, 0x00000017UL,
721             0x000000c4UL, 0x000000a7UL, 0x0000007eUL, 0x0000003dUL, 0x00000064UL, 0x0000005dUL, 0x00000019UL, 0x00000073UL,
722             0x00000060UL, 0x00000081UL, 0x0000004fUL, 0x000000dcUL, 0x00000022UL, 0x0000002aUL, 0x00000090UL, 0x00000088UL,
723             0x00000046UL, 0x000000eeUL, 0x000000b8UL, 0x00000014UL, 0x000000deUL, 0x0000005eUL, 0x0000000bUL, 0x000000dbUL,
724             0x000000e0UL, 0x00000032UL, 0x0000003aUL, 0x0000000aUL, 0x00000049UL, 0x00000006UL, 0x00000024UL, 0x0000005cUL,
725             0x000000c2UL, 0x000000d3UL, 0x000000acUL, 0x00000062UL, 0x00000091UL, 0x00000095UL, 0x000000e4UL, 0x00000079UL,
726             0x000000e7UL, 0x000000c8UL, 0x00000037UL, 0x0000006dUL, 0x0000008dUL, 0x000000d5UL, 0x0000004eUL, 0x000000a9UL,
727             0x0000006cUL, 0x00000056UL, 0x000000f4UL, 0x000000eaUL, 0x00000065UL, 0x0000007aUL, 0x000000aeUL, 0x00000008UL,
728             0x000000baUL, 0x00000078UL, 0x00000025UL, 0x0000002eUL, 0x0000001cUL, 0x000000a6UL, 0x000000b4UL, 0x000000c6UL,
729             0x000000e8UL, 0x000000ddUL, 0x00000074UL, 0x0000001fUL, 0x0000004bUL, 0x000000bdUL, 0x0000008bUL, 0x0000008aUL,
730             0x00000070UL, 0x0000003eUL, 0x000000b5UL, 0x00000066UL, 0x00000048UL, 0x00000003UL, 0x000000f6UL, 0x0000000eUL,
731             0x00000061UL, 0x00000035UL, 0x00000057UL, 0x000000b9UL, 0x00000086UL, 0x000000c1UL, 0x0000001dUL, 0x0000009eUL,
732             0x000000e1UL, 0x000000f8UL, 0x00000098UL, 0x00000011UL, 0x00000069UL, 0x000000d9UL, 0x0000008eUL, 0x00000094UL,
733             0x0000009bUL, 0x0000001eUL, 0x00000087UL, 0x000000e9UL, 0x000000ceUL, 0x00000055UL, 0x00000028UL, 0x000000dfUL,
734             0x0000008cUL, 0x000000a1UL, 0x00000089UL, 0x0000000dUL, 0x000000bfUL, 0x000000e6UL, 0x00000042UL, 0x00000068UL,
735             0x00000041UL, 0x00000099UL, 0x0000002dUL, 0x0000000fUL, 0x000000b0UL, 0x00000054UL, 0x000000bbUL, 0x00000016UL
736             };
737              
738             static const uint32 Te4_1[] = {
739             0x00006300UL, 0x00007c00UL, 0x00007700UL, 0x00007b00UL, 0x0000f200UL, 0x00006b00UL, 0x00006f00UL, 0x0000c500UL,
740             0x00003000UL, 0x00000100UL, 0x00006700UL, 0x00002b00UL, 0x0000fe00UL, 0x0000d700UL, 0x0000ab00UL, 0x00007600UL,
741             0x0000ca00UL, 0x00008200UL, 0x0000c900UL, 0x00007d00UL, 0x0000fa00UL, 0x00005900UL, 0x00004700UL, 0x0000f000UL,
742             0x0000ad00UL, 0x0000d400UL, 0x0000a200UL, 0x0000af00UL, 0x00009c00UL, 0x0000a400UL, 0x00007200UL, 0x0000c000UL,
743             0x0000b700UL, 0x0000fd00UL, 0x00009300UL, 0x00002600UL, 0x00003600UL, 0x00003f00UL, 0x0000f700UL, 0x0000cc00UL,
744             0x00003400UL, 0x0000a500UL, 0x0000e500UL, 0x0000f100UL, 0x00007100UL, 0x0000d800UL, 0x00003100UL, 0x00001500UL,
745             0x00000400UL, 0x0000c700UL, 0x00002300UL, 0x0000c300UL, 0x00001800UL, 0x00009600UL, 0x00000500UL, 0x00009a00UL,
746             0x00000700UL, 0x00001200UL, 0x00008000UL, 0x0000e200UL, 0x0000eb00UL, 0x00002700UL, 0x0000b200UL, 0x00007500UL,
747             0x00000900UL, 0x00008300UL, 0x00002c00UL, 0x00001a00UL, 0x00001b00UL, 0x00006e00UL, 0x00005a00UL, 0x0000a000UL,
748             0x00005200UL, 0x00003b00UL, 0x0000d600UL, 0x0000b300UL, 0x00002900UL, 0x0000e300UL, 0x00002f00UL, 0x00008400UL,
749             0x00005300UL, 0x0000d100UL, 0x00000000UL, 0x0000ed00UL, 0x00002000UL, 0x0000fc00UL, 0x0000b100UL, 0x00005b00UL,
750             0x00006a00UL, 0x0000cb00UL, 0x0000be00UL, 0x00003900UL, 0x00004a00UL, 0x00004c00UL, 0x00005800UL, 0x0000cf00UL,
751             0x0000d000UL, 0x0000ef00UL, 0x0000aa00UL, 0x0000fb00UL, 0x00004300UL, 0x00004d00UL, 0x00003300UL, 0x00008500UL,
752             0x00004500UL, 0x0000f900UL, 0x00000200UL, 0x00007f00UL, 0x00005000UL, 0x00003c00UL, 0x00009f00UL, 0x0000a800UL,
753             0x00005100UL, 0x0000a300UL, 0x00004000UL, 0x00008f00UL, 0x00009200UL, 0x00009d00UL, 0x00003800UL, 0x0000f500UL,
754             0x0000bc00UL, 0x0000b600UL, 0x0000da00UL, 0x00002100UL, 0x00001000UL, 0x0000ff00UL, 0x0000f300UL, 0x0000d200UL,
755             0x0000cd00UL, 0x00000c00UL, 0x00001300UL, 0x0000ec00UL, 0x00005f00UL, 0x00009700UL, 0x00004400UL, 0x00001700UL,
756             0x0000c400UL, 0x0000a700UL, 0x00007e00UL, 0x00003d00UL, 0x00006400UL, 0x00005d00UL, 0x00001900UL, 0x00007300UL,
757             0x00006000UL, 0x00008100UL, 0x00004f00UL, 0x0000dc00UL, 0x00002200UL, 0x00002a00UL, 0x00009000UL, 0x00008800UL,
758             0x00004600UL, 0x0000ee00UL, 0x0000b800UL, 0x00001400UL, 0x0000de00UL, 0x00005e00UL, 0x00000b00UL, 0x0000db00UL,
759             0x0000e000UL, 0x00003200UL, 0x00003a00UL, 0x00000a00UL, 0x00004900UL, 0x00000600UL, 0x00002400UL, 0x00005c00UL,
760             0x0000c200UL, 0x0000d300UL, 0x0000ac00UL, 0x00006200UL, 0x00009100UL, 0x00009500UL, 0x0000e400UL, 0x00007900UL,
761             0x0000e700UL, 0x0000c800UL, 0x00003700UL, 0x00006d00UL, 0x00008d00UL, 0x0000d500UL, 0x00004e00UL, 0x0000a900UL,
762             0x00006c00UL, 0x00005600UL, 0x0000f400UL, 0x0000ea00UL, 0x00006500UL, 0x00007a00UL, 0x0000ae00UL, 0x00000800UL,
763             0x0000ba00UL, 0x00007800UL, 0x00002500UL, 0x00002e00UL, 0x00001c00UL, 0x0000a600UL, 0x0000b400UL, 0x0000c600UL,
764             0x0000e800UL, 0x0000dd00UL, 0x00007400UL, 0x00001f00UL, 0x00004b00UL, 0x0000bd00UL, 0x00008b00UL, 0x00008a00UL,
765             0x00007000UL, 0x00003e00UL, 0x0000b500UL, 0x00006600UL, 0x00004800UL, 0x00000300UL, 0x0000f600UL, 0x00000e00UL,
766             0x00006100UL, 0x00003500UL, 0x00005700UL, 0x0000b900UL, 0x00008600UL, 0x0000c100UL, 0x00001d00UL, 0x00009e00UL,
767             0x0000e100UL, 0x0000f800UL, 0x00009800UL, 0x00001100UL, 0x00006900UL, 0x0000d900UL, 0x00008e00UL, 0x00009400UL,
768             0x00009b00UL, 0x00001e00UL, 0x00008700UL, 0x0000e900UL, 0x0000ce00UL, 0x00005500UL, 0x00002800UL, 0x0000df00UL,
769             0x00008c00UL, 0x0000a100UL, 0x00008900UL, 0x00000d00UL, 0x0000bf00UL, 0x0000e600UL, 0x00004200UL, 0x00006800UL,
770             0x00004100UL, 0x00009900UL, 0x00002d00UL, 0x00000f00UL, 0x0000b000UL, 0x00005400UL, 0x0000bb00UL, 0x00001600UL
771             };
772              
773             static const uint32 Te4_2[] = {
774             0x00630000UL, 0x007c0000UL, 0x00770000UL, 0x007b0000UL, 0x00f20000UL, 0x006b0000UL, 0x006f0000UL, 0x00c50000UL,
775             0x00300000UL, 0x00010000UL, 0x00670000UL, 0x002b0000UL, 0x00fe0000UL, 0x00d70000UL, 0x00ab0000UL, 0x00760000UL,
776             0x00ca0000UL, 0x00820000UL, 0x00c90000UL, 0x007d0000UL, 0x00fa0000UL, 0x00590000UL, 0x00470000UL, 0x00f00000UL,
777             0x00ad0000UL, 0x00d40000UL, 0x00a20000UL, 0x00af0000UL, 0x009c0000UL, 0x00a40000UL, 0x00720000UL, 0x00c00000UL,
778             0x00b70000UL, 0x00fd0000UL, 0x00930000UL, 0x00260000UL, 0x00360000UL, 0x003f0000UL, 0x00f70000UL, 0x00cc0000UL,
779             0x00340000UL, 0x00a50000UL, 0x00e50000UL, 0x00f10000UL, 0x00710000UL, 0x00d80000UL, 0x00310000UL, 0x00150000UL,
780             0x00040000UL, 0x00c70000UL, 0x00230000UL, 0x00c30000UL, 0x00180000UL, 0x00960000UL, 0x00050000UL, 0x009a0000UL,
781             0x00070000UL, 0x00120000UL, 0x00800000UL, 0x00e20000UL, 0x00eb0000UL, 0x00270000UL, 0x00b20000UL, 0x00750000UL,
782             0x00090000UL, 0x00830000UL, 0x002c0000UL, 0x001a0000UL, 0x001b0000UL, 0x006e0000UL, 0x005a0000UL, 0x00a00000UL,
783             0x00520000UL, 0x003b0000UL, 0x00d60000UL, 0x00b30000UL, 0x00290000UL, 0x00e30000UL, 0x002f0000UL, 0x00840000UL,
784             0x00530000UL, 0x00d10000UL, 0x00000000UL, 0x00ed0000UL, 0x00200000UL, 0x00fc0000UL, 0x00b10000UL, 0x005b0000UL,
785             0x006a0000UL, 0x00cb0000UL, 0x00be0000UL, 0x00390000UL, 0x004a0000UL, 0x004c0000UL, 0x00580000UL, 0x00cf0000UL,
786             0x00d00000UL, 0x00ef0000UL, 0x00aa0000UL, 0x00fb0000UL, 0x00430000UL, 0x004d0000UL, 0x00330000UL, 0x00850000UL,
787             0x00450000UL, 0x00f90000UL, 0x00020000UL, 0x007f0000UL, 0x00500000UL, 0x003c0000UL, 0x009f0000UL, 0x00a80000UL,
788             0x00510000UL, 0x00a30000UL, 0x00400000UL, 0x008f0000UL, 0x00920000UL, 0x009d0000UL, 0x00380000UL, 0x00f50000UL,
789             0x00bc0000UL, 0x00b60000UL, 0x00da0000UL, 0x00210000UL, 0x00100000UL, 0x00ff0000UL, 0x00f30000UL, 0x00d20000UL,
790             0x00cd0000UL, 0x000c0000UL, 0x00130000UL, 0x00ec0000UL, 0x005f0000UL, 0x00970000UL, 0x00440000UL, 0x00170000UL,
791             0x00c40000UL, 0x00a70000UL, 0x007e0000UL, 0x003d0000UL, 0x00640000UL, 0x005d0000UL, 0x00190000UL, 0x00730000UL,
792             0x00600000UL, 0x00810000UL, 0x004f0000UL, 0x00dc0000UL, 0x00220000UL, 0x002a0000UL, 0x00900000UL, 0x00880000UL,
793             0x00460000UL, 0x00ee0000UL, 0x00b80000UL, 0x00140000UL, 0x00de0000UL, 0x005e0000UL, 0x000b0000UL, 0x00db0000UL,
794             0x00e00000UL, 0x00320000UL, 0x003a0000UL, 0x000a0000UL, 0x00490000UL, 0x00060000UL, 0x00240000UL, 0x005c0000UL,
795             0x00c20000UL, 0x00d30000UL, 0x00ac0000UL, 0x00620000UL, 0x00910000UL, 0x00950000UL, 0x00e40000UL, 0x00790000UL,
796             0x00e70000UL, 0x00c80000UL, 0x00370000UL, 0x006d0000UL, 0x008d0000UL, 0x00d50000UL, 0x004e0000UL, 0x00a90000UL,
797             0x006c0000UL, 0x00560000UL, 0x00f40000UL, 0x00ea0000UL, 0x00650000UL, 0x007a0000UL, 0x00ae0000UL, 0x00080000UL,
798             0x00ba0000UL, 0x00780000UL, 0x00250000UL, 0x002e0000UL, 0x001c0000UL, 0x00a60000UL, 0x00b40000UL, 0x00c60000UL,
799             0x00e80000UL, 0x00dd0000UL, 0x00740000UL, 0x001f0000UL, 0x004b0000UL, 0x00bd0000UL, 0x008b0000UL, 0x008a0000UL,
800             0x00700000UL, 0x003e0000UL, 0x00b50000UL, 0x00660000UL, 0x00480000UL, 0x00030000UL, 0x00f60000UL, 0x000e0000UL,
801             0x00610000UL, 0x00350000UL, 0x00570000UL, 0x00b90000UL, 0x00860000UL, 0x00c10000UL, 0x001d0000UL, 0x009e0000UL,
802             0x00e10000UL, 0x00f80000UL, 0x00980000UL, 0x00110000UL, 0x00690000UL, 0x00d90000UL, 0x008e0000UL, 0x00940000UL,
803             0x009b0000UL, 0x001e0000UL, 0x00870000UL, 0x00e90000UL, 0x00ce0000UL, 0x00550000UL, 0x00280000UL, 0x00df0000UL,
804             0x008c0000UL, 0x00a10000UL, 0x00890000UL, 0x000d0000UL, 0x00bf0000UL, 0x00e60000UL, 0x00420000UL, 0x00680000UL,
805             0x00410000UL, 0x00990000UL, 0x002d0000UL, 0x000f0000UL, 0x00b00000UL, 0x00540000UL, 0x00bb0000UL, 0x00160000UL
806             };
807              
808             static const uint32 Te4_3[] = {
809             0x63000000UL, 0x7c000000UL, 0x77000000UL, 0x7b000000UL, 0xf2000000UL, 0x6b000000UL, 0x6f000000UL, 0xc5000000UL,
810             0x30000000UL, 0x01000000UL, 0x67000000UL, 0x2b000000UL, 0xfe000000UL, 0xd7000000UL, 0xab000000UL, 0x76000000UL,
811             0xca000000UL, 0x82000000UL, 0xc9000000UL, 0x7d000000UL, 0xfa000000UL, 0x59000000UL, 0x47000000UL, 0xf0000000UL,
812             0xad000000UL, 0xd4000000UL, 0xa2000000UL, 0xaf000000UL, 0x9c000000UL, 0xa4000000UL, 0x72000000UL, 0xc0000000UL,
813             0xb7000000UL, 0xfd000000UL, 0x93000000UL, 0x26000000UL, 0x36000000UL, 0x3f000000UL, 0xf7000000UL, 0xcc000000UL,
814             0x34000000UL, 0xa5000000UL, 0xe5000000UL, 0xf1000000UL, 0x71000000UL, 0xd8000000UL, 0x31000000UL, 0x15000000UL,
815             0x04000000UL, 0xc7000000UL, 0x23000000UL, 0xc3000000UL, 0x18000000UL, 0x96000000UL, 0x05000000UL, 0x9a000000UL,
816             0x07000000UL, 0x12000000UL, 0x80000000UL, 0xe2000000UL, 0xeb000000UL, 0x27000000UL, 0xb2000000UL, 0x75000000UL,
817             0x09000000UL, 0x83000000UL, 0x2c000000UL, 0x1a000000UL, 0x1b000000UL, 0x6e000000UL, 0x5a000000UL, 0xa0000000UL,
818             0x52000000UL, 0x3b000000UL, 0xd6000000UL, 0xb3000000UL, 0x29000000UL, 0xe3000000UL, 0x2f000000UL, 0x84000000UL,
819             0x53000000UL, 0xd1000000UL, 0x00000000UL, 0xed000000UL, 0x20000000UL, 0xfc000000UL, 0xb1000000UL, 0x5b000000UL,
820             0x6a000000UL, 0xcb000000UL, 0xbe000000UL, 0x39000000UL, 0x4a000000UL, 0x4c000000UL, 0x58000000UL, 0xcf000000UL,
821             0xd0000000UL, 0xef000000UL, 0xaa000000UL, 0xfb000000UL, 0x43000000UL, 0x4d000000UL, 0x33000000UL, 0x85000000UL,
822             0x45000000UL, 0xf9000000UL, 0x02000000UL, 0x7f000000UL, 0x50000000UL, 0x3c000000UL, 0x9f000000UL, 0xa8000000UL,
823             0x51000000UL, 0xa3000000UL, 0x40000000UL, 0x8f000000UL, 0x92000000UL, 0x9d000000UL, 0x38000000UL, 0xf5000000UL,
824             0xbc000000UL, 0xb6000000UL, 0xda000000UL, 0x21000000UL, 0x10000000UL, 0xff000000UL, 0xf3000000UL, 0xd2000000UL,
825             0xcd000000UL, 0x0c000000UL, 0x13000000UL, 0xec000000UL, 0x5f000000UL, 0x97000000UL, 0x44000000UL, 0x17000000UL,
826             0xc4000000UL, 0xa7000000UL, 0x7e000000UL, 0x3d000000UL, 0x64000000UL, 0x5d000000UL, 0x19000000UL, 0x73000000UL,
827             0x60000000UL, 0x81000000UL, 0x4f000000UL, 0xdc000000UL, 0x22000000UL, 0x2a000000UL, 0x90000000UL, 0x88000000UL,
828             0x46000000UL, 0xee000000UL, 0xb8000000UL, 0x14000000UL, 0xde000000UL, 0x5e000000UL, 0x0b000000UL, 0xdb000000UL,
829             0xe0000000UL, 0x32000000UL, 0x3a000000UL, 0x0a000000UL, 0x49000000UL, 0x06000000UL, 0x24000000UL, 0x5c000000UL,
830             0xc2000000UL, 0xd3000000UL, 0xac000000UL, 0x62000000UL, 0x91000000UL, 0x95000000UL, 0xe4000000UL, 0x79000000UL,
831             0xe7000000UL, 0xc8000000UL, 0x37000000UL, 0x6d000000UL, 0x8d000000UL, 0xd5000000UL, 0x4e000000UL, 0xa9000000UL,
832             0x6c000000UL, 0x56000000UL, 0xf4000000UL, 0xea000000UL, 0x65000000UL, 0x7a000000UL, 0xae000000UL, 0x08000000UL,
833             0xba000000UL, 0x78000000UL, 0x25000000UL, 0x2e000000UL, 0x1c000000UL, 0xa6000000UL, 0xb4000000UL, 0xc6000000UL,
834             0xe8000000UL, 0xdd000000UL, 0x74000000UL, 0x1f000000UL, 0x4b000000UL, 0xbd000000UL, 0x8b000000UL, 0x8a000000UL,
835             0x70000000UL, 0x3e000000UL, 0xb5000000UL, 0x66000000UL, 0x48000000UL, 0x03000000UL, 0xf6000000UL, 0x0e000000UL,
836             0x61000000UL, 0x35000000UL, 0x57000000UL, 0xb9000000UL, 0x86000000UL, 0xc1000000UL, 0x1d000000UL, 0x9e000000UL,
837             0xe1000000UL, 0xf8000000UL, 0x98000000UL, 0x11000000UL, 0x69000000UL, 0xd9000000UL, 0x8e000000UL, 0x94000000UL,
838             0x9b000000UL, 0x1e000000UL, 0x87000000UL, 0xe9000000UL, 0xce000000UL, 0x55000000UL, 0x28000000UL, 0xdf000000UL,
839             0x8c000000UL, 0xa1000000UL, 0x89000000UL, 0x0d000000UL, 0xbf000000UL, 0xe6000000UL, 0x42000000UL, 0x68000000UL,
840             0x41000000UL, 0x99000000UL, 0x2d000000UL, 0x0f000000UL, 0xb0000000UL, 0x54000000UL, 0xbb000000UL, 0x16000000UL
841             };
842              
843             static const uint32 TD1[256] = {
844             0x5051f4a7UL, 0x537e4165UL, 0xc31a17a4UL, 0x963a275eUL,
845             0xcb3bab6bUL, 0xf11f9d45UL, 0xabacfa58UL, 0x934be303UL,
846             0x552030faUL, 0xf6ad766dUL, 0x9188cc76UL, 0x25f5024cUL,
847             0xfc4fe5d7UL, 0xd7c52acbUL, 0x80263544UL, 0x8fb562a3UL,
848             0x49deb15aUL, 0x6725ba1bUL, 0x9845ea0eUL, 0xe15dfec0UL,
849             0x02c32f75UL, 0x12814cf0UL, 0xa38d4697UL, 0xc66bd3f9UL,
850             0xe7038f5fUL, 0x9515929cUL, 0xebbf6d7aUL, 0xda955259UL,
851             0x2dd4be83UL, 0xd3587421UL, 0x2949e069UL, 0x448ec9c8UL,
852             0x6a75c289UL, 0x78f48e79UL, 0x6b99583eUL, 0xdd27b971UL,
853             0xb6bee14fUL, 0x17f088adUL, 0x66c920acUL, 0xb47dce3aUL,
854             0x1863df4aUL, 0x82e51a31UL, 0x60975133UL, 0x4562537fUL,
855             0xe0b16477UL, 0x84bb6baeUL, 0x1cfe81a0UL, 0x94f9082bUL,
856             0x58704868UL, 0x198f45fdUL, 0x8794de6cUL, 0xb7527bf8UL,
857             0x23ab73d3UL, 0xe2724b02UL, 0x57e31f8fUL, 0x2a6655abUL,
858             0x07b2eb28UL, 0x032fb5c2UL, 0x9a86c57bUL, 0xa5d33708UL,
859             0xf2302887UL, 0xb223bfa5UL, 0xba02036aUL, 0x5ced1682UL,
860             0x2b8acf1cUL, 0x92a779b4UL, 0xf0f307f2UL, 0xa14e69e2UL,
861             0xcd65daf4UL, 0xd50605beUL, 0x1fd13462UL, 0x8ac4a6feUL,
862             0x9d342e53UL, 0xa0a2f355UL, 0x32058ae1UL, 0x75a4f6ebUL,
863             0x390b83ecUL, 0xaa4060efUL, 0x065e719fUL, 0x51bd6e10UL,
864             0xf93e218aUL, 0x3d96dd06UL, 0xaedd3e05UL, 0x464de6bdUL,
865             0xb591548dUL, 0x0571c45dUL, 0x6f0406d4UL, 0xff605015UL,
866             0x241998fbUL, 0x97d6bde9UL, 0xcc894043UL, 0x7767d99eUL,
867             0xbdb0e842UL, 0x8807898bUL, 0x38e7195bUL, 0xdb79c8eeUL,
868             0x47a17c0aUL, 0xe97c420fUL, 0xc9f8841eUL, 0x00000000UL,
869             0x83098086UL, 0x48322bedUL, 0xac1e1170UL, 0x4e6c5a72UL,
870             0xfbfd0effUL, 0x560f8538UL, 0x1e3daed5UL, 0x27362d39UL,
871             0x640a0fd9UL, 0x21685ca6UL, 0xd19b5b54UL, 0x3a24362eUL,
872             0xb10c0a67UL, 0x0f9357e7UL, 0xd2b4ee96UL, 0x9e1b9b91UL,
873             0x4f80c0c5UL, 0xa261dc20UL, 0x695a774bUL, 0x161c121aUL,
874             0x0ae293baUL, 0xe5c0a02aUL, 0x433c22e0UL, 0x1d121b17UL,
875             0x0b0e090dUL, 0xadf28bc7UL, 0xb92db6a8UL, 0xc8141ea9UL,
876             0x8557f119UL, 0x4caf7507UL, 0xbbee99ddUL, 0xfda37f60UL,
877             0x9ff70126UL, 0xbc5c72f5UL, 0xc544663bUL, 0x345bfb7eUL,
878             0x768b4329UL, 0xdccb23c6UL, 0x68b6edfcUL, 0x63b8e4f1UL,
879             0xcad731dcUL, 0x10426385UL, 0x40139722UL, 0x2084c611UL,
880             0x7d854a24UL, 0xf8d2bb3dUL, 0x11aef932UL, 0x6dc729a1UL,
881             0x4b1d9e2fUL, 0xf3dcb230UL, 0xec0d8652UL, 0xd077c1e3UL,
882             0x6c2bb316UL, 0x99a970b9UL, 0xfa119448UL, 0x2247e964UL,
883             0xc4a8fc8cUL, 0x1aa0f03fUL, 0xd8567d2cUL, 0xef223390UL,
884             0xc787494eUL, 0xc1d938d1UL, 0xfe8ccaa2UL, 0x3698d40bUL,
885             0xcfa6f581UL, 0x28a57adeUL, 0x26dab78eUL, 0xa43fadbfUL,
886             0xe42c3a9dUL, 0x0d507892UL, 0x9b6a5fccUL, 0x62547e46UL,
887             0xc2f68d13UL, 0xe890d8b8UL, 0x5e2e39f7UL, 0xf582c3afUL,
888             0xbe9f5d80UL, 0x7c69d093UL, 0xa96fd52dUL, 0xb3cf2512UL,
889             0x3bc8ac99UL, 0xa710187dUL, 0x6ee89c63UL, 0x7bdb3bbbUL,
890             0x09cd2678UL, 0xf46e5918UL, 0x01ec9ab7UL, 0xa8834f9aUL,
891             0x65e6956eUL, 0x7eaaffe6UL, 0x0821bccfUL, 0xe6ef15e8UL,
892             0xd9bae79bUL, 0xce4a6f36UL, 0xd4ea9f09UL, 0xd629b07cUL,
893             0xaf31a4b2UL, 0x312a3f23UL, 0x30c6a594UL, 0xc035a266UL,
894             0x37744ebcUL, 0xa6fc82caUL, 0xb0e090d0UL, 0x1533a7d8UL,
895             0x4af10498UL, 0xf741ecdaUL, 0x0e7fcd50UL, 0x2f1791f6UL,
896             0x8d764dd6UL, 0x4d43efb0UL, 0x54ccaa4dUL, 0xdfe49604UL,
897             0xe39ed1b5UL, 0x1b4c6a88UL, 0xb8c12c1fUL, 0x7f466551UL,
898             0x049d5eeaUL, 0x5d018c35UL, 0x73fa8774UL, 0x2efb0b41UL,
899             0x5ab3671dUL, 0x5292dbd2UL, 0x33e91056UL, 0x136dd647UL,
900             0x8c9ad761UL, 0x7a37a10cUL, 0x8e59f814UL, 0x89eb133cUL,
901             0xeecea927UL, 0x35b761c9UL, 0xede11ce5UL, 0x3c7a47b1UL,
902             0x599cd2dfUL, 0x3f55f273UL, 0x791814ceUL, 0xbf73c737UL,
903             0xea53f7cdUL, 0x5b5ffdaaUL, 0x14df3d6fUL, 0x867844dbUL,
904             0x81caaff3UL, 0x3eb968c4UL, 0x2c382434UL, 0x5fc2a340UL,
905             0x72161dc3UL, 0x0cbce225UL, 0x8b283c49UL, 0x41ff0d95UL,
906             0x7139a801UL, 0xde080cb3UL, 0x9cd8b4e4UL, 0x906456c1UL,
907             0x617bcb84UL, 0x70d532b6UL, 0x74486c5cUL, 0x42d0b857UL,
908             };
909             static const uint32 TD2[256] = {
910             0xa75051f4UL, 0x65537e41UL, 0xa4c31a17UL, 0x5e963a27UL,
911             0x6bcb3babUL, 0x45f11f9dUL, 0x58abacfaUL, 0x03934be3UL,
912             0xfa552030UL, 0x6df6ad76UL, 0x769188ccUL, 0x4c25f502UL,
913             0xd7fc4fe5UL, 0xcbd7c52aUL, 0x44802635UL, 0xa38fb562UL,
914             0x5a49deb1UL, 0x1b6725baUL, 0x0e9845eaUL, 0xc0e15dfeUL,
915             0x7502c32fUL, 0xf012814cUL, 0x97a38d46UL, 0xf9c66bd3UL,
916             0x5fe7038fUL, 0x9c951592UL, 0x7aebbf6dUL, 0x59da9552UL,
917             0x832dd4beUL, 0x21d35874UL, 0x692949e0UL, 0xc8448ec9UL,
918             0x896a75c2UL, 0x7978f48eUL, 0x3e6b9958UL, 0x71dd27b9UL,
919             0x4fb6bee1UL, 0xad17f088UL, 0xac66c920UL, 0x3ab47dceUL,
920             0x4a1863dfUL, 0x3182e51aUL, 0x33609751UL, 0x7f456253UL,
921             0x77e0b164UL, 0xae84bb6bUL, 0xa01cfe81UL, 0x2b94f908UL,
922             0x68587048UL, 0xfd198f45UL, 0x6c8794deUL, 0xf8b7527bUL,
923             0xd323ab73UL, 0x02e2724bUL, 0x8f57e31fUL, 0xab2a6655UL,
924             0x2807b2ebUL, 0xc2032fb5UL, 0x7b9a86c5UL, 0x08a5d337UL,
925             0x87f23028UL, 0xa5b223bfUL, 0x6aba0203UL, 0x825ced16UL,
926             0x1c2b8acfUL, 0xb492a779UL, 0xf2f0f307UL, 0xe2a14e69UL,
927             0xf4cd65daUL, 0xbed50605UL, 0x621fd134UL, 0xfe8ac4a6UL,
928             0x539d342eUL, 0x55a0a2f3UL, 0xe132058aUL, 0xeb75a4f6UL,
929             0xec390b83UL, 0xefaa4060UL, 0x9f065e71UL, 0x1051bd6eUL,
930             0x8af93e21UL, 0x063d96ddUL, 0x05aedd3eUL, 0xbd464de6UL,
931             0x8db59154UL, 0x5d0571c4UL, 0xd46f0406UL, 0x15ff6050UL,
932             0xfb241998UL, 0xe997d6bdUL, 0x43cc8940UL, 0x9e7767d9UL,
933             0x42bdb0e8UL, 0x8b880789UL, 0x5b38e719UL, 0xeedb79c8UL,
934             0x0a47a17cUL, 0x0fe97c42UL, 0x1ec9f884UL, 0x00000000UL,
935             0x86830980UL, 0xed48322bUL, 0x70ac1e11UL, 0x724e6c5aUL,
936             0xfffbfd0eUL, 0x38560f85UL, 0xd51e3daeUL, 0x3927362dUL,
937             0xd9640a0fUL, 0xa621685cUL, 0x54d19b5bUL, 0x2e3a2436UL,
938             0x67b10c0aUL, 0xe70f9357UL, 0x96d2b4eeUL, 0x919e1b9bUL,
939             0xc54f80c0UL, 0x20a261dcUL, 0x4b695a77UL, 0x1a161c12UL,
940             0xba0ae293UL, 0x2ae5c0a0UL, 0xe0433c22UL, 0x171d121bUL,
941             0x0d0b0e09UL, 0xc7adf28bUL, 0xa8b92db6UL, 0xa9c8141eUL,
942             0x198557f1UL, 0x074caf75UL, 0xddbbee99UL, 0x60fda37fUL,
943             0x269ff701UL, 0xf5bc5c72UL, 0x3bc54466UL, 0x7e345bfbUL,
944             0x29768b43UL, 0xc6dccb23UL, 0xfc68b6edUL, 0xf163b8e4UL,
945             0xdccad731UL, 0x85104263UL, 0x22401397UL, 0x112084c6UL,
946             0x247d854aUL, 0x3df8d2bbUL, 0x3211aef9UL, 0xa16dc729UL,
947             0x2f4b1d9eUL, 0x30f3dcb2UL, 0x52ec0d86UL, 0xe3d077c1UL,
948             0x166c2bb3UL, 0xb999a970UL, 0x48fa1194UL, 0x642247e9UL,
949             0x8cc4a8fcUL, 0x3f1aa0f0UL, 0x2cd8567dUL, 0x90ef2233UL,
950             0x4ec78749UL, 0xd1c1d938UL, 0xa2fe8ccaUL, 0x0b3698d4UL,
951             0x81cfa6f5UL, 0xde28a57aUL, 0x8e26dab7UL, 0xbfa43fadUL,
952             0x9de42c3aUL, 0x920d5078UL, 0xcc9b6a5fUL, 0x4662547eUL,
953             0x13c2f68dUL, 0xb8e890d8UL, 0xf75e2e39UL, 0xaff582c3UL,
954             0x80be9f5dUL, 0x937c69d0UL, 0x2da96fd5UL, 0x12b3cf25UL,
955             0x993bc8acUL, 0x7da71018UL, 0x636ee89cUL, 0xbb7bdb3bUL,
956             0x7809cd26UL, 0x18f46e59UL, 0xb701ec9aUL, 0x9aa8834fUL,
957             0x6e65e695UL, 0xe67eaaffUL, 0xcf0821bcUL, 0xe8e6ef15UL,
958             0x9bd9bae7UL, 0x36ce4a6fUL, 0x09d4ea9fUL, 0x7cd629b0UL,
959             0xb2af31a4UL, 0x23312a3fUL, 0x9430c6a5UL, 0x66c035a2UL,
960             0xbc37744eUL, 0xcaa6fc82UL, 0xd0b0e090UL, 0xd81533a7UL,
961             0x984af104UL, 0xdaf741ecUL, 0x500e7fcdUL, 0xf62f1791UL,
962             0xd68d764dUL, 0xb04d43efUL, 0x4d54ccaaUL, 0x04dfe496UL,
963             0xb5e39ed1UL, 0x881b4c6aUL, 0x1fb8c12cUL, 0x517f4665UL,
964             0xea049d5eUL, 0x355d018cUL, 0x7473fa87UL, 0x412efb0bUL,
965             0x1d5ab367UL, 0xd25292dbUL, 0x5633e910UL, 0x47136dd6UL,
966             0x618c9ad7UL, 0x0c7a37a1UL, 0x148e59f8UL, 0x3c89eb13UL,
967             0x27eecea9UL, 0xc935b761UL, 0xe5ede11cUL, 0xb13c7a47UL,
968             0xdf599cd2UL, 0x733f55f2UL, 0xce791814UL, 0x37bf73c7UL,
969             0xcdea53f7UL, 0xaa5b5ffdUL, 0x6f14df3dUL, 0xdb867844UL,
970             0xf381caafUL, 0xc43eb968UL, 0x342c3824UL, 0x405fc2a3UL,
971             0xc372161dUL, 0x250cbce2UL, 0x498b283cUL, 0x9541ff0dUL,
972             0x017139a8UL, 0xb3de080cUL, 0xe49cd8b4UL, 0xc1906456UL,
973             0x84617bcbUL, 0xb670d532UL, 0x5c74486cUL, 0x5742d0b8UL,
974             };
975             static const uint32 TD3[256] = {
976             0xf4a75051UL, 0x4165537eUL, 0x17a4c31aUL, 0x275e963aUL,
977             0xab6bcb3bUL, 0x9d45f11fUL, 0xfa58abacUL, 0xe303934bUL,
978             0x30fa5520UL, 0x766df6adUL, 0xcc769188UL, 0x024c25f5UL,
979             0xe5d7fc4fUL, 0x2acbd7c5UL, 0x35448026UL, 0x62a38fb5UL,
980             0xb15a49deUL, 0xba1b6725UL, 0xea0e9845UL, 0xfec0e15dUL,
981             0x2f7502c3UL, 0x4cf01281UL, 0x4697a38dUL, 0xd3f9c66bUL,
982             0x8f5fe703UL, 0x929c9515UL, 0x6d7aebbfUL, 0x5259da95UL,
983             0xbe832dd4UL, 0x7421d358UL, 0xe0692949UL, 0xc9c8448eUL,
984             0xc2896a75UL, 0x8e7978f4UL, 0x583e6b99UL, 0xb971dd27UL,
985             0xe14fb6beUL, 0x88ad17f0UL, 0x20ac66c9UL, 0xce3ab47dUL,
986             0xdf4a1863UL, 0x1a3182e5UL, 0x51336097UL, 0x537f4562UL,
987             0x6477e0b1UL, 0x6bae84bbUL, 0x81a01cfeUL, 0x082b94f9UL,
988             0x48685870UL, 0x45fd198fUL, 0xde6c8794UL, 0x7bf8b752UL,
989             0x73d323abUL, 0x4b02e272UL, 0x1f8f57e3UL, 0x55ab2a66UL,
990             0xeb2807b2UL, 0xb5c2032fUL, 0xc57b9a86UL, 0x3708a5d3UL,
991             0x2887f230UL, 0xbfa5b223UL, 0x036aba02UL, 0x16825cedUL,
992             0xcf1c2b8aUL, 0x79b492a7UL, 0x07f2f0f3UL, 0x69e2a14eUL,
993             0xdaf4cd65UL, 0x05bed506UL, 0x34621fd1UL, 0xa6fe8ac4UL,
994             0x2e539d34UL, 0xf355a0a2UL, 0x8ae13205UL, 0xf6eb75a4UL,
995             0x83ec390bUL, 0x60efaa40UL, 0x719f065eUL, 0x6e1051bdUL,
996             0x218af93eUL, 0xdd063d96UL, 0x3e05aeddUL, 0xe6bd464dUL,
997             0x548db591UL, 0xc45d0571UL, 0x06d46f04UL, 0x5015ff60UL,
998             0x98fb2419UL, 0xbde997d6UL, 0x4043cc89UL, 0xd99e7767UL,
999             0xe842bdb0UL, 0x898b8807UL, 0x195b38e7UL, 0xc8eedb79UL,
1000             0x7c0a47a1UL, 0x420fe97cUL, 0x841ec9f8UL, 0x00000000UL,
1001             0x80868309UL, 0x2bed4832UL, 0x1170ac1eUL, 0x5a724e6cUL,
1002             0x0efffbfdUL, 0x8538560fUL, 0xaed51e3dUL, 0x2d392736UL,
1003             0x0fd9640aUL, 0x5ca62168UL, 0x5b54d19bUL, 0x362e3a24UL,
1004             0x0a67b10cUL, 0x57e70f93UL, 0xee96d2b4UL, 0x9b919e1bUL,
1005             0xc0c54f80UL, 0xdc20a261UL, 0x774b695aUL, 0x121a161cUL,
1006             0x93ba0ae2UL, 0xa02ae5c0UL, 0x22e0433cUL, 0x1b171d12UL,
1007             0x090d0b0eUL, 0x8bc7adf2UL, 0xb6a8b92dUL, 0x1ea9c814UL,
1008             0xf1198557UL, 0x75074cafUL, 0x99ddbbeeUL, 0x7f60fda3UL,
1009             0x01269ff7UL, 0x72f5bc5cUL, 0x663bc544UL, 0xfb7e345bUL,
1010             0x4329768bUL, 0x23c6dccbUL, 0xedfc68b6UL, 0xe4f163b8UL,
1011             0x31dccad7UL, 0x63851042UL, 0x97224013UL, 0xc6112084UL,
1012             0x4a247d85UL, 0xbb3df8d2UL, 0xf93211aeUL, 0x29a16dc7UL,
1013             0x9e2f4b1dUL, 0xb230f3dcUL, 0x8652ec0dUL, 0xc1e3d077UL,
1014             0xb3166c2bUL, 0x70b999a9UL, 0x9448fa11UL, 0xe9642247UL,
1015             0xfc8cc4a8UL, 0xf03f1aa0UL, 0x7d2cd856UL, 0x3390ef22UL,
1016             0x494ec787UL, 0x38d1c1d9UL, 0xcaa2fe8cUL, 0xd40b3698UL,
1017             0xf581cfa6UL, 0x7ade28a5UL, 0xb78e26daUL, 0xadbfa43fUL,
1018             0x3a9de42cUL, 0x78920d50UL, 0x5fcc9b6aUL, 0x7e466254UL,
1019             0x8d13c2f6UL, 0xd8b8e890UL, 0x39f75e2eUL, 0xc3aff582UL,
1020             0x5d80be9fUL, 0xd0937c69UL, 0xd52da96fUL, 0x2512b3cfUL,
1021             0xac993bc8UL, 0x187da710UL, 0x9c636ee8UL, 0x3bbb7bdbUL,
1022             0x267809cdUL, 0x5918f46eUL, 0x9ab701ecUL, 0x4f9aa883UL,
1023             0x956e65e6UL, 0xffe67eaaUL, 0xbccf0821UL, 0x15e8e6efUL,
1024             0xe79bd9baUL, 0x6f36ce4aUL, 0x9f09d4eaUL, 0xb07cd629UL,
1025             0xa4b2af31UL, 0x3f23312aUL, 0xa59430c6UL, 0xa266c035UL,
1026             0x4ebc3774UL, 0x82caa6fcUL, 0x90d0b0e0UL, 0xa7d81533UL,
1027             0x04984af1UL, 0xecdaf741UL, 0xcd500e7fUL, 0x91f62f17UL,
1028             0x4dd68d76UL, 0xefb04d43UL, 0xaa4d54ccUL, 0x9604dfe4UL,
1029             0xd1b5e39eUL, 0x6a881b4cUL, 0x2c1fb8c1UL, 0x65517f46UL,
1030             0x5eea049dUL, 0x8c355d01UL, 0x877473faUL, 0x0b412efbUL,
1031             0x671d5ab3UL, 0xdbd25292UL, 0x105633e9UL, 0xd647136dUL,
1032             0xd7618c9aUL, 0xa10c7a37UL, 0xf8148e59UL, 0x133c89ebUL,
1033             0xa927eeceUL, 0x61c935b7UL, 0x1ce5ede1UL, 0x47b13c7aUL,
1034             0xd2df599cUL, 0xf2733f55UL, 0x14ce7918UL, 0xc737bf73UL,
1035             0xf7cdea53UL, 0xfdaa5b5fUL, 0x3d6f14dfUL, 0x44db8678UL,
1036             0xaff381caUL, 0x68c43eb9UL, 0x24342c38UL, 0xa3405fc2UL,
1037             0x1dc37216UL, 0xe2250cbcUL, 0x3c498b28UL, 0x0d9541ffUL,
1038             0xa8017139UL, 0x0cb3de08UL, 0xb4e49cd8UL, 0x56c19064UL,
1039             0xcb84617bUL, 0x32b670d5UL, 0x6c5c7448UL, 0xb85742d0UL,
1040             };
1041              
1042             static const uint32 Tks0[] = {
1043             0x00000000UL, 0x0e090d0bUL, 0x1c121a16UL, 0x121b171dUL, 0x3824342cUL, 0x362d3927UL, 0x24362e3aUL, 0x2a3f2331UL,
1044             0x70486858UL, 0x7e416553UL, 0x6c5a724eUL, 0x62537f45UL, 0x486c5c74UL, 0x4665517fUL, 0x547e4662UL, 0x5a774b69UL,
1045             0xe090d0b0UL, 0xee99ddbbUL, 0xfc82caa6UL, 0xf28bc7adUL, 0xd8b4e49cUL, 0xd6bde997UL, 0xc4a6fe8aUL, 0xcaaff381UL,
1046             0x90d8b8e8UL, 0x9ed1b5e3UL, 0x8ccaa2feUL, 0x82c3aff5UL, 0xa8fc8cc4UL, 0xa6f581cfUL, 0xb4ee96d2UL, 0xbae79bd9UL,
1047             0xdb3bbb7bUL, 0xd532b670UL, 0xc729a16dUL, 0xc920ac66UL, 0xe31f8f57UL, 0xed16825cUL, 0xff0d9541UL, 0xf104984aUL,
1048             0xab73d323UL, 0xa57ade28UL, 0xb761c935UL, 0xb968c43eUL, 0x9357e70fUL, 0x9d5eea04UL, 0x8f45fd19UL, 0x814cf012UL,
1049             0x3bab6bcbUL, 0x35a266c0UL, 0x27b971ddUL, 0x29b07cd6UL, 0x038f5fe7UL, 0x0d8652ecUL, 0x1f9d45f1UL, 0x119448faUL,
1050             0x4be30393UL, 0x45ea0e98UL, 0x57f11985UL, 0x59f8148eUL, 0x73c737bfUL, 0x7dce3ab4UL, 0x6fd52da9UL, 0x61dc20a2UL,
1051             0xad766df6UL, 0xa37f60fdUL, 0xb16477e0UL, 0xbf6d7aebUL, 0x955259daUL, 0x9b5b54d1UL, 0x894043ccUL, 0x87494ec7UL,
1052             0xdd3e05aeUL, 0xd33708a5UL, 0xc12c1fb8UL, 0xcf2512b3UL, 0xe51a3182UL, 0xeb133c89UL, 0xf9082b94UL, 0xf701269fUL,
1053             0x4de6bd46UL, 0x43efb04dUL, 0x51f4a750UL, 0x5ffdaa5bUL, 0x75c2896aUL, 0x7bcb8461UL, 0x69d0937cUL, 0x67d99e77UL,
1054             0x3daed51eUL, 0x33a7d815UL, 0x21bccf08UL, 0x2fb5c203UL, 0x058ae132UL, 0x0b83ec39UL, 0x1998fb24UL, 0x1791f62fUL,
1055             0x764dd68dUL, 0x7844db86UL, 0x6a5fcc9bUL, 0x6456c190UL, 0x4e69e2a1UL, 0x4060efaaUL, 0x527bf8b7UL, 0x5c72f5bcUL,
1056             0x0605bed5UL, 0x080cb3deUL, 0x1a17a4c3UL, 0x141ea9c8UL, 0x3e218af9UL, 0x302887f2UL, 0x223390efUL, 0x2c3a9de4UL,
1057             0x96dd063dUL, 0x98d40b36UL, 0x8acf1c2bUL, 0x84c61120UL, 0xaef93211UL, 0xa0f03f1aUL, 0xb2eb2807UL, 0xbce2250cUL,
1058             0xe6956e65UL, 0xe89c636eUL, 0xfa877473UL, 0xf48e7978UL, 0xdeb15a49UL, 0xd0b85742UL, 0xc2a3405fUL, 0xccaa4d54UL,
1059             0x41ecdaf7UL, 0x4fe5d7fcUL, 0x5dfec0e1UL, 0x53f7cdeaUL, 0x79c8eedbUL, 0x77c1e3d0UL, 0x65daf4cdUL, 0x6bd3f9c6UL,
1060             0x31a4b2afUL, 0x3fadbfa4UL, 0x2db6a8b9UL, 0x23bfa5b2UL, 0x09808683UL, 0x07898b88UL, 0x15929c95UL, 0x1b9b919eUL,
1061             0xa17c0a47UL, 0xaf75074cUL, 0xbd6e1051UL, 0xb3671d5aUL, 0x99583e6bUL, 0x97513360UL, 0x854a247dUL, 0x8b432976UL,
1062             0xd134621fUL, 0xdf3d6f14UL, 0xcd267809UL, 0xc32f7502UL, 0xe9105633UL, 0xe7195b38UL, 0xf5024c25UL, 0xfb0b412eUL,
1063             0x9ad7618cUL, 0x94de6c87UL, 0x86c57b9aUL, 0x88cc7691UL, 0xa2f355a0UL, 0xacfa58abUL, 0xbee14fb6UL, 0xb0e842bdUL,
1064             0xea9f09d4UL, 0xe49604dfUL, 0xf68d13c2UL, 0xf8841ec9UL, 0xd2bb3df8UL, 0xdcb230f3UL, 0xcea927eeUL, 0xc0a02ae5UL,
1065             0x7a47b13cUL, 0x744ebc37UL, 0x6655ab2aUL, 0x685ca621UL, 0x42638510UL, 0x4c6a881bUL, 0x5e719f06UL, 0x5078920dUL,
1066             0x0a0fd964UL, 0x0406d46fUL, 0x161dc372UL, 0x1814ce79UL, 0x322bed48UL, 0x3c22e043UL, 0x2e39f75eUL, 0x2030fa55UL,
1067             0xec9ab701UL, 0xe293ba0aUL, 0xf088ad17UL, 0xfe81a01cUL, 0xd4be832dUL, 0xdab78e26UL, 0xc8ac993bUL, 0xc6a59430UL,
1068             0x9cd2df59UL, 0x92dbd252UL, 0x80c0c54fUL, 0x8ec9c844UL, 0xa4f6eb75UL, 0xaaffe67eUL, 0xb8e4f163UL, 0xb6edfc68UL,
1069             0x0c0a67b1UL, 0x02036abaUL, 0x10187da7UL, 0x1e1170acUL, 0x342e539dUL, 0x3a275e96UL, 0x283c498bUL, 0x26354480UL,
1070             0x7c420fe9UL, 0x724b02e2UL, 0x605015ffUL, 0x6e5918f4UL, 0x44663bc5UL, 0x4a6f36ceUL, 0x587421d3UL, 0x567d2cd8UL,
1071             0x37a10c7aUL, 0x39a80171UL, 0x2bb3166cUL, 0x25ba1b67UL, 0x0f853856UL, 0x018c355dUL, 0x13972240UL, 0x1d9e2f4bUL,
1072             0x47e96422UL, 0x49e06929UL, 0x5bfb7e34UL, 0x55f2733fUL, 0x7fcd500eUL, 0x71c45d05UL, 0x63df4a18UL, 0x6dd64713UL,
1073             0xd731dccaUL, 0xd938d1c1UL, 0xcb23c6dcUL, 0xc52acbd7UL, 0xef15e8e6UL, 0xe11ce5edUL, 0xf307f2f0UL, 0xfd0efffbUL,
1074             0xa779b492UL, 0xa970b999UL, 0xbb6bae84UL, 0xb562a38fUL, 0x9f5d80beUL, 0x91548db5UL, 0x834f9aa8UL, 0x8d4697a3UL
1075             };
1076              
1077             static const uint32 Tks1[] = {
1078             0x00000000UL, 0x0b0e090dUL, 0x161c121aUL, 0x1d121b17UL, 0x2c382434UL, 0x27362d39UL, 0x3a24362eUL, 0x312a3f23UL,
1079             0x58704868UL, 0x537e4165UL, 0x4e6c5a72UL, 0x4562537fUL, 0x74486c5cUL, 0x7f466551UL, 0x62547e46UL, 0x695a774bUL,
1080             0xb0e090d0UL, 0xbbee99ddUL, 0xa6fc82caUL, 0xadf28bc7UL, 0x9cd8b4e4UL, 0x97d6bde9UL, 0x8ac4a6feUL, 0x81caaff3UL,
1081             0xe890d8b8UL, 0xe39ed1b5UL, 0xfe8ccaa2UL, 0xf582c3afUL, 0xc4a8fc8cUL, 0xcfa6f581UL, 0xd2b4ee96UL, 0xd9bae79bUL,
1082             0x7bdb3bbbUL, 0x70d532b6UL, 0x6dc729a1UL, 0x66c920acUL, 0x57e31f8fUL, 0x5ced1682UL, 0x41ff0d95UL, 0x4af10498UL,
1083             0x23ab73d3UL, 0x28a57adeUL, 0x35b761c9UL, 0x3eb968c4UL, 0x0f9357e7UL, 0x049d5eeaUL, 0x198f45fdUL, 0x12814cf0UL,
1084             0xcb3bab6bUL, 0xc035a266UL, 0xdd27b971UL, 0xd629b07cUL, 0xe7038f5fUL, 0xec0d8652UL, 0xf11f9d45UL, 0xfa119448UL,
1085             0x934be303UL, 0x9845ea0eUL, 0x8557f119UL, 0x8e59f814UL, 0xbf73c737UL, 0xb47dce3aUL, 0xa96fd52dUL, 0xa261dc20UL,
1086             0xf6ad766dUL, 0xfda37f60UL, 0xe0b16477UL, 0xebbf6d7aUL, 0xda955259UL, 0xd19b5b54UL, 0xcc894043UL, 0xc787494eUL,
1087             0xaedd3e05UL, 0xa5d33708UL, 0xb8c12c1fUL, 0xb3cf2512UL, 0x82e51a31UL, 0x89eb133cUL, 0x94f9082bUL, 0x9ff70126UL,
1088             0x464de6bdUL, 0x4d43efb0UL, 0x5051f4a7UL, 0x5b5ffdaaUL, 0x6a75c289UL, 0x617bcb84UL, 0x7c69d093UL, 0x7767d99eUL,
1089             0x1e3daed5UL, 0x1533a7d8UL, 0x0821bccfUL, 0x032fb5c2UL, 0x32058ae1UL, 0x390b83ecUL, 0x241998fbUL, 0x2f1791f6UL,
1090             0x8d764dd6UL, 0x867844dbUL, 0x9b6a5fccUL, 0x906456c1UL, 0xa14e69e2UL, 0xaa4060efUL, 0xb7527bf8UL, 0xbc5c72f5UL,
1091             0xd50605beUL, 0xde080cb3UL, 0xc31a17a4UL, 0xc8141ea9UL, 0xf93e218aUL, 0xf2302887UL, 0xef223390UL, 0xe42c3a9dUL,
1092             0x3d96dd06UL, 0x3698d40bUL, 0x2b8acf1cUL, 0x2084c611UL, 0x11aef932UL, 0x1aa0f03fUL, 0x07b2eb28UL, 0x0cbce225UL,
1093             0x65e6956eUL, 0x6ee89c63UL, 0x73fa8774UL, 0x78f48e79UL, 0x49deb15aUL, 0x42d0b857UL, 0x5fc2a340UL, 0x54ccaa4dUL,
1094             0xf741ecdaUL, 0xfc4fe5d7UL, 0xe15dfec0UL, 0xea53f7cdUL, 0xdb79c8eeUL, 0xd077c1e3UL, 0xcd65daf4UL, 0xc66bd3f9UL,
1095             0xaf31a4b2UL, 0xa43fadbfUL, 0xb92db6a8UL, 0xb223bfa5UL, 0x83098086UL, 0x8807898bUL, 0x9515929cUL, 0x9e1b9b91UL,
1096             0x47a17c0aUL, 0x4caf7507UL, 0x51bd6e10UL, 0x5ab3671dUL, 0x6b99583eUL, 0x60975133UL, 0x7d854a24UL, 0x768b4329UL,
1097             0x1fd13462UL, 0x14df3d6fUL, 0x09cd2678UL, 0x02c32f75UL, 0x33e91056UL, 0x38e7195bUL, 0x25f5024cUL, 0x2efb0b41UL,
1098             0x8c9ad761UL, 0x8794de6cUL, 0x9a86c57bUL, 0x9188cc76UL, 0xa0a2f355UL, 0xabacfa58UL, 0xb6bee14fUL, 0xbdb0e842UL,
1099             0xd4ea9f09UL, 0xdfe49604UL, 0xc2f68d13UL, 0xc9f8841eUL, 0xf8d2bb3dUL, 0xf3dcb230UL, 0xeecea927UL, 0xe5c0a02aUL,
1100             0x3c7a47b1UL, 0x37744ebcUL, 0x2a6655abUL, 0x21685ca6UL, 0x10426385UL, 0x1b4c6a88UL, 0x065e719fUL, 0x0d507892UL,
1101             0x640a0fd9UL, 0x6f0406d4UL, 0x72161dc3UL, 0x791814ceUL, 0x48322bedUL, 0x433c22e0UL, 0x5e2e39f7UL, 0x552030faUL,
1102             0x01ec9ab7UL, 0x0ae293baUL, 0x17f088adUL, 0x1cfe81a0UL, 0x2dd4be83UL, 0x26dab78eUL, 0x3bc8ac99UL, 0x30c6a594UL,
1103             0x599cd2dfUL, 0x5292dbd2UL, 0x4f80c0c5UL, 0x448ec9c8UL, 0x75a4f6ebUL, 0x7eaaffe6UL, 0x63b8e4f1UL, 0x68b6edfcUL,
1104             0xb10c0a67UL, 0xba02036aUL, 0xa710187dUL, 0xac1e1170UL, 0x9d342e53UL, 0x963a275eUL, 0x8b283c49UL, 0x80263544UL,
1105             0xe97c420fUL, 0xe2724b02UL, 0xff605015UL, 0xf46e5918UL, 0xc544663bUL, 0xce4a6f36UL, 0xd3587421UL, 0xd8567d2cUL,
1106             0x7a37a10cUL, 0x7139a801UL, 0x6c2bb316UL, 0x6725ba1bUL, 0x560f8538UL, 0x5d018c35UL, 0x40139722UL, 0x4b1d9e2fUL,
1107             0x2247e964UL, 0x2949e069UL, 0x345bfb7eUL, 0x3f55f273UL, 0x0e7fcd50UL, 0x0571c45dUL, 0x1863df4aUL, 0x136dd647UL,
1108             0xcad731dcUL, 0xc1d938d1UL, 0xdccb23c6UL, 0xd7c52acbUL, 0xe6ef15e8UL, 0xede11ce5UL, 0xf0f307f2UL, 0xfbfd0effUL,
1109             0x92a779b4UL, 0x99a970b9UL, 0x84bb6baeUL, 0x8fb562a3UL, 0xbe9f5d80UL, 0xb591548dUL, 0xa8834f9aUL, 0xa38d4697UL
1110             };
1111              
1112             static const uint32 Tks2[] = {
1113             0x00000000UL, 0x0d0b0e09UL, 0x1a161c12UL, 0x171d121bUL, 0x342c3824UL, 0x3927362dUL, 0x2e3a2436UL, 0x23312a3fUL,
1114             0x68587048UL, 0x65537e41UL, 0x724e6c5aUL, 0x7f456253UL, 0x5c74486cUL, 0x517f4665UL, 0x4662547eUL, 0x4b695a77UL,
1115             0xd0b0e090UL, 0xddbbee99UL, 0xcaa6fc82UL, 0xc7adf28bUL, 0xe49cd8b4UL, 0xe997d6bdUL, 0xfe8ac4a6UL, 0xf381caafUL,
1116             0xb8e890d8UL, 0xb5e39ed1UL, 0xa2fe8ccaUL, 0xaff582c3UL, 0x8cc4a8fcUL, 0x81cfa6f5UL, 0x96d2b4eeUL, 0x9bd9bae7UL,
1117             0xbb7bdb3bUL, 0xb670d532UL, 0xa16dc729UL, 0xac66c920UL, 0x8f57e31fUL, 0x825ced16UL, 0x9541ff0dUL, 0x984af104UL,
1118             0xd323ab73UL, 0xde28a57aUL, 0xc935b761UL, 0xc43eb968UL, 0xe70f9357UL, 0xea049d5eUL, 0xfd198f45UL, 0xf012814cUL,
1119             0x6bcb3babUL, 0x66c035a2UL, 0x71dd27b9UL, 0x7cd629b0UL, 0x5fe7038fUL, 0x52ec0d86UL, 0x45f11f9dUL, 0x48fa1194UL,
1120             0x03934be3UL, 0x0e9845eaUL, 0x198557f1UL, 0x148e59f8UL, 0x37bf73c7UL, 0x3ab47dceUL, 0x2da96fd5UL, 0x20a261dcUL,
1121             0x6df6ad76UL, 0x60fda37fUL, 0x77e0b164UL, 0x7aebbf6dUL, 0x59da9552UL, 0x54d19b5bUL, 0x43cc8940UL, 0x4ec78749UL,
1122             0x05aedd3eUL, 0x08a5d337UL, 0x1fb8c12cUL, 0x12b3cf25UL, 0x3182e51aUL, 0x3c89eb13UL, 0x2b94f908UL, 0x269ff701UL,
1123             0xbd464de6UL, 0xb04d43efUL, 0xa75051f4UL, 0xaa5b5ffdUL, 0x896a75c2UL, 0x84617bcbUL, 0x937c69d0UL, 0x9e7767d9UL,
1124             0xd51e3daeUL, 0xd81533a7UL, 0xcf0821bcUL, 0xc2032fb5UL, 0xe132058aUL, 0xec390b83UL, 0xfb241998UL, 0xf62f1791UL,
1125             0xd68d764dUL, 0xdb867844UL, 0xcc9b6a5fUL, 0xc1906456UL, 0xe2a14e69UL, 0xefaa4060UL, 0xf8b7527bUL, 0xf5bc5c72UL,
1126             0xbed50605UL, 0xb3de080cUL, 0xa4c31a17UL, 0xa9c8141eUL, 0x8af93e21UL, 0x87f23028UL, 0x90ef2233UL, 0x9de42c3aUL,
1127             0x063d96ddUL, 0x0b3698d4UL, 0x1c2b8acfUL, 0x112084c6UL, 0x3211aef9UL, 0x3f1aa0f0UL, 0x2807b2ebUL, 0x250cbce2UL,
1128             0x6e65e695UL, 0x636ee89cUL, 0x7473fa87UL, 0x7978f48eUL, 0x5a49deb1UL, 0x5742d0b8UL, 0x405fc2a3UL, 0x4d54ccaaUL,
1129             0xdaf741ecUL, 0xd7fc4fe5UL, 0xc0e15dfeUL, 0xcdea53f7UL, 0xeedb79c8UL, 0xe3d077c1UL, 0xf4cd65daUL, 0xf9c66bd3UL,
1130             0xb2af31a4UL, 0xbfa43fadUL, 0xa8b92db6UL, 0xa5b223bfUL, 0x86830980UL, 0x8b880789UL, 0x9c951592UL, 0x919e1b9bUL,
1131             0x0a47a17cUL, 0x074caf75UL, 0x1051bd6eUL, 0x1d5ab367UL, 0x3e6b9958UL, 0x33609751UL, 0x247d854aUL, 0x29768b43UL,
1132             0x621fd134UL, 0x6f14df3dUL, 0x7809cd26UL, 0x7502c32fUL, 0x5633e910UL, 0x5b38e719UL, 0x4c25f502UL, 0x412efb0bUL,
1133             0x618c9ad7UL, 0x6c8794deUL, 0x7b9a86c5UL, 0x769188ccUL, 0x55a0a2f3UL, 0x58abacfaUL, 0x4fb6bee1UL, 0x42bdb0e8UL,
1134             0x09d4ea9fUL, 0x04dfe496UL, 0x13c2f68dUL, 0x1ec9f884UL, 0x3df8d2bbUL, 0x30f3dcb2UL, 0x27eecea9UL, 0x2ae5c0a0UL,
1135             0xb13c7a47UL, 0xbc37744eUL, 0xab2a6655UL, 0xa621685cUL, 0x85104263UL, 0x881b4c6aUL, 0x9f065e71UL, 0x920d5078UL,
1136             0xd9640a0fUL, 0xd46f0406UL, 0xc372161dUL, 0xce791814UL, 0xed48322bUL, 0xe0433c22UL, 0xf75e2e39UL, 0xfa552030UL,
1137             0xb701ec9aUL, 0xba0ae293UL, 0xad17f088UL, 0xa01cfe81UL, 0x832dd4beUL, 0x8e26dab7UL, 0x993bc8acUL, 0x9430c6a5UL,
1138             0xdf599cd2UL, 0xd25292dbUL, 0xc54f80c0UL, 0xc8448ec9UL, 0xeb75a4f6UL, 0xe67eaaffUL, 0xf163b8e4UL, 0xfc68b6edUL,
1139             0x67b10c0aUL, 0x6aba0203UL, 0x7da71018UL, 0x70ac1e11UL, 0x539d342eUL, 0x5e963a27UL, 0x498b283cUL, 0x44802635UL,
1140             0x0fe97c42UL, 0x02e2724bUL, 0x15ff6050UL, 0x18f46e59UL, 0x3bc54466UL, 0x36ce4a6fUL, 0x21d35874UL, 0x2cd8567dUL,
1141             0x0c7a37a1UL, 0x017139a8UL, 0x166c2bb3UL, 0x1b6725baUL, 0x38560f85UL, 0x355d018cUL, 0x22401397UL, 0x2f4b1d9eUL,
1142             0x642247e9UL, 0x692949e0UL, 0x7e345bfbUL, 0x733f55f2UL, 0x500e7fcdUL, 0x5d0571c4UL, 0x4a1863dfUL, 0x47136dd6UL,
1143             0xdccad731UL, 0xd1c1d938UL, 0xc6dccb23UL, 0xcbd7c52aUL, 0xe8e6ef15UL, 0xe5ede11cUL, 0xf2f0f307UL, 0xfffbfd0eUL,
1144             0xb492a779UL, 0xb999a970UL, 0xae84bb6bUL, 0xa38fb562UL, 0x80be9f5dUL, 0x8db59154UL, 0x9aa8834fUL, 0x97a38d46UL
1145             };
1146              
1147             static const uint32 Tks3[] = {
1148             0x00000000UL, 0x090d0b0eUL, 0x121a161cUL, 0x1b171d12UL, 0x24342c38UL, 0x2d392736UL, 0x362e3a24UL, 0x3f23312aUL,
1149             0x48685870UL, 0x4165537eUL, 0x5a724e6cUL, 0x537f4562UL, 0x6c5c7448UL, 0x65517f46UL, 0x7e466254UL, 0x774b695aUL,
1150             0x90d0b0e0UL, 0x99ddbbeeUL, 0x82caa6fcUL, 0x8bc7adf2UL, 0xb4e49cd8UL, 0xbde997d6UL, 0xa6fe8ac4UL, 0xaff381caUL,
1151             0xd8b8e890UL, 0xd1b5e39eUL, 0xcaa2fe8cUL, 0xc3aff582UL, 0xfc8cc4a8UL, 0xf581cfa6UL, 0xee96d2b4UL, 0xe79bd9baUL,
1152             0x3bbb7bdbUL, 0x32b670d5UL, 0x29a16dc7UL, 0x20ac66c9UL, 0x1f8f57e3UL, 0x16825cedUL, 0x0d9541ffUL, 0x04984af1UL,
1153             0x73d323abUL, 0x7ade28a5UL, 0x61c935b7UL, 0x68c43eb9UL, 0x57e70f93UL, 0x5eea049dUL, 0x45fd198fUL, 0x4cf01281UL,
1154             0xab6bcb3bUL, 0xa266c035UL, 0xb971dd27UL, 0xb07cd629UL, 0x8f5fe703UL, 0x8652ec0dUL, 0x9d45f11fUL, 0x9448fa11UL,
1155             0xe303934bUL, 0xea0e9845UL, 0xf1198557UL, 0xf8148e59UL, 0xc737bf73UL, 0xce3ab47dUL, 0xd52da96fUL, 0xdc20a261UL,
1156             0x766df6adUL, 0x7f60fda3UL, 0x6477e0b1UL, 0x6d7aebbfUL, 0x5259da95UL, 0x5b54d19bUL, 0x4043cc89UL, 0x494ec787UL,
1157             0x3e05aeddUL, 0x3708a5d3UL, 0x2c1fb8c1UL, 0x2512b3cfUL, 0x1a3182e5UL, 0x133c89ebUL, 0x082b94f9UL, 0x01269ff7UL,
1158             0xe6bd464dUL, 0xefb04d43UL, 0xf4a75051UL, 0xfdaa5b5fUL, 0xc2896a75UL, 0xcb84617bUL, 0xd0937c69UL, 0xd99e7767UL,
1159             0xaed51e3dUL, 0xa7d81533UL, 0xbccf0821UL, 0xb5c2032fUL, 0x8ae13205UL, 0x83ec390bUL, 0x98fb2419UL, 0x91f62f17UL,
1160             0x4dd68d76UL, 0x44db8678UL, 0x5fcc9b6aUL, 0x56c19064UL, 0x69e2a14eUL, 0x60efaa40UL, 0x7bf8b752UL, 0x72f5bc5cUL,
1161             0x05bed506UL, 0x0cb3de08UL, 0x17a4c31aUL, 0x1ea9c814UL, 0x218af93eUL, 0x2887f230UL, 0x3390ef22UL, 0x3a9de42cUL,
1162             0xdd063d96UL, 0xd40b3698UL, 0xcf1c2b8aUL, 0xc6112084UL, 0xf93211aeUL, 0xf03f1aa0UL, 0xeb2807b2UL, 0xe2250cbcUL,
1163             0x956e65e6UL, 0x9c636ee8UL, 0x877473faUL, 0x8e7978f4UL, 0xb15a49deUL, 0xb85742d0UL, 0xa3405fc2UL, 0xaa4d54ccUL,
1164             0xecdaf741UL, 0xe5d7fc4fUL, 0xfec0e15dUL, 0xf7cdea53UL, 0xc8eedb79UL, 0xc1e3d077UL, 0xdaf4cd65UL, 0xd3f9c66bUL,
1165             0xa4b2af31UL, 0xadbfa43fUL, 0xb6a8b92dUL, 0xbfa5b223UL, 0x80868309UL, 0x898b8807UL, 0x929c9515UL, 0x9b919e1bUL,
1166             0x7c0a47a1UL, 0x75074cafUL, 0x6e1051bdUL, 0x671d5ab3UL, 0x583e6b99UL, 0x51336097UL, 0x4a247d85UL, 0x4329768bUL,
1167             0x34621fd1UL, 0x3d6f14dfUL, 0x267809cdUL, 0x2f7502c3UL, 0x105633e9UL, 0x195b38e7UL, 0x024c25f5UL, 0x0b412efbUL,
1168             0xd7618c9aUL, 0xde6c8794UL, 0xc57b9a86UL, 0xcc769188UL, 0xf355a0a2UL, 0xfa58abacUL, 0xe14fb6beUL, 0xe842bdb0UL,
1169             0x9f09d4eaUL, 0x9604dfe4UL, 0x8d13c2f6UL, 0x841ec9f8UL, 0xbb3df8d2UL, 0xb230f3dcUL, 0xa927eeceUL, 0xa02ae5c0UL,
1170             0x47b13c7aUL, 0x4ebc3774UL, 0x55ab2a66UL, 0x5ca62168UL, 0x63851042UL, 0x6a881b4cUL, 0x719f065eUL, 0x78920d50UL,
1171             0x0fd9640aUL, 0x06d46f04UL, 0x1dc37216UL, 0x14ce7918UL, 0x2bed4832UL, 0x22e0433cUL, 0x39f75e2eUL, 0x30fa5520UL,
1172             0x9ab701ecUL, 0x93ba0ae2UL, 0x88ad17f0UL, 0x81a01cfeUL, 0xbe832dd4UL, 0xb78e26daUL, 0xac993bc8UL, 0xa59430c6UL,
1173             0xd2df599cUL, 0xdbd25292UL, 0xc0c54f80UL, 0xc9c8448eUL, 0xf6eb75a4UL, 0xffe67eaaUL, 0xe4f163b8UL, 0xedfc68b6UL,
1174             0x0a67b10cUL, 0x036aba02UL, 0x187da710UL, 0x1170ac1eUL, 0x2e539d34UL, 0x275e963aUL, 0x3c498b28UL, 0x35448026UL,
1175             0x420fe97cUL, 0x4b02e272UL, 0x5015ff60UL, 0x5918f46eUL, 0x663bc544UL, 0x6f36ce4aUL, 0x7421d358UL, 0x7d2cd856UL,
1176             0xa10c7a37UL, 0xa8017139UL, 0xb3166c2bUL, 0xba1b6725UL, 0x8538560fUL, 0x8c355d01UL, 0x97224013UL, 0x9e2f4b1dUL,
1177             0xe9642247UL, 0xe0692949UL, 0xfb7e345bUL, 0xf2733f55UL, 0xcd500e7fUL, 0xc45d0571UL, 0xdf4a1863UL, 0xd647136dUL,
1178             0x31dccad7UL, 0x38d1c1d9UL, 0x23c6dccbUL, 0x2acbd7c5UL, 0x15e8e6efUL, 0x1ce5ede1UL, 0x07f2f0f3UL, 0x0efffbfdUL,
1179             0x79b492a7UL, 0x70b999a9UL, 0x6bae84bbUL, 0x62a38fb5UL, 0x5d80be9fUL, 0x548db591UL, 0x4f9aa883UL, 0x4697a38dUL
1180             };
1181              
1182             # endif /* PS_AES_IMPROVE_PERF_INCREASE_CODESIZE */
1183              
1184             /******************************************************************************/
1185             /* Macros for above */
1186              
1187             # ifndef PS_AES_IMPROVE_PERF_INCREASE_CODESIZE
1188             # define Te0(x) TE0[x]
1189             # define Te1(x) ROR(TE0[x], 8)
1190             # define Te2(x) ROR(TE0[x], 16)
1191             # define Te3(x) ROR(TE0[x], 24)
1192             # define Td0(x) TD0[x]
1193             # define Td1(x) ROR(TD0[x], 8)
1194             # define Td2(x) ROR(TD0[x], 16)
1195             # define Td3(x) ROR(TD0[x], 24)
1196             # define Te4_0 0x000000FF & Te4
1197             # define Te4_1 0x0000FF00 & Te4
1198             # define Te4_2 0x00FF0000 & Te4
1199             # define Te4_3 0xFF000000 & Te4
1200             # else
1201             # define Te0(x) TE0[x]
1202             # define Te1(x) TE1[x]
1203             # define Te2(x) TE2[x]
1204             # define Te3(x) TE3[x]
1205             # define Td0(x) TD0[x]
1206             # define Td1(x) TD1[x]
1207             # define Td2(x) TD2[x]
1208             # define Td3(x) TD3[x]
1209             # endif
1210              
1211             /******************************************************************************/
1212             # ifdef USE_BURN_STACK
1213             static void _aes_ecb_encrypt(psAesKey_t *key, const unsigned char *pt,
1214             unsigned char *ct);
1215 4165032           void psAesEncryptBlock(psAesKey_t *key, const unsigned char *pt,
1216             unsigned char *ct)
1217             {
1218 4165032           _aes_ecb_encrypt(key, pt, ct);
1219 4165032           psBurnStack(sizeof(uint32) * 8 + sizeof(uint32 *) + sizeof(int32) * 2);
1220 4165032           }
1221 4165032           static void _aes_ecb_encrypt(psAesKey_t *key, const unsigned char *pt,
1222             unsigned char *ct)
1223             # else
1224             void psAesEncryptBlock(psAesKey_t *key, const unsigned char *pt,
1225             unsigned char *ct)
1226             # endif /* USE_BURN_STACK */
1227             {
1228             uint32_t s0, s1, s2, s3, t0, t1, t2, t3, *rk;
1229             int Nr, r;
1230              
1231             # ifdef CRYPTO_ASSERT
1232             if (pt == NULL || ct == NULL || key == NULL || key->type != PS_AES_ENCRYPT)
1233             {
1234             return;
1235             }
1236             # endif
1237              
1238 4165032           Nr = key->rounds;
1239 4165032           rk = key->skey;
1240              
1241             /* Map byte array block to cipher state and add initial round key */
1242 4165032           LOAD32H(s0, pt ); s0 ^= rk[0];
1243 4165032           LOAD32H(s1, pt + 4); s1 ^= rk[1];
1244 4165032           LOAD32H(s2, pt + 8); s2 ^= rk[2];
1245 4165032           LOAD32H(s3, pt + 12); s3 ^= rk[3];
1246              
1247             # ifndef PS_AES_IMPROVE_PERF_INCREASE_CODESIZE
1248             for (r = 0;; r++)
1249             {
1250             rk += 4;
1251             t0 =
1252             Te0(byte(s0, 3)) ^
1253             Te1(byte(s1, 2)) ^
1254             Te2(byte(s2, 1)) ^
1255             Te3(byte(s3, 0)) ^
1256             rk[0];
1257             t1 =
1258             Te0(byte(s1, 3)) ^
1259             Te1(byte(s2, 2)) ^
1260             Te2(byte(s3, 1)) ^
1261             Te3(byte(s0, 0)) ^
1262             rk[1];
1263             t2 =
1264             Te0(byte(s2, 3)) ^
1265             Te1(byte(s3, 2)) ^
1266             Te2(byte(s0, 1)) ^
1267             Te3(byte(s1, 0)) ^
1268             rk[2];
1269             t3 =
1270             Te0(byte(s3, 3)) ^
1271             Te1(byte(s0, 2)) ^
1272             Te2(byte(s1, 1)) ^
1273             Te3(byte(s2, 0)) ^
1274             rk[3];
1275             if (r == Nr - 2)
1276             {
1277             break;
1278             }
1279             s0 = t0; s1 = t1; s2 = t2; s3 = t3;
1280             }
1281             rk += 4;
1282             # else /* PS_AES_IMPROVE_PERF_INCREASE_CODESIZE */
1283              
1284             /* Nr - 1 full rounds */
1285 4165032           r = Nr >> 1;
1286             for (;; )
1287             {
1288              
1289 29155018           t0 =
1290 58310036           Te0(byte(s0, 3)) ^
1291 58310036           Te1(byte(s1, 2)) ^
1292 58310036           Te2(byte(s2, 1)) ^
1293 29155018           Te3(byte(s3, 0)) ^
1294 29155018           rk[4];
1295 29155018           t1 =
1296 58310036           Te0(byte(s1, 3)) ^
1297 58310036           Te1(byte(s2, 2)) ^
1298 58310036           Te2(byte(s3, 1)) ^
1299 29155018           Te3(byte(s0, 0)) ^
1300 29155018           rk[5];
1301 29155018           t2 =
1302 58310036           Te0(byte(s2, 3)) ^
1303 58310036           Te1(byte(s3, 2)) ^
1304 58310036           Te2(byte(s0, 1)) ^
1305 29155018           Te3(byte(s1, 0)) ^
1306 29155018           rk[6];
1307 29155018           t3 =
1308 58310036           Te0(byte(s3, 3)) ^
1309 58310036           Te1(byte(s0, 2)) ^
1310 58310036           Te2(byte(s1, 1)) ^
1311 29155018           Te3(byte(s2, 0)) ^
1312 29155018           rk[7];
1313              
1314 29155018           rk += 8;
1315 29155018 100         if (--r == 0)
1316             {
1317 4165032           break;
1318             }
1319              
1320 24989986           s0 =
1321 49979972           Te0(byte(t0, 3)) ^
1322 49979972           Te1(byte(t1, 2)) ^
1323 49979972           Te2(byte(t2, 1)) ^
1324 24989986           Te3(byte(t3, 0)) ^
1325 24989986           rk[0];
1326 24989986           s1 =
1327 49979972           Te0(byte(t1, 3)) ^
1328 49979972           Te1(byte(t2, 2)) ^
1329 49979972           Te2(byte(t3, 1)) ^
1330 24989986           Te3(byte(t0, 0)) ^
1331 24989986           rk[1];
1332 24989986           s2 =
1333 49979972           Te0(byte(t2, 3)) ^
1334 49979972           Te1(byte(t3, 2)) ^
1335 49979972           Te2(byte(t0, 1)) ^
1336 24989986           Te3(byte(t1, 0)) ^
1337 24989986           rk[2];
1338 24989986           s3 =
1339 49979972           Te0(byte(t3, 3)) ^
1340 49979972           Te1(byte(t0, 2)) ^
1341 49979972           Te2(byte(t1, 1)) ^
1342 24989986           Te3(byte(t2, 0)) ^
1343 24989986           rk[3];
1344 24989986           }
1345             # endif /* PS_AES_IMPROVE_PERF_INCREASE_CODESIZE */
1346              
1347             /* Apply last round and map cipher state to byte array block */
1348 4165032           s0 =
1349 8330064           (Te4_3[byte(t0, 3)]) ^
1350 8330064           (Te4_2[byte(t1, 2)]) ^
1351 8330064           (Te4_1[byte(t2, 1)]) ^
1352 4165032           (Te4_0[byte(t3, 0)]) ^
1353 4165032           rk[0];
1354 4165032           STORE32H(s0, ct);
1355 4165032           s1 =
1356 8330064           (Te4_3[byte(t1, 3)]) ^
1357 8330064           (Te4_2[byte(t2, 2)]) ^
1358 8330064           (Te4_1[byte(t3, 1)]) ^
1359 4165032           (Te4_0[byte(t0, 0)]) ^
1360 4165032           rk[1];
1361 4165032           STORE32H(s1, ct + 4);
1362 4165032           s2 =
1363 8330064           (Te4_3[byte(t2, 3)]) ^
1364 8330064           (Te4_2[byte(t3, 2)]) ^
1365 8330064           (Te4_1[byte(t0, 1)]) ^
1366 4165032           (Te4_0[byte(t1, 0)]) ^
1367 4165032           rk[2];
1368 4165032           STORE32H(s2, ct + 8);
1369 4165032           s3 =
1370 8330064           (Te4_3[byte(t3, 3)]) ^
1371 8330064           (Te4_2[byte(t0, 2)]) ^
1372 8330064           (Te4_1[byte(t1, 1)]) ^
1373 4165032           (Te4_0[byte(t2, 0)]) ^
1374 4165032           rk[3];
1375 4165032           STORE32H(s3, ct + 12);
1376 4165032           }
1377              
1378             # ifdef USE_BURN_STACK
1379             static void _aes_ecb_decrypt(psAesKey_t *key, const unsigned char *ct,
1380             unsigned char *pt);
1381 12           void psAesDecryptBlock(psAesKey_t *key, const unsigned char *ct,
1382             unsigned char *pt)
1383             {
1384 12           _aes_ecb_decrypt(key, ct, pt);
1385 12           psBurnStack(sizeof(uint32) * 8 + sizeof(uint32 *) + sizeof(int32) * 2);
1386 12           }
1387 12           static void _aes_ecb_decrypt(psAesKey_t *key, const unsigned char *ct,
1388             unsigned char *pt)
1389             # else
1390             void psAesDecryptBlock(psAesKey_t *key, const unsigned char *ct,
1391             unsigned char *pt)
1392             # endif /* USE_BURN_STACK */
1393             {
1394             uint32 s0, s1, s2, s3, t0, t1, t2, t3, *rk;
1395             int32 Nr, r;
1396              
1397             # ifdef CRYPTO_ASSERT
1398             if (pt == NULL || ct == NULL || key == NULL || key->type != PS_AES_DECRYPT)
1399             {
1400             return;
1401             }
1402             # endif
1403              
1404 12           Nr = key->rounds;
1405 12           rk = key->skey;
1406              
1407             /* Map byte array block to cipher state and add initial round key */
1408 12           LOAD32H(s0, ct ); s0 ^= rk[0];
1409 12           LOAD32H(s1, ct + 4); s1 ^= rk[1];
1410 12           LOAD32H(s2, ct + 8); s2 ^= rk[2];
1411 12           LOAD32H(s3, ct + 12); s3 ^= rk[3];
1412              
1413             # ifndef PS_AES_IMPROVE_PERF_INCREASE_CODESIZE
1414             for (r = 0;; r++)
1415             {
1416             rk += 4;
1417             t0 =
1418             Td0(byte(s0, 3)) ^
1419             Td1(byte(s3, 2)) ^
1420             Td2(byte(s2, 1)) ^
1421             Td3(byte(s1, 0)) ^
1422             rk[0];
1423             t1 =
1424             Td0(byte(s1, 3)) ^
1425             Td1(byte(s0, 2)) ^
1426             Td2(byte(s3, 1)) ^
1427             Td3(byte(s2, 0)) ^
1428             rk[1];
1429             t2 =
1430             Td0(byte(s2, 3)) ^
1431             Td1(byte(s1, 2)) ^
1432             Td2(byte(s0, 1)) ^
1433             Td3(byte(s3, 0)) ^
1434             rk[2];
1435             t3 =
1436             Td0(byte(s3, 3)) ^
1437             Td1(byte(s2, 2)) ^
1438             Td2(byte(s1, 1)) ^
1439             Td3(byte(s0, 0)) ^
1440             rk[3];
1441             if (r == Nr - 2)
1442             {
1443             break;
1444             }
1445             s0 = t0; s1 = t1; s2 = t2; s3 = t3;
1446             }
1447             rk += 4;
1448              
1449             # else /* PS_AES_IMPROVE_PERF_INCREASE_CODESIZE */
1450              
1451             /* Nr - 1 full rounds */
1452 12           r = Nr >> 1;
1453             for (;; )
1454             {
1455              
1456 84           t0 =
1457 168           Td0(byte(s0, 3)) ^
1458 168           Td1(byte(s3, 2)) ^
1459 168           Td2(byte(s2, 1)) ^
1460 84           Td3(byte(s1, 0)) ^
1461 84           rk[4];
1462 84           t1 =
1463 168           Td0(byte(s1, 3)) ^
1464 168           Td1(byte(s0, 2)) ^
1465 168           Td2(byte(s3, 1)) ^
1466 84           Td3(byte(s2, 0)) ^
1467 84           rk[5];
1468 84           t2 =
1469 168           Td0(byte(s2, 3)) ^
1470 168           Td1(byte(s1, 2)) ^
1471 168           Td2(byte(s0, 1)) ^
1472 84           Td3(byte(s3, 0)) ^
1473 84           rk[6];
1474 84           t3 =
1475 168           Td0(byte(s3, 3)) ^
1476 168           Td1(byte(s2, 2)) ^
1477 168           Td2(byte(s1, 1)) ^
1478 84           Td3(byte(s0, 0)) ^
1479 84           rk[7];
1480              
1481 84           rk += 8;
1482 84 100         if (--r == 0)
1483             {
1484 12           break;
1485             }
1486              
1487 72           s0 =
1488 144           Td0(byte(t0, 3)) ^
1489 144           Td1(byte(t3, 2)) ^
1490 144           Td2(byte(t2, 1)) ^
1491 72           Td3(byte(t1, 0)) ^
1492 72           rk[0];
1493 72           s1 =
1494 144           Td0(byte(t1, 3)) ^
1495 144           Td1(byte(t0, 2)) ^
1496 144           Td2(byte(t3, 1)) ^
1497 72           Td3(byte(t2, 0)) ^
1498 72           rk[1];
1499 72           s2 =
1500 144           Td0(byte(t2, 3)) ^
1501 144           Td1(byte(t1, 2)) ^
1502 144           Td2(byte(t0, 1)) ^
1503 72           Td3(byte(t3, 0)) ^
1504 72           rk[2];
1505 72           s3 =
1506 144           Td0(byte(t3, 3)) ^
1507 144           Td1(byte(t2, 2)) ^
1508 144           Td2(byte(t1, 1)) ^
1509 72           Td3(byte(t0, 0)) ^
1510 72           rk[3];
1511 72           }
1512             # endif /* PS_AES_IMPROVE_PERF_INCREASE_CODESIZE */
1513              
1514             /* Apply last round and map cipher state to byte array block */
1515 12           s0 =
1516 24           (Td4[byte(t0, 3)] & 0xff000000) ^
1517 24           (Td4[byte(t3, 2)] & 0x00ff0000) ^
1518 24           (Td4[byte(t2, 1)] & 0x0000ff00) ^
1519 12           (Td4[byte(t1, 0)] & 0x000000ff) ^
1520 12           rk[0];
1521 12           STORE32H(s0, pt);
1522 12           s1 =
1523 24           (Td4[byte(t1, 3)] & 0xff000000) ^
1524 24           (Td4[byte(t0, 2)] & 0x00ff0000) ^
1525 24           (Td4[byte(t3, 1)] & 0x0000ff00) ^
1526 12           (Td4[byte(t2, 0)] & 0x000000ff) ^
1527 12           rk[1];
1528 12           STORE32H(s1, pt + 4);
1529 12           s2 =
1530 24           (Td4[byte(t2, 3)] & 0xff000000) ^
1531 24           (Td4[byte(t1, 2)] & 0x00ff0000) ^
1532 24           (Td4[byte(t0, 1)] & 0x0000ff00) ^
1533 12           (Td4[byte(t3, 0)] & 0x000000ff) ^
1534 12           rk[2];
1535 12           STORE32H(s2, pt + 8);
1536 12           s3 =
1537 24           (Td4[byte(t3, 3)] & 0xff000000) ^
1538 24           (Td4[byte(t2, 2)] & 0x00ff0000) ^
1539 24           (Td4[byte(t1, 1)] & 0x0000ff00) ^
1540 12           (Td4[byte(t0, 0)] & 0x000000ff) ^
1541 12           rk[3];
1542 12           STORE32H(s3, pt + 12);
1543 12           }
1544              
1545             /******************************************************************************/
1546              
1547 55088           static uint32 setup_mix(uint32 temp)
1548             {
1549 55088           return (Te4_3[byte(temp, 2)]) ^
1550 110176           (Te4_2[byte(temp, 1)]) ^
1551 55088           (Te4_1[byte(temp, 0)]) ^
1552 55088           (Te4_0[byte(temp, 3)]);
1553             }
1554              
1555             # ifndef PS_AES_IMPROVE_PERF_INCREASE_CODESIZE
1556             static uint32 setup_mix2(uint32 temp)
1557             {
1558             return Td0(255 & Te4[byte(temp, 3)]) ^
1559             Td1(255 & Te4[byte(temp, 2)]) ^
1560             Td2(255 & Te4[byte(temp, 1)]) ^
1561             Td3(255 & Te4[byte(temp, 0)]);
1562             }
1563             # endif /* PS_AES_IMPROVE_PERF_INCREASE_CODESIZE */
1564              
1565             /******************************************************************************/
1566             /**
1567             Convert a forward (encrypt) key schedule into an inverse (decrypt)
1568             key schedule.
1569             @note Inline since it is only called from one internal function, and
1570             it can save some stack memory. Compiler optimization would probably
1571             inline this on its own anyway.
1572             */
1573 2           __inline static void invertKeySchedule(psAesKey_t *key)
1574             {
1575             int i;
1576             uint32 temp, *rk, *rrk;
1577             uint32 ek[64];
1578              
1579             /* Copy the current (encrypt key) to a temp buffer */
1580 2           memcpy(ek, key->skey, sizeof(ek));
1581 2           rk = key->skey;
1582 2           switch (key->rounds)
1583             {
1584             case 10:
1585 0           rrk = ek + 40;
1586 0           break;
1587             case 12:
1588 0           rrk = ek + 48;
1589 0           break;
1590             case 14:
1591 2           rrk = ek + 56;
1592 2           break;
1593             default:
1594 0           return;
1595             }
1596             /*
1597             apply the inverse MixColumn transform to all round keys but
1598             the first and the last:
1599             */
1600             /* copy first */
1601 2           *rk++ = *rrk++;
1602 2           *rk++ = *rrk++;
1603 2           *rk++ = *rrk++;
1604 2           *rk = *rrk;
1605 2           rk -= 3; rrk -= 3;
1606              
1607 28 100         for (i = 1; i < key->rounds; i++)
1608             {
1609 26           rrk -= 4;
1610 26           rk += 4;
1611             # ifndef PS_AES_IMPROVE_PERF_INCREASE_CODESIZE
1612             temp = rrk[0];
1613             rk[0] = setup_mix2(temp);
1614             temp = rrk[1];
1615             rk[1] = setup_mix2(temp);
1616             temp = rrk[2];
1617             rk[2] = setup_mix2(temp);
1618             temp = rrk[3];
1619             rk[3] = setup_mix2(temp);
1620             # else /* PS_AES_IMPROVE_PERF_INCREASE_CODESIZE */
1621 26           temp = rrk[0];
1622 26           rk[0] =
1623 52           Tks0[byte(temp, 3)] ^
1624 52           Tks1[byte(temp, 2)] ^
1625 52           Tks2[byte(temp, 1)] ^
1626 26           Tks3[byte(temp, 0)];
1627 26           temp = rrk[1];
1628 52           rk[1] =
1629 52           Tks0[byte(temp, 3)] ^
1630 52           Tks1[byte(temp, 2)] ^
1631 52           Tks2[byte(temp, 1)] ^
1632 26           Tks3[byte(temp, 0)];
1633 26           temp = rrk[2];
1634 52           rk[2] =
1635 52           Tks0[byte(temp, 3)] ^
1636 52           Tks1[byte(temp, 2)] ^
1637 52           Tks2[byte(temp, 1)] ^
1638 26           Tks3[byte(temp, 0)];
1639 26           temp = rrk[3];
1640 52           rk[3] =
1641 52           Tks0[byte(temp, 3)] ^
1642 52           Tks1[byte(temp, 2)] ^
1643 52           Tks2[byte(temp, 1)] ^
1644 26           Tks3[byte(temp, 0)];
1645             # endif /* PS_AES_IMPROVE_PERF_INCREASE_CODESIZE */
1646             }
1647              
1648             /* copy last */
1649 2           rrk -= 4;
1650 2           rk += 4;
1651 2           *rk++ = *rrk++;
1652 2           *rk++ = *rrk++;
1653 2           *rk++ = *rrk++;
1654 2           *rk = *rrk;
1655              
1656 2           memset_s(ek, sizeof(ek), 0x0, sizeof(ek));
1657             }
1658              
1659             #endif /* USE_MATRIX_AES_BLOCK */
1660              
1661             /******************************************************************************/
1662