Coverage Report

Created: 2025-12-31 07:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/pycryptodome/src/AES.c
Line
Count
Source
1
/**
2
 * rijndael-alg-fst.c
3
 *
4
 * @version 3.0 (December 2000)
5
 *
6
 * Optimised ANSI C code for the Rijndael cipher (now AES)
7
 *
8
 * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
9
 * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
10
 * @author Paulo Barreto <paulo.barreto@terra.com.br>
11
 *
12
 * This code is hereby placed in the public domain.
13
 *
14
 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
15
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
18
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
21
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
23
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
24
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
 */
26
27
#include "common.h"
28
#include "endianess.h"
29
#include "block_base.h"
30
31
FAKE_INIT(raw_aes)
32
33
#define MODULE_NAME AES
34
107
#define BLOCK_SIZE 16
35
#define KEY_SIZE 0
36
37
#define MAXKC   (256/32)
38
#define MAXKB   (256/8)
39
#define MAXNR   14
40
41
typedef uint8_t     u8;
42
typedef uint16_t    u16;
43
typedef uint32_t    u32;
44
45
struct block_state {
46
    u32 ek[ 4*(MAXNR+1) ];
47
    u32 dk[ 4*(MAXNR+1) ];
48
    int rounds;
49
};
50
51
static void rijndaelEncrypt(u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 pt[16], u8 ct[16]);
52
static void rijndaelDecrypt(u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 ct[16], u8 pt[16]);
53
54
static const u32 Te0[256] = {
55
    0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
56
    0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
57
    0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
58
    0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
59
    0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
60
    0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
61
    0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
62
    0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
63
    0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
64
    0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
65
    0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
66
    0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
67
    0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
68
    0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
69
    0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
70
    0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
71
    0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
72
    0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
73
    0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
74
    0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
75
    0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
76
    0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
77
    0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
78
    0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
79
    0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
80
    0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
81
    0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
82
    0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
83
    0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
84
    0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
85
    0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
86
    0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
87
    0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
88
    0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
89
    0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
90
    0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
91
    0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
92
    0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
93
    0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
94
    0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
95
    0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
96
    0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
97
    0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
98
    0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
99
    0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
100
    0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
101
    0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
102
    0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
103
    0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
104
    0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
105
    0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
106
    0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
107
    0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
108
    0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
109
    0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
110
    0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
111
    0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
112
    0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
113
    0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
114
    0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
115
    0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
116
    0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
117
    0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
118
    0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
119
};
120
static const u32 Te1[256] = {
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
static const u32 Te2[256] = {
187
    0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,
188
    0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,
189
    0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,
190
    0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,
191
    0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
192
    0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,
193
    0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,
194
    0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,
195
    0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,
196
    0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
197
    0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,
198
    0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,
199
    0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,
200
    0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,
201
    0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
202
    0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,
203
    0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,
204
    0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,
205
    0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,
206
    0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
207
    0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,
208
    0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,
209
    0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,
210
    0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,
211
    0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
212
    0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,
213
    0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,
214
    0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,
215
    0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,
216
    0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
217
    0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,
218
    0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,
219
    0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,
220
    0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,
221
    0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
222
    0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,
223
    0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,
224
    0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,
225
    0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,
226
    0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
227
    0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,
228
    0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,
229
    0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,
230
    0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,
231
    0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
232
    0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,
233
    0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,
234
    0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,
235
    0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,
236
    0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
237
    0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,
238
    0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,
239
    0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,
240
    0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,
241
    0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
242
    0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,
243
    0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,
244
    0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,
245
    0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,
246
    0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
247
    0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,
248
    0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,
249
    0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,
250
    0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,
251
};
252
static const u32 Te3[256] = {
253
254
    0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,
255
    0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,
256
    0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,
257
    0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,
258
    0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
259
    0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,
260
    0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,
261
    0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,
262
    0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,
263
    0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
264
    0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,
265
    0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,
266
    0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,
267
    0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,
268
    0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
269
    0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,
270
    0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,
271
    0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,
272
    0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,
273
    0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
274
    0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,
275
    0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,
276
    0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,
277
    0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,
278
    0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
279
    0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,
280
    0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,
281
    0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,
282
    0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,
283
    0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
284
    0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,
285
    0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,
286
    0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,
287
    0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,
288
    0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
289
    0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,
290
    0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,
291
    0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,
292
    0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,
293
    0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
294
    0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,
295
    0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,
296
    0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,
297
    0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,
298
    0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
299
    0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,
300
    0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,
301
    0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,
302
    0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,
303
    0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
304
    0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,
305
    0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,
306
    0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,
307
    0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,
308
    0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
309
    0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,
310
    0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,
311
    0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,
312
    0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,
313
    0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
314
    0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,
315
    0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,
316
    0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,
317
    0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,
318
};
319
static const u32 Te4[256] = {
320
    0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU,
321
    0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U,
322
    0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU,
323
    0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U,
324
    0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU,
325
    0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U,
326
    0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU,
327
    0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U,
328
    0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U,
329
    0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU,
330
    0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U,
331
    0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U,
332
    0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U,
333
    0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU,
334
    0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U,
335
    0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U,
336
    0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU,
337
    0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U,
338
    0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U,
339
    0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U,
340
    0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU,
341
    0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU,
342
    0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U,
343
    0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU,
344
    0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU,
345
    0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U,
346
    0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU,
347
    0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U,
348
    0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU,
349
    0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U,
350
    0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U,
351
    0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U,
352
    0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU,
353
    0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U,
354
    0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU,
355
    0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U,
356
    0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU,
357
    0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U,
358
    0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U,
359
    0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU,
360
    0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU,
361
    0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU,
362
    0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U,
363
    0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U,
364
    0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU,
365
    0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U,
366
    0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU,
367
    0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U,
368
    0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU,
369
    0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U,
370
    0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU,
371
    0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU,
372
    0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U,
373
    0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU,
374
    0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U,
375
    0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU,
376
    0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U,
377
    0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U,
378
    0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U,
379
    0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU,
380
    0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU,
381
    0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U,
382
    0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU,
383
    0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U,
384
};
385
static const u32 Td0[256] = {
386
    0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
387
    0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
388
    0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
389
    0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,
390
    0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
391
    0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,
392
    0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,
393
    0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,
394
    0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,
395
    0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
396
    0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,
397
    0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,
398
    0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,
399
    0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,
400
    0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
401
    0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,
402
    0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,
403
    0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,
404
    0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,
405
    0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
406
    0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,
407
    0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,
408
    0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,
409
    0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,
410
    0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
411
    0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,
412
    0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,
413
    0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,
414
    0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,
415
    0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
416
    0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,
417
    0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,
418
    0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,
419
    0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,
420
    0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
421
    0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,
422
    0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,
423
    0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,
424
    0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,
425
    0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
426
    0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,
427
    0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,
428
    0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,
429
    0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,
430
    0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
431
    0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,
432
    0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,
433
    0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,
434
    0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,
435
    0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
436
    0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,
437
    0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,
438
    0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,
439
    0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,
440
    0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
441
    0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,
442
    0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,
443
    0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,
444
    0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,
445
    0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
446
    0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,
447
    0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,
448
    0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
449
    0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
450
};
451
static const u32 Td1[256] = {
452
    0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,
453
    0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,
454
    0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU,
455
    0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U,
456
    0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,
457
    0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U,
458
    0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U,
459
    0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U,
460
    0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U,
461
    0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,
462
    0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU,
463
    0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU,
464
    0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U,
465
    0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU,
466
    0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,
467
    0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U,
468
    0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U,
469
    0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU,
470
    0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU,
471
    0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,
472
    0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU,
473
    0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U,
474
    0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU,
475
    0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU,
476
    0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,
477
    0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U,
478
    0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U,
479
    0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU,
480
    0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U,
481
    0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,
482
    0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U,
483
    0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U,
484
    0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U,
485
    0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU,
486
    0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,
487
    0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U,
488
    0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U,
489
    0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U,
490
    0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U,
491
    0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,
492
    0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU,
493
    0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU,
494
    0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U,
495
    0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU,
496
    0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,
497
    0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU,
498
    0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU,
499
    0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U,
500
    0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU,
501
    0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,
502
    0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U,
503
    0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U,
504
    0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U,
505
    0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U,
506
    0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,
507
    0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U,
508
    0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU,
509
    0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U,
510
    0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U,
511
    0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,
512
    0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U,
513
    0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U,
514
    0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,
515
    0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,
516
};
517
static const u32 Td2[256] = {
518
    0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,
519
    0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,
520
    0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U,
521
    0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U,
522
    0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,
523
    0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U,
524
    0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U,
525
    0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U,
526
    0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U,
527
    0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,
528
    0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U,
529
    0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U,
530
    0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU,
531
    0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U,
532
    0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,
533
    0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U,
534
    0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U,
535
    0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U,
536
    0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U,
537
    0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,
538
539
    0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U,
540
    0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U,
541
    0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U,
542
    0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U,
543
    0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,
544
    0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU,
545
    0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU,
546
    0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U,
547
    0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU,
548
    0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,
549
    0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU,
550
    0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU,
551
    0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU,
552
    0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU,
553
    0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,
554
    0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U,
555
    0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U,
556
    0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U,
557
    0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U,
558
    0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,
559
    0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U,
560
    0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU,
561
    0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU,
562
    0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U,
563
    0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,
564
    0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU,
565
    0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU,
566
    0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U,
567
    0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U,
568
    0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,
569
    0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U,
570
    0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U,
571
    0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U,
572
    0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U,
573
    0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,
574
    0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U,
575
    0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U,
576
    0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U,
577
    0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U,
578
    0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,
579
    0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U,
580
    0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU,
581
    0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,
582
    0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,
583
};
584
static const u32 Td3[256] = {
585
    0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,
586
    0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,
587
    0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U,
588
    0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U,
589
    0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,
590
    0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU,
591
    0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U,
592
    0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU,
593
    0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U,
594
    0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,
595
    0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U,
596
    0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U,
597
    0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U,
598
    0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U,
599
    0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,
600
    0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU,
601
    0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU,
602
    0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U,
603
    0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U,
604
    0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,
605
    0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU,
606
    0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U,
607
    0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U,
608
    0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U,
609
    0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,
610
    0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU,
611
    0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U,
612
    0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U,
613
    0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU,
614
    0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,
615
    0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U,
616
    0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U,
617
    0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U,
618
    0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU,
619
    0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,
620
    0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U,
621
    0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U,
622
    0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U,
623
    0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U,
624
    0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,
625
    0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U,
626
    0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU,
627
    0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U,
628
    0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U,
629
    0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,
630
    0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU,
631
    0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U,
632
    0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU,
633
    0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U,
634
    0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,
635
    0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U,
636
    0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U,
637
    0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U,
638
    0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U,
639
    0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,
640
    0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU,
641
    0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU,
642
    0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU,
643
    0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U,
644
    0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,
645
    0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U,
646
    0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU,
647
    0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,
648
    0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,
649
};
650
static const u32 Td4[256] = {
651
    0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U,
652
    0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U,
653
    0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU,
654
    0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU,
655
    0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U,
656
    0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U,
657
    0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U,
658
    0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU,
659
    0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U,
660
    0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU,
661
    0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU,
662
    0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU,
663
    0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U,
664
    0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U,
665
    0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U,
666
    0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U,
667
    0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U,
668
    0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U,
669
    0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU,
670
    0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U,
671
    0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U,
672
    0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU,
673
    0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U,
674
    0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U,
675
    0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U,
676
    0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU,
677
    0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U,
678
    0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U,
679
    0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU,
680
    0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U,
681
    0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U,
682
    0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU,
683
    0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U,
684
    0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU,
685
    0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU,
686
    0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U,
687
    0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U,
688
    0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U,
689
    0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U,
690
    0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU,
691
    0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U,
692
    0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U,
693
    0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU,
694
    0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU,
695
    0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU,
696
    0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U,
697
    0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU,
698
    0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U,
699
    0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U,
700
    0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U,
701
    0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U,
702
    0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU,
703
    0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U,
704
    0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU,
705
    0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU,
706
    0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU,
707
    0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU,
708
    0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U,
709
    0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU,
710
    0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U,
711
    0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU,
712
    0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U,
713
    0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U,
714
    0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU,
715
};
716
static const u32 rcon[] = {
717
    0x01000000, 0x02000000, 0x04000000, 0x08000000,
718
    0x10000000, 0x20000000, 0x40000000, 0x80000000,
719
    0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
720
};
721
722
/**
723
 * Expand the cipher key into the encryption key schedule.
724
 *
725
 * @return  the number of rounds for the given cipher key size.
726
 */
727
728
178
static int rijndaelKeySetupEnc(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], unsigned keyBits) {
729
178
    int i = 0;
730
178
    u32 temp;
731
732
178
    rk[0] = LOAD_U32_BIG(cipherKey     );
733
178
    rk[1] = LOAD_U32_BIG(cipherKey +  4);
734
178
    rk[2] = LOAD_U32_BIG(cipherKey +  8);
735
178
    rk[3] = LOAD_U32_BIG(cipherKey + 12);
736
178
    if (keyBits == 128) {
737
400
        for (;;) {
738
400
            temp  = rk[3];
739
400
            rk[4] = rk[0] ^
740
400
                (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
741
400
                (Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
742
400
                (Te4[(temp      ) & 0xff] & 0x0000ff00) ^
743
400
                (Te4[(temp >> 24)       ] & 0x000000ff) ^
744
400
                rcon[i];
745
400
            rk[5] = rk[1] ^ rk[4];
746
400
            rk[6] = rk[2] ^ rk[5];
747
400
            rk[7] = rk[3] ^ rk[6];
748
400
            if (++i == 10) {
749
40
                return 10;
750
40
            }
751
360
            rk += 4;
752
360
        }
753
40
    }
754
138
    rk[4] = LOAD_U32_BIG(cipherKey + 16);
755
138
    rk[5] = LOAD_U32_BIG(cipherKey + 20);
756
138
    if (keyBits == 192) {
757
272
        for (;;) {
758
272
            temp = rk[ 5];
759
272
            rk[ 6] = rk[ 0] ^
760
272
                (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
761
272
                (Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
762
272
                (Te4[(temp      ) & 0xff] & 0x0000ff00) ^
763
272
                (Te4[(temp >> 24)       ] & 0x000000ff) ^
764
272
                rcon[i];
765
272
            rk[ 7] = rk[ 1] ^ rk[ 6];
766
272
            rk[ 8] = rk[ 2] ^ rk[ 7];
767
272
            rk[ 9] = rk[ 3] ^ rk[ 8];
768
272
            if (++i == 8) {
769
34
                return 12;
770
34
            }
771
238
            rk[10] = rk[ 4] ^ rk[ 9];
772
238
            rk[11] = rk[ 5] ^ rk[10];
773
238
            rk += 6;
774
238
        }
775
34
    }
776
104
    rk[6] = LOAD_U32_BIG(cipherKey + 24);
777
104
    rk[7] = LOAD_U32_BIG(cipherKey + 28);
778
104
    if (keyBits == 256) {
779
728
        for (;;) {
780
728
            temp = rk[ 7];
781
728
            rk[ 8] = rk[ 0] ^
782
728
                (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
783
728
                (Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
784
728
                (Te4[(temp      ) & 0xff] & 0x0000ff00) ^
785
728
                (Te4[(temp >> 24)       ] & 0x000000ff) ^
786
728
                rcon[i];
787
728
            rk[ 9] = rk[ 1] ^ rk[ 8];
788
728
            rk[10] = rk[ 2] ^ rk[ 9];
789
728
            rk[11] = rk[ 3] ^ rk[10];
790
728
            if (++i == 7) {
791
104
                return 14;
792
104
            }
793
624
            temp = rk[11];
794
624
            rk[12] = rk[ 4] ^
795
624
                (Te4[(temp >> 24)       ] & 0xff000000) ^
796
624
                (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^
797
624
                (Te4[(temp >>  8) & 0xff] & 0x0000ff00) ^
798
624
                (Te4[(temp      ) & 0xff] & 0x000000ff);
799
624
            rk[13] = rk[ 5] ^ rk[12];
800
624
            rk[14] = rk[ 6] ^ rk[13];
801
624
            rk[15] = rk[ 7] ^ rk[14];
802
803
624
            rk += 8;
804
624
        }
805
104
    }
806
0
    return 0;
807
104
}
808
809
/**
810
 * Expand the cipher key into the decryption key schedule.
811
 *
812
 * @return  the number of rounds for the given cipher key size.
813
 */
814
89
static int rijndaelKeySetupDec(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], unsigned keyBits) {
815
89
    int Nr, i, j;
816
89
    u32 temp;
817
818
    /* expand the cipher key: */
819
89
    Nr = rijndaelKeySetupEnc(rk, cipherKey, keyBits);
820
    /* invert the order of the round keys: */
821
655
    for (i = 0, j = 4*Nr; i < j; i += 4, j -= 4) {
822
566
        temp = rk[i    ]; rk[i    ] = rk[j    ]; rk[j    ] = temp;
823
566
        temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
824
566
        temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
825
566
        temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
826
566
    }
827
    /* apply the inverse MixColumn transform to all round keys but the first and the last: */
828
1.13k
    for (i = 1; i < Nr; i++) {
829
1.04k
        rk += 4;
830
1.04k
        rk[0] =
831
1.04k
            Td0[Te4[(rk[0] >> 24)       ] & 0xff] ^
832
1.04k
            Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^
833
1.04k
            Td2[Te4[(rk[0] >>  8) & 0xff] & 0xff] ^
834
1.04k
            Td3[Te4[(rk[0]      ) & 0xff] & 0xff];
835
1.04k
        rk[1] =
836
1.04k
            Td0[Te4[(rk[1] >> 24)       ] & 0xff] ^
837
1.04k
            Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^
838
1.04k
            Td2[Te4[(rk[1] >>  8) & 0xff] & 0xff] ^
839
1.04k
            Td3[Te4[(rk[1]      ) & 0xff] & 0xff];
840
1.04k
        rk[2] =
841
1.04k
            Td0[Te4[(rk[2] >> 24)       ] & 0xff] ^
842
1.04k
            Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^
843
1.04k
            Td2[Te4[(rk[2] >>  8) & 0xff] & 0xff] ^
844
1.04k
            Td3[Te4[(rk[2]      ) & 0xff] & 0xff];
845
1.04k
        rk[3] =
846
1.04k
            Td0[Te4[(rk[3] >> 24)       ] & 0xff] ^
847
1.04k
            Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^
848
1.04k
            Td2[Te4[(rk[3] >>  8) & 0xff] & 0xff] ^
849
1.04k
            Td3[Te4[(rk[3]      ) & 0xff] & 0xff];
850
1.04k
    }
851
89
    return Nr;
852
89
}
853
854
590k
static void rijndaelEncrypt(u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 pt[16], u8 ct[16]) {
855
590k
    u32 s0, s1, s2, s3, t0, t1, t2, t3;
856
857
    /*
858
     * map byte array block to cipher state
859
     * and add initial round key:
860
     */
861
590k
    s0 = LOAD_U32_BIG(pt     ) ^ rk[0];
862
590k
    s1 = LOAD_U32_BIG(pt +  4) ^ rk[1];
863
590k
    s2 = LOAD_U32_BIG(pt +  8) ^ rk[2];
864
590k
    s3 = LOAD_U32_BIG(pt + 12) ^ rk[3];
865
    
866
    /* round 1: */
867
590k
    t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4];
868
590k
    t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5];
869
590k
    t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6];
870
590k
    t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7];
871
    /* round 2: */
872
590k
    s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8];
873
590k
    s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9];
874
590k
    s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10];
