8 #include <botan/elgamal.h> 9 #include <botan/internal/pk_ops_impl.h> 10 #include <botan/keypair.h> 11 #include <botan/reducer.h> 12 #include <botan/blinding.h> 13 #include <botan/pow_mod.h> 74 size_t max_raw_input_bits()
const override {
return m_group.p_bits() - 1; }
76 ElGamal_Encryption_Operation(
const ElGamal_PublicKey& key,
const std::string& eme);
78 secure_vector<uint8_t> raw_encrypt(
const uint8_t msg[],
size_t msg_len,
79 RandomNumberGenerator& rng)
override;
82 const DL_Group m_group;
83 Fixed_Base_Power_Mod m_powermod_y_p;
86 ElGamal_Encryption_Operation::ElGamal_Encryption_Operation(
const ElGamal_PublicKey& key,
87 const std::string& eme) :
88 PK_Ops::Encryption_with_EME(eme),
89 m_group(key.get_group()),
90 m_powermod_y_p(key.get_y(), m_group.get_p())
94 secure_vector<uint8_t>
95 ElGamal_Encryption_Operation::raw_encrypt(
const uint8_t msg[],
size_t msg_len,
96 RandomNumberGenerator& rng)
98 BigInt m(msg, msg_len);
100 if(m >= m_group.
get_p())
101 throw Invalid_Argument(
"ElGamal encryption: Input is too large");
104 const BigInt k(rng, k_bits);
115 class ElGamal_Decryption_Operation final :
public PK_Ops::Decryption_with_EME
119 ElGamal_Decryption_Operation(
const ElGamal_PrivateKey& key,
120 const std::string& eme,
121 RandomNumberGenerator& rng);
123 secure_vector<uint8_t> raw_decrypt(
const uint8_t msg[],
size_t msg_len)
override;
125 const DL_Group m_group;
126 Fixed_Exponent_Power_Mod m_powermod_x_p;
130 ElGamal_Decryption_Operation::ElGamal_Decryption_Operation(
const ElGamal_PrivateKey& key,
131 const std::string& eme,
132 RandomNumberGenerator& rng) :
133 PK_Ops::Decryption_with_EME(eme),
134 m_group(key.get_group()),
135 m_powermod_x_p(key.get_x(), m_group.get_p()),
138 [](const BigInt& k) {
return k; },
139 [
this](
const BigInt& k) {
return m_powermod_x_p(k); })
143 secure_vector<uint8_t>
144 ElGamal_Decryption_Operation::raw_decrypt(
const uint8_t msg[],
size_t msg_len)
146 const size_t p_bytes = m_group.
p_bytes();
148 if(msg_len != 2 * p_bytes)
149 throw Invalid_Argument(
"ElGamal decryption: Invalid message");
151 BigInt a(msg, p_bytes);
152 const BigInt b(msg + p_bytes, p_bytes);
154 if(a >= m_group.
get_p() || b >= m_group.
get_p())
155 throw Invalid_Argument(
"ElGamal decryption: Invalid message");
166 std::unique_ptr<PK_Ops::Encryption>
168 const std::string& params,
169 const std::string& provider)
const 171 if(provider ==
"base" || provider.empty())
172 return std::unique_ptr<PK_Ops::Encryption>(
new ElGamal_Encryption_Operation(*
this, params));
176 std::unique_ptr<PK_Ops::Decryption>
178 const std::string& params,
179 const std::string& provider)
const 181 if(provider ==
"base" || provider.empty())
182 return std::unique_ptr<PK_Ops::Decryption>(
new ElGamal_Decryption_Operation(*
this, params, rng));
BigInt multiply_mod_p(const BigInt &x, const BigInt &y) const
ElGamal_PrivateKey(const AlgorithmIdentifier &alg_id, const secure_vector< uint8_t > &key_bits)
void randomize(RandomNumberGenerator &rng, size_t bitsize, bool set_high_bit=true)
bool check_key(RandomNumberGenerator &rng, bool) const override
BigInt power_g_p(const BigInt &x) const
bool encryption_consistency_check(RandomNumberGenerator &rng, const Private_Key &private_key, const Public_Key &public_key, const std::string &padding)
BigInt unblind(const BigInt &x) const
const BigInt & get_p() const
size_t exponent_bits() const
std::unique_ptr< PK_Ops::Encryption > create_encryption_op(RandomNumberGenerator &rng, const std::string ¶ms, const std::string &provider) const override
std::unique_ptr< PK_Ops::Decryption > create_decryption_op(RandomNumberGenerator &rng, const std::string ¶ms, const std::string &provider) const override
ElGamal_PublicKey()=default
BigInt blind(const BigInt &x) const
BigInt inverse_mod_p(const BigInt &x) const
bool check_key(RandomNumberGenerator &rng, bool) const override
static secure_vector< uint8_t > encode_1363(const BigInt &n, size_t bytes)
std::vector< T, secure_allocator< T > > secure_vector
static secure_vector< uint8_t > encode_fixed_length_int_pair(const BigInt &n1, const BigInt &n2, size_t bytes)
std::string algo_name() const override