8#include <botan/internal/pk_ops_impl.h>
9#include <botan/internal/bit_ops.h>
15 m_eme(
EME::create(eme))
21 return 8 * m_eme->maximum_input_size(max_raw_input_bits());
27 const size_t max_raw = max_raw_input_bits();
28 const std::vector<uint8_t> encoded =
unlock(m_eme->encode(msg, msg_len, max_raw, rng));
29 return raw_encrypt(encoded.data(), encoded.size(), rng);
33 m_eme(
EME::create(eme))
39 const uint8_t ciphertext[],
40 size_t ciphertext_len)
43 return m_eme->unpad(valid_mask, raw.data(), raw.size());
53 const uint8_t w[],
size_t w_len,
54 const uint8_t salt[],
size_t salt_len)
58 return m_kdf->derive_key(key_len, z, salt,
salt_len);
64 m_emsa(
EMSA::create_or_throw(emsa)),
68 if(!with_message_recovery && m_emsa->requires_message_recovery())
71 " requires message recovery, which is not supported by this scheme");
77 if(has_prefix() && !m_prefix_used)
81 m_emsa->update(prefix.data(), prefix.size());
83 m_emsa->update(msg, msg_len);
88 m_prefix_used =
false;
90 const auto padded = m_emsa->encoding_of(msg, this->max_input_bits(), rng);
91 return raw_sign(padded.data(), padded.size(), rng);
96 m_emsa(
EMSA::create_or_throw(emsa)),
100 if(!with_message_recovery && m_emsa->requires_message_recovery())
103 " requires message recovery, which is not supported by this scheme");
109 if(has_prefix() && !m_prefix_used)
111 m_prefix_used =
true;
113 m_emsa->update(prefix.data(), prefix.size());
115 m_emsa->update(msg, msg_len);
120 m_prefix_used =
false;
126 return m_emsa->verify(output_of_key, msg, max_input_bits());
132 return verify(encoded.data(), encoded.size(), sig, sig_len);
138 size_t desired_shared_key_len,
140 const uint8_t salt[],
144 this->raw_kem_encrypt(out_encapsulated_key, raw_shared, rng);
146 out_shared_key = (m_kdf)
147 ? m_kdf->derive_key(desired_shared_key_len,
148 raw_shared.data(), raw_shared.size(),
162 size_t desired_shared_key_len,
163 const uint8_t salt[],
169 return m_kdf->derive_key(desired_shared_key_len,
170 raw_shared.data(), raw_shared.size(),
static std::unique_ptr< KDF > create_or_throw(const std::string &algo_spec, const std::string &provider="")
secure_vector< uint8_t > decrypt(uint8_t &valid_mask, const uint8_t msg[], size_t msg_len) override
Decryption_with_EME(const std::string &eme)
size_t max_input_bits() const override
secure_vector< uint8_t > encrypt(const uint8_t msg[], size_t msg_len, RandomNumberGenerator &rng) override
Encryption_with_EME(const std::string &eme)
KEM_Decryption_with_KDF(const std::string &kdf)
secure_vector< uint8_t > kem_decrypt(const uint8_t encap_key[], size_t len, size_t desired_shared_key_len, const uint8_t salt[], size_t salt_len) override
void kem_encrypt(secure_vector< uint8_t > &out_encapsulated_key, secure_vector< uint8_t > &out_shared_key, size_t desired_shared_key_len, Botan::RandomNumberGenerator &rng, const uint8_t salt[], size_t salt_len) override
KEM_Encryption_with_KDF(const std::string &kdf)
Key_Agreement_with_KDF(const std::string &kdf)
secure_vector< uint8_t > agree(size_t key_len, const uint8_t other_key[], size_t other_key_len, const uint8_t salt[], size_t salt_len) override
void update(const uint8_t msg[], size_t msg_len) override
Signature_with_EMSA(const std::string &emsa, bool with_message_recovery=false)
secure_vector< uint8_t > sign(RandomNumberGenerator &rng) override
void update(const uint8_t msg[], size_t msg_len) override
bool is_valid_signature(const uint8_t sig[], size_t sig_len) override
Verification_with_EMSA(const std::string &emsa, bool has_message_recovery=false)
std::vector< T > unlock(const secure_vector< T > &in)
std::string hash_for_emsa(const std::string &algo_spec)
std::vector< T, secure_allocator< T > > secure_vector