8#include <botan/fpe_fe1.h> 
   11#include <botan/numthry.h> 
   12#include <botan/internal/divide.h> 
   13#include <botan/internal/fmt.h> 
   14#include <botan/internal/loadstor.h> 
   21const size_t MAX_N_BYTES = 128 / 8;
 
   45   a <<= (n_low_zero / 2);
 
   46   b <<= n_low_zero - (n_low_zero / 2);
 
   50      while(n % 
PRIMES[i] == 0) {
 
   64   if(a <= 1 || b <= 1) {
 
   80   if(m_n_bytes.size() > MAX_N_BYTES) {
 
 
  106   return fmt(
"FPE_FE1({},{})", m_mac->name(), m_rounds);
 
 
  110   return m_mac->key_spec();
 
 
  114   return m_mac->has_keying_material();
 
 
  117void FPE_FE1::key_schedule(std::span<const uint8_t> key) {
 
  121BigInt FPE_FE1::F(
const BigInt& R,
 
  127   m_mac->update(tweak_mac);
 
  128   m_mac->update_be(
static_cast<uint32_t
>(round));
 
  130   m_mac->update_be(
static_cast<uint32_t
>(tmp.size()));
 
  131   m_mac->update(tmp.data(), tmp.size());
 
  133   tmp = m_mac->final();
 
  138   m_mac->update_be(
static_cast<uint32_t
>(m_n_bytes.size()));
 
  139   m_mac->update(m_n_bytes.data(), m_n_bytes.size());
 
  141   m_mac->update_be(
static_cast<uint32_t
>(tweak_len));
 
  143      m_mac->update(tweak, tweak_len);
 
  146   return m_mac->final();
 
  159   for(
size_t i = 0; i != m_rounds; ++i) {
 
  161      Fi = F(R, i, tweak_mac, tmp);
 
 
  177   for(
size_t i = 0; i != m_rounds; ++i) {
 
  180      Fi = F(R, m_rounds - i - 1, tweak_mac, tmp);
 
 
  190   return encrypt(x, tweak8, 
sizeof(tweak8));
 
 
  196   return decrypt(x, tweak8, 
sizeof(tweak8));
 
 
  202   FPE_FE1 fpe(n, 3, 
true, 
"HMAC(SHA-256)");
 
 
  208   FPE_FE1 fpe(n, 3, 
true, 
"HMAC(SHA-256)");
 
 
 
#define BOTAN_ARG_CHECK(expr, msg)
 
const word * data() const
 
static BigInt from_bytes(std::span< const uint8_t > bytes)
 
static BigInt from_word(word n)
 
T serialize(size_t len) const
 
BigInt encrypt(const BigInt &x, const uint8_t tweak[], size_t tweak_len) const
 
std::string name() const override
 
BOTAN_FUTURE_EXPLICIT FPE_FE1(const BigInt &n, size_t rounds=5, bool compat_mode=false, std::string_view mac_algo="HMAC(SHA-256)")
 
bool has_keying_material() const override
 
Key_Length_Specification key_spec() const override
 
BigInt decrypt(const BigInt &x, const uint8_t tweak[], size_t tweak_len) const
 
static std::unique_ptr< MessageAuthenticationCode > create_or_throw(std::string_view algo_spec, std::string_view provider="")
 
void set_key(const OctetString &key)
 
BigInt fe1_decrypt(const BigInt &n, const BigInt &X, const SymmetricKey &key, const std::vector< uint8_t > &tweak)
 
BigInt fe1_encrypt(const BigInt &n, const BigInt &X, const SymmetricKey &key, const std::vector< uint8_t > &tweak)
 
std::string fmt(std::string_view format, const T &... args)
 
size_t low_zero_bits(const BigInt &n)
 
const size_t PRIME_TABLE_SIZE
 
BigInt ct_modulo(const BigInt &x, const BigInt &y)
 
void ct_divide(const BigInt &x, const BigInt &y, BigInt &q_out, BigInt &r_out)
 
std::vector< T, secure_allocator< T > > secure_vector
 
constexpr auto store_be(ParamTs &&... params)