42 lines
1.1 KiB
C++
42 lines
1.1 KiB
C++
#ifndef AES_HPP_
|
|
#define AES_HPP_
|
|
|
|
#include <cstdint>
|
|
|
|
class FiniteFieldCalculator
|
|
{
|
|
private:
|
|
uint16_t irreducible_polynomial;
|
|
public:
|
|
FiniteFieldCalculator(uint16_t irreducible_polynomial);
|
|
template <typename T>
|
|
T add(T a, T b) const {
|
|
return a ^ b;
|
|
}
|
|
uint8_t mult2(uint8_t value) const;
|
|
uint8_t mult3(uint8_t value) const;
|
|
uint8_t reduce(uint16_t value) const;
|
|
uint16_t get_irreducible_polynomial() const;
|
|
};
|
|
|
|
class AES
|
|
{
|
|
private:
|
|
static const uint8_t sbox[256];
|
|
static const uint8_t rsbox[256];
|
|
static const uint8_t rc[10];
|
|
static const FiniteFieldCalculator ffcalc;
|
|
public:
|
|
AES();
|
|
static void encrypt_ecb(uint8_t data[16], const uint8_t key[16]);
|
|
static void construct_round_keys(const uint8_t initial_key_[16], uint8_t round_keys_[11][16]);
|
|
static uint32_t roundkey_g(uint32_t last_roundkey, uint8_t round);
|
|
static void add_round_key(uint8_t data[16], const uint8_t key[16]);
|
|
static void shift_rows(uint8_t data[16]);
|
|
static void sub_bytes(uint8_t data[16]);
|
|
static void mix_columns(uint8_t data[16]);
|
|
static void print_data(uint8_t data[16]);
|
|
};
|
|
|
|
#endif
|