~ubuntu-branches/ubuntu/precise/mysql-5.1/precise

« back to all changes in this revision

Viewing changes to mysys/rijndael.c

  • Committer: Bazaar Package Importer
  • Author(s): Norbert Tretkowski
  • Date: 2010-03-17 14:56:02 UTC
  • Revision ID: james.westby@ubuntu.com-20100317145602-x7e30l1b2sb5s6w6
Tags: upstream-5.1.45
ImportĀ upstreamĀ versionĀ 5.1.45

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Copyright (C) 2002, 2004 MySQL AB
 
2
 
 
3
 This program is free software; you can redistribute it and/or modify
 
4
 it under the terms of the GNU General Public License as published by
 
5
 the Free Software Foundation; version 2 of the License.
 
6
 
 
7
 This program is distributed in the hope that it will be useful,
 
8
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 
9
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
10
 GNU General Public License for more details.
 
11
 
 
12
 You should have received a copy of the GNU General Public License
 
13
 along with this program; if not, write to the Free Software
 
14
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
 
15
 
 
16
 
 
17
/*
 
18
  Based on version 3.0 (December 2000)
 
19
 
 
20
  Optimised ANSI C code for the Rijndael cipher (now AES)
 
21
 
 
22
  author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
 
23
  author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
 
24
  author Paulo Barreto <paulo.barreto@terra.com.br>
 
25
*/
 
26
 
 
27
#include <my_global.h>
 
28
#include "rijndael.h"
 
29
 
 
30
/*
 
31
  Define the following to use fastest and much larger code (~10K extra code)
 
32
  #define FULL_UNROLL
 
33
*/
 
34
 
 
35
 
 
36
#ifdef NOT_USED
 
37
Te0[x] = S [x].[02, 01, 01, 03];
 
38
Te1[x] = S [x].[03, 02, 01, 01];
 
39
Te2[x] = S [x].[01, 03, 02, 01];
 
40
Te3[x] = S [x].[01, 01, 03, 02];
 
41
Te4[x] = S [x].[01, 01, 01, 01];
 
42
 
 
43
Td0[x] = Si[x].[0e, 09, 0d, 0b];
 
44
Td1[x] = Si[x].[0b, 0e, 09, 0d];
 
45
Td2[x] = Si[x].[0d, 0b, 0e, 09];
 
46
Td3[x] = Si[x].[09, 0d, 0b, 0e];
 
47
Td4[x] = Si[x].[01, 01, 01, 01];
 
48
#endif
 
49
 
 
50
 
 
51
static const uint32 Te0[256]=
 
52
{
 
53
  0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
 
54
  0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
 
55
  0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
 
56
  0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
 
57
  0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
 
58
  0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
 
59
  0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
 
60
  0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
 
61
  0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
 
62
  0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
 
63
  0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
 
64
  0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
 
65
  0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
 
66
  0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
 
67
  0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
 
68
  0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
 
69
  0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
 
70
  0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
 
71
  0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
 
72
  0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
 
73
  0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
 
74
  0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
 
75
  0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
 
76
  0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
 
77
  0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
 
78
  0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
 
79
  0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
 
80
  0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
 
81
  0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
 
82
  0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
 
83
  0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
 
84
  0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
 
85
  0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
 
86
  0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
 
87
  0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
 
88
  0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
 
89
  0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
 
90
  0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
 
91
  0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
 
92
  0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
 
93
  0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
 
94
  0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
 
95
  0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
 
96
  0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
 
97
  0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
 
98
  0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
 
99
  0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
 
100
  0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
 
101
  0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
 
102
  0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
 
103
  0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
 
104
  0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
 
105
  0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
 
106
  0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
 
107
  0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
 
108
  0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
 
109
  0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
 
110
  0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
 
111
  0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
 
112
  0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
 
113
  0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
 
114
  0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
 
115
  0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
 
116
  0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
 
117
};
 
118
 
 
119
static const uint32 Te1[256]=
 
120
{
 
121
  0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,
 
122
  0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,
 
123
  0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,
 
124
  0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,
 
125
  0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
 
126
  0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,
 
127
  0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,
 
128
  0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,
 
129
  0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,
 
130
  0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
 
131
  0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,
 
132
  0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,
 
133
  0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,
 
134
  0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,
 
135
  0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
 
136
  0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,
 
137
  0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,
 
138
  0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,
 
139
  0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,
 
140
  0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
 
141
  0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,
 
142
  0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,
 
143
  0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,
 
144
  0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,
 
145
  0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
 
146
  0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,
 
147
  0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,
 
148
  0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,
 
149
  0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,
 
150
  0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
 
151
  0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,
 
152
  0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,
 
153
  0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,
 
154
  0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,
 
155
  0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
 
156
  0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,
 
157
  0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,
 
158
  0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,
 
159
  0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,
 
160
  0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
 
161
  0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,
 
162
  0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,
 
163
  0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,
 
164
  0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,
 
165
  0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
 
166
  0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,
 
167
  0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,
 
168
  0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,
 
169
  0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,
 
170
  0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
 
171
  0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,
 
172
  0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,
 
173
  0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,
 
174
  0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,
 
175
  0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
 
176
  0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,
 
177
  0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,
 
178
  0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,
 
179
  0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,
 
180
  0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
 
181
  0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,
 
182
  0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,
 
183
  0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,
 
184
  0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,
 
185
};
 
186
 
 
187
static const uint32 Te2[256]=
 
188
{
 
189
  0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,
 
190
  0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,
 
191
  0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,
 
192
  0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,
 
193
  0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
 
194
  0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,
 
195
  0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,
 
196
  0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,
 
197
  0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,
 
198
  0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
 
199
  0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,
 
200
  0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,
 
201
  0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,
 
202
  0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,
 
203
  0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
 
204
  0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,
 
205
  0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,
 
206
  0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,
 
207
  0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,
 
208
  0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
 
209
  0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,
 
210
  0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,
 
211
  0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,
 
212
  0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,
 
213
  0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
 
214
  0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,
 
215
  0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,
 
216
  0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,
 
217
  0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,
 
218
  0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
 
219
  0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,
 
220
  0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,
 
221
  0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,
 
222
  0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,
 
223
  0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
 
224
  0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,
 
225
  0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,
 
226
  0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,
 
227
  0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,
 
228
  0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
 
229
  0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,
 
230
  0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,
 
231
  0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,
 
232
  0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,
 
233
  0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
 
234
  0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,
 
235
  0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,
 
236
  0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,
 
237
  0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,
 
238
  0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
 
239
  0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,
 
240
  0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,
 
241
  0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,
 
242
  0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,
 
243
  0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
 
244
  0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,
 
245
  0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,
 
246
  0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,
 
247
  0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,
 
248
  0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
 
249
  0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,
 
250
  0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,
 
251
  0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,
 
252
  0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,
 
253
};
 
