46 #pragma intrinsic(memcpy)
73 #if defined(HAVE_UINT_32T)
85 #define f2(x) ((x << 1) ^ (((x >> 7) & 1) * WPOLY))
86 #define f4(x) ((x << 2) ^ (((x >> 6) & 1) * WPOLY) ^ (((x >> 6) & 2) * WPOLY))
87 #define f8(x) ((x << 3) ^ (((x >> 5) & 1) * WPOLY) ^ (((x >> 5) & 2) * WPOLY) ^ (((x >> 5) & 4) * WPOLY))
88 #define d2(x) (((x) >> 1) ^ ((x)&1 ? DPOLY : 0))
90 #define f3(x) (f2(x) ^ x)
91 #define f9(x) (f8(x) ^ x)
92 #define fb(x) (f8(x) ^ f2(x) ^ x)
93 #define fd(x) (f8(x) ^ f4(x) ^ x)
94 #define fe(x) (f8(x) ^ f4(x) ^ f2(x))
96 #if defined(USE_TABLES)
100 w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), w(0xc5), w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), w(0xab), w(0x76), w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), w(0x59), w(0x47), w(0xf0), w(0xad), w(0xd4), w(0xa2), w(0xaf), w(0x9c), w(0xa4), w(0x72), w(0xc0), w(0xb7), w(0xfd), w(0x93), w(0x26), w(0x36), w(0x3f), w(0xf7), w(0xcc), w(0x34), w(0xa5), w(0xe5), w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15), w(0x04), w(0xc7), w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a), w(0x07), w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), w(0x75), w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), w(0x5a), w(0xa0), w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), w(0xe3), w(0x2f), w(0x84), w(0x53), w(0xd1), w(0x00), w(0xed), w(0x20), w(0xfc), w(0xb1), w(0x5b), w(0x6a), w(0xcb), w(0xbe), w(0x39), w(0x4a), w(0x4c), w(0x58), w(0xcf), w(0xd0), w(0xef), w(0xaa), w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85), w(0x45), w(0xf9), w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8), w(0x51), w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), w(0xf5), w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), w(0xf3), w(0xd2), w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), w(0x97), w(0x44), w(0x17), w(0xc4), w(0xa7), w(0x7e), w(0x3d), w(0x64), w(0x5d), w(0x19), w(0x73), w(0x60), w(0x81), w(0x4f), w(0xdc), w(0x22), w(0x2a), w(0x90), w(0x88), w(0x46), w(0xee), w(0xb8), w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb), w(0xe0), w(0x32), w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c), w(0xc2), w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), w(0x79), w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), w(0x4e), w(0xa9), w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), w(0x7a), w(0xae), w(0x08), w(0xba), w(0x78), w(0x25), w(0x2e), w(0x1c), w(0xa6), w(0xb4), w(0xc6), w(0xe8), w(0xdd), w(0x74), w(0x1f), w(0x4b), w(0xbd), w(0x8b), w(0x8a), w(0x70), w(0x3e), w(0xb5), w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e), w(0x61), w(0x35), w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e), w(0xe1), w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), w(0x94), w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), w(0x28), w(0xdf), w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), w(0xe6), w(0x42), w(0x68), w(0x41), w(0x99), w(0x2d), w(0x0f), w(0xb0), w(0x54), w(0xbb), w(0x16) \
103 #define isb_data(w) \
105 w(0x52), w(0x09), w(0x6a), w(0xd5), w(0x30), w(0x36), w(0xa5), w(0x38), w(0xbf), w(0x40), w(0xa3), w(0x9e), w(0x81), w(0xf3), w(0xd7), w(0xfb), w(0x7c), w(0xe3), w(0x39), w(0x82), w(0x9b), w(0x2f), w(0xff), w(0x87), w(0x34), w(0x8e), w(0x43), w(0x44), w(0xc4), w(0xde), w(0xe9), w(0xcb), w(0x54), w(0x7b), w(0x94), w(0x32), w(0xa6), w(0xc2), w(0x23), w(0x3d), w(0xee), w(0x4c), w(0x95), w(0x0b), w(0x42), w(0xfa), w(0xc3), w(0x4e), w(0x08), w(0x2e), w(0xa1), w(0x66), w(0x28), w(0xd9), w(0x24), w(0xb2), w(0x76), w(0x5b), w(0xa2), w(0x49), w(0x6d), w(0x8b), w(0xd1), w(0x25), w(0x72), w(0xf8), w(0xf6), w(0x64), w(0x86), w(0x68), w(0x98), w(0x16), w(0xd4), w(0xa4), w(0x5c), w(0xcc), w(0x5d), w(0x65), w(0xb6), w(0x92), w(0x6c), w(0x70), w(0x48), w(0x50), w(0xfd), w(0xed), w(0xb9), w(0xda), w(0x5e), w(0x15), w(0x46), w(0x57), w(0xa7), w(0x8d), w(0x9d), w(0x84), w(0x90), w(0xd8), w(0xab), w(0x00), w(0x8c), w(0xbc), w(0xd3), w(0x0a), w(0xf7), w(0xe4), w(0x58), w(0x05), w(0xb8), w(0xb3), w(0x45), w(0x06), w(0xd0), w(0x2c), w(0x1e), w(0x8f), w(0xca), w(0x3f), w(0x0f), w(0x02), w(0xc1), w(0xaf), w(0xbd), w(0x03), w(0x01), w(0x13), w(0x8a), w(0x6b), w(0x3a), w(0x91), w(0x11), w(0x41), w(0x4f), w(0x67), w(0xdc), w(0xea), w(0x97), w(0xf2), w(0xcf), w(0xce), w(0xf0), w(0xb4), w(0xe6), w(0x73), w(0x96), w(0xac), w(0x74), w(0x22), w(0xe7), w(0xad), w(0x35), w(0x85), w(0xe2), w(0xf9), w(0x37), w(0xe8), w(0x1c), w(0x75), w(0xdf), w(0x6e), w(0x47), w(0xf1), w(0x1a), w(0x71), w(0x1d), w(0x29), w(0xc5), w(0x89), w(0x6f), w(0xb7), w(0x62), w(0x0e), w(0xaa), w(0x18), w(0xbe), w(0x1b), w(0xfc), w(0x56), w(0x3e), w(0x4b), w(0xc6), w(0xd2), w(0x79), w(0x20), w(0x9a), w(0xdb), w(0xc0), w(0xfe), w(0x78), w(0xcd), w(0x5a), w(0xf4), w(0x1f), w(0xdd), w(0xa8), w(0x33), w(0x88), w(0x07), w(0xc7), w(0x31), w(0xb1), w(0x12), w(0x10), w(0x59), w(0x27), w(0x80), w(0xec), w(0x5f), w(0x60), w(0x51), w(0x7f), w(0xa9), w(0x19), w(0xb5), w(0x4a), w(0x0d), w(0x2d), w(0xe5), w(0x7a), w(0x9f), w(0x93), w(0xc9), w(0x9c), w(0xef), w(0xa0), w(0xe0), w(0x3b), w(0x4d), w(0xae), w(0x2a), w(0xf5), w(0xb0), w(0xc8), w(0xeb), w(0xbb), w(0x3c), w(0x83), w(0x53), w(0x99), w(0x61), w(0x17), w(0x2b), w(0x04), w(0x7e), w(0xba), w(0x77), w(0xd6), w(0x26), w(0xe1), w(0x69), w(0x14), w(0x63), w(0x55), w(0x21), w(0x0c), w(0x7d) \
110 w(0x00), w(0x01), w(0x02), w(0x03), w(0x04), w(0x05), w(0x06), w(0x07), w(0x08), w(0x09), w(0x0a), w(0x0b), w(0x0c), w(0x0d), w(0x0e), w(0x0f), w(0x10), w(0x11), w(0x12), w(0x13), w(0x14), w(0x15), w(0x16), w(0x17), w(0x18), w(0x19), w(0x1a), w(0x1b), w(0x1c), w(0x1d), w(0x1e), w(0x1f), w(0x20), w(0x21), w(0x22), w(0x23), w(0x24), w(0x25), w(0x26), w(0x27), w(0x28), w(0x29), w(0x2a), w(0x2b), w(0x2c), w(0x2d), w(0x2e), w(0x2f), w(0x30), w(0x31), w(0x32), w(0x33), w(0x34), w(0x35), w(0x36), w(0x37), w(0x38), w(0x39), w(0x3a), w(0x3b), w(0x3c), w(0x3d), w(0x3e), w(0x3f), w(0x40), w(0x41), w(0x42), w(0x43), w(0x44), w(0x45), w(0x46), w(0x47), w(0x48), w(0x49), w(0x4a), w(0x4b), w(0x4c), w(0x4d), w(0x4e), w(0x4f), w(0x50), w(0x51), w(0x52), w(0x53), w(0x54), w(0x55), w(0x56), w(0x57), w(0x58), w(0x59), w(0x5a), w(0x5b), w(0x5c), w(0x5d), w(0x5e), w(0x5f), w(0x60), w(0x61), w(0x62), w(0x63), w(0x64), w(0x65), w(0x66), w(0x67), w(0x68), w(0x69), w(0x6a), w(0x6b), w(0x6c), w(0x6d), w(0x6e), w(0x6f), w(0x70), w(0x71), w(0x72), w(0x73), w(0x74), w(0x75), w(0x76), w(0x77), w(0x78), w(0x79), w(0x7a), w(0x7b), w(0x7c), w(0x7d), w(0x7e), w(0x7f), w(0x80), w(0x81), w(0x82), w(0x83), w(0x84), w(0x85), w(0x86), w(0x87), w(0x88), w(0x89), w(0x8a), w(0x8b), w(0x8c), w(0x8d), w(0x8e), w(0x8f), w(0x90), w(0x91), w(0x92), w(0x93), w(0x94), w(0x95), w(0x96), w(0x97), w(0x98), w(0x99), w(0x9a), w(0x9b), w(0x9c), w(0x9d), w(0x9e), w(0x9f), w(0xa0), w(0xa1), w(0xa2), w(0xa3), w(0xa4), w(0xa5), w(0xa6), w(0xa7), w(0xa8), w(0xa9), w(0xaa), w(0xab), w(0xac), w(0xad), w(0xae), w(0xaf), w(0xb0), w(0xb1), w(0xb2), w(0xb3), w(0xb4), w(0xb5), w(0xb6), w(0xb7), w(0xb8), w(0xb9), w(0xba), w(0xbb), w(0xbc), w(0xbd), w(0xbe), w(0xbf), w(0xc0), w(0xc1), w(0xc2), w(0xc3), w(0xc4), w(0xc5), w(0xc6), w(0xc7), w(0xc8), w(0xc9), w(0xca), w(0xcb), w(0xcc), w(0xcd), w(0xce), w(0xcf), w(0xd0), w(0xd1), w(0xd2), w(0xd3), w(0xd4), w(0xd5), w(0xd6), w(0xd7), w(0xd8), w(0xd9), w(0xda), w(0xdb), w(0xdc), w(0xdd), w(0xde), w(0xdf), w(0xe0), w(0xe1), w(0xe2), w(0xe3), w(0xe4), w(0xe5), w(0xe6), w(0xe7), w(0xe8), w(0xe9), w(0xea), w(0xeb), w(0xec), w(0xed), w(0xee), w(0xef), w(0xf0), w(0xf1), w(0xf2), w(0xf3), w(0xf4), w(0xf5), w(0xf6), w(0xf7), w(0xf8), w(0xf9), w(0xfa), w(0xfb), w(0xfc), w(0xfd), w(0xfe), w(0xff) \
124 #define s_box(x) sbox[(x)]
125 #define is_box(x) isbox[(x)]
126 #define gfm2_sb(x) gfm2_sbox[(x)]
127 #define gfm3_sb(x) gfm3_sbox[(x)]
128 #define gfm_9(x) gfmul_9[(x)]
129 #define gfm_b(x) gfmul_b[(x)]
130 #define gfm_d(x) gfmul_d[(x)]
131 #define gfm_e(x) gfmul_e[(x)]
153 uint_8t p1 = x, p2 =
BPOLY, n1 = hibit(x), n2 = 0x80, v1 = 1, v2 = 0;
163 p2 ^= (p1 * n2) & 0xff;
187 #if defined(HAVE_UINT_32T)
189 w ^= (w << 1) ^ (w << 2) ^ (w << 3) ^ (w << 4);
190 return 0x63 ^ ((w ^ (w >> 8)) & 0xff);
192 return 0x63 ^ x ^ (x << 1) ^ (x << 2) ^ (x << 3) ^ (x << 4) ^ (x >> 7) ^ (x >> 6) ^ (x >> 5) ^ (x >> 4);
198 #if defined(HAVE_UINT_32T)
200 w = (w << 1) ^ (w << 3) ^ (w << 6);
201 return 0x05 ^ ((w ^ (w >> 8)) & 0xff);
203 return 0x05 ^ (x << 1) ^ (x << 3) ^ (x << 6) ^ (x >> 7) ^ (x >> 5) ^ (x >> 2);
207 #define s_box(x) fwd_affine(gf_inv(x))
208 #define is_box(x) gf_inv(inv_affine(x))
209 #define gfm2_sb(x) f2(s_box(x))
210 #define gfm3_sb(x) f3(s_box(x))
211 #define gfm_9(x) f9(x)
212 #define gfm_b(x) fb(x)
213 #define gfm_d(x) fd(x)
214 #define gfm_e(x) fe(x)
218 #if defined(HAVE_MEMCPY)
219 #define block_copy_nn(d, s, l) memcpy(d, s, l)
220 #define block_copy(d, s) memcpy(d, s, N_BLOCK)
222 #define block_copy_nn(d, s, l) copy_block_nn(d, s, l)
223 #define block_copy(d, s) copy_block(d, s)
227 #if defined(HAVE_MEMCPY)
229 static void copy_block(
void* d,
const void* s)
231 #if defined(HAVE_UINT_32T)
256 static void copy_block_nn(
void* d,
const void* s,
uint_8t nn)
267 #if defined(HAVE_UINT_32T)
294 #if defined(HAVE_UINT_32T)
331 st[0] =
s_box(st[0]);
332 st[4] =
s_box(st[4]);
333 st[8] =
s_box(st[8]);
334 st[12] =
s_box(st[12]);
337 st[1] =
s_box(st[5]);
338 st[5] =
s_box(st[9]);
339 st[9] =
s_box(st[13]);
343 st[2] =
s_box(st[10]);
346 st[6] =
s_box(st[14]);
350 st[15] =
s_box(st[11]);
351 st[11] =
s_box(st[7]);
352 st[7] =
s_box(st[3]);
385 #if defined(VERSION_1)
415 #if defined(VERSION_1)
445 #if defined(AES_ENC_PREKEYED) || defined(AES_DEC_PREKEYED)
471 hi = (keylen + 28) << 2;
472 ctx->
rnd = (hi >> 4) - 1;
473 for (cc = keylen, rc = 1; cc < hi; cc += 4) {
476 t0 = ctx->
ksch[cc - 4];
477 t1 = ctx->
ksch[cc - 3];
478 t2 = ctx->
ksch[cc - 2];
479 t3 = ctx->
ksch[cc - 1];
480 if (cc % keylen == 0) {
487 }
else if (keylen > 24 && cc % keylen == 16) {
494 ctx->
ksch[cc + 0] = ctx->
ksch[tt + 0] ^ t0;
495 ctx->
ksch[cc + 1] = ctx->
ksch[tt + 1] ^ t1;
496 ctx->
ksch[cc + 2] = ctx->
ksch[tt + 2] ^ t2;
497 ctx->
ksch[cc + 3] = ctx->
ksch[tt + 3] ^ t3;
504 #if defined(AES_ENC_PREKEYED)
514 for (r = 1; r < ctx->
rnd; ++r)
544 memcpy(out, iv, N_BLOCK);
553 #if defined(AES_DEC_PREKEYED)
564 for (r = ctx->
rnd; --r;)
565 #if defined(VERSION_1)
591 memcpy(tmp, in, N_BLOCK);
596 memcpy(iv, tmp, N_BLOCK);
605 #if defined(AES_ENC_128_OTFK)
609 static void update_encrypt_key_128(
uint_8t k[N_BLOCK],
uint_8t* rc)
613 k[0] ^=
s_box(k[13]) ^ *rc;
614 k[1] ^=
s_box(k[14]);
615 k[2] ^=
s_box(k[15]);
616 k[3] ^=
s_box(k[12]);
619 for (cc = 4; cc < 16; cc += 4) {
620 k[cc + 0] ^= k[cc - 4];
621 k[cc + 1] ^= k[cc - 3];
622 k[cc + 2] ^= k[cc - 2];
623 k[cc + 3] ^= k[cc - 1];
629 void aes_encrypt_128(
const unsigned char in[N_BLOCK],
unsigned char out[N_BLOCK],
const unsigned char key[N_BLOCK],
unsigned char o_key[N_BLOCK])
638 for (r = 1; r < 10; ++r)
642 update_encrypt_key_128(o_key, &rc);
649 update_encrypt_key_128(o_key, &rc);
655 update_encrypt_key_128(o_key, &rc);
661 #if defined(AES_DEC_128_OTFK)
665 static void update_decrypt_key_128(
uint_8t k[N_BLOCK],
uint_8t* rc)
669 for (cc = 12; cc > 0; cc -= 4) {
670 k[cc + 0] ^= k[cc - 4];
671 k[cc + 1] ^= k[cc - 3];
672 k[cc + 2] ^= k[cc - 2];
673 k[cc + 3] ^= k[cc - 1];
676 k[0] ^=
s_box(k[13]) ^ *rc;
677 k[1] ^=
s_box(k[14]);
678 k[2] ^=
s_box(k[15]);
679 k[3] ^=
s_box(k[12]);
684 void aes_decrypt_128(
const unsigned char in[N_BLOCK],
unsigned char out[N_BLOCK],
const unsigned char key[N_BLOCK],
unsigned char o_key[N_BLOCK])
697 update_decrypt_key_128(o_key, &rc);
704 update_decrypt_key_128(o_key, &rc);
709 update_decrypt_key_128(o_key, &rc);
715 #if defined(AES_ENC_256_OTFK)
719 static void update_encrypt_key_256(
uint_8t k[2 * N_BLOCK],
uint_8t* rc)
723 k[0] ^=
s_box(k[29]) ^ *rc;
724 k[1] ^=
s_box(k[30]);
725 k[2] ^=
s_box(k[31]);
726 k[3] ^=
s_box(k[28]);
729 for (cc = 4; cc < 16; cc += 4) {
730 k[cc + 0] ^= k[cc - 4];
731 k[cc + 1] ^= k[cc - 3];
732 k[cc + 2] ^= k[cc - 2];
733 k[cc + 3] ^= k[cc - 1];
736 k[16] ^=
s_box(k[12]);
737 k[17] ^=
s_box(k[13]);
738 k[18] ^=
s_box(k[14]);
739 k[19] ^=
s_box(k[15]);
741 for (cc = 20; cc < 32; cc += 4) {
742 k[cc + 0] ^= k[cc - 4];
743 k[cc + 1] ^= k[cc - 3];
744 k[cc + 2] ^= k[cc - 2];
745 k[cc + 3] ^= k[cc - 1];
751 void aes_encrypt_256(
const unsigned char in[N_BLOCK],
unsigned char out[N_BLOCK],
const unsigned char key[2 * N_BLOCK],
unsigned char o_key[2 * N_BLOCK])
760 for (r = 1; r < 14; ++r)
767 update_encrypt_key_256(o_key, &rc);
778 update_encrypt_key_256(o_key, &rc);
785 update_encrypt_key_256(o_key, &rc);
791 #if defined(AES_DEC_256_OTFK)
795 static void update_decrypt_key_256(
uint_8t k[2 * N_BLOCK],
uint_8t* rc)
799 for (cc = 28; cc > 16; cc -= 4) {
800 k[cc + 0] ^= k[cc - 4];
801 k[cc + 1] ^= k[cc - 3];
802 k[cc + 2] ^= k[cc - 2];
803 k[cc + 3] ^= k[cc - 1];
806 k[16] ^=
s_box(k[12]);
807 k[17] ^=
s_box(k[13]);
808 k[18] ^=
s_box(k[14]);
809 k[19] ^=
s_box(k[15]);
811 for (cc = 12; cc > 0; cc -= 4) {
812 k[cc + 0] ^= k[cc - 4];
813 k[cc + 1] ^= k[cc - 3];
814 k[cc + 2] ^= k[cc - 2];
815 k[cc + 3] ^= k[cc - 1];
819 k[0] ^=
s_box(k[29]) ^ *rc;
820 k[1] ^=
s_box(k[30]);
821 k[2] ^=
s_box(k[31]);
822 k[3] ^=
s_box(k[28]);
828 void aes_decrypt_256(
const unsigned char in[N_BLOCK],
unsigned char out[N_BLOCK],
const unsigned char key[2 * N_BLOCK],
unsigned char o_key[2 * N_BLOCK])
844 update_decrypt_key_256(o_key, &rc);
855 update_decrypt_key_256(o_key, &rc);
static const uint_8t gfmul_b[256]
static const uint_8t sbox[256]
static const uint_8t isbox[256]
static void shift_sub_rows(uint_8t st[N_BLOCK])
return_type aes_decrypt(const unsigned char in[N_BLOCK], unsigned char out[N_BLOCK], const aes_context ctx[1])
return_type aes_cbc_decrypt(const unsigned char *in, unsigned char *out, int n_block, unsigned char iv[N_BLOCK], const aes_context ctx[1])
static const uint_8t gfmul_d[256]
return_type aes_cbc_encrypt(const unsigned char *in, unsigned char *out, int n_block, unsigned char iv[N_BLOCK], const aes_context ctx[1])
static const uint_8t gfmul_e[256]
#define block_copy_nn(d, s, l)
static void mix_sub_columns(uint_8t dt[N_BLOCK])
static const uint_8t gfmul_9[256]
static const uint_8t gfm2_sbox[256]
static const uint_8t gfm3_sbox[256]
static void inv_shift_sub_rows(uint_8t st[N_BLOCK])
static void copy_and_key(void *d, const void *s, const void *k)
static void inv_mix_sub_columns(uint_8t dt[N_BLOCK])
static void xor_block(void *d, const void *s)
return_type aes_encrypt(const unsigned char in[N_BLOCK], unsigned char out[N_BLOCK], const aes_context ctx[1])
return_type aes_set_key(const unsigned char key[], length_type keylen, aes_context ctx[1])
uint_8t ksch[(N_MAX_ROUNDS+1)*N_BLOCK]
static void add_round_key(uint_8t d[N_BLOCK], const uint_8t k[N_BLOCK])