18 #include <botan/internal/xmss_signature_operation.h>
19 #include <botan/xmss_privatekey.h>
26 m_wots_priv_key(m_wots_params.oid(), m_public_seed),
31 "System type \"size_t\" not big enough to support"
34 if(raw_key.size() !=
size())
40 uint64_t unused_leaf = 0;
44 for(
auto& i = begin; i != end; i++)
45 unused_leaf = ((unused_leaf << 8) | *i);
57 std::copy(begin, end, std::back_inserter(m_prf));
73 m_prf(rng.random_vec(
XMSS_PublicKey::m_xmss_params.element_size())),
84 size_t target_node_height,
89 BOTAN_ASSERT((start_idx % (1 << target_node_height)) == 0,
90 "Start index must be divisible by 2^{target node height}.");
92 std::vector<secure_vector<uint8_t>> nodes(
105 size_t last_idx =
static_cast<size_t>(1 << target_node_height) + start_idx;
106 for(
size_t i = start_idx; i < last_idx; i++)
119 node_levels[level] = 0;
125 while(level > 0 && node_levels[level] ==
126 node_levels[level - 1])
134 node_levels[level - 1]++;
140 return nodes[level - 1];
143 std::shared_ptr<Atomic<size_t>>
144 XMSS_PrivateKey::recover_global_leaf_index()
const
149 "Trying to retrieve index for partially initialized "
159 result.reserve(
size());
161 for(
int i = 7; i >= 0; i--)
164 static_cast<uint8_t>(
168 std::copy(m_prf.begin(), m_prf.end(), std::back_inserter(result));
171 std::back_inserter(result));
176 std::unique_ptr<PK_Ops::Signature>
179 const std::string& provider)
const
181 if(provider ==
"base" || provider.empty())
182 return std::unique_ptr<PK_Ops::Signature>(
secure_vector< uint8_t > tree_hash(size_t start_idx, size_t target_node_height, XMSS_Address &adrs)
size_t element_size() const
void create_l_tree(secure_vector< uint8_t > &result, wots_keysig_t pk, XMSS_Address &adrs, const secure_vector< uint8_t > &seed)
virtual const secure_vector< uint8_t > & public_seed() const override
void set_ots_address(uint32_t value)
void set_tree_height(uint32_t value)
const secure_vector< uint8_t > & private_seed() const
virtual secure_vector< uint8_t > raw_private_key() const
void set_ltree_address(uint32_t value)
void set_root(const secure_vector< uint8_t > &root)
void set_unused_leaf_index(size_t idx)
size_t element_size() const
#define BOTAN_ASSERT(expr, assertion_made)
XMSS_PrivateKey(XMSS_Parameters::xmss_algorithm_t xmss_algo_id, RandomNumberGenerator &rng)
std::vector< T, secure_allocator< T >> secure_vector
virtual std::vector< uint8_t > raw_public_key() const
virtual size_t size() const
std::shared_ptr< Atomic< size_t > > get(const secure_vector< uint8_t > &private_seed, const secure_vector< uint8_t > &prf)
void randomize_tree_hash(secure_vector< uint8_t > &result, const secure_vector< uint8_t > &left, const secure_vector< uint8_t > &right, XMSS_Address &adrs, const secure_vector< uint8_t > &seed)
XMSS_WOTS_PublicKey generate_public_key(XMSS_Address &adrs)
virtual size_t size() const override
std::vector< T > unlock(const secure_vector< T > &in)
const XMSS_WOTS_Parameters & wots_parameters() const
virtual std::unique_ptr< PK_Ops::Signature > create_signature_op(RandomNumberGenerator &, const std::string &, const std::string &provider) const override
std::string algo_name() const override
XMSS_WOTS_Parameters m_wots_params
uint32_t get_tree_index() const
void set_tree_index(uint32_t value)
void set_private_seed(const secure_vector< uint8_t > &private_seed)
XMSS_Parameters m_xmss_params
uint32_t get_tree_height() const
size_t unused_leaf_index() const
const XMSS_WOTS_PrivateKey & wots_private_key() const
ots_algorithm_t oid() const