875
590k
    s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11];
876
    /* round 3: */
877
590k
    t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12];
878
590k
    t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13];
879
590k
    t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14];
880
590k
    t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15];
881
    /* round 4: */
882
590k
    s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16];
883
590k
    s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17];
884
590k
    s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18];
885
590k
    s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19];
886
    /* round 5: */
887
590k
    t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20];
888
590k
    t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21];
889
590k
    t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22];
890
590k
    t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23];
891
    /* round 6: */
892
590k
    s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24];
893
590k
    s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25];
894
590k
    s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26];
895
590k
    s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27];
896
    /* round 7: */
897
590k
    t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28];
898
590k
    t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29];
899
590k
    t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30];
900
590k
    t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31];
901
    /* round 8: */
902
590k
    s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32];
903
590k
    s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33];
904
590k
    s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34];
905
590k
    s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35];
906
    /* round 9: */
907
590k
    t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36];
908
590k
    t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37];
909
590k
    t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38];
910
590k
    t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39];
911
590k
    if (Nr > 10) {
912
        /* round 10: */
913
580k
        s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40];
914
580k
        s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41];
915
580k
        s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42];
916
580k
        s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43];
917
        /* round 11: */
918
580k
        t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44];
919
580k
        t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45];
920
580k
        t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46];
