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