7#include <botan/pubkey.h>
9#include <botan/ber_dec.h>
10#include <botan/bigint.h>
11#include <botan/der_enc.h>
12#include <botan/pk_ops.h>
14#include <botan/internal/buffer_slicer.h>
15#include <botan/internal/ct_utils.h>
16#include <botan/internal/fmt.h>
17#include <botan/internal/mem_utils.h>
22 uint8_t valid_mask = 0;
27 throw Decoding_Error(
"Invalid public key ciphertext, cannot decrypt");
35 size_t expected_pt_len,
37 const uint8_t required_content_bytes[],
38 const uint8_t required_content_offsets[],
39 size_t required_contents_length)
const {
43 for(
size_t i = 0; i != required_contents_length; ++i) {
44 const uint8_t exp = required_content_bytes[i];
52 const uint8_t off = required_content_offsets[i];
53 BOTAN_ASSERT(off < expected_pt_len,
"Offset in range of plaintext");
60 uint8_t decrypt_valid = 0;
66 decoded.resize(expected_pt_len);
68 for(
size_t i = 0; i != required_contents_length; ++i) {
69 const uint8_t exp = required_content_bytes[i];
72 const uint8_t off = required_content_offsets[i];
80 valid_mask.select_n(decoded.data(), decoded.data(), fake_pms.data(), expected_pt_len);
87 size_t expected_pt_len,
94 std::string_view padding,
95 std::string_view provider) {
108 return m_op->ciphertext_length(ptext_len);
111std::vector<uint8_t> PK_Encryptor_EME::enc(
const uint8_t ptext[],
size_t len,
RandomNumberGenerator& rng)
const {
112 return m_op->encrypt(std::span{ptext, len}, rng);
116 return m_op->max_input_bits() / 8;
121 std::string_view padding,
122 std::string_view provider) {
135 return m_op->plaintext_length(ctext_len);
139 return m_op->ciphertext_length(ptext_len);
142secure_vector<uint8_t> PK_Decryptor_EME::do_decrypt(uint8_t& valid_mask,
const uint8_t in[],
size_t in_len)
const {
143 return m_op->decrypt(valid_mask, {in, in_len});
155 std::string_view kem_param,
156 std::string_view provider) :
167 return m_op->shared_key_length(desired_shared_key_len);
171 return m_op->encapsulated_key_length();
175 std::span<uint8_t> out_shared_key,
177 size_t desired_shared_key_len,
178 std::span<const uint8_t> salt) {
181 "not enough space for shared key");
182 m_op->kem_encrypt(out_encapsulated_key, out_shared_key, rng, desired_shared_key_len, salt);
186 return m_op->shared_key_length(desired_shared_key_len);
190 return m_op->encapsulated_key_length();
195 std::string_view param,
196 std::string_view provider) {
209 std::span<const uint8_t> encap_key,
210 size_t desired_shared_key_len,
211 std::span<const uint8_t> salt) {
213 "inconsistent size of shared key output buffer");
214 m_op->kem_decrypt(out_shared_key, encap_key, desired_shared_key_len, salt);
219 std::string_view kdf,
220 std::string_view provider) {
233 return m_op->agreed_value_size();
237 const uint8_t peer_key[],
239 std::string_view salt)
const {
244 const std::span<const uint8_t> peer_key,
245 std::string_view salt)
const {
250 std::span<const uint8_t> peer_key,
251 std::span<const uint8_t> salt)
const {
252 return SymmetricKey(m_op->agree(key_len, peer_key, salt));
257 std::string_view padding,
259 std::string_view provider) :
260 m_sig_format(format), m_sig_element_size(key._signature_element_size_for_DER_encoding()) {
262 BOTAN_ARG_CHECK(m_sig_element_size.has_value(),
"This key does not support DER signatures");
272 return m_op->algorithm_identifier();
276 return m_op->hash_function();
289 m_op->update({in, length});
294std::vector<uint8_t> der_encode_signature(std::span<const uint8_t> sig,
size_t parts,
size_t part_size) {
295 if(sig.size() % parts != 0 || sig.size() != parts * part_size) {
299 BufferSlicer bs_sig(sig);
300 std::vector<BigInt> sig_parts;
301 sig_parts.reserve(parts);
302 for(
size_t i = 0; i != parts; ++i) {
306 std::vector<uint8_t> output;
315 return m_op->signature_length();
317 const size_t sig_len = m_op->signature_length();
319 const size_t der_overhead = [sig_len]() {
338 }
else if(sig_len <= 248) {
351 return sig_len + der_overhead;
358 std::vector<uint8_t> sig = m_op->sign(rng);
364 return der_encode_signature(sig, 2, m_sig_element_size.value());
371 std::string_view padding,
373 std::string_view provider) {
379 m_sig_format = format;
383 BOTAN_ARG_CHECK(m_sig_element_size.has_value(),
"This key does not support DER signatures");
389 std::string_view provider) {
405 return m_op->hash_function();
410 BOTAN_ARG_CHECK(m_sig_element_size.has_value(),
"This key does not support DER signatures");
412 m_sig_format = format;
425 m_op->update({in, length});
430std::vector<uint8_t> decode_der_signature_pair(std::span<const uint8_t> der_sig,
size_t sig_part_size) {
443 if(invalid_r || invalid_s) {
447 std::vector<uint8_t> sig(2 * sig_part_size);
458 return m_op->is_valid_signature({sig, length});
460 bool decoding_success =
false;
461 std::vector<uint8_t> real_sig;
466 real_sig = decode_der_signature_pair({sig, length}, m_sig_element_size.value());
467 decoding_success =
true;
472 const bool accept = m_op->is_valid_signature(real_sig);
474 return accept && decoding_success;
476 throw Internal_Error(
"PK_Verifier: Invalid signature format enum");
#define BOTAN_ASSERT_NOMSG(expr)
#define BOTAN_ARG_CHECK(expr, msg)
#define BOTAN_ASSERT(expr, assertion_made)
virtual std::string algo_name() const =0
virtual std::optional< size_t > _signature_element_size_for_DER_encoding() const
virtual Signature_Format _default_x509_signature_format() const
BER_Decoder & decode(bool &out)
BER_Decoder & verify_end()
BER_Decoder start_sequence()
void serialize_to(std::span< uint8_t > out) const
static BigInt from_bytes(std::span< const uint8_t > bytes)
static constexpr Mask< T > is_equal(T x, T y)
DER_Encoder & encode_list(const std::vector< T > &values)
DER_Encoder & start_sequence()
~PK_Decryptor_EME() override
size_t plaintext_length(size_t ctext_len) const override
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
secure_vector< uint8_t > decrypt_or_random(const uint8_t in[], size_t length, size_t expected_pt_len, RandomNumberGenerator &rng) const
secure_vector< uint8_t > decrypt(const uint8_t in[], size_t length) const
~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
size_t ciphertext_length(size_t ptext_len) const override
size_t encapsulated_key_length() const
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={})
size_t shared_key_length(size_t desired_shared_key_len) const
size_t encapsulated_key_length() const
SymmetricKey derive_key(size_t key_len, std::span< const uint8_t > peer_key, std::span< const uint8_t > salt) const
size_t agreed_value_size() const
PK_Key_Agreement(const Private_Key &key, RandomNumberGenerator &rng, std::string_view kdf, std::string_view provider="")
PK_Signer(const Private_Key &key, RandomNumberGenerator &rng, std::string_view padding, Signature_Format format=Signature_Format::Standard, std::string_view provider="")
size_t signature_length() const
std::vector< uint8_t > signature(RandomNumberGenerator &rng)
std::string hash_function() const
AlgorithmIdentifier algorithm_identifier() const
void set_input_format(Signature_Format format)
bool verify_message(const uint8_t msg[], size_t msg_length, const uint8_t sig[], size_t sig_length)
std::string hash_function() const
PK_Verifier(const Public_Key &pub_key, std::string_view padding, Signature_Format format=Signature_Format::Standard, std::string_view provider="")
bool check_signature(const uint8_t sig[], size_t length)
virtual std::unique_ptr< PK_Ops::Signature > create_signature_op(RandomNumberGenerator &rng, std::string_view params, std::string_view provider) const
virtual std::unique_ptr< PK_Ops::Decryption > create_decryption_op(RandomNumberGenerator &rng, std::string_view params, std::string_view provider) const
virtual std::unique_ptr< PK_Ops::Key_Agreement > create_key_agreement_op(RandomNumberGenerator &rng, std::string_view params, std::string_view provider) const
virtual std::unique_ptr< PK_Ops::KEM_Decryption > create_kem_decryption_op(RandomNumberGenerator &rng, std::string_view params, std::string_view provider) const
virtual std::unique_ptr< PK_Ops::Encryption > create_encryption_op(RandomNumberGenerator &rng, std::string_view params, std::string_view provider) const
virtual std::unique_ptr< PK_Ops::Verification > create_verification_op(std::string_view params, std::string_view provider) const
virtual std::unique_ptr< PK_Ops::Verification > create_x509_verification_op(const AlgorithmIdentifier &signature_algorithm, std::string_view provider) const
virtual std::unique_ptr< PK_Ops::KEM_Encryption > create_kem_encryption_op(std::string_view params, std::string_view provider) const
void random_vec(std::span< uint8_t > v)
std::span< const uint8_t > as_span_of_bytes(const char *s, size_t len)
std::string fmt(std::string_view format, const T &... args)
std::vector< T, secure_allocator< T > > secure_vector