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