8 #include <botan/emsa1.h>
14 secure_vector<uint8_t> emsa1_encoding(
const secure_vector<uint8_t>& msg,
17 if(8*msg.size() <= output_bits)
20 size_t shift = 8*msg.size() - output_bits;
22 size_t byte_shift = shift / 8, bit_shift = shift % 8;
23 secure_vector<uint8_t> digest(msg.size() - byte_shift);
25 for(
size_t j = 0; j != msg.size() - byte_shift; ++j)
31 for(
size_t j = 0; j != digest.size(); ++j)
33 uint8_t temp = digest[j];
34 digest[j] = (temp >> bit_shift) | carry;
35 carry = (temp << (8 - bit_shift));
48 void EMSA1::update(
const uint8_t input[],
size_t length)
50 m_hash->update(input, length);
53 secure_vector<uint8_t> EMSA1::raw_data()
58 secure_vector<uint8_t> EMSA1::encoding_of(
const secure_vector<uint8_t>& msg,
60 RandomNumberGenerator&)
63 throw Encoding_Error(
"EMSA1::encoding_of: Invalid size for input");
64 return emsa1_encoding(msg, output_bits);
67 bool EMSA1::verify(
const secure_vector<uint8_t>& input,
68 const secure_vector<uint8_t>& raw,
72 if(raw.size() !=
m_hash->output_length())
73 throw Encoding_Error(
"EMSA1::encoding_of: Invalid size for input");
76 const secure_vector<uint8_t> our_coding = emsa1_encoding(raw, key_bits);
78 if(our_coding.size() < input.size())
81 const size_t offset = our_coding.size() - input.size();
84 for(
size_t i = 0; i != offset; ++i)
85 if(our_coding[i] != 0)
88 return same_mem(input.data(), &our_coding[offset], input.size());
90 catch(Invalid_Argument)
EMSA1(HashFunction *hash)
bool same_mem(const T *p1, const T *p2, size_t n)
size_t hash_output_length() const
std::unique_ptr< HashFunction > m_hash