#ifndef AES_HPP_ #define AES_HPP_ #include class FiniteFieldCalculator { private: uint16_t irreducible_polynomial; public: FiniteFieldCalculator(uint16_t irreducible_polynomial); template 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