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