/* 
Guntram Wicke, July 2017
CHES 2017 AES obfuscation contest
debug:
gcc -fsanitize=address -o mychallenge mychallenge.c main.c

release:
gcc -s -o mychallenge mychallenge.c main.c

openssl aes-128-ecb -nopad -in testplain.bin -out testplain.bin.enc -K <hexkey>
./mychallenge <testplain.bin >testcipher_challenge.enc
cmp testcipher_challenge.enc testplain.bin.enc
*/

/* the contest required prototype */
void AES_128_encrypt(unsigned char ciphertext[16], unsigned char plaintext[16]);

/* AES1 for disguise and pseudo-random numbers */
static void aes1_block_enc_one_round(unsigned char cipher[16], unsigned char plain[16], unsigned char cle[11*16]);

/* AES2 for real and dummy encryption */
static void aes2_block_enc(unsigned char cipher[16], unsigned char plain[16], unsigned char ks[2][11*16], unsigned char dumks[2][11*16], unsigned char random[16], unsigned char cks[11*16]);

/* memory encryption */
static void blockxoraes_one_round(unsigned char inplaceblock[], unsigned char cle[11*16], unsigned int sqmodnstart, int blocklength);

/* for deception */
static void blockxoraes_one_round_alternate(unsigned char inplaceblock[], unsigned char cle[11*16], unsigned int sqmodnstart, int blocklength);

/* permutation */
static void ord2perm(unsigned char permu[4], int pernr);


static unsigned char dummyblock[4] = {0xc4, 0xee, 0x60, 0x12};

/* AES for disguise and pseudo-random numbers */
/* Ceres */

static unsigned char cks[11*16] =
{ 
	0x3e, 0xff, 0xfa, 0x79, 0xb8, 0xa5, 0x31, 0x0f, 0x36, 0x5a, 0x58, 0x16, 0x44, 0x8c, 0x94, 0xfd,
	0x5b, 0xdd, 0xae, 0x62, 0xe3, 0x78, 0x9f, 0x6d, 0xd5, 0x22, 0xc7, 0x7b, 0x91, 0xae, 0x53, 0x86,
	0xbd, 0x30, 0xea, 0xe3, 0x5e, 0x48, 0x75, 0x8e, 0x8b, 0x6a, 0xb2, 0xf5, 0x1a, 0xc4, 0xe1, 0x73,
	0xa5, 0xc8, 0x65, 0x41, 0xfb, 0x80, 0x10, 0xcf, 0x70, 0xea, 0xa2, 0x3a, 0x6a, 0x2e, 0x43, 0x49,
	0x9c, 0xd2, 0x5e, 0x43, 0x67, 0x52, 0x4e, 0x8c, 0x17, 0xb8, 0xec, 0xb6, 0x7d, 0x96, 0xaf, 0xff,
	0x1c, 0xab, 0x48, 0xbc, 0x7b, 0xf9, 0x06, 0x30, 0x6c, 0x41, 0xea, 0x86, 0x11, 0xd7, 0x45, 0x79,
	0x32, 0xc5, 0xfe, 0x3e, 0x49, 0x3c, 0xf8, 0x0e, 0x25, 0x7d, 0x12, 0x88, 0x34, 0xaa, 0x57, 0xf1,
	0xde, 0x9e, 0x5f, 0x26, 0x97, 0xa2, 0xa7, 0x28, 0xb2, 0xdf, 0xb5, 0xa0, 0x86, 0x75, 0xe2, 0x51,
	0xc3, 0x06, 0x8e, 0x62, 0x54, 0xa4, 0x29, 0x4a, 0xe6, 0x7b, 0x9c, 0xea, 0x60, 0x0e, 0x7e, 0xbb,
	0x73, 0xf5, 0x64, 0xb2, 0x27, 0x51, 0x4d, 0xf8, 0xc1, 0x2a, 0xd1, 0x12, 0xa1, 0x24, 0xaf, 0xa9,
	0x73, 0x8c, 0xb7, 0x80, 0x54, 0xdd, 0xfa, 0x78, 0x95, 0xf7, 0x2b, 0x6a, 0x34, 0xd3, 0x84, 0xc3
};


static unsigned char aes1_sbox[0x100] = {
	 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
	 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
	 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
	 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
	 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
	 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
	 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
	 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
	 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
	 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
	 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
	 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
	 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
	 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
	 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
	 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
};

static unsigned char aes1_invsbox[0x100] = {
	 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
	 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
	 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
	 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
	 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
	 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
	 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
	 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
	 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
	 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
	 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
	 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
	 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
	 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
	 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
	 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
};

static unsigned char aes1_mixcolprod[4][0x100] = { {
	  0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e,
	  0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e,
	  0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e,
	  0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e,
	  0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e,
	  0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe,
	  0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde,
	  0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0xfe,
	  0x1b, 0x19, 0x1f, 0x1d, 0x13, 0x11, 0x17, 0x15, 0x0b, 0x09, 0x0f, 0x0d, 0x03, 0x01, 0x07, 0x05,
	  0x3b, 0x39, 0x3f, 0x3d, 0x33, 0x31, 0x37, 0x35, 0x2b, 0x29, 0x2f, 0x2d, 0x23, 0x21, 0x27, 0x25,
	  0x5b, 0x59, 0x5f, 0x5d, 0x53, 0x51, 0x57, 0x55, 0x4b, 0x49, 0x4f, 0x4d, 0x43, 0x41, 0x47, 0x45,
	  0x7b, 0x79, 0x7f, 0x7d, 0x73, 0x71, 0x77, 0x75, 0x6b, 0x69, 0x6f, 0x6d, 0x63, 0x61, 0x67, 0x65,
	  0x9b, 0x99, 0x9f, 0x9d, 0x93, 0x91, 0x97, 0x95, 0x8b, 0x89, 0x8f, 0x8d, 0x83, 0x81, 0x87, 0x85,
	  0xbb, 0xb9, 0xbf, 0xbd, 0xb3, 0xb1, 0xb7, 0xb5, 0xab, 0xa9, 0xaf, 0xad, 0xa3, 0xa1, 0xa7, 0xa5,
	  0xdb, 0xd9, 0xdf, 0xdd, 0xd3, 0xd1, 0xd7, 0xd5, 0xcb, 0xc9, 0xcf, 0xcd, 0xc3, 0xc1, 0xc7, 0xc5,
	  0xfb, 0xf9, 0xff, 0xfd, 0xf3, 0xf1, 0xf7, 0xf5, 0xeb, 0xe9, 0xef, 0xed, 0xe3, 0xe1, 0xe7, 0xe5
	}, {
	  0x00, 0x03, 0x06, 0x05, 0x0c, 0x0f, 0x0a, 0x09, 0x18, 0x1b, 0x1e, 0x1d, 0x14, 0x17, 0x12, 0x11,
	  0x30, 0x33, 0x36, 0x35, 0x3c, 0x3f, 0x3a, 0x39, 0x28, 0x2b, 0x2e, 0x2d, 0x24, 0x27, 0x22, 0x21,
	  0x60, 0x63, 0x66, 0x65, 0x6c, 0x6f, 0x6a, 0x69, 0x78, 0x7b, 0x7e, 0x7d, 0x74, 0x77, 0x72, 0x71,
	  0x50, 0x53, 0x56, 0x55, 0x5c, 0x5f, 0x5a, 0x59, 0x48, 0x4b, 0x4e, 0x4d, 0x44, 0x47, 0x42, 0x41,
	  0xc0, 0xc3, 0xc6, 0xc5, 0xcc, 0xcf, 0xca, 0xc9, 0xd8, 0xdb, 0xde, 0xdd, 0xd4, 0xd7, 0xd2, 0xd1,
	  0xf0, 0xf3, 0xf6, 0xf5, 0xfc, 0xff, 0xfa, 0xf9, 0xe8, 0xeb, 0xee, 0xed, 0xe4, 0xe7, 0xe2, 0xe1,
	  0xa0, 0xa3, 0xa6, 0xa5, 0xac, 0xaf, 0xaa, 0xa9, 0xb8, 0xbb, 0xbe, 0xbd, 0xb4, 0xb7, 0xb2, 0xb1,
	  0x90, 0x93, 0x96, 0x95, 0x9c, 0x9f, 0x9a, 0x99, 0x88, 0x8b, 0x8e, 0x8d, 0x84, 0x87, 0x82, 0x81,
	  0x9b, 0x98, 0x9d, 0x9e, 0x97, 0x94, 0x91, 0x92, 0x83, 0x80, 0x85, 0x86, 0x8f, 0x8c, 0x89, 0x8a,
	  0xab, 0xa8, 0xad, 0xae, 0xa7, 0xa4, 0xa1, 0xa2, 0xb3, 0xb0, 0xb5, 0xb6, 0xbf, 0xbc, 0xb9, 0xba,
	  0xfb, 0xf8, 0xfd, 0xfe, 0xf7, 0xf4, 0xf1, 0xf2, 0xe3, 0xe0, 0xe5, 0xe6, 0xef, 0xec, 0xe9, 0xea,
	  0xcb, 0xc8, 0xcd, 0xce, 0xc7, 0xc4, 0xc1, 0xc2, 0xd3, 0xd0, 0xd5, 0xd6, 0xdf, 0xdc, 0xd9, 0xda,
	  0x5b, 0x58, 0x5d, 0x5e, 0x57, 0x54, 0x51, 0x52, 0x43, 0x40, 0x45, 0x46, 0x4f, 0x4c, 0x49, 0x4a,
	  0x6b, 0x68, 0x6d, 0x6e, 0x67, 0x64, 0x61, 0x62, 0x73, 0x70, 0x75, 0x76, 0x7f, 0x7c, 0x79, 0x7a,
	  0x3b, 0x38, 0x3d, 0x3e, 0x37, 0x34, 0x31, 0x32, 0x23, 0x20, 0x25, 0x26, 0x2f, 0x2c, 0x29, 0x2a,
	  0x0b, 0x08, 0x0d, 0x0e, 0x07, 0x04, 0x01, 0x02, 0x13, 0x10, 0x15, 0x16, 0x1f, 0x1c, 0x19, 0x1a
	}, {
	  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
	  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
	  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
	  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
	  0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
	  0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
	  0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
	  0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
	  0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
	  0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
	  0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
	  0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
	  0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
	  0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
	  0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
	  0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
	}, {
	  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
	  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
	  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
	  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
	  0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
	  0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
	  0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
	  0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
	  0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
	  0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
	  0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
	  0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
	  0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
	  0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
	  0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
	  0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
	}
};

static unsigned char aes1_invmixcolprod[4][0x100] = { {
	  0x00, 0x0e, 0x1c, 0x12, 0x38, 0x36, 0x24, 0x2a, 0x70, 0x7e, 0x6c, 0x62, 0x48, 0x46, 0x54, 0x5a,
	  0xe0, 0xee, 0xfc, 0xf2, 0xd8, 0xd6, 0xc4, 0xca, 0x90, 0x9e, 0x8c, 0x82, 0xa8, 0xa6, 0xb4, 0xba,
	  0xdb, 0xd5, 0xc7, 0xc9, 0xe3, 0xed, 0xff, 0xf1, 0xab, 0xa5, 0xb7, 0xb9, 0x93, 0x9d, 0x8f, 0x81,
	  0x3b, 0x35, 0x27, 0x29, 0x03, 0x0d, 0x1f, 0x11, 0x4b, 0x45, 0x57, 0x59, 0x73, 0x7d, 0x6f, 0x61,
	  0xad, 0xa3, 0xb1, 0xbf, 0x95, 0x9b, 0x89, 0x87, 0xdd, 0xd3, 0xc1, 0xcf, 0xe5, 0xeb, 0xf9, 0xf7,
	  0x4d, 0x43, 0x51, 0x5f, 0x75, 0x7b, 0x69, 0x67, 0x3d, 0x33, 0x21, 0x2f, 0x05, 0x0b, 0x19, 0x17,
	  0x76, 0x78, 0x6a, 0x64, 0x4e, 0x40, 0x52, 0x5c, 0x06, 0x08, 0x1a, 0x14, 0x3e, 0x30, 0x22, 0x2c,
	  0x96, 0x98, 0x8a, 0x84, 0xae, 0xa0, 0xb2, 0xbc, 0xe6, 0xe8, 0xfa, 0xf4, 0xde, 0xd0, 0xc2, 0xcc,
	  0x41, 0x4f, 0x5d, 0x53, 0x79, 0x77, 0x65, 0x6b, 0x31, 0x3f, 0x2d, 0x23, 0x09, 0x07, 0x15, 0x1b,
	  0xa1, 0xaf, 0xbd, 0xb3, 0x99, 0x97, 0x85, 0x8b, 0xd1, 0xdf, 0xcd, 0xc3, 0xe9, 0xe7, 0xf5, 0xfb,
	  0x9a, 0x94, 0x86, 0x88, 0xa2, 0xac, 0xbe, 0xb0, 0xea, 0xe4, 0xf6, 0xf8, 0xd2, 0xdc, 0xce, 0xc0,
	  0x7a, 0x74, 0x66, 0x68, 0x42, 0x4c, 0x5e, 0x50, 0x0a, 0x04, 0x16, 0x18, 0x32, 0x3c, 0x2e, 0x20,
	  0xec, 0xe2, 0xf0, 0xfe, 0xd4, 0xda, 0xc8, 0xc6, 0x9c, 0x92, 0x80, 0x8e, 0xa4, 0xaa, 0xb8, 0xb6,
	  0x0c, 0x02, 0x10, 0x1e, 0x34, 0x3a, 0x28, 0x26, 0x7c, 0x72, 0x60, 0x6e, 0x44, 0x4a, 0x58, 0x56,
	  0x37, 0x39, 0x2b, 0x25, 0x0f, 0x01, 0x13, 0x1d, 0x47, 0x49, 0x5b, 0x55, 0x7f, 0x71, 0x63, 0x6d,
	  0xd7, 0xd9, 0xcb, 0xc5, 0xef, 0xe1, 0xf3, 0xfd, 0xa7, 0xa9, 0xbb, 0xb5, 0x9f, 0x91, 0x83, 0x8d
	}, {
	  0x00, 0x0b, 0x16, 0x1d, 0x2c, 0x27, 0x3a, 0x31, 0x58, 0x53, 0x4e, 0x45, 0x74, 0x7f, 0x62, 0x69,
	  0xb0, 0xbb, 0xa6, 0xad, 0x9c, 0x97, 0x8a, 0x81, 0xe8, 0xe3, 0xfe, 0xf5, 0xc4, 0xcf, 0xd2, 0xd9,
	  0x7b, 0x70, 0x6d, 0x66, 0x57, 0x5c, 0x41, 0x4a, 0x23, 0x28, 0x35, 0x3e, 0x0f, 0x04, 0x19, 0x12,
	  0xcb, 0xc0, 0xdd, 0xd6, 0xe7, 0xec, 0xf1, 0xfa, 0x93, 0x98, 0x85, 0x8e, 0xbf, 0xb4, 0xa9, 0xa2,
	  0xf6, 0xfd, 0xe0, 0xeb, 0xda, 0xd1, 0xcc, 0xc7, 0xae, 0xa5, 0xb8, 0xb3, 0x82, 0x89, 0x94, 0x9f,
	  0x46, 0x4d, 0x50, 0x5b, 0x6a, 0x61, 0x7c, 0x77, 0x1e, 0x15, 0x08, 0x03, 0x32, 0x39, 0x24, 0x2f,
	  0x8d, 0x86, 0x9b, 0x90, 0xa1, 0xaa, 0xb7, 0xbc, 0xd5, 0xde, 0xc3, 0xc8, 0xf9, 0xf2, 0xef, 0xe4,
	  0x3d, 0x36, 0x2b, 0x20, 0x11, 0x1a, 0x07, 0x0c, 0x65, 0x6e, 0x73, 0x78, 0x49, 0x42, 0x5f, 0x54,
	  0xf7, 0xfc, 0xe1, 0xea, 0xdb, 0xd0, 0xcd, 0xc6, 0xaf, 0xa4, 0xb9, 0xb2, 0x83, 0x88, 0x95, 0x9e,
	  0x47, 0x4c, 0x51, 0x5a, 0x6b, 0x60, 0x7d, 0x76, 0x1f, 0x14, 0x09, 0x02, 0x33, 0x38, 0x25, 0x2e,
	  0x8c, 0x87, 0x9a, 0x91, 0xa0, 0xab, 0xb6, 0xbd, 0xd4, 0xdf, 0xc2, 0xc9, 0xf8, 0xf3, 0xee, 0xe5,
	  0x3c, 0x37, 0x2a, 0x21, 0x10, 0x1b, 0x06, 0x0d, 0x64, 0x6f, 0x72, 0x79, 0x48, 0x43, 0x5e, 0x55,
	  0x01, 0x0a, 0x17, 0x1c, 0x2d, 0x26, 0x3b, 0x30, 0x59, 0x52, 0x4f, 0x44, 0x75, 0x7e, 0x63, 0x68,
	  0xb1, 0xba, 0xa7, 0xac, 0x9d, 0x96, 0x8b, 0x80, 0xe9, 0xe2, 0xff, 0xf4, 0xc5, 0xce, 0xd3, 0xd8,
	  0x7a, 0x71, 0x6c, 0x67, 0x56, 0x5d, 0x40, 0x4b, 0x22, 0x29, 0x34, 0x3f, 0x0e, 0x05, 0x18, 0x13,
	  0xca, 0xc1, 0xdc, 0xd7, 0xe6, 0xed, 0xf0, 0xfb, 0x92, 0x99, 0x84, 0x8f, 0xbe, 0xb5, 0xa8, 0xa3
	}, {
	  0x00, 0x0d, 0x1a, 0x17, 0x34, 0x39, 0x2e, 0x23, 0x68, 0x65, 0x72, 0x7f, 0x5c, 0x51, 0x46, 0x4b,
	  0xd0, 0xdd, 0xca, 0xc7, 0xe4, 0xe9, 0xfe, 0xf3, 0xb8, 0xb5, 0xa2, 0xaf, 0x8c, 0x81, 0x96, 0x9b,
	  0xbb, 0xb6, 0xa1, 0xac, 0x8f, 0x82, 0x95, 0x98, 0xd3, 0xde, 0xc9, 0xc4, 0xe7, 0xea, 0xfd, 0xf0,
	  0x6b, 0x66, 0x71, 0x7c, 0x5f, 0x52, 0x45, 0x48, 0x03, 0x0e, 0x19, 0x14, 0x37, 0x3a, 0x2d, 0x20,
	  0x6d, 0x60, 0x77, 0x7a, 0x59, 0x54, 0x43, 0x4e, 0x05, 0x08, 0x1f, 0x12, 0x31, 0x3c, 0x2b, 0x26,
	  0xbd, 0xb0, 0xa7, 0xaa, 0x89, 0x84, 0x93, 0x9e, 0xd5, 0xd8, 0xcf, 0xc2, 0xe1, 0xec, 0xfb, 0xf6,
	  0xd6, 0xdb, 0xcc, 0xc1, 0xe2, 0xef, 0xf8, 0xf5, 0xbe, 0xb3, 0xa4, 0xa9, 0x8a, 0x87, 0x90, 0x9d,
	  0x06, 0x0b, 0x1c, 0x11, 0x32, 0x3f, 0x28, 0x25, 0x6e, 0x63, 0x74, 0x79, 0x5a, 0x57, 0x40, 0x4d,
	  0xda, 0xd7, 0xc0, 0xcd, 0xee, 0xe3, 0xf4, 0xf9, 0xb2, 0xbf, 0xa8, 0xa5, 0x86, 0x8b, 0x9c, 0x91,
	  0x0a, 0x07, 0x10, 0x1d, 0x3e, 0x33, 0x24, 0x29, 0x62, 0x6f, 0x78, 0x75, 0x56, 0x5b, 0x4c, 0x41,
	  0x61, 0x6c, 0x7b, 0x76, 0x55, 0x58, 0x4f, 0x42, 0x09, 0x04, 0x13, 0x1e, 0x3d, 0x30, 0x27, 0x2a,
	  0xb1, 0xbc, 0xab, 0xa6, 0x85, 0x88, 0x9f, 0x92, 0xd9, 0xd4, 0xc3, 0xce, 0xed, 0xe0, 0xf7, 0xfa,
	  0xb7, 0xba, 0xad, 0xa0, 0x83, 0x8e, 0x99, 0x94, 0xdf, 0xd2, 0xc5, 0xc8, 0xeb, 0xe6, 0xf1, 0xfc,
	  0x67, 0x6a, 0x7d, 0x70, 0x53, 0x5e, 0x49, 0x44, 0x0f, 0x02, 0x15, 0x18, 0x3b, 0x36, 0x21, 0x2c,
	  0x0c, 0x01, 0x16, 0x1b, 0x38, 0x35, 0x22, 0x2f, 0x64, 0x69, 0x7e, 0x73, 0x50, 0x5d, 0x4a, 0x47,
	  0xdc, 0xd1, 0xc6, 0xcb, 0xe8, 0xe5, 0xf2, 0xff, 0xb4, 0xb9, 0xae, 0xa3, 0x80, 0x8d, 0x9a, 0x97
	}, {
	  0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77,
	  0x90, 0x99, 0x82, 0x8b, 0xb4, 0xbd, 0xa6, 0xaf, 0xd8, 0xd1, 0xca, 0xc3, 0xfc, 0xf5, 0xee, 0xe7,
	  0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04, 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c,
	  0xab, 0xa2, 0xb9, 0xb0, 0x8f, 0x86, 0x9d, 0x94, 0xe3, 0xea, 0xf1, 0xf8, 0xc7, 0xce, 0xd5, 0xdc,
	  0x76, 0x7f, 0x64, 0x6d, 0x52, 0x5b, 0x40, 0x49, 0x3e, 0x37, 0x2c, 0x25, 0x1a, 0x13, 0x08, 0x01,
	  0xe6, 0xef, 0xf4, 0xfd, 0xc2, 0xcb, 0xd0, 0xd9, 0xae, 0xa7, 0xbc, 0xb5, 0x8a, 0x83, 0x98, 0x91,
	  0x4d, 0x44, 0x5f, 0x56, 0x69, 0x60, 0x7b, 0x72, 0x05, 0x0c, 0x17, 0x1e, 0x21, 0x28, 0x33, 0x3a,
	  0xdd, 0xd4, 0xcf, 0xc6, 0xf9, 0xf0, 0xeb, 0xe2, 0x95, 0x9c, 0x87, 0x8e, 0xb1, 0xb8, 0xa3, 0xaa,
	  0xec, 0xe5, 0xfe, 0xf7, 0xc8, 0xc1, 0xda, 0xd3, 0xa4, 0xad, 0xb6, 0xbf, 0x80, 0x89, 0x92, 0x9b,
	  0x7c, 0x75, 0x6e, 0x67, 0x58, 0x51, 0x4a, 0x43, 0x34, 0x3d, 0x26, 0x2f, 0x10, 0x19, 0x02, 0x0b,
	  0xd7, 0xde, 0xc5, 0xcc, 0xf3, 0xfa, 0xe1, 0xe8, 0x9f, 0x96, 0x8d, 0x84, 0xbb, 0xb2, 0xa9, 0xa0,
	  0x47, 0x4e, 0x55, 0x5c, 0x63, 0x6a, 0x71, 0x78, 0x0f, 0x06, 0x1d, 0x14, 0x2b, 0x22, 0x39, 0x30,
	  0x9a, 0x93, 0x88, 0x81, 0xbe, 0xb7, 0xac, 0xa5, 0xd2, 0xdb, 0xc0, 0xc9, 0xf6, 0xff, 0xe4, 0xed,
	  0x0a, 0x03, 0x18, 0x11, 0x2e, 0x27, 0x3c, 0x35, 0x42, 0x4b, 0x50, 0x59, 0x66, 0x6f, 0x74, 0x7d,
	  0xa1, 0xa8, 0xb3, 0xba, 0x85, 0x8c, 0x97, 0x9e, 0xe9, 0xe0, 0xfb, 0xf2, 0xcd, 0xc4, 0xdf, 0xd6,
	  0x31, 0x38, 0x23, 0x2a, 0x15, 0x1c, 0x07, 0x0e, 0x79, 0x70, 0x6b, 0x62, 0x5d, 0x54, 0x4f, 0x46
	}
};

