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