14#include <botan/internal/xmss_wots.h>
16#include <botan/mem_ops.h>
17#include <botan/internal/concat_util.h>
18#include <botan/internal/xmss_address.h>
19#include <botan/internal/xmss_hash.h>
20#include <botan/internal/xmss_tools.h>
33 const size_t len_1 = params.len_1();
34 const size_t len_2 = params.len_2();
35 const size_t lg_w = params.lg_w();
36 const uint8_t mask =
static_cast<uint8_t
>(params.wots_parameter() - 1);
45 for(
size_t i = 0; i < len_1; ++i) {
51 result[i] =
static_cast<uint8_t
>((total >> bits) & mask);
55 for(
size_t i = 0; i < len_1; ++i) {
56 csum += params.wots_parameter() - 1 - result[i];
59 for(
size_t i = 0; i < len_2; ++i) {
60 const size_t shift = lg_w * (len_2 - 1 - i);
61 result[len_1 + i] =
static_cast<uint8_t
>((csum >> shift) & mask);
93 std::span<const uint8_t> seed,
104 for(
size_t i = start_idx; i < (start_idx + steps) && i < params.wots_parameter(); i++) {
105 adrs.set_hash_address(
static_cast<uint32_t
>(i));
109 hash.prf(prf_output, seed, adrs.bytes());
110 xor_buf(result.data(), prf_output.data(), result.size());
116 hash.prf(prf_output, seed, adrs.bytes());
117 hash.f(result, prf_output, result);
124 std::span<const uint8_t> public_seed,
129 for(
size_t i = 0; i <
m_params.len(); ++i) {
136 std::span<const uint8_t> public_seed,
144 for(
size_t i = 0; i <
m_params.len(); i++) {
149 m_params.wots_parameter() - 1 - msg_digest[i],
157 std::span<const uint8_t> public_seed,
163 for(
size_t i = 0; i <
m_params.len(); i++) {
165 chain(
m_params, sig[i], 0, msg_digest[i], adrs, public_seed, hash);
172 std::span<const uint8_t> public_seed,
173 std::span<const uint8_t> private_seed,
178 for(
size_t i = 0; i <
m_params.len(); ++i) {
179 adrs.set_chain_address(static_cast<uint32_t>(i));
180 const auto data = concat<std::vector<uint8_t>>(public_seed, adrs.bytes());
181 hash.prf_keygen(m_key_data[i], private_seed, data);
187 std::span<const uint8_t> private_seed,
194 hash.
prf(r, private_seed, adrs.
bytes());
196 for(
size_t i = 0; i <
m_params.len(); ++i) {
197 xmss_concat<size_t>(m_key_data[i], i, 32);
198 hash.prf(m_key_data[i], r, m_key_data[i]);
#define BOTAN_ASSERT_NOMSG(expr)
void set_chain_address(uint32_t value)
std::span< const 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