/*----------------------------------------------------------------------------------------------------*/
/* AES2 for real and dummy encryption. All tables encrypted with memenc.c (AES key cks) */
/* Pallas transformed under A, D (select one for use)*/
static unsigned char pks[2][11*16] =
{{
0xe6, 0xac, 0x99, 0x2b, 0xa0, 0x00, 0x4d, 0x89, 0x15, 0x45, 0x34, 0xb7, 0x1f, 0x5a, 0x79, 0xdf, 
0x1e, 0x70, 0x07, 0xcf, 0xe3, 0x17, 0xfd, 0x0c, 0x0a, 0x4c, 0xfa, 0x65, 0x40, 0x17, 0xf4, 0x52, 
0xa7, 0x4d, 0x03, 0xca, 0x43, 0xef, 0x74, 0xaf, 0x8a, 0x86, 0x7e, 0xc6, 0x2b, 0x76, 0x27, 0x5d, 
0x09, 0x19, 0x43, 0x20, 0x0d, 0x4f, 0x0f, 0xbe, 0x7a, 0x57, 0xd7, 0x1d, 0xbf, 0x89, 0x44, 0xeb, 
0xd6, 0x6d, 0x5d, 0xea, 0x29, 0xe0, 0xa1, 0x4e, 0x3a, 0x54, 0xe5, 0x4a, 0x02, 0x68, 0xc8, 0x7e, 
0xfa, 0xd8, 0x26, 0x5e, 0x62, 0x6e, 0x62, 0xd5, 0x52, 0xaa, 0x40, 0x0e, 0xac, 0x9e, 0x62, 0xc0, 
0x25, 0xce, 0x30, 0x33, 0x4e, 0xf0, 0x27, 0xfa, 0x4a, 0xd0, 0x86, 0x63, 0x83, 0xf8, 0xd5, 0x7c, 
0x06, 0x8c, 0xa2, 0x6b, 0xbe, 0x63, 0xb7, 0x00, 0x38, 0x53, 0xa9, 0x13, 0x00, 0x75, 0xa2, 0x03, 
0xe9, 0xc8, 0xdb, 0xd8, 0x31, 0x74, 0x08, 0xed, 0xca, 0xc7, 0xbe, 0xd0, 0xc3, 0xde, 0x5b, 0x72, 
0x28, 0x49, 0xed, 0x02, 0x7c, 0x66, 0x5c, 0xbe, 0x08, 0x80, 0xce, 0xc7, 0x4d, 0x4c, 0xf7, 0x9f, 
0x5f, 0x13, 0xdc, 0x24, 0x44, 0x23, 0x34, 0xad, 0x70, 0xe0, 0xf2, 0x65, 0xa9, 0x70, 0x4c, 0xb0 
},{
0x5a, 0x13, 0xed, 0x9b, 0x39, 0x11, 0x16, 0x83, 0xc3, 0x9b, 0x3f, 0xa7, 0x06, 0x8b, 0xbd, 0x17, 
0x0f, 0x88, 0x1a, 0xf8, 0x3a, 0xc1, 0x01, 0x29, 0xf9, 0x68, 0xeb, 0x94, 0x4e, 0x32, 0xf4, 0x82, 
0xf3, 0x8c, 0x78, 0x03, 0xda, 0x84, 0x08, 0x44, 0x0a, 0xcf, 0xcb, 0x92, 0x91, 0x0f, 0x24, 0xb9, 
0xb4, 0xb4, 0x5f, 0x29, 0x9f, 0xc5, 0x98, 0x47, 0x22, 0xa5, 0x73, 0x36, 0x44, 0xea, 0xb6, 0x48, 
0x17, 0xf1, 0x41, 0x9b, 0x9e, 0x39, 0xe6, 0x67, 0x2a, 0x93, 0x85, 0x71, 0x8a, 0x82, 0xbf, 0xa7, 
0xa1, 0x43, 0xa0, 0x8e, 0xb7, 0x14, 0xc4, 0xd6, 0xca, 0x52, 0xda, 0xdb, 0xc9, 0xea, 0xcb, 0x29, 
0xf3, 0xfb, 0x6b, 0x15, 0x42, 0x64, 0x19, 0xb9, 0x38, 0x6b, 0x1b, 0x04, 0x51, 0x65, 0x9d, 0x32, 
0xd8, 0x50, 0x7e, 0x06, 0xfa, 0x0b, 0xeb, 0xb3, 0x9a, 0x61, 0x05, 0x65, 0x92, 0x48, 0x6d, 0x0b, 
0x06, 0x22, 0xe0, 0xf4, 0xb4, 0xbb, 0xbf, 0xcf, 0xcc, 0x41, 0xe8, 0xc8, 0x35, 0xf5, 0x9b, 0x00, 
0xaa, 0x7a, 0xfe, 0xce, 0xa8, 0x8b, 0xb0, 0x28, 0x32, 0x6a, 0x20, 0xad, 0xbe, 0x6e, 0x39, 0x0c, 
0xbe, 0xb4, 0x17, 0x73, 0x4b, 0x50, 0x0c, 0xca, 0x5e, 0x24, 0x1e, 0xc5, 0x4d, 0x08, 0x25, 0x6d 
}};

/* Gaspra transformed under A, D (select one for use)*/
static unsigned char gks[2][11*16] =
{{
0xd2, 0xca, 0xc5, 0xf5, 0x9f, 0xd5, 0x02, 0x9a, 0x17, 0xaa, 0xd1, 0x07, 0x4e, 0x4d, 0x8f, 0xb0, 
0x95, 0xc4, 0xaa, 0x3c, 0x31, 0xb1, 0xdc, 0x20, 0x80, 0xf5, 0x41, 0xb8, 0xbd, 0x9f, 0x97, 0x0e, 
0x22, 0xab, 0x87, 0x10, 0x31, 0xb0, 0x67, 0xbe, 0x05, 0x49, 0x02, 0x8a, 0x84, 0xee, 0x07, 0x8c, 
0x6b, 0x4a, 0xf9, 0xb4, 0xcb, 0x28, 0xe4, 0x0d, 0x04, 0x70, 0x85, 0x63, 0xb2, 0xf1, 0x83, 0xe6, 
0x62, 0xb2, 0xd7, 0xcb, 0xe9, 0x6c, 0xf8, 0x3f, 0x32, 0xaa, 0x81, 0x57, 0x5c, 0x90, 0xd8, 0x43, 
0x35, 0xb3, 0xf7, 0x1a, 0x46, 0x47, 0xaf, 0x57, 0xc0, 0xd9, 0xb1, 0xad, 0x92, 0xd6, 0xef, 0x83, 
0x1c, 0xd7, 0x3c, 0x3c, 0x2a, 0x26, 0x8d, 0xa1, 0x34, 0x63, 0x23, 0x82, 0x6f, 0xa5, 0xf5, 0x88, 
0xad, 0xa7, 0x52, 0x83, 0x1b, 0xaf, 0xfe, 0x44, 0x22, 0x8e, 0xf9, 0xb5, 0x0c, 0x7a, 0x68, 0xfa, 
0xe8, 0xb3, 0x68, 0xef, 0xfa, 0xb8, 0x85, 0x5b, 0xda, 0xfd, 0x85, 0x62, 0x1e, 0x28, 0x33, 0xce, 
0xed, 0x41, 0x01, 0x68, 0x10, 0xc6, 0x10, 0xb3, 0x3e, 0xc8, 0x73, 0xa0, 0x18, 0xd3, 0x89, 0x2d, 
0x20, 0xb6, 0xe8, 0x73, 0x60, 0x01, 0xf8, 0x30, 0x08, 0x78, 0x2f, 0xd6, 0xd8, 0xe1, 0xe4, 0xc0 
},{
0x8e, 0x87, 0x00, 0x08, 0xe2, 0xa4, 0xd4, 0xf3, 0x0d, 0x7c, 0xdb, 0x54, 0x30, 0x7d, 0x85, 0x51, 
0xfc, 0x11, 0x27, 0x30, 0x01, 0x0b, 0xff, 0x5b, 0x84, 0x50, 0xb0, 0xcc, 0x44, 0x77, 0xe9, 0x5a, 
0x5a, 0x10, 0xc9, 0x76, 0x8a, 0x91, 0x59, 0x49, 0xff, 0x8a, 0x3b, 0xb6, 0x33, 0x40, 0xe9, 0xe7, 
0x72, 0x16, 0x6d, 0x24, 0x7c, 0x88, 0x3d, 0x02, 0x24, 0xd3, 0xb7, 0x59, 0x97, 0x5b, 0x82, 0x10, 
0xb6, 0x42, 0x4d, 0xc0, 0x58, 0x02, 0xd7, 0x19, 0x81, 0x00, 0x28, 0x24, 0xc7, 0x9c, 0x90, 0x67, 
0x5d, 0x2e, 0xac, 0x6f, 0x13, 0x9c, 0x0f, 0x2d, 0xe1, 0x11, 0x05, 0xb9, 0x72, 0xd1, 0xc0, 0x32, 
0x89, 0xfd, 0x55, 0x41, 0x4e, 0x63, 0x8a, 0x28, 0x29, 0xb7, 0x73, 0x18, 0x7b, 0x5d, 0xda, 0x3f, 
0x29, 0x62, 0xc7, 0x3e, 0x7a, 0x66, 0x08, 0x82, 0x19, 0xa1, 0x30, 0x18, 0xf5, 0xf8, 0xde, 0xc9, 
0xce, 0x66, 0xd0, 0xe2, 0x45, 0xf5, 0x7b, 0x0a, 0xa7, 0xb5, 0x1d, 0x71, 0x8a, 0x3c, 0x8b, 0x0f, 
0x7f, 0xea, 0xfb, 0x14, 0xc0, 0xcd, 0x4e, 0xec, 0x04, 0xa1, 0xce, 0xc6, 0xb3, 0xd1, 0x75, 0x47, 
0x5d, 0xba, 0xaf, 0xed, 0x9d, 0xf6, 0x29, 0x5d, 0xf4, 0x9d, 0x13, 0x36, 0x6e, 0xa6, 0x00, 0x65 
}};