254
 
 
255
static const uint32 Te3[256]=
 
256
{
 
257
  0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,
 
258
  0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,
 
259
  0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,
 
260
  0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,
 
261
  0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
 
262
  0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,
 
263
  0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,
 
264
  0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,
 
265
  0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,
 
266
  0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
 
267
  0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,
 
268
  0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,
 
269
  0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,
 
270
  0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,
 
271
  0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
 
272
  0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,
 
273
  0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,
 
274
  0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,
 
275
  0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,
 
276
  0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
 
277
  0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,
 
278
  0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,
 
279
  0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,
 
280
  0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,
 
281
  0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
 
282
  0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,
 
283
  0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,
 
284
  0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,
 
285
  0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,
 
286
  0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
 
287
  0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,
 
288
  0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,
 
289
  0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,
 
290
  0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,
 
291
  0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
 
292
  0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,
 
293
  0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,
 
294
  0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,
 
295
  0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,
 
296
  0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
 
297
  0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,
 
298
  0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,
 
299
  0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,
 
300
  0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,
 
301
  0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
 
302
  0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,
 
303
  0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,
 
304
  0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,
 
305
  0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,
 
306
  0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
 
307
  0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,
 
308
  0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,
 
309
  0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,
 
310
  0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,
 
311
  0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
 
312
  0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,
 
313
  0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,
 
314
  0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,
 
315
  0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,
 
316
  0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
 
317
  0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,
 
318
  0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,
 
319
  0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,
 
320
  0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,
 
321
};
 
322
 
 
323
static const uint32 Te4[256]=
 
324
{
 
325
  0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU,
 
326
  0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U,
 
327
  0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU,
 
328
  0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U,
 
329
  0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU,
 
330
  0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U,
 
331
  0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU,
 
332
  0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U,
 
333
  0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U,
 
334
  0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU,
 
335
  0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U,
 
336
  0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U,
 
337
  0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U,
 
338
  0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU,
 
339
  0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U,
 
340
  0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U,
 
341
  0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU,
 
342
  0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U,
 
343
  0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U,
 
344
  0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U,
 
345
  0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU,
 
346
  0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU,
 
347
  0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U,
 
348
  0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU,
 
349
  0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU,
 
350
  0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U,
 
351
  0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU,
 
352
  0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U,
 
353
  0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU,
 
354
  0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U,
 
355
  0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U,
 
356
  0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U,
 
357
  0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU,
 
358
  0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U,
 
359
  0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU,
 
360
  0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U,
 
361
  0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU,
 
362
  0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U,
 
363
  0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U,
 
364
  0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU,
 
365
  0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU,
 
366
  0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU,
 
367
  0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U,
 
368
  0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U,
 
369
  0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU,
 
370
  0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U,
 
371
  0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU,
 
372
  0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U,
 
373
  0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU,
 
374
  0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U,
 
375
  0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU,
 
376
  0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU,
 
377
  0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U,
 
378
  0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU,
 
379
  0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U,
 
380
  0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU,
 
381
  0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U,
 
382
  0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U,
 
383
  0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U,
 
384
  0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU,
 
385
  0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU,
 
386
  0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U,
 
387
  0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU,
 
388
  0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U,
 
389
};
 
390
 
 
391
static const uint32 Td0[256]=
 
392
{
 
393
  0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
 
394
  0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
 
395
  0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
 
396
  0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,
 
397
  0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
 
398
  0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,
 
399
  0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,
 
400
  0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,
 
401
  0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,
 
402
  0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
 
403
  0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,
 
404
  0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,
 
405
  0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,
 
406
  0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,
 
407
  0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
 
408
  0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,
 
409
  0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,
 
410
  0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,
 
411
  0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,
 
412
  0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
 
413
  0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,
 
414
  0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,
 
415
  0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,
 
416
  0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,
 
417
  0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
 
418
  0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,
 
419
  0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,
 
420
  0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,
 
421
  0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,
 
422
  0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
 
423
  0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,
 
424
  0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,
 
425
  0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,
 
426
  0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,
 
427
  0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
 
428
  0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,
 
429
  0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,
 
430
  0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,
 
431
  0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,
 
432
  0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
 
433
  0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,
 
434
  0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,
 
435
  0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,
 
436
  0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,
 
437
  0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
 
438
  0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,
 
439
  0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,
 
440
  0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,
 
441
  0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,
 
442
  0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
 
443
  0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,
 
444
  0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,
 
445
  0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,
 
446
  0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,
 
447
  0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
 
448
  0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,
 
449
  0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,
 
450
  0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,
 
451
  0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,
 
452
  0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
 
453
  0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,
 
454
  0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,
 
455
  0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
 
456
  0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
 
457
};
 
458
 
 
459
static const uint32 Td1[256]=
 
460
{
 
461
  0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,
 
462
  0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,
 
463
  0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU,
 
464
  0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U,
 
465
  0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,
 
466
  0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U,
 
467
  0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U,
 
468
  0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U,
 
469
  0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U,
 
470
  0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,
 
471
  0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU,
 
472
  0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU,
 
473
  0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U,
 
474
  0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU,
 
475
  0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,
 
476
  0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U,
 
477
  0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U,
 
478
  0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU,
 
479
  0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU,
 
480
  0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,
 
481
  0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU,
 
482
  0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U,
 
483
  0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU,
 
484
  0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU,
 
485
  0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,
 
486
  0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U,
 
487
  0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U,
 
488
  0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU,
 
489
  0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U,
 
490
  0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,
 
491
  0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U,
 
492
  0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U,
 
493
  0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U,
 
494
  0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU,
 
495
  0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,
 
496
  0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U,
 
497
  0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U,
 
498
  0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U,
 
499
  0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U,
 
500
  0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,
 
501
  0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU,
 
502
  0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU,
 
503
  0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U,
 
504
  0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU,
 
505
  0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,
 
506
  0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU,
 
507
  0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU,
 
508
  0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U,
 
509
  0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU,
 
510
  0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,
 
511
  0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U,
 
512
  0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U,
 
513
  0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U,
 
514
  0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U,
 
515
  0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,
 
516
  0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U,
 
517
  0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU,
 
518
  0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U,
 
519
  0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U,
 
520
  0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,
 
521
  0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U,
 
522
  0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U,
 
523
  0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,
 
524
  0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,
 
525
};
 