921
580k
        t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47];
922
580k
        if (Nr > 12) {
923
            /* round 12: */
924
441k
            s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48];
925
441k
            s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49];
926
441k
            s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50];
927
441k
            s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51];
928
            /* round 13: */
929
441k
            t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52];
930
441k
            t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53];
931
441k
            t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54];
932
441k
            t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55];
933
441k
        }
934
580k
    }
935
590k
    rk += Nr << 2;
936
    
937
    /*
938
     * apply last round and
939
     * map cipher state to byte array block:
940
     */
941
590k
    s0 =
942
590k
        (Te4[(t0 >> 24)       ] & 0xff000000) ^
943
590k
        (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
944
590k
        (Te4[(t2 >>  8) & 0xff] & 0x0000ff00) ^
945
590k
        (Te4[(t3      ) & 0xff] & 0x000000ff) ^
946
590k
        rk[0];
947
590k
    STORE_U32_BIG(ct     , s0);
948
590k
    s1 =
949
590k
        (Te4[(t1 >> 24)       ] & 0xff000000) ^
950
590k
        (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
951
590k
        (Te4[(t3 >>  8) & 0xff] & 0x0000ff00) ^
952
590k
        (Te4[(t0      ) & 0xff] & 0x000000ff) ^
953
590k
        rk[1];
954
590k
    STORE_U32_BIG(ct +  4, s1);
955
590k
    s2 =
956
590k
        (Te4[(t2 >> 24)       ] & 0xff000000) ^
957
590k
        (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
958
590k
        (Te4[(t0 >>  8) & 0xff] & 0x0000ff00) ^
959
590k
        (Te4[(t1      ) & 0xff] & 0x000000ff) ^
960
590k
        rk[2];
961
590k
    STORE_U32_BIG(ct +  8, s2);
962
590k
    s3 =
963
590k
        (Te4[(t3 >> 24)       ] & 0xff000000) ^
964
590k
        (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
965
590k
        (Te4[(t1 >>  8) & 0xff] & 0x0000ff00) ^
966
590k
        (Te4[(t2      ) & 0xff] & 0x000000ff) ^
967
590k
        rk[3];
968
590k
    STORE_U32_BIG(ct + 12, s3);
969
590k
}
970
971
590k
static void rijndaelDecrypt(u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 ct[16], u8 pt[16]) {
972
590k
    u32 s0, s1, s2, s3, t0, t1, t2, t3;
973
974
    /*
975
     * map byte array block to cipher state
976
     * and add initial round key:
977
     */
978
590k
    s0 = LOAD_U32_BIG(ct     ) ^ rk[0];
979
590k
    s1 = LOAD_U32_BIG(ct +  4) ^ rk[1];
980
590k
    s2 = LOAD_U32_BIG(ct +  8) ^ rk[2];
981
590k
    s3 = LOAD_U32_BIG(ct + 12) ^ rk[3];
982
    
983
    /* round 1: */
984
590k
    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4];
985
590k
    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5];
986
590k
    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6];
987
590k
    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7];