/* mixcolprod under tranform A (4 x 256) and under transform D (4 x 256)*/
/* mixcolprod[x][y] = AES2_LUT1_A[ gf256mult(mixcolfact[x], AES2_LUT2_A[y]) ] */
static unsigned char aes2_mixcolprod[2][4][0x100] = {
{{ /* mixcolprod transform A */
0x6e, 0x5b, 0xb1, 0x60, 0xbd, 0x66, 0x5a, 0x4b, 0xc9, 0x20, 0xb0, 0xae, 0x32, 0xd2, 0x18, 0xa8, 
0xf5, 0x82, 0x2c, 0x1f, 0xb4, 0x63, 0xe5, 0x51, 0x70, 0x88, 0x8e, 0xa8, 0x30, 0x3f, 0x0a, 0xf4, 
0xc3, 0x34, 0xea, 0xe7, 0x35, 0x40, 0x87, 0xad, 0xa2, 0x9c, 0x4f, 0x58, 0x6b, 0xdf, 0xd9, 0xe6, 
0x6e, 0x7a, 0x74, 0x1d, 0xab, 0xe0, 0x52, 0xcf, 0x47, 0x72, 0xb4, 0x5c, 0xd2, 0x04, 0x02, 0xf3, 
0xdd, 0xa7, 0x37, 0x02, 0x4a, 0xa7, 0x9e, 0xc1, 0xac, 0x24, 0xd6, 0x70, 0xc2, 0x0e, 0x04, 0xed, 
0xe1, 0x6c, 0xd8, 0x59, 0x61, 0xac, 0xd3, 0x40, 0xf2, 0xdc, 0x8f, 0x98, 0xb4, 0x1c, 0xb3, 0x98, 
0x82, 0x57, 0xeb, 0x0c, 0xd4, 0xb9, 0x00, 0x5e, 0x2e, 0x76, 0xa9, 0x04, 0xe6, 0x96, 0x51, 0x27, 
0x75, 0xb0, 0xaa, 0x8c, 0xfb, 0x1d, 0x80, 0xaf, 0x95, 0x81, 0x4c, 0x34, 0xa1, 0x9b, 0x71, 0xea, 
0x99, 0xc4, 0xe4, 0xce, 0x66, 0x48, 0x59, 0x04, 0x9a, 0x43, 0x54, 0xa0, 0xd0, 0xd4, 0xf5, 0x95, 
0xea, 0x2a, 0x75, 0x9f, 0xdd, 0xcb, 0x62, 0x36, 0xdd, 0xbf, 0xe5, 0xa3, 0x03, 0xa7, 0x37, 0x46, 
0x31, 0x66, 0x2f, 0xb8, 0x29, 0x16, 0x9a, 0xae, 0x57, 0x84, 0xa8, 0xbb, 0xb2, 0x92, 0x93, 0xe4, 
0xde, 0xae, 0x98, 0x1d, 0xb2, 0x26, 0xf7, 0xa7, 0x54, 0xd0, 0x8c, 0x34, 0xc3, 0x22, 0x3c, 0xd6, 
0xad, 0x0f, 0xf8, 0x98, 0x74, 0x5b, 0x96, 0x23, 0xb6, 0x55, 0xef, 0xed, 0x16, 0x60, 0x17, 0x04, 
0x22, 0x52, 0xd9, 0xf3, 0x91, 0xac, 0xc8, 0x19, 0xff, 0x50, 0x83, 0x15, 0x60, 0xb5, 0xf3, 0x91, 
0x0c, 0x69, 0x86, 0x78, 0xc6, 0x14, 0x5d, 0xe7, 0xbb, 0xc0, 0x99, 0x0e, 0xf4, 0xac, 0xbf, 0x8e, 
0x49, 0x5a, 0xbd, 0x25, 0xfb, 0xce, 0x93, 0x73, 0x07, 0xb2, 0x32, 0x5f, 0x95, 0x7f, 0xd3, 0x28 
	}, { 
0x83, 0xc8, 0x64, 0x43, 0x4c, 0x4a, 0xf7, 0x54, 0xbb, 0xa0, 0x6e, 0x4b, 0xcd, 0xc0, 0x0f, 0x82, 
0x15, 0x4c, 0x13, 0xf3, 0xd3, 0xc2, 0xdf, 0x98, 0x4c, 0xb8, 0x05, 0x48, 0x74, 0x36, 0x65, 0x8f, 
0xf8, 0xdc, 0xce, 0xfd, 0xc1, 0xce, 0x54, 0xa4, 0x16, 0x3c, 0xdc, 0xfa, 0x9c, 0x3f, 0x61, 0xf7, 
0x28, 0x8b, 0x64, 0x2c, 0x6d, 0xb8, 0x80, 0x71, 0xcc, 0xc8, 0xe1, 0x07, 0x6e, 0xd8, 0x6f, 0x10, 
0xe4, 0x76, 0xd6, 0x89, 0xec, 0xc3, 0x9a, 0x73, 0x39, 0xdf, 0x8a, 0xa8, 0xc0, 0x23, 0x5e, 0xb3, 
0xfd, 0x58, 0x1c, 0x4e, 0xf8, 0x9e, 0xc2, 0xdd, 0x94, 0x17, 0x3b, 0x14, 0xc2, 0x55, 0xc6, 0xa3, 
0x79, 0x6f, 0x8b, 0x09, 0x0a, 0xb3, 0x07, 0xf5, 0xf4, 0x84, 0x64, 0xc8, 0xd3, 0x4f, 0x56, 0xff, 
0xf7, 0xe5, 0x43, 0x2d, 0x75, 0xc8, 0x0a, 0xfb, 0x5b, 0xcf, 0x07, 0x04, 0x66, 0xe1, 0x56, 0xa6, 
0xe2, 0x13, 0x54, 0x89, 0x89, 0x24, 0x39, 0x71, 0x9c, 0x15, 0xfd, 0x80, 0x2f, 0x4a, 0x25, 0x80, 
0xd6, 0x1d, 0xd7, 0x97, 0xd7, 0x84, 0x3b, 0x33, 0x83, 0xb8, 0x71, 0x68, 0xb4, 0x4e, 0xd1, 0x90, 
0xd2, 0x70, 0xac, 0xab, 0xbc, 0xe5, 0xc8, 0x30, 0xe8, 0x61, 0x0a, 0x72, 0x01, 0x10, 0xff, 0x04, 
0x3e, 0x79, 0x6a, 0xa9, 0x19, 0x1e, 0xac, 0x5e, 0xa6, 0x6e, 0x36, 0xa4, 0x22, 0x5b, 0xe7, 0x12, 
0xe4, 0x06, 0xc9, 0xb6, 0x81, 0x28, 0xfa, 0x75, 0x61, 0x76, 0x62, 0x95, 0x95, 0xfb, 0xd6, 0x49, 
0x0c, 0xb4, 0x86, 0xaf, 0xc2, 0x7c, 0x82, 0x52, 0x74, 0xde, 0x27, 0x0d, 0xe7, 0x07, 0x5f, 0x0b, 
0xae, 0xb6, 0x69, 0xbc, 0xdc, 0x42, 0x5a, 0xbe, 0xe8, 0x73, 0xc9, 0x6e, 0x7f, 0x1a, 0xde, 0x99, 
0xc2, 0xe9, 0x5c, 0x3f, 0x17, 0x48, 0x34, 0x2f, 0x69, 0x07, 0x10, 0xf0, 0xe7, 0x91, 0xa6, 0x2d 
	}, { 
0x1d, 0x40, 0x2a, 0x2e, 0xb8, 0x28, 0xa5, 0xf5, 0xa8, 0x8b, 0x6f, 0xbe, 0x8f, 0x65, 0x06, 0x48, 
0x77, 0x53, 0x42, 0xe9, 0x60, 0x93, 0x4a, 0xaa, 0xc8, 0xdf, 0x42, 0x84, 0xc3, 0x2c, 0xde, 0x13, 
0x07, 0x82, 0xec, 0x3c, 0x69, 0xdd, 0xc8, 0xd2, 0x66, 0x09, 0xa1, 0x5a, 0x85, 0xed, 0xad, 0x5f, 
0xe6, 0xe4, 0xb5, 0xcf, 0x76, 0xe7, 0x9d, 0x23, 0x0a, 0x43, 0x8a, 0x85, 0x60, 0x77, 0x64, 0xd2, 
0x92, 0xdc, 0x89, 0x32, 0xe9, 0x66, 0xd0, 0xf7, 0x70, 0x7a, 0x86, 0xf9, 0xe4, 0xfc, 0xf2, 0x3e, 
0xa9, 0xca, 0xba, 0xdd, 0x89, 0xae, 0x5a, 0x85, 0x7b, 0x98, 0xdc, 0xec, 0xed, 0xc2, 0x3c, 0xb0, 
0x1e, 0x76, 0x0c, 0xf7, 0x88, 0x87, 0xaf, 0x32, 0x5b, 0xc4, 0xc7, 0x7f, 0x52, 0xa1, 0x2b, 0x57, 
0xd2, 0x8f, 0x76, 0x9f, 0x35, 0xc7, 0xd5, 0x48, 0xca, 0x85, 0x8d, 0x7e, 0xb1, 0xd9, 0x4e, 0xaf, 
0x12, 0xad, 0xff, 0x2c, 0xe1, 0x75, 0x4f, 0x51, 0x7d, 0xdc, 0xbf, 0x31, 0xe1, 0x4d, 0xb1, 0x08, 
0x77, 0xa0, 0x15, 0x3b, 0x99, 0xc5, 0x77, 0xa6, 0x8d, 0x98, 0x93, 0x83, 0xe4, 0x9e, 0x94, 0xd7, 
0xfe, 0xc1, 0x08, 0x07, 0x11, 0x33, 0x41, 0xb1, 0xaf, 0x51, 0xc1, 0x89, 0x94, 0x9f, 0x72, 0xea, 
0xb3, 0xbe, 0x04, 0x1b, 0x00, 0x74, 0xc3, 0x9a, 0xbf, 0xdc, 0xdb, 0x41, 0xd7, 0xf9, 0x18, 0x0b, 
0xbb, 0xc9, 0xb8, 0xb5, 0x67, 0xf2, 0xf8, 0x51, 0xe7, 0xfc, 0x44, 0xe4, 0xcf, 0x79, 0xba, 0x5b, 
0xe5, 0xb8, 0x1a, 0x91, 0x62, 0xbe, 0x29, 0x01, 0x4b, 0x59, 0xf7, 0xa7, 0x94, 0x06, 0xf6, 0xd4, 
0x2a, 0x4d, 0x5a, 0x8d, 0xee, 0x3d, 0x3a, 0x65, 0x0c, 0x20, 0x0d, 0xc0, 0xb2, 0x0e, 0xf9, 0x8b, 
0xaf, 0xa8, 0x39, 0x2f, 0xd5, 0x92, 0xcb, 0xf4, 0x3a, 0xdb, 0xef, 0xc3, 0x14, 0x90, 0x55, 0x82 
	}, { 
0xc5, 0x5e, 0x2c, 0xb1, 0xb2, 0x92, 0x67, 0x45, 0x9a, 0x48, 0xe2, 0xb6, 0xa2, 0xe5, 0x81, 0x2b, 
0x82, 0xfa, 0xa5, 0xc7, 0x01, 0xb5, 0x01, 0x77, 0x7a, 0x0b, 0xc4, 0x29, 0x74, 0xb1, 0x1e, 0x7c, 
0x55, 0x56, 0x1f, 0x04, 0x0c, 0xbb, 0xbd, 0x3f, 0x61, 0x7c, 0x81, 0x66, 0xe1, 0x4d, 0x0e, 0xf8, 
0x83, 0xfc, 0xc2, 0xd8, 0x4c, 0xd0, 0x0e, 0xd3, 0xab, 0x39, 0x47, 0xc4, 0xc7, 0x93, 0xea, 0x1a, 
0x0f, 0xf8, 0x06, 0xe4, 0xce, 0xfe, 0x3f, 0x70, 0xfb, 0xd3, 0x31, 0x59, 0x17, 0xeb, 0x6d, 0xbd, 
0xf0, 0x0a, 0xe7, 0xc9, 0x9c, 0xab, 0x4c, 0x71, 0x36, 0x4b, 0x97, 0x0a, 0xb0, 0x6b, 0x87, 0x93, 
0x42, 0x7a, 0xb9, 0x18, 0xe7, 0xb6, 0x0c, 0x98, 0x44, 0x41, 0x5b, 0x63, 0xb6, 0x6e, 0x0d, 0x19, 
0xf5, 0xfa, 0x54, 0xe7, 0xce, 0x68, 0x8e, 0x2a, 0x6d, 0xe3, 0xfe, 0x7c, 0x05, 0x69, 0x43, 0x48, 
0x96, 0x92, 0x32, 0x12, 0xd0, 0x85, 0x8a, 0x08, 0x23, 0x62, 0x89, 0x6d, 0xad, 0x6e, 0x74, 0x59, 
0x7d, 0xe5, 0x13, 0x6c, 0x2f, 0x2a, 0x24, 0xa3, 0x1b, 0xd1, 0xc5, 0x85, 0x97, 0x23, 0x59, 0xca, 
0x46, 0xed, 0x41, 0xe7, 0xa3, 0x05, 0xf1, 0xcb, 0x11, 0x18, 0xc8, 0x5a, 0x1e, 0x34, 0x5e, 0x02, 
0x02, 0x64, 0x1b, 0x6c, 0x7a, 0xd9, 0x90, 0x57, 0xc0, 0xf4, 0x06, 0xbe, 0xcf, 0x8c, 0x98, 0x11, 
0x43, 0x93, 0x33, 0x74, 0x11, 0x31, 0x3d, 0xc2, 0xd2, 0xba, 0xdc, 0x40, 0x22, 0xf2, 0x23, 0x98, 
0xa0, 0xd4, 0x5a, 0xaf, 0xf7, 0x81, 0x2a, 0x19, 0x58, 0xa9, 0x01, 0xfe, 0x59, 0x34, 0x9f, 0xcc, 
0xf6, 0x5c, 0xe6, 0x8b, 0x0a, 0x41, 0x0b, 0x4b, 0xf6, 0x00, 0x55, 0x49, 0x3c, 0x1c, 0xfc, 0xdc, 
0x54, 0xc8, 0xde, 0xac, 0x54, 0x86, 0xb4, 0xc3, 0xcb, 0x9d, 0xa4, 0x04, 0x02, 0x02, 0x6f, 0xfd 
	}
},{  /* mixcolprod transform D */
	{
0xda, 0x2a, 0x18, 0x57, 0x6a, 0x14, 0xd4, 0xee, 0xeb, 0xdc, 0x04, 0x67, 0xb6, 0x56, 0xea, 0x58, 
0x9d, 0x4d, 0x5c, 0x40, 0x51, 0x61, 0x75, 0xad, 0xdc, 0x42, 0x70, 0xf0, 0x53, 0x77, 0x26, 0xe1, 
0xf2, 0xba, 0x36, 0xa9, 0xc3, 0xb0, 0x3a, 0x44, 0x11, 0xa8, 0x3e, 0x4e, 0x5c, 0xff, 0x31, 0x93, 
0x7c, 0xe7, 0xde, 0x73, 0x98, 0xc2, 0xbd, 0xc4, 0xd5, 0x08, 0xfa, 0x61, 0xec, 0x2f, 0xa4, 0x98, 
0x0f, 0x8e, 0xc9, 0x5e, 0xc8, 0xdb, 0xfd, 0x5d, 0x37, 0x6a, 0x24, 0x9b, 0xd5, 0x88, 0x7e, 0xf5, 
0xcf, 0x84, 0x33, 0x06, 0x4c, 0x8d, 0x6f, 0xd9, 0x57, 0xf0, 0x4b, 0x16, 0xd1, 0xa4, 0xb8, 0x55, 
0xf0, 0x5a, 0x83, 0x4d, 0xe6, 0x22, 0x6d, 0x85, 0x60, 0x7f, 0x29, 0xbe, 0xbf, 0xfb, 0x95, 0xc2, 
0xc5, 0xec, 0x33, 0x53, 0x95, 0x65, 0xdf, 0x40, 0x8f, 0x35, 0x4a, 0x62, 0xb4, 0x4e, 0x8c, 0x03, 
0x54, 0x90, 0x23, 0x90, 0xca, 0x24, 0xd5, 0xe4, 0x61, 0x3b, 0x87, 0x24, 0xb3, 0xcb, 0xc7, 0xd9, 
0xd2, 0xbe, 0x4f, 0xa4, 0xee, 0x0f, 0x96, 0x98, 0x3a, 0x24, 0x5f, 0xb0, 0x1d, 0x01, 0x4d, 0xc7, 
0xb1, 0x97, 0xee, 0xc5, 0x9f, 0x01, 0x7c, 0xd1, 0x09, 0x31, 0x59, 0x9a, 0xc1, 0x11, 0x8d, 0x95, 
0x61, 0xf3, 0x24, 0x5b, 0x5d, 0x32, 0x8d, 0x65, 0x48, 0x04, 0x47, 0xb5, 0x3b, 0x6b, 0x85, 0x09, 
0x63, 0x66, 0x88, 0x6f, 0x33, 0xf5, 0x2c, 0xdd, 0x0f, 0x28, 0x58, 0xf5, 0x67, 0x61, 0x5f, 0x20, 
0x4d, 0x7d, 0xa6, 0x7b, 0x51, 0xae, 0xea, 0xda, 0xb3, 0xf1, 0x24, 0x89, 0xcf, 0xd5, 0xfd, 0x00, 
0x3b, 0x1d, 0xb7, 0xe6, 0x79, 0x36, 0x45, 0x7d, 0x23, 0xa8, 0x1e, 0xbc, 0x99, 0x3f, 0x1e, 0xf6, 
0x8e, 0x3d, 0x1f, 0xbd, 0xaa, 0xb3, 0x58, 0xe1, 0xb2, 0x1a, 0xee, 0x34, 0xb4, 0x66, 0x15, 0x6e 
	}, { 
0x1e, 0x22, 0x5c, 0x58, 0x3d, 0xbf, 0x2b, 0x13, 0x48, 0x35, 0x65, 0xa4, 0x60, 0xfa, 0x8c, 0x5e, 
0xf3, 0x3a, 0x38, 0x4a, 0x01, 0x9f, 0xfb, 0x84, 0xcf, 0xe9, 0x57, 0xc6, 0xc5, 0x74, 0xed, 0x03, 
0xe1, 0xce, 0x9b, 0xe4, 0x54, 0xe4, 0x86, 0x53, 0x59, 0x71, 0x29, 0x78, 0x9d, 0x79, 0x85, 0x97, 
0x57, 0x3c, 0x43, 0x52, 0xf3, 0xdd, 0x35, 0x96, 0x55, 0xe2, 0x82, 0xa8, 0x21, 0x28, 0x50, 0xba, 
0x39, 0xa0, 0xab, 0x3d, 0xe0, 0xad, 0xe6, 0xf3, 0xc0, 0xef, 0xf2, 0xe9, 0x77, 0x49, 0x9c, 0x8b, 
0x7f, 0x86, 0x5d, 0x2a, 0x77, 0x23, 0x84, 0x19, 0x5b, 0xbf, 0x52, 0x5f, 0x7a, 0xef, 0xf6, 0x5e, 
0xd4, 0xc5, 0x8a, 0xb1, 0x80, 0x68, 0x0b, 0x78, 0x04, 0x30, 0xb5, 0x7a, 0x36, 0xe5, 0xcd, 0x36, 
0xef, 0xa5, 0xcf, 0xce, 0x8c, 0x3e, 0x41, 0x9f, 0xc4, 0xcf, 0x54, 0xae, 0x39, 0x60, 0xfa, 0x9a, 
0x20, 0x07, 0xc2, 0x18, 0x17, 0x04, 0x78, 0xde, 0xfb, 0x4c, 0x9b, 0x73, 0x84, 0xd2, 0x08, 0x7a, 
0xe7, 0x30, 0xd5, 0x1b, 0xa6, 0x5a, 0xdf, 0xae, 0x60, 0x55, 0x6e, 0xa9, 0x97, 0x52, 0x0a, 0xc7, 
0x59, 0x4a, 0xbf, 0xb8, 0xf0, 0x9e, 0xc3, 0xc9, 0xe3, 0xe3, 0x79, 0xe8, 0xe5, 0xbe, 0xdd, 0x1a, 
0xc0, 0x4d, 0x4a, 0xe1, 0x0a, 0xdd, 0xad, 0x55, 0xe5, 0x7a, 0x33, 0x0d, 0x8e, 0x4c, 0xa4, 0xbd, 
0x00, 0x4a, 0x48, 0xe9, 0x56, 0x06, 0x3a, 0xf8, 0xcb, 0x18, 0xde, 0x0c, 0x38, 0x43, 0x16, 0xe4, 
0xa1, 0xc4, 0xaa, 0xe0, 0x50, 0xb8, 0x95, 0x7b, 0xcc, 0x89, 0x18, 0xb5, 0x46, 0x7b, 0x3f, 0xab, 
0x08, 0x22, 0xf7, 0x1a, 0x1d, 0x51, 0x32, 0x05, 0x12, 0x7b, 0x14, 0x3b, 0x9e, 0x3e, 0xbb, 0xf3, 
0x97, 0xd2, 0x0a, 0xb6, 0x66, 0xa6, 0x46, 0x8f, 0x8d, 0xb7, 0xa8, 0x60, 0x83, 0x4c, 0x27, 0xc5 
	}, { 
0x0b, 0x6a, 0x3b, 0x59, 0xf9, 0x33, 0xe7, 0xcc, 0xc0, 0x96, 0xa6, 0x03, 0x15, 0xae, 0x8d, 0xd2, 
0x5e, 0xd1, 0x5e, 0xf1, 0xcd, 0xb8, 0x7e, 0x5c, 0x30, 0xf6, 0xdb, 0x19, 0x33, 0x48, 0xb0, 0x0d, 
0xb1, 0x10, 0x16, 0x9a, 0x83, 0x8f, 0x94, 0x67, 0xda, 0xed, 0x6c, 0x6d, 0xfc, 0x52, 0x6d, 0xa7, 
0xba, 0x14, 0x57, 0x49, 0x5f, 0xf5, 0x91, 0x57, 0xd7, 0xde, 0x0b, 0xef, 0x19, 0x3f, 0xa1, 0x34, 
0xd4, 0x82, 0xce, 0xe7, 0xea, 0x02, 0x28, 0xba, 0xae, 0x79, 0x33, 0x1c, 0xcf, 0xb0, 0x82, 0x71, 
0x03, 0xaa, 0x92, 0x44, 0x06, 0x33, 0xc6, 0x5d, 0x80, 0x93, 0x00, 0x80, 0x0e, 0xeb, 0x46, 0xac, 
0xfc, 0x92, 0xf0, 0x18, 0x2a, 0xae, 0xc6, 0x31, 0x62, 0xd4, 0xee, 0x36, 0xc0, 0x70, 0xe3, 0x4a, 
0x54, 0xa8, 0xc2, 0xce, 0xbf, 0xad, 0x73, 0xc0, 0x05, 0xef, 0x95, 0x86, 0x18, 0x87, 0x64, 0x5c, 
0x91, 0xe4, 0xd1, 0x05, 0xb9, 0xd5, 0xd7, 0x66, 0xe0, 0x91, 0x0b, 0x13, 0x6e, 0x0b, 0x94, 0x63, 
0x8a, 0x3a, 0xab, 0x68, 0x3f, 0x51, 0x5f, 0xde, 0xfb, 0x42, 0xb5, 0xeb, 0x54, 0xa5, 0xcb, 0xa3, 
0x24, 0x47, 0xab, 0x6b, 0x05, 0x9b, 0x3b, 0xa9, 0xd3, 0xcb, 0xf3, 0x6a, 0xf3, 0xf8, 0x5c, 0xc5, 
0x0e, 0xd1, 0xcd, 0xec, 0x31, 0xed, 0x8b, 0xb4, 0xe6, 0xc6, 0x2a, 0xdd, 0x25, 0x2d, 0xbe, 0x59, 
0x58, 0x9b, 0x91, 0x7d, 0x33, 0x3e, 0x92, 0xcd, 0x26, 0x6c, 0x67, 0x28, 0x43, 0x62, 0xc1, 0x80, 
0xbe, 0x34, 0xd9, 0x6a, 0x79, 0x3a, 0x1c, 0x60, 0x3a, 0xb1, 0x40, 0x6f, 0x67, 0x13, 0xbb, 0xe0, 
0x1f, 0x9b, 0xe8, 0xef, 0x9e, 0xbf, 0x60, 0x39, 0xe7, 0xc5, 0xb6, 0x25, 0x3e, 0x79, 0xcd, 0x92, 
0xdf, 0x5b, 0xd8, 0xf0, 0xe0, 0x37, 0xee, 0xfe, 0x21, 0xa2, 0xd3, 0xb8, 0x2a, 0xe4, 0x3c, 0x2d 
	}, { 
0xe7, 0xce, 0x59, 0x04, 0xd4, 0x90, 0xbb, 0x96, 0x2c, 0xb6, 0x07, 0x5b, 0x9d, 0xe9, 0x1d, 0x4c, 
0x8f, 0x1b, 0xf3, 0x87, 0x70, 0x1b, 0x15, 0xfd, 0x39, 0xdb, 0x63, 0xd7, 0x7b, 0xbe, 0xc5, 0x7e, 
0x30, 0x03, 0x8e, 0x7f, 0x01, 0x46, 0x69, 0x8b, 0x0e, 0xaa, 0x83, 0x35, 0x06, 0xa3, 0x90, 0x18, 
0xf8, 0x4e, 0xc3, 0x73, 0xfc, 0x3c, 0x3a, 0x34, 0x74, 0xe2, 0xb0, 0xa3, 0xab, 0xe3, 0x99, 0xb0, 
0xed, 0x9a, 0xc0, 0x01, 0x81, 0x5c, 0x27, 0xf5, 0xed, 0x30, 0xc2, 0x4a, 0xfd, 0xbb, 0x55, 0x2d, 
0xf6, 0xfd, 0xdf, 0xe0, 0x90, 0xbc, 0x84, 0x9c, 0x67, 0x43, 0x9d, 0x46, 0xcc, 0x96, 0xbe, 0xc8, 
0x1f, 0x2c, 0x97, 0x57, 0xe7, 0xd2, 0xea, 0x72, 0x93, 0x2a, 0xdf, 0x42, 0x6e, 0x92, 0x0d, 0xa7, 
0xfa, 0x92, 0xa6, 0xad, 0xe3, 0xb0, 0x03, 0x5a, 0x62, 0xd9, 0x59, 0xc9, 0x44, 0x99, 0x4b, 0x38, 
0x3c, 0x9c, 0x3d, 0xb6, 0x8f, 0x94, 0x68, 0x07, 0xcb, 0x15, 0x11, 0x40, 0xa0, 0xac, 0x6f, 0x19, 
0x31, 0x55, 0xde, 0x44, 0x4b, 0x54, 0xe6, 0xf4, 0xf4, 0x53, 0x44, 0x1b, 0x09, 0x3e, 0xc0, 0xcc, 
0x4d, 0x92, 0xe9, 0xc3, 0xe1, 0x84, 0x54, 0xe1, 0xb5, 0x2a, 0xd1, 0xaf, 0xfb, 0x6e, 0xdb, 0x12, 
0x76, 0x51, 0x3f, 0x72, 0x91, 0x4c, 0x28, 0x1a, 0x01, 0x33, 0xd5, 0x21, 0x22, 0xff, 0x21, 0x09, 
0xd3, 0x9d, 0x0d, 0x45, 0x56, 0xfa, 0x12, 0x6b, 0x62, 0xe1, 0x1e, 0xf3, 0x0c, 0xec, 0x75, 0xe8, 
0xf2, 0xe6, 0xee, 0x0e, 0x15, 0x03, 0x5e, 0xad, 0xf5, 0x76, 0xe0, 0x00, 0xc7, 0x42, 0x0f, 0xb9, 
0x10, 0x2b, 0xd2, 0x29, 0x47, 0xb7, 0x9f, 0x32, 0xf4, 0x25, 0x5e, 0x1f, 0x15, 0x66, 0xc7, 0xe5, 
0x5c, 0xe2, 0x76, 0xd3, 0x4b, 0xd9, 0x48, 0x99, 0xb4, 0x19, 0x61, 0xff, 0x14, 0x1b, 0x9e, 0x1f 
	}
}
};