526
 
 
527
static const uint32 Td2[256]=
 
528
{
 
529
  0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,
 
530
  0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,
 
531
  0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U,
 
532
  0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U,
 
533
  0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,
 
534
  0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U,
 
535
  0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U,
 
536
  0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U,
 
537
  0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U,
 
538
  0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,
 
539
  0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U,
 
540
  0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U,
 
541
  0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU,
 
542
  0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U,
 
543
  0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,
 
544
  0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U,
 
545
  0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U,
 
546
  0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U,
 
547
  0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U,
 
548
  0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,
 
549
 
 
550
  0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U,
 
551
  0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U,
 
552
  0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U,
 
553
  0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U,
 
554
  0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,
 
555
  0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU,
 
556
  0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU,
 
557
  0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U,
 
558
  0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU,
 
559
  0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,
 
560
  0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU,
 
561
  0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU,
 
562
  0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU,
 
563
  0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU,
 
564
  0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,
 
565
  0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U,
 
566
  0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U,
 
567
  0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U,
 
568
  0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U,
 
569
  0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,
 
570
  0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U,
 
571
  0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU,
 
572
  0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU,
 
573
  0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U,
 
574
  0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,
 
575
  0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU,
 
576
  0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU,
 
577
  0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U,
 
578
  0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U,
 
579
  0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,
 
580
  0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U,
 
581
  0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U,
 
582
  0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U,
 
583
  0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U,
 
584
  0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,
 
585
  0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U,
 
586
  0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U,
 
587
  0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U,
 
588
  0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U,
 
589
  0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,
 
590
  0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U,
 
591
  0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU,
 
592
  0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,
 
593
  0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,
 
594
};
 
595
 
 
596
static const uint32 Td3[256]=
 
597
{
 
598
  0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,
 
599
  0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,
 
600
  0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U,
 
601
  0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U,
 
602
  0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,
 
603
  0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU,
 
604
  0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U,
 
605
  0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU,
 
606
  0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U,
 
607
  0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,
 
608
  0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U,
 
609
  0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U,
 
610
  0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U,
 
611
  0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U,
 
612
  0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,
 
613
  0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU,
 
614
  0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU,
 
615
  0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U,
 
616
  0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U,
 
617
  0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,
 
618
  0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU,
 
619
  0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U,
 
620
  0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U,
 
621
  0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U,
 
622
  0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,
 
623
  0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU,
 
624
  0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U,
 
625
  0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U,
 
626
  0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU,
 
627
  0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,
 
628
  0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U,
 
629
  0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U,
 
630
  0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U,
 
631
  0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU,
 
632
  0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,
 
633
  0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U,
 
634
  0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U,
 
635
  0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U,
 
636
  0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U,
 
637
  0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,
 
638
  0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U,
 
639
  0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU,
 
640
  0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U,
 
641
  0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U,
 
642
  0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,
 
643
  0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU,
 
644
  0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U,
 
645
  0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU,
 
646
  0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U,
 
647
  0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,
 
648
  0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U,
 
649
  0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U,
 
650
  0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U,
 
651
  0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U,
 
652
  0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,
 
653
  0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU,
 
654
  0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU,
 
655
  0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU,
 
656
  0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U,
 
657
  0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,
 
658
  0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U,
 
659
  0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU,
 
660
  0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,
 
661
  0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,
 
662
};
 
663
 
 
664
static const uint32 Td4[256]=
 
665
{
 
666
  0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U,
 
667
  0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U,
 
668
  0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU,
 
669
  0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU,
 
670
  0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U,
 
671
  0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U,
 
672
  0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U,
 
673
  0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU,
 
674
  0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U,
 
675
  0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU,
 
676
  0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU,
 
677
  0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU,
 
678
  0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U,
 
679
  0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U,
 
680
  0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U,
 
681
  0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U,
 
682
  0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U,
 
683
  0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U,
 
684
  0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU,
 
685
  0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U,
 
686
  0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U,
 
687
  0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU,
 
688
  0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U,
 
689
  0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U,
 
690
  0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U,
 
691
  0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU,
 
692
  0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U,
 
693
  0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U,
 
694
  0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU,
 
695
  0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U,
 
696
  0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U,
 
697
  0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU,
 
698
  0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U,
 
699
  0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU,
 
700
  0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU,
 
701
  0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U,
 
702
  0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U,
 
703
  0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U,
 
704
  0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U,
 
705
  0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU,
 
706
  0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U,
 
707
  0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U,
 
708
  0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU,
 
709
  0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU,
 
710
  0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU,
 
711
  0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U,
 
712
  0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU,
 
713
  0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U,
 
714
  0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U,
 
715
  0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U,
 
716
  0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U,
 
717
  0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU,
 
718
  0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U,
 
719
  0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU,
 
720
  0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU,
 
721
  0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU,
 
722
  0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU,
 
723
  0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U,
 
724
  0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU,
 
725
  0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U,
 
726
  0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU,
 
727
  0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U,
 
728
  0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U,
 
729
  0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU,
 
730
};
 
731
 
 
732
 
 
733
/* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
 
734
static const uint32 rcon[]=
 
735
{
 
736
  0x01000000, 0x02000000, 0x04000000, 0x08000000,
 
737
  0x10000000, 0x20000000, 0x40000000, 0x80000000,
 
738
  0x1B000000, 0x36000000,
 
739
};
 
740
 
 
741
#if defined(_MSC_VER) && defined(__i386__)
 
742
 
 
743
#define RJ_SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00)
 
744
#define GETuint32(p) RJ_SWAP(*((uint32 *)(p)))
 
745
#define PUTuint32(ct, st) { *((uint32 *)(ct)) = RJ_SWAP((st)); }
 
746
 
 
747
#else
 
748
 
 
749
#define GETuint32(pt) (((uint32)(pt)[0] << 24) ^ ((uint32)(pt)[1] << 16)\
 
750
        ^ ((uint32)(pt)[2] <<  8) ^ ((uint32)(pt)[3]))
 
751
#define PUTuint32(ct, st) { (ct)[0] = (uint8)((st) >> 24); (ct)[1]\
 
752
= (uint8)((st) >> 16); (ct)[2] = (uint8)((st) >>  8); (ct)[3] = (uint8)(st); }
 
753
 
 
754
#endif /* defined(_MSC_VER) && defined(__i386__) */
 
