]> git.proxmox.com Git - mirror_qemu.git/blob - crypto/aes.c
crypto: Add aesenc_SB_SR_AK
[mirror_qemu.git] / crypto / aes.c
1 /**
2 *
3 * aes.c - integrated in QEMU by Fabrice Bellard from the OpenSSL project.
4 */
5 /*
6 * rijndael-alg-fst.c
7 *
8 * @version 3.0 (December 2000)
9 *
10 * Optimised ANSI C code for the Rijndael cipher (now AES)
11 *
12 * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
13 * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
14 * @author Paulo Barreto <paulo.barreto@terra.com.br>
15 *
16 * This code is hereby placed in the public domain.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
19 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
25 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
27 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
28 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30 #include "qemu/osdep.h"
31 #include "crypto/aes.h"
32 #include "crypto/aes-round.h"
33
34 typedef uint32_t u32;
35 typedef uint8_t u8;
36
37 /* This controls loop-unrolling in aes_core.c */
38 #undef FULL_UNROLL
39 # define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3]))
40 # define PUTU32(ct, st) { (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); }
41
42 const uint8_t AES_sbox[256] = {
43 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
44 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
45 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
46 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
47 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
48 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
49 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
50 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
51 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
52 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
53 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
54 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
55 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
56 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
57 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
58 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
59 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
60 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
61 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
62 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
63 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
64 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
65 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
66 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
67 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
68 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
69 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
70 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
71 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
72 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
73 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
74 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16,
75 };
76
77 const uint8_t AES_isbox[256] = {
78 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
79 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
80 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
81 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
82 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
83 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
84 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
85 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
86 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
87 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
88 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
89 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
90 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
91 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
92 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
93 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
94 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
95 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
96 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
97 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
98 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
99 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
100 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
101 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
102 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
103 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
104 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
105 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
106 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
107 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
108 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
109 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D,
110 };
111
112 /* AES ShiftRows, for complete unrolling. */
113 #define AES_SH(X) (((X) * 5) & 15)
114
115 const uint8_t AES_shifts[16] = {
116 AES_SH(0x0), AES_SH(0x1), AES_SH(0x2), AES_SH(0x3),
117 AES_SH(0x4), AES_SH(0x5), AES_SH(0x6), AES_SH(0x7),
118 AES_SH(0x8), AES_SH(0x9), AES_SH(0xA), AES_SH(0xB),
119 AES_SH(0xC), AES_SH(0xD), AES_SH(0xE), AES_SH(0xF),
120 };
121
122 /* AES InvShiftRows, for complete unrolling. */
123 #define AES_ISH(X) (((X) * 13) & 15)
124
125 const uint8_t AES_ishifts[16] = {
126 AES_ISH(0x0), AES_ISH(0x1), AES_ISH(0x2), AES_ISH(0x3),
127 AES_ISH(0x4), AES_ISH(0x5), AES_ISH(0x6), AES_ISH(0x7),
128 AES_ISH(0x8), AES_ISH(0x9), AES_ISH(0xA), AES_ISH(0xB),
129 AES_ISH(0xC), AES_ISH(0xD), AES_ISH(0xE), AES_ISH(0xF),
130 };
131
132 /*
133 * MixColumns lookup table, for use with rot32.
134 */
135 const uint32_t AES_mc_rot[256] = {
136 0x00000000, 0x03010102, 0x06020204, 0x05030306,
137 0x0c040408, 0x0f05050a, 0x0a06060c, 0x0907070e,
138 0x18080810, 0x1b090912, 0x1e0a0a14, 0x1d0b0b16,
139 0x140c0c18, 0x170d0d1a, 0x120e0e1c, 0x110f0f1e,
140 0x30101020, 0x33111122, 0x36121224, 0x35131326,
141 0x3c141428, 0x3f15152a, 0x3a16162c, 0x3917172e,
142 0x28181830, 0x2b191932, 0x2e1a1a34, 0x2d1b1b36,
143 0x241c1c38, 0x271d1d3a, 0x221e1e3c, 0x211f1f3e,
144 0x60202040, 0x63212142, 0x66222244, 0x65232346,
145 0x6c242448, 0x6f25254a, 0x6a26264c, 0x6927274e,
146 0x78282850, 0x7b292952, 0x7e2a2a54, 0x7d2b2b56,
147 0x742c2c58, 0x772d2d5a, 0x722e2e5c, 0x712f2f5e,
148 0x50303060, 0x53313162, 0x56323264, 0x55333366,
149 0x5c343468, 0x5f35356a, 0x5a36366c, 0x5937376e,
150 0x48383870, 0x4b393972, 0x4e3a3a74, 0x4d3b3b76,
151 0x443c3c78, 0x473d3d7a, 0x423e3e7c, 0x413f3f7e,
152 0xc0404080, 0xc3414182, 0xc6424284, 0xc5434386,
153 0xcc444488, 0xcf45458a, 0xca46468c, 0xc947478e,
154 0xd8484890, 0xdb494992, 0xde4a4a94, 0xdd4b4b96,
155 0xd44c4c98, 0xd74d4d9a, 0xd24e4e9c, 0xd14f4f9e,
156 0xf05050a0, 0xf35151a2, 0xf65252a4, 0xf55353a6,
157 0xfc5454a8, 0xff5555aa, 0xfa5656ac, 0xf95757ae,
158 0xe85858b0, 0xeb5959b2, 0xee5a5ab4, 0xed5b5bb6,
159 0xe45c5cb8, 0xe75d5dba, 0xe25e5ebc, 0xe15f5fbe,
160 0xa06060c0, 0xa36161c2, 0xa66262c4, 0xa56363c6,
161 0xac6464c8, 0xaf6565ca, 0xaa6666cc, 0xa96767ce,
162 0xb86868d0, 0xbb6969d2, 0xbe6a6ad4, 0xbd6b6bd6,
163 0xb46c6cd8, 0xb76d6dda, 0xb26e6edc, 0xb16f6fde,
164 0x907070e0, 0x937171e2, 0x967272e4, 0x957373e6,
165 0x9c7474e8, 0x9f7575ea, 0x9a7676ec, 0x997777ee,
166 0x887878f0, 0x8b7979f2, 0x8e7a7af4, 0x8d7b7bf6,
167 0x847c7cf8, 0x877d7dfa, 0x827e7efc, 0x817f7ffe,
168 0x9b80801b, 0x98818119, 0x9d82821f, 0x9e83831d,
169 0x97848413, 0x94858511, 0x91868617, 0x92878715,
170 0x8388880b, 0x80898909, 0x858a8a0f, 0x868b8b0d,
171 0x8f8c8c03, 0x8c8d8d01, 0x898e8e07, 0x8a8f8f05,
172 0xab90903b, 0xa8919139, 0xad92923f, 0xae93933d,
173 0xa7949433, 0xa4959531, 0xa1969637, 0xa2979735,
174 0xb398982b, 0xb0999929, 0xb59a9a2f, 0xb69b9b2d,
175 0xbf9c9c23, 0xbc9d9d21, 0xb99e9e27, 0xba9f9f25,
176 0xfba0a05b, 0xf8a1a159, 0xfda2a25f, 0xfea3a35d,
177 0xf7a4a453, 0xf4a5a551, 0xf1a6a657, 0xf2a7a755,
178 0xe3a8a84b, 0xe0a9a949, 0xe5aaaa4f, 0xe6abab4d,
179 0xefacac43, 0xecadad41, 0xe9aeae47, 0xeaafaf45,
180 0xcbb0b07b, 0xc8b1b179, 0xcdb2b27f, 0xceb3b37d,
181 0xc7b4b473, 0xc4b5b571, 0xc1b6b677, 0xc2b7b775,
182 0xd3b8b86b, 0xd0b9b969, 0xd5baba6f, 0xd6bbbb6d,
183 0xdfbcbc63, 0xdcbdbd61, 0xd9bebe67, 0xdabfbf65,
184 0x5bc0c09b, 0x58c1c199, 0x5dc2c29f, 0x5ec3c39d,
185 0x57c4c493, 0x54c5c591, 0x51c6c697, 0x52c7c795,
186 0x43c8c88b, 0x40c9c989, 0x45caca8f, 0x46cbcb8d,
187 0x4fcccc83, 0x4ccdcd81, 0x49cece87, 0x4acfcf85,
188 0x6bd0d0bb, 0x68d1d1b9, 0x6dd2d2bf, 0x6ed3d3bd,
189 0x67d4d4b3, 0x64d5d5b1, 0x61d6d6b7, 0x62d7d7b5,
190 0x73d8d8ab, 0x70d9d9a9, 0x75dadaaf, 0x76dbdbad,
191 0x7fdcdca3, 0x7cdddda1, 0x79dedea7, 0x7adfdfa5,
192 0x3be0e0db, 0x38e1e1d9, 0x3de2e2df, 0x3ee3e3dd,
193 0x37e4e4d3, 0x34e5e5d1, 0x31e6e6d7, 0x32e7e7d5,
194 0x23e8e8cb, 0x20e9e9c9, 0x25eaeacf, 0x26ebebcd,
195 0x2fececc3, 0x2cededc1, 0x29eeeec7, 0x2aefefc5,
196 0x0bf0f0fb, 0x08f1f1f9, 0x0df2f2ff, 0x0ef3f3fd,
197 0x07f4f4f3, 0x04f5f5f1, 0x01f6f6f7, 0x02f7f7f5,
198 0x13f8f8eb, 0x10f9f9e9, 0x15fafaef, 0x16fbfbed,
199 0x1ffcfce3, 0x1cfdfde1, 0x19fefee7, 0x1affffe5,
200 };
201
202 /*
203 * Inverse MixColumns lookup table, for use with rot32.
204 */
205 const uint32_t AES_imc_rot[256] = {
206 0x00000000, 0x0b0d090e, 0x161a121c, 0x1d171b12,
207 0x2c342438, 0x27392d36, 0x3a2e3624, 0x31233f2a,
208 0x58684870, 0x5365417e, 0x4e725a6c, 0x457f5362,
209 0x745c6c48, 0x7f516546, 0x62467e54, 0x694b775a,
210 0xb0d090e0, 0xbbdd99ee, 0xa6ca82fc, 0xadc78bf2,
211 0x9ce4b4d8, 0x97e9bdd6, 0x8afea6c4, 0x81f3afca,
212 0xe8b8d890, 0xe3b5d19e, 0xfea2ca8c, 0xf5afc382,
213 0xc48cfca8, 0xcf81f5a6, 0xd296eeb4, 0xd99be7ba,
214 0x7bbb3bdb, 0x70b632d5, 0x6da129c7, 0x66ac20c9,
215 0x578f1fe3, 0x5c8216ed, 0x41950dff, 0x4a9804f1,
216 0x23d373ab, 0x28de7aa5, 0x35c961b7, 0x3ec468b9,
217 0x0fe75793, 0x04ea5e9d, 0x19fd458f, 0x12f04c81,
218 0xcb6bab3b, 0xc066a235, 0xdd71b927, 0xd67cb029,
219 0xe75f8f03, 0xec52860d, 0xf1459d1f, 0xfa489411,
220 0x9303e34b, 0x980eea45, 0x8519f157, 0x8e14f859,
221 0xbf37c773, 0xb43ace7d, 0xa92dd56f, 0xa220dc61,
222 0xf66d76ad, 0xfd607fa3, 0xe07764b1, 0xeb7a6dbf,
223 0xda595295, 0xd1545b9b, 0xcc434089, 0xc74e4987,
224 0xae053edd, 0xa50837d3, 0xb81f2cc1, 0xb31225cf,
225 0x82311ae5, 0x893c13eb, 0x942b08f9, 0x9f2601f7,
226 0x46bde64d, 0x4db0ef43, 0x50a7f451, 0x5baafd5f,
227 0x6a89c275, 0x6184cb7b, 0x7c93d069, 0x779ed967,
228 0x1ed5ae3d, 0x15d8a733, 0x08cfbc21, 0x03c2b52f,
229 0x32e18a05, 0x39ec830b, 0x24fb9819, 0x2ff69117,
230 0x8dd64d76, 0x86db4478, 0x9bcc5f6a, 0x90c15664,
231 0xa1e2694e, 0xaaef6040, 0xb7f87b52, 0xbcf5725c,
232 0xd5be0506, 0xdeb30c08, 0xc3a4171a, 0xc8a91e14,
233 0xf98a213e, 0xf2872830, 0xef903322, 0xe49d3a2c,
234 0x3d06dd96, 0x360bd498, 0x2b1ccf8a, 0x2011c684,
235 0x1132f9ae, 0x1a3ff0a0, 0x0728ebb2, 0x0c25e2bc,
236 0x656e95e6, 0x6e639ce8, 0x737487fa, 0x78798ef4,
237 0x495ab1de, 0x4257b8d0, 0x5f40a3c2, 0x544daacc,
238 0xf7daec41, 0xfcd7e54f, 0xe1c0fe5d, 0xeacdf753,
239 0xdbeec879, 0xd0e3c177, 0xcdf4da65, 0xc6f9d36b,
240 0xafb2a431, 0xa4bfad3f, 0xb9a8b62d, 0xb2a5bf23,
241 0x83868009, 0x888b8907, 0x959c9215, 0x9e919b1b,
242 0x470a7ca1, 0x4c0775af, 0x51106ebd, 0x5a1d67b3,
243 0x6b3e5899, 0x60335197, 0x7d244a85, 0x7629438b,
244 0x1f6234d1, 0x146f3ddf, 0x097826cd, 0x02752fc3,
245 0x335610e9, 0x385b19e7, 0x254c02f5, 0x2e410bfb,
246 0x8c61d79a, 0x876cde94, 0x9a7bc586, 0x9176cc88,
247 0xa055f3a2, 0xab58faac, 0xb64fe1be, 0xbd42e8b0,
248 0xd4099fea, 0xdf0496e4, 0xc2138df6, 0xc91e84f8,
249 0xf83dbbd2, 0xf330b2dc, 0xee27a9ce, 0xe52aa0c0,
250 0x3cb1477a, 0x37bc4e74, 0x2aab5566, 0x21a65c68,
251 0x10856342, 0x1b886a4c, 0x069f715e, 0x0d927850,
252 0x64d90f0a, 0x6fd40604, 0x72c31d16, 0x79ce1418,
253 0x48ed2b32, 0x43e0223c, 0x5ef7392e, 0x55fa3020,
254 0x01b79aec, 0x0aba93e2, 0x17ad88f0, 0x1ca081fe,
255 0x2d83bed4, 0x268eb7da, 0x3b99acc8, 0x3094a5c6,
256 0x59dfd29c, 0x52d2db92, 0x4fc5c080, 0x44c8c98e,
257 0x75ebf6a4, 0x7ee6ffaa, 0x63f1e4b8, 0x68fcedb6,
258 0xb1670a0c, 0xba6a0302, 0xa77d1810, 0xac70111e,
259 0x9d532e34, 0x965e273a, 0x8b493c28, 0x80443526,
260 0xe90f427c, 0xe2024b72, 0xff155060, 0xf418596e,
261 0xc53b6644, 0xce366f4a, 0xd3217458, 0xd82c7d56,
262 0x7a0ca137, 0x7101a839, 0x6c16b32b, 0x671bba25,
263 0x5638850f, 0x5d358c01, 0x40229713, 0x4b2f9e1d,
264 0x2264e947, 0x2969e049, 0x347efb5b, 0x3f73f255,
265 0x0e50cd7f, 0x055dc471, 0x184adf63, 0x1347d66d,
266 0xcadc31d7, 0xc1d138d9, 0xdcc623cb, 0xd7cb2ac5,
267 0xe6e815ef, 0xede51ce1, 0xf0f207f3, 0xfbff0efd,
268 0x92b479a7, 0x99b970a9, 0x84ae6bbb, 0x8fa362b5,
269 0xbe805d9f, 0xb58d5491, 0xa89a4f83, 0xa397468d,
270 };
271
272 /* AES_imc[x][0] = [x].[0e, 09, 0d, 0b]; */
273 /* AES_imc[x][1] = [x].[0b, 0e, 09, 0d]; */
274 /* AES_imc[x][2] = [x].[0d, 0b, 0e, 09]; */
275 /* AES_imc[x][3] = [x].[09, 0d, 0b, 0e]; */
276 const uint32_t AES_imc[256][4] = {
277 { 0x00000000, 0x00000000, 0x00000000, 0x00000000, }, /* x=00 */
278 { 0x0E090D0B, 0x0B0E090D, 0x0D0B0E09, 0x090D0B0E, }, /* x=01 */
279 { 0x1C121A16, 0x161C121A, 0x1A161C12, 0x121A161C, }, /* x=02 */
280 { 0x121B171D, 0x1D121B17, 0x171D121B, 0x1B171D12, }, /* x=03 */
281 { 0x3824342C, 0x2C382434, 0x342C3824, 0x24342C38, }, /* x=04 */
282 { 0x362D3927, 0x27362D39, 0x3927362D, 0x2D392736, }, /* x=05 */
283 { 0x24362E3A, 0x3A24362E, 0x2E3A2436, 0x362E3A24, }, /* x=06 */
284 { 0x2A3F2331, 0x312A3F23, 0x23312A3F, 0x3F23312A, }, /* x=07 */
285 { 0x70486858, 0x58704868, 0x68587048, 0x48685870, }, /* x=08 */
286 { 0x7E416553, 0x537E4165, 0x65537E41, 0x4165537E, }, /* x=09 */
287 { 0x6C5A724E, 0x4E6C5A72, 0x724E6C5A, 0x5A724E6C, }, /* x=0A */
288 { 0x62537F45, 0x4562537F, 0x7F456253, 0x537F4562, }, /* x=0B */
289 { 0x486C5C74, 0x74486C5C, 0x5C74486C, 0x6C5C7448, }, /* x=0C */
290 { 0x4665517F, 0x7F466551, 0x517F4665, 0x65517F46, }, /* x=0D */
291 { 0x547E4662, 0x62547E46, 0x4662547E, 0x7E466254, }, /* x=0E */
292 { 0x5A774B69, 0x695A774B, 0x4B695A77, 0x774B695A, }, /* x=0F */
293 { 0xE090D0B0, 0xB0E090D0, 0xD0B0E090, 0x90D0B0E0, }, /* x=10 */
294 { 0xEE99DDBB, 0xBBEE99DD, 0xDDBBEE99, 0x99DDBBEE, }, /* x=11 */
295 { 0xFC82CAA6, 0xA6FC82CA, 0xCAA6FC82, 0x82CAA6FC, }, /* x=12 */
296 { 0xF28BC7AD, 0xADF28BC7, 0xC7ADF28B, 0x8BC7ADF2, }, /* x=13 */
297 { 0xD8B4E49C, 0x9CD8B4E4, 0xE49CD8B4, 0xB4E49CD8, }, /* x=14 */
298 { 0xD6BDE997, 0x97D6BDE9, 0xE997D6BD, 0xBDE997D6, }, /* x=15 */
299 { 0xC4A6FE8A, 0x8AC4A6FE, 0xFE8AC4A6, 0xA6FE8AC4, }, /* x=16 */
300 { 0xCAAFF381, 0x81CAAFF3, 0xF381CAAF, 0xAFF381CA, }, /* x=17 */
301 { 0x90D8B8E8, 0xE890D8B8, 0xB8E890D8, 0xD8B8E890, }, /* x=18 */
302 { 0x9ED1B5E3, 0xE39ED1B5, 0xB5E39ED1, 0xD1B5E39E, }, /* x=19 */
303 { 0x8CCAA2FE, 0xFE8CCAA2, 0xA2FE8CCA, 0xCAA2FE8C, }, /* x=1A */
304 { 0x82C3AFF5, 0xF582C3AF, 0xAFF582C3, 0xC3AFF582, }, /* x=1B */
305 { 0xA8FC8CC4, 0xC4A8FC8C, 0x8CC4A8FC, 0xFC8CC4A8, }, /* x=1C */
306 { 0xA6F581CF, 0xCFA6F581, 0x81CFA6F5, 0xF581CFA6, }, /* x=1D */
307 { 0xB4EE96D2, 0xD2B4EE96, 0x96D2B4EE, 0xEE96D2B4, }, /* x=1E */
308 { 0xBAE79BD9, 0xD9BAE79B, 0x9BD9BAE7, 0xE79BD9BA, }, /* x=1F */
309 { 0xDB3BBB7B, 0x7BDB3BBB, 0xBB7BDB3B, 0x3BBB7BDB, }, /* x=20 */
310 { 0xD532B670, 0x70D532B6, 0xB670D532, 0x32B670D5, }, /* x=21 */
311 { 0xC729A16D, 0x6DC729A1, 0xA16DC729, 0x29A16DC7, }, /* x=22 */
312 { 0xC920AC66, 0x66C920AC, 0xAC66C920, 0x20AC66C9, }, /* x=23 */
313 { 0xE31F8F57, 0x57E31F8F, 0x8F57E31F, 0x1F8F57E3, }, /* x=24 */
314 { 0xED16825C, 0x5CED1682, 0x825CED16, 0x16825CED, }, /* x=25 */
315 { 0xFF0D9541, 0x41FF0D95, 0x9541FF0D, 0x0D9541FF, }, /* x=26 */
316 { 0xF104984A, 0x4AF10498, 0x984AF104, 0x04984AF1, }, /* x=27 */
317 { 0xAB73D323, 0x23AB73D3, 0xD323AB73, 0x73D323AB, }, /* x=28 */
318 { 0xA57ADE28, 0x28A57ADE, 0xDE28A57A, 0x7ADE28A5, }, /* x=29 */
319 { 0xB761C935, 0x35B761C9, 0xC935B761, 0x61C935B7, }, /* x=2A */
320 { 0xB968C43E, 0x3EB968C4, 0xC43EB968, 0x68C43EB9, }, /* x=2B */
321 { 0x9357E70F, 0x0F9357E7, 0xE70F9357, 0x57E70F93, }, /* x=2C */
322 { 0x9D5EEA04, 0x049D5EEA, 0xEA049D5E, 0x5EEA049D, }, /* x=2D */
323 { 0x8F45FD19, 0x198F45FD, 0xFD198F45, 0x45FD198F, }, /* x=2E */
324 { 0x814CF012, 0x12814CF0, 0xF012814C, 0x4CF01281, }, /* x=2F */
325 { 0x3BAB6BCB, 0xCB3BAB6B, 0x6BCB3BAB, 0xAB6BCB3B, }, /* x=30 */
326 { 0x35A266C0, 0xC035A266, 0x66C035A2, 0xA266C035, }, /* x=31 */
327 { 0x27B971DD, 0xDD27B971, 0x71DD27B9, 0xB971DD27, }, /* x=32 */
328 { 0x29B07CD6, 0xD629B07C, 0x7CD629B0, 0xB07CD629, }, /* x=33 */
329 { 0x038F5FE7, 0xE7038F5F, 0x5FE7038F, 0x8F5FE703, }, /* x=34 */
330 { 0x0D8652EC, 0xEC0D8652, 0x52EC0D86, 0x8652EC0D, }, /* x=35 */
331 { 0x1F9D45F1, 0xF11F9D45, 0x45F11F9D, 0x9D45F11F, }, /* x=36 */
332 { 0x119448FA, 0xFA119448, 0x48FA1194, 0x9448FA11, }, /* x=37 */
333 { 0x4BE30393, 0x934BE303, 0x03934BE3, 0xE303934B, }, /* x=38 */
334 { 0x45EA0E98, 0x9845EA0E, 0x0E9845EA, 0xEA0E9845, }, /* x=39 */
335 { 0x57F11985, 0x8557F119, 0x198557F1, 0xF1198557, }, /* x=3A */
336 { 0x59F8148E, 0x8E59F814, 0x148E59F8, 0xF8148E59, }, /* x=3B */
337 { 0x73C737BF, 0xBF73C737, 0x37BF73C7, 0xC737BF73, }, /* x=3C */
338 { 0x7DCE3AB4, 0xB47DCE3A, 0x3AB47DCE, 0xCE3AB47D, }, /* x=3D */
339 { 0x6FD52DA9, 0xA96FD52D, 0x2DA96FD5, 0xD52DA96F, }, /* x=3E */
340 { 0x61DC20A2, 0xA261DC20, 0x20A261DC, 0xDC20A261, }, /* x=3F */
341 { 0xAD766DF6, 0xF6AD766D, 0x6DF6AD76, 0x766DF6AD, }, /* x=40 */
342 { 0xA37F60FD, 0xFDA37F60, 0x60FDA37F, 0x7F60FDA3, }, /* x=41 */
343 { 0xB16477E0, 0xE0B16477, 0x77E0B164, 0x6477E0B1, }, /* x=42 */
344 { 0xBF6D7AEB, 0xEBBF6D7A, 0x7AEBBF6D, 0x6D7AEBBF, }, /* x=43 */
345 { 0x955259DA, 0xDA955259, 0x59DA9552, 0x5259DA95, }, /* x=44 */
346 { 0x9B5B54D1, 0xD19B5B54, 0x54D19B5B, 0x5B54D19B, }, /* x=45 */
347 { 0x894043CC, 0xCC894043, 0x43CC8940, 0x4043CC89, }, /* x=46 */
348 { 0x87494EC7, 0xC787494E, 0x4EC78749, 0x494EC787, }, /* x=47 */
349 { 0xDD3E05AE, 0xAEDD3E05, 0x05AEDD3E, 0x3E05AEDD, }, /* x=48 */
350 { 0xD33708A5, 0xA5D33708, 0x08A5D337, 0x3708A5D3, }, /* x=49 */
351 { 0xC12C1FB8, 0xB8C12C1F, 0x1FB8C12C, 0x2C1FB8C1, }, /* x=4A */
352 { 0xCF2512B3, 0xB3CF2512, 0x12B3CF25, 0x2512B3CF, }, /* x=4B */
353 { 0xE51A3182, 0x82E51A31, 0x3182E51A, 0x1A3182E5, }, /* x=4C */
354 { 0xEB133C89, 0x89EB133C, 0x3C89EB13, 0x133C89EB, }, /* x=4D */
355 { 0xF9082B94, 0x94F9082B, 0x2B94F908, 0x082B94F9, }, /* x=4E */
356 { 0xF701269F, 0x9FF70126, 0x269FF701, 0x01269FF7, }, /* x=4F */
357 { 0x4DE6BD46, 0x464DE6BD, 0xBD464DE6, 0xE6BD464D, }, /* x=50 */
358 { 0x43EFB04D, 0x4D43EFB0, 0xB04D43EF, 0xEFB04D43, }, /* x=51 */
359 { 0x51F4A750, 0x5051F4A7, 0xA75051F4, 0xF4A75051, }, /* x=52 */
360 { 0x5FFDAA5B, 0x5B5FFDAA, 0xAA5B5FFD, 0xFDAA5B5F, }, /* x=53 */
361 { 0x75C2896A, 0x6A75C289, 0x896A75C2, 0xC2896A75, }, /* x=54 */
362 { 0x7BCB8461, 0x617BCB84, 0x84617BCB, 0xCB84617B, }, /* x=55 */
363 { 0x69D0937C, 0x7C69D093, 0x937C69D0, 0xD0937C69, }, /* x=56 */
364 { 0x67D99E77, 0x7767D99E, 0x9E7767D9, 0xD99E7767, }, /* x=57 */
365 { 0x3DAED51E, 0x1E3DAED5, 0xD51E3DAE, 0xAED51E3D, }, /* x=58 */
366 { 0x33A7D815, 0x1533A7D8, 0xD81533A7, 0xA7D81533, }, /* x=59 */
367 { 0x21BCCF08, 0x0821BCCF, 0xCF0821BC, 0xBCCF0821, }, /* x=5A */
368 { 0x2FB5C203, 0x032FB5C2, 0xC2032FB5, 0xB5C2032F, }, /* x=5B */
369 { 0x058AE132, 0x32058AE1, 0xE132058A, 0x8AE13205, }, /* x=5C */
370 { 0x0B83EC39, 0x390B83EC, 0xEC390B83, 0x83EC390B, }, /* x=5D */
371 { 0x1998FB24, 0x241998FB, 0xFB241998, 0x98FB2419, }, /* x=5E */
372 { 0x1791F62F, 0x2F1791F6, 0xF62F1791, 0x91F62F17, }, /* x=5F */
373 { 0x764DD68D, 0x8D764DD6, 0xD68D764D, 0x4DD68D76, }, /* x=60 */
374 { 0x7844DB86, 0x867844DB, 0xDB867844, 0x44DB8678, }, /* x=61 */
375 { 0x6A5FCC9B, 0x9B6A5FCC, 0xCC9B6A5F, 0x5FCC9B6A, }, /* x=62 */
376 { 0x6456C190, 0x906456C1, 0xC1906456, 0x56C19064, }, /* x=63 */
377 { 0x4E69E2A1, 0xA14E69E2, 0xE2A14E69, 0x69E2A14E, }, /* x=64 */
378 { 0x4060EFAA, 0xAA4060EF, 0xEFAA4060, 0x60EFAA40, }, /* x=65 */
379 { 0x527BF8B7, 0xB7527BF8, 0xF8B7527B, 0x7BF8B752, }, /* x=66 */
380 { 0x5C72F5BC, 0xBC5C72F5, 0xF5BC5C72, 0x72F5BC5C, }, /* x=67 */
381 { 0x0605BED5, 0xD50605BE, 0xBED50605, 0x05BED506, }, /* x=68 */
382 { 0x080CB3DE, 0xDE080CB3, 0xB3DE080C, 0x0CB3DE08, }, /* x=69 */
383 { 0x1A17A4C3, 0xC31A17A4, 0xA4C31A17, 0x17A4C31A, }, /* x=6A */
384 { 0x141EA9C8, 0xC8141EA9, 0xA9C8141E, 0x1EA9C814, }, /* x=6B */
385 { 0x3E218AF9, 0xF93E218A, 0x8AF93E21, 0x218AF93E, }, /* x=6C */
386 { 0x302887F2, 0xF2302887, 0x87F23028, 0x2887F230, }, /* x=6D */
387 { 0x223390EF, 0xEF223390, 0x90EF2233, 0x3390EF22, }, /* x=6E */
388 { 0x2C3A9DE4, 0xE42C3A9D, 0x9DE42C3A, 0x3A9DE42C, }, /* x=6F */
389 { 0x96DD063D, 0x3D96DD06, 0x063D96DD, 0xDD063D96, }, /* x=70 */
390 { 0x98D40B36, 0x3698D40B, 0x0B3698D4, 0xD40B3698, }, /* x=71 */
391 { 0x8ACF1C2B, 0x2B8ACF1C, 0x1C2B8ACF, 0xCF1C2B8A, }, /* x=72 */
392 { 0x84C61120, 0x2084C611, 0x112084C6, 0xC6112084, }, /* x=73 */
393 { 0xAEF93211, 0x11AEF932, 0x3211AEF9, 0xF93211AE, }, /* x=74 */
394 { 0xA0F03F1A, 0x1AA0F03F, 0x3F1AA0F0, 0xF03F1AA0, }, /* x=75 */
395 { 0xB2EB2807, 0x07B2EB28, 0x2807B2EB, 0xEB2807B2, }, /* x=76 */
396 { 0xBCE2250C, 0x0CBCE225, 0x250CBCE2, 0xE2250CBC, }, /* x=77 */
397 { 0xE6956E65, 0x65E6956E, 0x6E65E695, 0x956E65E6, }, /* x=78 */
398 { 0xE89C636E, 0x6EE89C63, 0x636EE89C, 0x9C636EE8, }, /* x=79 */
399 { 0xFA877473, 0x73FA8774, 0x7473FA87, 0x877473FA, }, /* x=7A */
400 { 0xF48E7978, 0x78F48E79, 0x7978F48E, 0x8E7978F4, }, /* x=7B */
401 { 0xDEB15A49, 0x49DEB15A, 0x5A49DEB1, 0xB15A49DE, }, /* x=7C */
402 { 0xD0B85742, 0x42D0B857, 0x5742D0B8, 0xB85742D0, }, /* x=7D */
403 { 0xC2A3405F, 0x5FC2A340, 0x405FC2A3, 0xA3405FC2, }, /* x=7E */
404 { 0xCCAA4D54, 0x54CCAA4D, 0x4D54CCAA, 0xAA4D54CC, }, /* x=7F */
405 { 0x41ECDAF7, 0xF741ECDA, 0xDAF741EC, 0xECDAF741, }, /* x=80 */
406 { 0x4FE5D7FC, 0xFC4FE5D7, 0xD7FC4FE5, 0xE5D7FC4F, }, /* x=81 */
407 { 0x5DFEC0E1, 0xE15DFEC0, 0xC0E15DFE, 0xFEC0E15D, }, /* x=82 */
408 { 0x53F7CDEA, 0xEA53F7CD, 0xCDEA53F7, 0xF7CDEA53, }, /* x=83 */
409 { 0x79C8EEDB, 0xDB79C8EE, 0xEEDB79C8, 0xC8EEDB79, }, /* x=84 */
410 { 0x77C1E3D0, 0xD077C1E3, 0xE3D077C1, 0xC1E3D077, }, /* x=85 */
411 { 0x65DAF4CD, 0xCD65DAF4, 0xF4CD65DA, 0xDAF4CD65, }, /* x=86 */
412 { 0x6BD3F9C6, 0xC66BD3F9, 0xF9C66BD3, 0xD3F9C66B, }, /* x=87 */
413 { 0x31A4B2AF, 0xAF31A4B2, 0xB2AF31A4, 0xA4B2AF31, }, /* x=88 */
414 { 0x3FADBFA4, 0xA43FADBF, 0xBFA43FAD, 0xADBFA43F, }, /* x=89 */
415 { 0x2DB6A8B9, 0xB92DB6A8, 0xA8B92DB6, 0xB6A8B92D, }, /* x=8A */
416 { 0x23BFA5B2, 0xB223BFA5, 0xA5B223BF, 0xBFA5B223, }, /* x=8B */
417 { 0x09808683, 0x83098086, 0x86830980, 0x80868309, }, /* x=8C */
418 { 0x07898B88, 0x8807898B, 0x8B880789, 0x898B8807, }, /* x=8D */
419 { 0x15929C95, 0x9515929C, 0x9C951592, 0x929C9515, }, /* x=8E */
420 { 0x1B9B919E, 0x9E1B9B91, 0x919E1B9B, 0x9B919E1B, }, /* x=8F */
421 { 0xA17C0A47, 0x47A17C0A, 0x0A47A17C, 0x7C0A47A1, }, /* x=90 */
422 { 0xAF75074C, 0x4CAF7507, 0x074CAF75, 0x75074CAF, }, /* x=91 */
423 { 0xBD6E1051, 0x51BD6E10, 0x1051BD6E, 0x6E1051BD, }, /* x=92 */
424 { 0xB3671D5A, 0x5AB3671D, 0x1D5AB367, 0x671D5AB3, }, /* x=93 */
425 { 0x99583E6B, 0x6B99583E, 0x3E6B9958, 0x583E6B99, }, /* x=94 */
426 { 0x97513360, 0x60975133, 0x33609751, 0x51336097, }, /* x=95 */
427 { 0x854A247D, 0x7D854A24, 0x247D854A, 0x4A247D85, }, /* x=96 */
428 { 0x8B432976, 0x768B4329, 0x29768B43, 0x4329768B, }, /* x=97 */
429 { 0xD134621F, 0x1FD13462, 0x621FD134, 0x34621FD1, }, /* x=98 */
430 { 0xDF3D6F14, 0x14DF3D6F, 0x6F14DF3D, 0x3D6F14DF, }, /* x=99 */
431 { 0xCD267809, 0x09CD2678, 0x7809CD26, 0x267809CD, }, /* x=9A */
432 { 0xC32F7502, 0x02C32F75, 0x7502C32F, 0x2F7502C3, }, /* x=9B */
433 { 0xE9105633, 0x33E91056, 0x5633E910, 0x105633E9, }, /* x=9C */
434 { 0xE7195B38, 0x38E7195B, 0x5B38E719, 0x195B38E7, }, /* x=9D */
435 { 0xF5024C25, 0x25F5024C, 0x4C25F502, 0x024C25F5, }, /* x=9E */
436 { 0xFB0B412E, 0x2EFB0B41, 0x412EFB0B, 0x0B412EFB, }, /* x=9F */
437 { 0x9AD7618C, 0x8C9AD761, 0x618C9AD7, 0xD7618C9A, }, /* x=A0 */
438 { 0x94DE6C87, 0x8794DE6C, 0x6C8794DE, 0xDE6C8794, }, /* x=A1 */
439 { 0x86C57B9A, 0x9A86C57B, 0x7B9A86C5, 0xC57B9A86, }, /* x=A2 */
440 { 0x88CC7691, 0x9188CC76, 0x769188CC, 0xCC769188, }, /* x=A3 */
441 { 0xA2F355A0, 0xA0A2F355, 0x55A0A2F3, 0xF355A0A2, }, /* x=A4 */
442 { 0xACFA58AB, 0xABACFA58, 0x58ABACFA, 0xFA58ABAC, }, /* x=A5 */
443 { 0xBEE14FB6, 0xB6BEE14F, 0x4FB6BEE1, 0xE14FB6BE, }, /* x=A6 */
444 { 0xB0E842BD, 0xBDB0E842, 0x42BDB0E8, 0xE842BDB0, }, /* x=A7 */
445 { 0xEA9F09D4, 0xD4EA9F09, 0x09D4EA9F, 0x9F09D4EA, }, /* x=A8 */
446 { 0xE49604DF, 0xDFE49604, 0x04DFE496, 0x9604DFE4, }, /* x=A9 */
447 { 0xF68D13C2, 0xC2F68D13, 0x13C2F68D, 0x8D13C2F6, }, /* x=AA */
448 { 0xF8841EC9, 0xC9F8841E, 0x1EC9F884, 0x841EC9F8, }, /* x=AB */
449 { 0xD2BB3DF8, 0xF8D2BB3D, 0x3DF8D2BB, 0xBB3DF8D2, }, /* x=AC */
450 { 0xDCB230F3, 0xF3DCB230, 0x30F3DCB2, 0xB230F3DC, }, /* x=AD */
451 { 0xCEA927EE, 0xEECEA927, 0x27EECEA9, 0xA927EECE, }, /* x=AE */
452 { 0xC0A02AE5, 0xE5C0A02A, 0x2AE5C0A0, 0xA02AE5C0, }, /* x=AF */
453 { 0x7A47B13C, 0x3C7A47B1, 0xB13C7A47, 0x47B13C7A, }, /* x=B0 */
454 { 0x744EBC37, 0x37744EBC, 0xBC37744E, 0x4EBC3774, }, /* x=B1 */
455 { 0x6655AB2A, 0x2A6655AB, 0xAB2A6655, 0x55AB2A66, }, /* x=B2 */
456 { 0x685CA621, 0x21685CA6, 0xA621685C, 0x5CA62168, }, /* x=B3 */
457 { 0x42638510, 0x10426385, 0x85104263, 0x63851042, }, /* x=B4 */
458 { 0x4C6A881B, 0x1B4C6A88, 0x881B4C6A, 0x6A881B4C, }, /* x=B5 */
459 { 0x5E719F06, 0x065E719F, 0x9F065E71, 0x719F065E, }, /* x=B6 */
460 { 0x5078920D, 0x0D507892, 0x920D5078, 0x78920D50, }, /* x=B7 */
461 { 0x0A0FD964, 0x640A0FD9, 0xD9640A0F, 0x0FD9640A, }, /* x=B8 */
462 { 0x0406D46F, 0x6F0406D4, 0xD46F0406, 0x06D46F04, }, /* x=B9 */
463 { 0x161DC372, 0x72161DC3, 0xC372161D, 0x1DC37216, }, /* x=BA */
464 { 0x1814CE79, 0x791814CE, 0xCE791814, 0x14CE7918, }, /* x=BB */
465 { 0x322BED48, 0x48322BED, 0xED48322B, 0x2BED4832, }, /* x=BC */
466 { 0x3C22E043, 0x433C22E0, 0xE0433C22, 0x22E0433C, }, /* x=BD */
467 { 0x2E39F75E, 0x5E2E39F7, 0xF75E2E39, 0x39F75E2E, }, /* x=BE */
468 { 0x2030FA55, 0x552030FA, 0xFA552030, 0x30FA5520, }, /* x=BF */
469 { 0xEC9AB701, 0x01EC9AB7, 0xB701EC9A, 0x9AB701EC, }, /* x=C0 */
470 { 0xE293BA0A, 0x0AE293BA, 0xBA0AE293, 0x93BA0AE2, }, /* x=C1 */
471 { 0xF088AD17, 0x17F088AD, 0xAD17F088, 0x88AD17F0, }, /* x=C2 */
472 { 0xFE81A01C, 0x1CFE81A0, 0xA01CFE81, 0x81A01CFE, }, /* x=C3 */
473 { 0xD4BE832D, 0x2DD4BE83, 0x832DD4BE, 0xBE832DD4, }, /* x=C4 */
474 { 0xDAB78E26, 0x26DAB78E, 0x8E26DAB7, 0xB78E26DA, }, /* x=C5 */
475 { 0xC8AC993B, 0x3BC8AC99, 0x993BC8AC, 0xAC993BC8, }, /* x=C6 */
476 { 0xC6A59430, 0x30C6A594, 0x9430C6A5, 0xA59430C6, }, /* x=C7 */
477 { 0x9CD2DF59, 0x599CD2DF, 0xDF599CD2, 0xD2DF599C, }, /* x=C8 */
478 { 0x92DBD252, 0x5292DBD2, 0xD25292DB, 0xDBD25292, }, /* x=C9 */
479 { 0x80C0C54F, 0x4F80C0C5, 0xC54F80C0, 0xC0C54F80, }, /* x=CA */
480 { 0x8EC9C844, 0x448EC9C8, 0xC8448EC9, 0xC9C8448E, }, /* x=CB */
481 { 0xA4F6EB75, 0x75A4F6EB, 0xEB75A4F6, 0xF6EB75A4, }, /* x=CC */
482 { 0xAAFFE67E, 0x7EAAFFE6, 0xE67EAAFF, 0xFFE67EAA, }, /* x=CD */
483 { 0xB8E4F163, 0x63B8E4F1, 0xF163B8E4, 0xE4F163B8, }, /* x=CE */
484 { 0xB6EDFC68, 0x68B6EDFC, 0xFC68B6ED, 0xEDFC68B6, }, /* x=CF */
485 { 0x0C0A67B1, 0xB10C0A67, 0x67B10C0A, 0x0A67B10C, }, /* x=D0 */
486 { 0x02036ABA, 0xBA02036A, 0x6ABA0203, 0x036ABA02, }, /* x=D1 */
487 { 0x10187DA7, 0xA710187D, 0x7DA71018, 0x187DA710, }, /* x=D2 */
488 { 0x1E1170AC, 0xAC1E1170, 0x70AC1E11, 0x1170AC1E, }, /* x=D3 */
489 { 0x342E539D, 0x9D342E53, 0x539D342E, 0x2E539D34, }, /* x=D4 */
490 { 0x3A275E96, 0x963A275E, 0x5E963A27, 0x275E963A, }, /* x=D5 */
491 { 0x283C498B, 0x8B283C49, 0x498B283C, 0x3C498B28, }, /* x=D6 */
492 { 0x26354480, 0x80263544, 0x44802635, 0x35448026, }, /* x=D7 */
493 { 0x7C420FE9, 0xE97C420F, 0x0FE97C42, 0x420FE97C, }, /* x=D8 */
494 { 0x724B02E2, 0xE2724B02, 0x02E2724B, 0x4B02E272, }, /* x=D9 */
495 { 0x605015FF, 0xFF605015, 0x15FF6050, 0x5015FF60, }, /* x=DA */
496 { 0x6E5918F4, 0xF46E5918, 0x18F46E59, 0x5918F46E, }, /* x=DB */
497 { 0x44663BC5, 0xC544663B, 0x3BC54466, 0x663BC544, }, /* x=DC */
498 { 0x4A6F36CE, 0xCE4A6F36, 0x36CE4A6F, 0x6F36CE4A, }, /* x=DD */
499 { 0x587421D3, 0xD3587421, 0x21D35874, 0x7421D358, }, /* x=DE */
500 { 0x567D2CD8, 0xD8567D2C, 0x2CD8567D, 0x7D2CD856, }, /* x=DF */
501 { 0x37A10C7A, 0x7A37A10C, 0x0C7A37A1, 0xA10C7A37, }, /* x=E0 */
502 { 0x39A80171, 0x7139A801, 0x017139A8, 0xA8017139, }, /* x=E1 */
503 { 0x2BB3166C, 0x6C2BB316, 0x166C2BB3, 0xB3166C2B, }, /* x=E2 */
504 { 0x25BA1B67, 0x6725BA1B, 0x1B6725BA, 0xBA1B6725, }, /* x=E3 */
505 { 0x0F853856, 0x560F8538, 0x38560F85, 0x8538560F, }, /* x=E4 */
506 { 0x018C355D, 0x5D018C35, 0x355D018C, 0x8C355D01, }, /* x=E5 */
507 { 0x13972240, 0x40139722, 0x22401397, 0x97224013, }, /* x=E6 */
508 { 0x1D9E2F4B, 0x4B1D9E2F, 0x2F4B1D9E, 0x9E2F4B1D, }, /* x=E7 */
509 { 0x47E96422, 0x2247E964, 0x642247E9, 0xE9642247, }, /* x=E8 */
510 { 0x49E06929, 0x2949E069, 0x692949E0, 0xE0692949, }, /* x=E9 */
511 { 0x5BFB7E34, 0x345BFB7E, 0x7E345BFB, 0xFB7E345B, }, /* x=EA */
512 { 0x55F2733F, 0x3F55F273, 0x733F55F2, 0xF2733F55, }, /* x=EB */
513 { 0x7FCD500E, 0x0E7FCD50, 0x500E7FCD, 0xCD500E7F, }, /* x=EC */
514 { 0x71C45D05, 0x0571C45D, 0x5D0571C4, 0xC45D0571, }, /* x=ED */
515 { 0x63DF4A18, 0x1863DF4A, 0x4A1863DF, 0xDF4A1863, }, /* x=EE */
516 { 0x6DD64713, 0x136DD647, 0x47136DD6, 0xD647136D, }, /* x=EF */
517 { 0xD731DCCA, 0xCAD731DC, 0xDCCAD731, 0x31DCCAD7, }, /* x=F0 */
518 { 0xD938D1C1, 0xC1D938D1, 0xD1C1D938, 0x38D1C1D9, }, /* x=F1 */
519 { 0xCB23C6DC, 0xDCCB23C6, 0xC6DCCB23, 0x23C6DCCB, }, /* x=F2 */
520 { 0xC52ACBD7, 0xD7C52ACB, 0xCBD7C52A, 0x2ACBD7C5, }, /* x=F3 */
521 { 0xEF15E8E6, 0xE6EF15E8, 0xE8E6EF15, 0x15E8E6EF, }, /* x=F4 */
522 { 0xE11CE5ED, 0xEDE11CE5, 0xE5EDE11C, 0x1CE5EDE1, }, /* x=F5 */
523 { 0xF307F2F0, 0xF0F307F2, 0xF2F0F307, 0x07F2F0F3, }, /* x=F6 */
524 { 0xFD0EFFFB, 0xFBFD0EFF, 0xFFFBFD0E, 0x0EFFFBFD, }, /* x=F7 */
525 { 0xA779B492, 0x92A779B4, 0xB492A779, 0x79B492A7, }, /* x=F8 */
526 { 0xA970B999, 0x99A970B9, 0xB999A970, 0x70B999A9, }, /* x=F9 */
527 { 0xBB6BAE84, 0x84BB6BAE, 0xAE84BB6B, 0x6BAE84BB, }, /* x=FA */
528 { 0xB562A38F, 0x8FB562A3, 0xA38FB562, 0x62A38FB5, }, /* x=FB */
529 { 0x9F5D80BE, 0xBE9F5D80, 0x80BE9F5D, 0x5D80BE9F, }, /* x=FC */
530 { 0x91548DB5, 0xB591548D, 0x8DB59154, 0x548DB591, }, /* x=FD */
531 { 0x834F9AA8, 0xA8834F9A, 0x9AA8834F, 0x4F9AA883, }, /* x=FE */
532 { 0x8D4697A3, 0xA38D4697, 0x97A38D46, 0x4697A38D, }, /* x=FF */
533 };
534
535
536
537 /*
538 AES_Te0[x] = S [x].[02, 01, 01, 03];
539 AES_Te1[x] = S [x].[03, 02, 01, 01];
540 AES_Te2[x] = S [x].[01, 03, 02, 01];
541 AES_Te3[x] = S [x].[01, 01, 03, 02];
542 AES_Te4[x] = S [x].[01, 01, 01, 01];
543
544 AES_Td0[x] = Si[x].[0e, 09, 0d, 0b];
545 AES_Td1[x] = Si[x].[0b, 0e, 09, 0d];
546 AES_Td2[x] = Si[x].[0d, 0b, 0e, 09];
547 AES_Td3[x] = Si[x].[09, 0d, 0b, 0e];
548 AES_Td4[x] = Si[x].[01, 01, 01, 01];
549 */
550
551 const uint32_t AES_Te0[256] = {
552 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
553 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
554 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
555 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
556 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
557 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
558 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
559 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
560 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
561 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
562 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
563 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
564 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
565 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
566 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
567 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
568 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
569 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
570 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
571 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
572 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
573 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
574 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
575 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
576 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
577 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
578 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
579 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
580 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
581 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
582 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
583 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
584 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
585 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
586 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
587 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
588 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
589 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
590 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
591 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
592 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
593 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
594 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
595 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
596 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
597 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
598 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
599 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
600 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
601 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
602 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
603 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
604 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
605 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
606 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
607 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
608 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
609 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
610 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
611 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
612 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
613 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
614 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
615 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
616 };
617 const uint32_t AES_Te1[256] = {
618 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,
619 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,
620 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,
621 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,
622 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
623 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,
624 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,
625 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,
626 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,
627 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
628 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,
629 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,
630 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,
631 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,
632 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
633 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,
634 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,
635 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,
636 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,
637 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
638 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,
639 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,
640 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,
641 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,
642 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
643 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,
644 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,
645 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,
646 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,
647 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
648 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,
649 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,
650 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,
651 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,
652 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
653 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,
654 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,
655 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,
656 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,
657 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
658 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,
659 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,
660 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,
661 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,
662 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
663 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,
664 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,
665 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,
666 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,
667 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
668 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,
669 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,
670 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,
671 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,
672 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
673 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,
674 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,
675 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,
676 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,
677 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
678 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,
679 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,
680 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,
681 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,
682 };
683 const uint32_t AES_Te2[256] = {
684 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,
685 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,
686 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,
687 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,
688 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
689 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,
690 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,
691 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,
692 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,
693 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
694 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,
695 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,
696 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,
697 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,
698 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
699 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,
700 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,
701 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,
702 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,
703 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
704 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,
705 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,
706 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,
707 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,
708 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
709 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,
710 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,
711 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,
712 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,
713 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
714 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,
715 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,
716 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,
717 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,
718 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
719 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,
720 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,
721 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,
722 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,
723 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
724 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,
725 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,
726 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,
727 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,
728 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
729 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,
730 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,
731 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,
732 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,
733 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
734 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,
735 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,
736 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,
737 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,
738 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
739 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,
740 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,
741 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,
742 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,
743 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
744 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,
745 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,
746 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,
747 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,
748 };
749 const uint32_t AES_Te3[256] = {
750
751 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,
752 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,
753 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,
754 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,
755 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
756 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,
757 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,
758 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,
759 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,
760 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
761 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,
762 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,
763 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,
764 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,
765 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
766 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,
767 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,
768 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,
769 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,
770 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
771 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,
772 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,
773 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,
774 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,
775 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
776 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,
777 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,
778 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,
779 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,
780 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
781 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,
782 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,
783 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,
784 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,
785 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
786 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,
787 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,
788 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,
789 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,
790 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
791 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,
792 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,
793 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,
794 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,
795 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
796 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,
797 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,
798 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,
799 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,
800 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
801 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,
802 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,
803 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,
804 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,
805 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
806 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,
807 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,
808 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,
809 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,
810 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
811 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,
812 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,
813 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,
814 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,
815 };
816 const uint32_t AES_Te4[256] = {
817 0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU,
818 0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U,
819 0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU,
820 0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U,
821 0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU,
822 0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U,
823 0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU,
824 0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U,
825 0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U,
826 0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU,
827 0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U,
828 0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U,
829 0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U,
830 0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU,
831 0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U,
832 0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U,
833 0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU,
834 0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U,
835 0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U,
836 0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U,
837 0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU,
838 0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU,
839 0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U,
840 0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU,
841 0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU,
842 0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U,
843 0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU,
844 0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U,
845 0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU,
846 0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U,
847 0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U,
848 0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U,
849 0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU,
850 0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U,
851 0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU,
852 0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U,
853 0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU,
854 0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U,
855 0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U,
856 0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU,
857 0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU,
858 0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU,
859 0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U,
860 0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U,
861 0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU,
862 0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U,
863 0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU,
864 0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U,
865 0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU,
866 0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U,
867 0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU,
868 0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU,
869 0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U,
870 0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU,
871 0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U,
872 0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU,
873 0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U,
874 0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U,
875 0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U,
876 0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU,
877 0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU,
878 0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U,
879 0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU,
880 0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U,
881 };
882 const uint32_t AES_Td0[256] = {
883 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
884 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
885 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
886 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,
887 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
888 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,
889 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,
890 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,
891 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,
892 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
893 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,
894 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,
895 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,
896 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,
897 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
898 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,
899 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,
900 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,
901 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,
902 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
903 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,
904 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,
905 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,
906 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,
907 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
908 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,
909 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,
910 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,
911 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,
912 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
913 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,
914 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,
915 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,
916 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,
917 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
918 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,
919 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,
920 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,
921 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,
922 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
923 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,
924 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,
925 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,
926 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,
927 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
928 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,
929 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,
930 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,
931 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,
932 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
933 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,
934 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,
935 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,
936 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,
937 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
938 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,
939 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,
940 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,
941 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,
942 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
943 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,
944 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,
945 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
946 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
947 };
948 const uint32_t AES_Td1[256] = {
949 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,
950 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,
951 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU,
952 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U,
953 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,
954 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U,
955 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U,
956 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U,
957 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U,
958 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,
959 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU,
960 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU,
961 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U,
962 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU,
963 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,
964 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U,
965 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U,
966 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU,
967 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU,
968 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,
969 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU,
970 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U,
971 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU,
972 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU,
973 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,
974 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U,
975 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U,
976 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU,
977 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U,
978 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,
979 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U,
980 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U,
981 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U,
982 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU,
983 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,
984 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U,
985 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U,
986 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U,
987 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U,
988 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,
989 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU,
990 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU,
991 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U,
992 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU,
993 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,
994 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU,
995 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU,
996 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U,
997 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU,
998 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,
999 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U,
1000 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U,
1001 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U,
1002 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U,
1003 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,
1004 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U,
1005 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU,
1006 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U,
1007 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U,
1008 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,
1009 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U,
1010 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U,
1011 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,
1012 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,
1013 };
1014 const uint32_t AES_Td2[256] = {
1015 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,
1016 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,
1017 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U,
1018 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U,
1019 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,
1020 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U,
1021 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U,
1022 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U,
1023 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U,
1024 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,
1025 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U,
1026 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U,
1027 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU,
1028 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U,
1029 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,
1030 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U,
1031 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U,
1032 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U,
1033 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U,
1034 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,
1035
1036 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U,
1037 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U,
1038 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U,
1039 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U,
1040 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,
1041 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU,
1042 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU,
1043 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U,
1044 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU,
1045 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,
1046 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU,
1047 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU,
1048 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU,
1049 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU,
1050 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,
1051 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U,
1052 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U,
1053 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U,
1054 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U,
1055 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,
1056 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U,
1057 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU,
1058 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU,
1059 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U,
1060 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,
1061 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU,
1062 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU,
1063 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U,
1064 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U,
1065 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,
1066 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U,
1067 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U,
1068 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U,
1069 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U,
1070 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,
1071 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U,
1072 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U,
1073 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U,
1074 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U,
1075 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,
1076 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U,
1077 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU,
1078 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,
1079 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,
1080 };
1081 const uint32_t AES_Td3[256] = {
1082 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,
1083 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,
1084 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U,
1085 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U,
1086 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,
1087 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU,
1088 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U,
1089 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU,
1090 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U,
1091 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,
1092 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U,
1093 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U,
1094 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U,
1095 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U,
1096 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,
1097 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU,
1098 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU,
1099 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U,
1100 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U,
1101 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,
1102 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU,
1103 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U,
1104 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U,
1105 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U,
1106 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,
1107 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU,
1108 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U,
1109 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U,
1110 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU,
1111 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,
1112 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U,
1113 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U,
1114 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U,
1115 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU,
1116 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,
1117 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U,
1118 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U,
1119 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U,
1120 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U,
1121 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,
1122 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U,
1123 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU,
1124 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U,
1125 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U,
1126 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,
1127 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU,
1128 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U,
1129 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU,
1130 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U,
1131 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,
1132 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U,
1133 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U,
1134 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U,
1135 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U,
1136 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,
1137 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU,
1138 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU,
1139 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU,
1140 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U,
1141 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,
1142 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U,
1143 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU,
1144 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,
1145 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,
1146 };
1147 const uint32_t AES_Td4[256] = {
1148 0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U,
1149 0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U,
1150 0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU,
1151 0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU,
1152 0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U,
1153 0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U,
1154 0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U,
1155 0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU,
1156 0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U,
1157 0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU,
1158 0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU,
1159 0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU,
1160 0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U,
1161 0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U,
1162 0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U,
1163 0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U,
1164 0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U,
1165 0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U,
1166 0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU,
1167 0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U,
1168 0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U,
1169 0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU,
1170 0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U,
1171 0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U,
1172 0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U,
1173 0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU,
1174 0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U,
1175 0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U,
1176 0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU,
1177 0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U,
1178 0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U,
1179 0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU,
1180 0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U,
1181 0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU,
1182 0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU,
1183 0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U,
1184 0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U,
1185 0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U,
1186 0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U,
1187 0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU,
1188 0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U,
1189 0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U,
1190 0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU,
1191 0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU,
1192 0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU,
1193 0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U,
1194 0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU,
1195 0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U,
1196 0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U,
1197 0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U,
1198 0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U,
1199 0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU,
1200 0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U,
1201 0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU,
1202 0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU,
1203 0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU,
1204 0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU,
1205 0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U,
1206 0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU,
1207 0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U,
1208 0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU,
1209 0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U,
1210 0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U,
1211 0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU,
1212 };
1213 static const u32 rcon[] = {
1214 0x01000000, 0x02000000, 0x04000000, 0x08000000,
1215 0x10000000, 0x20000000, 0x40000000, 0x80000000,
1216 0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
1217 };
1218
1219 /*
1220 * Perform SubBytes + ShiftRows + AddRoundKey.
1221 */
1222 static inline void
1223 aesenc_SB_SR_AK_swap(AESState *ret, const AESState *st,
1224 const AESState *rk, bool swap)
1225 {
1226 const int swap_b = swap ? 15 : 0;
1227 AESState t;
1228
1229 t.b[swap_b ^ 0x0] = AES_sbox[st->b[swap_b ^ AES_SH(0x0)]];
1230 t.b[swap_b ^ 0x1] = AES_sbox[st->b[swap_b ^ AES_SH(0x1)]];
1231 t.b[swap_b ^ 0x2] = AES_sbox[st->b[swap_b ^ AES_SH(0x2)]];
1232 t.b[swap_b ^ 0x3] = AES_sbox[st->b[swap_b ^ AES_SH(0x3)]];
1233 t.b[swap_b ^ 0x4] = AES_sbox[st->b[swap_b ^ AES_SH(0x4)]];
1234 t.b[swap_b ^ 0x5] = AES_sbox[st->b[swap_b ^ AES_SH(0x5)]];
1235 t.b[swap_b ^ 0x6] = AES_sbox[st->b[swap_b ^ AES_SH(0x6)]];
1236 t.b[swap_b ^ 0x7] = AES_sbox[st->b[swap_b ^ AES_SH(0x7)]];
1237 t.b[swap_b ^ 0x8] = AES_sbox[st->b[swap_b ^ AES_SH(0x8)]];
1238 t.b[swap_b ^ 0x9] = AES_sbox[st->b[swap_b ^ AES_SH(0x9)]];
1239 t.b[swap_b ^ 0xa] = AES_sbox[st->b[swap_b ^ AES_SH(0xA)]];
1240 t.b[swap_b ^ 0xb] = AES_sbox[st->b[swap_b ^ AES_SH(0xB)]];
1241 t.b[swap_b ^ 0xc] = AES_sbox[st->b[swap_b ^ AES_SH(0xC)]];
1242 t.b[swap_b ^ 0xd] = AES_sbox[st->b[swap_b ^ AES_SH(0xD)]];
1243 t.b[swap_b ^ 0xe] = AES_sbox[st->b[swap_b ^ AES_SH(0xE)]];
1244 t.b[swap_b ^ 0xf] = AES_sbox[st->b[swap_b ^ AES_SH(0xF)]];
1245
1246 /*
1247 * Perform the AddRoundKey with generic vectors.
1248 * This may be expanded to either host integer or host vector code.
1249 * The key and output endianness match, so no bswap required.
1250 */
1251 ret->v = t.v ^ rk->v;
1252 }
1253
1254 void aesenc_SB_SR_AK_gen(AESState *r, const AESState *s, const AESState *k)
1255 {
1256 aesenc_SB_SR_AK_swap(r, s, k, false);
1257 }
1258
1259 void aesenc_SB_SR_AK_genrev(AESState *r, const AESState *s, const AESState *k)
1260 {
1261 aesenc_SB_SR_AK_swap(r, s, k, true);
1262 }
1263
1264 /**
1265 * Expand the cipher key into the encryption key schedule.
1266 */
1267 int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
1268 AES_KEY *key) {
1269
1270 u32 *rk;
1271 int i = 0;
1272 u32 temp;
1273
1274 if (!userKey || !key)
1275 return -1;
1276 if (bits != 128 && bits != 192 && bits != 256)
1277 return -2;
1278
1279 rk = key->rd_key;
1280
1281 if (bits == 128)
1282 key->rounds = 10;
1283 else if (bits == 192)
1284 key->rounds = 12;
1285 else
1286 key->rounds = 14;
1287
1288 rk[0] = GETU32(userKey );
1289 rk[1] = GETU32(userKey + 4);
1290 rk[2] = GETU32(userKey + 8);
1291 rk[3] = GETU32(userKey + 12);
1292 if (bits == 128) {
1293 while (1) {
1294 temp = rk[3];
1295 rk[4] = rk[0] ^
1296 (AES_Te4[(temp >> 16) & 0xff] & 0xff000000) ^
1297 (AES_Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
1298 (AES_Te4[(temp ) & 0xff] & 0x0000ff00) ^
1299 (AES_Te4[(temp >> 24) ] & 0x000000ff) ^
1300 rcon[i];
1301 rk[5] = rk[1] ^ rk[4];
1302 rk[6] = rk[2] ^ rk[5];
1303 rk[7] = rk[3] ^ rk[6];
1304 if (++i == 10) {
1305 return 0;
1306 }
1307 rk += 4;
1308 }
1309 }
1310 rk[4] = GETU32(userKey + 16);
1311 rk[5] = GETU32(userKey + 20);
1312 if (bits == 192) {
1313 while (1) {
1314 temp = rk[ 5];
1315 rk[ 6] = rk[ 0] ^
1316 (AES_Te4[(temp >> 16) & 0xff] & 0xff000000) ^
1317 (AES_Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
1318 (AES_Te4[(temp ) & 0xff] & 0x0000ff00) ^
1319 (AES_Te4[(temp >> 24) ] & 0x000000ff) ^
1320 rcon[i];
1321 rk[ 7] = rk[ 1] ^ rk[ 6];
1322 rk[ 8] = rk[ 2] ^ rk[ 7];
1323 rk[ 9] = rk[ 3] ^ rk[ 8];
1324 if (++i == 8) {
1325 return 0;
1326 }
1327 rk[10] = rk[ 4] ^ rk[ 9];
1328 rk[11] = rk[ 5] ^ rk[10];
1329 rk += 6;
1330 }
1331 }
1332 rk[6] = GETU32(userKey + 24);
1333 rk[7] = GETU32(userKey + 28);
1334 if (bits == 256) {
1335 while (1) {
1336 temp = rk[ 7];
1337 rk[ 8] = rk[ 0] ^
1338 (AES_Te4[(temp >> 16) & 0xff] & 0xff000000) ^
1339 (AES_Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
1340 (AES_Te4[(temp ) & 0xff] & 0x0000ff00) ^
1341 (AES_Te4[(temp >> 24) ] & 0x000000ff) ^
1342 rcon[i];
1343 rk[ 9] = rk[ 1] ^ rk[ 8];
1344 rk[10] = rk[ 2] ^ rk[ 9];
1345 rk[11] = rk[ 3] ^ rk[10];
1346 if (++i == 7) {
1347 return 0;
1348 }
1349 temp = rk[11];
1350 rk[12] = rk[ 4] ^
1351 (AES_Te4[(temp >> 24) ] & 0xff000000) ^
1352 (AES_Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^
1353 (AES_Te4[(temp >> 8) & 0xff] & 0x0000ff00) ^
1354 (AES_Te4[(temp ) & 0xff] & 0x000000ff);
1355 rk[13] = rk[ 5] ^ rk[12];
1356 rk[14] = rk[ 6] ^ rk[13];
1357 rk[15] = rk[ 7] ^ rk[14];
1358
1359 rk += 8;
1360 }
1361 }
1362 abort();
1363 }
1364
1365 /**
1366 * Expand the cipher key into the decryption key schedule.
1367 */
1368 int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
1369 AES_KEY *key) {
1370
1371 u32 *rk;
1372 int i, j, status;
1373 u32 temp;
1374
1375 /* first, start with an encryption schedule */
1376 status = AES_set_encrypt_key(userKey, bits, key);
1377 if (status < 0)
1378 return status;
1379
1380 rk = key->rd_key;
1381
1382 /* invert the order of the round keys: */
1383 for (i = 0, j = 4 * (key->rounds); i < j; i += 4, j -= 4) {
1384 temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp;
1385 temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
1386 temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
1387 temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
1388 }
1389 /* apply the inverse MixColumn transform to all round keys but the first and the last: */
1390 for (i = 1; i < (key->rounds); i++) {
1391 rk += 4;
1392 rk[0] =
1393 AES_Td0[AES_Te4[(rk[0] >> 24) ] & 0xff] ^
1394 AES_Td1[AES_Te4[(rk[0] >> 16) & 0xff] & 0xff] ^
1395 AES_Td2[AES_Te4[(rk[0] >> 8) & 0xff] & 0xff] ^
1396 AES_Td3[AES_Te4[(rk[0] ) & 0xff] & 0xff];
1397 rk[1] =
1398 AES_Td0[AES_Te4[(rk[1] >> 24) ] & 0xff] ^
1399 AES_Td1[AES_Te4[(rk[1] >> 16) & 0xff] & 0xff] ^
1400 AES_Td2[AES_Te4[(rk[1] >> 8) & 0xff] & 0xff] ^
1401 AES_Td3[AES_Te4[(rk[1] ) & 0xff] & 0xff];
1402 rk[2] =
1403 AES_Td0[AES_Te4[(rk[2] >> 24) ] & 0xff] ^
1404 AES_Td1[AES_Te4[(rk[2] >> 16) & 0xff] & 0xff] ^
1405 AES_Td2[AES_Te4[(rk[2] >> 8) & 0xff] & 0xff] ^
1406 AES_Td3[AES_Te4[(rk[2] ) & 0xff] & 0xff];
1407 rk[3] =
1408 AES_Td0[AES_Te4[(rk[3] >> 24) ] & 0xff] ^
1409 AES_Td1[AES_Te4[(rk[3] >> 16) & 0xff] & 0xff] ^
1410 AES_Td2[AES_Te4[(rk[3] >> 8) & 0xff] & 0xff] ^
1411 AES_Td3[AES_Te4[(rk[3] ) & 0xff] & 0xff];
1412 }
1413 return 0;
1414 }
1415
1416 #ifndef AES_ASM
1417 /*
1418 * Encrypt a single block
1419 * in and out can overlap
1420 */
1421 void AES_encrypt(const unsigned char *in, unsigned char *out,
1422 const AES_KEY *key) {
1423
1424 const u32 *rk;
1425 u32 s0, s1, s2, s3, t0, t1, t2, t3;
1426 #ifndef FULL_UNROLL
1427 int r;
1428 #endif /* ?FULL_UNROLL */
1429
1430 assert(in && out && key);
1431 rk = key->rd_key;
1432
1433 /*
1434 * map byte array block to cipher state
1435 * and add initial round key:
1436 */
1437 s0 = GETU32(in ) ^ rk[0];
1438 s1 = GETU32(in + 4) ^ rk[1];
1439 s2 = GETU32(in + 8) ^ rk[2];
1440 s3 = GETU32(in + 12) ^ rk[3];
1441 #ifdef FULL_UNROLL
1442 /* round 1: */
1443 t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >> 8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[ 4];
1444 t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >> 8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[ 5];
1445 t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >> 8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[ 6];
1446 t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >> 8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[ 7];
1447 /* round 2: */
1448 s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >> 8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[ 8];
1449 s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >> 8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[ 9];
1450 s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >> 8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[10];
1451 s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >> 8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[11];
1452 /* round 3: */
1453 t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >> 8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[12];
1454 t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >> 8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[13];
1455 t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >> 8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[14];
1456 t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >> 8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[15];
1457 /* round 4: */
1458 s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >> 8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[16];
1459 s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >> 8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[17];
1460 s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >> 8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[18];
1461 s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >> 8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[19];
1462 /* round 5: */
1463 t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >> 8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[20];
1464 t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >> 8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[21];
1465 t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >> 8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[22];
1466 t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >> 8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[23];
1467 /* round 6: */
1468 s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >> 8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[24];
1469 s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >> 8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[25];
1470 s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >> 8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[26];
1471 s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >> 8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[27];
1472 /* round 7: */
1473 t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >> 8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[28];
1474 t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >> 8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[29];
1475 t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >> 8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[30];
1476 t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >> 8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[31];
1477 /* round 8: */
1478 s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >> 8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[32];
1479 s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >> 8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[33];
1480 s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >> 8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[34];
1481 s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >> 8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[35];
1482 /* round 9: */
1483 t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >> 8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[36];
1484 t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >> 8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[37];
1485 t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >> 8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[38];
1486 t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >> 8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[39];
1487 if (key->rounds > 10) {
1488 /* round 10: */
1489 s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >> 8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[40];
1490 s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >> 8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[41];
1491 s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >> 8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[42];
1492 s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >> 8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[43];
1493 /* round 11: */
1494 t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >> 8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[44];
1495 t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >> 8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[45];
1496 t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >> 8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[46];
1497 t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >> 8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[47];
1498 if (key->rounds > 12) {
1499 /* round 12: */
1500 s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >> 8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[48];
1501 s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >> 8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[49];
1502 s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >> 8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[50];
1503 s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >> 8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[51];
1504 /* round 13: */
1505 t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >> 8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[52];
1506 t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >> 8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[53];
1507 t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >> 8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[54];
1508 t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >> 8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[55];
1509 }
1510 }
1511 rk += key->rounds << 2;
1512 #else /* !FULL_UNROLL */
1513 /*
1514 * Nr - 1 full rounds:
1515 */
1516 r = key->rounds >> 1;
1517 for (;;) {
1518 t0 =
1519 AES_Te0[(s0 >> 24) ] ^
1520 AES_Te1[(s1 >> 16) & 0xff] ^
1521 AES_Te2[(s2 >> 8) & 0xff] ^
1522 AES_Te3[(s3 ) & 0xff] ^
1523 rk[4];
1524 t1 =
1525 AES_Te0[(s1 >> 24) ] ^
1526 AES_Te1[(s2 >> 16) & 0xff] ^
1527 AES_Te2[(s3 >> 8) & 0xff] ^
1528 AES_Te3[(s0 ) & 0xff] ^
1529 rk[5];
1530 t2 =
1531 AES_Te0[(s2 >> 24) ] ^
1532 AES_Te1[(s3 >> 16) & 0xff] ^
1533 AES_Te2[(s0 >> 8) & 0xff] ^
1534 AES_Te3[(s1 ) & 0xff] ^
1535 rk[6];
1536 t3 =
1537 AES_Te0[(s3 >> 24) ] ^
1538 AES_Te1[(s0 >> 16) & 0xff] ^
1539 AES_Te2[(s1 >> 8) & 0xff] ^
1540 AES_Te3[(s2 ) & 0xff] ^
1541 rk[7];
1542
1543 rk += 8;
1544 if (--r == 0) {
1545 break;
1546 }
1547
1548 s0 =
1549 AES_Te0[(t0 >> 24) ] ^
1550 AES_Te1[(t1 >> 16) & 0xff] ^
1551 AES_Te2[(t2 >> 8) & 0xff] ^
1552 AES_Te3[(t3 ) & 0xff] ^
1553 rk[0];
1554 s1 =
1555 AES_Te0[(t1 >> 24) ] ^
1556 AES_Te1[(t2 >> 16) & 0xff] ^
1557 AES_Te2[(t3 >> 8) & 0xff] ^
1558 AES_Te3[(t0 ) & 0xff] ^
1559 rk[1];
1560 s2 =
1561 AES_Te0[(t2 >> 24) ] ^
1562 AES_Te1[(t3 >> 16) & 0xff] ^
1563 AES_Te2[(t0 >> 8) & 0xff] ^
1564 AES_Te3[(t1 ) & 0xff] ^
1565 rk[2];
1566 s3 =
1567 AES_Te0[(t3 >> 24) ] ^
1568 AES_Te1[(t0 >> 16) & 0xff] ^
1569 AES_Te2[(t1 >> 8) & 0xff] ^
1570 AES_Te3[(t2 ) & 0xff] ^
1571 rk[3];
1572 }
1573 #endif /* ?FULL_UNROLL */
1574 /*
1575 * apply last round and
1576 * map cipher state to byte array block:
1577 */
1578 s0 =
1579 (AES_Te4[(t0 >> 24) ] & 0xff000000) ^
1580 (AES_Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
1581 (AES_Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^
1582 (AES_Te4[(t3 ) & 0xff] & 0x000000ff) ^
1583 rk[0];
1584 PUTU32(out , s0);
1585 s1 =
1586 (AES_Te4[(t1 >> 24) ] & 0xff000000) ^
1587 (AES_Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
1588 (AES_Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^
1589 (AES_Te4[(t0 ) & 0xff] & 0x000000ff) ^
1590 rk[1];
1591 PUTU32(out + 4, s1);
1592 s2 =
1593 (AES_Te4[(t2 >> 24) ] & 0xff000000) ^
1594 (AES_Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
1595 (AES_Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^
1596 (AES_Te4[(t1 ) & 0xff] & 0x000000ff) ^
1597 rk[2];
1598 PUTU32(out + 8, s2);
1599 s3 =
1600 (AES_Te4[(t3 >> 24) ] & 0xff000000) ^
1601 (AES_Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
1602 (AES_Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^
1603 (AES_Te4[(t2 ) & 0xff] & 0x000000ff) ^
1604 rk[3];
1605 PUTU32(out + 12, s3);
1606 }
1607
1608 /*
1609 * Decrypt a single block
1610 * in and out can overlap
1611 */
1612 void AES_decrypt(const unsigned char *in, unsigned char *out,
1613 const AES_KEY *key) {
1614
1615 const u32 *rk;
1616 u32 s0, s1, s2, s3, t0, t1, t2, t3;
1617 #ifndef FULL_UNROLL
1618 int r;
1619 #endif /* ?FULL_UNROLL */
1620
1621 assert(in && out && key);
1622 rk = key->rd_key;
1623
1624 /*
1625 * map byte array block to cipher state
1626 * and add initial round key:
1627 */
1628 s0 = GETU32(in ) ^ rk[0];
1629 s1 = GETU32(in + 4) ^ rk[1];
1630 s2 = GETU32(in + 8) ^ rk[2];
1631 s3 = GETU32(in + 12) ^ rk[3];
1632 #ifdef FULL_UNROLL
1633 /* round 1: */
1634 t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >> 8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[ 4];
1635 t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >> 8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[ 5];
1636 t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >> 8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[ 6];
1637 t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >> 8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[ 7];
1638 /* round 2: */
1639 s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >> 8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[ 8];
1640 s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >> 8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[ 9];
1641 s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >> 8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[10];
1642 s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >> 8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[11];
1643 /* round 3: */
1644 t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >> 8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[12];
1645 t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >> 8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[13];
1646 t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >> 8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[14];
1647 t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >> 8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[15];
1648 /* round 4: */
1649 s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >> 8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[16];
1650 s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >> 8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[17];
1651 s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >> 8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[18];
1652 s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >> 8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[19];
1653 /* round 5: */
1654 t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >> 8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[20];
1655 t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >> 8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[21];
1656 t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >> 8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[22];
1657 t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >> 8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[23];
1658 /* round 6: */
1659 s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >> 8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[24];
1660 s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >> 8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[25];
1661 s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >> 8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[26];
1662 s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >> 8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[27];
1663 /* round 7: */
1664 t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >> 8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[28];
1665 t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >> 8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[29];
1666 t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >> 8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[30];
1667 t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >> 8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[31];
1668 /* round 8: */
1669 s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >> 8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[32];
1670 s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >> 8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[33];
1671 s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >> 8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[34];
1672 s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >> 8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[35];
1673 /* round 9: */
1674 t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >> 8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[36];
1675 t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >> 8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[37];
1676 t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >> 8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[38];
1677 t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >> 8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[39];
1678 if (key->rounds > 10) {
1679 /* round 10: */
1680 s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >> 8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[40];
1681 s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >> 8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[41];
1682 s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >> 8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[42];
1683 s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >> 8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[43];
1684 /* round 11: */
1685 t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >> 8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[44];
1686 t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >> 8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[45];
1687 t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >> 8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[46];
1688 t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >> 8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[47];
1689 if (key->rounds > 12) {
1690 /* round 12: */
1691 s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >> 8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[48];
1692 s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >> 8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[49];
1693 s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >> 8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[50];
1694 s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >> 8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[51];
1695 /* round 13: */
1696 t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >> 8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[52];
1697 t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >> 8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[53];
1698 t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >> 8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[54];
1699 t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >> 8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[55];
1700 }
1701 }
1702 rk += key->rounds << 2;
1703 #else /* !FULL_UNROLL */
1704 /*
1705 * Nr - 1 full rounds:
1706 */
1707 r = key->rounds >> 1;
1708 for (;;) {
1709 t0 =
1710 AES_Td0[(s0 >> 24) ] ^
1711 AES_Td1[(s3 >> 16) & 0xff] ^
1712 AES_Td2[(s2 >> 8) & 0xff] ^
1713 AES_Td3[(s1 ) & 0xff] ^
1714 rk[4];
1715 t1 =
1716 AES_Td0[(s1 >> 24) ] ^
1717 AES_Td1[(s0 >> 16) & 0xff] ^
1718 AES_Td2[(s3 >> 8) & 0xff] ^
1719 AES_Td3[(s2 ) & 0xff] ^
1720 rk[5];
1721 t2 =
1722 AES_Td0[(s2 >> 24) ] ^
1723 AES_Td1[(s1 >> 16) & 0xff] ^
1724 AES_Td2[(s0 >> 8) & 0xff] ^
1725 AES_Td3[(s3 ) & 0xff] ^
1726 rk[6];
1727 t3 =
1728 AES_Td0[(s3 >> 24) ] ^
1729 AES_Td1[(s2 >> 16) & 0xff] ^
1730 AES_Td2[(s1 >> 8) & 0xff] ^
1731 AES_Td3[(s0 ) & 0xff] ^
1732 rk[7];
1733
1734 rk += 8;
1735 if (--r == 0) {
1736 break;
1737 }
1738
1739 s0 =
1740 AES_Td0[(t0 >> 24) ] ^
1741 AES_Td1[(t3 >> 16) & 0xff] ^
1742 AES_Td2[(t2 >> 8) & 0xff] ^
1743 AES_Td3[(t1 ) & 0xff] ^
1744 rk[0];
1745 s1 =
1746 AES_Td0[(t1 >> 24) ] ^
1747 AES_Td1[(t0 >> 16) & 0xff] ^
1748 AES_Td2[(t3 >> 8) & 0xff] ^
1749 AES_Td3[(t2 ) & 0xff] ^
1750 rk[1];
1751 s2 =
1752 AES_Td0[(t2 >> 24) ] ^
1753 AES_Td1[(t1 >> 16) & 0xff] ^
1754 AES_Td2[(t0 >> 8) & 0xff] ^
1755 AES_Td3[(t3 ) & 0xff] ^
1756 rk[2];
1757 s3 =
1758 AES_Td0[(t3 >> 24) ] ^
1759 AES_Td1[(t2 >> 16) & 0xff] ^
1760 AES_Td2[(t1 >> 8) & 0xff] ^
1761 AES_Td3[(t0 ) & 0xff] ^
1762 rk[3];
1763 }
1764 #endif /* ?FULL_UNROLL */
1765 /*
1766 * apply last round and
1767 * map cipher state to byte array block:
1768 */
1769 s0 =
1770 (AES_Td4[(t0 >> 24) ] & 0xff000000) ^
1771 (AES_Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
1772 (AES_Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^
1773 (AES_Td4[(t1 ) & 0xff] & 0x000000ff) ^
1774 rk[0];
1775 PUTU32(out , s0);
1776 s1 =
1777 (AES_Td4[(t1 >> 24) ] & 0xff000000) ^
1778 (AES_Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
1779 (AES_Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^
1780 (AES_Td4[(t2 ) & 0xff] & 0x000000ff) ^
1781 rk[1];
1782 PUTU32(out + 4, s1);
1783 s2 =
1784 (AES_Td4[(t2 >> 24) ] & 0xff000000) ^
1785 (AES_Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
1786 (AES_Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^
1787 (AES_Td4[(t3 ) & 0xff] & 0x000000ff) ^
1788 rk[2];
1789 PUTU32(out + 8, s2);
1790 s3 =
1791 (AES_Td4[(t3 >> 24) ] & 0xff000000) ^
1792 (AES_Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
1793 (AES_Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^
1794 (AES_Td4[(t0 ) & 0xff] & 0x000000ff) ^
1795 rk[3];
1796 PUTU32(out + 12, s3);
1797 }
1798
1799 #endif /* AES_ASM */