57 #ifndef MULTIPLY_AS_A_FUNCTION 58 #define MULTIPLY_AS_A_FUNCTION 0 73 static const uint8_t*
Key;
75 #if defined(CBC) && CBC 83 static const uint8_t
sbox[256] = {
85 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
86 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
87 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
88 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
89 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
90 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
91 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
92 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
93 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
94 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
95 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
96 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
97 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
98 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
99 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
100 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 };
103 { 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
104 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
105 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
106 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
107 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
108 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
109 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
110 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
111 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
112 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
113 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
114 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
115 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
116 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
117 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
118 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d };
124 static const uint8_t
Rcon[255] = {
125 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a,
126 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39,
127 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
128 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8,
129 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef,
130 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
131 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b,
132 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3,
133 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,
134 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20,
135 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35,
136 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,
137 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04,
138 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63,
139 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
140 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb };
166 for(i = 0; i <
Nk; ++i)
175 for(; (i < (
Nb * (
Nr + 1))); ++i)
177 for(j = 0; j < 4; ++j)
206 tempa[0] = tempa[0] ^
Rcon[i/
Nk];
208 else if (Nk > 6 && i % Nk == 4)
219 RoundKey[i * 4 + 1] = RoundKey[(i -
Nk) * 4 + 1] ^ tempa[1];
220 RoundKey[i * 4 + 2] = RoundKey[(i -
Nk) * 4 + 2] ^ tempa[2];
221 RoundKey[i * 4 + 3] = RoundKey[(i -
Nk) * 4 + 3] ^ tempa[3];
233 for(j = 0; j < 4; ++j)
235 (*state)[i][j] ^=
RoundKey[round *
Nb * 4 + i *
Nb + j];
246 for(i = 0; i < 4; ++i)
248 for(j = 0; j < 4; ++j)
264 temp = (*state)[0][1];
265 (*state)[0][1] = (*state)[1][1];
266 (*state)[1][1] = (*state)[2][1];
267 (*state)[2][1] = (*state)[3][1];
268 (*state)[3][1] = temp;
271 temp = (*state)[0][2];
272 (*state)[0][2] = (*state)[2][2];
273 (*state)[2][2] = temp;
275 temp = (*state)[1][2];
276 (*state)[1][2] = (*state)[3][2];
277 (*state)[3][2] = temp;
280 temp = (*state)[0][3];
281 (*state)[0][3] = (*state)[3][3];
282 (*state)[3][3] = (*state)[2][3];
283 (*state)[2][3] = (*state)[1][3];
284 (*state)[1][3] = temp;
290 return ((x<<1) ^ (((x>>7) & 1) * 0x1b));
299 for(i = 0; i < 4; ++i)
302 Tmp = (*state)[i][0] ^ (*state)[i][1] ^ (*state)[i][2] ^ (*state)[i][3] ;
303 Tm = (*state)[i][0] ^ (*state)[i][1] ; Tm =
xtime(Tm); (*state)[i][0] ^= Tm ^ Tmp ;
304 Tm = (*state)[i][1] ^ (*state)[i][2] ; Tm =
xtime(Tm); (*state)[i][1] ^= Tm ^ Tmp ;
305 Tm = (*state)[i][2] ^ (*state)[i][3] ; Tm =
xtime(Tm); (*state)[i][2] ^= Tm ^ Tmp ;
306 Tm = (*state)[i][3] ^ t ; Tm =
xtime(Tm); (*state)[i][3] ^= Tm ^ Tmp ;
311 #if MULTIPLY_AS_A_FUNCTION 313 static uint8_t
Multiply(uint8_t x, uint8_t y)
315 return (((y & 1) * x) ^
316 ((y>>1 & 1) *
xtime(x)) ^
322 #define Multiply(x, y) \ 324 ((y>>1 & 1) * xtime(x)) ^ \ 325 ((y>>2 & 1) * xtime(xtime(x))) ^ \ 326 ((y>>3 & 1) * xtime(xtime(xtime(x)))) ^ \ 327 ((y>>4 & 1) * xtime(xtime(xtime(xtime(x)))))) \ 376 (*state)[3][1]=(*state)[2][1];
377 (*state)[2][1]=(*state)[1][1];
378 (*state)[1][1]=(*state)[0][1];
383 (*state)[0][2]=(*state)[2][2];
387 (*state)[1][2]=(*state)[3][2];
392 (*state)[0][3]=(*state)[1][3];
393 (*state)[1][3]=(*state)[2][3];
394 (*state)[2][3]=(*state)[3][3];
411 for(round = 1; round <
Nr; ++round)
437 for(round=
Nr-1;round>0;round--)
453 static void BlockCopy(uint8_t* output,
const uint8_t* input)
458 output[i] = input[i];
467 #if defined(ECB) && ECB 499 #endif // #if defined(ECB) && ECB 505 #if defined(CBC) && CBC 509 static void XorWithIv(uint8_t* buf)
512 for(i = 0; i <
KEYLEN; ++i)
522 uint8_t remainders = length %
KEYLEN;
539 for(i = 0; i < length; i +=
KEYLEN)
563 uint8_t remainders = length %
KEYLEN;
581 for(i = 0; i < length; i +=
KEYLEN)
602 #endif // #if defined(CBC) && CBC static const uint8_t rsbox[256]
static uint8_t RoundKey[176]
static ICACHE_FLASH_ATTR void Cipher(void)
static const uint8_t Rcon[255]
static ICACHE_FLASH_ATTR void InvCipher(void)
static const uint8_t * Key
static const uint8_t sbox[256]
static ICACHE_FLASH_ATTR void MixColumns(void)
#define ICACHE_FLASH_ATTR
ICACHE_FLASH_ATTR void AES128_CBC_decrypt_buffer(uint8_t *output, uint8_t *input, uint32_t length, const uint8_t *key, uint8_t *iv)
static ICACHE_FLASH_ATTR void SubBytes(void)
static ICACHE_FLASH_ATTR void BlockCopy(uint8_t *output, const uint8_t *input)
static ICACHE_FLASH_ATTR void AddRoundKey(uint8_t round)
ICACHE_FLASH_ATTR void AES128_ECB_encrypt(const uint8_t *input, const uint8_t *key, uint8_t *output)
static ICACHE_FLASH_ATTR uint8_t getSBoxValue(uint8_t num)
ICACHE_FLASH_ATTR void AES128_ECB_decrypt(const uint8_t *input, const uint8_t *key, uint8_t *output)
ICACHE_FLASH_ATTR void AES128_CBC_encrypt_buffer(uint8_t *output, uint8_t *input, uint32_t length, const uint8_t *key, uint8_t *iv)
static ICACHE_FLASH_ATTR void KeyExpansion(void)
static ICACHE_FLASH_ATTR void ShiftRows(void)
static ICACHE_FLASH_ATTR uint8_t xtime(uint8_t x)
static ICACHE_FLASH_ATTR uint8_t getSBoxInvert(uint8_t num)
static ICACHE_FLASH_ATTR void InvSubBytes(void)
static ICACHE_FLASH_ATTR void InvMixColumns(void)
static ICACHE_FLASH_ATTR void InvShiftRows(void)