755
 
 
756
 
 
757
/*
 
758
  Expand the cipher key into the encryption key schedule.
 
759
 
 
760
 RETURN
 
761
   The number of rounds for the given cipher key size.
 
762
*/
 
763
 
 
764
int rijndaelKeySetupEnc(uint32 rk[/*4*(Nr + 1)*/], const uint8 cipherKey[],
 
765
                        int keyBits)
 
766
{
 
767
  int i = 0;
 
768
  uint32 temp;
 
769
 
 
770
  rk[0] = GETuint32(cipherKey     );
 
771
  rk[1] = GETuint32(cipherKey +  4);
 
772
  rk[2] = GETuint32(cipherKey +  8);
 
773
  rk[3] = GETuint32(cipherKey + 12);
 
774
  if (keyBits == 128)
 
775
  {
 
776
    for (;;)
 
777
    {
 
778
      temp  = rk[3];
 
779
      rk[4] = (rk[0] ^
 
780
               (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
 
781
               (Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
 
782
               (Te4[(temp      ) & 0xff] & 0x0000ff00) ^
 
783
               (Te4[(temp >> 24)       ] & 0x000000ff) ^
 
784
               rcon[i]);
 
785
      rk[5] = rk[1] ^ rk[4];
 
786
      rk[6] = rk[2] ^ rk[5];
 
787
      rk[7] = rk[3] ^ rk[6];
 
788
      if (++i == 10)
 
789
        return 10;
 
790
      rk += 4;
 
791
    }
 
792
  }
 
793
  rk[4] = GETuint32(cipherKey + 16);
 
794
  rk[5] = GETuint32(cipherKey + 20);
 
795
  if (keyBits == 192)
 
796
  {
 
797
    for (;;)
 
798
    {
 
799
      temp = rk[ 5];
 
800
      rk[ 6] = (rk[ 0] ^
 
801
                (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
 
802
                (Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
 
803
                (Te4[(temp      ) & 0xff] & 0x0000ff00) ^
 
804
                (Te4[(temp >> 24)       ] & 0x000000ff) ^
 
805
                rcon[i]);
 
806
      rk[ 7] = rk[ 1] ^ rk[ 6];
 
807
      rk[ 8] = rk[ 2] ^ rk[ 7];
 
808
      rk[ 9] = rk[ 3] ^ rk[ 8];
 
809
      if (++i == 8)
 
810
      {
 
811
        return 12;
 
812
      }
 
813
      rk[10] = rk[ 4] ^ rk[ 9];
 
814
      rk[11] = rk[ 5] ^ rk[10];
 
815
      rk += 6;
 
816
    }
 
817
  }
 
818
  rk[6] = GETuint32(cipherKey + 24);
 
819
  rk[7] = GETuint32(cipherKey + 28);
 
820
  if (keyBits == 256)
 
821
  {
 
822
    for (;;)
 
823
    {
 
824
      temp = rk[ 7];
 
825
      rk[ 8] = (rk[ 0] ^
 
826
                (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
 
827
                (Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
 
828
                (Te4[(temp      ) & 0xff] & 0x0000ff00) ^
 
829
                (Te4[(temp >> 24)       ] & 0x000000ff) ^
 
830
                rcon[i]);
 
831
      rk[ 9] = rk[ 1] ^ rk[ 8];
 
832
      rk[10] = rk[ 2] ^ rk[ 9];
 
833
      rk[11] = rk[ 3] ^ rk[10];
 
834
      if (++i == 7)
 
835
      {
 
836
        return 14;
 
837
      }
 
838
      temp = rk[11];
 
839
      rk[12] = (rk[ 4] ^
 
840
                (Te4[(temp >> 24)       ] & 0xff000000) ^
 
841
                (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^
 
842
                (Te4[(temp >>  8) & 0xff] & 0x0000ff00) ^
 
843
                (Te4[(temp      ) & 0xff] & 0x000000ff));
 
844
      rk[13] = rk[ 5] ^ rk[12];
 
845
      rk[14] = rk[ 6] ^ rk[13];
 
846
      rk[15] = rk[ 7] ^ rk[14];
 
847
      rk += 8;
 
848
    }
 
849
  }
 
850
  return 0;
 
851
}
 
852
 
 
853
 
 
854
/*
 
855
  Expand the cipher key into the decryption key schedule.
 
856
 
 
857
  RETURN
 
858
    The number of rounds for the given cipher key size.
 
859
*/
 
860
 
 
861
int rijndaelKeySetupDec(uint32 rk[/*4*(Nr + 1)*/], const uint8 cipherKey[],
 
862
                        int keyBits)
 
863
{
 
864
  int nr, i, j;
 
865
  uint32 temp;
 
866
 
 
867
  /* expand the cipher key: */
 
868
  nr = rijndaelKeySetupEnc(rk, cipherKey, keyBits);
 
869
  /* invert the order of the round keys: */
 
870
  for (i = 0, j = 4*nr; i < j; i += 4, j -= 4)
 
871
  {
 
872
    temp = rk[i    ]; rk[i    ] = rk[j    ]; rk[j    ] = temp;
 
873
    temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
 
874
    temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
 
875
    temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
 
876
  }
 
877
  /*
 
878
    Apply the inverse MixColumn transform to all round keys but the first
 
879
    and the last:
 
880
  */
 
881
  for (i = 1; i < nr; i++)
 
882
  {
 
883
    rk += 4;
 
884
 
 
885
    rk[0]= (
 
886
            Td0[Te4[(rk[0] >> 24)         ] & 0xff] ^
 
887
            Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^
 
888
            Td2[Te4[(rk[0] >>  8) & 0xff] & 0xff] ^
 
889
            Td3[Te4[(rk[0]        ) & 0xff] & 0xff]);
 
890
 
 
891
    rk[1]= (Td0[Te4[(rk[1] >> 24)         ] & 0xff] ^
 
892
            Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^
 
893
            Td2[Te4[(rk[1] >>  8) & 0xff] & 0xff] ^
 
894
            Td3[Te4[(rk[1]        ) & 0xff] & 0xff]);
 
895
 
 
896
    rk[2]= (Td0[Te4[(rk[2] >> 24)         ] & 0xff] ^
 
897
            Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^
 
898
            Td2[Te4[(rk[2] >>  8) & 0xff] & 0xff] ^
 
899
            Td3[Te4[(rk[2]        ) & 0xff] & 0xff]);
 
900
 
 
901
    rk[3]= (Td0[Te4[(rk[3] >> 24)         ] & 0xff] ^
 
902
            Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^
 
903
            Td2[Te4[(rk[3] >>  8) & 0xff] & 0xff] ^
 
904
            Td3[Te4[(rk[3]        ) & 0xff] & 0xff]);
 
905
  }
 
906
  return nr;
 
907
}
 
908
 
 
909
 
 
910
void rijndaelEncrypt(const uint32 rk[/*4*(Nr + 1)*/], int Nr,
 
911
                     const uint8 pt[16], uint8 ct[16])
 
912
{
 
913
  uint32 s0, s1, s2, s3, t0, t1, t2, t3;
 
914
#ifndef FULL_UNROLL
 
915
  int r;
 
916
#endif /* FULL_UNROLL */
 
917
 
 
918
  /* map byte array block to cipher state and add initial round key: */
 
919
  s0 = GETuint32(pt     ) ^ rk[0];
 
920
  s1 = GETuint32(pt +  4) ^ rk[1];
 
921
  s2 = GETuint32(pt +  8) ^ rk[2];
 
922
  s3 = GETuint32(pt + 12) ^ rk[3];
 
923
 
 
924
#ifdef FULL_UNROLL
 
925
  /* round 1: */
 
926
  t0= (Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff]
 
927
       ^ Te3[s3 & 0xff] ^ rk[ 4]);
 
928
  t1= (Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff]
 
929
       ^ Te3[s0 & 0xff] ^ rk[ 5]);
 
930
  t2= (Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff]
 
931
       ^ Te3[s1 & 0xff] ^ rk[ 6]);
 
932
  t3= (Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff]
 
933
       ^ Te3[s2 & 0xff] ^ rk[ 7]);
 
934
 
 
935
  /* round 2: */
 
936
  s0= (Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff]
 
937
       ^ Te3[t3 & 0xff] ^ rk[ 8]);
 
938
  s1= (Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff]
 
939
       ^ Te3[t0 & 0xff] ^ rk[ 9]);
 
940
  s2= (Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff]
 
941
       ^ Te3[t1 & 0xff] ^ rk[10]);
 
942
  s3= (Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff]
 
943
       ^ Te3[t2 & 0xff] ^ rk[11]);
 
