22#ifndef PROTOCORE_AES_BLOCK_H
23#define PROTOCORE_AES_BLOCK_H
32 return (uint8_t)((a << 1) ^ ((a >> 7) ? 0x1bu : 0x00u));
38 return ((uint32_t)PC_AES_SBOX[w >> 24] << 24) | ((uint32_t)PC_AES_SBOX[(w >> 16) & 0xff] << 16) |
39 ((uint32_t)PC_AES_SBOX[(w >> 8) & 0xff] << 8) | (uint32_t)PC_AES_SBOX[w & 0xff];
45 return (w << 8) | (w >> 24);
55 static const uint8_t RCON[11] = {0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36};
56 for (
int i = 0; i < nk; i++)
58 rk[i] = ((uint32_t)key[4 * i] << 24) | ((uint32_t)key[4 * i + 1] << 16) | ((uint32_t)key[4 * i + 2] << 8) |
59 (uint32_t)key[4 * i + 3];
62 int total = 4 * (nk + 7);
63 for (
int i = nk; i < total; i++)
65 uint32_t t = rk[i - 1];
70 else if (nk > 6 && i % nk == 4)
74 rk[i] = rk[i - nk] ^ t;
85 for (
int i = 0; i < 16; i++)
87 s[i] = in[i] ^ (uint8_t)(rk[i / 4] >> (24 - (i % 4) * 8));
90 for (
int r = 1; r < nr; r++)
92 for (
int i = 0; i < 16; i++)
94 s[i] = PC_AES_SBOX[s[i]];
115 for (
int c = 0; c < 4; c++)
117 uint8_t a = s[c * 4];
118 uint8_t b = s[c * 4 + 1];
119 uint8_t cc = s[c * 4 + 2];
120 uint8_t d = s[c * 4 + 3];
121 uint8_t e = a ^ b ^ cc ^ d;
128 for (
int i = 0; i < 16; i++)
130 s[i] ^= (uint8_t)(rk[r * 4 + i / 4] >> (24 - (i % 4) * 8));
134 for (
int i = 0; i < 16; i++)
136 s[i] = PC_AES_SBOX[s[i]];
157 for (
int i = 0; i < 16; i++)
159 s[i] ^= (uint8_t)(rk[nr * 4 + i / 4] >> (24 - (i % 4) * 8));
uint8_t pc_aes_xtime(uint8_t a)
GF(2^8) multiply-by-2 (xtime) for the AES MixColumns step.
void pc_aes_key_expand(const uint8_t *key, int nk, uint32_t *rk)
AES key expansion (FIPS 197 sec 5.2). nk key words (4=AES-128, 8=AES-256); rk receives 4*(nk + 7) rou...
uint32_t pc_aes_sub_word(uint32_t w)
AES SubWord (FIPS 197 sec 5.2): apply the S-box to each of the four bytes of a 32-bit word.
uint32_t pc_aes_rot_word(uint32_t w)
AES RotWord (FIPS 197 sec 5.2): cyclically rotate a 32-bit word one byte left.
void pc_aes_encrypt_block(const uint32_t *rk, int nr, const uint8_t in[16], uint8_t out[16])
AES single-block encrypt (FIPS 197 sec 5.1), nr rounds (10=AES-128, 14=AES-256). State is column-majo...
The AES forward S-box (FIPS 197 Figure 7) - one shared copy.