16#include <botan/internal/xmss_signature_operation.h>
17#include <botan/internal/xmss_tools.h>
23 m_priv_key(private_key),
24 m_xmss_params(private_key.xmss_oid()),
25 m_hash(private_key.xmss_hash_function()),
28 m_is_initialized(false)
37 wots_keysig_t auth_path = build_auth_path(xmss_priv_key, adrs);
47 XMSS_PrivateKey& xmss_priv_key)
50 XMSS_Signature sig(m_leaf_idx,
52 generate_tree_signature(msg_hash, xmss_priv_key,adrs));
58 return sizeof(uint64_t) +
71 for(
size_t j = 0; j < m_xmss_params.
tree_height(); j++)
73 const size_t b =
static_cast<size_t>(1) << j;
74 const size_t k = (m_leaf_idx / b) ^ 0x01;
75 auth_path[j] = priv_key.
tree_hash(k * b, j, adrs);
93 m_is_initialized =
false;
97void XMSS_Signature_Operation::initialize()
103 secure_vector<uint8_t> index_bytes;
110 m_randomness = m_hash.
prf(m_priv_key.
prf(), index_bytes);
117 m_is_initialized =
true;
void set_ots_address(uint32_t value)
void h_msg_update(const uint8_t data[], size_t size)
secure_vector< uint8_t > h_msg_final()
void h_msg_init(const secure_vector< uint8_t > &randomness, const secure_vector< uint8_t > &root, const secure_vector< uint8_t > &index_bytes)
void prf(secure_vector< uint8_t > &result, const secure_vector< uint8_t > &key, const secure_vector< uint8_t > &data)
size_t tree_height() const
size_t element_size() const
secure_vector< uint8_t > tree_hash(size_t start_idx, size_t target_node_height, XMSS_Address &adrs)
const XMSS_WOTS_PrivateKey & wots_private_key() const
const secure_vector< uint8_t > & prf() const
size_t reserve_unused_leaf_index()
const XMSS_Parameters & xmss_parameters() const
secure_vector< uint8_t > & root()
XMSS_Signature_Operation(const XMSS_PrivateKey &private_key)
size_t signature_length() const override
secure_vector< uint8_t > sign(RandomNumberGenerator &) override
void update(const uint8_t msg[], size_t msg_len) override
wots_keysig_t sign(const secure_vector< uint8_t > &msg, XMSS_Address &adrs)
std::vector< secure_vector< uint8_t > > wots_keysig_t
std::vector< T, secure_allocator< T > > secure_vector