34 kAesNumTextBytes = 16,
35 kAesNumStateBytes = 16,
39 static void aes_add_round_key(uint32_t *state,
const uint32_t *round_key) {
40 state[0] ^= round_key[0];
41 state[1] ^= round_key[1];
42 state[2] ^= round_key[2];
43 state[3] ^= round_key[3];
46 static void aes_sub_bytes(uint32_t *state) {
49 for (
size_t i = 0; i < 4; ++i) {
50 state[i] = (uint32_t)kSbox[state[i] & 0xff] |
51 ((uint32_t)kSbox[(state[i] >> 8) & 0xff] << 8) |
52 ((uint32_t)kSbox[(state[i] >> 16) & 0xff] << 16) |
53 ((uint32_t)kSbox[(state[i] >> 24) & 0xff] << 24);
57 static uint32_t aes_mul2(uint32_t s) {
61 t = (uint32_t)kMul2[s & 0xff] | ((uint32_t)kMul2[(s >> 8) & 0xff] << 8) |
62 ((uint32_t)kMul2[(s >> 16) & 0xff] << 16) |
63 ((uint32_t)kMul2[(s >> 24) & 0xff] << 24);
67 static void aes_shift_rows(uint32_t *state) {
70 state[1] = (state[1] >> 8) | (state[1] << 24);
71 state[2] = (state[2] >> 16) | (state[2] << 16);
72 state[3] = (state[3] >> 24) | (state[3] << 8);
75 static void aes_mix_columns(uint32_t *state) {
78 uint32_t temp[kAesNumStateWords];
80 memcpy(temp, state, kAesNumStateBytes);
82 state[0] = temp[1] ^ temp[2] ^ temp[3];
83 state[1] = temp[0] ^ temp[2] ^ temp[3];
84 state[2] = temp[0] ^ temp[1] ^ temp[3];
85 state[3] = temp[0] ^ temp[1] ^ temp[2];
87 temp[0] = aes_mul2(temp[0]);
88 temp[1] = aes_mul2(temp[1]);
89 temp[2] = aes_mul2(temp[2]);
90 temp[3] = aes_mul2(temp[3]);
92 state[0] ^= temp[0] ^ temp[1];
93 state[1] ^= temp[1] ^ temp[2];
94 state[2] ^= temp[2] ^ temp[3];
95 state[3] ^= temp[3] ^ temp[0];
98 static void aes_transpose_to_32(uint8_t *in_data, uint32_t *out_data) {
99 out_data[0] = (uint32_t)in_data[0] | ((uint32_t)in_data[4] << 8) |
100 ((uint32_t)in_data[8] << 16) | ((uint32_t)in_data[12] << 24);
101 out_data[1] = (uint32_t)in_data[1] | ((uint32_t)in_data[5] << 8) |
102 ((uint32_t)in_data[9] << 16) | ((uint32_t)in_data[13] << 24);
103 out_data[2] = (uint32_t)in_data[2] | ((uint32_t)in_data[6] << 8) |
104 ((uint32_t)in_data[10] << 16) | ((uint32_t)in_data[14] << 24);
105 out_data[3] = (uint32_t)in_data[3] | ((uint32_t)in_data[7] << 8) |
106 ((uint32_t)in_data[11] << 16) | ((uint32_t)in_data[15] << 24);
109 static void aes_transpose_from_32(uint32_t *in_data, uint8_t *out_data) {
110 out_data[0] = (uint8_t)(in_data[0] & 0xff);
111 out_data[1] = (uint8_t)(in_data[1] & 0xff);
112 out_data[2] = (uint8_t)(in_data[2] & 0xff);
113 out_data[3] = (uint8_t)(in_data[3] & 0xff);
114 out_data[4] = (uint8_t)(in_data[0] >> 8) & 0xff;
115 out_data[5] = (uint8_t)(in_data[1] >> 8) & 0xff;
116 out_data[6] = (uint8_t)(in_data[2] >> 8) & 0xff;
117 out_data[7] = (uint8_t)(in_data[3] >> 8) & 0xff;
118 out_data[8] = (uint8_t)(in_data[0] >> 16) & 0xff;
119 out_data[9] = (uint8_t)(in_data[1] >> 16) & 0xff;
120 out_data[10] = (uint8_t)(in_data[2] >> 16) & 0xff;
121 out_data[11] = (uint8_t)(in_data[3] >> 16) & 0xff;
122 out_data[12] = (uint8_t)(in_data[0] >> 24) & 0xff;
123 out_data[13] = (uint8_t)(in_data[1] >> 24) & 0xff;
124 out_data[14] = (uint8_t)(in_data[2] >> 24) & 0xff;
125 out_data[15] = (uint8_t)(in_data[3] >> 24) & 0xff;
128 static uint8_t aes_rcon_next(uint8_t rcon) {
139 static void aes_key_expand(uint8_t *round_key, uint8_t *rcon) {
140 uint8_t temp[kAesNumStateWords];
141 uint8_t old_key[kAesNumKeyBytes];
144 memcpy(old_key, round_key, kAesNumKeyBytes);
147 temp[0] = old_key[13];
148 temp[1] = old_key[14];
149 temp[2] = old_key[15];
150 temp[3] = old_key[12];
153 temp[0] = kSbox[temp[0]];
154 temp[1] = kSbox[temp[1]];
155 temp[2] = kSbox[temp[2]];
156 temp[3] = kSbox[temp[3]];
159 *rcon = aes_rcon_next(*rcon);
162 round_key[0] = temp[0] ^ old_key[0] ^ *rcon;
163 round_key[1] = temp[1] ^ old_key[1];
164 round_key[2] = temp[2] ^ old_key[2];
165 round_key[3] = temp[3] ^ old_key[3];
167 for (
size_t i = 4; i < kAesNumKeyBytes; ++i) {
168 round_key[i] = round_key[i - 4] ^ old_key[i];
172 void aes_key_schedule(uint32_t *round_keys,
const uint8_t *key) {
176 uint8_t key_temp[kAesNumKeyBytes];
177 uint32_t key_temp_32[kAesNumStateWords];
179 memcpy(key_temp, key, kAesNumKeyBytes);
180 aes_transpose_to_32(key_temp, key_temp_32);
181 memcpy(round_keys, key_temp_32, kAesNumKeyBytes);
182 for (
size_t i = 1; i < kAesNumRounds + 1; ++i) {
183 aes_key_expand(key_temp, &rcon);
184 aes_transpose_to_32(key_temp, key_temp_32);
185 memcpy(round_keys + i * kAesNumStateWords, key_temp_32, kAesNumKeyBytes);
189 void aes_sw_encrypt_block(
const uint8_t *plain_text,
const uint32_t *round_keys,
190 uint8_t *cipher_text) {
191 uint32_t state[kAesNumStateWords];
194 uint8_t pt[kAesNumTextBytes];
195 memcpy(pt, plain_text, kAesNumTextBytes);
196 aes_transpose_to_32(pt, state);
199 aes_add_round_key(state, round_keys);
200 for (
int j = 0; j < kAesNumRounds - 1; ++j) {
201 aes_sub_bytes(state);
202 aes_shift_rows(state);
203 aes_mix_columns(state);
204 aes_add_round_key(state, round_keys + (j + 1) * kAesNumStateWords);
206 aes_sub_bytes(state);
207 aes_shift_rows(state);
208 aes_add_round_key(state, round_keys + kAesNumStateWords * kAesNumRounds);
211 aes_transpose_from_32(state, cipher_text);