944
 
 
945
  /* round 3: */
 
946
  t0= (Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff]
 
947
       ^ Te3[s3 & 0xff] ^ rk[12]);
 
948
  t1= (Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff]
 
949
       ^ Te3[s0 & 0xff] ^ rk[13]);
 
950
  t2= (Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff]
 
951
       ^ Te3[s1 & 0xff] ^ rk[14]);
 
952
  t3= (Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff]
 
953
       ^ Te3[s2 & 0xff] ^ rk[15]);
 
954
 
 
955
  /* round 4: */
 
956
  s0= (Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff]
 
957
       ^ Te3[t3 & 0xff] ^ rk[16]);
 
958
  s1= (Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff]
 
959
       ^ Te3[t0 & 0xff] ^ rk[17]);
 
960
  s2= (Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff]
 
961
       ^ Te3[t1 & 0xff] ^ rk[18]);
 
962
  s3= (Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff]
 
963
       ^ Te3[t2 & 0xff] ^ rk[19]);
 
964
 
 
965
  /* round 5: */
 
966
  t0= (Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff]
 
967
       ^ Te3[s3 & 0xff] ^ rk[20]);
 
968
  t1= (Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff]
 
969
       ^ Te3[s0 & 0xff] ^ rk[21]);
 
970
  t2= (Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff]
 
971
       ^ Te3[s1 & 0xff] ^ rk[22]);
 
972
  t3= (Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff]
 
973
       ^ Te3[s2 & 0xff] ^ rk[23]);
 
974
 
 
975
  /* round 6: */
 
976
  s0= (Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff]
 
977
       ^ Te3[t3 & 0xff] ^ rk[24]);
 
978
  s1= (Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff]
 
979
       ^ Te3[t0 & 0xff] ^ rk[25]);
 
980
  s2= (Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff]
 
981
       ^ Te3[t1 & 0xff] ^ rk[26]);
 
982
  s3= (Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff]
 
983
       ^ Te3[t2 & 0xff] ^ rk[27]);
 
984
 
 
985
  /* round 7: */
 
986
  t0= (Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff]
 
987
       ^ Te3[s3 & 0xff] ^ rk[28]);
 
988
  t1= (Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff]
 
989
       ^ Te3[s0 & 0xff] ^ rk[29]);
 
990
  t2= (Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff]
 
991
       ^ Te3[s1 & 0xff] ^ rk[30]);
 
992
  t3= (Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff]
 
993
       ^ Te3[s2 & 0xff] ^ rk[31]);
 
994
 
 
995
  /* round 8: */
 
996
  s0= (Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff]
 
997
       ^ Te3[t3 & 0xff] ^ rk[32]);
 
998
  s1= (Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff]
 
999
       ^ Te3[t0 & 0xff] ^ rk[33]);
 
1000
  s2= (Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff]
 
1001
       ^ Te3[t1 & 0xff] ^ rk[34]);
 
1002
  s3= (Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff]
 
1003
       ^ Te3[t2 & 0xff] ^ rk[35]);
 
1004
 
 
1005
  /* round 9: */
 
1006
  t0= (Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff]
 
1007
       ^ Te3[s3 & 0xff] ^ rk[36]);
 
1008
  t1= (Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff]
 
1009
       ^ Te3[s0 & 0xff] ^ rk[37]);
 
1010
  t2= (Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff]
 
1011
       ^ Te3[s1 & 0xff] ^ rk[38]);
 
1012
  t3= (Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff]
 
1013
       ^ Te3[s2 & 0xff] ^ rk[39]);
 
1014
 
 
1015
  if (Nr > 10)
 
1016
  {
 
1017
    /* round 10: */
 
1018
    s0= (Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff]
 
1019
         ^ Te3[t3 & 0xff] ^ rk[40]);
 
1020
    s1= (Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff]
 
1021
         ^ Te3[t0 & 0xff] ^ rk[41]);
 
1022
    s2= (Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff]
 
