xref: /openbmc/qemu/crypto/aes.c (revision 57357322e4bd35c42816c769e36f39af11fc3ddc)
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  void aesdec_ISB_ISR_AK_IMC_gen(AESState *ret, const AESState *st,
1546                                 const AESState *rk)
1547  {
1548      aesdec_ISB_ISR_AK_gen(ret, st, rk);
1549      aesdec_IMC_gen(ret, ret);
1550  }
1551  
1552  void aesdec_ISB_ISR_AK_IMC_genrev(AESState *ret, const AESState *st,
1553                                    const AESState *rk)
1554  {
1555      aesdec_ISB_ISR_AK_genrev(ret, st, rk);
1556      aesdec_IMC_genrev(ret, ret);
1557  }
1558  
1559  /**
1560   * Expand the cipher key into the encryption key schedule.
1561   */
1562  int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
1563                          AES_KEY *key) {
1564  
1565          u32 *rk;
1566          int i = 0;
1567          u32 temp;
1568  
1569          if (!userKey || !key)
1570                  return -1;
1571          if (bits != 128 && bits != 192 && bits != 256)
1572                  return -2;
1573  
1574          rk = key->rd_key;
1575  
1576          if (bits == 128)
1577                  key->rounds = 10;
1578          else if (bits == 192)
1579                  key->rounds = 12;
1580          else
1581                  key->rounds = 14;
1582  
1583          rk[0] = GETU32(userKey     );
1584          rk[1] = GETU32(userKey +  4);
1585          rk[2] = GETU32(userKey +  8);
1586          rk[3] = GETU32(userKey + 12);
1587          if (bits == 128) {
1588                  while (1) {
1589                          temp  = rk[3];
1590                          rk[4] = rk[0] ^
1591                                  (AES_Te4[(temp >> 16) & 0xff] & 0xff000000) ^
1592                                  (AES_Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
1593                                  (AES_Te4[(temp      ) & 0xff] & 0x0000ff00) ^
1594                                  (AES_Te4[(temp >> 24)       ] & 0x000000ff) ^
1595                                  rcon[i];
1596                          rk[5] = rk[1] ^ rk[4];
1597                          rk[6] = rk[2] ^ rk[5];
1598                          rk[7] = rk[3] ^ rk[6];
1599                          if (++i == 10) {
1600                                  return 0;
1601                          }
1602                          rk += 4;
1603                  }
1604          }
1605          rk[4] = GETU32(userKey + 16);
1606          rk[5] = GETU32(userKey + 20);
1607          if (bits == 192) {
1608                  while (1) {
1609                          temp = rk[ 5];
1610                          rk[ 6] = rk[ 0] ^
1611                                  (AES_Te4[(temp >> 16) & 0xff] & 0xff000000) ^
1612                                  (AES_Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
1613                                  (AES_Te4[(temp      ) & 0xff] & 0x0000ff00) ^
1614                                  (AES_Te4[(temp >> 24)       ] & 0x000000ff) ^
1615                                  rcon[i];
1616                          rk[ 7] = rk[ 1] ^ rk[ 6];
1617                          rk[ 8] = rk[ 2] ^ rk[ 7];
1618                          rk[ 9] = rk[ 3] ^ rk[ 8];
1619                          if (++i == 8) {
1620                                  return 0;
1621                          }
1622                          rk[10] = rk[ 4] ^ rk[ 9];
1623                          rk[11] = rk[ 5] ^ rk[10];
1624                          rk += 6;
1625                  }
1626          }
1627          rk[6] = GETU32(userKey + 24);
1628          rk[7] = GETU32(userKey + 28);
1629          if (bits == 256) {
1630                  while (1) {
1631                          temp = rk[ 7];
1632                          rk[ 8] = rk[ 0] ^
1633                                  (AES_Te4[(temp >> 16) & 0xff] & 0xff000000) ^
1634                                  (AES_Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
1635                                  (AES_Te4[(temp      ) & 0xff] & 0x0000ff00) ^
1636                                  (AES_Te4[(temp >> 24)       ] & 0x000000ff) ^
1637                                  rcon[i];
1638                          rk[ 9] = rk[ 1] ^ rk[ 8];
1639                          rk[10] = rk[ 2] ^ rk[ 9];
1640                          rk[11] = rk[ 3] ^ rk[10];
1641                          if (++i == 7) {
1642                                  return 0;
1643                          }
1644                          temp = rk[11];
1645                          rk[12] = rk[ 4] ^
1646                                  (AES_Te4[(temp >> 24)       ] & 0xff000000) ^
1647                                  (AES_Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^
1648                                  (AES_Te4[(temp >>  8) & 0xff] & 0x0000ff00) ^
1649                                  (AES_Te4[(temp      ) & 0xff] & 0x000000ff);
1650                          rk[13] = rk[ 5] ^ rk[12];
1651                          rk[14] = rk[ 6] ^ rk[13];
1652                          rk[15] = rk[ 7] ^ rk[14];
1653  
1654                          rk += 8;
1655                  }
1656          }
1657          abort();
1658  }
1659  
1660  /**
1661   * Expand the cipher key into the decryption key schedule.
1662   */
1663  int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
1664                           AES_KEY *key) {
1665  
1666          u32 *rk;
1667          int i, j, status;
1668          u32 temp;
1669  
1670          /* first, start with an encryption schedule */
1671          status = AES_set_encrypt_key(userKey, bits, key);
1672          if (status < 0)
1673                  return status;
1674  
1675          rk = key->rd_key;
1676  
1677          /* invert the order of the round keys: */
1678          for (i = 0, j = 4 * (key->rounds); i < j; i += 4, j -= 4) {
1679                  temp = rk[i    ]; rk[i    ] = rk[j    ]; rk[j    ] = temp;
1680                  temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
1681                  temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
1682                  temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
1683          }
1684          /* apply the inverse MixColumn transform to all round keys but the first and the last: */
1685          for (i = 1; i < (key->rounds); i++) {
1686                  rk += 4;
1687                  rk[0] =
1688                          AES_Td0[AES_Te4[(rk[0] >> 24)       ] & 0xff] ^
1689                          AES_Td1[AES_Te4[(rk[0] >> 16) & 0xff] & 0xff] ^
1690                          AES_Td2[AES_Te4[(rk[0] >>  8) & 0xff] & 0xff] ^
1691                          AES_Td3[AES_Te4[(rk[0]      ) & 0xff] & 0xff];
1692                  rk[1] =
1693                          AES_Td0[AES_Te4[(rk[1] >> 24)       ] & 0xff] ^
1694                          AES_Td1[AES_Te4[(rk[1] >> 16) & 0xff] & 0xff] ^
1695                          AES_Td2[AES_Te4[(rk[1] >>  8) & 0xff] & 0xff] ^
1696                          AES_Td3[AES_Te4[(rk[1]      ) & 0xff] & 0xff];
1697                  rk[2] =
1698                          AES_Td0[AES_Te4[(rk[2] >> 24)       ] & 0xff] ^
1699                          AES_Td1[AES_Te4[(rk[2] >> 16) & 0xff] & 0xff] ^
1700                          AES_Td2[AES_Te4[(rk[2] >>  8) & 0xff] & 0xff] ^
1701                          AES_Td3[AES_Te4[(rk[2]      ) & 0xff] & 0xff];
1702                  rk[3] =
1703                          AES_Td0[AES_Te4[(rk[3] >> 24)       ] & 0xff] ^
1704                          AES_Td1[AES_Te4[(rk[3] >> 16) & 0xff] & 0xff] ^
1705                          AES_Td2[AES_Te4[(rk[3] >>  8) & 0xff] & 0xff] ^
1706                          AES_Td3[AES_Te4[(rk[3]      ) & 0xff] & 0xff];
1707          }
1708          return 0;
1709  }
1710  
1711  #ifndef AES_ASM
1712  /*
1713   * Encrypt a single block
1714   * in and out can overlap
1715   */
1716  void AES_encrypt(const unsigned char *in, unsigned char *out,
1717                   const AES_KEY *key) {
1718  
1719          const u32 *rk;
1720          u32 s0, s1, s2, s3, t0, t1, t2, t3;
1721  #ifndef FULL_UNROLL
1722          int r;
1723  #endif /* ?FULL_UNROLL */
1724  
1725          assert(in && out && key);
1726          rk = key->rd_key;
1727  
1728          /*
1729           * map byte array block to cipher state
1730           * and add initial round key:
1731           */
1732          s0 = GETU32(in     ) ^ rk[0];
1733          s1 = GETU32(in +  4) ^ rk[1];
1734          s2 = GETU32(in +  8) ^ rk[2];
1735          s3 = GETU32(in + 12) ^ rk[3];
1736  #ifdef FULL_UNROLL
1737          /* round 1: */
1738          t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >>  8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[ 4];
1739          t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >>  8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[ 5];
1740          t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >>  8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[ 6];
1741          t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >>  8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[ 7];
1742          /* round 2: */
1743          s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >>  8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[ 8];
1744          s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >>  8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[ 9];
1745          s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >>  8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[10];
1746          s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >>  8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[11];
1747          /* round 3: */
1748          t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >>  8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[12];
1749          t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >>  8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[13];
1750          t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >>  8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[14];
1751          t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >>  8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[15];
1752          /* round 4: */
1753          s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >>  8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[16];
1754          s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >>  8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[17];
1755          s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >>  8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[18];
1756          s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >>  8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[19];
1757          /* round 5: */
1758          t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >>  8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[20];
1759          t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >>  8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[21];
1760          t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >>  8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[22];
1761          t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >>  8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[23];
1762          /* round 6: */
1763          s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >>  8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[24];
1764          s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >>  8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[25];
1765          s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >>  8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[26];
1766          s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >>  8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[27];
1767          /* round 7: */
1768          t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >>  8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[28];
1769          t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >>  8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[29];
1770          t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >>  8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[30];
1771          t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >>  8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[31];
1772          /* round 8: */
1773          s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >>  8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[32];
1774          s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >>  8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[33];
1775          s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >>  8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[34];
1776          s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >>  8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[35];
1777          /* round 9: */
1778          t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >>  8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[36];
1779          t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >>  8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[37];
1780          t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >>  8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[38];
1781          t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >>  8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[39];
1782      if (key->rounds > 10) {
1783          /* round 10: */
1784          s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >>  8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[40];
1785          s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >>  8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[41];
1786          s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >>  8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[42];
1787          s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >>  8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[43];
1788          /* round 11: */
1789          t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >>  8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[44];
1790          t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >>  8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[45];
1791          t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >>  8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[46];
1792          t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >>  8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[47];
1793          if (key->rounds > 12) {
1794              /* round 12: */
1795              s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >>  8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[48];
1796              s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >>  8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[49];
1797              s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >>  8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[50];
1798              s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >>  8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[51];
1799              /* round 13: */
1800              t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >>  8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[52];
1801              t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >>  8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[53];
1802              t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >>  8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[54];
1803              t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >>  8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[55];
1804          }
1805      }
1806      rk += key->rounds << 2;
1807  #else  /* !FULL_UNROLL */
1808      /*
1809       * Nr - 1 full rounds:
1810       */
1811      r = key->rounds >> 1;
1812      for (;;) {
1813          t0 =
1814              AES_Te0[(s0 >> 24)       ] ^
1815              AES_Te1[(s1 >> 16) & 0xff] ^
1816              AES_Te2[(s2 >>  8) & 0xff] ^
1817              AES_Te3[(s3      ) & 0xff] ^
1818              rk[4];
1819          t1 =
1820              AES_Te0[(s1 >> 24)       ] ^
1821              AES_Te1[(s2 >> 16) & 0xff] ^
1822              AES_Te2[(s3 >>  8) & 0xff] ^
1823              AES_Te3[(s0      ) & 0xff] ^
1824              rk[5];
1825          t2 =
1826              AES_Te0[(s2 >> 24)       ] ^
1827              AES_Te1[(s3 >> 16) & 0xff] ^
1828              AES_Te2[(s0 >>  8) & 0xff] ^
1829              AES_Te3[(s1      ) & 0xff] ^
1830              rk[6];
1831          t3 =
1832              AES_Te0[(s3 >> 24)       ] ^
1833              AES_Te1[(s0 >> 16) & 0xff] ^
1834              AES_Te2[(s1 >>  8) & 0xff] ^
1835              AES_Te3[(s2      ) & 0xff] ^
1836              rk[7];
1837  
1838          rk += 8;
1839          if (--r == 0) {
1840              break;
1841          }
1842  
1843          s0 =
1844              AES_Te0[(t0 >> 24)       ] ^
1845              AES_Te1[(t1 >> 16) & 0xff] ^
1846              AES_Te2[(t2 >>  8) & 0xff] ^
1847              AES_Te3[(t3      ) & 0xff] ^
1848              rk[0];
1849          s1 =
1850              AES_Te0[(t1 >> 24)       ] ^
1851              AES_Te1[(t2 >> 16) & 0xff] ^
1852              AES_Te2[(t3 >>  8) & 0xff] ^
1853              AES_Te3[(t0      ) & 0xff] ^
1854              rk[1];
1855          s2 =
1856              AES_Te0[(t2 >> 24)       ] ^
1857              AES_Te1[(t3 >> 16) & 0xff] ^
1858              AES_Te2[(t0 >>  8) & 0xff] ^
1859              AES_Te3[(t1      ) & 0xff] ^
1860              rk[2];
1861          s3 =
1862              AES_Te0[(t3 >> 24)       ] ^
1863              AES_Te1[(t0 >> 16) & 0xff] ^
1864              AES_Te2[(t1 >>  8) & 0xff] ^
1865              AES_Te3[(t2      ) & 0xff] ^
1866              rk[3];
1867      }
1868  #endif /* ?FULL_UNROLL */
1869      /*
1870           * apply last round and
1871           * map cipher state to byte array block:
1872           */
1873          s0 =
1874                  (AES_Te4[(t0 >> 24)       ] & 0xff000000) ^
1875                  (AES_Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
1876                  (AES_Te4[(t2 >>  8) & 0xff] & 0x0000ff00) ^
1877                  (AES_Te4[(t3      ) & 0xff] & 0x000000ff) ^
1878                  rk[0];
1879          PUTU32(out     , s0);
1880          s1 =
1881                  (AES_Te4[(t1 >> 24)       ] & 0xff000000) ^
1882                  (AES_Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
1883                  (AES_Te4[(t3 >>  8) & 0xff] & 0x0000ff00) ^
1884                  (AES_Te4[(t0      ) & 0xff] & 0x000000ff) ^
1885                  rk[1];
1886          PUTU32(out +  4, s1);
1887          s2 =
1888                  (AES_Te4[(t2 >> 24)       ] & 0xff000000) ^
1889                  (AES_Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
1890                  (AES_Te4[(t0 >>  8) & 0xff] & 0x0000ff00) ^
1891                  (AES_Te4[(t1      ) & 0xff] & 0x000000ff) ^
1892                  rk[2];
1893          PUTU32(out +  8, s2);
1894          s3 =
1895                  (AES_Te4[(t3 >> 24)       ] & 0xff000000) ^
1896                  (AES_Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
1897                  (AES_Te4[(t1 >>  8) & 0xff] & 0x0000ff00) ^
1898                  (AES_Te4[(t2      ) & 0xff] & 0x000000ff) ^
1899                  rk[3];
1900          PUTU32(out + 12, s3);
1901  }
1902  
1903  /*
1904   * Decrypt a single block
1905   * in and out can overlap
1906   */
1907  void AES_decrypt(const unsigned char *in, unsigned char *out,
1908                   const AES_KEY *key) {
1909  
1910          const u32 *rk;
1911          u32 s0, s1, s2, s3, t0, t1, t2, t3;
1912  #ifndef FULL_UNROLL
1913          int r;
1914  #endif /* ?FULL_UNROLL */
1915  
1916          assert(in && out && key);
1917          rk = key->rd_key;
1918  
1919          /*
1920           * map byte array block to cipher state
1921           * and add initial round key:
1922           */
1923      s0 = GETU32(in     ) ^ rk[0];
1924      s1 = GETU32(in +  4) ^ rk[1];
1925      s2 = GETU32(in +  8) ^ rk[2];
1926      s3 = GETU32(in + 12) ^ rk[3];
1927  #ifdef FULL_UNROLL
1928      /* round 1: */
1929      t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >>  8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[ 4];
1930      t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >>  8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[ 5];
1931      t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >>  8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[ 6];
1932      t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >>  8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[ 7];
1933      /* round 2: */
1934      s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >>  8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[ 8];
1935      s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >>  8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[ 9];
1936      s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >>  8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[10];
1937      s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >>  8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[11];
1938      /* round 3: */
1939      t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >>  8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[12];
1940      t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >>  8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[13];
1941      t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >>  8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[14];
1942      t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >>  8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[15];
1943      /* round 4: */
1944      s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >>  8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[16];
1945      s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >>  8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[17];
1946      s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >>  8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[18];
1947      s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >>  8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[19];
1948      /* round 5: */
1949      t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >>  8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[20];
1950      t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >>  8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[21];
1951      t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >>  8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[22];
1952      t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >>  8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[23];
1953      /* round 6: */
1954      s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >>  8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[24];
1955      s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >>  8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[25];
1956      s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >>  8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[26];
1957      s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >>  8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[27];
1958      /* round 7: */
1959      t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >>  8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[28];
1960      t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >>  8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[29];
1961      t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >>  8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[30];
1962      t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >>  8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[31];
1963      /* round 8: */
1964      s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >>  8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[32];
1965      s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >>  8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[33];
1966      s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >>  8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[34];
1967      s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >>  8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[35];
1968      /* round 9: */
1969      t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >>  8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[36];
1970      t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >>  8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[37];
1971      t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >>  8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[38];
1972      t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >>  8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[39];
1973      if (key->rounds > 10) {
1974          /* round 10: */
1975          s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >>  8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[40];
1976          s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >>  8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[41];
1977          s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >>  8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[42];
1978          s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >>  8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[43];
1979          /* round 11: */
1980          t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >>  8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[44];
1981          t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >>  8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[45];
1982          t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >>  8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[46];
1983          t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >>  8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[47];
1984          if (key->rounds > 12) {
1985              /* round 12: */
1986              s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >>  8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[48];
1987              s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >>  8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[49];
1988              s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >>  8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[50];
1989              s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >>  8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[51];
1990              /* round 13: */
1991              t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >>  8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[52];
1992              t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >>  8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[53];
1993              t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >>  8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[54];
1994              t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >>  8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[55];
1995          }
1996      }
1997          rk += key->rounds << 2;
1998  #else  /* !FULL_UNROLL */
1999      /*
2000       * Nr - 1 full rounds:
2001       */
2002      r = key->rounds >> 1;
2003      for (;;) {
2004          t0 =
2005              AES_Td0[(s0 >> 24)       ] ^
2006              AES_Td1[(s3 >> 16) & 0xff] ^
2007              AES_Td2[(s2 >>  8) & 0xff] ^
2008              AES_Td3[(s1      ) & 0xff] ^
2009              rk[4];
2010          t1 =
2011              AES_Td0[(s1 >> 24)       ] ^
2012              AES_Td1[(s0 >> 16) & 0xff] ^
2013              AES_Td2[(s3 >>  8) & 0xff] ^
2014              AES_Td3[(s2      ) & 0xff] ^
2015              rk[5];
2016          t2 =
2017              AES_Td0[(s2 >> 24)       ] ^
2018              AES_Td1[(s1 >> 16) & 0xff] ^
2019              AES_Td2[(s0 >>  8) & 0xff] ^
2020              AES_Td3[(s3      ) & 0xff] ^
2021              rk[6];
2022          t3 =
2023              AES_Td0[(s3 >> 24)       ] ^
2024              AES_Td1[(s2 >> 16) & 0xff] ^
2025              AES_Td2[(s1 >>  8) & 0xff] ^
2026              AES_Td3[(s0      ) & 0xff] ^
2027              rk[7];
2028  
2029          rk += 8;
2030          if (--r == 0) {
2031              break;
2032          }
2033  
2034          s0 =
2035              AES_Td0[(t0 >> 24)       ] ^
2036              AES_Td1[(t3 >> 16) & 0xff] ^
2037              AES_Td2[(t2 >>  8) & 0xff] ^
2038              AES_Td3[(t1      ) & 0xff] ^
2039              rk[0];
2040          s1 =
2041              AES_Td0[(t1 >> 24)       ] ^
2042              AES_Td1[(t0 >> 16) & 0xff] ^
2043              AES_Td2[(t3 >>  8) & 0xff] ^
2044              AES_Td3[(t2      ) & 0xff] ^
2045              rk[1];
2046          s2 =
2047              AES_Td0[(t2 >> 24)       ] ^
2048              AES_Td1[(t1 >> 16) & 0xff] ^
2049              AES_Td2[(t0 >>  8) & 0xff] ^
2050              AES_Td3[(t3      ) & 0xff] ^
2051              rk[2];
2052          s3 =
2053              AES_Td0[(t3 >> 24)       ] ^
2054              AES_Td1[(t2 >> 16) & 0xff] ^
2055              AES_Td2[(t1 >>  8) & 0xff] ^
2056              AES_Td3[(t0      ) & 0xff] ^
2057              rk[3];
2058      }
2059  #endif /* ?FULL_UNROLL */
2060      /*
2061           * apply last round and
2062           * map cipher state to byte array block:
2063           */
2064          s0 =
2065                  (AES_Td4[(t0 >> 24)       ] & 0xff000000) ^
2066                  (AES_Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
2067                  (AES_Td4[(t2 >>  8) & 0xff] & 0x0000ff00) ^
2068                  (AES_Td4[(t1      ) & 0xff] & 0x000000ff) ^
2069                  rk[0];
2070          PUTU32(out     , s0);
2071          s1 =
2072                  (AES_Td4[(t1 >> 24)       ] & 0xff000000) ^
2073                  (AES_Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
2074                  (AES_Td4[(t3 >>  8) & 0xff] & 0x0000ff00) ^
2075                  (AES_Td4[(t2      ) & 0xff] & 0x000000ff) ^
2076                  rk[1];
2077          PUTU32(out +  4, s1);
2078          s2 =
2079                  (AES_Td4[(t2 >> 24)       ] & 0xff000000) ^
2080                  (AES_Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
2081                  (AES_Td4[(t0 >>  8) & 0xff] & 0x0000ff00) ^
2082                  (AES_Td4[(t3      ) & 0xff] & 0x000000ff) ^
2083                  rk[2];
2084          PUTU32(out +  8, s2);
2085          s3 =
2086                  (AES_Td4[(t3 >> 24)       ] & 0xff000000) ^
2087                  (AES_Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
2088                  (AES_Td4[(t1 >>  8) & 0xff] & 0x0000ff00) ^
2089                  (AES_Td4[(t0      ) & 0xff] & 0x000000ff) ^
2090                  rk[3];
2091          PUTU32(out + 12, s3);
2092  }
2093  
2094  #endif /* AES_ASM */
2095