Statistics
| Branch: | Revision:

root / aes.c @ 604457d7

History | View | Annotate | Download (59.8 kB)

1 e4d4fe3c bellard
/**
2 5fafdf24 ths
 *
3 e4d4fe3c bellard
 * aes.c - integrated in QEMU by Fabrice Bellard from the OpenSSL project.
4 e4d4fe3c bellard
 */
5 e4d4fe3c bellard
/*
6 e4d4fe3c bellard
 * rijndael-alg-fst.c
7 e4d4fe3c bellard
 *
8 e4d4fe3c bellard
 * @version 3.0 (December 2000)
9 e4d4fe3c bellard
 *
10 e4d4fe3c bellard
 * Optimised ANSI C code for the Rijndael cipher (now AES)
11 e4d4fe3c bellard
 *
12 e4d4fe3c bellard
 * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
13 e4d4fe3c bellard
 * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
14 e4d4fe3c bellard
 * @author Paulo Barreto <paulo.barreto@terra.com.br>
15 e4d4fe3c bellard
 *
16 e4d4fe3c bellard
 * This code is hereby placed in the public domain.
17 e4d4fe3c bellard
 *
18 e4d4fe3c bellard
 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
19 e4d4fe3c bellard
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 e4d4fe3c bellard
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 e4d4fe3c bellard
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
22 e4d4fe3c bellard
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 e4d4fe3c bellard
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 e4d4fe3c bellard
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
25 e4d4fe3c bellard
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26 e4d4fe3c bellard
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
27 e4d4fe3c bellard
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
28 e4d4fe3c bellard
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 e4d4fe3c bellard
 */
30 faf07963 pbrook
#include "qemu-common.h"
31 e4d4fe3c bellard
#include "aes.h"
32 e4d4fe3c bellard
33 69b34976 ths
#ifndef NDEBUG
34 e4d4fe3c bellard
#define NDEBUG
35 69b34976 ths
#endif
36 69b34976 ths
37 e4d4fe3c bellard
#include <assert.h>
38 e4d4fe3c bellard
39 e4d4fe3c bellard
typedef uint32_t u32;
40 e4d4fe3c bellard
typedef uint16_t u16;
41 e4d4fe3c bellard
typedef uint8_t u8;
42 e4d4fe3c bellard
43 e4d4fe3c bellard
/* This controls loop-unrolling in aes_core.c */
44 e4d4fe3c bellard
#undef FULL_UNROLL
45 e4d4fe3c bellard
# define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
46 e4d4fe3c bellard
# define PUTU32(ct, st) { (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }
47 e4d4fe3c bellard
48 e4d4fe3c bellard
/*
49 e4d4fe3c bellard
Te0[x] = S [x].[02, 01, 01, 03];
50 e4d4fe3c bellard
Te1[x] = S [x].[03, 02, 01, 01];
51 e4d4fe3c bellard
Te2[x] = S [x].[01, 03, 02, 01];
52 e4d4fe3c bellard
Te3[x] = S [x].[01, 01, 03, 02];
53 e4d4fe3c bellard
Te4[x] = S [x].[01, 01, 01, 01];
54 e4d4fe3c bellard

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