1023
         ^ Te3[t1 & 0xff] ^ rk[42]);
 
1024
    s3= (Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff]
 
1025
         ^ Te3[t2 & 0xff] ^ rk[43]);
 
1026
 
 
1027
    /* round 11: */
 
1028
    t0= (Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff]
 
1029
         ^ Te3[s3 & 0xff] ^ rk[44]);
 
1030
    t1= (Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff]
 
1031
         ^ Te3[s0 & 0xff] ^ rk[45]);
 
1032
    t2= (Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff]
 
1033
         ^ Te3[s1 & 0xff] ^ rk[46]);
 
1034
    t3= (Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff]
 
1035
         ^ Te3[s2 & 0xff] ^ rk[47]);
 
1036
 
 
1037
    if (Nr > 12)
 
1038
    {
 
1039
      /* round 12: */
 
1040
      s0= (Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff]
 
1041
           ^ Te3[t3 & 0xff] ^ rk[48]);
 
1042
      s1= (Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff]
 
1043
           ^ Te3[t0 & 0xff] ^ rk[49]);
 
1044
      s2= (Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff]
 
1045
           ^ Te3[t1 & 0xff] ^ rk[50]);
 
1046
      s3= (Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff]
 
1047
           ^ Te3[t2 & 0xff] ^ rk[51]);
 
1048
 
 
1049
      /* round 13: */
 
1050
      t0= (Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff]
 
1051
           ^ Te3[s3 & 0xff] ^ rk[52]);
 
1052
      t1= (Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff]
 
1053
           ^ Te3[s0 & 0xff] ^ rk[53]);
 
1054
      t2= (Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff]
 
1055
           ^ Te3[s1 & 0xff] ^ rk[54]);
 
1056
      t3= (Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff]
 
1057
           ^ Te3[s2 & 0xff] ^ rk[55]);
 
1058
    }
 
1059
  }
 
1060
  rk += Nr << 2;
 
1061
#else  /* !FULL_UNROLL */
 
1062
 
 
1063
  /* Nr - 1 full rounds: */
 
1064
 
 
1065
  r = Nr >> 1;
 
1066
  for (;;)
 
1067
  {
 
1068
    t0= (Te0[(s0 >> 24)  ] ^
 
1069
         Te1[(s1 >> 16) & 0xff] ^
 
1070
         Te2[(s2 >>     8) & 0xff] ^
 
1071
         Te3[(s3         ) & 0xff] ^
 
1072
         rk[4]);
 
1073
 
 
1074
    t1= (Te0[(s1 >> 24)  ] ^
 
1075
         Te1[(s2 >> 16) & 0xff] ^
 
1076
         Te2[(s3 >>     8) & 0xff] ^
 
1077
         Te3[(s0         ) & 0xff] ^
 
1078
         rk[5]);
 
1079
 
 
1080
    t2= (Te0[(s2 >> 24)  ] ^
 
1081
         Te1[(s3 >> 16) & 0xff] ^
 
1082
         Te2[(s0 >>     8) & 0xff] ^
 
1083
         Te3[(s1         ) & 0xff] ^
 
1084
         rk[6]);
 
1085
 
 
1086
    t3= (Te0[(s3 >> 24)  ] ^
 
1087
         Te1[(s0 >> 16) & 0xff] ^
 
1088
         Te2[(s1 >>     8) & 0xff] ^
 
1089
         Te3[(s2         ) & 0xff] ^
 
1090
         rk[7]);
 
1091
 
 
1092
    rk+= 8;
 
1093
    if (--r == 0)
 
1094
      break;
 
1095
 
 
1096
    s0= (Te0[(t0 >> 24)  ] ^
 
1097
         Te1[(t1 >> 16) & 0xff] ^
 
1098
         Te2[(t2 >>     8) & 0xff] ^
 
1099
         Te3[(t3         ) & 0xff] ^
 
1100
         rk[0]);
 
1101
 
 
1102
    s1= (Te0[(t1 >> 24)  ] ^
 
1103
         Te1[(t2 >> 16) & 0xff] ^
 
1104
         Te2[(t3 >>     8) & 0xff] ^
 
1105
         Te3[(t0         ) & 0xff] ^
 
1106
         rk[1]);
 
1107
 
 
1108
    s2= (Te0[(t2 >> 24)  ] ^
 
1109
         Te1[(t3 >> 16) & 0xff] ^
 
1110
         Te2[(t0 >>     8) & 0xff] ^
 
1111
         Te3[(t1         ) & 0xff] ^
 
1112
         rk[2]);
 
1113
 
 
1114
    s3= (Te0[(t3 >> 24)  ] ^
 
1115
         Te1[(t0 >> 16) & 0xff] ^
 
1116
         Te2[(t1 >>     8) & 0xff] ^
 
1117
         Te3[(t2         ) & 0xff] ^
 
1118
         rk[3]);
 
1119
  }
 
1120
#endif /* FULL_UNROLL */
 
1121
 
 
1122
  /* Apply last round and map cipher state to byte array block: */
 
