11#include <botan/internal/gf2m_small_m.h>
13#include <botan/exceptn.h>
14#include <botan/internal/ct_utils.h>
24using GF2m_Tables = std::array<std::vector<gf2m>,
MAX_EXT_DEG + 1>;
45std::vector<gf2m> gf_exp_table(
size_t deg,
gf2m prime_poly) {
48 std::vector<gf2m> tab((
static_cast<size_t>(1) << deg) + 1);
51 for(
size_t i = 1; i < tab.size(); ++i) {
52 const gf2m overflow = tab[i - 1] >> (deg - 1);
53 tab[i] = (tab[i - 1] << 1) ^ (overflow * prime_poly);
59const GF2m_Tables& exp_tables() {
60 static const GF2m_Tables tables = [] {
62 for(
size_t degree = 2; degree <=
MAX_EXT_DEG; ++degree) {
63 result[degree] = gf_exp_table(degree, prim_poly[degree]);
70const std::vector<gf2m>& exp_table(
size_t deg) {
72 throw Invalid_Argument(
"GF2m_Field does not support degree " + std::to_string(deg));
74 return exp_tables()[deg];
77std::vector<gf2m> gf_log_table(
size_t deg,
const std::vector<gf2m>& exp) {
78 std::vector<gf2m> tab(
static_cast<size_t>(1) << deg);
80 tab[0] =
static_cast<gf2m>((
static_cast<gf2m>(1) << deg) - 1);
81 for(
size_t i = 0; i < tab.size(); ++i) {
82 tab[exp[i]] =
static_cast<gf2m>(i);
87const GF2m_Tables& log_tables() {
88 static const GF2m_Tables tables = [] {
90 for(
size_t degree = 2; degree <=
MAX_EXT_DEG; ++degree) {
91 result[degree] = gf_log_table(degree, exp_table(degree));
98const std::vector<gf2m>& log_table(
size_t deg) {
100 throw Invalid_Argument(
"GF2m_Field does not support degree " + std::to_string(deg));
102 return log_tables()[deg];
108 mem[0] = to_enc >> 8;
109 mem[1] = to_enc & 0xFF;
110 return sizeof(to_enc);
114 gf2m result = mem[0] << 8;
120 m_gf_extension_degree(extdeg),
121 m_gf_multiplicative_order((1 << extdeg) - 1),
122 m_gf_log_table(log_table(m_gf_extension_degree)),
123 m_gf_exp_table(exp_table(m_gf_extension_degree)) {}
126 const int32_t sub_res =
static_cast<int32_t
>(
gf_log(x) -
static_cast<int32_t
>(
gf_log(y)));
127 const gf2m modq_res = _gf_modq_1(sub_res);
static constexpr Mask< T > is_zero(T x)
gf2m gf_div(gf2m x, gf2m y) const
GF2m_Field(size_t extdeg)
gf2m gf_exp(gf2m i) const
gf2m gf_log(gf2m i) const
gf2m decode_gf2m(const uint8_t *mem)
uint32_t encode_gf2m(gf2m to_enc, uint8_t *mem)