13#include <botan/internal/xmss_wots.h>
15#include <botan/mem_ops.h>
16#include <botan/internal/stl_util.h>
17#include <botan/internal/xmss_address.h>
18#include <botan/internal/xmss_tools.h>
50 std::span<const uint8_t> seed,
61 for(
size_t i = start_idx; i < (start_idx + steps) && i < params.wots_parameter(); i++) {
62 adrs.set_hash_address(
static_cast<uint32_t
>(i));
66 hash.prf(prf_output, seed, adrs.bytes());
67 xor_buf(result.data(), prf_output.data(), result.size());
73 hash.prf(prf_output, seed, adrs.bytes());
74 hash.f(result, prf_output, result);
81 std::span<const uint8_t> public_seed,
86 for(
size_t i = 0; i <
m_params.len(); ++i) {
93 std::span<const uint8_t> public_seed,
101 m_params.append_checksum(msg_digest);
103 for(
size_t i = 0; i <
m_params.len(); i++) {
108 m_params.wots_parameter() - 1 - msg_digest[i],
116 std::span<const uint8_t> public_seed,
121 m_params.append_checksum(msg_digest);
124 for(
size_t i = 0; i <
m_params.len(); i++) {
126 chain(
m_params, sig[i], 0, msg_digest[i], adrs, public_seed, hash);
133 std::span<const uint8_t> public_seed,
134 std::span<const uint8_t> private_seed,
139 for(
size_t i = 0; i <
m_params.len(); ++i) {
140 adrs.set_chain_address(static_cast<uint32_t>(i));
141 const auto data = concat<std::vector<uint8_t>>(public_seed, adrs.bytes());
142 hash.prf_keygen(m_key_data[i], private_seed, data);
148 std::span<const uint8_t> private_seed,
155 hash.
prf(r, private_seed, adrs.
bytes());
157 for(
size_t i = 0; i <
m_params.len(); ++i) {
158 XMSS_Tools::concat<size_t>(m_key_data[i], i, 32);
159 hash.prf(m_key_data[i], r, m_key_data[i]);
#define BOTAN_ASSERT_NOMSG(expr)
void set_chain_address(uint32_t value)
const secure_vector< uint8_t > & bytes() const
void prf(secure_vector< uint8_t > &result, std::span< const uint8_t > key, std::span< const uint8_t > data)
const wots_keysig_t & key_data() const
XMSS_WOTS_Base(XMSS_WOTS_Parameters params)
XMSS_WOTS_Parameters m_params
XMSS_WOTS_PrivateKey(XMSS_WOTS_Parameters params, std::span< const uint8_t > public_seed, std::span< const uint8_t > private_seed, XMSS_Address adrs, XMSS_Hash &hash)
wots_keysig_t sign(const secure_vector< uint8_t > &msg, std::span< const uint8_t > public_seed, XMSS_Address &adrs, XMSS_Hash &hash)
XMSS_WOTS_PublicKey(XMSS_WOTS_Parameters params, std::span< const uint8_t > public_seed, const XMSS_WOTS_PrivateKey &private_key, XMSS_Address &adrs, XMSS_Hash &hash)
std::vector< secure_vector< uint8_t > > wots_keysig_t
constexpr void xor_buf(ranges::contiguous_output_range< uint8_t > auto &&out, ranges::contiguous_range< uint8_t > auto &&in)
std::vector< T, secure_allocator< T > > secure_vector