static unsigned char aes2_invmixcolprod[2][4][0x100] = {
{{
0xbe, 0xc1, 0x8d, 0xfb, 0x96, 0xbf, 0x3e, 0x66, 0xda, 0x76, 0x1b, 0xb2, 0x9e, 0x37, 0xa9, 0x38, 
0xf0, 0x71, 0x63, 0x34, 0x40, 0x12, 0xcf, 0x7a, 0x08, 0xd3, 0x71, 0x2b, 0x3b, 0xe6, 0xc4, 0x70, 
0x9d, 0xf4, 0x9a, 0x5c, 0x18, 0x2a, 0x8a, 0x8e, 0xf3, 0x4e, 0x1e, 0x89, 0x5d, 0xb0, 0xec, 0x5e, 
0x9e, 0x23, 0xb3, 0x99, 0x81, 0xfe, 0x6b, 0xf0, 0xc7, 0x39, 0x31, 0x38, 0x9b, 0xa0, 0x03, 0x73, 
0xc1, 0x6f, 0x39, 0xe7, 0x17, 0x7d, 0x9c, 0x11, 0x84, 0xb6, 0x8b, 0xf1, 0xc9, 0xb4, 0xc2, 0x4a, 
0x1b, 0xbf, 0x7c, 0x51, 0x2f, 0x26, 0x19, 0x20, 0x51, 0x74, 0xd7, 0x6e, 0xa2, 0xdb, 0xe5, 0xf9, 
0x92, 0x58, 0x40, 0xd1, 0x89, 0x13, 0xab, 0x5d, 0x5d, 0xd8, 0x26, 0xf8, 0x2f, 0x79, 0x47, 0x9f, 
0x19, 0x45, 0xef, 0x73, 0x00, 0x81, 0x47, 0x66, 0x4a, 0x7c, 0x51, 0x43, 0xc9, 0x2d, 0x02, 0x2e, 
0x3d, 0x17, 0xae, 0x61, 0xf4, 0xc3, 0x22, 0xe8, 0x0c, 0x6a, 0xf9, 0x3a, 0xf0, 0x71, 0x15, 0x3e, 
0xf1, 0x30, 0x43, 0xc6, 0x8c, 0xfe, 0x87, 0x93, 0xa3, 0x23, 0x50, 0x2b, 0x39, 0xd5, 0x77, 0x42, 
0x5f, 0xd2, 0x46, 0x05, 0xc7, 0x43, 0xa2, 0x5e, 0x9a, 0xbd, 0xf8, 0x4e, 0xd5, 0x3c, 0xf2, 0x3d, 
0x38, 0xa3, 0x68, 0x84, 0x76, 0xf5, 0xea, 0x53, 0xa0, 0x2b, 0x38, 0xfa, 0x74, 0x32, 0xce, 0xdf, 
0xee, 0x89, 0xeb, 0x80, 0x37, 0x8d, 0xea, 0x45, 0xa8, 0xc6, 0xe8, 0xd0, 0x63, 0x23, 0xd5, 0x23, 
0x15, 0x1b, 0xa8, 0xea, 0x92, 0xde, 0x60, 0xfe, 0x26, 0xd4, 0xe1, 0x59, 0xbf, 0xc2, 0x11, 0x12, 
0x86, 0xbc, 0x92, 0x16, 0xe4, 0xe8, 0xef, 0x05, 0xfc, 0xbc, 0xf2, 0x55, 0x45, 0x01, 0x12, 0x13, 
0x38, 0xc6, 0xf3, 0x5b, 0x04, 0xde, 0x68, 0xf5, 0x0f, 0xc2, 0x17, 0x8e, 0x5a, 0xbe, 0x44, 0xb4 
	}, { 
0x55, 0xce, 0x51, 0xa1, 0x13, 0xc3, 0x97, 0x2d, 0x10, 0x46, 0xe0, 0x24, 0x74, 0x0a, 0x09, 0xab, 
0xe5, 0x10, 0xce, 0xfb, 0x11, 0x93, 0x0f, 0x01, 0x0e, 0x3f, 0x28, 0x8d, 0xf0, 0xba, 0xc4, 0x2d, 
0xd5, 0x5e, 0xbc, 0xed, 0x8c, 0x22, 0xb0, 0xd4, 0x74, 0x02, 0x5b, 0x18, 0xad, 0xc2, 0x8d, 0xd0, 
0xf5, 0xe3, 0x9d, 0x3c, 0x30, 0x59, 0x7a, 0x5f, 0x0a, 0x9b, 0x9f, 0xb0, 0x16, 0xed, 0x99, 0x33, 
0xa3, 0x48, 0x9f, 0x38, 0xa0, 0xb7, 0x69, 0x20, 0xf1, 0x0e, 0x17, 0x5b, 0xfb, 0x63, 0x05, 0x02, 
0x39, 0x70, 0x3b, 0xa1, 0x87, 0xb1, 0xc9, 0x71, 0x9d, 0x78, 0xec, 0xe3, 0x21, 0xbd, 0x88, 0x4d, 
0xe4, 0x5e, 0x09, 0x0b, 0x2e, 0x08, 0x6c, 0x30, 0xcf, 0x54, 0x22, 0xb3, 0xe0, 0xfd, 0x70, 0x81, 
0x60, 0x67, 0x18, 0x0a, 0x13, 0x43, 0xa7, 0x2b, 0x38, 0xd1, 0x3f, 0xb9, 0x0c, 0xf2, 0xf9, 0x7a, 
0xb4, 0x8f, 0x09, 0xe3, 0xca, 0xb1, 0x16, 0xfe, 0x79, 0xe5, 0xa5, 0x2a, 0x72, 0x7f, 0x92, 0xde, 
0xb2, 0xfd, 0x6b, 0xa3, 0x45, 0xe1, 0xd5, 0x63, 0xb5, 0x87, 0xe5, 0x43, 0xdc, 0x6b, 0xa2, 0xdd, 
0x47, 0x2b, 0xf7, 0x56, 0x1a, 0xc7, 0x96, 0xe1, 0x32, 0xe0, 0x04, 0x67, 0x45, 0xe5, 0xfd, 0x5c, 
0xb7, 0xec, 0xbc, 0x97, 0xd2, 0x05, 0xda, 0xa7, 0x0e, 0x94, 0x25, 0x49, 0x41, 0xb6, 0x25, 0x4f, 
0x12, 0xcc, 0xae, 0xa6, 0x9d, 0xf5, 0xaf, 0xc9, 0x40, 0xa9, 0x94, 0xad, 0x8d, 0xf6, 0x96, 0x2f, 
0x3b, 0xb3, 0x16, 0xb1, 0x59, 0xd7, 0x9f, 0xcd, 0xfe, 0xc5, 0xac, 0xe4, 0x3a, 0xef, 0xee, 0x1a, 
0x38, 0x7a, 0xa6, 0xdf, 0x66, 0x05, 0xc6, 0xe3, 0xf7, 0xeb, 0xa7, 0xa8, 0xa8, 0xde, 0xc3, 0x22, 
0x87, 0x38, 0x15, 0xd0, 0xd2, 0x96, 0xeb, 0x34, 0x8c, 0xf4, 0x84, 0x6c, 0x50, 0xb1, 0x30, 0xf4 
	}, { 
0xd7, 0xfa, 0x6a, 0xc3, 0xd4, 0xa7, 0xc8, 0x8c, 0x0b, 0xb8, 0x54, 0xeb, 0xb0, 0x17, 0xec, 0x4d, 
0x29, 0x5b, 0x7f, 0x1e, 0x8f, 0xdc, 0x62, 0x12, 0x12, 0x92, 0xf7, 0x1e, 0xa9, 0x55, 0x8a, 0xf9, 
0x98, 0x93, 0xcc, 0xcd, 0xab, 0x78, 0x0a, 0xe4, 0xbe, 0x51, 0xf7, 0x84, 0x41, 0x95, 0x32, 0x93, 
0x04, 0xc4, 0x3f, 0x5b, 0xda, 0x43, 0xb5, 0x90, 0xaa, 0xa2, 0x94, 0xe4, 0x3d, 0xae, 0x63, 0x0d, 
0xaa, 0x04, 0x48, 0x62, 0xff, 0x79, 0xfd, 0xc8, 0xef, 0x81, 0x84, 0xf4, 0xc9, 0xf1, 0x52, 0x26, 
0x20, 0xda, 0xe2, 0x78, 0xd6, 0x5f, 0xbc, 0xa8, 0x58, 0xa7, 0xea, 0x7a, 0x5f, 0xa8, 0x94, 0x18, 
0x36, 0x73, 0x8b, 0xf6, 0x02, 0x2c, 0x91, 0x41, 0x02, 0x25, 0x4f, 0x96, 0xd0, 0xc3, 0x68, 0xe9, 
0x38, 0xdd, 0x54, 0x64, 0xb6, 0xdf, 0x80, 0xdb, 0x23, 0xda, 0xe9, 0xb5, 0xd6, 0x9f, 0xb9, 0x26, 
0xc2, 0x2d, 0xae, 0xa9, 0x5e, 0xbf, 0x91, 0x31, 0xe3, 0xbe, 0x97, 0x5e, 0xe1, 0xa0, 0xb2, 0x2c, 
0x50, 0xbf, 0x59, 0xf4, 0x56, 0xaf, 0x2a, 0x56, 0xbf, 0xaf, 0xec, 0x85, 0xf4, 0xd4, 0xf5, 0xc3, 
0xef, 0x6a, 0xb3, 0xed, 0xa8, 0x58, 0xa3, 0x52, 0x42, 0xa5, 0x98, 0xba, 0x6e, 0xc8, 0x4c, 0x65, 
0x4b, 0x58, 0xe0, 0x96, 0xf5, 0xd7, 0xaa, 0xfd, 0x30, 0xc9, 0xfe, 0x60, 0xa2, 0x08, 0xe9, 0xd5, 
0xda, 0xb2, 0xa4, 0xf4, 0x9c, 0x4e, 0x50, 0x45, 0xd5, 0xf9, 0x38, 0x49, 0x65, 0x8e, 0xc9, 0xbd, 
0x66, 0x22, 0x0a, 0xde, 0xbe, 0xcb, 0x86, 0xaf, 0xf3, 0x01, 0xd4, 0x5e, 0x2e, 0x04, 0x01, 0xf3, 
0xd8, 0x74, 0x1e, 0x55, 0x8f, 0xf8, 0x39, 0xdd, 0xed, 0x23, 0xdb, 0xae, 0x6e, 0xa3, 0x2c, 0xc8, 
0xb6, 0x82, 0x80, 0xcb, 0x14, 0x50, 0xdf, 0x20, 0xff, 0x5b, 0x45, 0x06, 0x53, 0xc5, 0x4c, 0x84 
	}, { 
0x63, 0xb7, 0x0b, 0x68, 0x80, 0x47, 0x39, 0xcc, 0xb2, 0x40, 0x07, 0x3f, 0xcc, 0x48, 0x8f, 0xdd, 
0x13, 0x61, 0x60, 0x44, 0xc7, 0xda, 0xdb, 0x44, 0x53, 0x11, 0x6e, 0x6c, 0xac, 0xf7, 0x14, 0xaf, 
0x24, 0xb7, 0x9b, 0x3f, 0x0c, 0xb2, 0x5f, 0xa6, 0x47, 0xc6, 0xdb, 0x91, 0x0b, 0x57, 0xd5, 0xf8, 
0xac, 0x9a, 0x79, 0xe3, 0x7d, 0x45, 0xe3, 0xc2, 0xde, 0x03, 0x60, 0x96, 0xda, 0x8a, 0xb6, 0x66, 
0x81, 0x68, 0x02, 0xfe, 0x95, 0x76, 0x0d, 0xa3, 0x41, 0x49, 0x06, 0x85, 0x01, 0x8d, 0x33, 0xf6, 
0x88, 0x56, 0x2c, 0x90, 0xff, 0xfb, 0xa5, 0x63, 0xb0, 0x0b, 0xee, 0x9f, 0xb8, 0x8f, 0x10, 0xbe, 
0x87, 0xc5, 0x8b, 0xba, 0xa7, 0x1b, 0xff, 0x4a, 0x93, 0xef, 0x14, 0x86, 0x95, 0x5f, 0xf6, 0x8d, 
0xd2, 0xc6, 0x7f, 0x50, 0x78, 0x8f, 0xe1, 0x38, 0x2d, 0x68, 0xe3, 0x90, 0xf8, 0xc1, 0x65, 0xa6, 
0x68, 0xc5, 0xbb, 0x96, 0x26, 0xda, 0x55, 0xdd, 0x9f, 0x22, 0xf9, 0x49, 0xfd, 0x1c, 0xbb, 0xc2, 
0xc0, 0x98, 0x51, 0x14, 0x24, 0x4c, 0x3a, 0xc9, 0xb8, 0xc6, 0x77, 0x25, 0xad, 0x67, 0xad, 0x9f, 
0x8d, 0xbf, 0x75, 0xff, 0x57, 0x88, 0x04, 0xa1, 0xc3, 0x12, 0xc0, 0x65, 0xc2, 0xb5, 0x8c, 0x6e, 
0x47, 0x4e, 0x34, 0x37, 0x7e, 0xf8, 0x05, 0xe5, 0x4a, 0x64, 0xa1, 0xa9, 0xf5, 0x7e, 0xa3, 0x35, 
0x80, 0x96, 0x2f, 0x63, 0x4c, 0x58, 0xb7, 0xd7, 0x69, 0xb6, 0x59, 0x3b, 0x32, 0xce, 0x05, 0x58, 
0x6c, 0xa8, 0x09, 0x76, 0x42, 0x4f, 0x64, 0x35, 0x58, 0x13, 0xd6, 0x89, 0x60, 0xff, 0xc8, 0xc5, 
0x1f, 0x1e, 0x4e, 0x8d, 0x94, 0xf4, 0x52, 0xda, 0x1b, 0xff, 0x50, 0xd0, 0x17, 0x65, 0x4f, 0x0d, 
0x86, 0x8d, 0x31, 0x96, 0x45, 0xf2, 0x75, 0xaf, 0xa3, 0x50, 0xcf, 0xc4, 0x8f, 0xfb, 0xa6, 0x0a 
	}
},{
	{
0xb8, 0xea, 0xe5, 0x63, 0xae, 0xbc, 0x07, 0x2b, 0xe9, 0x5f, 0xec, 0xe3, 0xaa, 0xcd, 0x52, 0x07, 
0xc4, 0xaa, 0x0b, 0x18, 0x5b, 0x11, 0x33, 0xef, 0x98, 0x89, 0xb7, 0x88, 0xcf, 0xc5, 0x2f, 0x5a, 
0x32, 0x46, 0x56, 0x83, 0xbf, 0x37, 0xfb, 0xb8, 0xa8, 0xef, 0xe8, 0x51, 0xd9, 0x1a, 0x49, 0x58, 
0xac, 0x8d, 0x75, 0x65, 0x72, 0x62, 0x60, 0x7a, 0xf3, 0x44, 0xd0, 0xb5, 0xf7, 0xc4, 0xfe, 0x2f, 
0xcd, 0xa1, 0x22, 0x35, 0xa8, 0xb8, 0xfc, 0x77, 0xd1, 0xf1, 0x6d, 0x8a, 0x86, 0xe9, 0x24, 0x15, 
0x37, 0x01, 0xdf, 0x46, 0xb4, 0xbd, 0xe7, 0x6b, 0xe8, 0xdf, 0x15, 0xb6, 0x6d, 0x7d, 0xa9, 0x0a, 
0xfc, 0x4c, 0x63, 0x42, 0x63, 0x58, 0x90, 0x99, 0x48, 0xdd, 0xc4, 0xbb, 0x41, 0x67, 0x8b, 0x62, 
0xb7, 0x62, 0xbf, 0xb3, 0xd8, 0x59, 0x31, 0xe9, 0xef, 0x70, 0xf2, 0x3e, 0x92, 0xab, 0x53, 0x25, 
0x9d, 0x2e, 0x36, 0xf6, 0x95, 0x2d, 0x10, 0x90, 0x34, 0xe7, 0xf0, 0x57, 0x8c, 0xd3, 0x9c, 0xa5, 
0x28, 0xd1, 0x15, 0xd8, 0x71, 0x50, 0x30, 0x73, 0x28, 0xf3, 0x7f, 0x8d, 0x84, 0x4d, 0xbb, 0xa0, 
0x43, 0x4f, 0xcd, 0x33, 0x42, 0xb4, 0xdb, 0x7c, 0x85, 0xe9, 0x7f, 0xa5, 0x64, 0xa6, 0xfb, 0x67, 
0x49, 0x61, 0x6e, 0x94, 0x44, 0x95, 0xa8, 0x30, 0x80, 0xb9, 0x64, 0x23, 0xff, 0x5c, 0x5a, 0x30, 
0x47, 0x4e, 0xe2, 0x18, 0x5f, 0x6d, 0xd7, 0xdf, 0x21, 0xa2, 0xf8, 0xe2, 0x2e, 0xf6, 0x74, 0xc9, 
0xb5, 0x94, 0x3e, 0xf5, 0x2c, 0xb1, 0xa9, 0x60, 0xde, 0x23, 0xcb, 0xe7, 0x7a, 0x4f, 0x1e, 0xb8, 
0x6a, 0xd4, 0xfd, 0xf5, 0x26, 0x75, 0x01, 0xe2, 0x53, 0x17, 0x08, 0xc5, 0x57, 0x30, 0x21, 0xad, 
0xee, 0xda, 0x6c, 0xc4, 0x5a, 0xbe, 0x40, 0x7e, 0x8a, 0x31, 0x95, 0x56, 0x4b, 0x87, 0x95, 0x5f 
	}, { 
0x3b, 0xe1, 0x32, 0xe3, 0xcb, 0x83, 0xb6, 0xbc, 0xe5, 0x40, 0x94, 0xae, 0x46, 0x1d, 0xb7, 0xd3, 
0xa9, 0x4d, 0x9c, 0x86, 0xb9, 0x33, 0xf9, 0x8d, 0x41, 0xac, 0xf4, 0x77, 0x65, 0xc4, 0x68, 0x82, 
0x01, 0xa1, 0xf3, 0xca, 0xc1, 0x6f, 0x37, 0x5d, 0x7d, 0xa9, 0xf4, 0xc2, 0xbc, 0x0b, 0xcc, 0x71, 
0xa1, 0xa1, 0x44, 0xaf, 0x03, 0x5c, 0xa9, 0xcb, 0xbc, 0x22, 0x81, 0x43, 0xde, 0x18, 0x1d, 0x34, 
0x60, 0xcd, 0xfb, 0x1d, 0xa3, 0x70, 0xe9, 0xe3, 0x37, 0x92, 0x31, 0x88, 0x86, 0x72, 0x01, 0x42, 
0xcc, 0xb0, 0x11, 0xbf, 0xb9, 0x63, 0x26, 0x19, 0x55, 0x06, 0x38, 0x4c, 0x92, 0x84, 0xe7, 0xeb, 
0xea, 0xd8, 0x05, 0x12, 0xce, 0xea, 0x20, 0x74, 0x89, 0x8e, 0xc5, 0x08, 0xa8, 0xe1, 0x1b, 0x36, 
0x5e, 0xfe, 0xd5, 0x01, 0x94, 0x8e, 0x88, 0xf8, 0x3c, 0x4e, 0x94, 0xc2, 0xeb, 0x04, 0x64, 0xf3, 
0x90, 0xf3, 0x36, 0xc0, 0xff, 0x32, 0xa1, 0x74, 0xd5, 0x0c, 0x59, 0x19, 0x62, 0x24, 0x37, 0x1e, 
0xaf, 0x99, 0xc2, 0xa5, 0xe7, 0x24, 0x57, 0x8b, 0xe9, 0x29, 0xa7, 0x59, 0x5b, 0x96, 0x24, 0x16, 
0x7a, 0x4d, 0xbc, 0x77, 0xda, 0x2c, 0x9e, 0xc5, 0xaa, 0x91, 0xf9, 0xfb, 0x07, 0x20, 0x17, 0x53, 
0x16, 0x29, 0x19, 0x4d, 0x84, 0x4b, 0x40, 0x61, 0x34, 0x95, 0x0e, 0x92, 0x79, 0x6d, 0x90, 0x8f, 
0xcf, 0x7d, 0xf5, 0xca, 0xb7, 0x0d, 0x11, 0x03, 0xb7, 0xc5, 0xfd, 0x15, 0x82, 0x32, 0x59, 0xa8, 
0x4d, 0x3d, 0xe5, 0x29, 0x3d, 0x7f, 0xd6, 0xe1, 0xec, 0xc0, 0x6d, 0xc9, 0xae, 0x09, 0x8e, 0x5a, 
0xef, 0x64, 0x5d, 0x93, 0x05, 0xcc, 0xda, 0xca, 0x40, 0x7e, 0xf9, 0x6a, 0xe8, 0xf6, 0x60, 0x6d, 
0xcd, 0xc9, 0xb3, 0xe1, 0x2a, 0xa7, 0x05, 0x61, 0x35, 0x67, 0xcd, 0x29, 0x52, 0x26, 0x31, 0xf7 
	}, { 
0x57, 0x7b, 0x66, 0xed, 0xa1, 0xc3, 0x8a, 0x53, 0x31, 0x6a, 0x27, 0x79, 0x1a, 0xd1, 0x88, 0xed, 
0x48, 0x51, 0xf7, 0xb4, 0xac, 0xeb, 0x2d, 0x85, 0xa4, 0x09, 0x48, 0x99, 0xe2, 0x7c, 0xcd, 0xfe, 
0xef, 0x4b, 0xd2, 0x18, 0x2f, 0x30, 0xfd, 0x03, 0x53, 0x3e, 0xd6, 0x33, 0x23, 0x8f, 0x69, 0xc8, 
0xd2, 0xd0, 0x5d, 0xb8, 0x8f, 0x2d, 0xc1, 0xf1, 0x24, 0xec, 0x61, 0xea, 0xd5, 0x3e, 0xbc, 0xfd, 
0xe8, 0x14, 0x83, 0xb0, 0xfe, 0x0a, 0xe4, 0x0a, 0x5a, 0xb9, 0x2b, 0xcc, 0xa2, 0xc0, 0xd7, 0xa9, 
0x52, 0x7e, 0x6f, 0xeb, 0x76, 0x41, 0x1c, 0x31, 0xa9, 0x5b, 0x7d, 0xc8, 0x11, 0x64, 0xbe, 0xd4, 
0xcf, 0x16, 0x94, 0x81, 0x6d, 0x14, 0xa5, 0xf5, 0x59, 0x2a, 0xc6, 0xac, 0x8f, 0x99, 0x6b, 0xf3, 
0xc1, 0x21, 0xd3, 0xca, 0xe5, 0x71, 0x92, 0xa7, 0xd7, 0x51, 0x18, 0x29, 0x52, 0xf3, 0x23, 0x2e, 
0xee, 0x4a, 0xcf, 0x65, 0x18, 0xb4, 0x7f, 0x27, 0x8c, 0x5b, 0xf4, 0xf7, 0x84, 0xd5, 0xf3, 0x9e, 
0x77, 0x37, 0x62, 0x05, 0x82, 0x52, 0x8b, 0x3c, 0x0c, 0xad, 0x03, 0x76, 0x14, 0xca, 0x05, 0x47, 
0x03, 0x98, 0x3d, 0x8e, 0x05, 0xb2, 0x55, 0xfb, 0xbd, 0xaf, 0x84, 0xe5, 0x55, 0xbe, 0xc0, 0x7a, 
0x75, 0xcb, 0x1b, 0x31, 0x73, 0xb8, 0x34, 0x4d, 0xd4, 0x58, 0x38, 0x19, 0xbd, 0xfe, 0x19, 0x6a, 
0x65, 0x8b, 0x21, 0xff, 0xf1, 0x74, 0xd6, 0x22, 0xac, 0x90, 0x4c, 0x34, 0x4f, 0xf7, 0xe1, 0xd9, 
0xcc, 0xf1, 0x0c, 0x9a, 0x5f, 0x37, 0xfe, 0xa4, 0x8f, 0x36, 0xa3, 0xce, 0x36, 0x81, 0x38, 0xb4, 
0x96, 0xa3, 0x52, 0xf9, 0x02, 0x62, 0xee, 0xde, 0x8c, 0xbe, 0xeb, 0x8a, 0x5f, 0xcb, 0x8f, 0x3a, 
0x6b, 0x70, 0x88, 0x98, 0x26, 0x5c, 0x7f, 0xa0, 0x06, 0xcc, 0x7a, 0x12, 0xbc, 0xb1, 0x0b, 0xad
	}, { 
0xac, 0xa6, 0xbe, 0x0c, 0x4b, 0x5f, 0x69, 0x5f, 0x33, 0x68, 0x25, 0x92, 0xd7, 0xdd, 0x30, 0x1f, 
0xda, 0x7d, 0x82, 0xbf, 0x35, 0xdf, 0x9a, 0x66, 0xe5, 0xb5, 0x96, 0x70, 0x2d, 0xd1, 0xd1, 0x6a, 
0xa4, 0x47, 0xb1, 0x22, 0xf4, 0x5e, 0x3f, 0x46, 0xa6, 0x9e, 0x21, 0x63, 0xfc, 0x4f, 0x3c, 0x29, 
0x37, 0xf6, 0xe9, 0x9d, 0xd5, 0x1f, 0x00, 0x32, 0x39, 0x8a, 0xb5, 0x39, 0x71, 0x18, 0x94, 0xce, 
0xc1, 0x8d, 0x08, 0xd6, 0x8c, 0xa7, 0x9d, 0x7c, 0xa5, 0x4f, 0xea, 0x39, 0x17, 0x49, 0x05, 0xc4, 
0xa5, 0x0e, 0x50, 0xd0, 0xc4, 0x88, 0xa7, 0xc8, 0x30, 0x11, 0x20, 0xba, 0xd2, 0x11, 0x0b, 0x2f, 
0xf3, 0x77, 0x19, 0x7d, 0xe9, 0x27, 0xf4, 0x6e, 0xdf, 0x77, 0xae, 0xe7, 0xdd, 0xe3, 0x59, 0x5e, 
0x7e, 0x6a, 0x3d, 0x11, 0x6e, 0x81, 0x80, 0x8e, 0xc3, 0xeb, 0xfb, 0x42, 0xbf, 0x36, 0x66, 0x2f, 
0xe5, 0x1f, 0x6a, 0x32, 0xa8, 0x47, 0x3e, 0xc9, 0x32, 0x5a, 0x4e, 0x5f, 0x36, 0xf0, 0x49, 0xe8, 
0xe0, 0x22, 0xa6, 0xc4, 0x6a, 0x7c, 0x2d, 0xce, 0x99, 0x45, 0x0b, 0x72, 0x63, 0x25, 0x5e, 0x30, 
0x31, 0xd1, 0x32, 0x6a, 0x29, 0xbe, 0x5c, 0xfc, 0x57, 0x04, 0x79, 0xcb, 0xa1, 0x2a, 0x35, 0x56, 
0xf2, 0x7a, 0x46, 0x09, 0x46, 0x7b, 0xb8, 0x75, 0x4e, 0x32, 0xc9, 0x30, 0xec, 0xb4, 0x40, 0x28, 
0x23, 0x72, 0xf6, 0x16, 0x0b, 0x0b, 0x51, 0xc3, 0x68, 0x84, 0x07, 0x40, 0x5f, 0x97, 0x5a, 0xb5, 
0x7a, 0x98, 0xeb, 0x83, 0xc2, 0x8d, 0xd3, 0x22, 0x40, 0xe0, 0x05, 0x1a, 0x6c, 0xf4, 0xfe, 0x5c, 
0x8f, 0x72, 0x8c, 0xf1, 0xd4, 0x70, 0x33, 0x96, 0xf6, 0x09, 0x63, 0x3c, 0xa3, 0x8c, 0x91, 0x1d, 
0x2f, 0x65, 0xbf, 0xe2, 0xe1, 0xa1, 0xd3, 0x4b, 0xef, 0xbf, 0x64, 0xdd, 0x47, 0x4b, 0x09, 0x49
  	}
}
};


