1 /** 2 * 3 * aes.c - integrated in QEMU by Fabrice Bellard from the OpenSSL project. 4 */ 5 /* 6 * rijndael-alg-fst.c 7 * 8 * @version 3.0 (December 2000) 9 * 10 * Optimised ANSI C code for the Rijndael cipher (now AES) 11 * 12 * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be> 13 * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be> 14 * @author Paulo Barreto <paulo.barreto@terra.com.br> 15 * 16 * This code is hereby placed in the public domain. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS 19 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE 22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 25 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 26 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 27 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 28 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 #include "qemu/osdep.h" 31 #include "qemu/bswap.h" 32 #include "qemu/bitops.h" 33 #include "crypto/aes.h" 34 #include "crypto/aes-round.h" 35 36 typedef uint32_t u32; 37 typedef uint8_t u8; 38 39 /* This controls loop-unrolling in aes_core.c */ 40 #undef FULL_UNROLL 41 # define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3])) 42 # define PUTU32(ct, st) { (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); } 43 44 const uint8_t AES_sbox[256] = { 45 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 46 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, 47 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 48 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 49 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 50 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, 51 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 52 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, 53 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 54 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 55 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 56 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, 57 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 58 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, 59 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 60 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 61 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 62 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, 63 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 64 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, 65 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 66 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 67 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 68 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, 69 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 70 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, 71 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 72 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 73 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 74 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, 75 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 76 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16, 77 }; 78 79 const uint8_t AES_isbox[256] = { 80 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 81 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, 82 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 83 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 84 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 85 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, 86 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 87 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, 88 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 89 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 90 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 91 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, 92 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 93 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, 94 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 95 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 96 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 97 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, 98 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 99 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, 100 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 101 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 102 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 103 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, 104 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 105 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, 106 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 107 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 108 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 109 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, 110 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 111 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D, 112 }; 113 114 /* AES ShiftRows, for complete unrolling. */ 115 #define AES_SH(X) (((X) * 5) & 15) 116 117 /* AES InvShiftRows, for complete unrolling. */ 118 #define AES_ISH(X) (((X) * 13) & 15) 119 120 /* 121 * MixColumns lookup table, for use with rot32. 122 */ 123 static const uint32_t AES_mc_rot[256] = { 124 0x00000000, 0x03010102, 0x06020204, 0x05030306, 125 0x0c040408, 0x0f05050a, 0x0a06060c, 0x0907070e, 126 0x18080810, 0x1b090912, 0x1e0a0a14, 0x1d0b0b16, 127 0x140c0c18, 0x170d0d1a, 0x120e0e1c, 0x110f0f1e, 128 0x30101020, 0x33111122, 0x36121224, 0x35131326, 129 0x3c141428, 0x3f15152a, 0x3a16162c, 0x3917172e, 130 0x28181830, 0x2b191932, 0x2e1a1a34, 0x2d1b1b36, 131 0x241c1c38, 0x271d1d3a, 0x221e1e3c, 0x211f1f3e, 132 0x60202040, 0x63212142, 0x66222244, 0x65232346, 133 0x6c242448, 0x6f25254a, 0x6a26264c, 0x6927274e, 134 0x78282850, 0x7b292952, 0x7e2a2a54, 0x7d2b2b56, 135 0x742c2c58, 0x772d2d5a, 0x722e2e5c, 0x712f2f5e, 136 0x50303060, 0x53313162, 0x56323264, 0x55333366, 137 0x5c343468, 0x5f35356a, 0x5a36366c, 0x5937376e, 138 0x48383870, 0x4b393972, 0x4e3a3a74, 0x4d3b3b76, 139 0x443c3c78, 0x473d3d7a, 0x423e3e7c, 0x413f3f7e, 140 0xc0404080, 0xc3414182, 0xc6424284, 0xc5434386, 141 0xcc444488, 0xcf45458a, 0xca46468c, 0xc947478e, 142 0xd8484890, 0xdb494992, 0xde4a4a94, 0xdd4b4b96, 143 0xd44c4c98, 0xd74d4d9a, 0xd24e4e9c, 0xd14f4f9e, 144 0xf05050a0, 0xf35151a2, 0xf65252a4, 0xf55353a6, 145 0xfc5454a8, 0xff5555aa, 0xfa5656ac, 0xf95757ae, 146 0xe85858b0, 0xeb5959b2, 0xee5a5ab4, 0xed5b5bb6, 147 0xe45c5cb8, 0xe75d5dba, 0xe25e5ebc, 0xe15f5fbe, 148 0xa06060c0, 0xa36161c2, 0xa66262c4, 0xa56363c6, 149 0xac6464c8, 0xaf6565ca, 0xaa6666cc, 0xa96767ce, 150 0xb86868d0, 0xbb6969d2, 0xbe6a6ad4, 0xbd6b6bd6, 151 0xb46c6cd8, 0xb76d6dda, 0xb26e6edc, 0xb16f6fde, 152 0x907070e0, 0x937171e2, 0x967272e4, 0x957373e6, 153 0x9c7474e8, 0x9f7575ea, 0x9a7676ec, 0x997777ee, 154 0x887878f0, 0x8b7979f2, 0x8e7a7af4, 0x8d7b7bf6, 155 0x847c7cf8, 0x877d7dfa, 0x827e7efc, 0x817f7ffe, 156 0x9b80801b, 0x98818119, 0x9d82821f, 0x9e83831d, 157 0x97848413, 0x94858511, 0x91868617, 0x92878715, 158 0x8388880b, 0x80898909, 0x858a8a0f, 0x868b8b0d, 159 0x8f8c8c03, 0x8c8d8d01, 0x898e8e07, 0x8a8f8f05, 160 0xab90903b, 0xa8919139, 0xad92923f, 0xae93933d, 161 0xa7949433, 0xa4959531, 0xa1969637, 0xa2979735, 162 0xb398982b, 0xb0999929, 0xb59a9a2f, 0xb69b9b2d, 163 0xbf9c9c23, 0xbc9d9d21, 0xb99e9e27, 0xba9f9f25, 164 0xfba0a05b, 0xf8a1a159, 0xfda2a25f, 0xfea3a35d, 165 0xf7a4a453, 0xf4a5a551, 0xf1a6a657, 0xf2a7a755, 166 0xe3a8a84b, 0xe0a9a949, 0xe5aaaa4f, 0xe6abab4d, 167 0xefacac43, 0xecadad41, 0xe9aeae47, 0xeaafaf45, 168 0xcbb0b07b, 0xc8b1b179, 0xcdb2b27f, 0xceb3b37d, 169 0xc7b4b473, 0xc4b5b571, 0xc1b6b677, 0xc2b7b775, 170 0xd3b8b86b, 0xd0b9b969, 0xd5baba6f, 0xd6bbbb6d, 171 0xdfbcbc63, 0xdcbdbd61, 0xd9bebe67, 0xdabfbf65, 172 0x5bc0c09b, 0x58c1c199, 0x5dc2c29f, 0x5ec3c39d, 173 0x57c4c493, 0x54c5c591, 0x51c6c697, 0x52c7c795, 174 0x43c8c88b, 0x40c9c989, 0x45caca8f, 0x46cbcb8d, 175 0x4fcccc83, 0x4ccdcd81, 0x49cece87, 0x4acfcf85, 176 0x6bd0d0bb, 0x68d1d1b9, 0x6dd2d2bf, 0x6ed3d3bd, 177 0x67d4d4b3, 0x64d5d5b1, 0x61d6d6b7, 0x62d7d7b5, 178 0x73d8d8ab, 0x70d9d9a9, 0x75dadaaf, 0x76dbdbad, 179 0x7fdcdca3, 0x7cdddda1, 0x79dedea7, 0x7adfdfa5, 180 0x3be0e0db, 0x38e1e1d9, 0x3de2e2df, 0x3ee3e3dd, 181 0x37e4e4d3, 0x34e5e5d1, 0x31e6e6d7, 0x32e7e7d5, 182 0x23e8e8cb, 0x20e9e9c9, 0x25eaeacf, 0x26ebebcd, 183 0x2fececc3, 0x2cededc1, 0x29eeeec7, 0x2aefefc5, 184 0x0bf0f0fb, 0x08f1f1f9, 0x0df2f2ff, 0x0ef3f3fd, 185 0x07f4f4f3, 0x04f5f5f1, 0x01f6f6f7, 0x02f7f7f5, 186 0x13f8f8eb, 0x10f9f9e9, 0x15fafaef, 0x16fbfbed, 187 0x1ffcfce3, 0x1cfdfde1, 0x19fefee7, 0x1affffe5, 188 }; 189 190 /* 191 * Inverse MixColumns lookup table, for use with rot32. 192 */ 193 static const uint32_t AES_imc_rot[256] = { 194 0x00000000, 0x0b0d090e, 0x161a121c, 0x1d171b12, 195 0x2c342438, 0x27392d36, 0x3a2e3624, 0x31233f2a, 196 0x58684870, 0x5365417e, 0x4e725a6c, 0x457f5362, 197 0x745c6c48, 0x7f516546, 0x62467e54, 0x694b775a, 198 0xb0d090e0, 0xbbdd99ee, 0xa6ca82fc, 0xadc78bf2, 199 0x9ce4b4d8, 0x97e9bdd6, 0x8afea6c4, 0x81f3afca, 200 0xe8b8d890, 0xe3b5d19e, 0xfea2ca8c, 0xf5afc382, 201 0xc48cfca8, 0xcf81f5a6, 0xd296eeb4, 0xd99be7ba, 202 0x7bbb3bdb, 0x70b632d5, 0x6da129c7, 0x66ac20c9, 203 0x578f1fe3, 0x5c8216ed, 0x41950dff, 0x4a9804f1, 204 0x23d373ab, 0x28de7aa5, 0x35c961b7, 0x3ec468b9, 205 0x0fe75793, 0x04ea5e9d, 0x19fd458f, 0x12f04c81, 206 0xcb6bab3b, 0xc066a235, 0xdd71b927, 0xd67cb029, 207 0xe75f8f03, 0xec52860d, 0xf1459d1f, 0xfa489411, 208 0x9303e34b, 0x980eea45, 0x8519f157, 0x8e14f859, 209 0xbf37c773, 0xb43ace7d, 0xa92dd56f, 0xa220dc61, 210 0xf66d76ad, 0xfd607fa3, 0xe07764b1, 0xeb7a6dbf, 211 0xda595295, 0xd1545b9b, 0xcc434089, 0xc74e4987, 212 0xae053edd, 0xa50837d3, 0xb81f2cc1, 0xb31225cf, 213 0x82311ae5, 0x893c13eb, 0x942b08f9, 0x9f2601f7, 214 0x46bde64d, 0x4db0ef43, 0x50a7f451, 0x5baafd5f, 215 0x6a89c275, 0x6184cb7b, 0x7c93d069, 0x779ed967, 216 0x1ed5ae3d, 0x15d8a733, 0x08cfbc21, 0x03c2b52f, 217 0x32e18a05, 0x39ec830b, 0x24fb9819, 0x2ff69117, 218 0x8dd64d76, 0x86db4478, 0x9bcc5f6a, 0x90c15664, 219 0xa1e2694e, 0xaaef6040, 0xb7f87b52, 0xbcf5725c, 220 0xd5be0506, 0xdeb30c08, 0xc3a4171a, 0xc8a91e14, 221 0xf98a213e, 0xf2872830, 0xef903322, 0xe49d3a2c, 222 0x3d06dd96, 0x360bd498, 0x2b1ccf8a, 0x2011c684, 223 0x1132f9ae, 0x1a3ff0a0, 0x0728ebb2, 0x0c25e2bc, 224 0x656e95e6, 0x6e639ce8, 0x737487fa, 0x78798ef4, 225 0x495ab1de, 0x4257b8d0, 0x5f40a3c2, 0x544daacc, 226 0xf7daec41, 0xfcd7e54f, 0xe1c0fe5d, 0xeacdf753, 227 0xdbeec879, 0xd0e3c177, 0xcdf4da65, 0xc6f9d36b, 228 0xafb2a431, 0xa4bfad3f, 0xb9a8b62d, 0xb2a5bf23, 229 0x83868009, 0x888b8907, 0x959c9215, 0x9e919b1b, 230 0x470a7ca1, 0x4c0775af, 0x51106ebd, 0x5a1d67b3, 231 0x6b3e5899, 0x60335197, 0x7d244a85, 0x7629438b, 232 0x1f6234d1, 0x146f3ddf, 0x097826cd, 0x02752fc3, 233 0x335610e9, 0x385b19e7, 0x254c02f5, 0x2e410bfb, 234 0x8c61d79a, 0x876cde94, 0x9a7bc586, 0x9176cc88, 235 0xa055f3a2, 0xab58faac, 0xb64fe1be, 0xbd42e8b0, 236 0xd4099fea, 0xdf0496e4, 0xc2138df6, 0xc91e84f8, 237 0xf83dbbd2, 0xf330b2dc, 0xee27a9ce, 0xe52aa0c0, 238 0x3cb1477a, 0x37bc4e74, 0x2aab5566, 0x21a65c68, 239 0x10856342, 0x1b886a4c, 0x069f715e, 0x0d927850, 240 0x64d90f0a, 0x6fd40604, 0x72c31d16, 0x79ce1418, 241 0x48ed2b32, 0x43e0223c, 0x5ef7392e, 0x55fa3020, 242 0x01b79aec, 0x0aba93e2, 0x17ad88f0, 0x1ca081fe, 243 0x2d83bed4, 0x268eb7da, 0x3b99acc8, 0x3094a5c6, 244 0x59dfd29c, 0x52d2db92, 0x4fc5c080, 0x44c8c98e, 245 0x75ebf6a4, 0x7ee6ffaa, 0x63f1e4b8, 0x68fcedb6, 246 0xb1670a0c, 0xba6a0302, 0xa77d1810, 0xac70111e, 247 0x9d532e34, 0x965e273a, 0x8b493c28, 0x80443526, 248 0xe90f427c, 0xe2024b72, 0xff155060, 0xf418596e, 249 0xc53b6644, 0xce366f4a, 0xd3217458, 0xd82c7d56, 250 0x7a0ca137, 0x7101a839, 0x6c16b32b, 0x671bba25, 251 0x5638850f, 0x5d358c01, 0x40229713, 0x4b2f9e1d, 252 0x2264e947, 0x2969e049, 0x347efb5b, 0x3f73f255, 253 0x0e50cd7f, 0x055dc471, 0x184adf63, 0x1347d66d, 254 0xcadc31d7, 0xc1d138d9, 0xdcc623cb, 0xd7cb2ac5, 255 0xe6e815ef, 0xede51ce1, 0xf0f207f3, 0xfbff0efd, 256 0x92b479a7, 0x99b970a9, 0x84ae6bbb, 0x8fa362b5, 257 0xbe805d9f, 0xb58d5491, 0xa89a4f83, 0xa397468d, 258 }; 259 260 261 /* 262 AES_Te0[x] = S [x].[02, 01, 01, 03]; 263 AES_Te1[x] = S [x].[03, 02, 01, 01]; 264 AES_Te2[x] = S [x].[01, 03, 02, 01]; 265 AES_Te3[x] = S [x].[01, 01, 03, 02]; 266 AES_Te4[x] = S [x].[01, 01, 01, 01]; 267 268 AES_Td0[x] = Si[x].[0e, 09, 0d, 0b]; 269 AES_Td1[x] = Si[x].[0b, 0e, 09, 0d]; 270 AES_Td2[x] = Si[x].[0d, 0b, 0e, 09]; 271 AES_Td3[x] = Si[x].[09, 0d, 0b, 0e]; 272 AES_Td4[x] = Si[x].[01, 01, 01, 01]; 273 */ 274 275 static const uint32_t AES_Te0[256] = { 276 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, 277 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, 278 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, 279 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, 280 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, 281 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, 282 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, 283 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, 284 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, 285 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, 286 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, 287 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, 288 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, 289 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, 290 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, 291 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, 292 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, 293 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, 294 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, 295 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, 296 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, 297 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, 298 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, 299 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, 300 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, 301 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, 302 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, 303 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, 304 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, 305 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, 306 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, 307 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, 308 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, 309 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, 310 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, 311 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, 312 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, 313 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, 314 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, 315 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, 316 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, 317 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, 318 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, 319 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, 320 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, 321 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, 322 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, 323 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, 324 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, 325 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, 326 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, 327 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, 328 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, 329 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, 330 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, 331 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, 332 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, 333 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, 334 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, 335 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, 336 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, 337 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, 338 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, 339 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, 340 }; 341 342 static const uint32_t AES_Te1[256] = { 343 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, 344 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, 345 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, 346 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, 347 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, 348 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, 349 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, 350 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, 351 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, 352 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, 353 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, 354 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, 355 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, 356 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, 357 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, 358 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, 359 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, 360 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, 361 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, 362 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, 363 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, 364 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, 365 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, 366 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, 367 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, 368 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, 369 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, 370 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, 371 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, 372 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, 373 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, 374 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, 375 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, 376 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, 377 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, 378 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, 379 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, 380 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, 381 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, 382 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, 383 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, 384 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, 385 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, 386 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, 387 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, 388 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, 389 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, 390 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, 391 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, 392 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, 393 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, 394 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, 395 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, 396 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, 397 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, 398 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, 399 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, 400 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, 401 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, 402 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, 403 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, 404 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, 405 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, 406 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, 407 }; 408 409 static const uint32_t AES_Te2[256] = { 410 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, 411 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, 412 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, 413 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, 414 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, 415 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, 416 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, 417 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, 418 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, 419 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, 420 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, 421 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, 422 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, 423 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, 424 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, 425 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, 426 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, 427 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, 428 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, 429 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, 430 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, 431 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, 432 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, 433 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, 434 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, 435 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, 436 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, 437 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, 438 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, 439 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, 440 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, 441 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, 442 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, 443 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, 444 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, 445 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, 446 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, 447 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, 448 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, 449 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, 450 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, 451 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, 452 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, 453 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, 454 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, 455 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, 456 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, 457 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, 458 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, 459 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, 460 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, 461 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, 462 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, 463 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, 464 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, 465 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, 466 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, 467 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, 468 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, 469 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, 470 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, 471 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, 472 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, 473 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, 474 }; 475 476 static const uint32_t AES_Te3[256] = { 477 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, 478 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, 479 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, 480 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, 481 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, 482 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, 483 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, 484 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, 485 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, 486 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, 487 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, 488 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, 489 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, 490 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, 491 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, 492 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, 493 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, 494 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, 495 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, 496 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, 497 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, 498 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, 499 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, 500 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, 501 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, 502 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, 503 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, 504 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, 505 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, 506 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, 507 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, 508 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, 509 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, 510 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, 511 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, 512 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, 513 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, 514 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, 515 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, 516 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, 517 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, 518 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, 519 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, 520 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, 521 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, 522 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, 523 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, 524 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, 525 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, 526 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, 527 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, 528 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, 529 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, 530 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, 531 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, 532 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, 533 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, 534 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, 535 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, 536 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, 537 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, 538 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, 539 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, 540 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, 541 }; 542 543 static const uint32_t AES_Te4[256] = { 544 0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU, 545 0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U, 546 0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU, 547 0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U, 548 0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU, 549 0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U, 550 0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU, 551 0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U, 552 0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U, 553 0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU, 554 0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U, 555 0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U, 556 0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U, 557 0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU, 558 0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U, 559 0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U, 560 0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU, 561 0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U, 562 0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U, 563 0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U, 564 0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU, 565 0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU, 566 0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U, 567 0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU, 568 0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU, 569 0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U, 570 0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU, 571 0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U, 572 0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU, 573 0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U, 574 0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U, 575 0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U, 576 0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU, 577 0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U, 578 0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU, 579 0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U, 580 0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU, 581 0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U, 582 0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U, 583 0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU, 584 0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU, 585 0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU, 586 0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U, 587 0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U, 588 0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU, 589 0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U, 590 0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU, 591 0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U, 592 0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU, 593 0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U, 594 0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU, 595 0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU, 596 0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U, 597 0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU, 598 0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U, 599 0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU, 600 0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U, 601 0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U, 602 0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U, 603 0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU, 604 0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU, 605 0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U, 606 0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU, 607 0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U, 608 }; 609 610 static const uint32_t AES_Td0[256] = { 611 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, 612 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, 613 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, 614 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, 615 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, 616 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, 617 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, 618 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, 619 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, 620 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, 621 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, 622 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, 623 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, 624 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, 625 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, 626 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, 627 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, 628 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, 629 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, 630 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, 631 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, 632 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, 633 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, 634 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, 635 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, 636 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, 637 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, 638 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, 639 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, 640 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, 641 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, 642 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, 643 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, 644 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, 645 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, 646 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, 647 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, 648 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, 649 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, 650 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, 651 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, 652 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, 653 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, 654 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, 655 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, 656 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, 657 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, 658 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, 659 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, 660 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, 661 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, 662 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, 663 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, 664 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, 665 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, 666 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, 667 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, 668 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, 669 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, 670 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, 671 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, 672 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, 673 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, 674 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, 675 }; 676 677 static const uint32_t AES_Td1[256] = { 678 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, 679 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U, 680 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU, 681 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U, 682 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, 683 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, 684 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U, 685 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U, 686 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U, 687 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, 688 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, 689 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, 690 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U, 691 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU, 692 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, 693 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, 694 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, 695 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU, 696 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU, 697 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, 698 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, 699 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U, 700 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU, 701 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU, 702 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, 703 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, 704 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U, 705 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU, 706 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U, 707 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, 708 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, 709 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, 710 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U, 711 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU, 712 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, 713 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, 714 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, 715 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U, 716 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U, 717 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, 718 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, 719 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, 720 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U, 721 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU, 722 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, 723 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, 724 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, 725 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U, 726 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU, 727 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, 728 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, 729 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, 730 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U, 731 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U, 732 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, 733 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, 734 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, 735 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U, 736 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U, 737 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, 738 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, 739 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, 740 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U, 741 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U, 742 }; 743 744 static const uint32_t AES_Td2[256] = { 745 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, 746 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, 747 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U, 748 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U, 749 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, 750 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, 751 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, 752 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U, 753 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U, 754 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, 755 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, 756 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, 757 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU, 758 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U, 759 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, 760 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, 761 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, 762 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, 763 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, 764 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, 765 766 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, 767 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, 768 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, 769 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U, 770 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, 771 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, 772 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU, 773 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U, 774 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU, 775 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, 776 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, 777 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, 778 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU, 779 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU, 780 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, 781 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, 782 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, 783 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U, 784 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U, 785 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, 786 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, 787 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, 788 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU, 789 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U, 790 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, 791 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, 792 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, 793 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U, 794 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U, 795 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, 796 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, 797 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, 798 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U, 799 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U, 800 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, 801 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, 802 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, 803 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U, 804 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U, 805 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, 806 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, 807 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, 808 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U, 809 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U, 810 }; 811 812 static const uint32_t AES_Td3[256] = { 813 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, 814 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, 815 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U, 816 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U, 817 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, 818 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, 819 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, 820 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU, 821 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U, 822 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, 823 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, 824 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, 825 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U, 826 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U, 827 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, 828 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, 829 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, 830 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U, 831 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U, 832 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, 833 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, 834 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, 835 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U, 836 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U, 837 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, 838 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, 839 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U, 840 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U, 841 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU, 842 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, 843 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, 844 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, 845 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U, 846 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU, 847 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, 848 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, 849 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, 850 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U, 851 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U, 852 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, 853 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, 854 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, 855 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U, 856 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U, 857 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, 858 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, 859 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, 860 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU, 861 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U, 862 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, 863 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, 864 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, 865 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U, 866 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U, 867 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, 868 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, 869 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, 870 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU, 871 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U, 872 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, 873 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, 874 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, 875 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U, 876 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U, 877 }; 878 879 static const uint32_t AES_Td4[256] = { 880 0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U, 881 0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U, 882 0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU, 883 0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU, 884 0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U, 885 0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U, 886 0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U, 887 0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU, 888 0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U, 889 0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU, 890 0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU, 891 0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU, 892 0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U, 893 0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U, 894 0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U, 895 0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U, 896 0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U, 897 0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U, 898 0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU, 899 0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U, 900 0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U, 901 0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU, 902 0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U, 903 0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U, 904 0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U, 905 0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU, 906 0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U, 907 0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U, 908 0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU, 909 0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U, 910 0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U, 911 0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU, 912 0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U, 913 0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU, 914 0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU, 915 0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U, 916 0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U, 917 0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U, 918 0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U, 919 0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU, 920 0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U, 921 0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U, 922 0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU, 923 0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU, 924 0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU, 925 0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U, 926 0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU, 927 0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U, 928 0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U, 929 0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U, 930 0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U, 931 0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU, 932 0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U, 933 0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU, 934 0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU, 935 0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU, 936 0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU, 937 0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U, 938 0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU, 939 0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U, 940 0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU, 941 0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U, 942 0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U, 943 0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU, 944 }; 945 946 static const u32 rcon[] = { 947 0x01000000, 0x02000000, 0x04000000, 0x08000000, 948 0x10000000, 0x20000000, 0x40000000, 0x80000000, 949 0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ 950 }; 951 952 /* 953 * Perform MixColumns. 954 */ 955 static inline void 956 aesenc_MC_swap(AESState *r, const AESState *st, bool swap) 957 { 958 int swap_b = swap * 0xf; 959 int swap_w = swap * 0x3; 960 bool be = HOST_BIG_ENDIAN ^ swap; 961 uint32_t t; 962 963 /* Note that AES_mc_rot is encoded for little-endian. */ 964 t = ( AES_mc_rot[st->b[swap_b ^ 0x0]] ^ 965 rol32(AES_mc_rot[st->b[swap_b ^ 0x1]], 8) ^ 966 rol32(AES_mc_rot[st->b[swap_b ^ 0x2]], 16) ^ 967 rol32(AES_mc_rot[st->b[swap_b ^ 0x3]], 24)); 968 if (be) { 969 t = bswap32(t); 970 } 971 r->w[swap_w ^ 0] = t; 972 973 t = ( AES_mc_rot[st->b[swap_b ^ 0x4]] ^ 974 rol32(AES_mc_rot[st->b[swap_b ^ 0x5]], 8) ^ 975 rol32(AES_mc_rot[st->b[swap_b ^ 0x6]], 16) ^ 976 rol32(AES_mc_rot[st->b[swap_b ^ 0x7]], 24)); 977 if (be) { 978 t = bswap32(t); 979 } 980 r->w[swap_w ^ 1] = t; 981 982 t = ( AES_mc_rot[st->b[swap_b ^ 0x8]] ^ 983 rol32(AES_mc_rot[st->b[swap_b ^ 0x9]], 8) ^ 984 rol32(AES_mc_rot[st->b[swap_b ^ 0xA]], 16) ^ 985 rol32(AES_mc_rot[st->b[swap_b ^ 0xB]], 24)); 986 if (be) { 987 t = bswap32(t); 988 } 989 r->w[swap_w ^ 2] = t; 990 991 t = ( AES_mc_rot[st->b[swap_b ^ 0xC]] ^ 992 rol32(AES_mc_rot[st->b[swap_b ^ 0xD]], 8) ^ 993 rol32(AES_mc_rot[st->b[swap_b ^ 0xE]], 16) ^ 994 rol32(AES_mc_rot[st->b[swap_b ^ 0xF]], 24)); 995 if (be) { 996 t = bswap32(t); 997 } 998 r->w[swap_w ^ 3] = t; 999 } 1000 1001 void aesenc_MC_gen(AESState *r, const AESState *st) 1002 { 1003 aesenc_MC_swap(r, st, false); 1004 } 1005 1006 void aesenc_MC_genrev(AESState *r, const AESState *st) 1007 { 1008 aesenc_MC_swap(r, st, true); 1009 } 1010 1011 /* 1012 * Perform SubBytes + ShiftRows + AddRoundKey. 1013 */ 1014 static inline void 1015 aesenc_SB_SR_AK_swap(AESState *ret, const AESState *st, 1016 const AESState *rk, bool swap) 1017 { 1018 const int swap_b = swap ? 15 : 0; 1019 AESState t; 1020 1021 t.b[swap_b ^ 0x0] = AES_sbox[st->b[swap_b ^ AES_SH(0x0)]]; 1022 t.b[swap_b ^ 0x1] = AES_sbox[st->b[swap_b ^ AES_SH(0x1)]]; 1023 t.b[swap_b ^ 0x2] = AES_sbox[st->b[swap_b ^ AES_SH(0x2)]]; 1024 t.b[swap_b ^ 0x3] = AES_sbox[st->b[swap_b ^ AES_SH(0x3)]]; 1025 t.b[swap_b ^ 0x4] = AES_sbox[st->b[swap_b ^ AES_SH(0x4)]]; 1026 t.b[swap_b ^ 0x5] = AES_sbox[st->b[swap_b ^ AES_SH(0x5)]]; 1027 t.b[swap_b ^ 0x6] = AES_sbox[st->b[swap_b ^ AES_SH(0x6)]]; 1028 t.b[swap_b ^ 0x7] = AES_sbox[st->b[swap_b ^ AES_SH(0x7)]]; 1029 t.b[swap_b ^ 0x8] = AES_sbox[st->b[swap_b ^ AES_SH(0x8)]]; 1030 t.b[swap_b ^ 0x9] = AES_sbox[st->b[swap_b ^ AES_SH(0x9)]]; 1031 t.b[swap_b ^ 0xa] = AES_sbox[st->b[swap_b ^ AES_SH(0xA)]]; 1032 t.b[swap_b ^ 0xb] = AES_sbox[st->b[swap_b ^ AES_SH(0xB)]]; 1033 t.b[swap_b ^ 0xc] = AES_sbox[st->b[swap_b ^ AES_SH(0xC)]]; 1034 t.b[swap_b ^ 0xd] = AES_sbox[st->b[swap_b ^ AES_SH(0xD)]]; 1035 t.b[swap_b ^ 0xe] = AES_sbox[st->b[swap_b ^ AES_SH(0xE)]]; 1036 t.b[swap_b ^ 0xf] = AES_sbox[st->b[swap_b ^ AES_SH(0xF)]]; 1037 1038 /* 1039 * Perform the AddRoundKey with generic vectors. 1040 * This may be expanded to either host integer or host vector code. 1041 * The key and output endianness match, so no bswap required. 1042 */ 1043 ret->v = t.v ^ rk->v; 1044 } 1045 1046 void aesenc_SB_SR_AK_gen(AESState *r, const AESState *s, const AESState *k) 1047 { 1048 aesenc_SB_SR_AK_swap(r, s, k, false); 1049 } 1050 1051 void aesenc_SB_SR_AK_genrev(AESState *r, const AESState *s, const AESState *k) 1052 { 1053 aesenc_SB_SR_AK_swap(r, s, k, true); 1054 } 1055 1056 /* 1057 * Perform SubBytes + ShiftRows + MixColumns + AddRoundKey. 1058 */ 1059 static inline void 1060 aesenc_SB_SR_MC_AK_swap(AESState *r, const AESState *st, 1061 const AESState *rk, bool swap) 1062 { 1063 int swap_b = swap * 0xf; 1064 int swap_w = swap * 0x3; 1065 bool be = HOST_BIG_ENDIAN ^ swap; 1066 uint32_t w0, w1, w2, w3; 1067 1068 w0 = (AES_Te0[st->b[swap_b ^ AES_SH(0x0)]] ^ 1069 AES_Te1[st->b[swap_b ^ AES_SH(0x1)]] ^ 1070 AES_Te2[st->b[swap_b ^ AES_SH(0x2)]] ^ 1071 AES_Te3[st->b[swap_b ^ AES_SH(0x3)]]); 1072 1073 w1 = (AES_Te0[st->b[swap_b ^ AES_SH(0x4)]] ^ 1074 AES_Te1[st->b[swap_b ^ AES_SH(0x5)]] ^ 1075 AES_Te2[st->b[swap_b ^ AES_SH(0x6)]] ^ 1076 AES_Te3[st->b[swap_b ^ AES_SH(0x7)]]); 1077 1078 w2 = (AES_Te0[st->b[swap_b ^ AES_SH(0x8)]] ^ 1079 AES_Te1[st->b[swap_b ^ AES_SH(0x9)]] ^ 1080 AES_Te2[st->b[swap_b ^ AES_SH(0xA)]] ^ 1081 AES_Te3[st->b[swap_b ^ AES_SH(0xB)]]); 1082 1083 w3 = (AES_Te0[st->b[swap_b ^ AES_SH(0xC)]] ^ 1084 AES_Te1[st->b[swap_b ^ AES_SH(0xD)]] ^ 1085 AES_Te2[st->b[swap_b ^ AES_SH(0xE)]] ^ 1086 AES_Te3[st->b[swap_b ^ AES_SH(0xF)]]); 1087 1088 /* Note that AES_TeX is encoded for big-endian. */ 1089 if (!be) { 1090 w0 = bswap32(w0); 1091 w1 = bswap32(w1); 1092 w2 = bswap32(w2); 1093 w3 = bswap32(w3); 1094 } 1095 1096 r->w[swap_w ^ 0] = rk->w[swap_w ^ 0] ^ w0; 1097 r->w[swap_w ^ 1] = rk->w[swap_w ^ 1] ^ w1; 1098 r->w[swap_w ^ 2] = rk->w[swap_w ^ 2] ^ w2; 1099 r->w[swap_w ^ 3] = rk->w[swap_w ^ 3] ^ w3; 1100 } 1101 1102 void aesenc_SB_SR_MC_AK_gen(AESState *r, const AESState *st, 1103 const AESState *rk) 1104 { 1105 aesenc_SB_SR_MC_AK_swap(r, st, rk, false); 1106 } 1107 1108 void aesenc_SB_SR_MC_AK_genrev(AESState *r, const AESState *st, 1109 const AESState *rk) 1110 { 1111 aesenc_SB_SR_MC_AK_swap(r, st, rk, true); 1112 } 1113 1114 /* 1115 * Perform InvMixColumns. 1116 */ 1117 static inline void 1118 aesdec_IMC_swap(AESState *r, const AESState *st, bool swap) 1119 { 1120 int swap_b = swap * 0xf; 1121 int swap_w = swap * 0x3; 1122 bool be = HOST_BIG_ENDIAN ^ swap; 1123 uint32_t t; 1124 1125 /* Note that AES_imc_rot is encoded for little-endian. */ 1126 t = ( AES_imc_rot[st->b[swap_b ^ 0x0]] ^ 1127 rol32(AES_imc_rot[st->b[swap_b ^ 0x1]], 8) ^ 1128 rol32(AES_imc_rot[st->b[swap_b ^ 0x2]], 16) ^ 1129 rol32(AES_imc_rot[st->b[swap_b ^ 0x3]], 24)); 1130 if (be) { 1131 t = bswap32(t); 1132 } 1133 r->w[swap_w ^ 0] = t; 1134 1135 t = ( AES_imc_rot[st->b[swap_b ^ 0x4]] ^ 1136 rol32(AES_imc_rot[st->b[swap_b ^ 0x5]], 8) ^ 1137 rol32(AES_imc_rot[st->b[swap_b ^ 0x6]], 16) ^ 1138 rol32(AES_imc_rot[st->b[swap_b ^ 0x7]], 24)); 1139 if (be) { 1140 t = bswap32(t); 1141 } 1142 r->w[swap_w ^ 1] = t; 1143 1144 t = ( AES_imc_rot[st->b[swap_b ^ 0x8]] ^ 1145 rol32(AES_imc_rot[st->b[swap_b ^ 0x9]], 8) ^ 1146 rol32(AES_imc_rot[st->b[swap_b ^ 0xA]], 16) ^ 1147 rol32(AES_imc_rot[st->b[swap_b ^ 0xB]], 24)); 1148 if (be) { 1149 t = bswap32(t); 1150 } 1151 r->w[swap_w ^ 2] = t; 1152 1153 t = ( AES_imc_rot[st->b[swap_b ^ 0xC]] ^ 1154 rol32(AES_imc_rot[st->b[swap_b ^ 0xD]], 8) ^ 1155 rol32(AES_imc_rot[st->b[swap_b ^ 0xE]], 16) ^ 1156 rol32(AES_imc_rot[st->b[swap_b ^ 0xF]], 24)); 1157 if (be) { 1158 t = bswap32(t); 1159 } 1160 r->w[swap_w ^ 3] = t; 1161 } 1162 1163 void aesdec_IMC_gen(AESState *r, const AESState *st) 1164 { 1165 aesdec_IMC_swap(r, st, false); 1166 } 1167 1168 void aesdec_IMC_genrev(AESState *r, const AESState *st) 1169 { 1170 aesdec_IMC_swap(r, st, true); 1171 } 1172 1173 /* 1174 * Perform InvSubBytes + InvShiftRows + AddRoundKey. 1175 */ 1176 static inline void 1177 aesdec_ISB_ISR_AK_swap(AESState *ret, const AESState *st, 1178 const AESState *rk, bool swap) 1179 { 1180 const int swap_b = swap ? 15 : 0; 1181 AESState t; 1182 1183 t.b[swap_b ^ 0x0] = AES_isbox[st->b[swap_b ^ AES_ISH(0x0)]]; 1184 t.b[swap_b ^ 0x1] = AES_isbox[st->b[swap_b ^ AES_ISH(0x1)]]; 1185 t.b[swap_b ^ 0x2] = AES_isbox[st->b[swap_b ^ AES_ISH(0x2)]]; 1186 t.b[swap_b ^ 0x3] = AES_isbox[st->b[swap_b ^ AES_ISH(0x3)]]; 1187 t.b[swap_b ^ 0x4] = AES_isbox[st->b[swap_b ^ AES_ISH(0x4)]]; 1188 t.b[swap_b ^ 0x5] = AES_isbox[st->b[swap_b ^ AES_ISH(0x5)]]; 1189 t.b[swap_b ^ 0x6] = AES_isbox[st->b[swap_b ^ AES_ISH(0x6)]]; 1190 t.b[swap_b ^ 0x7] = AES_isbox[st->b[swap_b ^ AES_ISH(0x7)]]; 1191 t.b[swap_b ^ 0x8] = AES_isbox[st->b[swap_b ^ AES_ISH(0x8)]]; 1192 t.b[swap_b ^ 0x9] = AES_isbox[st->b[swap_b ^ AES_ISH(0x9)]]; 1193 t.b[swap_b ^ 0xa] = AES_isbox[st->b[swap_b ^ AES_ISH(0xA)]]; 1194 t.b[swap_b ^ 0xb] = AES_isbox[st->b[swap_b ^ AES_ISH(0xB)]]; 1195 t.b[swap_b ^ 0xc] = AES_isbox[st->b[swap_b ^ AES_ISH(0xC)]]; 1196 t.b[swap_b ^ 0xd] = AES_isbox[st->b[swap_b ^ AES_ISH(0xD)]]; 1197 t.b[swap_b ^ 0xe] = AES_isbox[st->b[swap_b ^ AES_ISH(0xE)]]; 1198 t.b[swap_b ^ 0xf] = AES_isbox[st->b[swap_b ^ AES_ISH(0xF)]]; 1199 1200 /* 1201 * Perform the AddRoundKey with generic vectors. 1202 * This may be expanded to either host integer or host vector code. 1203 * The key and output endianness match, so no bswap required. 1204 */ 1205 ret->v = t.v ^ rk->v; 1206 } 1207 1208 void aesdec_ISB_ISR_AK_gen(AESState *r, const AESState *s, const AESState *k) 1209 { 1210 aesdec_ISB_ISR_AK_swap(r, s, k, false); 1211 } 1212 1213 void aesdec_ISB_ISR_AK_genrev(AESState *r, const AESState *s, const AESState *k) 1214 { 1215 aesdec_ISB_ISR_AK_swap(r, s, k, true); 1216 } 1217 1218 /* 1219 * Perform InvSubBytes + InvShiftRows + InvMixColumns + AddRoundKey. 1220 */ 1221 static inline void 1222 aesdec_ISB_ISR_IMC_AK_swap(AESState *r, const AESState *st, 1223 const AESState *rk, bool swap) 1224 { 1225 int swap_b = swap * 0xf; 1226 int swap_w = swap * 0x3; 1227 bool be = HOST_BIG_ENDIAN ^ swap; 1228 uint32_t w0, w1, w2, w3; 1229 1230 w0 = (AES_Td0[st->b[swap_b ^ AES_ISH(0x0)]] ^ 1231 AES_Td1[st->b[swap_b ^ AES_ISH(0x1)]] ^ 1232 AES_Td2[st->b[swap_b ^ AES_ISH(0x2)]] ^ 1233 AES_Td3[st->b[swap_b ^ AES_ISH(0x3)]]); 1234 1235 w1 = (AES_Td0[st->b[swap_b ^ AES_ISH(0x4)]] ^ 1236 AES_Td1[st->b[swap_b ^ AES_ISH(0x5)]] ^ 1237 AES_Td2[st->b[swap_b ^ AES_ISH(0x6)]] ^ 1238 AES_Td3[st->b[swap_b ^ AES_ISH(0x7)]]); 1239 1240 w2 = (AES_Td0[st->b[swap_b ^ AES_ISH(0x8)]] ^ 1241 AES_Td1[st->b[swap_b ^ AES_ISH(0x9)]] ^ 1242 AES_Td2[st->b[swap_b ^ AES_ISH(0xA)]] ^ 1243 AES_Td3[st->b[swap_b ^ AES_ISH(0xB)]]); 1244 1245 w3 = (AES_Td0[st->b[swap_b ^ AES_ISH(0xC)]] ^ 1246 AES_Td1[st->b[swap_b ^ AES_ISH(0xD)]] ^ 1247 AES_Td2[st->b[swap_b ^ AES_ISH(0xE)]] ^ 1248 AES_Td3[st->b[swap_b ^ AES_ISH(0xF)]]); 1249 1250 /* Note that AES_TdX is encoded for big-endian. */ 1251 if (!be) { 1252 w0 = bswap32(w0); 1253 w1 = bswap32(w1); 1254 w2 = bswap32(w2); 1255 w3 = bswap32(w3); 1256 } 1257 1258 r->w[swap_w ^ 0] = rk->w[swap_w ^ 0] ^ w0; 1259 r->w[swap_w ^ 1] = rk->w[swap_w ^ 1] ^ w1; 1260 r->w[swap_w ^ 2] = rk->w[swap_w ^ 2] ^ w2; 1261 r->w[swap_w ^ 3] = rk->w[swap_w ^ 3] ^ w3; 1262 } 1263 1264 void aesdec_ISB_ISR_IMC_AK_gen(AESState *r, const AESState *st, 1265 const AESState *rk) 1266 { 1267 aesdec_ISB_ISR_IMC_AK_swap(r, st, rk, false); 1268 } 1269 1270 void aesdec_ISB_ISR_IMC_AK_genrev(AESState *r, const AESState *st, 1271 const AESState *rk) 1272 { 1273 aesdec_ISB_ISR_IMC_AK_swap(r, st, rk, true); 1274 } 1275 1276 void aesdec_ISB_ISR_AK_IMC_gen(AESState *ret, const AESState *st, 1277 const AESState *rk) 1278 { 1279 aesdec_ISB_ISR_AK_gen(ret, st, rk); 1280 aesdec_IMC_gen(ret, ret); 1281 } 1282 1283 void aesdec_ISB_ISR_AK_IMC_genrev(AESState *ret, const AESState *st, 1284 const AESState *rk) 1285 { 1286 aesdec_ISB_ISR_AK_genrev(ret, st, rk); 1287 aesdec_IMC_genrev(ret, ret); 1288 } 1289 1290 /** 1291 * Expand the cipher key into the encryption key schedule. 1292 */ 1293 int AES_set_encrypt_key(const unsigned char *userKey, const int bits, 1294 AES_KEY *key) { 1295 1296 u32 *rk; 1297 int i = 0; 1298 u32 temp; 1299 1300 if (!userKey || !key) 1301 return -1; 1302 if (bits != 128 && bits != 192 && bits != 256) 1303 return -2; 1304 1305 rk = key->rd_key; 1306 1307 if (bits == 128) 1308 key->rounds = 10; 1309 else if (bits == 192) 1310 key->rounds = 12; 1311 else 1312 key->rounds = 14; 1313 1314 rk[0] = GETU32(userKey ); 1315 rk[1] = GETU32(userKey + 4); 1316 rk[2] = GETU32(userKey + 8); 1317 rk[3] = GETU32(userKey + 12); 1318 if (bits == 128) { 1319 while (1) { 1320 temp = rk[3]; 1321 rk[4] = rk[0] ^ 1322 (AES_Te4[(temp >> 16) & 0xff] & 0xff000000) ^ 1323 (AES_Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ 1324 (AES_Te4[(temp ) & 0xff] & 0x0000ff00) ^ 1325 (AES_Te4[(temp >> 24) ] & 0x000000ff) ^ 1326 rcon[i]; 1327 rk[5] = rk[1] ^ rk[4]; 1328 rk[6] = rk[2] ^ rk[5]; 1329 rk[7] = rk[3] ^ rk[6]; 1330 if (++i == 10) { 1331 return 0; 1332 } 1333 rk += 4; 1334 } 1335 } 1336 rk[4] = GETU32(userKey + 16); 1337 rk[5] = GETU32(userKey + 20); 1338 if (bits == 192) { 1339 while (1) { 1340 temp = rk[ 5]; 1341 rk[ 6] = rk[ 0] ^ 1342 (AES_Te4[(temp >> 16) & 0xff] & 0xff000000) ^ 1343 (AES_Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ 1344 (AES_Te4[(temp ) & 0xff] & 0x0000ff00) ^ 1345 (AES_Te4[(temp >> 24) ] & 0x000000ff) ^ 1346 rcon[i]; 1347 rk[ 7] = rk[ 1] ^ rk[ 6]; 1348 rk[ 8] = rk[ 2] ^ rk[ 7]; 1349 rk[ 9] = rk[ 3] ^ rk[ 8]; 1350 if (++i == 8) { 1351 return 0; 1352 } 1353 rk[10] = rk[ 4] ^ rk[ 9]; 1354 rk[11] = rk[ 5] ^ rk[10]; 1355 rk += 6; 1356 } 1357 } 1358 rk[6] = GETU32(userKey + 24); 1359 rk[7] = GETU32(userKey + 28); 1360 if (bits == 256) { 1361 while (1) { 1362 temp = rk[ 7]; 1363 rk[ 8] = rk[ 0] ^ 1364 (AES_Te4[(temp >> 16) & 0xff] & 0xff000000) ^ 1365 (AES_Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ 1366 (AES_Te4[(temp ) & 0xff] & 0x0000ff00) ^ 1367 (AES_Te4[(temp >> 24) ] & 0x000000ff) ^ 1368 rcon[i]; 1369 rk[ 9] = rk[ 1] ^ rk[ 8]; 1370 rk[10] = rk[ 2] ^ rk[ 9]; 1371 rk[11] = rk[ 3] ^ rk[10]; 1372 if (++i == 7) { 1373 return 0; 1374 } 1375 temp = rk[11]; 1376 rk[12] = rk[ 4] ^ 1377 (AES_Te4[(temp >> 24) ] & 0xff000000) ^ 1378 (AES_Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^ 1379 (AES_Te4[(temp >> 8) & 0xff] & 0x0000ff00) ^ 1380 (AES_Te4[(temp ) & 0xff] & 0x000000ff); 1381 rk[13] = rk[ 5] ^ rk[12]; 1382 rk[14] = rk[ 6] ^ rk[13]; 1383 rk[15] = rk[ 7] ^ rk[14]; 1384 1385 rk += 8; 1386 } 1387 } 1388 abort(); 1389 } 1390 1391 /** 1392 * Expand the cipher key into the decryption key schedule. 1393 */ 1394 int AES_set_decrypt_key(const unsigned char *userKey, const int bits, 1395 AES_KEY *key) { 1396 1397 u32 *rk; 1398 int i, j, status; 1399 u32 temp; 1400 1401 /* first, start with an encryption schedule */ 1402 status = AES_set_encrypt_key(userKey, bits, key); 1403 if (status < 0) 1404 return status; 1405 1406 rk = key->rd_key; 1407 1408 /* invert the order of the round keys: */ 1409 for (i = 0, j = 4 * (key->rounds); i < j; i += 4, j -= 4) { 1410 temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp; 1411 temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp; 1412 temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp; 1413 temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp; 1414 } 1415 /* apply the inverse MixColumn transform to all round keys but the first and the last: */ 1416 for (i = 1; i < (key->rounds); i++) { 1417 rk += 4; 1418 rk[0] = 1419 AES_Td0[AES_Te4[(rk[0] >> 24) ] & 0xff] ^ 1420 AES_Td1[AES_Te4[(rk[0] >> 16) & 0xff] & 0xff] ^ 1421 AES_Td2[AES_Te4[(rk[0] >> 8) & 0xff] & 0xff] ^ 1422 AES_Td3[AES_Te4[(rk[0] ) & 0xff] & 0xff]; 1423 rk[1] = 1424 AES_Td0[AES_Te4[(rk[1] >> 24) ] & 0xff] ^ 1425 AES_Td1[AES_Te4[(rk[1] >> 16) & 0xff] & 0xff] ^ 1426 AES_Td2[AES_Te4[(rk[1] >> 8) & 0xff] & 0xff] ^ 1427 AES_Td3[AES_Te4[(rk[1] ) & 0xff] & 0xff]; 1428 rk[2] = 1429 AES_Td0[AES_Te4[(rk[2] >> 24) ] & 0xff] ^ 1430 AES_Td1[AES_Te4[(rk[2] >> 16) & 0xff] & 0xff] ^ 1431 AES_Td2[AES_Te4[(rk[2] >> 8) & 0xff] & 0xff] ^ 1432 AES_Td3[AES_Te4[(rk[2] ) & 0xff] & 0xff]; 1433 rk[3] = 1434 AES_Td0[AES_Te4[(rk[3] >> 24) ] & 0xff] ^ 1435 AES_Td1[AES_Te4[(rk[3] >> 16) & 0xff] & 0xff] ^ 1436 AES_Td2[AES_Te4[(rk[3] >> 8) & 0xff] & 0xff] ^ 1437 AES_Td3[AES_Te4[(rk[3] ) & 0xff] & 0xff]; 1438 } 1439 return 0; 1440 } 1441 1442 #ifndef AES_ASM 1443 /* 1444 * Encrypt a single block 1445 * in and out can overlap 1446 */ 1447 void AES_encrypt(const unsigned char *in, unsigned char *out, 1448 const AES_KEY *key) { 1449 1450 const u32 *rk; 1451 u32 s0, s1, s2, s3, t0, t1, t2, t3; 1452 #ifndef FULL_UNROLL 1453 int r; 1454 #endif /* ?FULL_UNROLL */ 1455 1456 assert(in && out && key); 1457 rk = key->rd_key; 1458 1459 /* 1460 * map byte array block to cipher state 1461 * and add initial round key: 1462 */ 1463 s0 = GETU32(in ) ^ rk[0]; 1464 s1 = GETU32(in + 4) ^ rk[1]; 1465 s2 = GETU32(in + 8) ^ rk[2]; 1466 s3 = GETU32(in + 12) ^ rk[3]; 1467 #ifdef FULL_UNROLL 1468 /* round 1: */ 1469 t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >> 8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[ 4]; 1470 t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >> 8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[ 5]; 1471 t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >> 8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[ 6]; 1472 t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >> 8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[ 7]; 1473 /* round 2: */ 1474 s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >> 8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[ 8]; 1475 s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >> 8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[ 9]; 1476 s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >> 8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[10]; 1477 s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >> 8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[11]; 1478 /* round 3: */ 1479 t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >> 8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[12]; 1480 t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >> 8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[13]; 1481 t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >> 8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[14]; 1482 t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >> 8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[15]; 1483 /* round 4: */ 1484 s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >> 8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[16]; 1485 s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >> 8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[17]; 1486 s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >> 8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[18]; 1487 s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >> 8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[19]; 1488 /* round 5: */ 1489 t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >> 8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[20]; 1490 t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >> 8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[21]; 1491 t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >> 8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[22]; 1492 t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >> 8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[23]; 1493 /* round 6: */ 1494 s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >> 8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[24]; 1495 s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >> 8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[25]; 1496 s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >> 8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[26]; 1497 s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >> 8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[27]; 1498 /* round 7: */ 1499 t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >> 8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[28]; 1500 t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >> 8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[29]; 1501 t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >> 8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[30]; 1502 t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >> 8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[31]; 1503 /* round 8: */ 1504 s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >> 8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[32]; 1505 s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >> 8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[33]; 1506 s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >> 8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[34]; 1507 s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >> 8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[35]; 1508 /* round 9: */ 1509 t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >> 8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[36]; 1510 t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >> 8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[37]; 1511 t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >> 8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[38]; 1512 t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >> 8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[39]; 1513 if (key->rounds > 10) { 1514 /* round 10: */ 1515 s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >> 8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[40]; 1516 s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >> 8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[41]; 1517 s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >> 8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[42]; 1518 s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >> 8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[43]; 1519 /* round 11: */ 1520 t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >> 8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[44]; 1521 t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >> 8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[45]; 1522 t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >> 8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[46]; 1523 t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >> 8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[47]; 1524 if (key->rounds > 12) { 1525 /* round 12: */ 1526 s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >> 8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[48]; 1527 s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >> 8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[49]; 1528 s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >> 8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[50]; 1529 s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >> 8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[51]; 1530 /* round 13: */ 1531 t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >> 8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[52]; 1532 t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >> 8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[53]; 1533 t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >> 8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[54]; 1534 t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >> 8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[55]; 1535 } 1536 } 1537 rk += key->rounds << 2; 1538 #else /* !FULL_UNROLL */ 1539 /* 1540 * Nr - 1 full rounds: 1541 */ 1542 r = key->rounds >> 1; 1543 for (;;) { 1544 t0 = 1545 AES_Te0[(s0 >> 24) ] ^ 1546 AES_Te1[(s1 >> 16) & 0xff] ^ 1547 AES_Te2[(s2 >> 8) & 0xff] ^ 1548 AES_Te3[(s3 ) & 0xff] ^ 1549 rk[4]; 1550 t1 = 1551 AES_Te0[(s1 >> 24) ] ^ 1552 AES_Te1[(s2 >> 16) & 0xff] ^ 1553 AES_Te2[(s3 >> 8) & 0xff] ^ 1554 AES_Te3[(s0 ) & 0xff] ^ 1555 rk[5]; 1556 t2 = 1557 AES_Te0[(s2 >> 24) ] ^ 1558 AES_Te1[(s3 >> 16) & 0xff] ^ 1559 AES_Te2[(s0 >> 8) & 0xff] ^ 1560 AES_Te3[(s1 ) & 0xff] ^ 1561 rk[6]; 1562 t3 = 1563 AES_Te0[(s3 >> 24) ] ^ 1564 AES_Te1[(s0 >> 16) & 0xff] ^ 1565 AES_Te2[(s1 >> 8) & 0xff] ^ 1566 AES_Te3[(s2 ) & 0xff] ^ 1567 rk[7]; 1568 1569 rk += 8; 1570 if (--r == 0) { 1571 break; 1572 } 1573 1574 s0 = 1575 AES_Te0[(t0 >> 24) ] ^ 1576 AES_Te1[(t1 >> 16) & 0xff] ^ 1577 AES_Te2[(t2 >> 8) & 0xff] ^ 1578 AES_Te3[(t3 ) & 0xff] ^ 1579 rk[0]; 1580 s1 = 1581 AES_Te0[(t1 >> 24) ] ^ 1582 AES_Te1[(t2 >> 16) & 0xff] ^ 1583 AES_Te2[(t3 >> 8) & 0xff] ^ 1584 AES_Te3[(t0 ) & 0xff] ^ 1585 rk[1]; 1586 s2 = 1587 AES_Te0[(t2 >> 24) ] ^ 1588 AES_Te1[(t3 >> 16) & 0xff] ^ 1589 AES_Te2[(t0 >> 8) & 0xff] ^ 1590 AES_Te3[(t1 ) & 0xff] ^ 1591 rk[2]; 1592 s3 = 1593 AES_Te0[(t3 >> 24) ] ^ 1594 AES_Te1[(t0 >> 16) & 0xff] ^ 1595 AES_Te2[(t1 >> 8) & 0xff] ^ 1596 AES_Te3[(t2 ) & 0xff] ^ 1597 rk[3]; 1598 } 1599 #endif /* ?FULL_UNROLL */ 1600 /* 1601 * apply last round and 1602 * map cipher state to byte array block: 1603 */ 1604 s0 = 1605 (AES_Te4[(t0 >> 24) ] & 0xff000000) ^ 1606 (AES_Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ 1607 (AES_Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ 1608 (AES_Te4[(t3 ) & 0xff] & 0x000000ff) ^ 1609 rk[0]; 1610 PUTU32(out , s0); 1611 s1 = 1612 (AES_Te4[(t1 >> 24) ] & 0xff000000) ^ 1613 (AES_Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ 1614 (AES_Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ 1615 (AES_Te4[(t0 ) & 0xff] & 0x000000ff) ^ 1616 rk[1]; 1617 PUTU32(out + 4, s1); 1618 s2 = 1619 (AES_Te4[(t2 >> 24) ] & 0xff000000) ^ 1620 (AES_Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ 1621 (AES_Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ 1622 (AES_Te4[(t1 ) & 0xff] & 0x000000ff) ^ 1623 rk[2]; 1624 PUTU32(out + 8, s2); 1625 s3 = 1626 (AES_Te4[(t3 >> 24) ] & 0xff000000) ^ 1627 (AES_Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ 1628 (AES_Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ 1629 (AES_Te4[(t2 ) & 0xff] & 0x000000ff) ^ 1630 rk[3]; 1631 PUTU32(out + 12, s3); 1632 } 1633 1634 /* 1635 * Decrypt a single block 1636 * in and out can overlap 1637 */ 1638 void AES_decrypt(const unsigned char *in, unsigned char *out, 1639 const AES_KEY *key) { 1640 1641 const u32 *rk; 1642 u32 s0, s1, s2, s3, t0, t1, t2, t3; 1643 #ifndef FULL_UNROLL 1644 int r; 1645 #endif /* ?FULL_UNROLL */ 1646 1647 assert(in && out && key); 1648 rk = key->rd_key; 1649 1650 /* 1651 * map byte array block to cipher state 1652 * and add initial round key: 1653 */ 1654 s0 = GETU32(in ) ^ rk[0]; 1655 s1 = GETU32(in + 4) ^ rk[1]; 1656 s2 = GETU32(in + 8) ^ rk[2]; 1657 s3 = GETU32(in + 12) ^ rk[3]; 1658 #ifdef FULL_UNROLL 1659 /* round 1: */ 1660 t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >> 8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[ 4]; 1661 t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >> 8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[ 5]; 1662 t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >> 8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[ 6]; 1663 t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >> 8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[ 7]; 1664 /* round 2: */ 1665 s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >> 8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[ 8]; 1666 s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >> 8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[ 9]; 1667 s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >> 8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[10]; 1668 s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >> 8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[11]; 1669 /* round 3: */ 1670 t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >> 8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[12]; 1671 t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >> 8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[13]; 1672 t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >> 8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[14]; 1673 t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >> 8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[15]; 1674 /* round 4: */ 1675 s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >> 8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[16]; 1676 s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >> 8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[17]; 1677 s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >> 8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[18]; 1678 s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >> 8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[19]; 1679 /* round 5: */ 1680 t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >> 8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[20]; 1681 t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >> 8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[21]; 1682 t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >> 8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[22]; 1683 t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >> 8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[23]; 1684 /* round 6: */ 1685 s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >> 8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[24]; 1686 s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >> 8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[25]; 1687 s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >> 8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[26]; 1688 s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >> 8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[27]; 1689 /* round 7: */ 1690 t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >> 8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[28]; 1691 t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >> 8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[29]; 1692 t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >> 8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[30]; 1693 t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >> 8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[31]; 1694 /* round 8: */ 1695 s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >> 8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[32]; 1696 s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >> 8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[33]; 1697 s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >> 8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[34]; 1698 s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >> 8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[35]; 1699 /* round 9: */ 1700 t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >> 8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[36]; 1701 t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >> 8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[37]; 1702 t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >> 8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[38]; 1703 t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >> 8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[39]; 1704 if (key->rounds > 10) { 1705 /* round 10: */ 1706 s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >> 8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[40]; 1707 s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >> 8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[41]; 1708 s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >> 8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[42]; 1709 s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >> 8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[43]; 1710 /* round 11: */ 1711 t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >> 8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[44]; 1712 t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >> 8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[45]; 1713 t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >> 8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[46]; 1714 t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >> 8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[47]; 1715 if (key->rounds > 12) { 1716 /* round 12: */ 1717 s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >> 8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[48]; 1718 s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >> 8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[49]; 1719 s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >> 8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[50]; 1720 s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >> 8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[51]; 1721 /* round 13: */ 1722 t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >> 8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[52]; 1723 t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >> 8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[53]; 1724 t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >> 8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[54]; 1725 t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >> 8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[55]; 1726 } 1727 } 1728 rk += key->rounds << 2; 1729 #else /* !FULL_UNROLL */ 1730 /* 1731 * Nr - 1 full rounds: 1732 */ 1733 r = key->rounds >> 1; 1734 for (;;) { 1735 t0 = 1736 AES_Td0[(s0 >> 24) ] ^ 1737 AES_Td1[(s3 >> 16) & 0xff] ^ 1738 AES_Td2[(s2 >> 8) & 0xff] ^ 1739 AES_Td3[(s1 ) & 0xff] ^ 1740 rk[4]; 1741 t1 = 1742 AES_Td0[(s1 >> 24) ] ^ 1743 AES_Td1[(s0 >> 16) & 0xff] ^ 1744 AES_Td2[(s3 >> 8) & 0xff] ^ 1745 AES_Td3[(s2 ) & 0xff] ^ 1746 rk[5]; 1747 t2 = 1748 AES_Td0[(s2 >> 24) ] ^ 1749 AES_Td1[(s1 >> 16) & 0xff] ^ 1750 AES_Td2[(s0 >> 8) & 0xff] ^ 1751 AES_Td3[(s3 ) & 0xff] ^ 1752 rk[6]; 1753 t3 = 1754 AES_Td0[(s3 >> 24) ] ^ 1755 AES_Td1[(s2 >> 16) & 0xff] ^ 1756 AES_Td2[(s1 >> 8) & 0xff] ^ 1757 AES_Td3[(s0 ) & 0xff] ^ 1758 rk[7]; 1759 1760 rk += 8; 1761 if (--r == 0) { 1762 break; 1763 } 1764 1765 s0 = 1766 AES_Td0[(t0 >> 24) ] ^ 1767 AES_Td1[(t3 >> 16) & 0xff] ^ 1768 AES_Td2[(t2 >> 8) & 0xff] ^ 1769 AES_Td3[(t1 ) & 0xff] ^ 1770 rk[0]; 1771 s1 = 1772 AES_Td0[(t1 >> 24) ] ^ 1773 AES_Td1[(t0 >> 16) & 0xff] ^ 1774 AES_Td2[(t3 >> 8) & 0xff] ^ 1775 AES_Td3[(t2 ) & 0xff] ^ 1776 rk[1]; 1777 s2 = 1778 AES_Td0[(t2 >> 24) ] ^ 1779 AES_Td1[(t1 >> 16) & 0xff] ^ 1780 AES_Td2[(t0 >> 8) & 0xff] ^ 1781 AES_Td3[(t3 ) & 0xff] ^ 1782 rk[2]; 1783 s3 = 1784 AES_Td0[(t3 >> 24) ] ^ 1785 AES_Td1[(t2 >> 16) & 0xff] ^ 1786 AES_Td2[(t1 >> 8) & 0xff] ^ 1787 AES_Td3[(t0 ) & 0xff] ^ 1788 rk[3]; 1789 } 1790 #endif /* ?FULL_UNROLL */ 1791 /* 1792 * apply last round and 1793 * map cipher state to byte array block: 1794 */ 1795 s0 = 1796 (AES_Td4[(t0 >> 24) ] & 0xff000000) ^ 1797 (AES_Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ 1798 (AES_Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ 1799 (AES_Td4[(t1 ) & 0xff] & 0x000000ff) ^ 1800 rk[0]; 1801 PUTU32(out , s0); 1802 s1 = 1803 (AES_Td4[(t1 >> 24) ] & 0xff000000) ^ 1804 (AES_Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ 1805 (AES_Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ 1806 (AES_Td4[(t2 ) & 0xff] & 0x000000ff) ^ 1807 rk[1]; 1808 PUTU32(out + 4, s1); 1809 s2 = 1810 (AES_Td4[(t2 >> 24) ] & 0xff000000) ^ 1811 (AES_Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ 1812 (AES_Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ 1813 (AES_Td4[(t3 ) & 0xff] & 0x000000ff) ^ 1814 rk[2]; 1815 PUTU32(out + 8, s2); 1816 s3 = 1817 (AES_Td4[(t3 >> 24) ] & 0xff000000) ^ 1818 (AES_Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ 1819 (AES_Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ 1820 (AES_Td4[(t0 ) & 0xff] & 0x000000ff) ^ 1821 rk[3]; 1822 PUTU32(out + 12, s3); 1823 } 1824 1825 #endif /* AES_ASM */ 1826