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