17#include <botan/xmss.h>
19#include <botan/ber_dec.h>
20#include <botan/der_enc.h>
22#include <botan/internal/buffer_slicer.h>
23#include <botan/internal/concat_util.h>
24#include <botan/internal/loadstor.h>
25#include <botan/internal/xmss_verification_operation.h>
32 if(raw_key.size() < 4) {
38 for(
size_t i = 0; i < 4; i++) {
39 raw_id = ((raw_id << 8) | raw_key[i]);
46std::vector<uint8_t> extract_raw_public_key(std::span<const uint8_t> key_bits) {
47 std::vector<uint8_t> raw_key;
55 if(raw_key.size() != params.raw_public_key_size() && raw_key.size() != params.raw_private_key_size() &&
56 raw_key.size() != params.raw_legacy_private_key_size()) {
57 throw Decoding_Error(
"unpacked XMSS key does not have the correct length");
60 raw_key.assign(key_bits.begin(), key_bits.end());
62 raw_key.assign(key_bits.begin(), key_bits.end());
70class XMSS_PublicKey_Internal final {
72 XMSS_PublicKey_Internal(
const XMSS_Parameters& params,
75 m_xmss_params(params),
76 m_wots_params(m_xmss_params.wots_parameters()),
77 m_root(std::move(root)),
78 m_public_seed(std::move(public_seed)) {}
80 const XMSS_Parameters& xmss_parameters()
const {
return m_xmss_params; }
82 const XMSS_WOTS_Parameters& wots_parameters()
const {
return m_wots_params; }
90 std::vector<uint8_t> raw_public_key_bits()
const {
92 store_be(
static_cast<uint32_t
>(m_xmss_params.oid())), m_root, m_public_seed);
96 XMSS_Parameters m_xmss_params;
97 XMSS_WOTS_Parameters m_wots_params;
104 m_public_key = std::make_shared<XMSS_PublicKey_Internal>(
109 const auto raw_key = extract_raw_public_key(key_bits);
110 const auto xmss_oid = deserialize_xmss_oid(raw_key);
112 if(raw_key.size() < params.raw_public_key_size()) {
122 m_public_key = std::make_shared<XMSS_PublicKey_Internal>(params, std::move(
root), std::move(
public_seed));
129 BOTAN_ARG_CHECK(
root.size() == params.element_size(),
"XMSS: unexpected byte length of root hash");
131 m_public_key = std::make_shared<XMSS_PublicKey_Internal>(params, std::move(
root), std::move(
public_seed));
135 return m_public_key->public_seed();
139 return m_public_key->root();
143 return m_public_key->xmss_parameters();
147 m_public_key->set_root(std::move(
root));
167 std::string_view provider)
const {
168 if(provider ==
"base" || provider.empty()) {
169 return std::make_unique<XMSS_Verification_Operation>(*
this);
175 std::string_view provider)
const {
176 if(provider ==
"base" || provider.empty()) {
178 throw Decoding_Error(
"Unexpected AlgorithmIdentifier for XMSS X509 signature");
180 return std::make_unique<XMSS_Verification_Operation>(*
this);
186 return m_public_key->raw_public_key_bits();
190 std::vector<uint8_t> output;
203 return std::make_unique<XMSS_PrivateKey>(
xmss_parameters().oid(), rng);
#define BOTAN_ARG_CHECK(expr, msg)
BER_Decoder & decode(bool &out)
BER_Decoder & verify_end()
void skip(const size_t count)
auto copy_as_secure_vector(const size_t count)
DER_Encoder & encode(bool b)
void random_vec(std::span< uint8_t > v)
size_t estimated_strength() const
static XMSS_Parameters from_id(xmss_algorithm_t id)
std::unique_ptr< PK_Ops::Verification > create_x509_verification_op(const AlgorithmIdentifier &alg_id, std::string_view provider) const override
const secure_vector< uint8_t > & root() const
bool check_key(RandomNumberGenerator &rng, bool strong) const override
std::vector< uint8_t > public_key_bits() const override
std::vector< uint8_t > raw_public_key_bits() const override
const secure_vector< uint8_t > & public_seed() const
const XMSS_Parameters & xmss_parameters() const
std::vector< uint8_t > raw_public_key() const
void set_root(secure_vector< uint8_t > root)
size_t estimated_strength() const override
size_t key_length() const override
std::unique_ptr< Private_Key > generate_another(RandomNumberGenerator &rng) const final
std::string algo_name() const override
AlgorithmIdentifier algorithm_identifier() const override
XMSS_PublicKey(XMSS_Parameters::xmss_algorithm_t xmss_oid, RandomNumberGenerator &rng)
std::unique_ptr< PK_Ops::Verification > create_verification_op(std::string_view params, std::string_view provider) const override
constexpr auto concat(Rs &&... ranges)
std::vector< T, secure_allocator< T > > secure_vector
constexpr auto store_be(ParamTs &&... params)