3
* A collection of pseudorandom hash functions required for XMSS and WOTS
5
* (C) 2016,2017 Matthias Gierlings
7
* Botan is released under the Simplified BSD License (see license.txt)
10
#include <botan/xmss_hash.h>
11
#include <botan/exceptn.h>
15
XMSS_Hash::XMSS_Hash(const XMSS_Hash& hash)
16
: XMSS_Hash(hash.m_hash_func_name)
20
XMSS_Hash::XMSS_Hash(const std::string& h_func_name) :
21
m_hash(HashFunction::create(h_func_name)),
22
m_hash_func_name(h_func_name)
25
throw Lookup_Error("XMSS cannot use hash " + h_func_name +
26
" because it is unavailable");
28
m_output_length = m_hash->output_length();
29
BOTAN_ASSERT(m_output_length > 0, "Hash output length of zero is invalid.");
31
m_zero_padding.resize(m_output_length - 1);
32
m_msg_hash.reset(m_hash->clone());
36
XMSS_Hash::h(secure_vector<uint8_t>& result,
37
const secure_vector<uint8_t>& key,
38
const secure_vector<uint8_t>& data)
40
m_hash->update(m_zero_padding);
41
m_hash->update(m_id_h);
44
m_hash->final(result);
47
void XMSS_Hash::h_msg_init(const secure_vector<uint8_t>& randomness,
48
const secure_vector<uint8_t>& root,
49
const secure_vector<uint8_t>& index_bytes)
52
m_msg_hash->update(m_zero_padding);
53
m_msg_hash->update(m_id_hmsg);
54
m_msg_hash->update(randomness);
55
m_msg_hash->update(root);
56
m_msg_hash->update(index_bytes);
59
void XMSS_Hash::h_msg_update(const secure_vector<uint8_t>& data)
61
m_msg_hash->update(data);
64
void XMSS_Hash::h_msg_update(const uint8_t data[], size_t size)
66
m_msg_hash->update(data, size);
69
secure_vector<uint8_t> XMSS_Hash::h_msg_final()
71
return m_msg_hash->final();
74
secure_vector<uint8_t>
75
XMSS_Hash::h_msg(const secure_vector<uint8_t>& randomness,
76
const secure_vector<uint8_t>& root,
77
const secure_vector<uint8_t>& index_bytes,
78
const secure_vector<uint8_t>& data)
80
h_msg_init(randomness, root, index_bytes);
81
m_msg_hash->update(data);
82
return m_msg_hash->final();