#ifndef AES_HPP_
#define AES_HPP_

#include <cstdint>

class AES
{
private:
	static const uint8_t sbox[256];
	static const uint8_t rc[10];
	static const uint8_t irreducible_polynomial;
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 uint8_t gf_mult2(uint8_t value);
	static uint8_t gf_mult3(uint8_t value);
	static uint8_t gf_reduce(uint8_t value);
};

#endif
