xref: /openbmc/qemu/crypto/aes.c (revision cb6c406e26e3cbe394f244d8ac42fd6497eaf129)
16f2945cdSDaniel P. Berrange /**
26f2945cdSDaniel P. Berrange  *
36f2945cdSDaniel P. Berrange  * aes.c - integrated in QEMU by Fabrice Bellard from the OpenSSL project.
46f2945cdSDaniel P. Berrange  */
56f2945cdSDaniel P. Berrange /*
66f2945cdSDaniel P. Berrange  * rijndael-alg-fst.c
76f2945cdSDaniel P. Berrange  *
86f2945cdSDaniel P. Berrange  * @version 3.0 (December 2000)
96f2945cdSDaniel P. Berrange  *
106f2945cdSDaniel P. Berrange  * Optimised ANSI C code for the Rijndael cipher (now AES)
116f2945cdSDaniel P. Berrange  *
126f2945cdSDaniel P. Berrange  * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
136f2945cdSDaniel P. Berrange  * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
146f2945cdSDaniel P. Berrange  * @author Paulo Barreto <paulo.barreto@terra.com.br>
156f2945cdSDaniel P. Berrange  *
166f2945cdSDaniel P. Berrange  * This code is hereby placed in the public domain.
176f2945cdSDaniel P. Berrange  *
186f2945cdSDaniel P. Berrange  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
196f2945cdSDaniel P. Berrange  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
206f2945cdSDaniel P. Berrange  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
216f2945cdSDaniel P. Berrange  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
226f2945cdSDaniel P. Berrange  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
236f2945cdSDaniel P. Berrange  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
246f2945cdSDaniel P. Berrange  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
256f2945cdSDaniel P. Berrange  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
266f2945cdSDaniel P. Berrange  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
276f2945cdSDaniel P. Berrange  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
286f2945cdSDaniel P. Berrange  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
296f2945cdSDaniel P. Berrange  */
3042f7a448SPeter Maydell #include "qemu/osdep.h"
3104e1f30eSRichard Henderson #include "qemu/bswap.h"
3204e1f30eSRichard Henderson #include "qemu/bitops.h"
336f2945cdSDaniel P. Berrange #include "crypto/aes.h"
346b0a96ceSRichard Henderson #include "crypto/aes-round.h"
356f2945cdSDaniel P. Berrange 
366f2945cdSDaniel P. Berrange typedef uint32_t u32;
376f2945cdSDaniel P. Berrange typedef uint8_t u8;
386f2945cdSDaniel P. Berrange 
396f2945cdSDaniel P. Berrange /* This controls loop-unrolling in aes_core.c */
406f2945cdSDaniel P. Berrange #undef FULL_UNROLL
416f2945cdSDaniel P. Berrange # define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
426f2945cdSDaniel P. Berrange # define PUTU32(ct, st) { (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }
436f2945cdSDaniel P. Berrange 
446f2945cdSDaniel P. Berrange const uint8_t AES_sbox[256] = {
456f2945cdSDaniel P. Berrange     0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
466f2945cdSDaniel P. Berrange     0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
476f2945cdSDaniel P. Berrange     0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
486f2945cdSDaniel P. Berrange     0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
496f2945cdSDaniel P. Berrange     0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
506f2945cdSDaniel P. Berrange     0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
516f2945cdSDaniel P. Berrange     0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
526f2945cdSDaniel P. Berrange     0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
536f2945cdSDaniel P. Berrange     0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
546f2945cdSDaniel P. Berrange     0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
556f2945cdSDaniel P. Berrange     0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
566f2945cdSDaniel P. Berrange     0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
576f2945cdSDaniel P. Berrange     0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
586f2945cdSDaniel P. Berrange     0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
596f2945cdSDaniel P. Berrange     0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
606f2945cdSDaniel P. Berrange     0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
616f2945cdSDaniel P. Berrange     0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
626f2945cdSDaniel P. Berrange     0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
636f2945cdSDaniel P. Berrange     0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
646f2945cdSDaniel P. Berrange     0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
656f2945cdSDaniel P. Berrange     0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
666f2945cdSDaniel P. Berrange     0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
676f2945cdSDaniel P. Berrange     0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
686f2945cdSDaniel P. Berrange     0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
696f2945cdSDaniel P. Berrange     0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
706f2945cdSDaniel P. Berrange     0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
716f2945cdSDaniel P. Berrange     0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
726f2945cdSDaniel P. Berrange     0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
736f2945cdSDaniel P. Berrange     0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
746f2945cdSDaniel P. Berrange     0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
756f2945cdSDaniel P. Berrange     0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
766f2945cdSDaniel P. Berrange     0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16,
776f2945cdSDaniel P. Berrange };
786f2945cdSDaniel P. Berrange 
796f2945cdSDaniel P. Berrange const uint8_t AES_isbox[256] = {
806f2945cdSDaniel P. Berrange     0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
816f2945cdSDaniel P. Berrange     0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
826f2945cdSDaniel P. Berrange     0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
836f2945cdSDaniel P. Berrange     0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
846f2945cdSDaniel P. Berrange     0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
856f2945cdSDaniel P. Berrange     0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
866f2945cdSDaniel P. Berrange     0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
876f2945cdSDaniel P. Berrange     0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
886f2945cdSDaniel P. Berrange     0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
896f2945cdSDaniel P. Berrange     0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
906f2945cdSDaniel P. Berrange     0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
916f2945cdSDaniel P. Berrange     0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
926f2945cdSDaniel P. Berrange     0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
936f2945cdSDaniel P. Berrange     0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
946f2945cdSDaniel P. Berrange     0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
956f2945cdSDaniel P. Berrange     0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
966f2945cdSDaniel P. Berrange     0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
976f2945cdSDaniel P. Berrange     0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
986f2945cdSDaniel P. Berrange     0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
996f2945cdSDaniel P. Berrange     0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
1006f2945cdSDaniel P. Berrange     0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
1016f2945cdSDaniel P. Berrange     0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
1026f2945cdSDaniel P. Berrange     0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
1036f2945cdSDaniel P. Berrange     0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
1046f2945cdSDaniel P. Berrange     0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
1056f2945cdSDaniel P. Berrange     0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
1066f2945cdSDaniel P. Berrange     0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
1076f2945cdSDaniel P. Berrange     0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
1086f2945cdSDaniel P. Berrange     0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
1096f2945cdSDaniel P. Berrange     0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
1106f2945cdSDaniel P. Berrange     0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
1116f2945cdSDaniel P. Berrange     0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D,
1126f2945cdSDaniel P. Berrange };
1136f2945cdSDaniel P. Berrange 
114e20e14d2SRichard Henderson /* AES ShiftRows, for complete unrolling. */
115e20e14d2SRichard Henderson #define AES_SH(X)   (((X) * 5) & 15)
116e20e14d2SRichard Henderson 
117e20e14d2SRichard Henderson /* AES InvShiftRows, for complete unrolling. */
118e20e14d2SRichard Henderson #define AES_ISH(X)  (((X) * 13) & 15)
119e20e14d2SRichard Henderson 
120fb250c59SRichard Henderson /*
121fb250c59SRichard Henderson  * MixColumns lookup table, for use with rot32.
122fb250c59SRichard Henderson  */
123ff494c8eSRichard Henderson static const uint32_t AES_mc_rot[256] = {
124fb250c59SRichard Henderson     0x00000000, 0x03010102, 0x06020204, 0x05030306,
125fb250c59SRichard Henderson     0x0c040408, 0x0f05050a, 0x0a06060c, 0x0907070e,
126fb250c59SRichard Henderson     0x18080810, 0x1b090912, 0x1e0a0a14, 0x1d0b0b16,
127fb250c59SRichard Henderson     0x140c0c18, 0x170d0d1a, 0x120e0e1c, 0x110f0f1e,
128fb250c59SRichard Henderson     0x30101020, 0x33111122, 0x36121224, 0x35131326,
129fb250c59SRichard Henderson     0x3c141428, 0x3f15152a, 0x3a16162c, 0x3917172e,
130fb250c59SRichard Henderson     0x28181830, 0x2b191932, 0x2e1a1a34, 0x2d1b1b36,
131fb250c59SRichard Henderson     0x241c1c38, 0x271d1d3a, 0x221e1e3c, 0x211f1f3e,
132fb250c59SRichard Henderson     0x60202040, 0x63212142, 0x66222244, 0x65232346,
133fb250c59SRichard Henderson     0x6c242448, 0x6f25254a, 0x6a26264c, 0x6927274e,
134fb250c59SRichard Henderson     0x78282850, 0x7b292952, 0x7e2a2a54, 0x7d2b2b56,
135fb250c59SRichard Henderson     0x742c2c58, 0x772d2d5a, 0x722e2e5c, 0x712f2f5e,
136fb250c59SRichard Henderson     0x50303060, 0x53313162, 0x56323264, 0x55333366,
137fb250c59SRichard Henderson     0x5c343468, 0x5f35356a, 0x5a36366c, 0x5937376e,
138fb250c59SRichard Henderson     0x48383870, 0x4b393972, 0x4e3a3a74, 0x4d3b3b76,
139fb250c59SRichard Henderson     0x443c3c78, 0x473d3d7a, 0x423e3e7c, 0x413f3f7e,
140fb250c59SRichard Henderson     0xc0404080, 0xc3414182, 0xc6424284, 0xc5434386,
141fb250c59SRichard Henderson     0xcc444488, 0xcf45458a, 0xca46468c, 0xc947478e,
142fb250c59SRichard Henderson     0xd8484890, 0xdb494992, 0xde4a4a94, 0xdd4b4b96,
143fb250c59SRichard Henderson     0xd44c4c98, 0xd74d4d9a, 0xd24e4e9c, 0xd14f4f9e,
144fb250c59SRichard Henderson     0xf05050a0, 0xf35151a2, 0xf65252a4, 0xf55353a6,
145fb250c59SRichard Henderson     0xfc5454a8, 0xff5555aa, 0xfa5656ac, 0xf95757ae,
146fb250c59SRichard Henderson     0xe85858b0, 0xeb5959b2, 0xee5a5ab4, 0xed5b5bb6,
147fb250c59SRichard Henderson     0xe45c5cb8, 0xe75d5dba, 0xe25e5ebc, 0xe15f5fbe,
148fb250c59SRichard Henderson     0xa06060c0, 0xa36161c2, 0xa66262c4, 0xa56363c6,
149fb250c59SRichard Henderson     0xac6464c8, 0xaf6565ca, 0xaa6666cc, 0xa96767ce,
150fb250c59SRichard Henderson     0xb86868d0, 0xbb6969d2, 0xbe6a6ad4, 0xbd6b6bd6,
151fb250c59SRichard Henderson     0xb46c6cd8, 0xb76d6dda, 0xb26e6edc, 0xb16f6fde,
152fb250c59SRichard Henderson     0x907070e0, 0x937171e2, 0x967272e4, 0x957373e6,
153fb250c59SRichard Henderson     0x9c7474e8, 0x9f7575ea, 0x9a7676ec, 0x997777ee,
154fb250c59SRichard Henderson     0x887878f0, 0x8b7979f2, 0x8e7a7af4, 0x8d7b7bf6,
155fb250c59SRichard Henderson     0x847c7cf8, 0x877d7dfa, 0x827e7efc, 0x817f7ffe,
156fb250c59SRichard Henderson     0x9b80801b, 0x98818119, 0x9d82821f, 0x9e83831d,
157fb250c59SRichard Henderson     0x97848413, 0x94858511, 0x91868617, 0x92878715,
158fb250c59SRichard Henderson     0x8388880b, 0x80898909, 0x858a8a0f, 0x868b8b0d,
159fb250c59SRichard Henderson     0x8f8c8c03, 0x8c8d8d01, 0x898e8e07, 0x8a8f8f05,
160fb250c59SRichard Henderson     0xab90903b, 0xa8919139, 0xad92923f, 0xae93933d,
161fb250c59SRichard Henderson     0xa7949433, 0xa4959531, 0xa1969637, 0xa2979735,
162fb250c59SRichard Henderson     0xb398982b, 0xb0999929, 0xb59a9a2f, 0xb69b9b2d,
163fb250c59SRichard Henderson     0xbf9c9c23, 0xbc9d9d21, 0xb99e9e27, 0xba9f9f25,
164fb250c59SRichard Henderson     0xfba0a05b, 0xf8a1a159, 0xfda2a25f, 0xfea3a35d,
165fb250c59SRichard Henderson     0xf7a4a453, 0xf4a5a551, 0xf1a6a657, 0xf2a7a755,
166fb250c59SRichard Henderson     0xe3a8a84b, 0xe0a9a949, 0xe5aaaa4f, 0xe6abab4d,
167fb250c59SRichard Henderson     0xefacac43, 0xecadad41, 0xe9aeae47, 0xeaafaf45,
168fb250c59SRichard Henderson     0xcbb0b07b, 0xc8b1b179, 0xcdb2b27f, 0xceb3b37d,
169fb250c59SRichard Henderson     0xc7b4b473, 0xc4b5b571, 0xc1b6b677, 0xc2b7b775,
170fb250c59SRichard Henderson     0xd3b8b86b, 0xd0b9b969, 0xd5baba6f, 0xd6bbbb6d,
171fb250c59SRichard Henderson     0xdfbcbc63, 0xdcbdbd61, 0xd9bebe67, 0xdabfbf65,
172fb250c59SRichard Henderson     0x5bc0c09b, 0x58c1c199, 0x5dc2c29f, 0x5ec3c39d,
173fb250c59SRichard Henderson     0x57c4c493, 0x54c5c591, 0x51c6c697, 0x52c7c795,
174fb250c59SRichard Henderson     0x43c8c88b, 0x40c9c989, 0x45caca8f, 0x46cbcb8d,
175fb250c59SRichard Henderson     0x4fcccc83, 0x4ccdcd81, 0x49cece87, 0x4acfcf85,
176fb250c59SRichard Henderson     0x6bd0d0bb, 0x68d1d1b9, 0x6dd2d2bf, 0x6ed3d3bd,
177fb250c59SRichard Henderson     0x67d4d4b3, 0x64d5d5b1, 0x61d6d6b7, 0x62d7d7b5,
178fb250c59SRichard Henderson     0x73d8d8ab, 0x70d9d9a9, 0x75dadaaf, 0x76dbdbad,
179fb250c59SRichard Henderson     0x7fdcdca3, 0x7cdddda1, 0x79dedea7, 0x7adfdfa5,
180fb250c59SRichard Henderson     0x3be0e0db, 0x38e1e1d9, 0x3de2e2df, 0x3ee3e3dd,
181fb250c59SRichard Henderson     0x37e4e4d3, 0x34e5e5d1, 0x31e6e6d7, 0x32e7e7d5,
182fb250c59SRichard Henderson     0x23e8e8cb, 0x20e9e9c9, 0x25eaeacf, 0x26ebebcd,
183fb250c59SRichard Henderson     0x2fececc3, 0x2cededc1, 0x29eeeec7, 0x2aefefc5,
184fb250c59SRichard Henderson     0x0bf0f0fb, 0x08f1f1f9, 0x0df2f2ff, 0x0ef3f3fd,
185fb250c59SRichard Henderson     0x07f4f4f3, 0x04f5f5f1, 0x01f6f6f7, 0x02f7f7f5,
186fb250c59SRichard Henderson     0x13f8f8eb, 0x10f9f9e9, 0x15fafaef, 0x16fbfbed,
187fb250c59SRichard Henderson     0x1ffcfce3, 0x1cfdfde1, 0x19fefee7, 0x1affffe5,
188fb250c59SRichard Henderson };
189fb250c59SRichard Henderson 
190fb250c59SRichard Henderson /*
191fb250c59SRichard Henderson  * Inverse MixColumns lookup table, for use with rot32.
192fb250c59SRichard Henderson  */
193ff494c8eSRichard Henderson static const uint32_t AES_imc_rot[256] = {
194fb250c59SRichard Henderson     0x00000000, 0x0b0d090e, 0x161a121c, 0x1d171b12,
195fb250c59SRichard Henderson     0x2c342438, 0x27392d36, 0x3a2e3624, 0x31233f2a,
196fb250c59SRichard Henderson     0x58684870, 0x5365417e, 0x4e725a6c, 0x457f5362,
197fb250c59SRichard Henderson     0x745c6c48, 0x7f516546, 0x62467e54, 0x694b775a,
198fb250c59SRichard Henderson     0xb0d090e0, 0xbbdd99ee, 0xa6ca82fc, 0xadc78bf2,
199fb250c59SRichard Henderson     0x9ce4b4d8, 0x97e9bdd6, 0x8afea6c4, 0x81f3afca,
200fb250c59SRichard Henderson     0xe8b8d890, 0xe3b5d19e, 0xfea2ca8c, 0xf5afc382,
201fb250c59SRichard Henderson     0xc48cfca8, 0xcf81f5a6, 0xd296eeb4, 0xd99be7ba,
202fb250c59SRichard Henderson     0x7bbb3bdb, 0x70b632d5, 0x6da129c7, 0x66ac20c9,
203fb250c59SRichard Henderson     0x578f1fe3, 0x5c8216ed, 0x41950dff, 0x4a9804f1,
204fb250c59SRichard Henderson     0x23d373ab, 0x28de7aa5, 0x35c961b7, 0x3ec468b9,
205fb250c59SRichard Henderson     0x0fe75793, 0x04ea5e9d, 0x19fd458f, 0x12f04c81,
206fb250c59SRichard Henderson     0xcb6bab3b, 0xc066a235, 0xdd71b927, 0xd67cb029,
207fb250c59SRichard Henderson     0xe75f8f03, 0xec52860d, 0xf1459d1f, 0xfa489411,
208fb250c59SRichard Henderson     0x9303e34b, 0x980eea45, 0x8519f157, 0x8e14f859,
209fb250c59SRichard Henderson     0xbf37c773, 0xb43ace7d, 0xa92dd56f, 0xa220dc61,
210fb250c59SRichard Henderson     0xf66d76ad, 0xfd607fa3, 0xe07764b1, 0xeb7a6dbf,
211fb250c59SRichard Henderson     0xda595295, 0xd1545b9b, 0xcc434089, 0xc74e4987,
212fb250c59SRichard Henderson     0xae053edd, 0xa50837d3, 0xb81f2cc1, 0xb31225cf,
213fb250c59SRichard Henderson     0x82311ae5, 0x893c13eb, 0x942b08f9, 0x9f2601f7,
214fb250c59SRichard Henderson     0x46bde64d, 0x4db0ef43, 0x50a7f451, 0x5baafd5f,
215fb250c59SRichard Henderson     0x6a89c275, 0x6184cb7b, 0x7c93d069, 0x779ed967,
216fb250c59SRichard Henderson     0x1ed5ae3d, 0x15d8a733, 0x08cfbc21, 0x03c2b52f,
217fb250c59SRichard Henderson     0x32e18a05, 0x39ec830b, 0x24fb9819, 0x2ff69117,
218fb250c59SRichard Henderson     0x8dd64d76, 0x86db4478, 0x9bcc5f6a, 0x90c15664,
219fb250c59SRichard Henderson     0xa1e2694e, 0xaaef6040, 0xb7f87b52, 0xbcf5725c,
220fb250c59SRichard Henderson     0xd5be0506, 0xdeb30c08, 0xc3a4171a, 0xc8a91e14,
221fb250c59SRichard Henderson     0xf98a213e, 0xf2872830, 0xef903322, 0xe49d3a2c,
222fb250c59SRichard Henderson     0x3d06dd96, 0x360bd498, 0x2b1ccf8a, 0x2011c684,
223fb250c59SRichard Henderson     0x1132f9ae, 0x1a3ff0a0, 0x0728ebb2, 0x0c25e2bc,
224fb250c59SRichard Henderson     0x656e95e6, 0x6e639ce8, 0x737487fa, 0x78798ef4,
225fb250c59SRichard Henderson     0x495ab1de, 0x4257b8d0, 0x5f40a3c2, 0x544daacc,
226fb250c59SRichard Henderson     0xf7daec41, 0xfcd7e54f, 0xe1c0fe5d, 0xeacdf753,
227fb250c59SRichard Henderson     0xdbeec879, 0xd0e3c177, 0xcdf4da65, 0xc6f9d36b,
228fb250c59SRichard Henderson     0xafb2a431, 0xa4bfad3f, 0xb9a8b62d, 0xb2a5bf23,
229fb250c59SRichard Henderson     0x83868009, 0x888b8907, 0x959c9215, 0x9e919b1b,
230fb250c59SRichard Henderson     0x470a7ca1, 0x4c0775af, 0x51106ebd, 0x5a1d67b3,
231fb250c59SRichard Henderson     0x6b3e5899, 0x60335197, 0x7d244a85, 0x7629438b,
232fb250c59SRichard Henderson     0x1f6234d1, 0x146f3ddf, 0x097826cd, 0x02752fc3,
233fb250c59SRichard Henderson     0x335610e9, 0x385b19e7, 0x254c02f5, 0x2e410bfb,
234fb250c59SRichard Henderson     0x8c61d79a, 0x876cde94, 0x9a7bc586, 0x9176cc88,
235fb250c59SRichard Henderson     0xa055f3a2, 0xab58faac, 0xb64fe1be, 0xbd42e8b0,
236fb250c59SRichard Henderson     0xd4099fea, 0xdf0496e4, 0xc2138df6, 0xc91e84f8,
237fb250c59SRichard Henderson     0xf83dbbd2, 0xf330b2dc, 0xee27a9ce, 0xe52aa0c0,
238fb250c59SRichard Henderson     0x3cb1477a, 0x37bc4e74, 0x2aab5566, 0x21a65c68,
239fb250c59SRichard Henderson     0x10856342, 0x1b886a4c, 0x069f715e, 0x0d927850,
240fb250c59SRichard Henderson     0x64d90f0a, 0x6fd40604, 0x72c31d16, 0x79ce1418,
241fb250c59SRichard Henderson     0x48ed2b32, 0x43e0223c, 0x5ef7392e, 0x55fa3020,
242fb250c59SRichard Henderson     0x01b79aec, 0x0aba93e2, 0x17ad88f0, 0x1ca081fe,
243fb250c59SRichard Henderson     0x2d83bed4, 0x268eb7da, 0x3b99acc8, 0x3094a5c6,
244fb250c59SRichard Henderson     0x59dfd29c, 0x52d2db92, 0x4fc5c080, 0x44c8c98e,
245fb250c59SRichard Henderson     0x75ebf6a4, 0x7ee6ffaa, 0x63f1e4b8, 0x68fcedb6,
246fb250c59SRichard Henderson     0xb1670a0c, 0xba6a0302, 0xa77d1810, 0xac70111e,
247fb250c59SRichard Henderson     0x9d532e34, 0x965e273a, 0x8b493c28, 0x80443526,
248fb250c59SRichard Henderson     0xe90f427c, 0xe2024b72, 0xff155060, 0xf418596e,
249fb250c59SRichard Henderson     0xc53b6644, 0xce366f4a, 0xd3217458, 0xd82c7d56,
250fb250c59SRichard Henderson     0x7a0ca137, 0x7101a839, 0x6c16b32b, 0x671bba25,
251fb250c59SRichard Henderson     0x5638850f, 0x5d358c01, 0x40229713, 0x4b2f9e1d,
252fb250c59SRichard Henderson     0x2264e947, 0x2969e049, 0x347efb5b, 0x3f73f255,
253fb250c59SRichard Henderson     0x0e50cd7f, 0x055dc471, 0x184adf63, 0x1347d66d,
254fb250c59SRichard Henderson     0xcadc31d7, 0xc1d138d9, 0xdcc623cb, 0xd7cb2ac5,
255fb250c59SRichard Henderson     0xe6e815ef, 0xede51ce1, 0xf0f207f3, 0xfbff0efd,
256fb250c59SRichard Henderson     0x92b479a7, 0x99b970a9, 0x84ae6bbb, 0x8fa362b5,
257fb250c59SRichard Henderson     0xbe805d9f, 0xb58d5491, 0xa89a4f83, 0xa397468d,
258fb250c59SRichard Henderson };
259fb250c59SRichard Henderson 
2606f2945cdSDaniel P. Berrange 
2616f2945cdSDaniel P. Berrange /*
2626f2945cdSDaniel P. Berrange AES_Te0[x] = S [x].[02, 01, 01, 03];
2636f2945cdSDaniel P. Berrange AES_Te1[x] = S [x].[03, 02, 01, 01];
2646f2945cdSDaniel P. Berrange AES_Te2[x] = S [x].[01, 03, 02, 01];
2656f2945cdSDaniel P. Berrange AES_Te3[x] = S [x].[01, 01, 03, 02];
2666f2945cdSDaniel P. Berrange AES_Te4[x] = S [x].[01, 01, 01, 01];
2676f2945cdSDaniel P. Berrange 
2686f2945cdSDaniel P. Berrange AES_Td0[x] = Si[x].[0e, 09, 0d, 0b];
2696f2945cdSDaniel P. Berrange AES_Td1[x] = Si[x].[0b, 0e, 09, 0d];
2706f2945cdSDaniel P. Berrange AES_Td2[x] = Si[x].[0d, 0b, 0e, 09];
2716f2945cdSDaniel P. Berrange AES_Td3[x] = Si[x].[09, 0d, 0b, 0e];
2726f2945cdSDaniel P. Berrange AES_Td4[x] = Si[x].[01, 01, 01, 01];
2736f2945cdSDaniel P. Berrange */
2746f2945cdSDaniel P. Berrange 
275*9ea17007SArd Biesheuvel const uint32_t AES_Te0[256] = {
2766f2945cdSDaniel P. Berrange     0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
2776f2945cdSDaniel P. Berrange     0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
2786f2945cdSDaniel P. Berrange     0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
2796f2945cdSDaniel P. Berrange     0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
2806f2945cdSDaniel P. Berrange     0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
2816f2945cdSDaniel P. Berrange     0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
2826f2945cdSDaniel P. Berrange     0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
2836f2945cdSDaniel P. Berrange     0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
2846f2945cdSDaniel P. Berrange     0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
2856f2945cdSDaniel P. Berrange     0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
2866f2945cdSDaniel P. Berrange     0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
2876f2945cdSDaniel P. Berrange     0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
2886f2945cdSDaniel P. Berrange     0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
2896f2945cdSDaniel P. Berrange     0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
2906f2945cdSDaniel P. Berrange     0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
2916f2945cdSDaniel P. Berrange     0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
2926f2945cdSDaniel P. Berrange     0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
2936f2945cdSDaniel P. Berrange     0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
2946f2945cdSDaniel P. Berrange     0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
2956f2945cdSDaniel P. Berrange     0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
2966f2945cdSDaniel P. Berrange     0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
2976f2945cdSDaniel P. Berrange     0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
2986f2945cdSDaniel P. Berrange     0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
2996f2945cdSDaniel P. Berrange     0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
3006f2945cdSDaniel P. Berrange     0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
3016f2945cdSDaniel P. Berrange     0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
3026f2945cdSDaniel P. Berrange     0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
3036f2945cdSDaniel P. Berrange     0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
3046f2945cdSDaniel P. Berrange     0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
3056f2945cdSDaniel P. Berrange     0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
3066f2945cdSDaniel P. Berrange     0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
3076f2945cdSDaniel P. Berrange     0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
3086f2945cdSDaniel P. Berrange     0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
3096f2945cdSDaniel P. Berrange     0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
3106f2945cdSDaniel P. Berrange     0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
3116f2945cdSDaniel P. Berrange     0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
3126f2945cdSDaniel P. Berrange     0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
3136f2945cdSDaniel P. Berrange     0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
3146f2945cdSDaniel P. Berrange     0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
3156f2945cdSDaniel P. Berrange     0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
3166f2945cdSDaniel P. Berrange     0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
3176f2945cdSDaniel P. Berrange     0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
3186f2945cdSDaniel P. Berrange     0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
3196f2945cdSDaniel P. Berrange     0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
3206f2945cdSDaniel P. Berrange     0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
3216f2945cdSDaniel P. Berrange     0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
3226f2945cdSDaniel P. Berrange     0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
3236f2945cdSDaniel P. Berrange     0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
3246f2945cdSDaniel P. Berrange     0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
3256f2945cdSDaniel P. Berrange     0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
3266f2945cdSDaniel P. Berrange     0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
3276f2945cdSDaniel P. Berrange     0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
3286f2945cdSDaniel P. Berrange     0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
3296f2945cdSDaniel P. Berrange     0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
3306f2945cdSDaniel P. Berrange     0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
3316f2945cdSDaniel P. Berrange     0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
3326f2945cdSDaniel P. Berrange     0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
3336f2945cdSDaniel P. Berrange     0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
3346f2945cdSDaniel P. Berrange     0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
3356f2945cdSDaniel P. Berrange     0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
3366f2945cdSDaniel P. Berrange     0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
3376f2945cdSDaniel P. Berrange     0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
3386f2945cdSDaniel P. Berrange     0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
3396f2945cdSDaniel P. Berrange     0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
3406f2945cdSDaniel P. Berrange };
341ff494c8eSRichard Henderson 
342ff494c8eSRichard Henderson static const uint32_t AES_Te1[256] = {
3436f2945cdSDaniel P. Berrange     0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,
3446f2945cdSDaniel P. Berrange     0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,
3456f2945cdSDaniel P. Berrange     0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,
3466f2945cdSDaniel P. Berrange     0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,
3476f2945cdSDaniel P. Berrange     0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
3486f2945cdSDaniel P. Berrange     0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,
3496f2945cdSDaniel P. Berrange     0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,
3506f2945cdSDaniel P. Berrange     0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,
3516f2945cdSDaniel P. Berrange     0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,
3526f2945cdSDaniel P. Berrange     0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
3536f2945cdSDaniel P. Berrange     0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,
3546f2945cdSDaniel P. Berrange     0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,
3556f2945cdSDaniel P. Berrange     0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,
3566f2945cdSDaniel P. Berrange     0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,
3576f2945cdSDaniel P. Berrange     0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
3586f2945cdSDaniel P. Berrange     0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,
3596f2945cdSDaniel P. Berrange     0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,
3606f2945cdSDaniel P. Berrange     0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,
3616f2945cdSDaniel P. Berrange     0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,
3626f2945cdSDaniel P. Berrange     0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
3636f2945cdSDaniel P. Berrange     0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,
3646f2945cdSDaniel P. Berrange     0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,
3656f2945cdSDaniel P. Berrange     0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,
3666f2945cdSDaniel P. Berrange     0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,
3676f2945cdSDaniel P. Berrange     0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
3686f2945cdSDaniel P. Berrange     0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,
3696f2945cdSDaniel P. Berrange     0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,
3706f2945cdSDaniel P. Berrange     0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,
3716f2945cdSDaniel P. Berrange     0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,
3726f2945cdSDaniel P. Berrange     0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
3736f2945cdSDaniel P. Berrange     0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,
3746f2945cdSDaniel P. Berrange     0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,
3756f2945cdSDaniel P. Berrange     0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,
3766f2945cdSDaniel P. Berrange     0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,
3776f2945cdSDaniel P. Berrange     0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
3786f2945cdSDaniel P. Berrange     0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,
3796f2945cdSDaniel P. Berrange     0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,
3806f2945cdSDaniel P. Berrange     0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,
3816f2945cdSDaniel P. Berrange     0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,
3826f2945cdSDaniel P. Berrange     0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
3836f2945cdSDaniel P. Berrange     0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,
3846f2945cdSDaniel P. Berrange     0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,
3856f2945cdSDaniel P. Berrange     0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,
3866f2945cdSDaniel P. Berrange     0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,
3876f2945cdSDaniel P. Berrange     0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
3886f2945cdSDaniel P. Berrange     0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,
3896f2945cdSDaniel P. Berrange     0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,
3906f2945cdSDaniel P. Berrange     0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,
3916f2945cdSDaniel P. Berrange     0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,
3926f2945cdSDaniel P. Berrange     0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
3936f2945cdSDaniel P. Berrange     0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,
3946f2945cdSDaniel P. Berrange     0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,
3956f2945cdSDaniel P. Berrange     0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,
3966f2945cdSDaniel P. Berrange     0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,
3976f2945cdSDaniel P. Berrange     0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
3986f2945cdSDaniel P. Berrange     0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,
3996f2945cdSDaniel P. Berrange     0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,
4006f2945cdSDaniel P. Berrange     0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,
4016f2945cdSDaniel P. Berrange     0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,
4026f2945cdSDaniel P. Berrange     0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
4036f2945cdSDaniel P. Berrange     0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,
4046f2945cdSDaniel P. Berrange     0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,
4056f2945cdSDaniel P. Berrange     0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,
4066f2945cdSDaniel P. Berrange     0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,
4076f2945cdSDaniel P. Berrange };
408ff494c8eSRichard Henderson 
409ff494c8eSRichard Henderson static const uint32_t AES_Te2[256] = {
4106f2945cdSDaniel P. Berrange     0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,
4116f2945cdSDaniel P. Berrange     0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,
4126f2945cdSDaniel P. Berrange     0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,
4136f2945cdSDaniel P. Berrange     0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,
4146f2945cdSDaniel P. Berrange     0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
4156f2945cdSDaniel P. Berrange     0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,
4166f2945cdSDaniel P. Berrange     0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,
4176f2945cdSDaniel P. Berrange     0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,
4186f2945cdSDaniel P. Berrange     0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,
4196f2945cdSDaniel P. Berrange     0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
4206f2945cdSDaniel P. Berrange     0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,
4216f2945cdSDaniel P. Berrange     0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,
4226f2945cdSDaniel P. Berrange     0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,
4236f2945cdSDaniel P. Berrange     0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,
4246f2945cdSDaniel P. Berrange     0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
4256f2945cdSDaniel P. Berrange     0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,
4266f2945cdSDaniel P. Berrange     0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,
4276f2945cdSDaniel P. Berrange     0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,
4286f2945cdSDaniel P. Berrange     0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,
4296f2945cdSDaniel P. Berrange     0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
4306f2945cdSDaniel P. Berrange     0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,
4316f2945cdSDaniel P. Berrange     0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,
4326f2945cdSDaniel P. Berrange     0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,
4336f2945cdSDaniel P. Berrange     0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,
4346f2945cdSDaniel P. Berrange     0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
4356f2945cdSDaniel P. Berrange     0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,
4366f2945cdSDaniel P. Berrange     0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,
4376f2945cdSDaniel P. Berrange     0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,
4386f2945cdSDaniel P. Berrange     0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,
4396f2945cdSDaniel P. Berrange     0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
4406f2945cdSDaniel P. Berrange     0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,
4416f2945cdSDaniel P. Berrange     0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,
4426f2945cdSDaniel P. Berrange     0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,
4436f2945cdSDaniel P. Berrange     0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,
4446f2945cdSDaniel P. Berrange     0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
4456f2945cdSDaniel P. Berrange     0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,
4466f2945cdSDaniel P. Berrange     0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,
4476f2945cdSDaniel P. Berrange     0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,
4486f2945cdSDaniel P. Berrange     0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,
4496f2945cdSDaniel P. Berrange     0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
4506f2945cdSDaniel P. Berrange     0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,
4516f2945cdSDaniel P. Berrange     0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,
4526f2945cdSDaniel P. Berrange     0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,
4536f2945cdSDaniel P. Berrange     0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,
4546f2945cdSDaniel P. Berrange     0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
4556f2945cdSDaniel P. Berrange     0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,
4566f2945cdSDaniel P. Berrange     0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,
4576f2945cdSDaniel P. Berrange     0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,
4586f2945cdSDaniel P. Berrange     0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,
4596f2945cdSDaniel P. Berrange     0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
4606f2945cdSDaniel P. Berrange     0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,
4616f2945cdSDaniel P. Berrange     0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,
4626f2945cdSDaniel P. Berrange     0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,
4636f2945cdSDaniel P. Berrange     0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,
4646f2945cdSDaniel P. Berrange     0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
4656f2945cdSDaniel P. Berrange     0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,
4666f2945cdSDaniel P. Berrange     0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,
4676f2945cdSDaniel P. Berrange     0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,
4686f2945cdSDaniel P. Berrange     0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,
4696f2945cdSDaniel P. Berrange     0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
4706f2945cdSDaniel P. Berrange     0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,
4716f2945cdSDaniel P. Berrange     0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,
4726f2945cdSDaniel P. Berrange     0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,
4736f2945cdSDaniel P. Berrange     0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,
4746f2945cdSDaniel P. Berrange };
4756f2945cdSDaniel P. Berrange 
476ff494c8eSRichard Henderson static const uint32_t AES_Te3[256] = {
4776f2945cdSDaniel P. Berrange     0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,
4786f2945cdSDaniel P. Berrange     0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,
4796f2945cdSDaniel P. Berrange     0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,
4806f2945cdSDaniel P. Berrange     0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,
4816f2945cdSDaniel P. Berrange     0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
4826f2945cdSDaniel P. Berrange     0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,
4836f2945cdSDaniel P. Berrange     0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,
4846f2945cdSDaniel P. Berrange     0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,
4856f2945cdSDaniel P. Berrange     0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,
4866f2945cdSDaniel P. Berrange     0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
4876f2945cdSDaniel P. Berrange     0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,
4886f2945cdSDaniel P. Berrange     0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,
4896f2945cdSDaniel P. Berrange     0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,
4906f2945cdSDaniel P. Berrange     0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,
4916f2945cdSDaniel P. Berrange     0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
4926f2945cdSDaniel P. Berrange     0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,
4936f2945cdSDaniel P. Berrange     0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,
4946f2945cdSDaniel P. Berrange     0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,
4956f2945cdSDaniel P. Berrange     0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,
4966f2945cdSDaniel P. Berrange     0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
4976f2945cdSDaniel P. Berrange     0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,
4986f2945cdSDaniel P. Berrange     0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,
4996f2945cdSDaniel P. Berrange     0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,
5006f2945cdSDaniel P. Berrange     0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,
5016f2945cdSDaniel P. Berrange     0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
5026f2945cdSDaniel P. Berrange     0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,
5036f2945cdSDaniel P. Berrange     0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,
5046f2945cdSDaniel P. Berrange     0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,
5056f2945cdSDaniel P. Berrange     0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,
5066f2945cdSDaniel P. Berrange     0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
5076f2945cdSDaniel P. Berrange     0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,
5086f2945cdSDaniel P. Berrange     0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,
5096f2945cdSDaniel P. Berrange     0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,
5106f2945cdSDaniel P. Berrange     0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,
5116f2945cdSDaniel P. Berrange     0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
5126f2945cdSDaniel P. Berrange     0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,
5136f2945cdSDaniel P. Berrange     0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,
5146f2945cdSDaniel P. Berrange     0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,
5156f2945cdSDaniel P. Berrange     0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,
5166f2945cdSDaniel P. Berrange     0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
5176f2945cdSDaniel P. Berrange     0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,
5186f2945cdSDaniel P. Berrange     0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,
5196f2945cdSDaniel P. Berrange     0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,
5206f2945cdSDaniel P. Berrange     0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,
5216f2945cdSDaniel P. Berrange     0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
5226f2945cdSDaniel P. Berrange     0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,
5236f2945cdSDaniel P. Berrange     0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,
5246f2945cdSDaniel P. Berrange     0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,
5256f2945cdSDaniel P. Berrange     0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,
5266f2945cdSDaniel P. Berrange     0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
5276f2945cdSDaniel P. Berrange     0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,
5286f2945cdSDaniel P. Berrange     0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,
5296f2945cdSDaniel P. Berrange     0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,
5306f2945cdSDaniel P. Berrange     0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,
5316f2945cdSDaniel P. Berrange     0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
5326f2945cdSDaniel P. Berrange     0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,
5336f2945cdSDaniel P. Berrange     0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,
5346f2945cdSDaniel P. Berrange     0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,
5356f2945cdSDaniel P. Berrange     0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,
5366f2945cdSDaniel P. Berrange     0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
5376f2945cdSDaniel P. Berrange     0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,
5386f2945cdSDaniel P. Berrange     0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,
5396f2945cdSDaniel P. Berrange     0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,
5406f2945cdSDaniel P. Berrange     0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,
5416f2945cdSDaniel P. Berrange };
542ff494c8eSRichard Henderson 
543ff494c8eSRichard Henderson static const uint32_t AES_Te4[256] = {
5446f2945cdSDaniel P. Berrange     0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU,
5456f2945cdSDaniel P. Berrange     0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U,
5466f2945cdSDaniel P. Berrange     0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU,
5476f2945cdSDaniel P. Berrange     0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U,
5486f2945cdSDaniel P. Berrange     0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU,
5496f2945cdSDaniel P. Berrange     0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U,
5506f2945cdSDaniel P. Berrange     0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU,
5516f2945cdSDaniel P. Berrange     0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U,
5526f2945cdSDaniel P. Berrange     0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U,
5536f2945cdSDaniel P. Berrange     0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU,
5546f2945cdSDaniel P. Berrange     0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U,
5556f2945cdSDaniel P. Berrange     0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U,
5566f2945cdSDaniel P. Berrange     0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U,
5576f2945cdSDaniel P. Berrange     0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU,
5586f2945cdSDaniel P. Berrange     0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U,
5596f2945cdSDaniel P. Berrange     0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U,
5606f2945cdSDaniel P. Berrange     0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU,
5616f2945cdSDaniel P. Berrange     0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U,
5626f2945cdSDaniel P. Berrange     0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U,
5636f2945cdSDaniel P. Berrange     0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U,
5646f2945cdSDaniel P. Berrange     0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU,
5656f2945cdSDaniel P. Berrange     0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU,
5666f2945cdSDaniel P. Berrange     0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U,
5676f2945cdSDaniel P. Berrange     0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU,
5686f2945cdSDaniel P. Berrange     0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU,
5696f2945cdSDaniel P. Berrange     0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U,
5706f2945cdSDaniel P. Berrange     0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU,
5716f2945cdSDaniel P. Berrange     0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U,
5726f2945cdSDaniel P. Berrange     0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU,
5736f2945cdSDaniel P. Berrange     0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U,
5746f2945cdSDaniel P. Berrange     0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U,
5756f2945cdSDaniel P. Berrange     0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U,
5766f2945cdSDaniel P. Berrange     0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU,
5776f2945cdSDaniel P. Berrange     0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U,
5786f2945cdSDaniel P. Berrange     0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU,
5796f2945cdSDaniel P. Berrange     0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U,
5806f2945cdSDaniel P. Berrange     0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU,
5816f2945cdSDaniel P. Berrange     0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U,
5826f2945cdSDaniel P. Berrange     0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U,
5836f2945cdSDaniel P. Berrange     0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU,
5846f2945cdSDaniel P. Berrange     0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU,
5856f2945cdSDaniel P. Berrange     0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU,
5866f2945cdSDaniel P. Berrange     0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U,
5876f2945cdSDaniel P. Berrange     0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U,
5886f2945cdSDaniel P. Berrange     0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU,
5896f2945cdSDaniel P. Berrange     0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U,
5906f2945cdSDaniel P. Berrange     0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU,
5916f2945cdSDaniel P. Berrange     0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U,
5926f2945cdSDaniel P. Berrange     0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU,
5936f2945cdSDaniel P. Berrange     0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U,
5946f2945cdSDaniel P. Berrange     0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU,
5956f2945cdSDaniel P. Berrange     0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU,
5966f2945cdSDaniel P. Berrange     0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U,
5976f2945cdSDaniel P. Berrange     0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU,
5986f2945cdSDaniel P. Berrange     0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U,
5996f2945cdSDaniel P. Berrange     0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU,
6006f2945cdSDaniel P. Berrange     0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U,
6016f2945cdSDaniel P. Berrange     0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U,
6026f2945cdSDaniel P. Berrange     0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U,
6036f2945cdSDaniel P. Berrange     0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU,
6046f2945cdSDaniel P. Berrange     0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU,
6056f2945cdSDaniel P. Berrange     0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U,
6066f2945cdSDaniel P. Berrange     0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU,
6076f2945cdSDaniel P. Berrange     0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U,
6086f2945cdSDaniel P. Berrange };
609ff494c8eSRichard Henderson 
610*9ea17007SArd Biesheuvel const uint32_t AES_Td0[256] = {
6116f2945cdSDaniel P. Berrange     0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
6126f2945cdSDaniel P. Berrange     0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
6136f2945cdSDaniel P. Berrange     0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
6146f2945cdSDaniel P. Berrange     0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,
6156f2945cdSDaniel P. Berrange     0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
6166f2945cdSDaniel P. Berrange     0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,
6176f2945cdSDaniel P. Berrange     0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,
6186f2945cdSDaniel P. Berrange     0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,
6196f2945cdSDaniel P. Berrange     0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,
6206f2945cdSDaniel P. Berrange     0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
6216f2945cdSDaniel P. Berrange     0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,
6226f2945cdSDaniel P. Berrange     0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,
6236f2945cdSDaniel P. Berrange     0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,
6246f2945cdSDaniel P. Berrange     0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,
6256f2945cdSDaniel P. Berrange     0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
6266f2945cdSDaniel P. Berrange     0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,
6276f2945cdSDaniel P. Berrange     0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,
6286f2945cdSDaniel P. Berrange     0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,
6296f2945cdSDaniel P. Berrange     0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,
6306f2945cdSDaniel P. Berrange     0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
6316f2945cdSDaniel P. Berrange     0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,
6326f2945cdSDaniel P. Berrange     0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,
6336f2945cdSDaniel P. Berrange     0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,
6346f2945cdSDaniel P. Berrange     0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,
6356f2945cdSDaniel P. Berrange     0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
6366f2945cdSDaniel P. Berrange     0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,
6376f2945cdSDaniel P. Berrange     0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,
6386f2945cdSDaniel P. Berrange     0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,
6396f2945cdSDaniel P. Berrange     0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,
6406f2945cdSDaniel P. Berrange     0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
6416f2945cdSDaniel P. Berrange     0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,
6426f2945cdSDaniel P. Berrange     0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,
6436f2945cdSDaniel P. Berrange     0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,
6446f2945cdSDaniel P. Berrange     0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,
6456f2945cdSDaniel P. Berrange     0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
6466f2945cdSDaniel P. Berrange     0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,
6476f2945cdSDaniel P. Berrange     0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,
6486f2945cdSDaniel P. Berrange     0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,
6496f2945cdSDaniel P. Berrange     0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,
6506f2945cdSDaniel P. Berrange     0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
6516f2945cdSDaniel P. Berrange     0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,
6526f2945cdSDaniel P. Berrange     0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,
6536f2945cdSDaniel P. Berrange     0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,
6546f2945cdSDaniel P. Berrange     0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,
6556f2945cdSDaniel P. Berrange     0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
6566f2945cdSDaniel P. Berrange     0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,
6576f2945cdSDaniel P. Berrange     0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,
6586f2945cdSDaniel P. Berrange     0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,
6596f2945cdSDaniel P. Berrange     0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,
6606f2945cdSDaniel P. Berrange     0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
6616f2945cdSDaniel P. Berrange     0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,
6626f2945cdSDaniel P. Berrange     0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,
6636f2945cdSDaniel P. Berrange     0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,
6646f2945cdSDaniel P. Berrange     0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,
6656f2945cdSDaniel P. Berrange     0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
6666f2945cdSDaniel P. Berrange     0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,
6676f2945cdSDaniel P. Berrange     0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,
6686f2945cdSDaniel P. Berrange     0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,
6696f2945cdSDaniel P. Berrange     0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,
6706f2945cdSDaniel P. Berrange     0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
6716f2945cdSDaniel P. Berrange     0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,
6726f2945cdSDaniel P. Berrange     0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,
6736f2945cdSDaniel P. Berrange     0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
6746f2945cdSDaniel P. Berrange     0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
6756f2945cdSDaniel P. Berrange };
676ff494c8eSRichard Henderson 
677ff494c8eSRichard Henderson static const uint32_t AES_Td1[256] = {
6786f2945cdSDaniel P. Berrange     0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,
6796f2945cdSDaniel P. Berrange     0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,
6806f2945cdSDaniel P. Berrange     0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU,
6816f2945cdSDaniel P. Berrange     0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U,
6826f2945cdSDaniel P. Berrange     0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,
6836f2945cdSDaniel P. Berrange     0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U,
6846f2945cdSDaniel P. Berrange     0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U,
6856f2945cdSDaniel P. Berrange     0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U,
6866f2945cdSDaniel P. Berrange     0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U,
6876f2945cdSDaniel P. Berrange     0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,
6886f2945cdSDaniel P. Berrange     0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU,
6896f2945cdSDaniel P. Berrange     0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU,
6906f2945cdSDaniel P. Berrange     0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U,
6916f2945cdSDaniel P. Berrange     0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU,
6926f2945cdSDaniel P. Berrange     0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,
6936f2945cdSDaniel P. Berrange     0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U,
6946f2945cdSDaniel P. Berrange     0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U,
6956f2945cdSDaniel P. Berrange     0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU,
6966f2945cdSDaniel P. Berrange     0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU,
6976f2945cdSDaniel P. Berrange     0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,
6986f2945cdSDaniel P. Berrange     0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU,
6996f2945cdSDaniel P. Berrange     0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U,
7006f2945cdSDaniel P. Berrange     0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU,
7016f2945cdSDaniel P. Berrange     0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU,
7026f2945cdSDaniel P. Berrange     0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,
7036f2945cdSDaniel P. Berrange     0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U,
7046f2945cdSDaniel P. Berrange     0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U,
7056f2945cdSDaniel P. Berrange     0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU,
7066f2945cdSDaniel P. Berrange     0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U,
7076f2945cdSDaniel P. Berrange     0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,
7086f2945cdSDaniel P. Berrange     0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U,
7096f2945cdSDaniel P. Berrange     0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U,
7106f2945cdSDaniel P. Berrange     0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U,
7116f2945cdSDaniel P. Berrange     0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU,
7126f2945cdSDaniel P. Berrange     0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,
7136f2945cdSDaniel P. Berrange     0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U,
7146f2945cdSDaniel P. Berrange     0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U,
7156f2945cdSDaniel P. Berrange     0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U,
7166f2945cdSDaniel P. Berrange     0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U,
7176f2945cdSDaniel P. Berrange     0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,
7186f2945cdSDaniel P. Berrange     0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU,
7196f2945cdSDaniel P. Berrange     0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU,
7206f2945cdSDaniel P. Berrange     0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U,
7216f2945cdSDaniel P. Berrange     0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU,
7226f2945cdSDaniel P. Berrange     0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,
7236f2945cdSDaniel P. Berrange     0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU,
7246f2945cdSDaniel P. Berrange     0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU,
7256f2945cdSDaniel P. Berrange     0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U,
7266f2945cdSDaniel P. Berrange     0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU,
7276f2945cdSDaniel P. Berrange     0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,
7286f2945cdSDaniel P. Berrange     0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U,
7296f2945cdSDaniel P. Berrange     0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U,
7306f2945cdSDaniel P. Berrange     0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U,
7316f2945cdSDaniel P. Berrange     0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U,
7326f2945cdSDaniel P. Berrange     0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,
7336f2945cdSDaniel P. Berrange     0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U,
7346f2945cdSDaniel P. Berrange     0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU,
7356f2945cdSDaniel P. Berrange     0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U,
7366f2945cdSDaniel P. Berrange     0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U,
7376f2945cdSDaniel P. Berrange     0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,
7386f2945cdSDaniel P. Berrange     0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U,
7396f2945cdSDaniel P. Berrange     0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U,
7406f2945cdSDaniel P. Berrange     0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,
7416f2945cdSDaniel P. Berrange     0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,
7426f2945cdSDaniel P. Berrange };
743ff494c8eSRichard Henderson 
744ff494c8eSRichard Henderson static const uint32_t AES_Td2[256] = {
7456f2945cdSDaniel P. Berrange     0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,
7466f2945cdSDaniel P. Berrange     0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,
7476f2945cdSDaniel P. Berrange     0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U,
7486f2945cdSDaniel P. Berrange     0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U,
7496f2945cdSDaniel P. Berrange     0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,
7506f2945cdSDaniel P. Berrange     0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U,
7516f2945cdSDaniel P. Berrange     0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U,
7526f2945cdSDaniel P. Berrange     0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U,
7536f2945cdSDaniel P. Berrange     0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U,
7546f2945cdSDaniel P. Berrange     0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,
7556f2945cdSDaniel P. Berrange     0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U,
7566f2945cdSDaniel P. Berrange     0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U,
7576f2945cdSDaniel P. Berrange     0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU,
7586f2945cdSDaniel P. Berrange     0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U,
7596f2945cdSDaniel P. Berrange     0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,
7606f2945cdSDaniel P. Berrange     0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U,
7616f2945cdSDaniel P. Berrange     0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U,
7626f2945cdSDaniel P. Berrange     0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U,
7636f2945cdSDaniel P. Berrange     0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U,
7646f2945cdSDaniel P. Berrange     0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,
7656f2945cdSDaniel P. Berrange 
7666f2945cdSDaniel P. Berrange     0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U,
7676f2945cdSDaniel P. Berrange     0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U,
7686f2945cdSDaniel P. Berrange     0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U,
7696f2945cdSDaniel P. Berrange     0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U,
7706f2945cdSDaniel P. Berrange     0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,
7716f2945cdSDaniel P. Berrange     0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU,
7726f2945cdSDaniel P. Berrange     0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU,
7736f2945cdSDaniel P. Berrange     0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U,
7746f2945cdSDaniel P. Berrange     0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU,
7756f2945cdSDaniel P. Berrange     0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,
7766f2945cdSDaniel P. Berrange     0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU,
7776f2945cdSDaniel P. Berrange     0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU,
7786f2945cdSDaniel P. Berrange     0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU,
7796f2945cdSDaniel P. Berrange     0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU,
7806f2945cdSDaniel P. Berrange     0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,
7816f2945cdSDaniel P. Berrange     0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U,
7826f2945cdSDaniel P. Berrange     0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U,
7836f2945cdSDaniel P. Berrange     0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U,
7846f2945cdSDaniel P. Berrange     0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U,
7856f2945cdSDaniel P. Berrange     0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,
7866f2945cdSDaniel P. Berrange     0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U,
7876f2945cdSDaniel P. Berrange     0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU,
7886f2945cdSDaniel P. Berrange     0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU,
7896f2945cdSDaniel P. Berrange     0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U,
7906f2945cdSDaniel P. Berrange     0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,
7916f2945cdSDaniel P. Berrange     0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU,
7926f2945cdSDaniel P. Berrange     0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU,
7936f2945cdSDaniel P. Berrange     0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U,
7946f2945cdSDaniel P. Berrange     0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U,
7956f2945cdSDaniel P. Berrange     0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,
7966f2945cdSDaniel P. Berrange     0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U,
7976f2945cdSDaniel P. Berrange     0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U,
7986f2945cdSDaniel P. Berrange     0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U,
7996f2945cdSDaniel P. Berrange     0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U,
8006f2945cdSDaniel P. Berrange     0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,
8016f2945cdSDaniel P. Berrange     0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U,
8026f2945cdSDaniel P. Berrange     0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U,
8036f2945cdSDaniel P. Berrange     0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U,
8046f2945cdSDaniel P. Berrange     0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U,
8056f2945cdSDaniel P. Berrange     0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,
8066f2945cdSDaniel P. Berrange     0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U,
8076f2945cdSDaniel P. Berrange     0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU,
8086f2945cdSDaniel P. Berrange     0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,
8096f2945cdSDaniel P. Berrange     0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,
8106f2945cdSDaniel P. Berrange };
811ff494c8eSRichard Henderson 
812ff494c8eSRichard Henderson static const uint32_t AES_Td3[256] = {
8136f2945cdSDaniel P. Berrange     0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,
8146f2945cdSDaniel P. Berrange     0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,
8156f2945cdSDaniel P. Berrange     0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U,
8166f2945cdSDaniel P. Berrange     0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U,
8176f2945cdSDaniel P. Berrange     0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,
8186f2945cdSDaniel P. Berrange     0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU,
8196f2945cdSDaniel P. Berrange     0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U,
8206f2945cdSDaniel P. Berrange     0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU,
8216f2945cdSDaniel P. Berrange     0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U,
8226f2945cdSDaniel P. Berrange     0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,
8236f2945cdSDaniel P. Berrange     0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U,
8246f2945cdSDaniel P. Berrange     0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U,
8256f2945cdSDaniel P. Berrange     0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U,
8266f2945cdSDaniel P. Berrange     0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U,
8276f2945cdSDaniel P. Berrange     0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,
8286f2945cdSDaniel P. Berrange     0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU,
8296f2945cdSDaniel P. Berrange     0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU,
8306f2945cdSDaniel P. Berrange     0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U,
8316f2945cdSDaniel P. Berrange     0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U,
8326f2945cdSDaniel P. Berrange     0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,
8336f2945cdSDaniel P. Berrange     0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU,
8346f2945cdSDaniel P. Berrange     0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U,
8356f2945cdSDaniel P. Berrange     0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U,
8366f2945cdSDaniel P. Berrange     0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U,
8376f2945cdSDaniel P. Berrange     0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,
8386f2945cdSDaniel P. Berrange     0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU,
8396f2945cdSDaniel P. Berrange     0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U,
8406f2945cdSDaniel P. Berrange     0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U,
8416f2945cdSDaniel P. Berrange     0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU,
8426f2945cdSDaniel P. Berrange     0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,
8436f2945cdSDaniel P. Berrange     0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U,
8446f2945cdSDaniel P. Berrange     0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U,
8456f2945cdSDaniel P. Berrange     0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U,
8466f2945cdSDaniel P. Berrange     0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU,
8476f2945cdSDaniel P. Berrange     0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,
8486f2945cdSDaniel P. Berrange     0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U,
8496f2945cdSDaniel P. Berrange     0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U,
8506f2945cdSDaniel P. Berrange     0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U,
8516f2945cdSDaniel P. Berrange     0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U,
8526f2945cdSDaniel P. Berrange     0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,
8536f2945cdSDaniel P. Berrange     0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U,
8546f2945cdSDaniel P. Berrange     0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU,
8556f2945cdSDaniel P. Berrange     0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U,
8566f2945cdSDaniel P. Berrange     0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U,
8576f2945cdSDaniel P. Berrange     0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,
8586f2945cdSDaniel P. Berrange     0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU,
8596f2945cdSDaniel P. Berrange     0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U,
8606f2945cdSDaniel P. Berrange     0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU,
8616f2945cdSDaniel P. Berrange     0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U,
8626f2945cdSDaniel P. Berrange     0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,
8636f2945cdSDaniel P. Berrange     0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U,
8646f2945cdSDaniel P. Berrange     0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U,
8656f2945cdSDaniel P. Berrange     0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U,
8666f2945cdSDaniel P. Berrange     0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U,
8676f2945cdSDaniel P. Berrange     0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,
8686f2945cdSDaniel P. Berrange     0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU,
8696f2945cdSDaniel P. Berrange     0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU,
8706f2945cdSDaniel P. Berrange     0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU,
8716f2945cdSDaniel P. Berrange     0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U,
8726f2945cdSDaniel P. Berrange     0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,
8736f2945cdSDaniel P. Berrange     0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U,
8746f2945cdSDaniel P. Berrange     0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU,
8756f2945cdSDaniel P. Berrange     0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,
8766f2945cdSDaniel P. Berrange     0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,
8776f2945cdSDaniel P. Berrange };
878ff494c8eSRichard Henderson 
879ff494c8eSRichard Henderson static const uint32_t AES_Td4[256] = {
8806f2945cdSDaniel P. Berrange     0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U,
8816f2945cdSDaniel P. Berrange     0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U,
8826f2945cdSDaniel P. Berrange     0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU,
8836f2945cdSDaniel P. Berrange     0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU,
8846f2945cdSDaniel P. Berrange     0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U,
8856f2945cdSDaniel P. Berrange     0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U,
8866f2945cdSDaniel P. Berrange     0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U,
8876f2945cdSDaniel P. Berrange     0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU,
8886f2945cdSDaniel P. Berrange     0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U,
8896f2945cdSDaniel P. Berrange     0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU,
8906f2945cdSDaniel P. Berrange     0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU,
8916f2945cdSDaniel P. Berrange     0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU,
8926f2945cdSDaniel P. Berrange     0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U,
8936f2945cdSDaniel P. Berrange     0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U,
8946f2945cdSDaniel P. Berrange     0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U,
8956f2945cdSDaniel P. Berrange     0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U,
8966f2945cdSDaniel P. Berrange     0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U,
8976f2945cdSDaniel P. Berrange     0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U,
8986f2945cdSDaniel P. Berrange     0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU,
8996f2945cdSDaniel P. Berrange     0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U,
9006f2945cdSDaniel P. Berrange     0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U,
9016f2945cdSDaniel P. Berrange     0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU,
9026f2945cdSDaniel P. Berrange     0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U,
9036f2945cdSDaniel P. Berrange     0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U,
9046f2945cdSDaniel P. Berrange     0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U,
9056f2945cdSDaniel P. Berrange     0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU,
9066f2945cdSDaniel P. Berrange     0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U,
9076f2945cdSDaniel P. Berrange     0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U,
9086f2945cdSDaniel P. Berrange     0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU,
9096f2945cdSDaniel P. Berrange     0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U,
9106f2945cdSDaniel P. Berrange     0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U,
9116f2945cdSDaniel P. Berrange     0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU,
9126f2945cdSDaniel P. Berrange     0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U,
9136f2945cdSDaniel P. Berrange     0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU,
9146f2945cdSDaniel P. Berrange     0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU,
9156f2945cdSDaniel P. Berrange     0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U,
9166f2945cdSDaniel P. Berrange     0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U,
9176f2945cdSDaniel P. Berrange     0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U,
9186f2945cdSDaniel P. Berrange     0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U,
9196f2945cdSDaniel P. Berrange     0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU,
9206f2945cdSDaniel P. Berrange     0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U,
9216f2945cdSDaniel P. Berrange     0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U,
9226f2945cdSDaniel P. Berrange     0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU,
9236f2945cdSDaniel P. Berrange     0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU,
9246f2945cdSDaniel P. Berrange     0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU,
9256f2945cdSDaniel P. Berrange     0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U,
9266f2945cdSDaniel P. Berrange     0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU,
9276f2945cdSDaniel P. Berrange     0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U,
9286f2945cdSDaniel P. Berrange     0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U,
9296f2945cdSDaniel P. Berrange     0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U,
9306f2945cdSDaniel P. Berrange     0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U,
9316f2945cdSDaniel P. Berrange     0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU,
9326f2945cdSDaniel P. Berrange     0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U,
9336f2945cdSDaniel P. Berrange     0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU,
9346f2945cdSDaniel P. Berrange     0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU,
9356f2945cdSDaniel P. Berrange     0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU,
9366f2945cdSDaniel P. Berrange     0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU,
9376f2945cdSDaniel P. Berrange     0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U,
9386f2945cdSDaniel P. Berrange     0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU,
9396f2945cdSDaniel P. Berrange     0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U,
9406f2945cdSDaniel P. Berrange     0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU,
9416f2945cdSDaniel P. Berrange     0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U,
9426f2945cdSDaniel P. Berrange     0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U,
9436f2945cdSDaniel P. Berrange     0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU,
9446f2945cdSDaniel P. Berrange };
945ff494c8eSRichard Henderson 
9466f2945cdSDaniel P. Berrange static const u32 rcon[] = {
9476f2945cdSDaniel P. Berrange         0x01000000, 0x02000000, 0x04000000, 0x08000000,
9486f2945cdSDaniel P. Berrange         0x10000000, 0x20000000, 0x40000000, 0x80000000,
9496f2945cdSDaniel P. Berrange         0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
9506f2945cdSDaniel P. Berrange };
9516f2945cdSDaniel P. Berrange 
9526b0a96ceSRichard Henderson /*
95304e1f30eSRichard Henderson  * Perform MixColumns.
95404e1f30eSRichard Henderson  */
95504e1f30eSRichard Henderson static inline void
aesenc_MC_swap(AESState * r,const AESState * st,bool swap)95604e1f30eSRichard Henderson aesenc_MC_swap(AESState *r, const AESState *st, bool swap)
95704e1f30eSRichard Henderson {
95804e1f30eSRichard Henderson     int swap_b = swap * 0xf;
95904e1f30eSRichard Henderson     int swap_w = swap * 0x3;
96004e1f30eSRichard Henderson     bool be = HOST_BIG_ENDIAN ^ swap;
96104e1f30eSRichard Henderson     uint32_t t;
96204e1f30eSRichard Henderson 
96304e1f30eSRichard Henderson     /* Note that AES_mc_rot is encoded for little-endian. */
96404e1f30eSRichard Henderson     t = (      AES_mc_rot[st->b[swap_b ^ 0x0]] ^
96504e1f30eSRichard Henderson          rol32(AES_mc_rot[st->b[swap_b ^ 0x1]], 8) ^
96604e1f30eSRichard Henderson          rol32(AES_mc_rot[st->b[swap_b ^ 0x2]], 16) ^
96704e1f30eSRichard Henderson          rol32(AES_mc_rot[st->b[swap_b ^ 0x3]], 24));
96804e1f30eSRichard Henderson     if (be) {
96904e1f30eSRichard Henderson         t = bswap32(t);
97004e1f30eSRichard Henderson     }
97104e1f30eSRichard Henderson     r->w[swap_w ^ 0] = t;
97204e1f30eSRichard Henderson 
97304e1f30eSRichard Henderson     t = (      AES_mc_rot[st->b[swap_b ^ 0x4]] ^
97404e1f30eSRichard Henderson          rol32(AES_mc_rot[st->b[swap_b ^ 0x5]], 8) ^
97504e1f30eSRichard Henderson          rol32(AES_mc_rot[st->b[swap_b ^ 0x6]], 16) ^
97604e1f30eSRichard Henderson          rol32(AES_mc_rot[st->b[swap_b ^ 0x7]], 24));
97704e1f30eSRichard Henderson     if (be) {
97804e1f30eSRichard Henderson         t = bswap32(t);
97904e1f30eSRichard Henderson     }
98004e1f30eSRichard Henderson     r->w[swap_w ^ 1] = t;
98104e1f30eSRichard Henderson 
98204e1f30eSRichard Henderson     t = (      AES_mc_rot[st->b[swap_b ^ 0x8]] ^
98304e1f30eSRichard Henderson          rol32(AES_mc_rot[st->b[swap_b ^ 0x9]], 8) ^
98404e1f30eSRichard Henderson          rol32(AES_mc_rot[st->b[swap_b ^ 0xA]], 16) ^
98504e1f30eSRichard Henderson          rol32(AES_mc_rot[st->b[swap_b ^ 0xB]], 24));
98604e1f30eSRichard Henderson     if (be) {
98704e1f30eSRichard Henderson         t = bswap32(t);
98804e1f30eSRichard Henderson     }
98904e1f30eSRichard Henderson     r->w[swap_w ^ 2] = t;
99004e1f30eSRichard Henderson 
99104e1f30eSRichard Henderson     t = (      AES_mc_rot[st->b[swap_b ^ 0xC]] ^
99204e1f30eSRichard Henderson          rol32(AES_mc_rot[st->b[swap_b ^ 0xD]], 8) ^
99304e1f30eSRichard Henderson          rol32(AES_mc_rot[st->b[swap_b ^ 0xE]], 16) ^
99404e1f30eSRichard Henderson          rol32(AES_mc_rot[st->b[swap_b ^ 0xF]], 24));
99504e1f30eSRichard Henderson     if (be) {
99604e1f30eSRichard Henderson         t = bswap32(t);
99704e1f30eSRichard Henderson     }
99804e1f30eSRichard Henderson     r->w[swap_w ^ 3] = t;
99904e1f30eSRichard Henderson }
100004e1f30eSRichard Henderson 
aesenc_MC_gen(AESState * r,const AESState * st)100104e1f30eSRichard Henderson void aesenc_MC_gen(AESState *r, const AESState *st)
100204e1f30eSRichard Henderson {
100304e1f30eSRichard Henderson     aesenc_MC_swap(r, st, false);
100404e1f30eSRichard Henderson }
100504e1f30eSRichard Henderson 
aesenc_MC_genrev(AESState * r,const AESState * st)100604e1f30eSRichard Henderson void aesenc_MC_genrev(AESState *r, const AESState *st)
100704e1f30eSRichard Henderson {
100804e1f30eSRichard Henderson     aesenc_MC_swap(r, st, true);
100904e1f30eSRichard Henderson }
101004e1f30eSRichard Henderson 
101104e1f30eSRichard Henderson /*
10126b0a96ceSRichard Henderson  * Perform SubBytes + ShiftRows + AddRoundKey.
10136b0a96ceSRichard Henderson  */
10146b0a96ceSRichard Henderson static inline void
aesenc_SB_SR_AK_swap(AESState * ret,const AESState * st,const AESState * rk,bool swap)10156b0a96ceSRichard Henderson aesenc_SB_SR_AK_swap(AESState *ret, const AESState *st,
10166b0a96ceSRichard Henderson                      const AESState *rk, bool swap)
10176b0a96ceSRichard Henderson {
10186b0a96ceSRichard Henderson     const int swap_b = swap ? 15 : 0;
10196b0a96ceSRichard Henderson     AESState t;
10206b0a96ceSRichard Henderson 
10216b0a96ceSRichard Henderson     t.b[swap_b ^ 0x0] = AES_sbox[st->b[swap_b ^ AES_SH(0x0)]];
10226b0a96ceSRichard Henderson     t.b[swap_b ^ 0x1] = AES_sbox[st->b[swap_b ^ AES_SH(0x1)]];
10236b0a96ceSRichard Henderson     t.b[swap_b ^ 0x2] = AES_sbox[st->b[swap_b ^ AES_SH(0x2)]];
10246b0a96ceSRichard Henderson     t.b[swap_b ^ 0x3] = AES_sbox[st->b[swap_b ^ AES_SH(0x3)]];
10256b0a96ceSRichard Henderson     t.b[swap_b ^ 0x4] = AES_sbox[st->b[swap_b ^ AES_SH(0x4)]];
10266b0a96ceSRichard Henderson     t.b[swap_b ^ 0x5] = AES_sbox[st->b[swap_b ^ AES_SH(0x5)]];
10276b0a96ceSRichard Henderson     t.b[swap_b ^ 0x6] = AES_sbox[st->b[swap_b ^ AES_SH(0x6)]];
10286b0a96ceSRichard Henderson     t.b[swap_b ^ 0x7] = AES_sbox[st->b[swap_b ^ AES_SH(0x7)]];
10296b0a96ceSRichard Henderson     t.b[swap_b ^ 0x8] = AES_sbox[st->b[swap_b ^ AES_SH(0x8)]];
10306b0a96ceSRichard Henderson     t.b[swap_b ^ 0x9] = AES_sbox[st->b[swap_b ^ AES_SH(0x9)]];
10316b0a96ceSRichard Henderson     t.b[swap_b ^ 0xa] = AES_sbox[st->b[swap_b ^ AES_SH(0xA)]];
10326b0a96ceSRichard Henderson     t.b[swap_b ^ 0xb] = AES_sbox[st->b[swap_b ^ AES_SH(0xB)]];
10336b0a96ceSRichard Henderson     t.b[swap_b ^ 0xc] = AES_sbox[st->b[swap_b ^ AES_SH(0xC)]];
10346b0a96ceSRichard Henderson     t.b[swap_b ^ 0xd] = AES_sbox[st->b[swap_b ^ AES_SH(0xD)]];
10356b0a96ceSRichard Henderson     t.b[swap_b ^ 0xe] = AES_sbox[st->b[swap_b ^ AES_SH(0xE)]];
10366b0a96ceSRichard Henderson     t.b[swap_b ^ 0xf] = AES_sbox[st->b[swap_b ^ AES_SH(0xF)]];
10376b0a96ceSRichard Henderson 
10386b0a96ceSRichard Henderson     /*
10396b0a96ceSRichard Henderson      * Perform the AddRoundKey with generic vectors.
10406b0a96ceSRichard Henderson      * This may be expanded to either host integer or host vector code.
10416b0a96ceSRichard Henderson      * The key and output endianness match, so no bswap required.
10426b0a96ceSRichard Henderson      */
10436b0a96ceSRichard Henderson     ret->v = t.v ^ rk->v;
10446b0a96ceSRichard Henderson }
10456b0a96ceSRichard Henderson 
aesenc_SB_SR_AK_gen(AESState * r,const AESState * s,const AESState * k)10466b0a96ceSRichard Henderson void aesenc_SB_SR_AK_gen(AESState *r, const AESState *s, const AESState *k)
10476b0a96ceSRichard Henderson {
10486b0a96ceSRichard Henderson     aesenc_SB_SR_AK_swap(r, s, k, false);
10496b0a96ceSRichard Henderson }
10506b0a96ceSRichard Henderson 
aesenc_SB_SR_AK_genrev(AESState * r,const AESState * s,const AESState * k)10516b0a96ceSRichard Henderson void aesenc_SB_SR_AK_genrev(AESState *r, const AESState *s, const AESState *k)
10526b0a96ceSRichard Henderson {
10536b0a96ceSRichard Henderson     aesenc_SB_SR_AK_swap(r, s, k, true);
10546b0a96ceSRichard Henderson }
10556b0a96ceSRichard Henderson 
1056192fa849SRichard Henderson /*
10577c58cb97SRichard Henderson  * Perform SubBytes + ShiftRows + MixColumns + AddRoundKey.
10587c58cb97SRichard Henderson  */
10597c58cb97SRichard Henderson static inline void
aesenc_SB_SR_MC_AK_swap(AESState * r,const AESState * st,const AESState * rk,bool swap)10607c58cb97SRichard Henderson aesenc_SB_SR_MC_AK_swap(AESState *r, const AESState *st,
10617c58cb97SRichard Henderson                         const AESState *rk, bool swap)
10627c58cb97SRichard Henderson {
10637c58cb97SRichard Henderson     int swap_b = swap * 0xf;
10647c58cb97SRichard Henderson     int swap_w = swap * 0x3;
10657c58cb97SRichard Henderson     bool be = HOST_BIG_ENDIAN ^ swap;
10667c58cb97SRichard Henderson     uint32_t w0, w1, w2, w3;
10677c58cb97SRichard Henderson 
10687c58cb97SRichard Henderson     w0 = (AES_Te0[st->b[swap_b ^ AES_SH(0x0)]] ^
10697c58cb97SRichard Henderson           AES_Te1[st->b[swap_b ^ AES_SH(0x1)]] ^
10707c58cb97SRichard Henderson           AES_Te2[st->b[swap_b ^ AES_SH(0x2)]] ^
10717c58cb97SRichard Henderson           AES_Te3[st->b[swap_b ^ AES_SH(0x3)]]);
10727c58cb97SRichard Henderson 
10737c58cb97SRichard Henderson     w1 = (AES_Te0[st->b[swap_b ^ AES_SH(0x4)]] ^
10747c58cb97SRichard Henderson           AES_Te1[st->b[swap_b ^ AES_SH(0x5)]] ^
10757c58cb97SRichard Henderson           AES_Te2[st->b[swap_b ^ AES_SH(0x6)]] ^
10767c58cb97SRichard Henderson           AES_Te3[st->b[swap_b ^ AES_SH(0x7)]]);
10777c58cb97SRichard Henderson 
10787c58cb97SRichard Henderson     w2 = (AES_Te0[st->b[swap_b ^ AES_SH(0x8)]] ^
10797c58cb97SRichard Henderson           AES_Te1[st->b[swap_b ^ AES_SH(0x9)]] ^
10807c58cb97SRichard Henderson           AES_Te2[st->b[swap_b ^ AES_SH(0xA)]] ^
10817c58cb97SRichard Henderson           AES_Te3[st->b[swap_b ^ AES_SH(0xB)]]);
10827c58cb97SRichard Henderson 
10837c58cb97SRichard Henderson     w3 = (AES_Te0[st->b[swap_b ^ AES_SH(0xC)]] ^
10847c58cb97SRichard Henderson           AES_Te1[st->b[swap_b ^ AES_SH(0xD)]] ^
10857c58cb97SRichard Henderson           AES_Te2[st->b[swap_b ^ AES_SH(0xE)]] ^
10867c58cb97SRichard Henderson           AES_Te3[st->b[swap_b ^ AES_SH(0xF)]]);
10877c58cb97SRichard Henderson 
10887c58cb97SRichard Henderson     /* Note that AES_TeX is encoded for big-endian. */
10897c58cb97SRichard Henderson     if (!be) {
10907c58cb97SRichard Henderson         w0 = bswap32(w0);
10917c58cb97SRichard Henderson         w1 = bswap32(w1);
10927c58cb97SRichard Henderson         w2 = bswap32(w2);
10937c58cb97SRichard Henderson         w3 = bswap32(w3);
10947c58cb97SRichard Henderson     }
10957c58cb97SRichard Henderson 
10967c58cb97SRichard Henderson     r->w[swap_w ^ 0] = rk->w[swap_w ^ 0] ^ w0;
10977c58cb97SRichard Henderson     r->w[swap_w ^ 1] = rk->w[swap_w ^ 1] ^ w1;
10987c58cb97SRichard Henderson     r->w[swap_w ^ 2] = rk->w[swap_w ^ 2] ^ w2;
10997c58cb97SRichard Henderson     r->w[swap_w ^ 3] = rk->w[swap_w ^ 3] ^ w3;
11007c58cb97SRichard Henderson }
11017c58cb97SRichard Henderson 
aesenc_SB_SR_MC_AK_gen(AESState * r,const AESState * st,const AESState * rk)11027c58cb97SRichard Henderson void aesenc_SB_SR_MC_AK_gen(AESState *r, const AESState *st,
11037c58cb97SRichard Henderson                             const AESState *rk)
11047c58cb97SRichard Henderson {
11057c58cb97SRichard Henderson     aesenc_SB_SR_MC_AK_swap(r, st, rk, false);
11067c58cb97SRichard Henderson }
11077c58cb97SRichard Henderson 
aesenc_SB_SR_MC_AK_genrev(AESState * r,const AESState * st,const AESState * rk)11087c58cb97SRichard Henderson void aesenc_SB_SR_MC_AK_genrev(AESState *r, const AESState *st,
11097c58cb97SRichard Henderson                                const AESState *rk)
11107c58cb97SRichard Henderson {
11117c58cb97SRichard Henderson     aesenc_SB_SR_MC_AK_swap(r, st, rk, true);
11127c58cb97SRichard Henderson }
11137c58cb97SRichard Henderson 
11147c58cb97SRichard Henderson /*
11155b41deb3SRichard Henderson  * Perform InvMixColumns.
11165b41deb3SRichard Henderson  */
11175b41deb3SRichard Henderson static inline void
aesdec_IMC_swap(AESState * r,const AESState * st,bool swap)11185b41deb3SRichard Henderson aesdec_IMC_swap(AESState *r, const AESState *st, bool swap)
11195b41deb3SRichard Henderson {
11205b41deb3SRichard Henderson     int swap_b = swap * 0xf;
11215b41deb3SRichard Henderson     int swap_w = swap * 0x3;
11225b41deb3SRichard Henderson     bool be = HOST_BIG_ENDIAN ^ swap;
11235b41deb3SRichard Henderson     uint32_t t;
11245b41deb3SRichard Henderson 
1125c10c559bSRichard Henderson     /* Note that AES_imc_rot is encoded for little-endian. */
1126c10c559bSRichard Henderson     t = (      AES_imc_rot[st->b[swap_b ^ 0x0]] ^
1127c10c559bSRichard Henderson          rol32(AES_imc_rot[st->b[swap_b ^ 0x1]], 8) ^
1128c10c559bSRichard Henderson          rol32(AES_imc_rot[st->b[swap_b ^ 0x2]], 16) ^
1129c10c559bSRichard Henderson          rol32(AES_imc_rot[st->b[swap_b ^ 0x3]], 24));
1130c10c559bSRichard Henderson     if (be) {
11315b41deb3SRichard Henderson         t = bswap32(t);
11325b41deb3SRichard Henderson     }
11335b41deb3SRichard Henderson     r->w[swap_w ^ 0] = t;
11345b41deb3SRichard Henderson 
1135c10c559bSRichard Henderson     t = (      AES_imc_rot[st->b[swap_b ^ 0x4]] ^
1136c10c559bSRichard Henderson          rol32(AES_imc_rot[st->b[swap_b ^ 0x5]], 8) ^
1137c10c559bSRichard Henderson          rol32(AES_imc_rot[st->b[swap_b ^ 0x6]], 16) ^
1138c10c559bSRichard Henderson          rol32(AES_imc_rot[st->b[swap_b ^ 0x7]], 24));
1139c10c559bSRichard Henderson     if (be) {
11405b41deb3SRichard Henderson         t = bswap32(t);
11415b41deb3SRichard Henderson     }
11425b41deb3SRichard Henderson     r->w[swap_w ^ 1] = t;
11435b41deb3SRichard Henderson 
1144c10c559bSRichard Henderson     t = (      AES_imc_rot[st->b[swap_b ^ 0x8]] ^
1145c10c559bSRichard Henderson          rol32(AES_imc_rot[st->b[swap_b ^ 0x9]], 8) ^
1146c10c559bSRichard Henderson          rol32(AES_imc_rot[st->b[swap_b ^ 0xA]], 16) ^
1147c10c559bSRichard Henderson          rol32(AES_imc_rot[st->b[swap_b ^ 0xB]], 24));
1148c10c559bSRichard Henderson     if (be) {
11495b41deb3SRichard Henderson         t = bswap32(t);
11505b41deb3SRichard Henderson     }
11515b41deb3SRichard Henderson     r->w[swap_w ^ 2] = t;
11525b41deb3SRichard Henderson 
1153c10c559bSRichard Henderson     t = (      AES_imc_rot[st->b[swap_b ^ 0xC]] ^
1154c10c559bSRichard Henderson          rol32(AES_imc_rot[st->b[swap_b ^ 0xD]], 8) ^
1155c10c559bSRichard Henderson          rol32(AES_imc_rot[st->b[swap_b ^ 0xE]], 16) ^
1156c10c559bSRichard Henderson          rol32(AES_imc_rot[st->b[swap_b ^ 0xF]], 24));
1157c10c559bSRichard Henderson     if (be) {
11585b41deb3SRichard Henderson         t = bswap32(t);
11595b41deb3SRichard Henderson     }
11605b41deb3SRichard Henderson     r->w[swap_w ^ 3] = t;
11615b41deb3SRichard Henderson }
11625b41deb3SRichard Henderson 
aesdec_IMC_gen(AESState * r,const AESState * st)11635b41deb3SRichard Henderson void aesdec_IMC_gen(AESState *r, const AESState *st)
11645b41deb3SRichard Henderson {
11655b41deb3SRichard Henderson     aesdec_IMC_swap(r, st, false);
11665b41deb3SRichard Henderson }
11675b41deb3SRichard Henderson 
aesdec_IMC_genrev(AESState * r,const AESState * st)11685b41deb3SRichard Henderson void aesdec_IMC_genrev(AESState *r, const AESState *st)
11695b41deb3SRichard Henderson {
11705b41deb3SRichard Henderson     aesdec_IMC_swap(r, st, true);
11715b41deb3SRichard Henderson }
11725b41deb3SRichard Henderson 
11735b41deb3SRichard Henderson /*
1174192fa849SRichard Henderson  * Perform InvSubBytes + InvShiftRows + AddRoundKey.
1175192fa849SRichard Henderson  */
1176192fa849SRichard Henderson static inline void
aesdec_ISB_ISR_AK_swap(AESState * ret,const AESState * st,const AESState * rk,bool swap)1177192fa849SRichard Henderson aesdec_ISB_ISR_AK_swap(AESState *ret, const AESState *st,
1178192fa849SRichard Henderson                        const AESState *rk, bool swap)
1179192fa849SRichard Henderson {
1180192fa849SRichard Henderson     const int swap_b = swap ? 15 : 0;
1181192fa849SRichard Henderson     AESState t;
1182192fa849SRichard Henderson 
1183192fa849SRichard Henderson     t.b[swap_b ^ 0x0] = AES_isbox[st->b[swap_b ^ AES_ISH(0x0)]];
1184192fa849SRichard Henderson     t.b[swap_b ^ 0x1] = AES_isbox[st->b[swap_b ^ AES_ISH(0x1)]];
1185192fa849SRichard Henderson     t.b[swap_b ^ 0x2] = AES_isbox[st->b[swap_b ^ AES_ISH(0x2)]];
1186192fa849SRichard Henderson     t.b[swap_b ^ 0x3] = AES_isbox[st->b[swap_b ^ AES_ISH(0x3)]];
1187192fa849SRichard Henderson     t.b[swap_b ^ 0x4] = AES_isbox[st->b[swap_b ^ AES_ISH(0x4)]];
1188192fa849SRichard Henderson     t.b[swap_b ^ 0x5] = AES_isbox[st->b[swap_b ^ AES_ISH(0x5)]];
1189192fa849SRichard Henderson     t.b[swap_b ^ 0x6] = AES_isbox[st->b[swap_b ^ AES_ISH(0x6)]];
1190192fa849SRichard Henderson     t.b[swap_b ^ 0x7] = AES_isbox[st->b[swap_b ^ AES_ISH(0x7)]];
1191192fa849SRichard Henderson     t.b[swap_b ^ 0x8] = AES_isbox[st->b[swap_b ^ AES_ISH(0x8)]];
1192192fa849SRichard Henderson     t.b[swap_b ^ 0x9] = AES_isbox[st->b[swap_b ^ AES_ISH(0x9)]];
1193192fa849SRichard Henderson     t.b[swap_b ^ 0xa] = AES_isbox[st->b[swap_b ^ AES_ISH(0xA)]];
1194192fa849SRichard Henderson     t.b[swap_b ^ 0xb] = AES_isbox[st->b[swap_b ^ AES_ISH(0xB)]];
1195192fa849SRichard Henderson     t.b[swap_b ^ 0xc] = AES_isbox[st->b[swap_b ^ AES_ISH(0xC)]];
1196192fa849SRichard Henderson     t.b[swap_b ^ 0xd] = AES_isbox[st->b[swap_b ^ AES_ISH(0xD)]];
1197192fa849SRichard Henderson     t.b[swap_b ^ 0xe] = AES_isbox[st->b[swap_b ^ AES_ISH(0xE)]];
1198192fa849SRichard Henderson     t.b[swap_b ^ 0xf] = AES_isbox[st->b[swap_b ^ AES_ISH(0xF)]];
1199192fa849SRichard Henderson 
1200192fa849SRichard Henderson     /*
1201192fa849SRichard Henderson      * Perform the AddRoundKey with generic vectors.
1202192fa849SRichard Henderson      * This may be expanded to either host integer or host vector code.
1203192fa849SRichard Henderson      * The key and output endianness match, so no bswap required.
1204192fa849SRichard Henderson      */
1205192fa849SRichard Henderson     ret->v = t.v ^ rk->v;
1206192fa849SRichard Henderson }
1207192fa849SRichard Henderson 
aesdec_ISB_ISR_AK_gen(AESState * r,const AESState * s,const AESState * k)1208192fa849SRichard Henderson void aesdec_ISB_ISR_AK_gen(AESState *r, const AESState *s, const AESState *k)
1209192fa849SRichard Henderson {
1210192fa849SRichard Henderson     aesdec_ISB_ISR_AK_swap(r, s, k, false);
1211192fa849SRichard Henderson }
1212192fa849SRichard Henderson 
aesdec_ISB_ISR_AK_genrev(AESState * r,const AESState * s,const AESState * k)1213192fa849SRichard Henderson void aesdec_ISB_ISR_AK_genrev(AESState *r, const AESState *s, const AESState *k)
1214192fa849SRichard Henderson {
1215192fa849SRichard Henderson     aesdec_ISB_ISR_AK_swap(r, s, k, true);
1216192fa849SRichard Henderson }
1217192fa849SRichard Henderson 
121815ff1598SRichard Henderson /*
121915ff1598SRichard Henderson  * Perform InvSubBytes + InvShiftRows + InvMixColumns + AddRoundKey.
122015ff1598SRichard Henderson  */
122115ff1598SRichard Henderson static inline void
aesdec_ISB_ISR_IMC_AK_swap(AESState * r,const AESState * st,const AESState * rk,bool swap)122215ff1598SRichard Henderson aesdec_ISB_ISR_IMC_AK_swap(AESState *r, const AESState *st,
122315ff1598SRichard Henderson                            const AESState *rk, bool swap)
122415ff1598SRichard Henderson {
122515ff1598SRichard Henderson     int swap_b = swap * 0xf;
122615ff1598SRichard Henderson     int swap_w = swap * 0x3;
122715ff1598SRichard Henderson     bool be = HOST_BIG_ENDIAN ^ swap;
122815ff1598SRichard Henderson     uint32_t w0, w1, w2, w3;
122915ff1598SRichard Henderson 
123015ff1598SRichard Henderson     w0 = (AES_Td0[st->b[swap_b ^ AES_ISH(0x0)]] ^
123115ff1598SRichard Henderson           AES_Td1[st->b[swap_b ^ AES_ISH(0x1)]] ^
123215ff1598SRichard Henderson           AES_Td2[st->b[swap_b ^ AES_ISH(0x2)]] ^
123315ff1598SRichard Henderson           AES_Td3[st->b[swap_b ^ AES_ISH(0x3)]]);
123415ff1598SRichard Henderson 
123515ff1598SRichard Henderson     w1 = (AES_Td0[st->b[swap_b ^ AES_ISH(0x4)]] ^
123615ff1598SRichard Henderson           AES_Td1[st->b[swap_b ^ AES_ISH(0x5)]] ^
123715ff1598SRichard Henderson           AES_Td2[st->b[swap_b ^ AES_ISH(0x6)]] ^
123815ff1598SRichard Henderson           AES_Td3[st->b[swap_b ^ AES_ISH(0x7)]]);
123915ff1598SRichard Henderson 
124015ff1598SRichard Henderson     w2 = (AES_Td0[st->b[swap_b ^ AES_ISH(0x8)]] ^
124115ff1598SRichard Henderson           AES_Td1[st->b[swap_b ^ AES_ISH(0x9)]] ^
124215ff1598SRichard Henderson           AES_Td2[st->b[swap_b ^ AES_ISH(0xA)]] ^
124315ff1598SRichard Henderson           AES_Td3[st->b[swap_b ^ AES_ISH(0xB)]]);
124415ff1598SRichard Henderson 
124515ff1598SRichard Henderson     w3 = (AES_Td0[st->b[swap_b ^ AES_ISH(0xC)]] ^
124615ff1598SRichard Henderson           AES_Td1[st->b[swap_b ^ AES_ISH(0xD)]] ^
124715ff1598SRichard Henderson           AES_Td2[st->b[swap_b ^ AES_ISH(0xE)]] ^
124815ff1598SRichard Henderson           AES_Td3[st->b[swap_b ^ AES_ISH(0xF)]]);
124915ff1598SRichard Henderson 
125015ff1598SRichard Henderson     /* Note that AES_TdX is encoded for big-endian. */
125115ff1598SRichard Henderson     if (!be) {
125215ff1598SRichard Henderson         w0 = bswap32(w0);
125315ff1598SRichard Henderson         w1 = bswap32(w1);
125415ff1598SRichard Henderson         w2 = bswap32(w2);
125515ff1598SRichard Henderson         w3 = bswap32(w3);
125615ff1598SRichard Henderson     }
125715ff1598SRichard Henderson 
125815ff1598SRichard Henderson     r->w[swap_w ^ 0] = rk->w[swap_w ^ 0] ^ w0;
125915ff1598SRichard Henderson     r->w[swap_w ^ 1] = rk->w[swap_w ^ 1] ^ w1;
126015ff1598SRichard Henderson     r->w[swap_w ^ 2] = rk->w[swap_w ^ 2] ^ w2;
126115ff1598SRichard Henderson     r->w[swap_w ^ 3] = rk->w[swap_w ^ 3] ^ w3;
126215ff1598SRichard Henderson }
126315ff1598SRichard Henderson 
aesdec_ISB_ISR_IMC_AK_gen(AESState * r,const AESState * st,const AESState * rk)126415ff1598SRichard Henderson void aesdec_ISB_ISR_IMC_AK_gen(AESState *r, const AESState *st,
126515ff1598SRichard Henderson                                const AESState *rk)
126615ff1598SRichard Henderson {
126715ff1598SRichard Henderson     aesdec_ISB_ISR_IMC_AK_swap(r, st, rk, false);
126815ff1598SRichard Henderson }
126915ff1598SRichard Henderson 
aesdec_ISB_ISR_IMC_AK_genrev(AESState * r,const AESState * st,const AESState * rk)127015ff1598SRichard Henderson void aesdec_ISB_ISR_IMC_AK_genrev(AESState *r, const AESState *st,
127115ff1598SRichard Henderson                                   const AESState *rk)
127215ff1598SRichard Henderson {
127315ff1598SRichard Henderson     aesdec_ISB_ISR_IMC_AK_swap(r, st, rk, true);
127415ff1598SRichard Henderson }
127515ff1598SRichard Henderson 
aesdec_ISB_ISR_AK_IMC_gen(AESState * ret,const AESState * st,const AESState * rk)127628e91474SRichard Henderson void aesdec_ISB_ISR_AK_IMC_gen(AESState *ret, const AESState *st,
127728e91474SRichard Henderson                                const AESState *rk)
127828e91474SRichard Henderson {
127928e91474SRichard Henderson     aesdec_ISB_ISR_AK_gen(ret, st, rk);
128028e91474SRichard Henderson     aesdec_IMC_gen(ret, ret);
128128e91474SRichard Henderson }
128228e91474SRichard Henderson 
aesdec_ISB_ISR_AK_IMC_genrev(AESState * ret,const AESState * st,const AESState * rk)128328e91474SRichard Henderson void aesdec_ISB_ISR_AK_IMC_genrev(AESState *ret, const AESState *st,
128428e91474SRichard Henderson                                   const AESState *rk)
128528e91474SRichard Henderson {
128628e91474SRichard Henderson     aesdec_ISB_ISR_AK_genrev(ret, st, rk);
128728e91474SRichard Henderson     aesdec_IMC_genrev(ret, ret);
128828e91474SRichard Henderson }
128928e91474SRichard Henderson 
12906f2945cdSDaniel P. Berrange /**
12916f2945cdSDaniel P. Berrange  * Expand the cipher key into the encryption key schedule.
12926f2945cdSDaniel P. Berrange  */
AES_set_encrypt_key(const unsigned char * userKey,const int bits,AES_KEY * key)12936f2945cdSDaniel P. Berrange int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
12946f2945cdSDaniel P. Berrange                         AES_KEY *key) {
12956f2945cdSDaniel P. Berrange 
12966f2945cdSDaniel P. Berrange         u32 *rk;
12976f2945cdSDaniel P. Berrange         int i = 0;
12986f2945cdSDaniel P. Berrange         u32 temp;
12996f2945cdSDaniel P. Berrange 
13006f2945cdSDaniel P. Berrange         if (!userKey || !key)
13016f2945cdSDaniel P. Berrange                 return -1;
13026f2945cdSDaniel P. Berrange         if (bits != 128 && bits != 192 && bits != 256)
13036f2945cdSDaniel P. Berrange                 return -2;
13046f2945cdSDaniel P. Berrange 
13056f2945cdSDaniel P. Berrange         rk = key->rd_key;
13066f2945cdSDaniel P. Berrange 
13076f2945cdSDaniel P. Berrange         if (bits == 128)
13086f2945cdSDaniel P. Berrange                 key->rounds = 10;
13096f2945cdSDaniel P. Berrange         else if (bits == 192)
13106f2945cdSDaniel P. Berrange                 key->rounds = 12;
13116f2945cdSDaniel P. Berrange         else
13126f2945cdSDaniel P. Berrange                 key->rounds = 14;
13136f2945cdSDaniel P. Berrange 
13146f2945cdSDaniel P. Berrange         rk[0] = GETU32(userKey     );
13156f2945cdSDaniel P. Berrange         rk[1] = GETU32(userKey +  4);
13166f2945cdSDaniel P. Berrange         rk[2] = GETU32(userKey +  8);
13176f2945cdSDaniel P. Berrange         rk[3] = GETU32(userKey + 12);
13186f2945cdSDaniel P. Berrange         if (bits == 128) {
13196f2945cdSDaniel P. Berrange                 while (1) {
13206f2945cdSDaniel P. Berrange                         temp  = rk[3];
13216f2945cdSDaniel P. Berrange                         rk[4] = rk[0] ^
13226f2945cdSDaniel P. Berrange                                 (AES_Te4[(temp >> 16) & 0xff] & 0xff000000) ^
13236f2945cdSDaniel P. Berrange                                 (AES_Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
13246f2945cdSDaniel P. Berrange                                 (AES_Te4[(temp      ) & 0xff] & 0x0000ff00) ^
13256f2945cdSDaniel P. Berrange                                 (AES_Te4[(temp >> 24)       ] & 0x000000ff) ^
13266f2945cdSDaniel P. Berrange                                 rcon[i];
13276f2945cdSDaniel P. Berrange                         rk[5] = rk[1] ^ rk[4];
13286f2945cdSDaniel P. Berrange                         rk[6] = rk[2] ^ rk[5];
13296f2945cdSDaniel P. Berrange                         rk[7] = rk[3] ^ rk[6];
13306f2945cdSDaniel P. Berrange                         if (++i == 10) {
13316f2945cdSDaniel P. Berrange                                 return 0;
13326f2945cdSDaniel P. Berrange                         }
13336f2945cdSDaniel P. Berrange                         rk += 4;
13346f2945cdSDaniel P. Berrange                 }
13356f2945cdSDaniel P. Berrange         }
13366f2945cdSDaniel P. Berrange         rk[4] = GETU32(userKey + 16);
13376f2945cdSDaniel P. Berrange         rk[5] = GETU32(userKey + 20);
13386f2945cdSDaniel P. Berrange         if (bits == 192) {
13396f2945cdSDaniel P. Berrange                 while (1) {
13406f2945cdSDaniel P. Berrange                         temp = rk[ 5];
13416f2945cdSDaniel P. Berrange                         rk[ 6] = rk[ 0] ^
13426f2945cdSDaniel P. Berrange                                 (AES_Te4[(temp >> 16) & 0xff] & 0xff000000) ^
13436f2945cdSDaniel P. Berrange                                 (AES_Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
13446f2945cdSDaniel P. Berrange                                 (AES_Te4[(temp      ) & 0xff] & 0x0000ff00) ^
13456f2945cdSDaniel P. Berrange                                 (AES_Te4[(temp >> 24)       ] & 0x000000ff) ^
13466f2945cdSDaniel P. Berrange                                 rcon[i];
13476f2945cdSDaniel P. Berrange                         rk[ 7] = rk[ 1] ^ rk[ 6];
13486f2945cdSDaniel P. Berrange                         rk[ 8] = rk[ 2] ^ rk[ 7];
13496f2945cdSDaniel P. Berrange                         rk[ 9] = rk[ 3] ^ rk[ 8];
13506f2945cdSDaniel P. Berrange                         if (++i == 8) {
13516f2945cdSDaniel P. Berrange                                 return 0;
13526f2945cdSDaniel P. Berrange                         }
13536f2945cdSDaniel P. Berrange                         rk[10] = rk[ 4] ^ rk[ 9];
13546f2945cdSDaniel P. Berrange                         rk[11] = rk[ 5] ^ rk[10];
13556f2945cdSDaniel P. Berrange                         rk += 6;
13566f2945cdSDaniel P. Berrange                 }
13576f2945cdSDaniel P. Berrange         }
13586f2945cdSDaniel P. Berrange         rk[6] = GETU32(userKey + 24);
13596f2945cdSDaniel P. Berrange         rk[7] = GETU32(userKey + 28);
13606f2945cdSDaniel P. Berrange         if (bits == 256) {
13616f2945cdSDaniel P. Berrange                 while (1) {
13626f2945cdSDaniel P. Berrange                         temp = rk[ 7];
13636f2945cdSDaniel P. Berrange                         rk[ 8] = rk[ 0] ^
13646f2945cdSDaniel P. Berrange                                 (AES_Te4[(temp >> 16) & 0xff] & 0xff000000) ^
13656f2945cdSDaniel P. Berrange                                 (AES_Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
13666f2945cdSDaniel P. Berrange                                 (AES_Te4[(temp      ) & 0xff] & 0x0000ff00) ^
13676f2945cdSDaniel P. Berrange                                 (AES_Te4[(temp >> 24)       ] & 0x000000ff) ^
13686f2945cdSDaniel P. Berrange                                 rcon[i];
13696f2945cdSDaniel P. Berrange                         rk[ 9] = rk[ 1] ^ rk[ 8];
13706f2945cdSDaniel P. Berrange                         rk[10] = rk[ 2] ^ rk[ 9];
13716f2945cdSDaniel P. Berrange                         rk[11] = rk[ 3] ^ rk[10];
13726f2945cdSDaniel P. Berrange                         if (++i == 7) {
13736f2945cdSDaniel P. Berrange                                 return 0;
13746f2945cdSDaniel P. Berrange                         }
13756f2945cdSDaniel P. Berrange                         temp = rk[11];
13766f2945cdSDaniel P. Berrange                         rk[12] = rk[ 4] ^
13776f2945cdSDaniel P. Berrange                                 (AES_Te4[(temp >> 24)       ] & 0xff000000) ^
13786f2945cdSDaniel P. Berrange                                 (AES_Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^
13796f2945cdSDaniel P. Berrange                                 (AES_Te4[(temp >>  8) & 0xff] & 0x0000ff00) ^
13806f2945cdSDaniel P. Berrange                                 (AES_Te4[(temp      ) & 0xff] & 0x000000ff);
13816f2945cdSDaniel P. Berrange                         rk[13] = rk[ 5] ^ rk[12];
13826f2945cdSDaniel P. Berrange                         rk[14] = rk[ 6] ^ rk[13];
13836f2945cdSDaniel P. Berrange                         rk[15] = rk[ 7] ^ rk[14];
13846f2945cdSDaniel P. Berrange 
13856f2945cdSDaniel P. Berrange                         rk += 8;
13866f2945cdSDaniel P. Berrange                 }
13876f2945cdSDaniel P. Berrange         }
13886f2945cdSDaniel P. Berrange         abort();
13896f2945cdSDaniel P. Berrange }
13906f2945cdSDaniel P. Berrange 
13916f2945cdSDaniel P. Berrange /**
13926f2945cdSDaniel P. Berrange  * Expand the cipher key into the decryption key schedule.
13936f2945cdSDaniel P. Berrange  */
AES_set_decrypt_key(const unsigned char * userKey,const int bits,AES_KEY * key)13946f2945cdSDaniel P. Berrange int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
13956f2945cdSDaniel P. Berrange                          AES_KEY *key) {
13966f2945cdSDaniel P. Berrange 
13976f2945cdSDaniel P. Berrange         u32 *rk;
13986f2945cdSDaniel P. Berrange         int i, j, status;
13996f2945cdSDaniel P. Berrange         u32 temp;
14006f2945cdSDaniel P. Berrange 
14016f2945cdSDaniel P. Berrange         /* first, start with an encryption schedule */
14026f2945cdSDaniel P. Berrange         status = AES_set_encrypt_key(userKey, bits, key);
14036f2945cdSDaniel P. Berrange         if (status < 0)
14046f2945cdSDaniel P. Berrange                 return status;
14056f2945cdSDaniel P. Berrange 
14066f2945cdSDaniel P. Berrange         rk = key->rd_key;
14076f2945cdSDaniel P. Berrange 
14086f2945cdSDaniel P. Berrange         /* invert the order of the round keys: */
14096f2945cdSDaniel P. Berrange         for (i = 0, j = 4 * (key->rounds); i < j; i += 4, j -= 4) {
14106f2945cdSDaniel P. Berrange                 temp = rk[i    ]; rk[i    ] = rk[j    ]; rk[j    ] = temp;
14116f2945cdSDaniel P. Berrange                 temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
14126f2945cdSDaniel P. Berrange                 temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
14136f2945cdSDaniel P. Berrange                 temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
14146f2945cdSDaniel P. Berrange         }
14156f2945cdSDaniel P. Berrange         /* apply the inverse MixColumn transform to all round keys but the first and the last: */
14166f2945cdSDaniel P. Berrange         for (i = 1; i < (key->rounds); i++) {
14176f2945cdSDaniel P. Berrange                 rk += 4;
14186f2945cdSDaniel P. Berrange                 rk[0] =
14196f2945cdSDaniel P. Berrange                         AES_Td0[AES_Te4[(rk[0] >> 24)       ] & 0xff] ^
14206f2945cdSDaniel P. Berrange                         AES_Td1[AES_Te4[(rk[0] >> 16) & 0xff] & 0xff] ^
14216f2945cdSDaniel P. Berrange                         AES_Td2[AES_Te4[(rk[0] >>  8) & 0xff] & 0xff] ^
14226f2945cdSDaniel P. Berrange                         AES_Td3[AES_Te4[(rk[0]      ) & 0xff] & 0xff];
14236f2945cdSDaniel P. Berrange                 rk[1] =
14246f2945cdSDaniel P. Berrange                         AES_Td0[AES_Te4[(rk[1] >> 24)       ] & 0xff] ^
14256f2945cdSDaniel P. Berrange                         AES_Td1[AES_Te4[(rk[1] >> 16) & 0xff] & 0xff] ^
14266f2945cdSDaniel P. Berrange                         AES_Td2[AES_Te4[(rk[1] >>  8) & 0xff] & 0xff] ^
14276f2945cdSDaniel P. Berrange                         AES_Td3[AES_Te4[(rk[1]      ) & 0xff] & 0xff];
14286f2945cdSDaniel P. Berrange                 rk[2] =
14296f2945cdSDaniel P. Berrange                         AES_Td0[AES_Te4[(rk[2] >> 24)       ] & 0xff] ^
14306f2945cdSDaniel P. Berrange                         AES_Td1[AES_Te4[(rk[2] >> 16) & 0xff] & 0xff] ^
14316f2945cdSDaniel P. Berrange                         AES_Td2[AES_Te4[(rk[2] >>  8) & 0xff] & 0xff] ^
14326f2945cdSDaniel P. Berrange                         AES_Td3[AES_Te4[(rk[2]      ) & 0xff] & 0xff];
14336f2945cdSDaniel P. Berrange                 rk[3] =
14346f2945cdSDaniel P. Berrange                         AES_Td0[AES_Te4[(rk[3] >> 24)       ] & 0xff] ^
14356f2945cdSDaniel P. Berrange                         AES_Td1[AES_Te4[(rk[3] >> 16) & 0xff] & 0xff] ^
14366f2945cdSDaniel P. Berrange                         AES_Td2[AES_Te4[(rk[3] >>  8) & 0xff] & 0xff] ^
14376f2945cdSDaniel P. Berrange                         AES_Td3[AES_Te4[(rk[3]      ) & 0xff] & 0xff];
14386f2945cdSDaniel P. Berrange         }
14396f2945cdSDaniel P. Berrange         return 0;
14406f2945cdSDaniel P. Berrange }
14416f2945cdSDaniel P. Berrange 
14426f2945cdSDaniel P. Berrange #ifndef AES_ASM
14436f2945cdSDaniel P. Berrange /*
14446f2945cdSDaniel P. Berrange  * Encrypt a single block
14456f2945cdSDaniel P. Berrange  * in and out can overlap
14466f2945cdSDaniel P. Berrange  */
AES_encrypt(const unsigned char * in,unsigned char * out,const AES_KEY * key)14476f2945cdSDaniel P. Berrange void AES_encrypt(const unsigned char *in, unsigned char *out,
14486f2945cdSDaniel P. Berrange                  const AES_KEY *key) {
14496f2945cdSDaniel P. Berrange 
14506f2945cdSDaniel P. Berrange         const u32 *rk;
14516f2945cdSDaniel P. Berrange         u32 s0, s1, s2, s3, t0, t1, t2, t3;
14526f2945cdSDaniel P. Berrange #ifndef FULL_UNROLL
14536f2945cdSDaniel P. Berrange         int r;
14546f2945cdSDaniel P. Berrange #endif /* ?FULL_UNROLL */
14556f2945cdSDaniel P. Berrange 
14566f2945cdSDaniel P. Berrange         assert(in && out && key);
14576f2945cdSDaniel P. Berrange         rk = key->rd_key;
14586f2945cdSDaniel P. Berrange 
14596f2945cdSDaniel P. Berrange         /*
14606f2945cdSDaniel P. Berrange          * map byte array block to cipher state
14616f2945cdSDaniel P. Berrange          * and add initial round key:
14626f2945cdSDaniel P. Berrange          */
14636f2945cdSDaniel P. Berrange         s0 = GETU32(in     ) ^ rk[0];
14646f2945cdSDaniel P. Berrange         s1 = GETU32(in +  4) ^ rk[1];
14656f2945cdSDaniel P. Berrange         s2 = GETU32(in +  8) ^ rk[2];
14666f2945cdSDaniel P. Berrange         s3 = GETU32(in + 12) ^ rk[3];
14676f2945cdSDaniel P. Berrange #ifdef FULL_UNROLL
14686f2945cdSDaniel P. Berrange         /* round 1: */
14696f2945cdSDaniel P. Berrange         t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >>  8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[ 4];
14706f2945cdSDaniel P. Berrange         t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >>  8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[ 5];
14716f2945cdSDaniel P. Berrange         t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >>  8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[ 6];
14726f2945cdSDaniel P. Berrange         t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >>  8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[ 7];
14736f2945cdSDaniel P. Berrange         /* round 2: */
14746f2945cdSDaniel P. Berrange         s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >>  8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[ 8];
14756f2945cdSDaniel P. Berrange         s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >>  8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[ 9];
14766f2945cdSDaniel P. Berrange         s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >>  8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[10];
14776f2945cdSDaniel P. Berrange         s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >>  8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[11];
14786f2945cdSDaniel P. Berrange         /* round 3: */
14796f2945cdSDaniel P. Berrange         t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >>  8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[12];
14806f2945cdSDaniel P. Berrange         t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >>  8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[13];
14816f2945cdSDaniel P. Berrange         t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >>  8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[14];
14826f2945cdSDaniel P. Berrange         t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >>  8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[15];
14836f2945cdSDaniel P. Berrange         /* round 4: */
14846f2945cdSDaniel P. Berrange         s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >>  8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[16];
14856f2945cdSDaniel P. Berrange         s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >>  8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[17];
14866f2945cdSDaniel P. Berrange         s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >>  8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[18];
14876f2945cdSDaniel P. Berrange         s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >>  8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[19];
14886f2945cdSDaniel P. Berrange         /* round 5: */
14896f2945cdSDaniel P. Berrange         t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >>  8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[20];
14906f2945cdSDaniel P. Berrange         t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >>  8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[21];
14916f2945cdSDaniel P. Berrange         t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >>  8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[22];
14926f2945cdSDaniel P. Berrange         t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >>  8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[23];
14936f2945cdSDaniel P. Berrange         /* round 6: */
14946f2945cdSDaniel P. Berrange         s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >>  8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[24];
14956f2945cdSDaniel P. Berrange         s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >>  8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[25];
14966f2945cdSDaniel P. Berrange         s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >>  8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[26];
14976f2945cdSDaniel P. Berrange         s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >>  8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[27];
14986f2945cdSDaniel P. Berrange         /* round 7: */
14996f2945cdSDaniel P. Berrange         t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >>  8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[28];
15006f2945cdSDaniel P. Berrange         t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >>  8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[29];
15016f2945cdSDaniel P. Berrange         t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >>  8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[30];
15026f2945cdSDaniel P. Berrange         t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >>  8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[31];
15036f2945cdSDaniel P. Berrange         /* round 8: */
15046f2945cdSDaniel P. Berrange         s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >>  8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[32];
15056f2945cdSDaniel P. Berrange         s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >>  8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[33];
15066f2945cdSDaniel P. Berrange         s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >>  8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[34];
15076f2945cdSDaniel P. Berrange         s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >>  8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[35];
15086f2945cdSDaniel P. Berrange         /* round 9: */
15096f2945cdSDaniel P. Berrange         t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >>  8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[36];
15106f2945cdSDaniel P. Berrange         t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >>  8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[37];
15116f2945cdSDaniel P. Berrange         t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >>  8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[38];
15126f2945cdSDaniel P. Berrange         t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >>  8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[39];
15136f2945cdSDaniel P. Berrange     if (key->rounds > 10) {
15146f2945cdSDaniel P. Berrange         /* round 10: */
15156f2945cdSDaniel P. Berrange         s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >>  8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[40];
15166f2945cdSDaniel P. Berrange         s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >>  8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[41];
15176f2945cdSDaniel P. Berrange         s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >>  8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[42];
15186f2945cdSDaniel P. Berrange         s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >>  8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[43];
15196f2945cdSDaniel P. Berrange         /* round 11: */
15206f2945cdSDaniel P. Berrange         t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >>  8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[44];
15216f2945cdSDaniel P. Berrange         t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >>  8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[45];
15226f2945cdSDaniel P. Berrange         t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >>  8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[46];
15236f2945cdSDaniel P. Berrange         t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >>  8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[47];
15246f2945cdSDaniel P. Berrange         if (key->rounds > 12) {
15256f2945cdSDaniel P. Berrange             /* round 12: */
15266f2945cdSDaniel P. Berrange             s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >>  8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[48];
15276f2945cdSDaniel P. Berrange             s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >>  8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[49];
15286f2945cdSDaniel P. Berrange             s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >>  8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[50];
15296f2945cdSDaniel P. Berrange             s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >>  8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[51];
15306f2945cdSDaniel P. Berrange             /* round 13: */
15316f2945cdSDaniel P. Berrange             t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >>  8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[52];
15326f2945cdSDaniel P. Berrange             t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >>  8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[53];
15336f2945cdSDaniel P. Berrange             t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >>  8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[54];
15346f2945cdSDaniel P. Berrange             t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >>  8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[55];
15356f2945cdSDaniel P. Berrange         }
15366f2945cdSDaniel P. Berrange     }
15376f2945cdSDaniel P. Berrange     rk += key->rounds << 2;
15386f2945cdSDaniel P. Berrange #else  /* !FULL_UNROLL */
15396f2945cdSDaniel P. Berrange     /*
15406f2945cdSDaniel P. Berrange      * Nr - 1 full rounds:
15416f2945cdSDaniel P. Berrange      */
15426f2945cdSDaniel P. Berrange     r = key->rounds >> 1;
15436f2945cdSDaniel P. Berrange     for (;;) {
15446f2945cdSDaniel P. Berrange         t0 =
15456f2945cdSDaniel P. Berrange             AES_Te0[(s0 >> 24)       ] ^
15466f2945cdSDaniel P. Berrange             AES_Te1[(s1 >> 16) & 0xff] ^
15476f2945cdSDaniel P. Berrange             AES_Te2[(s2 >>  8) & 0xff] ^
15486f2945cdSDaniel P. Berrange             AES_Te3[(s3      ) & 0xff] ^
15496f2945cdSDaniel P. Berrange             rk[4];
15506f2945cdSDaniel P. Berrange         t1 =
15516f2945cdSDaniel P. Berrange             AES_Te0[(s1 >> 24)       ] ^
15526f2945cdSDaniel P. Berrange             AES_Te1[(s2 >> 16) & 0xff] ^
15536f2945cdSDaniel P. Berrange             AES_Te2[(s3 >>  8) & 0xff] ^
15546f2945cdSDaniel P. Berrange             AES_Te3[(s0      ) & 0xff] ^
15556f2945cdSDaniel P. Berrange             rk[5];
15566f2945cdSDaniel P. Berrange         t2 =
15576f2945cdSDaniel P. Berrange             AES_Te0[(s2 >> 24)       ] ^
15586f2945cdSDaniel P. Berrange             AES_Te1[(s3 >> 16) & 0xff] ^
15596f2945cdSDaniel P. Berrange             AES_Te2[(s0 >>  8) & 0xff] ^
15606f2945cdSDaniel P. Berrange             AES_Te3[(s1      ) & 0xff] ^
15616f2945cdSDaniel P. Berrange             rk[6];
15626f2945cdSDaniel P. Berrange         t3 =
15636f2945cdSDaniel P. Berrange             AES_Te0[(s3 >> 24)       ] ^
15646f2945cdSDaniel P. Berrange             AES_Te1[(s0 >> 16) & 0xff] ^
15656f2945cdSDaniel P. Berrange             AES_Te2[(s1 >>  8) & 0xff] ^
15666f2945cdSDaniel P. Berrange             AES_Te3[(s2      ) & 0xff] ^
15676f2945cdSDaniel P. Berrange             rk[7];
15686f2945cdSDaniel P. Berrange 
15696f2945cdSDaniel P. Berrange         rk += 8;
15706f2945cdSDaniel P. Berrange         if (--r == 0) {
15716f2945cdSDaniel P. Berrange             break;
15726f2945cdSDaniel P. Berrange         }
15736f2945cdSDaniel P. Berrange 
15746f2945cdSDaniel P. Berrange         s0 =
15756f2945cdSDaniel P. Berrange             AES_Te0[(t0 >> 24)       ] ^
15766f2945cdSDaniel P. Berrange             AES_Te1[(t1 >> 16) & 0xff] ^
15776f2945cdSDaniel P. Berrange             AES_Te2[(t2 >>  8) & 0xff] ^
15786f2945cdSDaniel P. Berrange             AES_Te3[(t3      ) & 0xff] ^
15796f2945cdSDaniel P. Berrange             rk[0];
15806f2945cdSDaniel P. Berrange         s1 =
15816f2945cdSDaniel P. Berrange             AES_Te0[(t1 >> 24)       ] ^
15826f2945cdSDaniel P. Berrange             AES_Te1[(t2 >> 16) & 0xff] ^
15836f2945cdSDaniel P. Berrange             AES_Te2[(t3 >>  8) & 0xff] ^
15846f2945cdSDaniel P. Berrange             AES_Te3[(t0      ) & 0xff] ^
15856f2945cdSDaniel P. Berrange             rk[1];
15866f2945cdSDaniel P. Berrange         s2 =
15876f2945cdSDaniel P. Berrange             AES_Te0[(t2 >> 24)       ] ^
15886f2945cdSDaniel P. Berrange             AES_Te1[(t3 >> 16) & 0xff] ^
15896f2945cdSDaniel P. Berrange             AES_Te2[(t0 >>  8) & 0xff] ^
15906f2945cdSDaniel P. Berrange             AES_Te3[(t1      ) & 0xff] ^
15916f2945cdSDaniel P. Berrange             rk[2];
15926f2945cdSDaniel P. Berrange         s3 =
15936f2945cdSDaniel P. Berrange             AES_Te0[(t3 >> 24)       ] ^
15946f2945cdSDaniel P. Berrange             AES_Te1[(t0 >> 16) & 0xff] ^
15956f2945cdSDaniel P. Berrange             AES_Te2[(t1 >>  8) & 0xff] ^
15966f2945cdSDaniel P. Berrange             AES_Te3[(t2      ) & 0xff] ^
15976f2945cdSDaniel P. Berrange             rk[3];
15986f2945cdSDaniel P. Berrange     }
15996f2945cdSDaniel P. Berrange #endif /* ?FULL_UNROLL */
16006f2945cdSDaniel P. Berrange     /*
16016f2945cdSDaniel P. Berrange          * apply last round and
16026f2945cdSDaniel P. Berrange          * map cipher state to byte array block:
16036f2945cdSDaniel P. Berrange          */
16046f2945cdSDaniel P. Berrange         s0 =
16056f2945cdSDaniel P. Berrange                 (AES_Te4[(t0 >> 24)       ] & 0xff000000) ^
16066f2945cdSDaniel P. Berrange                 (AES_Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
16076f2945cdSDaniel P. Berrange                 (AES_Te4[(t2 >>  8) & 0xff] & 0x0000ff00) ^
16086f2945cdSDaniel P. Berrange                 (AES_Te4[(t3      ) & 0xff] & 0x000000ff) ^
16096f2945cdSDaniel P. Berrange                 rk[0];
16106f2945cdSDaniel P. Berrange         PUTU32(out     , s0);
16116f2945cdSDaniel P. Berrange         s1 =
16126f2945cdSDaniel P. Berrange                 (AES_Te4[(t1 >> 24)       ] & 0xff000000) ^
16136f2945cdSDaniel P. Berrange                 (AES_Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
16146f2945cdSDaniel P. Berrange                 (AES_Te4[(t3 >>  8) & 0xff] & 0x0000ff00) ^
16156f2945cdSDaniel P. Berrange                 (AES_Te4[(t0      ) & 0xff] & 0x000000ff) ^
16166f2945cdSDaniel P. Berrange                 rk[1];
16176f2945cdSDaniel P. Berrange         PUTU32(out +  4, s1);
16186f2945cdSDaniel P. Berrange         s2 =
16196f2945cdSDaniel P. Berrange                 (AES_Te4[(t2 >> 24)       ] & 0xff000000) ^
16206f2945cdSDaniel P. Berrange                 (AES_Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
16216f2945cdSDaniel P. Berrange                 (AES_Te4[(t0 >>  8) & 0xff] & 0x0000ff00) ^
16226f2945cdSDaniel P. Berrange                 (AES_Te4[(t1      ) & 0xff] & 0x000000ff) ^
16236f2945cdSDaniel P. Berrange                 rk[2];
16246f2945cdSDaniel P. Berrange         PUTU32(out +  8, s2);
16256f2945cdSDaniel P. Berrange         s3 =
16266f2945cdSDaniel P. Berrange                 (AES_Te4[(t3 >> 24)       ] & 0xff000000) ^
16276f2945cdSDaniel P. Berrange                 (AES_Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
16286f2945cdSDaniel P. Berrange                 (AES_Te4[(t1 >>  8) & 0xff] & 0x0000ff00) ^
16296f2945cdSDaniel P. Berrange                 (AES_Te4[(t2      ) & 0xff] & 0x000000ff) ^
16306f2945cdSDaniel P. Berrange                 rk[3];
16316f2945cdSDaniel P. Berrange         PUTU32(out + 12, s3);
16326f2945cdSDaniel P. Berrange }
16336f2945cdSDaniel P. Berrange 
16346f2945cdSDaniel P. Berrange /*
16356f2945cdSDaniel P. Berrange  * Decrypt a single block
16366f2945cdSDaniel P. Berrange  * in and out can overlap
16376f2945cdSDaniel P. Berrange  */
AES_decrypt(const unsigned char * in,unsigned char * out,const AES_KEY * key)16386f2945cdSDaniel P. Berrange void AES_decrypt(const unsigned char *in, unsigned char *out,
16396f2945cdSDaniel P. Berrange                  const AES_KEY *key) {
16406f2945cdSDaniel P. Berrange 
16416f2945cdSDaniel P. Berrange         const u32 *rk;
16426f2945cdSDaniel P. Berrange         u32 s0, s1, s2, s3, t0, t1, t2, t3;
16436f2945cdSDaniel P. Berrange #ifndef FULL_UNROLL
16446f2945cdSDaniel P. Berrange         int r;
16456f2945cdSDaniel P. Berrange #endif /* ?FULL_UNROLL */
16466f2945cdSDaniel P. Berrange 
16476f2945cdSDaniel P. Berrange         assert(in && out && key);
16486f2945cdSDaniel P. Berrange         rk = key->rd_key;
16496f2945cdSDaniel P. Berrange 
16506f2945cdSDaniel P. Berrange         /*
16516f2945cdSDaniel P. Berrange          * map byte array block to cipher state
16526f2945cdSDaniel P. Berrange          * and add initial round key:
16536f2945cdSDaniel P. Berrange          */
16546f2945cdSDaniel P. Berrange     s0 = GETU32(in     ) ^ rk[0];
16556f2945cdSDaniel P. Berrange     s1 = GETU32(in +  4) ^ rk[1];
16566f2945cdSDaniel P. Berrange     s2 = GETU32(in +  8) ^ rk[2];
16576f2945cdSDaniel P. Berrange     s3 = GETU32(in + 12) ^ rk[3];
16586f2945cdSDaniel P. Berrange #ifdef FULL_UNROLL
16596f2945cdSDaniel P. Berrange     /* round 1: */
16606f2945cdSDaniel P. Berrange     t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >>  8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[ 4];
16616f2945cdSDaniel P. Berrange     t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >>  8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[ 5];
16626f2945cdSDaniel P. Berrange     t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >>  8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[ 6];
16636f2945cdSDaniel P. Berrange     t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >>  8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[ 7];
16646f2945cdSDaniel P. Berrange     /* round 2: */
16656f2945cdSDaniel P. Berrange     s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >>  8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[ 8];
16666f2945cdSDaniel P. Berrange     s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >>  8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[ 9];
16676f2945cdSDaniel P. Berrange     s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >>  8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[10];
16686f2945cdSDaniel P. Berrange     s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >>  8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[11];
16696f2945cdSDaniel P. Berrange     /* round 3: */
16706f2945cdSDaniel P. Berrange     t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >>  8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[12];
16716f2945cdSDaniel P. Berrange     t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >>  8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[13];
16726f2945cdSDaniel P. Berrange     t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >>  8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[14];
16736f2945cdSDaniel P. Berrange     t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >>  8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[15];
16746f2945cdSDaniel P. Berrange     /* round 4: */
16756f2945cdSDaniel P. Berrange     s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >>  8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[16];
16766f2945cdSDaniel P. Berrange     s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >>  8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[17];
16776f2945cdSDaniel P. Berrange     s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >>  8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[18];
16786f2945cdSDaniel P. Berrange     s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >>  8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[19];
16796f2945cdSDaniel P. Berrange     /* round 5: */
16806f2945cdSDaniel P. Berrange     t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >>  8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[20];
16816f2945cdSDaniel P. Berrange     t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >>  8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[21];
16826f2945cdSDaniel P. Berrange     t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >>  8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[22];
16836f2945cdSDaniel P. Berrange     t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >>  8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[23];
16846f2945cdSDaniel P. Berrange     /* round 6: */
16856f2945cdSDaniel P. Berrange     s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >>  8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[24];
16866f2945cdSDaniel P. Berrange     s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >>  8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[25];
16876f2945cdSDaniel P. Berrange     s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >>  8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[26];
16886f2945cdSDaniel P. Berrange     s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >>  8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[27];
16896f2945cdSDaniel P. Berrange     /* round 7: */
16906f2945cdSDaniel P. Berrange     t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >>  8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[28];
16916f2945cdSDaniel P. Berrange     t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >>  8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[29];
16926f2945cdSDaniel P. Berrange     t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >>  8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[30];
16936f2945cdSDaniel P. Berrange     t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >>  8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[31];
16946f2945cdSDaniel P. Berrange     /* round 8: */
16956f2945cdSDaniel P. Berrange     s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >>  8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[32];
16966f2945cdSDaniel P. Berrange     s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >>  8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[33];
16976f2945cdSDaniel P. Berrange     s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >>  8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[34];
16986f2945cdSDaniel P. Berrange     s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >>  8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[35];
16996f2945cdSDaniel P. Berrange     /* round 9: */
17006f2945cdSDaniel P. Berrange     t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >>  8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[36];
17016f2945cdSDaniel P. Berrange     t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >>  8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[37];
17026f2945cdSDaniel P. Berrange     t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >>  8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[38];
17036f2945cdSDaniel P. Berrange     t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >>  8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[39];
17046f2945cdSDaniel P. Berrange     if (key->rounds > 10) {
17056f2945cdSDaniel P. Berrange         /* round 10: */
17066f2945cdSDaniel P. Berrange         s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >>  8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[40];
17076f2945cdSDaniel P. Berrange         s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >>  8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[41];
17086f2945cdSDaniel P. Berrange         s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >>  8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[42];
17096f2945cdSDaniel P. Berrange         s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >>  8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[43];
17106f2945cdSDaniel P. Berrange         /* round 11: */
17116f2945cdSDaniel P. Berrange         t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >>  8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[44];
17126f2945cdSDaniel P. Berrange         t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >>  8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[45];
17136f2945cdSDaniel P. Berrange         t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >>  8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[46];
17146f2945cdSDaniel P. Berrange         t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >>  8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[47];
17156f2945cdSDaniel P. Berrange         if (key->rounds > 12) {
17166f2945cdSDaniel P. Berrange             /* round 12: */
17176f2945cdSDaniel P. Berrange             s0 = AES_Td0[t0 >> 24] ^ AES_Td1[(t3 >> 16) & 0xff] ^ AES_Td2[(t2 >>  8) & 0xff] ^ AES_Td3[t1 & 0xff] ^ rk[48];
17186f2945cdSDaniel P. Berrange             s1 = AES_Td0[t1 >> 24] ^ AES_Td1[(t0 >> 16) & 0xff] ^ AES_Td2[(t3 >>  8) & 0xff] ^ AES_Td3[t2 & 0xff] ^ rk[49];
17196f2945cdSDaniel P. Berrange             s2 = AES_Td0[t2 >> 24] ^ AES_Td1[(t1 >> 16) & 0xff] ^ AES_Td2[(t0 >>  8) & 0xff] ^ AES_Td3[t3 & 0xff] ^ rk[50];
17206f2945cdSDaniel P. Berrange             s3 = AES_Td0[t3 >> 24] ^ AES_Td1[(t2 >> 16) & 0xff] ^ AES_Td2[(t1 >>  8) & 0xff] ^ AES_Td3[t0 & 0xff] ^ rk[51];
17216f2945cdSDaniel P. Berrange             /* round 13: */
17226f2945cdSDaniel P. Berrange             t0 = AES_Td0[s0 >> 24] ^ AES_Td1[(s3 >> 16) & 0xff] ^ AES_Td2[(s2 >>  8) & 0xff] ^ AES_Td3[s1 & 0xff] ^ rk[52];
17236f2945cdSDaniel P. Berrange             t1 = AES_Td0[s1 >> 24] ^ AES_Td1[(s0 >> 16) & 0xff] ^ AES_Td2[(s3 >>  8) & 0xff] ^ AES_Td3[s2 & 0xff] ^ rk[53];
17246f2945cdSDaniel P. Berrange             t2 = AES_Td0[s2 >> 24] ^ AES_Td1[(s1 >> 16) & 0xff] ^ AES_Td2[(s0 >>  8) & 0xff] ^ AES_Td3[s3 & 0xff] ^ rk[54];
17256f2945cdSDaniel P. Berrange             t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >>  8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[55];
17266f2945cdSDaniel P. Berrange         }
17276f2945cdSDaniel P. Berrange     }
17286f2945cdSDaniel P. Berrange         rk += key->rounds << 2;
17296f2945cdSDaniel P. Berrange #else  /* !FULL_UNROLL */
17306f2945cdSDaniel P. Berrange     /*
17316f2945cdSDaniel P. Berrange      * Nr - 1 full rounds:
17326f2945cdSDaniel P. Berrange      */
17336f2945cdSDaniel P. Berrange     r = key->rounds >> 1;
17346f2945cdSDaniel P. Berrange     for (;;) {
17356f2945cdSDaniel P. Berrange         t0 =
17366f2945cdSDaniel P. Berrange             AES_Td0[(s0 >> 24)       ] ^
17376f2945cdSDaniel P. Berrange             AES_Td1[(s3 >> 16) & 0xff] ^
17386f2945cdSDaniel P. Berrange             AES_Td2[(s2 >>  8) & 0xff] ^
17396f2945cdSDaniel P. Berrange             AES_Td3[(s1      ) & 0xff] ^
17406f2945cdSDaniel P. Berrange             rk[4];
17416f2945cdSDaniel P. Berrange         t1 =
17426f2945cdSDaniel P. Berrange             AES_Td0[(s1 >> 24)       ] ^
17436f2945cdSDaniel P. Berrange             AES_Td1[(s0 >> 16) & 0xff] ^
17446f2945cdSDaniel P. Berrange             AES_Td2[(s3 >>  8) & 0xff] ^
17456f2945cdSDaniel P. Berrange             AES_Td3[(s2      ) & 0xff] ^
17466f2945cdSDaniel P. Berrange             rk[5];
17476f2945cdSDaniel P. Berrange         t2 =
17486f2945cdSDaniel P. Berrange             AES_Td0[(s2 >> 24)       ] ^
17496f2945cdSDaniel P. Berrange             AES_Td1[(s1 >> 16) & 0xff] ^
17506f2945cdSDaniel P. Berrange             AES_Td2[(s0 >>  8) & 0xff] ^
17516f2945cdSDaniel P. Berrange             AES_Td3[(s3      ) & 0xff] ^
17526f2945cdSDaniel P. Berrange             rk[6];
17536f2945cdSDaniel P. Berrange         t3 =
17546f2945cdSDaniel P. Berrange             AES_Td0[(s3 >> 24)       ] ^
17556f2945cdSDaniel P. Berrange             AES_Td1[(s2 >> 16) & 0xff] ^
17566f2945cdSDaniel P. Berrange             AES_Td2[(s1 >>  8) & 0xff] ^
17576f2945cdSDaniel P. Berrange             AES_Td3[(s0      ) & 0xff] ^
17586f2945cdSDaniel P. Berrange             rk[7];
17596f2945cdSDaniel P. Berrange 
17606f2945cdSDaniel P. Berrange         rk += 8;
17616f2945cdSDaniel P. Berrange         if (--r == 0) {
17626f2945cdSDaniel P. Berrange             break;
17636f2945cdSDaniel P. Berrange         }
17646f2945cdSDaniel P. Berrange 
17656f2945cdSDaniel P. Berrange         s0 =
17666f2945cdSDaniel P. Berrange             AES_Td0[(t0 >> 24)       ] ^
17676f2945cdSDaniel P. Berrange             AES_Td1[(t3 >> 16) & 0xff] ^
17686f2945cdSDaniel P. Berrange             AES_Td2[(t2 >>  8) & 0xff] ^
17696f2945cdSDaniel P. Berrange             AES_Td3[(t1      ) & 0xff] ^
17706f2945cdSDaniel P. Berrange             rk[0];
17716f2945cdSDaniel P. Berrange         s1 =
17726f2945cdSDaniel P. Berrange             AES_Td0[(t1 >> 24)       ] ^
17736f2945cdSDaniel P. Berrange             AES_Td1[(t0 >> 16) & 0xff] ^
17746f2945cdSDaniel P. Berrange             AES_Td2[(t3 >>  8) & 0xff] ^
17756f2945cdSDaniel P. Berrange             AES_Td3[(t2      ) & 0xff] ^
17766f2945cdSDaniel P. Berrange             rk[1];
17776f2945cdSDaniel P. Berrange         s2 =
17786f2945cdSDaniel P. Berrange             AES_Td0[(t2 >> 24)       ] ^
17796f2945cdSDaniel P. Berrange             AES_Td1[(t1 >> 16) & 0xff] ^
17806f2945cdSDaniel P. Berrange             AES_Td2[(t0 >>  8) & 0xff] ^
17816f2945cdSDaniel P. Berrange             AES_Td3[(t3      ) & 0xff] ^
17826f2945cdSDaniel P. Berrange             rk[2];
17836f2945cdSDaniel P. Berrange         s3 =
17846f2945cdSDaniel P. Berrange             AES_Td0[(t3 >> 24)       ] ^
17856f2945cdSDaniel P. Berrange             AES_Td1[(t2 >> 16) & 0xff] ^
17866f2945cdSDaniel P. Berrange             AES_Td2[(t1 >>  8) & 0xff] ^
17876f2945cdSDaniel P. Berrange             AES_Td3[(t0      ) & 0xff] ^
17886f2945cdSDaniel P. Berrange             rk[3];
17896f2945cdSDaniel P. Berrange     }
17906f2945cdSDaniel P. Berrange #endif /* ?FULL_UNROLL */
17916f2945cdSDaniel P. Berrange     /*
17926f2945cdSDaniel P. Berrange          * apply last round and
17936f2945cdSDaniel P. Berrange          * map cipher state to byte array block:
17946f2945cdSDaniel P. Berrange          */
17956f2945cdSDaniel P. Berrange         s0 =
17966f2945cdSDaniel P. Berrange                 (AES_Td4[(t0 >> 24)       ] & 0xff000000) ^
17976f2945cdSDaniel P. Berrange                 (AES_Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
17986f2945cdSDaniel P. Berrange                 (AES_Td4[(t2 >>  8) & 0xff] & 0x0000ff00) ^
17996f2945cdSDaniel P. Berrange                 (AES_Td4[(t1      ) & 0xff] & 0x000000ff) ^
18006f2945cdSDaniel P. Berrange                 rk[0];
18016f2945cdSDaniel P. Berrange         PUTU32(out     , s0);
18026f2945cdSDaniel P. Berrange         s1 =
18036f2945cdSDaniel P. Berrange                 (AES_Td4[(t1 >> 24)       ] & 0xff000000) ^
18046f2945cdSDaniel P. Berrange                 (AES_Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
18056f2945cdSDaniel P. Berrange                 (AES_Td4[(t3 >>  8) & 0xff] & 0x0000ff00) ^
18066f2945cdSDaniel P. Berrange                 (AES_Td4[(t2      ) & 0xff] & 0x000000ff) ^
18076f2945cdSDaniel P. Berrange                 rk[1];
18086f2945cdSDaniel P. Berrange         PUTU32(out +  4, s1);
18096f2945cdSDaniel P. Berrange         s2 =
18106f2945cdSDaniel P. Berrange                 (AES_Td4[(t2 >> 24)       ] & 0xff000000) ^
18116f2945cdSDaniel P. Berrange                 (AES_Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
18126f2945cdSDaniel P. Berrange                 (AES_Td4[(t0 >>  8) & 0xff] & 0x0000ff00) ^
18136f2945cdSDaniel P. Berrange                 (AES_Td4[(t3      ) & 0xff] & 0x000000ff) ^
18146f2945cdSDaniel P. Berrange                 rk[2];
18156f2945cdSDaniel P. Berrange         PUTU32(out +  8, s2);
18166f2945cdSDaniel P. Berrange         s3 =
18176f2945cdSDaniel P. Berrange                 (AES_Td4[(t3 >> 24)       ] & 0xff000000) ^
18186f2945cdSDaniel P. Berrange                 (AES_Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
18196f2945cdSDaniel P. Berrange                 (AES_Td4[(t1 >>  8) & 0xff] & 0x0000ff00) ^
18206f2945cdSDaniel P. Berrange                 (AES_Td4[(t0      ) & 0xff] & 0x000000ff) ^
18216f2945cdSDaniel P. Berrange                 rk[3];
18226f2945cdSDaniel P. Berrange         PUTU32(out + 12, s3);
18236f2945cdSDaniel P. Berrange }
18246f2945cdSDaniel P. Berrange 
18256f2945cdSDaniel P. Berrange #endif /* AES_ASM */
1826