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