11#include <botan/pk_keys.h>
12#include <botan/pk_ops_fwd.h>
13#include <botan/symkey.h>
37 return enc(in, length, rng);
47 return enc(in.data(), in.size(), rng);
105 size_t expected_pt_len,
124 size_t expected_pt_len,
126 const uint8_t required_content_bytes[],
127 const uint8_t required_content_offsets[],
128 size_t required_contents)
const;
152 virtual
secure_vector<uint8_t> do_decrypt(uint8_t& valid_mask, const uint8_t in[],
size_t in_len) const = 0;
172 std::string_view padding,
174 std::string_view provider =
"");
217 void update(
const uint8_t in[],
size_t length);
223 void update(std::span<const uint8_t> in) {
update(in.data(), in.size()); }
229 void update(std::string_view in);
249 size_t signature_length()
const;
264 std::string hash_function()
const;
267 std::unique_ptr<PK_Ops::Signature> m_op;
269 std::optional<size_t> m_sig_element_size;
287 std::string_view padding,
289 std::string_view provider =
"");
304 std::string_view provider =
"");
322 bool verify_message(const uint8_t msg[],
size_t msg_length, const uint8_t sig[],
size_t sig_length);
330 bool verify_message(std::span<const uint8_t> msg, std::span<const uint8_t> sig) {
331 return verify_message(msg.data(), msg.size(), sig.data(), sig.size());
347 void update(
const uint8_t msg_part[],
size_t length);
354 void update(std::span<const uint8_t> in) {
update(in.data(), in.size()); }
360 void update(std::string_view in);
369 bool check_signature(
const uint8_t sig[],
size_t length);
391 std::
string hash_function() const;
394 std::unique_ptr<
PK_Ops::Verification> m_op;
396 std::optional<
size_t> m_sig_element_size;
413 std::string_view kdf,
414 std::string_view provider =
"");
430 SymmetricKey derive_key(
size_t key_len, std::span<const uint8_t> peer_key, std::span<const uint8_t> salt) const;
441 size_t key_len, const uint8_t peer_key[],
size_t peer_key_len, const uint8_t salt[],
size_t salt_len)
const {
442 return this->
derive_key(key_len, {peer_key, peer_key_len}, {salt, salt_len});
453 std::span<const uint8_t> peer_key,
454 const uint8_t salt[],
455 size_t salt_len)
const {
456 return derive_key(key_len, peer_key.data(), peer_key.size(), salt, salt_len);
467 const uint8_t peer_key[],
469 std::string_view salt =
"")
const;
477 SymmetricKey derive_key(
size_t key_len, std::span<const uint8_t> peer_key, std::string_view salt =
"")
const;
484 size_t agreed_value_size()
const;
487 std::unique_ptr<PK_Ops::Key_Agreement> m_op;
507 std::string_view padding,
508 std::string_view provider =
"");
525 std::vector<uint8_t> enc(const uint8_t ptext[],
size_t len,
RandomNumberGenerator& rng) const override;
527 std::unique_ptr<
PK_Ops::Encryption> m_op;
546 std::string_view padding,
547 std::string_view provider =
"");
562 secure_vector<uint8_t> do_decrypt(uint8_t& valid_mask, const uint8_t in[],
size_t in_len) const override;
564 std::unique_ptr<
PK_Ops::Decryption> m_op;
590 return std::make_pair(std::exchange(kem.m_encapsulated_shared_key, {}), std::exchange(kem.m_shared_key, {}));
597 m_encapsulated_shared_key(encapsulated_size), m_shared_key(shared_key_size) {}
600 std::vector<uint8_t> m_encapsulated_shared_key;
616 std::string_view kem_param =
"",
617 std::string_view provider =
"");
629 std::string_view kem_param =
"",
630 std::string_view provider =
"");
673 size_t desired_shared_key_len = 32,
674 std::span<const uint8_t> salt = {}) {
675 std::vector<uint8_t> encapsulated_shared_key(encapsulated_key_length());
678 encrypt(std::span{encapsulated_shared_key}, std::span{shared_key}, rng, desired_shared_key_len, salt);
679 return KEM_Encapsulation(std::move(encapsulated_shared_key), std::move(shared_key));
695 size_t desired_shared_key_len = 32,
696 std::span<const uint8_t> salt = {}) {
697 out_encapsulated_key.resize(encapsulated_key_length());
698 out_shared_key.resize(shared_key_length(desired_shared_key_len));
699 encrypt(std::span{out_encapsulated_key}, std::span{out_shared_key}, rng, desired_shared_key_len, salt);
712 void encrypt(std::span<uint8_t> out_encapsulated_key,
713 std::span<uint8_t> out_shared_key,
714 RandomNumberGenerator& rng,
715 size_t desired_shared_key_len = 32,
716 std::span<const uint8_t> salt = {});
721 size_t desired_shared_key_len,
723 const uint8_t salt[],
725 this->
encrypt(out_encapsulated_key, out_shared_key, rng, desired_shared_key_len, {salt, salt_len});
731 size_t desired_shared_key_len,
733 std::span<const uint8_t> salt = {}) {
734 out_encapsulated_key.resize(encapsulated_key_length());
735 out_shared_key.resize(shared_key_length(desired_shared_key_len));
736 encrypt(out_encapsulated_key, out_shared_key, rng, desired_shared_key_len, salt);
740 std::unique_ptr<PK_Ops::KEM_Encryption> m_op;
757 std::string_view kem_param =
"",
758 std::string_view provider =
"");
798 void decrypt(std::span<uint8_t> out_shared_key,
799 std::span<const uint8_t> encap_key,
800 size_t desired_shared_key_len = 32,
801 std::span<const uint8_t> salt = {});
818 size_t encap_key_len,
819 size_t desired_shared_key_len,
820 const uint8_t salt[] =
nullptr,
821 size_t salt_len = 0) {
823 decrypt(shared_key, {encap_key, encap_key_len}, desired_shared_key_len, {salt, salt_len});
839 size_t desired_shared_key_len = 32,
840 std::span<const uint8_t> salt = {}) {
842 decrypt(shared_key, encap_key, desired_shared_key_len, salt);
847 std::unique_ptr<PK_Ops::KEM_Decryption> m_op;
#define BOTAN_PUBLIC_API(maj, min)
#define BOTAN_DEPRECATED(msg)
#define BOTAN_FUTURE_EXPLICIT
KEM_Encapsulation(std::vector< uint8_t > encapsulated_shared_key, secure_vector< uint8_t > shared_key)
const secure_vector< uint8_t > & shared_key() const
friend class PK_KEM_Encryptor
static std::pair< std::vector< uint8_t >, secure_vector< uint8_t > > destructure(KEM_Encapsulation &&kem)
const std::vector< uint8_t > & encapsulated_shared_key() const
~PK_Decryptor_EME() override
PK_Decryptor_EME(PK_Decryptor_EME &&) noexcept
PK_Decryptor_EME(const PK_Decryptor_EME &)=delete
size_t plaintext_length(size_t ctext_len) const override
PK_Decryptor_EME & operator=(const PK_Decryptor_EME &)=delete
PK_Decryptor_EME(const Private_Key &key, RandomNumberGenerator &rng, std::string_view padding, std::string_view provider="")
size_t ciphertext_length(size_t ptext_len) const override
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 & operator=(const PK_Decryptor &)=delete
PK_Decryptor(PK_Decryptor &&) noexcept=default
virtual size_t ciphertext_length(size_t ptext_len) const =0
secure_vector< uint8_t > decrypt(const uint8_t in[], size_t length) const
PK_Decryptor(const PK_Decryptor &)=delete
~PK_Encryptor_EME() override
PK_Encryptor_EME(const Public_Key &key, RandomNumberGenerator &rng, std::string_view padding, std::string_view provider="")
size_t maximum_input_size() const override
PK_Encryptor_EME & operator=(const PK_Encryptor_EME &)=delete
size_t ciphertext_length(size_t ptext_len) const override
PK_Encryptor_EME(PK_Encryptor_EME &&) noexcept
PK_Encryptor_EME(const PK_Encryptor_EME &)=delete
virtual size_t ciphertext_length(size_t ptext_len) const =0
PK_Encryptor & operator=(const PK_Encryptor &)=delete
virtual size_t maximum_input_size() 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_Encryptor(PK_Encryptor &&) noexcept=default
secure_vector< uint8_t > decrypt(const uint8_t encap_key[], size_t encap_key_len, size_t desired_shared_key_len, const uint8_t salt[]=nullptr, size_t salt_len=0)
size_t encapsulated_key_length() const
PK_KEM_Decryptor(PK_KEM_Decryptor &&) noexcept
PK_KEM_Decryptor & operator=(const PK_KEM_Decryptor &)=delete
PK_KEM_Decryptor(const PK_KEM_Decryptor &)=delete
secure_vector< uint8_t > decrypt(std::span< const uint8_t > encap_key, size_t desired_shared_key_len=32, std::span< const uint8_t > salt={})
PK_KEM_Decryptor(const Private_Key &key, RandomNumberGenerator &rng, std::string_view kem_param="", std::string_view provider="")
size_t shared_key_length(size_t desired_shared_key_len) const
void decrypt(std::span< uint8_t > out_shared_key, std::span< const uint8_t > encap_key, size_t desired_shared_key_len=32, std::span< const uint8_t > salt={})
BOTAN_FUTURE_EXPLICIT PK_KEM_Encryptor(const Public_Key &key, std::string_view kem_param="", std::string_view provider="")
KEM_Encapsulation encrypt(RandomNumberGenerator &rng, size_t desired_shared_key_len=32, std::span< const uint8_t > salt={})
void encrypt(secure_vector< uint8_t > &out_encapsulated_key, secure_vector< uint8_t > &out_shared_key, RandomNumberGenerator &rng, size_t desired_shared_key_len=32, std::span< const uint8_t > salt={})
PK_KEM_Encryptor(PK_KEM_Encryptor &&) noexcept
size_t shared_key_length(size_t desired_shared_key_len) const
size_t encapsulated_key_length() const
PK_KEM_Encryptor(const PK_KEM_Encryptor &)=delete
PK_KEM_Encryptor & operator=(const PK_KEM_Encryptor &)=delete
SymmetricKey derive_key(size_t key_len, std::span< const uint8_t > peer_key, std::span< const uint8_t > salt) const
SymmetricKey derive_key(size_t key_len, std::span< const uint8_t > peer_key, const uint8_t salt[], size_t salt_len) const
PK_Key_Agreement(const Private_Key &key, RandomNumberGenerator &rng, std::string_view kdf, std::string_view provider="")
PK_Key_Agreement & operator=(const PK_Key_Agreement &)=delete
PK_Key_Agreement(const PK_Key_Agreement &)=delete
PK_Key_Agreement(PK_Key_Agreement &&) noexcept
PK_Signer(PK_Signer &&) noexcept
PK_Signer(const Private_Key &key, RandomNumberGenerator &rng, std::string_view padding, Signature_Format format=Signature_Format::Standard, std::string_view provider="")
std::vector< uint8_t > sign_message(std::span< const uint8_t > in, RandomNumberGenerator &rng)
void update(std::span< const uint8_t > in)
std::vector< uint8_t > signature(RandomNumberGenerator &rng)
PK_Signer & operator=(const PK_Signer &)=delete
void set_output_format(Signature_Format format)
PK_Signer(const PK_Signer &)=delete
std::vector< uint8_t > sign_message(const uint8_t in[], size_t length, RandomNumberGenerator &rng)
PK_Verifier(PK_Verifier &&) noexcept
bool verify_message(const uint8_t msg[], size_t msg_length, const uint8_t sig[], size_t sig_length)
void update(std::span< const uint8_t > in)
PK_Verifier(const PK_Verifier &)=delete
PK_Verifier(const Public_Key &pub_key, std::string_view padding, Signature_Format format=Signature_Format::Standard, std::string_view provider="")
bool check_signature(std::span< const uint8_t > sig)
PK_Verifier & operator=(const PK_Verifier &)=delete
std::string encrypt(const uint8_t input[], size_t input_len, std::string_view passphrase, RandomNumberGenerator &rng)
std::vector< T, secure_allocator< T > > secure_vector