Botan  2.8.0
Crypto and TLS for C++11
xmss_signature.cpp
Go to the documentation of this file.
1 /*
2  * XMSS Signature
3  * (C) 2016,2017,2018 Matthias Gierlings
4  *
5  * Botan is released under the Simplified BSD License (see license.txt)
6  **/
7 
8 #include <botan/internal/xmss_signature.h>
9 #include <cmath>
10 
11 namespace Botan {
12 
14  const secure_vector<uint8_t>& raw_sig)
15  : m_leaf_idx(0), m_randomness(0, 0x00), m_tree_sig()
16  {
17  XMSS_Parameters xmss_params(oid);
18 
19  if(raw_sig.size() != (xmss_params.len() + xmss_params.tree_height() + 1)
20  * xmss_params.element_size() + sizeof(m_leaf_idx))
21  {
22  throw Integrity_Failure("XMSS signature size invalid.");
23  }
24 
25  for(size_t i = 0; i < 8; i++)
26  { m_leaf_idx = ((m_leaf_idx << 8) | raw_sig[i]); }
27 
28  if(m_leaf_idx >= (1ull << xmss_params.tree_height()))
29  {
30  throw Integrity_Failure("XMSS signature leaf index out of bounds.");
31  }
32 
33  auto begin = raw_sig.begin() + sizeof(m_leaf_idx);
34  auto end = begin + xmss_params.element_size();
35  std::copy(begin, end, std::back_inserter(m_randomness));
36 
37  for(size_t i = 0; i < xmss_params.len(); i++)
38  {
39  begin = end;
40  end = begin + xmss_params.element_size();
41  m_tree_sig.ots_signature().push_back(secure_vector<uint8_t>(0));
42  m_tree_sig.ots_signature().back().reserve(
43  xmss_params.element_size());
44  std::copy(begin,
45  end,
46  std::back_inserter(m_tree_sig.ots_signature().back()));
47  }
48 
49  for(size_t i = 0; i < xmss_params.tree_height(); i++)
50  {
51  begin = end;
52  end = begin + xmss_params.element_size();
53  m_tree_sig.authentication_path().push_back(secure_vector<uint8_t>(0));
54  m_tree_sig.authentication_path().back().reserve(
55  xmss_params.element_size());
56  std::copy(begin,
57  end,
58  std::back_inserter(m_tree_sig.authentication_path().back()));
59  }
60  }
61 
63  {
65  {
66  static_cast<uint8_t>(m_leaf_idx >> 56U),
67  static_cast<uint8_t>(m_leaf_idx >> 48U),
68  static_cast<uint8_t>(m_leaf_idx >> 40U),
69  static_cast<uint8_t>(m_leaf_idx >> 32U),
70  static_cast<uint8_t>(m_leaf_idx >> 24U),
71  static_cast<uint8_t>(m_leaf_idx >> 16U),
72  static_cast<uint8_t>(m_leaf_idx >> 8U),
73  static_cast<uint8_t>(m_leaf_idx)
74  };
75 
76  std::copy(m_randomness.begin(),
77  m_randomness.end(),
78  std::back_inserter(result));
79 
80  for(const auto& sig : tree().ots_signature())
81  {
82  std::copy(sig.begin(),
83  sig.end(),
84  std::back_inserter(result));
85  }
86 
87  for(const auto& auth : tree().authentication_path())
88  {
89  std::copy(auth.begin(),
90  auth.end(),
91  std::back_inserter(result));
92  }
93  return result;
94  }
95 
96 }
XMSS_Signature(XMSS_Parameters::xmss_algorithm_t oid, const secure_vector< uint8_t > &raw_sig)
secure_vector< uint8_t > bytes() const
const XMSS_WOTS_PublicKey::TreeSignature & tree() const
size_t tree_height() const
const wots_keysig_t & authentication_path() const
Definition: alg_id.cpp:13
const wots_keysig_t & ots_signature() const
size_t element_size() const
std::vector< T, secure_allocator< T > > secure_vector
Definition: secmem.h:88