Botan  2.1.0
Crypto and TLS for C++11
xmss_wots_privatekey.cpp
Go to the documentation of this file.
1 /*
2  * XMSS WOTS Private Key
3  * A Winternitz One Time Signature private key for use with Extended Hash-Based
4  * Signatures.
5  *
6  * (C) 2016 Matthias Gierlings
7  *
8  * Botan is released under the Simplified BSD License (see license.txt)
9  **/
10 
11 #include <botan/internal/xmss_wots_signature_operation.h>
12 #include <botan/xmss_wots_privatekey.h>
13 
14 namespace Botan {
15 
17 XMSS_WOTS_PrivateKey::generate(const secure_vector<uint8_t>& priv_seed)
18  {
19  wots_keysig_t priv_key(m_wots_params.len(),
20  secure_vector<uint8_t>(0));
21 
22  for(size_t i = 0; i < m_wots_params.len(); i++)
23  {
24  XMSS_Tools::concat<size_t>(priv_key[i], i, 32);
25  m_hash.prf(priv_key[i], priv_seed, priv_key[i]);
26  }
27  return priv_key;
28  }
29 
30 
31 XMSS_WOTS_PublicKey
33  {
35  public_seed());
36  generate_public_key(pub_key, wots_keysig_t((*this)[adrs]), adrs);
37  return pub_key;
38  }
39 
40 void
42  wots_keysig_t&& in_key_data,
43  XMSS_Address& adrs)
44  {
46  public_seed() == pub_key.public_seed(),
47  "Conflicting public key data.");
48 
49  pub_key.set_key_data(std::move(in_key_data));
50  for(size_t i = 0; i < m_wots_params.len(); i++)
51  {
52  adrs.set_chain_address(i);
53  chain(pub_key[i], 0, m_wots_params.wots_parameter() - 1, adrs,
54  public_seed());
55  }
56  }
57 
60  const secure_vector<uint8_t>& msg,
61  XMSS_Address& adrs)
62 
63  {
64  secure_vector<uint8_t> msg_digest
65  {
67  };
68 
69  m_wots_params.append_checksum(msg_digest);
70  wots_keysig_t sig((*this)[adrs]);
71 
72  for(size_t i = 0; i < m_wots_params.len(); i++)
73  {
74  adrs.set_chain_address(i);
75  chain(sig[i], 0 , msg_digest[i], adrs, m_public_seed);
76  }
77 
78  return sig;
79  }
80 
81 std::unique_ptr<PK_Ops::Signature>
83  const std::string&,
84  const std::string& provider) const
85  {
86  if(provider == "base" || provider.empty())
87  return std::unique_ptr<PK_Ops::Signature>(
89 
90  throw Provider_Not_Found(algo_name(), provider);
91  }
92 
93 }
wots_keysig_t sign(const secure_vector< uint8_t > &msg, XMSS_Address &adrs)
secure_vector< uint8_t > m_public_seed
const secure_vector< uint8_t > & public_seed() const
#define BOTAN_ASSERT(expr, assertion_made)
Definition: assert.h:27
secure_vector< uint8_t > base_w(const secure_vector< uint8_t > &msg, size_t out_size) const
std::vector< T, secure_allocator< T >> secure_vector
Definition: secmem.h:121
void prf(secure_vector< uint8_t > &result, const secure_vector< uint8_t > &key, const secure_vector< uint8_t > &data)
Definition: xmss_hash.h:38
virtual std::string algo_name() const override
XMSS_WOTS_PublicKey generate_public_key(XMSS_Address &adrs)
Definition: alg_id.cpp:13
void set_chain_address(uint32_t value)
Definition: xmss_address.h:224
std::vector< secure_vector< uint8_t > > wots_keysig_t
void set_key_data(const wots_keysig_t &key_data)
const XMSS_WOTS_Parameters & wots_parameters() const
void append_checksum(secure_vector< uint8_t > &data)
void chain(secure_vector< uint8_t > &x, size_t start_idx, size_t steps, XMSS_Address &adrs, const secure_vector< uint8_t > &public_seed)
virtual std::unique_ptr< PK_Ops::Signature > create_signature_op(RandomNumberGenerator &, const std::string &, const std::string &provider) const override
ots_algorithm_t oid() const
XMSS_WOTS_Parameters m_wots_params