/* AES2 tables */
/* transformation A and D */
static unsigned char AES2_LUT1[2][0x100] = {
{
0x08, 0x7d, 0x5e, 0x1b, 0x7e, 0x2d, 0x56, 0x26, 0xa4, 0x2c, 0x57, 0x98, 0xb7, 0xf4, 0x2f, 0xf8, 
0x8d, 0x63, 0x54, 0xe3, 0x1e, 0xe9, 0xb9, 0xd2, 0x15, 0xc6, 0xec, 0x64, 0x7c, 0x81, 0x67, 0x15, 
0x7f, 0x92, 0x5c, 0x66, 0xe3, 0xb6, 0xc1, 0xd4, 0x4d, 0x26, 0x09, 0x7c, 0x26, 0x1c, 0xfa, 0x1a, 
0xbb, 0x1f, 0xbb, 0x20, 0xa9, 0xc1, 0x8e, 0x95, 0x5c, 0xc9, 0x4d, 0x8c, 0xb7, 0x6d, 0xcd, 0x82, 
0xe8, 0x4a, 0x9e, 0x80, 0x1f, 0x06, 0xf7, 0x32, 0x36, 0xf8, 0xe4, 0x58, 0x8a, 0xae, 0x3a, 0x8e, 
0xc0, 0x0f, 0x55, 0x82, 0x84, 0xb4, 0x4a, 0xda, 0x03, 0x05, 0x7f, 0x22, 0x42, 0x36, 0x6c, 0x05, 
0x61, 0xe2, 0x6f, 0x42, 0xd2, 0x4f, 0xbd, 0x5d, 0xa2, 0x18, 0x94, 0xd6, 0x2a, 0x53, 0x5e, 0x39, 
0x49, 0x16, 0xb9, 0x58, 0xe9, 0xbc, 0xd2, 0x8e, 0x6d, 0x76, 0xaf, 0x32, 0xe4, 0x14, 0x62, 0xe3, 
0x94, 0x40, 0x1e, 0x09, 0xd6, 0x9d, 0x22, 0x30, 0x7c, 0xdd, 0x0a, 0x5a, 0x30, 0x68, 0xf9, 0xa7, 
0x10, 0x57, 0x16, 0xfe, 0xce, 0x82, 0x23, 0x96, 0x58, 0x6d, 0x5a, 0xd9, 0xef, 0xe9, 0x03, 0x69, 
0x5e, 0x3f, 0x40, 0x19, 0xf6, 0x14, 0x3d, 0x96, 0xe1, 0x82, 0x05, 0x43, 0xbb, 0x40, 0x4e, 0xce, 
0x64, 0x94, 0xbe, 0xda, 0x1f, 0xf4, 0x7b, 0xf9, 0x75, 0x88, 0xfb, 0x2a, 0xe9, 0x02, 0x4d, 0x32, 
0x9d, 0x14, 0xbb, 0xe0, 0xed, 0x64, 0xa5, 0x13, 0xcb, 0xb5, 0xa0, 0x98, 0xb1, 0xe0, 0x5e, 0x24, 
0x5c, 0xbd, 0x60, 0x63, 0xeb, 0x9b, 0x3c, 0x9e, 0x84, 0x46, 0xe2, 0x5b, 0xa6, 0x33, 0x17, 0xe2, 
0xb8, 0x51, 0x2c, 0x26, 0x82, 0x09, 0x56, 0x64, 0x31, 0xec, 0x8d, 0x09, 0xa9, 0x57, 0x5c, 0xbe, 
0x3b, 0x91, 0x61, 0x35, 0xfc, 0x57, 0xbb, 0xd3, 0x1c, 0xa9, 0xd8, 0xf9, 0x84, 0x19, 0x4c, 0x42 
},{
0x49, 0x83, 0xa9, 0xab, 0x23, 0xba, 0xc8, 0x28, 0x04, 0xaa, 0x79, 0x67, 0x40, 0x15, 0xbe, 0x67, 
0xc4, 0xe1, 0xad, 0x44, 0xe2, 0xac, 0x05, 0x19, 0x89, 0x59, 0x35, 0xcd, 0x7e, 0x00, 0x8a, 0x4e, 
0x0b, 0xc6, 0x2c, 0xbf, 0xd9, 0xd5, 0x1b, 0x89, 0x50, 0x05, 0xf7, 0x96, 0x87, 0x2d, 0x10, 0xed, 
0x33, 0x07, 0xf6, 0xf2, 0x7f, 0x2a, 0x4f, 0xe5, 0x8d, 0x9d, 0xd3, 0x7b, 0x92, 0xa4, 0xb6, 0x96, 
0xeb, 0xc0, 0x30, 0x24, 0x01, 0x6b, 0xfe, 0xd3, 0x19, 0x8b, 0x52, 0xb8, 0x50, 0x2e, 0x0d, 0x24, 
0xed, 0x3f, 0x7d, 0x42, 0x76, 0x6c, 0x8b, 0x22, 0xb2, 0x88, 0x81, 0x90, 0x62, 0x82, 0xc4, 0x39, 
0xc1, 0xa2, 0x8c, 0x21, 0x7b, 0x13, 0xc2, 0x0a, 0x5c, 0xec, 0x95, 0x85, 0x08, 0x2f, 0x0f, 0x1f, 
0x80, 0xa2, 0x2a, 0x26, 0x98, 0xb5, 0xde, 0xd6, 0x26, 0x1e, 0x15, 0x78, 0xca, 0x4b, 0xa1, 0x27, 
0x42, 0x2a, 0x78, 0xbf, 0x76, 0x3c, 0x18, 0x81, 0x67, 0x27, 0x80, 0x39, 0x93, 0x64, 0x4e, 0x44, 
0xb2, 0xeb, 0xc2, 0xc5, 0x94, 0xa8, 0xac, 0x01, 0xbf, 0xcd, 0x87, 0x6f, 0xfb, 0x50, 0x2c, 0x15, 
0x3c, 0x7d, 0x50, 0xab, 0x04, 0x84, 0x4a, 0x41, 0xbe, 0x98, 0x68, 0x88, 0x97, 0x57, 0x34, 0x69, 
0x5c, 0x2e, 0x50, 0x44, 0x50, 0x91, 0x23, 0x95, 0x60, 0x45, 0x1a, 0x87, 0x07, 0x16, 0x4e, 0x98, 
0x4b, 0x99, 0xf1, 0xdb, 0xbe, 0x6d, 0x52, 0xb5, 0xfc, 0x6e, 0xe9, 0x47, 0x41, 0x54, 0xda, 0x4a, 
0xd4, 0xf8, 0x37, 0x25, 0x73, 0xf6, 0x6f, 0x1f, 0x69, 0xe3, 0xe0, 0x8a, 0x0b, 0x72, 0x7f, 0x4c, 
0x60, 0x82, 0xb2, 0x28, 0x89, 0x64, 0x51, 0x65, 0xd7, 0x85, 0x62, 0x50, 0x83, 0x61, 0x7d, 0xc5, 
0x20, 0xdf, 0x28, 0x4d, 0x2e, 0xf6, 0x61, 0x30, 0x2b, 0x75, 0xcd, 0x4a, 0x70, 0x99, 0xe8, 0xd1
}
};

