3
* An XMSS: Extended Hash-Based Siganture public key.
4
* The XMSS public key does not support the X509 standard. Instead the
5
* raw format described in [1] is used.
7
* [1] XMSS: Extended Hash-Based Signatures,
8
* draft-itrf-cfrg-xmss-hash-based-signatures-06
10
* https://datatracker.ietf.org/doc/
11
* draft-irtf-cfrg-xmss-hash-based-signatures/?include_text=1
13
* (C) 2016,2017 Matthias Gierlings
15
* Botan is released under the Simplified BSD License (see license.txt)
18
#include <botan/internal/xmss_verification_operation.h>
19
#include <botan/xmss_publickey.h>
23
XMSS_PublicKey::XMSS_PublicKey(const std::vector<uint8_t>& raw_key)
24
: m_xmss_params(XMSS_PublicKey::deserialize_xmss_oid(raw_key)),
25
m_wots_params(m_xmss_params.ots_oid())
27
if(raw_key.size() < size())
29
throw Integrity_Failure("Invalid XMSS public key size detected.");
32
// extract & copy root from raw key.
34
m_root.reserve(m_xmss_params.element_size());
35
auto begin = raw_key.begin() + sizeof(uint32_t);
36
auto end = begin + m_xmss_params.element_size();
37
std::copy(begin, end, std::back_inserter(m_root));
39
// extract & copy public seed from raw key.
41
end = begin + m_xmss_params.element_size();
42
m_public_seed.clear();
43
m_public_seed.reserve(m_xmss_params.element_size());
44
std::copy(begin, end, std::back_inserter(m_public_seed));
47
XMSS_Parameters::xmss_algorithm_t
48
XMSS_PublicKey::deserialize_xmss_oid(const std::vector<uint8_t>& raw_key)
50
if(raw_key.size() < 4)
52
throw Integrity_Failure("XMSS signature OID missing.");
55
// extract and convert algorithm id to enum type
57
for(size_t i = 0; i < 4; i++)
58
{ raw_id = ((raw_id << 8) | raw_key[i]); }
60
return static_cast<XMSS_Parameters::xmss_algorithm_t>(raw_id);
63
std::unique_ptr<PK_Ops::Verification>
64
XMSS_PublicKey::create_verification_op(const std::string&,
65
const std::string& provider) const
67
if(provider == "base" || provider.empty())
69
return std::unique_ptr<PK_Ops::Verification>(
70
new XMSS_Verification_Operation(*this));
72
throw Provider_Not_Found(algo_name(), provider);
75
std::vector<uint8_t> XMSS_PublicKey::raw_public_key() const
77
std::vector<uint8_t> result
79
static_cast<uint8_t>(m_xmss_params.oid() >> 24),
80
static_cast<uint8_t>(m_xmss_params.oid() >> 16),
81
static_cast<uint8_t>(m_xmss_params.oid() >> 8),
82
static_cast<uint8_t>(m_xmss_params.oid())
85
std::copy(m_root.begin(), m_root.end(), std::back_inserter(result));
86
std::copy(m_public_seed.begin(),
88
std::back_inserter(result));