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