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