8 #include <botan/numthry.h>
10 #include <botan/internal/bit_ops.h>
11 #include <botan/loadstor.h>
12 #include <botan/reducer.h>
13 #include <botan/internal/primality.h>
20 class Prime_Sieve
final
23 Prime_Sieve(
const BigInt& init_value,
size_t sieve_size) :
26 for(
size_t i = 0; i !=
m_sieve.size(); ++i)
30 void step(word increment)
32 for(
size_t i = 0; i !=
m_sieve.size(); ++i)
38 bool passes(
bool check_2p1 =
false)
const
40 for(
size_t i = 0; i !=
m_sieve.size(); ++i)
78 size_t bits,
const BigInt& coprime,
79 size_t equiv,
size_t modulo,
105 if(equiv != 1 || modulo != 2 || coprime != 0)
106 throw Not_Implemented(
"random_prime equiv/modulo/coprime options not usable for small primes");
118 return ((rng.
next_byte() % 2) ? 11 : 13);
128 const uint16_t small_prime =
PRIMES[idx];
136 const size_t MAX_ATTEMPTS = 32*1024;
148 p += (modulo - (p % modulo)) + equiv;
150 Prime_Sieve sieve(p, bits);
152 for(
size_t attempt = 0; attempt <= MAX_ATTEMPTS; ++attempt)
159 if(p.
is_even() || sieve.passes(
true) ==
false)
221 if(coprime <= 1 || coprime.
is_even() || coprime.
bits() > 64)
222 throw Invalid_Argument(
"generate_rsa_prime coprime must be small odd positive integer");
224 const size_t MAX_ATTEMPTS = 32*1024;
228 BigInt p(keygen_rng, bits);
235 Prime_Sieve sieve(p, bits);
239 for(
size_t attempt = 0; attempt <= MAX_ATTEMPTS; ++attempt)
245 if(sieve.passes() ==
false)
const size_t PRIME_TABLE_SIZE
bool is_lucas_probable_prime(const BigInt &C, const Modular_Reducer &mod_C)
size_t low_zero_bits(const BigInt &n)
BigInt gcd(const BigInt &a, const BigInt &b)
size_t miller_rabin_test_iterations(size_t n_bits, size_t prob, bool random)
int(* final)(unsigned char *, CTX *)
BigInt ct_inverse_mod_odd_modulus(const BigInt &n, const BigInt &mod)
bool is_prime(const BigInt &n, RandomNumberGenerator &rng, size_t prob, bool is_random)
std::string to_string(const BER_Object &obj)
#define BOTAN_DEBUG_ASSERT(expr)
BigInt random_safe_prime(RandomNumberGenerator &rng, size_t bits)
BigInt random_prime(RandomNumberGenerator &rng, size_t bits, const BigInt &coprime, size_t equiv, size_t modulo, size_t prob)
bool is_miller_rabin_probable_prime(const BigInt &n, const Modular_Reducer &mod_n, RandomNumberGenerator &rng, size_t test_iterations)
BigInt generate_rsa_prime(RandomNumberGenerator &keygen_rng, RandomNumberGenerator &prime_test_rng, size_t bits, const BigInt &coprime, size_t prob)
std::vector< uint16_t > m_sieve
constexpr uint16_t make_uint16(uint8_t i0, uint8_t i1)