988
    /* round 2: */
989
590k
    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8];
990
590k
    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9];
991
590k
    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10];
992
590k
    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11];
993
    /* round 3: */
994
590k
    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12];
995
590k
    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13];
996
590k
    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14];
997
590k
    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15];
998
    /* round 4: */
999
590k
    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16];
1000
590k
    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17];
1001
590k
    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18];
1002
590k
    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19];
1003
    /* round 5: */
1004
590k
    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20];
1005
590k
    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21];
1006
590k
    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22];
1007
590k
    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23];
1008
    /* round 6: */
1009
590k
    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24];
1010
590k
    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25];
1011
590k
    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26];
1012
590k
    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27];
1013
    /* round 7: */
1014
590k
    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28];
1015
590k
    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29];
1016
590k
    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30];
1017
590k
    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31];
1018
    /* round 8: */
1019
590k
    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32];
1020
590k
    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33];
1021
590k
    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34];
1022
590k
    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35];
1023
    /* round 9: */
1024
590k
    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36];
1025
590k
    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37];
1026
590k
    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38];
1027
590k
    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39];
1028
590k
    if (Nr > 10) {
1029
        /* round 10: */
1030
580k
        s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40];
1031
580k
        s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41];
1032
580k
        s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42];
1033
580k
        s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43];
