8#include <botan/emsa_pkcs1.h>
9#include <botan/hash_id.h>
10#include <botan/exceptn.h>
11#include <botan/pk_keys.h>
12#include <botan/internal/padding.h>
18secure_vector<uint8_t> emsa3_encoding(
const secure_vector<uint8_t>& msg,
20 const uint8_t hash_id[],
21 size_t hash_id_length)
23 size_t output_length = output_bits / 8;
24 if(output_length < hash_id_length + msg.size() + 10)
25 throw Encoding_Error(
"emsa3_encoding: Output length is too small");
27 secure_vector<uint8_t>
T(output_length);
28 const size_t P_LENGTH = output_length - msg.size() - hash_id_length - 2;
34 if(hash_id_length > 0)
40 buffer_insert(
T, output_length-msg.size(), msg.data(), msg.size());
48 m_hash->update(input, length);
53 return m_hash->final();
61 if(msg.size() != m_hash->output_length())
62 throw Encoding_Error(
"EMSA_PKCS1v15::encoding_of: Bad input length");
64 return emsa3_encoding(msg, output_bits,
65 m_hash_id.data(), m_hash_id.size());
72 if(raw.size() != m_hash->output_length())
77 return (coded == emsa3_encoding(raw, key_bits,
78 m_hash_id.data(), m_hash_id.size()));
87 const std::string& cert_hash_name)
const
89 if(cert_hash_name != m_hash->name())
91 " need to be identical");
96 " not supported for signature algorithm " + key.
algo_name());
116 m_hash_name =
hash->name();
117 m_hash_output_len =
hash->output_length();
121 m_hash_output_len = 0;
127 m_message += std::make_pair(input, length);
133 std::swap(ret, m_message);
135 if(m_hash_output_len > 0 && ret.size() != m_hash_output_len)
136 throw Encoding_Error(
"EMSA_PKCS1v15_Raw::encoding_of: Bad input length");
146 return emsa3_encoding(msg, output_bits, m_hash_id.data(), m_hash_id.size());
153 if(m_hash_output_len > 0 && raw.size() != m_hash_output_len)
158 return (coded == emsa3_encoding(raw, key_bits, m_hash_id.data(), m_hash_id.size()));
#define BOTAN_ASSERT_NONNULL(ptr)
EMSA_PKCS1v15_Raw(const std::string &hash_algo="")
void update(const uint8_t[], size_t) override
bool verify(const secure_vector< uint8_t > &, const secure_vector< uint8_t > &, size_t) override
secure_vector< uint8_t > raw_data() override
secure_vector< uint8_t > encoding_of(const secure_vector< uint8_t > &, size_t, RandomNumberGenerator &rng) override
std::string name() const override
AlgorithmIdentifier config_for_x509(const Private_Key &key, const std::string &cert_hash_name) const override
EMSA_PKCS1v15(HashFunction *hash)
secure_vector< uint8_t > raw_data() override
secure_vector< uint8_t > encoding_of(const secure_vector< uint8_t > &, size_t, RandomNumberGenerator &rng) override
bool verify(const secure_vector< uint8_t > &, const secure_vector< uint8_t > &, size_t) override
void update(const uint8_t[], size_t) override
static std::unique_ptr< HashFunction > create_or_throw(const std::string &algo_spec, const std::string &provider="")
static OID from_string(const std::string &str)
virtual std::string algo_name() const =0
void set_mem(uint8_t *ptr, size_t n, uint8_t val)
size_t buffer_insert(std::vector< T, Alloc > &buf, size_t buf_offset, const T input[], size_t input_length)
std::vector< uint8_t > pkcs_hash_id(const std::string &name)
bool sig_algo_and_pad_ok(const std::string algo, const std::string padding)
std::vector< T, secure_allocator< T > > secure_vector
AlgorithmIdentifier hash_algo