20 #ifndef _ANCH_CRYPTO_AES_H_ 21 #define _ANCH_CRYPTO_AES_H_ 23 #include "crypto/cipher/blockCipher.hpp" 51 template<std::
size_t K, std::
size_t R>
59 uint32_t _expKey[4*(R+1)];
70 AES(
const uint8_t key[4*K]): _state(), _expKey() {
80 AES(
const AES& other): _state(), _expKey() {
81 std::memcpy(_expKey, other._expKey, 4 * (R + 1) *
sizeof(uint32_t));
104 void cipher(
const std::array<uint8_t,16>& input, std::array<uint8_t,16>& output) {
105 std::memcpy(&_state, input.data(), 16);
106 unsigned int round = 0;
113 for(round = 1 ; round < R ; ++round) {
127 std::memcpy(output.data(), &_state, 16);
136 void decipher(
const std::array<uint8_t,16>& input, std::array<uint8_t,16>& output) {
137 std::memcpy(&_state, input.data(), 16);
138 unsigned int round = R;
147 for(round = R - 1 ; round > 0 ; --round) {
149 decipherMixColumns();
159 std::memcpy(output.data(), &_state, 16);
168 void expandKey(
const uint8_t key[4*K]) {
169 std::memcpy(_expKey, key, 4*K);
170 for(std::size_t i = K ; i < 4*(R+1) ; ++i) {
171 uint32_t mod = i % K;
173 _expKey[i] = _expKey[i-K] ^ (subWord(rotateWord(_expKey[i-1])) ^ ANCH_AES_RCON[i/K]);
174 }
else if(K > 6 && mod == 4) {
175 _expKey[i] = _expKey[i-K] ^ subWord(_expKey[i-1]);
177 _expKey[i] = _expKey[i-K] ^ _expKey[i-1];
190 inline uint32_t subWord(
const uint32_t& word) {
192 uint8_t* resBytes =
reinterpret_cast<uint8_t*
>(&res);
193 const uint8_t*
const bytes =
reinterpret_cast<const uint8_t* const
>(&word);
194 resBytes[0] = ANCH_AES_CIPHER_SBOX[bytes[0]];
195 resBytes[1] = ANCH_AES_CIPHER_SBOX[bytes[1]];
196 resBytes[2] = ANCH_AES_CIPHER_SBOX[bytes[2]];
197 resBytes[3] = ANCH_AES_CIPHER_SBOX[bytes[3]];
208 inline uint32_t rotateWord(
const uint32_t& word) {
209 return ((word << 24) | (word >> 8));
216 inline void cipherSubBytes() {
217 _state[0][0] = ANCH_AES_CIPHER_SBOX[_state[0][0]];
218 _state[0][1] = ANCH_AES_CIPHER_SBOX[_state[0][1]];
219 _state[0][2] = ANCH_AES_CIPHER_SBOX[_state[0][2]];
220 _state[0][3] = ANCH_AES_CIPHER_SBOX[_state[0][3]];
221 _state[1][0] = ANCH_AES_CIPHER_SBOX[_state[1][0]];
222 _state[1][1] = ANCH_AES_CIPHER_SBOX[_state[1][1]];
223 _state[1][2] = ANCH_AES_CIPHER_SBOX[_state[1][2]];
224 _state[1][3] = ANCH_AES_CIPHER_SBOX[_state[1][3]];
225 _state[2][0] = ANCH_AES_CIPHER_SBOX[_state[2][0]];
226 _state[2][1] = ANCH_AES_CIPHER_SBOX[_state[2][1]];
227 _state[2][2] = ANCH_AES_CIPHER_SBOX[_state[2][2]];
228 _state[2][3] = ANCH_AES_CIPHER_SBOX[_state[2][3]];
229 _state[3][0] = ANCH_AES_CIPHER_SBOX[_state[3][0]];
230 _state[3][1] = ANCH_AES_CIPHER_SBOX[_state[3][1]];
231 _state[3][2] = ANCH_AES_CIPHER_SBOX[_state[3][2]];
232 _state[3][3] = ANCH_AES_CIPHER_SBOX[_state[3][3]];
239 inline void decipherSubBytes() {
240 _state[0][0] = ANCH_AES_DECIPHER_SBOX[_state[0][0]];
241 _state[0][1] = ANCH_AES_DECIPHER_SBOX[_state[0][1]];
242 _state[0][2] = ANCH_AES_DECIPHER_SBOX[_state[0][2]];
243 _state[0][3] = ANCH_AES_DECIPHER_SBOX[_state[0][3]];
244 _state[1][0] = ANCH_AES_DECIPHER_SBOX[_state[1][0]];
245 _state[1][1] = ANCH_AES_DECIPHER_SBOX[_state[1][1]];
246 _state[1][2] = ANCH_AES_DECIPHER_SBOX[_state[1][2]];
247 _state[1][3] = ANCH_AES_DECIPHER_SBOX[_state[1][3]];
248 _state[2][0] = ANCH_AES_DECIPHER_SBOX[_state[2][0]];
249 _state[2][1] = ANCH_AES_DECIPHER_SBOX[_state[2][1]];
250 _state[2][2] = ANCH_AES_DECIPHER_SBOX[_state[2][2]];
251 _state[2][3] = ANCH_AES_DECIPHER_SBOX[_state[2][3]];
252 _state[3][0] = ANCH_AES_DECIPHER_SBOX[_state[3][0]];
253 _state[3][1] = ANCH_AES_DECIPHER_SBOX[_state[3][1]];
254 _state[3][2] = ANCH_AES_DECIPHER_SBOX[_state[3][2]];
255 _state[3][3] = ANCH_AES_DECIPHER_SBOX[_state[3][3]];
261 inline void cipherShiftRows() {
262 uint8_t tmp = _state[0][1];
263 _state[0][1] = _state[1][1];
264 _state[1][1] = _state[2][1];
265 _state[2][1] = _state[3][1];
268 _state[1][2] = _state[3][2];
271 _state[2][2] = _state[0][2];
274 _state[3][3] = _state[2][3];
275 _state[2][3] = _state[1][3];
276 _state[1][3] = _state[0][3];
283 inline void decipherShiftRows() {
284 uint8_t tmp = _state[3][1];
285 _state[3][1] = _state[2][1];
286 _state[2][1] = _state[1][1];
287 _state[1][1] = _state[0][1];
290 _state[1][2] = _state[3][2];
293 _state[2][2] = _state[0][2];
296 _state[0][3] = _state[1][3];
297 _state[1][3] = _state[2][3];
298 _state[2][3] = _state[3][3];
305 inline void cipherMixColumns() {
308 state[0] = _state[0][0];
309 state[1] = _state[0][1];
310 state[2] = _state[0][2];
311 state[3] = _state[0][3];
317 state[0] = _state[1][0];
318 state[1] = _state[1][1];
319 state[2] = _state[1][2];
320 state[3] = _state[1][3];
326 state[0] = _state[2][0];
327 state[1] = _state[2][1];
328 state[2] = _state[2][2];
329 state[3] = _state[2][3];
335 state[0] = _state[3][0];
336 state[1] = _state[3][1];
337 state[2] = _state[3][2];
338 state[3] = _state[3][3];
348 inline void decipherMixColumns() {
351 state[0] = _state[0][0];
352 state[1] = _state[0][1];
353 state[2] = _state[0][2];
354 state[3] = _state[0][3];
360 state[0] = _state[1][0];
361 state[1] = _state[1][1];
362 state[2] = _state[1][2];
363 state[3] = _state[1][3];
369 state[0] = _state[2][0];
370 state[1] = _state[2][1];
371 state[2] = _state[2][2];
372 state[3] = _state[2][3];
378 state[0] = _state[3][0];
379 state[1] = _state[3][1];
380 state[2] = _state[3][2];
381 state[3] = _state[3][3];
393 inline void addRoundKey(
const uint32_t& round) {
394 uint32_t* key = _expKey + 4 * round;
395 uint32_t* state =
reinterpret_cast<uint32_t*
>(_state);
408 #endif // _ANCH_CRYPTO_AES_H_ const uint8_t ANCH_GALOIS_MULT3[256]
Definition: blockCipher.cpp:49
const uint8_t ANCH_AES_CIPHER_SBOX[256]
Definition: aes.cpp:52
const uint32_t ANCH_AES_RCON[11]
Definition: aes.cpp:124
const uint8_t ANCH_GALOIS_MULT9[256]
Definition: blockCipher.cpp:69
Block cipher interface.
Definition: blockCipher.hpp:59
const uint8_t ANCH_AES_DECIPHER_SBOX[256]
Definition: aes.cpp:88
void decipher(const std::array< uint8_t, 16 > &input, std::array< uint8_t, 16 > &output)
Definition: aes.hpp:136
const uint8_t ANCH_GALOIS_MULT11[256]
Definition: blockCipher.cpp:89
AnCH framework base namespace.
Definition: base64.hpp:28
AES(const AES &other)
Definition: aes.hpp:80
const uint8_t ANCH_GALOIS_MULT2[256]
Definition: blockCipher.cpp:29
AES block cipher algorithm implementation.
Definition: aes.hpp:52
AES(const uint8_t key[4 *K])
Definition: aes.hpp:70
const uint8_t ANCH_GALOIS_MULT14[256]
Definition: blockCipher.cpp:129
const uint8_t ANCH_GALOIS_MULT13[256]
Definition: blockCipher.cpp:109
void cipher(const std::array< uint8_t, 16 > &input, std::array< uint8_t, 16 > &output)
Definition: aes.hpp:104
virtual ~AES()
Definition: aes.hpp:90