Creates a signature from an XMSS signature method and a uint8_t sequence representing a raw signature.
13 :
14 m_leaf_idx(0), m_randomness(0, 0x00) {
15 XMSS_Parameters xmss_params(oid);
16
17 if(raw_sig.size() !=
18 (xmss_params.len() + xmss_params.tree_height() + 1) * xmss_params.element_size() + sizeof(uint32_t)) {
19 throw Decoding_Error("XMSS signature size invalid.");
20 }
21
22 for(size_t i = 0; i < 4; i++) {
23 m_leaf_idx = ((m_leaf_idx << 8) | raw_sig[i]);
24 }
25
26 if(m_leaf_idx >= xmss_params.total_number_of_signatures()) {
27 throw Decoding_Error("XMSS signature leaf index out of bounds.");
28 }
29
30 auto begin = raw_sig.begin() + sizeof(uint32_t);
31 auto end = begin + xmss_params.element_size();
32 std::copy(begin, end, std::back_inserter(m_randomness));
33
34 for(size_t i = 0; i < xmss_params.len(); i++) {
35 begin = end;
36 end = begin + xmss_params.element_size();
38 m_tree_sig.ots_signature.back().reserve(xmss_params.element_size());
39 std::copy(begin, end, std::back_inserter(m_tree_sig.ots_signature.back()));
40 }
41
42 for(size_t i = 0; i < xmss_params.tree_height(); i++) {
43 begin = end;
44 end = begin + xmss_params.element_size();
46 m_tree_sig.authentication_path.back().reserve(xmss_params.element_size());
47 std::copy(begin, end, std::back_inserter(m_tree_sig.authentication_path.back()));
48 }
49}
std::vector< T, secure_allocator< T > > secure_vector