11#include <botan/pk_keys.h>
12#include <botan/pk_ops_fwd.h>
13#include <botan/symkey.h>
14#include <botan/asn1_obj.h>
21class RandomNumberGenerator;
38 std::vector<uint8_t>
encrypt(
const uint8_t in[],
size_t length,
41 return enc(in, length, rng);
50 std::vector<uint8_t>
encrypt(std::span<const uint8_t> in,
53 return enc(in.data(), in.size(), rng);
76 virtual
std::vector<uint8_t> enc(const uint8_t[],
size_t,
104 return decrypt(in.data(), in.size());
114 decrypt_or_random(
const uint8_t in[],
116 size_t expected_pt_len,
134 decrypt_or_random(
const uint8_t in[],
136 size_t expected_pt_len,
138 const uint8_t required_content_bytes[],
139 const uint8_t required_content_offsets[],
140 size_t required_contents)
const;
157 virtual
secure_vector<uint8_t> do_decrypt(uint8_t& valid_mask,
158 const uint8_t in[],
size_t in_len) const = 0;
180 std::string_view padding,
182 std::string_view provider =
"");
198 std::vector<uint8_t> sign_message(const uint8_t in[],
size_t length,
202 return this->signature(rng);
214 return sign_message(in.data(), in.size(), rng);
228 void update(
const uint8_t in[],
size_t length);
236 update(in.data(), in.size());
267 size_t signature_length()
const;
282 std::string hash_function()
const;
285 std::unique_ptr<PK_Ops::Signature> m_op;
287 size_t m_parts, m_part_size;
306 std::string_view padding,
308 std::string_view provider =
"");
323 std::string_view provider =
"");
340 bool verify_message(const uint8_t msg[],
size_t msg_length,
341 const uint8_t sig[],
size_t sig_length);
348 bool verify_message(
std::span<const uint8_t> msg,
349 std::span<const uint8_t> sig)
351 return verify_message(msg.data(), msg.size(),
352 sig.data(), sig.size());
368 void update(
const uint8_t msg_part[],
size_t length);
377 update(in.data(), in.size());
396 bool check_signature(
const uint8_t sig[],
size_t length);
406 return check_signature(sig.data(), sig.size());
421 std::string hash_function()
const;
424 std::unique_ptr<PK_Ops::Verification> m_op;
426 size_t m_parts, m_part_size;
445 std::string_view kdf,
446 std::string_view provider =
"");
468 const uint8_t params[],
469 size_t params_len) const;
479 std::span<const uint8_t> in,
480 const uint8_t params[],
size_t params_len)
const
482 return derive_key(key_len, in.data(), in.size(),
494 const uint8_t in[],
size_t in_len,
495 std::string_view params =
"")
const
497 return derive_key(key_len, in, in_len,
509 const std::span<const uint8_t> in,
510 std::string_view params =
"")
const
512 return derive_key(key_len, in.data(), in.size(),
522 size_t agreed_value_size()
const;
525 std::unique_ptr<PK_Ops::Key_Agreement> m_op;
535 size_t maximum_input_size()
const override;
546 std::string_view padding,
547 std::string_view provider =
"");
560 size_t ciphertext_length(
size_t ptext_len)
const override;
562 std::vector<uint8_t> enc(
const uint8_t[],
size_t,
565 std::unique_ptr<PK_Ops::Encryption> m_op;
583 std::string_view eme,
584 std::string_view provider =
"");
586 size_t plaintext_length(
size_t ptext_len)
const override;
596 size_t in_len)
const override;
598 std::unique_ptr<PK_Ops::Decryption> m_op;
614 std::string_view kem_param =
"",
615 std::string_view provider =
"");
624 BOTAN_DEPRECATED(
"Use constructor that does not take RNG")
627 std::string_view kem_param = "",
628 std::string_view provider = "") :
655 size_t shared_key_length(
size_t desired_shared_key_len)
const;
660 size_t encapsulated_key_length()
const;
673 size_t desired_shared_key_len,
675 const uint8_t salt[],
688 size_t desired_shared_key_len,
690 std::span<const uint8_t> salt)
692 this->encrypt(out_encapsulated_key,
694 desired_shared_key_len,
696 salt.data(), salt.size());
709 size_t desired_shared_key_len,
712 this->encrypt(out_encapsulated_key,
714 desired_shared_key_len,
721 std::unique_ptr<PK_Ops::KEM_Encryption> m_op;
739 std::string_view kem_param =
"",
740 std::string_view provider =
"");
762 size_t shared_key_length(
size_t desired_shared_key_len)
const;
774 size_t encap_key_len,
775 size_t desired_shared_key_len,
776 const uint8_t salt[],
787 size_t encap_key_len,
788 size_t desired_shared_key_len)
790 return this->decrypt(encap_key, encap_key_len,
791 desired_shared_key_len,
803 size_t desired_shared_key_len,
804 std::span<const uint8_t> salt)
806 return this->decrypt(encap_key.data(), encap_key.size(),
807 desired_shared_key_len,
808 salt.data(), salt.size());
812 std::unique_ptr<PK_Ops::KEM_Decryption> m_op;
#define BOTAN_UNUSED(...)
PK_Decryptor_EME(PK_Decryptor_EME &&)=delete
PK_Decryptor_EME(const PK_Decryptor_EME &)=delete
PK_Decryptor_EME & operator=(PK_Decryptor_EME &&)=delete
PK_Decryptor_EME & operator=(const PK_Decryptor_EME &)=delete
virtual ~PK_Decryptor()=default
virtual size_t plaintext_length(size_t ctext_len) const =0
secure_vector< uint8_t > decrypt(std::span< const uint8_t > in) const
PK_Decryptor(const PK_Decryptor &)=delete
PK_Decryptor(PK_Decryptor &&) noexcept=delete
PK_Encryptor_EME & operator=(PK_Encryptor_EME &&)=delete
PK_Encryptor_EME(PK_Encryptor_EME &&)=delete
PK_Encryptor_EME & operator=(const PK_Encryptor_EME &)=delete
PK_Encryptor_EME(const PK_Encryptor_EME &)=delete
PK_Encryptor(PK_Encryptor &&) noexcept=delete
virtual size_t maximum_input_size() const =0
virtual size_t ciphertext_length(size_t ctext_len) const =0
std::vector< uint8_t > encrypt(std::span< const uint8_t > in, RandomNumberGenerator &rng) const
virtual ~PK_Encryptor()=default
std::vector< uint8_t > encrypt(const uint8_t in[], size_t length, RandomNumberGenerator &rng) const
PK_Encryptor(const PK_Encryptor &)=delete
PK_KEM_Decryptor(PK_KEM_Decryptor &&)=delete
PK_KEM_Decryptor & operator=(const PK_KEM_Decryptor &)=delete
secure_vector< uint8_t > decrypt(std::span< const uint8_t > encap_key, size_t desired_shared_key_len, std::span< const uint8_t > salt)
PK_KEM_Decryptor(const PK_KEM_Decryptor &)=delete
secure_vector< uint8_t > decrypt(const uint8_t encap_key[], size_t encap_key_len, size_t desired_shared_key_len)
PK_KEM_Decryptor & operator=(PK_KEM_Decryptor &&)=delete
void encrypt(secure_vector< uint8_t > &out_encapsulated_key, secure_vector< uint8_t > &out_shared_key, size_t desired_shared_key_len, RandomNumberGenerator &rng, std::span< const uint8_t > salt)
void encrypt(secure_vector< uint8_t > &out_encapsulated_key, secure_vector< uint8_t > &out_shared_key, size_t desired_shared_key_len, RandomNumberGenerator &rng)
PK_KEM_Encryptor(PK_KEM_Encryptor &&)=delete
PK_KEM_Encryptor & operator=(PK_KEM_Encryptor &&)=delete
PK_KEM_Encryptor(const PK_KEM_Encryptor &)=delete
PK_KEM_Encryptor & operator=(const PK_KEM_Encryptor &)=delete
SymmetricKey derive_key(size_t key_len, const std::span< const uint8_t > in, std::string_view params="") const
PK_Key_Agreement & operator=(const PK_Key_Agreement &)=delete
PK_Key_Agreement & operator=(PK_Key_Agreement &&)=delete
SymmetricKey derive_key(size_t key_len, const uint8_t in[], size_t in_len, std::string_view params="") const
PK_Key_Agreement(const PK_Key_Agreement &)=delete
PK_Key_Agreement(PK_Key_Agreement &&) noexcept
std::vector< uint8_t > sign_message(std::span< const uint8_t > in, RandomNumberGenerator &rng)
void update(std::string_view in)
void update(std::span< const uint8_t > in)
void set_output_format(Signature_Format format)
PK_Signer(const PK_Signer &)=delete
PK_Signer(PK_Signer &&) noexcept=delete
void update(std::span< const uint8_t > in)
PK_Verifier(const PK_Verifier &)=delete
void update(std::string_view in)
bool check_signature(std::span< const uint8_t > sig)
PK_Verifier(PK_Verifier &&) noexcept=delete
int(* update)(CTX *, const void *, CC_LONG len)
int(* final)(unsigned char *, CTX *)
#define BOTAN_PUBLIC_API(maj, min)
std::vector< T, secure_allocator< T > > secure_vector
const uint8_t * cast_char_ptr_to_uint8(const char *s)