/* transformation A^(-1) and D^ (-1)*/
static unsigned char AES2_LUT2[2][0x100] = {
{
0x57, 0x87, 0x08, 0x48, 0xce, 0x1f, 0x07, 0x91, 0xd4, 0xa6, 0xe4, 0x1c, 0x2d, 0x99, 0xb2, 0x9e, 
0x32, 0x0f, 0x42, 0x96, 0x9d, 0x05, 0xda, 0x2c, 0xd5, 0x46, 0x57, 0xf7, 0xaf, 0x33, 0xd9, 0x92, 
0x9a, 0xb8, 0x93, 0x88, 0x3b, 0x49, 0xb2, 0x13, 0x2d, 0x52, 0x0f, 0xc5, 0x80, 0x29, 0x93, 0x02, 
0xa3, 0xd0, 0x08, 0x07, 0x1c, 0x6b, 0xb0, 0x4c, 0xb4, 0xc1, 0xbb, 0x51, 0x4e, 0xfc, 0x37, 0xda, 
0xba, 0x96, 0xc7, 0x0e, 0xa9, 0x0d, 0xd6, 0xff, 0xfa, 0xe0, 0xf6, 0xde, 0x99, 0xba, 0xa7, 0x68, 
0x37, 0x8c, 0x7a, 0xba, 0x0f, 0xcb, 0x67, 0x0d, 0xf6, 0xc6, 0x73, 0x28, 0xc3, 0x09, 0xe4, 0x4d, 
0x26, 0x59, 0x0a, 0x27, 0x02, 0x6e, 0x79, 0xc7, 0x88, 0xf4, 0xaf, 0xf7, 0x78, 0xb0, 0xee, 0x2e, 
0x91, 0x26, 0xab, 0x0f, 0xc6, 0xb0, 0x2e, 0xd9, 0x2b, 0x17, 0xe8, 0x29, 0x1d, 0xa5, 0xbf, 0xf3, 
0xa6, 0x91, 0x55, 0x4e, 0x12, 0x1e, 0x5f, 0xc2, 0x93, 0x39, 0x2a, 0xb3, 0x11, 0x46, 0xcf, 0xc5, 
0x3b, 0x5f, 0x7e, 0x8d, 0xf8, 0xc2, 0x95, 0x55, 0x12, 0xdf, 0xdb, 0x0f, 0x7a, 0xab, 0x69, 0xd6, 
0x38, 0x8e, 0x70, 0x69, 0x1c, 0xab, 0x55, 0x9f, 0x9f, 0x0c, 0xe0, 0x32, 0x88, 0xcf, 0x25, 0xef, 
0x08, 0x9b, 0x7a, 0xd6, 0xba, 0xa6, 0x98, 0xe2, 0xc6, 0x1a, 0xe5, 0xfe, 0x43, 0xbe, 0x30, 0x1e, 
0x05, 0xfe, 0x4b, 0x23, 0xa2, 0x2b, 0xcf, 0x3a, 0x18, 0x5c, 0x6a, 0x91, 0xe5, 0x12, 0xda, 0xdd, 
0xb1, 0x8a, 0x11, 0x1d, 0x75, 0xbd, 0x37, 0x78, 0x42, 0x63, 0x58, 0x25, 0xcb, 0x61, 0x87, 0x12, 
0x09, 0xe1, 0x9d, 0xe6, 0x5a, 0x69, 0x4a, 0xf6, 0xa6, 0x0a, 0x81, 0x92, 0x75, 0x3a, 0x27, 0xe1, 
0x92, 0xb8, 0x39, 0x32, 0x93, 0xe0, 0x46, 0x14, 0xb2, 0xb2, 0xbc, 0xfb, 0x0e, 0x62, 0xc9, 0x5f 
},{
0x70, 0x7f, 0x7e, 0x22, 0xd2, 0x10, 0xe3, 0xd6, 0x20, 0x8a, 0xa5, 0x5b, 0x70, 0x09, 0x99, 0x4c, 
0x15, 0x83, 0x57, 0xb7, 0x86, 0xf3, 0x73, 0x35, 0x13, 0x80, 0x9c, 0x02, 0xc4, 0x9e, 0xaa, 0xc6, 
0x3c, 0x0b, 0xe3, 0xc4, 0x48, 0xdd, 0xbb, 0x99, 0x41, 0x57, 0xe9, 0x84, 0xb5, 0x9f, 0xc6, 0xbb, 
0x7b, 0xbd, 0x9c, 0xd3, 0xc1, 0x2e, 0x96, 0x58, 0x8e, 0x35, 0x9f, 0x84, 0xdc, 0xae, 0xf5, 0x44, 
0xb8, 0x04, 0x34, 0x34, 0x6c, 0x29, 0x45, 0xea, 0x7d, 0x66, 0xfd, 0xa3, 0x48, 0x11, 0x05, 0xce, 
0xdc, 0x7b, 0x44, 0x24, 0x87, 0x58, 0x8b, 0xcd, 0xd8, 0x6f, 0x81, 0xbb, 0x5c, 0x1c, 0x1f, 0x44, 
0xcb, 0x3d, 0xe6, 0xfb, 0xab, 0x2c, 0x2e, 0x05, 0xbb, 0x50, 0x9b, 0x99, 0x20, 0xbf, 0x4b, 0xa2, 
0x94, 0x90, 0x36, 0xdf, 0xbc, 0xc7, 0x6b, 0x2e, 0xb3, 0x7e, 0x80, 0xbb, 0x86, 0xc0, 0xc3, 0x38, 
0xdf, 0x9c, 0xb4, 0x3b, 0x4c, 0xa3, 0x08, 0xd8, 0xcf, 0x84, 0x5d, 0x6d, 0xef, 0xcf, 0xcc, 0x37, 
0x0e, 0xad, 0x31, 0x8f, 0x9a, 0x5a, 0xce, 0x41, 0x02, 0x7d, 0xce, 0x96, 0x5a, 0x66, 0x4d, 0xfa, 
0x82, 0x4d, 0xc7, 0x69, 0x6a, 0xdf, 0x48, 0xb8, 0xa1, 0x6b, 0x1a, 0xd6, 0x4d, 0x77, 0x5c, 0xc3, 
0x33, 0x37, 0x2f, 0x5a, 0x56, 0xf0, 0xa5, 0xf6, 0x92, 0xa9, 0x85, 0xad, 0x81, 0xf7, 0x1b, 0xed, 
0x31, 0x2f, 0x41, 0xeb, 0x09, 0xef, 0x8b, 0x6c, 0xef, 0xa9, 0x4c, 0xf0, 0xb2, 0x29, 0x1c, 0x1b, 
0x0c, 0xca, 0xb8, 0x45, 0x8c, 0xc0, 0xc4, 0x82, 0x74, 0x68, 0x19, 0xe2, 0x1e, 0xe3, 0xc2, 0x8f, 
0xef, 0x34, 0xa5, 0x6a, 0xf2, 0x52, 0x0e, 0xfe, 0x4e, 0x76, 0x4d, 0x19, 0xa2, 0x5c, 0xcc, 0xee, 
0xe8, 0xc8, 0x1a, 0xdd, 0x56, 0x5b, 0x44, 0x63, 0xf3, 0x27, 0x8c, 0xbe, 0xae, 0xde, 0xf3, 0x94
}
};


