Botan  2.13.0
Crypto and TLS for C++11
xmss_common_ops.h
Go to the documentation of this file.
1 /*
2  * XMSS Common Ops
3  * (C) 2016,2017 Matthias Gierlings
4  *
5  * Botan is released under the Simplified BSD License (see license.txt)
6  **/
7 
8 #ifndef BOTAN_XMSS_COMMON_OPS_H_
9 #define BOTAN_XMSS_COMMON_OPS_H_
10 
11 #include <vector>
12 #include <botan/secmem.h>
13 #include <botan/xmss_parameters.h>
14 #include <botan/xmss_address.h>
15 #include <botan/xmss_hash.h>
16 
17 //BOTAN_FUTURE_INTERNAL_HEADER(xmss_common_ops.h)
18 
19 namespace Botan {
20 
21 typedef std::vector<secure_vector<uint8_t>> wots_keysig_t;
22 
23 /**
24  * Operations shared by XMSS signature generation and verification operations.
25  **/
27  {
28  public:
30  : m_xmss_params(oid), m_hash(m_xmss_params.hash_function_name()) {}
31 
32  protected:
33  /**
34  * Algorithm 7: "RAND_HASH"
35  *
36  * Generates a randomized hash.
37  *
38  * This overload is used in multithreaded scenarios, where it is
39  * required to provide seperate instances of XMSS_Hash to each
40  * thread.
41  *
42  * @param[out] result The resulting randomized hash.
43  * @param[in] left Left half of the hash function input.
44  * @param[in] right Right half of the hash function input.
45  * @param[in] adrs Adress of the hash function call.
46  * @param[in] seed The seed for G.
47  * @param[in] hash Instance of XMSS_Hash, that may only by the thead
48  * executing generate_public_key.
49  **/
51  secure_vector<uint8_t>& result,
52  const secure_vector<uint8_t>& left,
53  const secure_vector<uint8_t>& right,
54  XMSS_Address& adrs,
55  const secure_vector<uint8_t>& seed,
56  XMSS_Hash& hash);
57 
58  /**
59  * Algorithm 7: "RAND_HASH"
60  *
61  * Generates a randomized hash.
62  *
63  * @param[out] result The resulting randomized hash.
64  * @param[in] left Left half of the hash function input.
65  * @param[in] right Right half of the hash function input.
66  * @param[in] adrs Adress of the hash function call.
67  * @param[in] seed The seed for G.
68  **/
69  inline void randomize_tree_hash(
70  secure_vector<uint8_t>& result,
71  const secure_vector<uint8_t>& left,
72  const secure_vector<uint8_t>& right,
73  XMSS_Address& adrs,
74  const secure_vector<uint8_t>& seed)
75  {
76  randomize_tree_hash(result, left, right, adrs, seed, m_hash);
77  }
78 
79  /**
80  * Algorithm 8: "ltree"
81  * Create an L-tree used to compute the leaves of the binary hash tree.
82  * Takes a WOTS+ public key and compresses it to a single n-byte value.
83  *
84  * This overload is used in multithreaded scenarios, where it is
85  * required to provide seperate instances of XMSS_Hash to each thread.
86  *
87  * @param[out] result Public key compressed to a single n-byte value
88  * pk[0].
89  * @param[in] pk Winternitz One Time Signatures+ public key.
90  * @param[in] adrs Address encoding the address of the L-Tree
91  * @param[in] seed The seed generated during the public key generation.
92  * @param[in] hash Instance of XMSS_Hash, that may only be used by the
93  * thead executing create_l_tree.
94  **/
96  wots_keysig_t pk,
97  XMSS_Address& adrs,
98  const secure_vector<uint8_t>& seed,
99  XMSS_Hash& hash);
100 
101  /**
102  * Algorithm 8: "ltree"
103  * Create an L-tree used to compute the leaves of the binary hash tree.
104  * Takes a WOTS+ public key and compresses it to a single n-byte value.
105  *
106  * @param[out] result Public key compressed to a single n-byte value
107  * pk[0].
108  * @param[in] pk Winternitz One Time Signatures+ public key.
109  * @param[in] adrs Address encoding the address of the L-Tree
110  * @param[in] seed The seed generated during the public key generation.
111  **/
113  wots_keysig_t pk,
114  XMSS_Address& adrs,
115  const secure_vector<uint8_t>& seed)
116  {
117  create_l_tree(result, pk, adrs, seed, m_hash);
118  }
119 
120  protected:
123 
124  };
125 
126 }
127 
128 #endif
XMSS_Common_Ops(XMSS_Parameters::xmss_algorithm_t oid)
void create_l_tree(secure_vector< uint8_t > &result, wots_keysig_t pk, XMSS_Address &adrs, const secure_vector< uint8_t > &seed)
void create_l_tree(secure_vector< uint8_t > &result, wots_keysig_t pk, XMSS_Address &adrs, const secure_vector< uint8_t > &seed, XMSS_Hash &hash)
XMSS_Parameters m_xmss_params
void randomize_tree_hash(secure_vector< uint8_t > &result, const secure_vector< uint8_t > &left, const secure_vector< uint8_t > &right, XMSS_Address &adrs, const secure_vector< uint8_t > &seed)
Definition: alg_id.cpp:13
std::vector< secure_vector< uint8_t > > wots_keysig_t
std::vector< T, secure_allocator< T > > secure_vector
Definition: secmem.h:65
void randomize_tree_hash(secure_vector< uint8_t > &result, const secure_vector< uint8_t > &left, const secure_vector< uint8_t > &right, XMSS_Address &adrs, const secure_vector< uint8_t > &seed, XMSS_Hash &hash)
MechanismType hash