1034
        /* round 11: */
1035
580k
        t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44];
1036
580k
        t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45];
1037
580k
        t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46];
1038
580k
        t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47];
1039
580k
        if (Nr > 12) {
1040
            /* round 12: */
1041
441k
            s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48];
1042
441k
            s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49];
1043
441k
            s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50];
1044
441k
            s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51];
1045
            /* round 13: */
1046
441k
            t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52];
1047
441k
            t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53];
1048
441k
            t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54];
1049
441k
            t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55];
1050
441k
        }
1051
580k
    }
1052
590k
    rk += Nr << 2;
1053
    
1054
    /*
1055
     * apply last round and
1056
     * map cipher state to byte array block:
1057
     */
1058
590k
    s0 =
1059
590k
        (Td4[(t0 >> 24)       ] & 0xff000000) ^
1060
590k
        (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
1061
590k
        (Td4[(t2 >>  8) & 0xff] & 0x0000ff00) ^
1062
590k
        (Td4[(t1      ) & 0xff] & 0x000000ff) ^
1063
590k
        rk[0];
1064
590k
    STORE_U32_BIG(pt     , s0);
1065
590k
    s1 =
1066
590k
        (Td4[(t1 >> 24)       ] & 0xff000000) ^
1067
590k
        (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
1068
590k
        (Td4[(t3 >>  8) & 0xff] & 0x0000ff00) ^
1069
590k
        (Td4[(t2      ) & 0xff] & 0x000000ff) ^
1070
590k
        rk[1];
1071
590k
    STORE_U32_BIG(pt +  4, s1);
1072
590k
    s2 =
1073
590k
        (Td4[(t2 >> 24)       ] & 0xff000000) ^
1074
590k
        (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
1075
590k
        (Td4[(t0 >>  8) & 0xff] & 0x0000ff00) ^
1076
590k
        (Td4[(t3      ) & 0xff] & 0x000000ff) ^
1077
590k
        rk[2];
1078
590k
    STORE_U32_BIG(pt +  8, s2);
1079
590k
    s3 =
1080
590k
        (Td4[(t3 >> 24)       ] & 0xff000000) ^
1081
590k
        (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
1082
590k
        (Td4[(t1 >>  8) & 0xff] & 0x0000ff00) ^
1083
590k
        (Td4[(t0      ) & 0xff] & 0x000000ff) ^
1084
590k
        rk[3];
1085
590k
    STORE_U32_BIG(pt + 12, s3);
1086
590k
}
1087
1088
static int block_init(struct block_state *state, const uint8_t *key, size_t keylen)
1089
107
{
1090
107
    int Nr = 0;
1091
1092
107
    switch (keylen) {
1093
20
    case(16): Nr = 10; break;
1094
17
    case(24): Nr = 12; break;
1095
52
    case(32): Nr = 14; break;
1096
18
        default: return ERR_NR_ROUNDS;
1097
107
    }
1098
89
    state->rounds = Nr;
1099
89
    rijndaelKeySetupEnc(state->ek, key, (unsigned)keylen*8);
1100
89
    rijndaelKeySetupDec(state->dk, key, (unsigned)keylen*8);
1101
89
    return 0;
1102
107
}
1103
1104
static void block_finalize(struct block_state* self)
1105
89
{
1106
89
}
1107
1108
static void block_encrypt(struct block_state *self, const uint8_t *in, uint8_t *out)
1109
590k
{
1110
590k
    rijndaelEncrypt(self->ek, self->rounds, in, out);
1111
590k
}
1112
1113
static void block_decrypt(struct block_state *self, const uint8_t *in, uint8_t *out)
1114
590k
{
1115
590k
    rijndaelDecrypt(self->dk, self->rounds, in, out);
1116
590k
}
1117
1118
#include "block_common.c"