/* transformed SBox, transformations A and D */
static unsigned char AES2_Sprime[2][0x100] = {
{
0x33, 0x90, 0xfd, 0x0b, 0x04, 0xc5, 0xbe, 0xb3, 0x34, 0x25, 0xac, 0xc5, 0x0a, 0x48, 0xa8, 0x66, 
0xe4, 0x10, 0xc8, 0xbb, 0xd0, 0x06, 0x43, 0x36, 0xb9, 0x3a, 0x6c, 0x53, 0x88, 0xce, 0x8f, 0xd8, 
0x7f, 0x0f, 0x14, 0xbd, 0x65, 0x3a, 0xd0, 0x9c, 0xdb, 0xa6, 0xcb, 0x2e, 0x76, 0x73, 0xed, 0xd9, 
0x88, 0x43, 0xe6, 0xa4, 0x5a, 0x13, 0xa6, 0x34, 0xd1, 0xcc, 0x9a, 0x0a, 0xcc, 0x0b, 0x1d, 0x1a, 
0x92, 0xb3, 0x12, 0x03, 0xe1, 0x65, 0xc3, 0x3b, 0xec, 0x3b, 0x62, 0xe5, 0xf3, 0xa1, 0x43, 0x97, 
0xd7, 0xc8, 0xaf, 0x33, 0x62, 0x8e, 0x51, 0x9e, 0xad, 0xe1, 0x26, 0x33, 0x1f, 0xdb, 0x1b, 0xd7, 
0x1c, 0x2b, 0x79, 0xed, 0xd9, 0xbf, 0x23, 0x36, 0x32, 0xb8, 0x83, 0x99, 0x80, 0x97, 0x7e, 0xa3, 
0x45, 0x26, 0xec, 0x76, 0x60, 0x93, 0x0e, 0xf5, 0xcf, 0x19, 0x0e, 0x99, 0xf4, 0x4a, 0x12, 0x22, 
0xc5, 0x34, 0xb3, 0x24, 0xf8, 0x87, 0x7e, 0x4e, 0x6c, 0xd4, 0x1b, 0xe3, 0x54, 0x05, 0x9e, 0x57, 
0xd8, 0x13, 0x7c, 0xa7, 0x30, 0x69, 0x33, 0x6e, 0x3b, 0x90, 0xc1, 0x07, 0x4e, 0xfd, 0x63, 0xff, 
0xee, 0xbe, 0x34, 0x5a, 0xea, 0x25, 0x09, 0x47, 0xee, 0x1f, 0xdc, 0x30, 0x4b, 0xbf, 0x26, 0x26, 
0xf3, 0x9c, 0x4f, 0x75, 0x61, 0x85, 0xd5, 0xbe, 0x97, 0x91, 0x33, 0x90, 0x44, 0xc8, 0xcc, 0x00, 
0x89, 0x02, 0x9f, 0x9b, 0x03, 0x76, 0x41, 0x88, 0x48, 0xc5, 0xcf, 0xfc, 0x7b, 0x4c, 0x1c, 0x0e, 
0xb1, 0x97, 0x80, 0x60, 0xd3, 0xdb, 0xe4, 0xa1, 0xfa, 0x47, 0x23, 0x29, 0x1d, 0x53, 0x25, 0xca, 
0xf8, 0x9f, 0x70, 0x5e, 0x64, 0xc7, 0x06, 0x85, 0xb4, 0xb6, 0x3c, 0x4d, 0xff, 0xaa, 0x23, 0x94, 
0x23, 0xde, 0x46, 0x24, 0xae, 0xa2, 0x09, 0xda, 0xaf, 0xb4, 0x84, 0xdf, 0x44, 0x0a, 0x2d, 0xe9
},{
0xe7, 0x9a, 0x69, 0xa7, 0x4b, 0xa1, 0x51, 0xec, 0x4d, 0x37, 0xc5, 0x9b, 0xc9, 0xb5, 0x7a, 0x2a, 
0x96, 0xd7, 0xe4, 0xe5, 0x70, 0x24, 0xbf, 0x5a, 0xff, 0x95, 0xac, 0x9f, 0xac, 0x78, 0xe7, 0x44, 
0xc9, 0xe2, 0x38, 0x7a, 0x1d, 0xb2, 0xdf, 0xce, 0x0c, 0xda, 0xe4, 0x1e, 0xe9, 0x69, 0xf5, 0x9d, 
0x88, 0xb0, 0x28, 0xa0, 0xb3, 0x34, 0x53, 0xe2, 0x4a, 0x6f, 0xbe, 0xe0, 0xe1, 0x40, 0x8b, 0xb4, 
0x8d, 0xae, 0xb9, 0x9a, 0x0a, 0x13, 0xbe, 0xdd, 0x7a, 0x87, 0x9c, 0xa0, 0x7c, 0x44, 0x28, 0xe6, 
0xb1, 0xe7, 0x6f, 0x9f, 0xcb, 0x19, 0x67, 0x18, 0xfe, 0xad, 0x53, 0xbe, 0x85, 0xec, 0x49, 0xe2, 
0x0b, 0xc5, 0xe5, 0xd5, 0x4b, 0xb8, 0x0e, 0x09, 0xd1, 0xe5, 0x89, 0x30, 0x8d, 0x42, 0x38, 0xa9, 
0xe2, 0xcb, 0xaf, 0x8e, 0x67, 0xa5, 0x8b, 0xab, 0x75, 0x1b, 0x27, 0x41, 0xb4, 0x3f, 0xe2, 0x40, 
0x19, 0x49, 0x5e, 0x9d, 0xf0, 0xe5, 0x5c, 0x0e, 0x50, 0x4b, 0x7c, 0xec, 0x8d, 0x71, 0x56, 0x35, 
0xb0, 0xcc, 0x03, 0x0f, 0xd0, 0x9b, 0xd3, 0xd0, 0x2b, 0x65, 0x20, 0xcc, 0x9a, 0x11, 0x09, 0xde, 
0x3d, 0xa1, 0x14, 0xae, 0x6a, 0xe8, 0x9b, 0x56, 0xa1, 0x51, 0xe4, 0x8f, 0xbb, 0xc0, 0xad, 0xe4, 
0x2d, 0x97, 0xec, 0x3a, 0xbb, 0x6a, 0x7f, 0xed, 0x54, 0x41, 0xa2, 0x67, 0xf5, 0xb4, 0x2c, 0x85, 
0x5b, 0x9a, 0x9b, 0xc6, 0xa6, 0x4e, 0x74, 0xe0, 0xb0, 0x96, 0x3a, 0xad, 0x70, 0x08, 0x90, 0xcc, 
0x8b, 0x94, 0x5d, 0x27, 0x1a, 0xee, 0x2e, 0x0a, 0x59, 0x76, 0x72, 0x49, 0xbd, 0xe7, 0x1f, 0xca, 
0x91, 0x70, 0x8c, 0x56, 0x59, 0xf5, 0xee, 0x87, 0x52, 0xac, 0x28, 0xc1, 0x24, 0xc9, 0x6b, 0xf6, 
0x6c, 0x5c, 0xde, 0xdc, 0x41, 0xc9, 0x7f, 0x07, 0xed, 0xef, 0xb0, 0xd0, 0xf1, 0xe3, 0x35, 0x91 
}
};


static unsigned char AES2_Sinvprime[2][0x100] = {
{
0xae, 0xe0, 0x30, 0xbe, 0x2b, 0xe9, 0xa1, 0xac, 0x3b, 0xfc, 0x09, 0xd2, 0x0a, 0x76, 0x48, 0x89, 
0xc2, 0x9d, 0xfe, 0x78, 0x3e, 0xad, 0x31, 0x77, 0x69, 0xe8, 0x21, 0x12, 0x18, 0xa6, 0xd7, 0x41, 
0x7d, 0x4c, 0xdd, 0x6f, 0x6e, 0xe7, 0x05, 0x08, 0x83, 0x2b, 0x1e, 0x5c, 0xc3, 0xaf, 0x79, 0xd8, 
0xee, 0xa2, 0xe5, 0x40, 0x9a, 0xf8, 0x2d, 0x33, 0x85, 0x20, 0x83, 0xf2, 0xcf, 0xa5, 0x08, 0x68, 
0x40, 0xd5, 0xea, 0x37, 0xb2, 0x3c, 0xf8, 0xa6, 0xd7, 0x62, 0x1f, 0xab, 0xa7, 0xb2, 0x5e, 0x29, 
0x4b, 0x67, 0xe9, 0xb2, 0x74, 0xb0, 0x0b, 0xed, 0x3e, 0x7b, 0x71, 0x05, 0x1d, 0x80, 0xe2, 0xc5, 
0xd7, 0x8d, 0xb1, 0x48, 0xf8, 0x82, 0xd5, 0x60, 0x5f, 0x20, 0x50, 0x25, 0xb4, 0x35, 0xd4, 0x21, 
0xc5, 0xcc, 0x1e, 0xb1, 0x0e, 0x88, 0x21, 0x46, 0xf1, 0x6b, 0x49, 0x80, 0x40, 0x93, 0xb7, 0x61, 
0x9a, 0x20, 0xc7, 0xc9, 0xb6, 0x93, 0x52, 0x35, 0xeb, 0x0f, 0x38, 0x0d, 0x15, 0xca, 0x68, 0xc6, 
0x4f, 0x56, 0xbf, 0x3a, 0x43, 0x35, 0xd1, 0xfc, 0x4b, 0xf2, 0x11, 0xba, 0xd1, 0x1b, 0x39, 0xf3, 
0x86, 0x16, 0xeb, 0xff, 0x3a, 0x0b, 0x03, 0x2f, 0xd7, 0xcf, 0xd3, 0x87, 0xe6, 0xc7, 0x34, 0x62, 
0x37, 0x74, 0x9e, 0xef, 0x54, 0x20, 0xb3, 0x37, 0x8c, 0x49, 0xd8, 0xfb, 0x90, 0x20, 0x57, 0x17, 
0x00, 0xd5, 0xba, 0x66, 0xac, 0x01, 0x91, 0xc6, 0x8b, 0x4c, 0x87, 0xc8, 0xb0, 0xaa, 0x65, 0x73, 
0xe9, 0x08, 0x25, 0x00, 0x90, 0x99, 0x04, 0x40, 0x63, 0x7e, 0x5e, 0x5c, 0xf7, 0x1b, 0x0c, 0xd4, 
0xdb, 0x60, 0x43, 0x2f, 0x15, 0xe6, 0x50, 0x51, 0x93, 0x86, 0x79, 0x62, 0xe5, 0x72, 0xe7, 0x6e, 
0xcd, 0xb0, 0xee, 0x73, 0x8c, 0xcf, 0x48, 0x38, 0x11, 0xee, 0x33, 0xd4, 0x7e, 0x73, 0xc6, 0xdd 
},{
0x1f, 0xc2, 0x7d, 0xa4, 0x2a, 0x3c, 0x51, 0x83, 0xbe, 0x8f, 0xda, 0x74, 0xdf, 0xde, 0x92, 0xd8, 
0x82, 0xb8, 0x6d, 0x30, 0x49, 0x6a, 0x7b, 0x85, 0xa7, 0xf2, 0x13, 0x39, 0xc0, 0x06, 0x77, 0xad, 
0xb6, 0x13, 0x1b, 0x5e, 0x4e, 0xdf, 0x85, 0x18, 0x3b, 0x63, 0x21, 0x42, 0x12, 0x4b, 0x8a, 0x23, 
0x1b, 0x97, 0xf6, 0x2b, 0x1a, 0xc1, 0x53, 0xfe, 0x5e, 0x28, 0x11, 0xdc, 0x3c, 0x90, 0xd3, 0xf3, 
0x38, 0xc3, 0xc0, 0x25, 0x70, 0x83, 0x9c, 0xbf, 0x8d, 0x7c, 0x22, 0x3c, 0xbd, 0x82, 0xb6, 0x75, 
0xb2, 0x75, 0xd3, 0xeb, 0xc7, 0x97, 0x58, 0xc7, 0x76, 0x50, 0x98, 0x75, 0xea, 0xd4, 0x02, 0x05, 
0xf8, 0x7e, 0xab, 0x3a, 0x55, 0x78, 0x76, 0xfb, 0x3d, 0xa5, 0xc5, 0x11, 0x1b, 0xf1, 0x63, 0xd1, 
0x1c, 0x46, 0x72, 0xb7, 0x46, 0x11, 0x29, 0x68, 0x61, 0xb7, 0x24, 0x88, 0xad, 0x63, 0x84, 0xec, 
0x40, 0xfb, 0xf8, 0x47, 0xab, 0xb0, 0x1c, 0xa6, 0xa7, 0x95, 0x45, 0x7d, 0xfd, 0x46, 0x65, 0x94, 
0x41, 0xf7, 0x2f, 0xff, 0x21, 0x88, 0x36, 0xcc, 0xd0, 0x0f, 0x0c, 0x6e, 0x6d, 0xdf, 0x30, 0xd4, 
0x43, 0x64, 0x10, 0x82, 0x7c, 0x79, 0x33, 0x3d, 0xb6, 0xd4, 0xcc, 0x04, 0x87, 0x65, 0x79, 0x59, 
0x8d, 0x90, 0x0d, 0x6e, 0xdb, 0x40, 0x91, 0xe4, 0xa7, 0x2d, 0x4c, 0xcc, 0x51, 0x75, 0x4d, 0xc0, 
0x9b, 0x97, 0x6b, 0x55, 0x84, 0x19, 0x38, 0x42, 0x03, 0xe8, 0xf4, 0xfa, 0x0a, 0x3f, 0xb3, 0x55, 
0x0d, 0xbb, 0x76, 0x07, 0x96, 0xec, 0x2d, 0xac, 0x9b, 0xbb, 0x8e, 0xb2, 0xec, 0xf8, 0x4a, 0x13, 
0x33, 0x04, 0x10, 0x8f, 0xeb, 0x26, 0x3e, 0x99, 0x3a, 0xaa, 0x16, 0x71, 0x80, 0xf3, 0x50, 0x62, 
0x26, 0x1d, 0x31, 0x29, 0xae, 0x38, 0x9c, 0x0b, 0x61, 0xe7, 0x73, 0x00, 0xe0, 0x35, 0x3e, 0x0f
}
};


/*---------------------------------------------------------------------------------------------------- */
/* convert order number to permutation */
/* input: pernr, output: permu[4] */
void ord2perm(unsigned char permu[4], int pernr)
{
	int i, j, basis, rest;

	unsigned char pe[4] = {0, 1, 2, 3}; // permuatation element
	unsigned char kv[4] = {0, 0, 0, 0}; // node vector
	unsigned char nfak[4] = {1, 1, 2, 6}; // fakulty array with 0!, 1!, 2!, 3!, 4!
	
	rest = pernr;
	for(i = 0; i < 4; i++){
		basis = nfak[3 - i];
		kv[i] = rest / basis;
		rest  = rest % basis;
		permu[i] = pe[kv[i]];
		for(j = kv[i]; j < 3; j++)
			pe[j] = pe[j+1];
			
	}; 	
}

/* ---- AES for disguise and pseudo-random numbers --- */
/* input: state, mix columns table */
static void MixColumns(unsigned char st[4][4], unsigned char mct[4][0x100])
{
	int c, r, j, k;
	unsigned char s[4];

	for(c = 0; c < 4; c++) /* column */
	{
		for(r = 0; r < 4; r++) /* row */   
		{
			s[r] = 0;
			j = (4 - r) % 4;
			for(k = 0; k < 4; k++)    
			{
				s[r] ^= mct[j][st[k][c]];  /* LUT */
				j = (j + 1) % 4;
			}
		}
		for(r = 0; r < 4; r++)
			st[r][c] = s[r];
	}
}


static void ShiftRows(unsigned char st[4][4], int inc) 
{
	int c, r, j, j0;
	unsigned char s[4];

	j0 = 0;
	for(r = 1; r < 4; r++)
	{
		j0 = (j0 + inc) % 4;
		j = j0;
		for(c = 0; c < 4; c++)
		{
			s[c] = st[r][j];
			j = (j + 1) % 4;
		}
		for(c = 0; c < 4; c++)
			st[r][c] = s[c];
	}
}

/* input: state, sbox */
static void SubByte(unsigned char st[4][4], unsigned char sbx[0x100])
{
	int k, j;

	for(k = 0; k < 4; k++)
		for(j = 0; j < 4; j++)
			st[k][j] = sbx[st[k][j]];
}


static void AddRoundKey(unsigned char st[4][4], const unsigned char *cle)
{
	int k, j;

	for(k = 0; k < 4; k++)
		for(j = 0; j < 4; j++)
			st[j][k] ^= *cle++;
}