1123
  s0= ((Te4[(t0 >> 24)  ] & 0xff000000) ^
 
1124
       (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
 
1125
       (Te4[(t2 >>  8) & 0xff] & 0x0000ff00) ^
 
1126
       (Te4[(t3 ) & 0xff] & 0x000000ff) ^
 
1127
       rk[0]);
 
1128
  PUTuint32(ct     , s0);
 
1129
 
 
1130
  s1= ((Te4[(t1 >> 24)  ] & 0xff000000) ^
 
1131
       (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
 
1132
       (Te4[(t3 >>  8) & 0xff] & 0x0000ff00) ^
 
1133
       (Te4[(t0 ) & 0xff] & 0x000000ff) ^
 
1134
       rk[1]);
 
1135
  PUTuint32(ct +  4, s1);
 
1136
 
 
1137
  s2= ((Te4[(t2 >> 24)  ] & 0xff000000) ^
 
1138
       (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
 
1139
       (Te4[(t0 >>  8) & 0xff] & 0x0000ff00) ^
 
1140
       (Te4[(t1 ) & 0xff] & 0x000000ff) ^
 
1141
       rk[2]);
 
1142
  PUTuint32(ct +  8, s2);
 
1143
 
 
1144
  s3= ((Te4[(t3 >> 24)  ] & 0xff000000) ^
 
1145
       (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
 
1146
       (Te4[(t1 >>  8) & 0xff] & 0x0000ff00) ^
 
1147
       (Te4[(t2 ) & 0xff] & 0x000000ff) ^
 
1148
       rk[3]);
 
1149
  PUTuint32(ct + 12, s3);
 
1150
}
 
1151
 
 
1152
 
 
1153
void rijndaelDecrypt(const uint32 rk[/*4*(Nr + 1)*/], int Nr,
 
1154
                     const uint8 ct[16], uint8 pt[16])
 
1155
{
 
1156
  uint32 s0, s1, s2, s3, t0, t1, t2, t3;
 
1157
#ifndef FULL_UNROLL
 
1158
  int r;
 
1159
#endif /* FULL_UNROLL */
 
1160
 
 
1161
  /* Map byte array block to cipher state and add initial round key: */
 
1162
 
 
1163
  s0 = GETuint32(ct     ) ^ rk[0];
 
1164
  s1 = GETuint32(ct +  4) ^ rk[1];
 
1165
  s2 = GETuint32(ct +  8) ^ rk[2];
 
1166
  s3 = GETuint32(ct + 12) ^ rk[3];
 
1167
 
 
1168
#ifdef FULL_UNROLL
 
1169
  /* round 1: */
 
1170
  t0= (Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff]
 
1171
       ^ Td3[s1 & 0xff] ^ rk[ 4]);
 
1172
  t1= (Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff]
 
1173
       ^ Td3[s2 & 0xff] ^ rk[ 5]);
 
1174
  t2= (Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff]
 
1175
       ^ Td3[s3 & 0xff] ^ rk[ 6]);
 
1176
  t3= (Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff]
 
1177
       ^ Td3[s0 & 0xff] ^ rk[ 7]);
 
1178
 
 
1179
  /* round 2: */
 
1180
  s0= (Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff]
 
1181
       ^ Td3[t1 & 0xff] ^ rk[ 8]);
 
1182
  s1= (Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff]
 
1183
       ^ Td3[t2 & 0xff] ^ rk[ 9]);
 
1184
  s2= (Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff]
 
1185
       ^ Td3[t3 & 0xff] ^ rk[10]);
 
1186
  s3= (Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff]
 
1187
       ^ Td3[t0 & 0xff] ^ rk[11]);
 
1188
 
 
1189
  /* round 3: */
 
1190
  t0= (Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff]
 
1191
       ^ Td3[s1 & 0xff] ^ rk[12]);
 
1192
  t1= (Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff]
 
1193
       ^ Td3[s2 & 0xff] ^ rk[13]);
 
1194
  t2= (Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff]
 
1195
       ^ Td3[s3 & 0xff] ^ rk[14]);
 
1196
  t3= (Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff]
 
1197
       ^ Td3[s0 & 0xff] ^ rk[15]);
 
1198
 
 
1199
  /* round 4: */
 
1200
  s0= (Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff]
 
1201
       ^ Td3[t1 & 0xff] ^ rk[16]);
 
1202
  s1= (Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff]
 
1203
       ^ Td3[t2 & 0xff] ^ rk[17]);
 
1204
  s2= (Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff]
 
1205
       ^ Td3[t3 & 0xff] ^ rk[18]);
 
1206
  s3= (Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff]
 
1207
       ^ Td3[t0 & 0xff] ^ rk[19]);
 
1208
 
 
1209
  /* round 5: */
 
1210
  t0= (Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff]
 
1211
       ^ Td3[s1 & 0xff] ^ rk[20]);
 
1212
  t1= (Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff]
 
1213
       ^ Td3[s2 & 0xff] ^ rk[21]);
 
1214
  t2= (Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff]
 
1215
       ^ Td3[s3 & 0xff] ^ rk[22]);
 
1216
  t3= (Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff]
 
1217
       ^ Td3[s0 & 0xff] ^ rk[23]);
 
1218
 
 
1219
  /* round 6: */
 
1220
  s0= (Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff]
 
1221
       ^ Td3[t1 & 0xff] ^ rk[24]);
 
1222
  s1= (Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff]
 
1223
       ^ Td3[t2 & 0xff] ^ rk[25]);
 
1224
  s2= (Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff]
 
1225
       ^ Td3[t3 & 0xff] ^ rk[26]);
 
1226
  s3= (Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff]
 
1227
       ^ Td3[t0 & 0xff] ^ rk[27]);
 
1228
 
 
1229
  /* round 7: */
 
1230
  t0= (Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff]
 
1231
       ^ Td3[s1 & 0xff] ^ rk[28]);
 
1232
  t1= (Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff]
 
1233
       ^ Td3[s2 & 0xff] ^ rk[29]);
 
1234
  t2= (Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff]
 
1235
       ^ Td3[s3 & 0xff] ^ rk[30]);
 
1236
  t3= (Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff]
 
1237
       ^ Td3[s0 & 0xff] ^ rk[31]);
 
1238
 
 
1239
  /* round 8: */
 
1240
  s0= (Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff]
 
1241
       ^ Td3[t1 & 0xff] ^ rk[32]);
 
1242
  s1= (Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff]
 
1243
       ^ Td3[t2 & 0xff] ^ rk[33]);
 
1244
  s2= (Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff]
 
1245
       ^ Td3[t3 & 0xff] ^ rk[34]);
 
1246
  s3= (Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff]
 
1247
       ^ Td3[t0 & 0xff] ^ rk[35]);
 
1248
 
 
1249
  /* round 9: */
 
1250
  t0= (Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff]
 
1251
       ^ Td3[s1 & 0xff] ^ rk[36]);
 
1252
  t1= (Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff]
 
1253
       ^ Td3[s2 & 0xff] ^ rk[37]);
 
1254
  t2= (Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff]
 
1255
       ^ Td3[s3 & 0xff] ^ rk[38]);
 
1256
  t3= (Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff]
 
1257
       ^ Td3[s0 & 0xff] ^ rk[39]);
 
1258
 
 
1259
  if (Nr > 10)
 
1260
  {
 
1261
    /* round 10: */
 
1262
    s0= (Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff]
 
1263
         ^ Td3[t1 & 0xff] ^ rk[40]);
 
1264
    s1= (Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff]
 
1265
         ^ Td3[t2 & 0xff] ^ rk[41]);
 
1266
    s2= (Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff]
 
1267
         ^ Td3[t3 & 0xff] ^ rk[42]);
 
1268
    s3= (Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff]
 
1269
         ^ Td3[t0 & 0xff] ^ rk[43]);
 
