9#ifndef BOTAN_XMSS_ADDRESS_H_
10#define BOTAN_XMSS_ADDRESS_H_
12#include <botan/assert.h>
13#include <botan/types.h>
94 m_data[15] =
static_cast<uint8_t
>(type);
95 std::fill(m_data.begin() + 16, m_data.end(),
static_cast<uint8_t
>(0));
114 "Invalid Key_Mask for current XMSS_Address::Type.");
115 m_data[31] =
static_cast<uint8_t
>(value);
127 "get_ots_address() requires XMSS_Address::Type::"
128 "OTS_Hash_Address.");
141 "set_ots_address() requires XMSS_Address::Type::"
142 "OTS_Hash_Address.");
155 "set_ltree_address() requires XMSS_Address::Type::"
169 "set_ltree_address() requires XMSS_Address::Type::"
182 "get_chain_address() requires XMSS_Address::Type::"
183 "OTS_Hash_Address.");
193 "set_chain_address() requires XMSS_Address::Type::"
194 "OTS_Hash_Address.");
207 "get_tree_height() requires XMSS_Address::Type::"
208 "LTree_Address or XMSS_Address::Type::Hash_Tree_Address.");
221 "set_tree_height() requires XMSS_Address::Type::"
222 "LTree_Address or XMSS_Address::Type::Hash_Tree_Address.");
235 "get_hash_address() requires XMSS_Address::Type::"
236 "OTS_Hash_Address.");
249 "set_hash_address() requires XMSS_Address::Type::"
250 "OTS_Hash_Address.");
263 "get_tree_index() requires XMSS_Address::Type::"
264 "LTree_Address or XMSS_Address::Type::Hash_Tree_Address.");
277 "set_tree_index() requires XMSS_Address::Type::"
278 "LTree_Address or XMSS_Address::Type::Hash_Tree_Address.");
282 std::span<const uint8_t>
bytes()
const {
return std::span{m_data}; }
287 size_t size()
const {
return m_data.size(); }
301 inline uint32_t get_hi32(
size_t offset)
const {
302 return ((0x000000FF & m_data[8 * offset + 3]) | (0x000000FF & m_data[8 * offset + 2]) << 8 |
303 (0x000000FF & m_data[8 * offset + 1]) << 16 | (0x000000FF & m_data[8 * offset]) << 24);
306 inline void set_hi32(
size_t offset, uint32_t value) {
307 m_data[offset * 8] = ((value >> 24) & 0xFF);
308 m_data[offset * 8 + 1] = ((value >> 16) & 0xFF);
309 m_data[offset * 8 + 2] = ((value >> 8) & 0xFF);
310 m_data[offset * 8 + 3] = ((value) & 0xFF);
313 inline uint32_t get_lo32(
size_t offset)
const {
314 return ((0x000000FF & m_data[8 * offset + 7]) | (0x000000FF & m_data[8 * offset + 6]) << 8 |
315 (0x000000FF & m_data[8 * offset + 5]) << 16 | (0x000000FF & m_data[8 * offset + 4]) << 24);
318 inline void set_lo32(
size_t offset, uint32_t value) {
319 m_data[offset * 8 + 4] = ((value >> 24) & 0xFF);
320 m_data[offset * 8 + 5] = ((value >> 16) & 0xFF);
321 m_data[offset * 8 + 6] = ((value >> 8) & 0xFF);
322 m_data[offset * 8 + 7] = ((value) & 0xFF);
325 std::array<uint8_t, 32> m_data;
#define BOTAN_ASSERT(expr, assertion_made)
void set_hash_address(uint32_t value)
void set_key_mask_mode(Key_Mask value)
XMSS_Address(XMSS_Address &&other)=default
void set_ots_address(uint32_t value)
uint32_t get_tree_index() const
XMSS_Address & operator=(XMSS_Address &&other)=default
XMSS_Address & operator=(const XMSS_Address &other)=default
uint32_t get_ots_address() const
uint32_t get_ltree_address() const
void set_chain_address(uint32_t value)
uint32_t get_tree_height() const
void set_tree_height(uint32_t value)
void set_tree_index(uint32_t value)
std::span< const uint8_t > bytes() const
uint64_t get_tree_addr() const
uint8_t get_layer_addr() const
XMSS_Address(const XMSS_Address &other)=default
uint32_t get_chain_address() const
void set_ltree_address(uint32_t value)
uint32_t get_hash_address() const
Key_Mask get_key_mask_mode() const