static void aes1_block_enc_one_round(unsigned char cipher[16], unsigned char plain[16], unsigned char cle[11*16])
{
	unsigned char st[4][4]; /* state */
	int k, j, nr;

	nr = 10;

	for(k = 0; k < 4; k++)             /* copy */
		for(j = 0; j < 4; j++)
			st[j][k] = *plain++;

	AddRoundKey(st, cle);
	SubByte(st, aes1_sbox);
	ShiftRows(st, 1);
	MixColumns(st, aes1_mixcolprod);

	for(k = 0; k < 4; k++)
		for(j = 0; j < 4; j++)
			*cipher++ = st[j][k];
}

static void SubByte_aes2(unsigned char st[4][4], unsigned char sbx[0x100],
	const unsigned char *permu1, const unsigned char *permu2)
{
	int x, y, k, j;
			
	// uses permuted index
	for(x = 0; x < 4; x++){
		k = permu1[x];
		for(y = 0; y < 4; y++) {
			j = permu2[y]; 
			st[k][j] = sbx[st[k][j]]; 
		}
	}			
}

static void AddRoundKey_aes2(unsigned char st[4][4], const unsigned char *cle, 
	const unsigned char *permu1, const unsigned char *permu2)
{
	int x, y, k, j, nr;
			
	// uses permuted index
	for(x = 0; x < 4; x++){
		k = permu1[x];
		for(y = 0; y < 4; y++) {
			j = permu2[y]; 
			nr = k*4 + j;
			st[j][k] ^= cle[nr];  
		}
	}			
			
}


static void blockxoraes_one_round(unsigned char inplaceblock[], unsigned char cle[11*16], unsigned int sqmodnstart, int blocklength){
	int i, j, bl;
	unsigned int s, s2, z, t, modulus; /* 4 byte */
	unsigned char c;
	
	unsigned char buf[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
	
	bl = blocklength / 16;  /* caller should care!  */
	
	modulus = 0x57c06b83; /* 1472228227 prime */
	t = sqmodnstart;
	s = t;
	s2 = modulus;
	for (j = 0; j < bl; j++){
		for (i = 0; i < 16; i++){
			s = (s * s) % modulus;
			if (s<2) {
				t = (t - 1) % modulus;
				s = t;
			}
			// Marsaglia 
			s2 ^= (s2 << 13) & 0xffffffff;
			s2 ^= (s2 >> 17) & 0xffffffff;
			s2 ^= (s2 << 5) & 0xffffffff;
		
			buf[i] = (char)(s ^ s2) & 0xff;
		}

		aes1_block_enc_one_round(buf, buf, cle);

		for (i = 0; i < 16; i++){
			inplaceblock[j*16 + i] ^= buf[i];		
		}
	}
}

static void blockxoraes_one_round_alternate(unsigned char inplaceblock[], unsigned char cle[11*16], unsigned int sqmodnstart, int blocklength){
	int i, j, bl;
	unsigned int s, s2, z, t, modulus; /* 4 byte */
	unsigned char c;
	
	unsigned char buf[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
	
	bl = blocklength / 16;  /* caller should care!  */
	
	modulus = 0x57c06b83; /* 1472228227 prime */
	t = sqmodnstart;
	s = t;
	s2 = modulus;
	for (j = 0; j < bl; j++){
		for (i = 0; i < 16; i++){
			s = (s * s) % modulus;
			if (s<2) {
				t = (t - 1) % modulus;
				s = t;
			}
			// Marsaglia 
			s2 ^= (s2 << 13) & 0xfeffffff;
			s2 ^= (s2 >> 17) & 0xfffeffff;
			s2 ^= (s2 << 5) & 0xffffffef;
		
			buf[i] = (char)(s ^ s2) & 0xff;
		}

		aes1_block_enc_one_round(buf, buf, cle);

		for (i = 0; i < 16; i++){
			inplaceblock[j*16 + i] ^= buf[i];		
		}
	}
}

/* AES2 for real and dummy encryption */
/* cle: real key, dumcle: dummy key, cks: table decryption key */
static void aes2_block_enc(unsigned char cipher[16], unsigned char plain[16], unsigned char cle[2][11*16], unsigned char dumcle[2][11*16], unsigned char random[16], unsigned char cks[11*16])
{
	/* memory encryption function pointer array*/
	static void (*p_arr__blockxoraes_one_round[8])(unsigned char inplaceblock[], unsigned char cle[11*16], unsigned int sqmodnstart, int blocklength) = {&blockxoraes_one_round, &blockxoraes_one_round_alternate, &blockxoraes_one_round, &blockxoraes_one_round_alternate, &blockxoraes_one_round, &blockxoraes_one_round_alternate, &blockxoraes_one_round, &blockxoraes_one_round_alternate}; /* every second address is bogus */

	unsigned char st[4][4]; /* state */
	unsigned char *clef; /* key pointer */
	unsigned char fltst[4][4]; /* fault check state */
	unsigned char *dumclef; /* dummy key pointer */
	unsigned char dumst[4][4]; /* dummy state */
	
	unsigned char fltplain[16] =
	{ 
	0xb3, 0x00, 0x14, 0x24, 0xa6, 0xc8, 0x84, 0xcc, 0x7a, 0x01, 0xa3, 0x26, 0x7e, 0x41, 0xbe, 0xb6
	};
	unsigned char fltcheck[2][16] =
	{{ // index 0 
	  0x41, 0x61, 0x53, 0xe4, 0x44, 0x02, 0x79, 0x8b, 0x1c, 0x6e, 0xdd, 0xde, 0x2a, 0x6a, 0x41, 0x25
	},{// index 1
	  0x94, 0x58, 0xa4, 0x17, 0xc3, 0xf9, 0x61, 0xd5, 0xaa, 0x06, 0x26, 0x1b, 0xc5, 0x95, 0x94, 0x9b
	}};	
	
	int x, y, i, j, k, l, nr, tindex;
	unsigned char c, fltflag = 0xa5;
	
	unsigned char permu0[4] = {2, 1, 0, 3}; /* fix permutation for fault check */
	unsigned char permu1[4] = {0, 0, 0, 0};
	unsigned char permu2[4] = {0, 0, 0, 0};
	
	tindex = random[2] & 0x01; /* flag for transform (A or D) selection for right key  */
	clef = cle[tindex];
	dumclef = dumcle[tindex];

	/* generate index permutation for 4! possibilities */
	ord2perm(permu1, random[3] % 24); // 4! = 24
	ord2perm(permu2, random[4] % 24); // 4! = 24

	/* decrypt table AES2_LUT1 */
	/* blockxoraes_one_round((unsigned char *)&AES2_LUT1, cks, 0x0400afcb, sizeof AES2_LUT1); */
	(*p_arr__blockxoraes_one_round[2*(random[5]%4)])((unsigned char *)&AES2_LUT1, cks, 0x0400afcb, sizeof AES2_LUT1);

	/* LUT access uses permuted index */
	for(x = 0; x < 4; x++){
		k = permu0[x];
		for(y = 0; y < 4; y++) {
			j = permu0[y]; 
			l = k*4 + j;
			fltst[j][k] = AES2_LUT1[tindex][fltplain[l]];
		}
	}

	/* LUT access uses permuted index */
	for(x = 0; x < 4; x++){
		k = permu1[x];
		for(y = 0; y < 4; y++) {
			j = permu2[y]; 
			l = k*4 + j;
			st[j][k] = AES2_LUT1[tindex][plain[l]];  /* apply tindex selected transform A */
			dumst[j][k] = st[j][k];  /* encrypt plaintext with dummy key... */
		}
	}
	/* decrypt table cle == pks (for both indices: clef = cle[tindex]) */
	/* blockxoraes_one_round((unsigned char *)cle, cks, 0x7f30e1a3, 2*11*16); */
	(*p_arr__blockxoraes_one_round[2*(random[7]%4)])((unsigned char *)cle, cks, 0x7f30e1a3, 2*11*16);
	/* decrypt table dumcle == gks (for both indices: dumclef = dumcle[tindex]) */
	/* blockxoraes_one_round((unsigned char *)dumcle, cks, 0xe1a37f30, 2*11*16); */
	(*p_arr__blockxoraes_one_round[2*(random[6]%4)])((unsigned char *)dumcle, cks, 0xe1a37f30, 2*11*16);
	
	/* fault check with real key */
	AddRoundKey_aes2(fltst, clef, permu0, permu0);

	/* real state, key */
	AddRoundKey_aes2(st, clef, permu1, permu2);

	/* real state copy with dummy key */
	AddRoundKey_aes2(dumst, dumclef, permu1, permu2);

	/* decrypt table AES2_Sprime */
	/* blockxoraes_one_round((unsigned char *)&AES2_Sprime, cks, 0x31eeae04, sizeof AES2_Sprime); */
	(*p_arr__blockxoraes_one_round[2*(random[8]%4)])((unsigned char *)&AES2_Sprime, cks, 0x31eeae04, sizeof AES2_Sprime);
	/* decrypt table aes2_mixcolprod */
	/* blockxoraes_one_round((unsigned char *)&aes2_mixcolprod, cks, 0x05a0a012, sizeof aes2_mixcolprod); */
	(*p_arr__blockxoraes_one_round[2*(random[9]%4)])((unsigned char *)&aes2_mixcolprod, cks, 0x05a0a012, sizeof aes2_mixcolprod);
	
	clef += 16;
	dumclef += 16;
	
	nr = 10;
	while( --nr > 0 )
	{
		/* dummy round */
		SubByte_aes2(dumst, AES2_Sprime[tindex], permu1, permu2);  // S-box
		ShiftRows(dumst, 1);
		MixColumns(dumst, aes2_mixcolprod[tindex]); /* transformed mixcolprod table */
		AddRoundKey_aes2(dumst, dumclef, permu1, permu2);	
	
		/* real round */
		SubByte_aes2(st, AES2_Sprime[tindex], permu1, permu2);  // S-box
		ShiftRows(st, 1);
		MixColumns(st, aes2_mixcolprod[tindex]); /* transformed mixcolprod table */
		AddRoundKey_aes2(st, clef, permu1, permu2);

		/* fault check round */
		SubByte_aes2(fltst, AES2_Sprime[tindex], permu0, permu0);  // S-box
		ShiftRows(fltst, 1);
		MixColumns(fltst, aes2_mixcolprod[tindex]); /* transformed mixcolprod table */
		AddRoundKey_aes2(fltst, clef, permu0, permu0);

		/* store dummy intermediate to random *(
		/* LUT access uses permuted index */
		for(x = 0; x < 4; x++){
			k = permu0[x];
			for(y = 0; y < 4; y++) {
				j = permu0[y]; 
				l = k*4 + j;
				random[l] = dumst[k][j];
			}
		}

		/* store real intermediate to random */
		/* LUT access uses permuted index */
		for(x = 0; x < 4; x++){
			k = permu0[x];
			for(y = 0; y < 4; y++) {
				j = permu0[y]; 
				l = k*4 + j;
				random[l] = st[k][j];
			}
		}
		
		clef += 16;
		dumclef += 16;
	}

	/* dummy final round */
	SubByte_aes2(dumst, AES2_Sprime[tindex], permu1, permu2);  /* S-box */
	ShiftRows(dumst, 1);
	AddRoundKey_aes2(dumst, dumclef, permu1, permu2);

	/* real final round */
	SubByte_aes2(st, AES2_Sprime[tindex], permu1, permu2);  /* S-box */
	ShiftRows(st, 1);
	AddRoundKey_aes2(st, clef, permu1, permu2);

	/* fault check final round */
	SubByte_aes2(fltst, AES2_Sprime[tindex], permu0, permu0);  /* S-box */
	ShiftRows(fltst, 1);
	AddRoundKey_aes2(fltst, clef, permu0, permu0);

	/* encrypt table AES2_Sprime (we do not need anymore this time) */
	/* blockxoraes_one_round((unsigned char *)&AES2_Sprime, cks, 0x31eeae04, sizeof AES2_Sprime); */
	(*p_arr__blockxoraes_one_round[2*(random[10]%4)])((unsigned char *)&AES2_Sprime, cks, 0x31eeae04, sizeof AES2_Sprime);
	
	/* encrypt table aes2_mixcolprod (we do not need anymore this time) */
	/* blockxoraes_one_round((unsigned char *)&aes2_mixcolprod, cks, 0x05a0a012, sizeof aes2_mixcolprod); */
	(*p_arr__blockxoraes_one_round[2*(random[12]%4)])((unsigned char *)&aes2_mixcolprod, cks, 0x05a0a012, sizeof aes2_mixcolprod);

	/* decrypt table AES2_Sinvprime */
	/* blockxoraes_one_round((unsigned char *)&AES2_Sinvprime, cks, 0xd3f3f091, sizeof AES2_Sinvprime); */
	(*p_arr__blockxoraes_one_round[2*(random[11]%4)])((unsigned char *)&AES2_Sinvprime, cks, 0xd3f3f091, sizeof AES2_Sinvprime);


	/* LUT access uses permuted index */
	for(x = 0; x < 4; x++){
		k = permu0[x];
		for(y = 0; y < 4; y++) {
			j = permu0[y]; 
			l = k*4 + j;
			fltflag += (fltcheck[tindex][l] - AES2_LUT1[tindex][fltst[j][k]]);
		}
	}

	/* store real intermediate to fltst (reuse), initialize cipher with something (deception) */
	/* LUT access uses permuted index */
	for(x = 0; x < 4; x++){
		k = permu0[x];
		for(y = 0; y < 4; y++) {
			j = permu0[y];
			l = k*4 + j;
			fltst[k][j] = st[k][j];
			cipher[l] = dumst[k][j];
		}
	}

	/* encrypt table AES2_LUT1 again (we do not need anymore this time) */
	/* blockxoraes_one_round((unsigned char *)&AES2_LUT1, cks, 0x0400afcb, sizeof AES2_LUT1); */
	(*p_arr__blockxoraes_one_round[2*(random[13]%4)])((unsigned char *)&AES2_LUT1, cks, 0x0400afcb, sizeof AES2_LUT1);

	/* compute last round backwards,*/
	AddRoundKey_aes2(fltst, clef, permu1, permu2);
	ShiftRows(fltst, 3);
	SubByte_aes2(fltst, AES2_Sinvprime[tindex], permu1, permu2);  // S-box

	/* encrypt table cle == pks (for both indices: clef = cle[tindex]) again (we do not need anymore this time) */
	/* blockxoraes_one_round((unsigned char *)cle, cks, 0x7f30e1a3, 2*11*16); */
	(*p_arr__blockxoraes_one_round[2*(random[14]%4)])((unsigned char *)cle, cks, 0x7f30e1a3, 2*11*16);

	/* encrypt table dumcle == gks (for both indices) again (we do not need anymore this time) */
	/* blockxoraes_one_round((unsigned char *)dumcle, cks, 0xe1a37f30, 2*11*16); */
	(*p_arr__blockxoraes_one_round[2*(random[15]%4)])((unsigned char *)dumcle, cks, 0xe1a37f30, 2*11*16);

	/* compare second to last round states */
	/* LUT access uses permuted index */
	for(x = 0; x < 4; x++){
		k = permu0[x];
		for(y = 0; y < 4; y++) {
			j = permu0[y];
			l = k*4 + j;
			fltflag += (random[l] - fltst[j][k]);
		}
	}

	/* encrypt table AES2_Sinvprime (we do not need anymore this time) */
	/* blockxoraes_one_round((unsigned char *)&AES2_Sinvprime, cks, 0xd3f3f091, sizeof AES2_Sinvprime); */
	(*p_arr__blockxoraes_one_round[2*(random[0]%4)])((unsigned char *)&AES2_Sinvprime, cks, 0xd3f3f091, sizeof AES2_Sinvprime);


	/* decrypt table AES2_LUT2, only after clef is erased!!! */
	/* blockxoraes_one_round((unsigned char *)&AES2_LUT2, cks, 0x79dd0505, sizeof AES2_LUT2); */
	(*p_arr__blockxoraes_one_round[2*(random[1]%4)])((unsigned char *)&AES2_LUT2, cks, 0x79dd0505, sizeof AES2_LUT2);

	/* LUT access uses permuted index */
	for(x = 0; x < 4; x++){
		k = permu1[x];
		for(y = 0; y < 4; y++) {
			j = permu2[y]; 
			l = k*4 + j;
			/* apply tindex selected transform A, neutralize fault flag if no fault */
			/* nr should be zero, fltflag should be 0xa5 */
			/* apply flip of left and right byte half */
			c = AES2_LUT2[tindex][st[j][k]];
			cipher[l] = (c << 4) ^ 0xa5 ^ nr ^ (c >> 4) ^ fltflag;  
		}
	}
	/* encrypt table AES2_LUT2 (we do not need anymore this time) */
	/* blockxoraes_one_round((unsigned char *)&AES2_LUT2, cks, 0x79dd0505, sizeof AES2_LUT2); */
	(*p_arr__blockxoraes_one_round[2*(random[15]%4)])((unsigned char *)&AES2_LUT2, cks, 0x79dd0505, sizeof AES2_LUT2);

}



/* the contest required prototype */
void AES_128_encrypt(unsigned char ciphertext[16], unsigned char plaintext[16]){
	int i, offs;
	unsigned char random[16] = 
	{ 
	0x52, 0xf8, 0xc0, 0xba, 0x03, 0x96, 0xa4, 0x51, 0xe5, 0xc7, 0x99, 0x3d, 0x77, 0x6a, 0x0f, 0x45
	};
	offs = plaintext[15] % 16;
	for (i = 0; i < 16; i++){
		random[i] ^= plaintext[(i + offs)%16];
	}
	aes2_block_enc(ciphertext, plaintext, pks, gks, random, cks);
}