1270
 
 
1271
    /* round 11: */
 
1272
    t0= (Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff]
 
1273
         ^ Td3[s1 & 0xff] ^ rk[44]);
 
1274
    t1= (Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff]
 
1275
         ^ Td3[s2 & 0xff] ^ rk[45]);
 
1276
    t2= (Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff]
 
1277
         ^ Td3[s3 & 0xff] ^ rk[46]);
 
1278
    t3= (Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff]
 
1279
         ^ Td3[s0 & 0xff] ^ rk[47]);
 
1280
 
 
1281
    if (Nr > 12)
 
1282
    {
 
1283
      /* round 12: */
 
1284
      s0= (Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff]
 
1285
           ^ Td3[t1 & 0xff] ^ rk[48]);
 
1286
      s1= (Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff]
 
1287
           ^ Td3[t2 & 0xff] ^ rk[49]);
 
1288
      s2= (Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff]
 
1289
           ^ Td3[t3 & 0xff] ^ rk[50]);
 
1290
      s3= (Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff]
 
1291
           ^ Td3[t0 & 0xff] ^ rk[51]);
 
1292
 
 
1293
      /* round 13: */
 
1294
      t0= (Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff]
 
1295
           ^ Td3[s1 & 0xff] ^ rk[52]);
 
1296
      t1= (Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff]
 
1297
           ^ Td3[s2 & 0xff] ^ rk[53]);
 
1298
      t2= (Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff]
 
1299
           ^ Td3[s3 & 0xff] ^ rk[54]);
 
1300
      t3= (Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff]
 
1301
           ^ Td3[s0 & 0xff] ^ rk[55]);
 
1302
    }
 
1303
  }
 
1304
  rk += Nr << 2;
 
1305
#else  /* !FULL_UNROLL */
 
1306
 
 
1307
  /* Nr - 1 full rounds: */
 
1308
  r= (Nr >> 1);
 
1309
  for (;;)
 
1310
  {
 
1311
    t0= (Td0[(s0 >> 24)  ] ^
 
1312
         Td1[(s3 >> 16) & 0xff] ^
 
1313
         Td2[(s2 >>     8) & 0xff] ^
 
1314
         Td3[(s1         ) & 0xff] ^
 
1315
         rk[4]);
 
1316
 
 
1317
    t1= (Td0[(s1 >> 24)  ] ^
 
1318
         Td1[(s0 >> 16) & 0xff] ^
 
1319
         Td2[(s3 >>     8) & 0xff] ^
 
1320
         Td3[(s2         ) & 0xff] ^
 
1321
         rk[5]);
 
1322
 
 
1323
    t2= (Td0[(s2 >> 24)  ] ^
 
1324
         Td1[(s1 >> 16) & 0xff] ^
 
1325
         Td2[(s0 >>     8) & 0xff] ^
 
1326
         Td3[(s3         ) & 0xff] ^
 
1327
         rk[6]);
 
1328
 
 
1329
    t3= (Td0[(s3 >> 24)  ] ^
 
1330
         Td1[(s2 >> 16) & 0xff] ^
 
1331
         Td2[(s1 >>     8) & 0xff] ^
 
1332
         Td3[(s0         ) & 0xff] ^
 
1333
         rk[7]);
 
1334
 
 
1335
    rk+= 8;
 
1336
    if (--r == 0)
 
1337
      break;
 
1338
 
 
1339
    s0= (Td0[(t0 >> 24)  ] ^
 
1340
         Td1[(t3 >> 16) & 0xff] ^
 
1341
         Td2[(t2 >>     8) & 0xff] ^
 
1342
         Td3[(t1         ) & 0xff] ^
 
1343
         rk[0]);
 
1344
 
 
1345
    s1= (Td0[(t1 >> 24)  ] ^
 
1346
         Td1[(t0 >> 16) & 0xff] ^
 
1347
         Td2[(t3 >>     8) & 0xff] ^
 
1348
         Td3[(t2         ) & 0xff] ^
 
1349
         rk[1]);
 
1350
 
 
1351
    s2= (Td0[(t2 >> 24)  ] ^
 
1352
         Td1[(t1 >> 16) & 0xff] ^
 
1353
         Td2[(t0 >>     8) & 0xff] ^
 
1354
         Td3[(t3         ) & 0xff] ^
 
1355
         rk[2]);
 
1356
 
 
1357
    s3= (Td0[(t3 >> 24)  ] ^
 
1358
         Td1[(t2 >> 16) & 0xff] ^
 
1359
         Td2[(t1 >>     8) & 0xff] ^
 
1360
         Td3[(t0         ) & 0xff] ^
 
1361
         rk[3]);
 
1362
  }
 
1363
 
 
1364
#endif /* FULL_UNROLL */
 
1365
 
 
1366
  /* Apply last round and map cipher state to byte array block: */
 
1367
 
 
1368
  s0= ((Td4[(t0 >> 24)  ] & 0xff000000) ^
 
1369
       (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
 
1370
       (Td4[(t2 >>  8) & 0xff] & 0x0000ff00) ^
 
1371
       (Td4[(t1 ) & 0xff] & 0x000000ff) ^
 
1372
       rk[0]);
 
1373
  PUTuint32(pt     , s0);
 
1374
 
 
1375
  s1= ((Td4[(t1 >> 24)  ] & 0xff000000) ^
 
1376
       (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
 
1377
       (Td4[(t3 >>  8) & 0xff] & 0x0000ff00) ^
 
1378
       (Td4[(t2 ) & 0xff] & 0x000000ff) ^
 
1379
       rk[1]);
 
1380
  PUTuint32(pt +  4, s1);
 
1381
 
 
1382
  s2= ((Td4[(t2 >> 24)  ] & 0xff000000) ^
 
1383
       (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
 
1384
       (Td4[(t0 >>  8) & 0xff] & 0x0000ff00) ^
 
1385
       (Td4[(t3 ) & 0xff] & 0x000000ff) ^
 
1386
       rk[2]);
 
1387
  PUTuint32(pt +  8, s2);
 
1388
 
 
1389
  s3= ((Td4[(t3 >> 24)  ] & 0xff000000) ^
 
1390
       (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
 
1391
       (Td4[(t1 >>  8) & 0xff] & 0x0000ff00) ^
 
1392
       (Td4[(t0 ) & 0xff] & 0x000000ff) ^
 
1393
       rk[3]);
 
1394
  PUTuint32(pt + 12, s3);
 
1395
}