Coverage Report

Created: 2024-11-29 06:10

/src/botan/src/lib/pubkey/xmss/xmss_parameters.cpp
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * XMSS Parameters
3
 * Descibes a signature method for XMSS, as defined in:
4
 * [1] XMSS: Extended Hash-Based Signatures,
5
 *     Request for Comments: 8391
6
 *     Release: May 2018.
7
 *     https://datatracker.ietf.org/doc/rfc8391/
8
 *
9
 * (C) 2016,2017,2018 Matthias Gierlings
10
 *
11
 * Botan is released under the Simplified BSD License (see license.txt)
12
 **/
13
14
#include <botan/xmss_parameters.h>
15
16
#include <botan/exceptn.h>
17
#include <botan/internal/fmt.h>
18
19
namespace Botan {
20
21
0
XMSS_Parameters::xmss_algorithm_t XMSS_Parameters::xmss_id_from_string(std::string_view param_set) {
22
0
   if(param_set == "XMSS-SHA2_10_256") {
23
0
      return XMSS_SHA2_10_256;
24
0
   }
25
0
   if(param_set == "XMSS-SHA2_16_256") {
26
0
      return XMSS_SHA2_16_256;
27
0
   }
28
0
   if(param_set == "XMSS-SHA2_20_256") {
29
0
      return XMSS_SHA2_20_256;
30
0
   }
31
0
   if(param_set == "XMSS-SHA2_10_512") {
32
0
      return XMSS_SHA2_10_512;
33
0
   }
34
0
   if(param_set == "XMSS-SHA2_16_512") {
35
0
      return XMSS_SHA2_16_512;
36
0
   }
37
0
   if(param_set == "XMSS-SHA2_20_512") {
38
0
      return XMSS_SHA2_20_512;
39
0
   }
40
0
   if(param_set == "XMSS-SHAKE_10_256") {
41
0
      return XMSS_SHAKE_10_256;
42
0
   }
43
0
   if(param_set == "XMSS-SHAKE_16_256") {
44
0
      return XMSS_SHAKE_16_256;
45
0
   }
46
0
   if(param_set == "XMSS-SHAKE_20_256") {
47
0
      return XMSS_SHAKE_20_256;
48
0
   }
49
0
   if(param_set == "XMSS-SHAKE_10_512") {
50
0
      return XMSS_SHAKE_10_512;
51
0
   }
52
0
   if(param_set == "XMSS-SHAKE_16_512") {
53
0
      return XMSS_SHAKE_16_512;
54
0
   }
55
0
   if(param_set == "XMSS-SHAKE_20_512") {
56
0
      return XMSS_SHAKE_20_512;
57
0
   }
58
0
   if(param_set == "XMSS-SHA2_10_192") {
59
0
      return XMSS_SHA2_10_192;
60
0
   }
61
0
   if(param_set == "XMSS-SHA2_16_192") {
62
0
      return XMSS_SHA2_16_192;
63
0
   }
64
0
   if(param_set == "XMSS-SHA2_20_192") {
65
0
      return XMSS_SHA2_20_192;
66
0
   }
67
0
   if(param_set == "XMSS-SHAKE256_10_256") {
68
0
      return XMSS_SHAKE256_10_256;
69
0
   }
70
0
   if(param_set == "XMSS-SHAKE256_16_256") {
71
0
      return XMSS_SHAKE256_16_256;
72
0
   }
73
0
   if(param_set == "XMSS-SHAKE256_20_256") {
74
0
      return XMSS_SHAKE256_20_256;
75
0
   }
76
0
   if(param_set == "XMSS-SHAKE256_10_192") {
77
0
      return XMSS_SHAKE256_10_192;
78
0
   }
79
0
   if(param_set == "XMSS-SHAKE256_16_192") {
80
0
      return XMSS_SHAKE256_16_192;
81
0
   }
82
0
   if(param_set == "XMSS-SHAKE256_20_192") {
83
0
      return XMSS_SHAKE256_20_192;
84
0
   }
85
86
0
   throw Lookup_Error(fmt("Unknown XMSS algorithm param '{}'", param_set));
87
0
}
88
89
XMSS_Parameters::XMSS_Parameters(std::string_view param_set) :
90
0
      XMSS_Parameters(XMSS_Parameters::xmss_id_from_string(param_set)) {}
91
92
0
XMSS_Parameters::XMSS_Parameters(xmss_algorithm_t oid) : m_oid(oid) {
93
0
   switch(oid) {
94
0
      case XMSS_SHA2_10_256:
95
0
         m_element_size = 32;
96
0
         m_hash_id_size = 32;
97
0
         m_w = 16;
98
0
         m_len = 67;
99
0
         m_tree_height = 10;
100
0
         m_name = "XMSS-SHA2_10_256";
101
0
         m_hash_name = "SHA-256";
102
0
         m_strength = 256;
103
0
         m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHA2_256;
104
0
         break;
105
0
      case XMSS_SHA2_16_256:
106
0
         m_element_size = 32;
107
0
         m_hash_id_size = 32;
108
0
         m_w = 16;
109
0
         m_len = 67;
110
0
         m_tree_height = 16;
111
0
         m_name = "XMSS-SHA2_16_256";
112
0
         m_hash_name = "SHA-256";
113
0
         m_strength = 256;
114
0
         m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHA2_256;
115
0
         break;
116
0
      case XMSS_SHA2_20_256:
117
0
         m_element_size = 32;
118
0
         m_hash_id_size = 32;
119
0
         m_w = 16;
120
0
         m_len = 67;
121
0
         m_tree_height = 20;
122
0
         m_name = "XMSS-SHA2_20_256";
123
0
         m_hash_name = "SHA-256";
124
0
         m_strength = 256;
125
0
         m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHA2_256;
126
0
         break;
127
0
      case XMSS_SHA2_10_512:
128
0
         m_element_size = 64;
129
0
         m_hash_id_size = 64;
130
0
         m_w = 16;
131
0
         m_len = 131;
132
0
         m_tree_height = 10;
133
0
         m_name = "XMSS-SHA2_10_512";
134
0
         m_hash_name = "SHA-512";
135
0
         m_strength = 512;
136
0
         m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHA2_512;
137
0
         break;
138
0
      case XMSS_SHA2_16_512:
139
0
         m_element_size = 64;
140
0
         m_hash_id_size = 64;
141
0
         m_w = 16;
142
0
         m_len = 131;
143
0
         m_tree_height = 16;
144
0
         m_name = "XMSS-SHA2_16_512";
145
0
         m_hash_name = "SHA-512";
146
0
         m_strength = 512;
147
0
         m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHA2_512;
148
0
         break;
149
0
      case XMSS_SHA2_20_512:
150
0
         m_element_size = 64;
151
0
         m_hash_id_size = 64;
152
0
         m_w = 16;
153
0
         m_len = 131;
154
0
         m_tree_height = 20;
155
0
         m_name = "XMSS-SHA2_20_512";
156
0
         m_hash_name = "SHA-512";
157
0
         m_strength = 512;
158
0
         m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHA2_512;
159
0
         break;
160
0
      case XMSS_SHAKE_10_256:
161
0
         m_element_size = 32;
162
0
         m_hash_id_size = 32;
163
0
         m_w = 16;
164
0
         m_len = 67;
165
0
         m_tree_height = 10;
166
0
         m_name = "XMSS-SHAKE_10_256";
167
0
         m_hash_name = "SHAKE-128(256)";
168
0
         m_strength = 256;
169
0
         m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE_256;
170
0
         break;
171
0
      case XMSS_SHAKE_16_256:
172
0
         m_element_size = 32;
173
0
         m_hash_id_size = 32;
174
0
         m_w = 16;
175
0
         m_len = 67;
176
0
         m_tree_height = 16;
177
0
         m_name = "XMSS-SHAKE_16_256";
178
0
         m_hash_name = "SHAKE-128(256)";
179
0
         m_strength = 256;
180
0
         m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE_256;
181
0
         break;
182
0
      case XMSS_SHAKE_20_256:
183
0
         m_element_size = 32;
184
0
         m_hash_id_size = 32;
185
0
         m_w = 16;
186
0
         m_len = 67;
187
0
         m_tree_height = 20;
188
0
         m_name = "XMSS-SHAKE_20_256";
189
0
         m_hash_name = "SHAKE-128(256)";
190
0
         m_strength = 256;
191
0
         m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE_256;
192
0
         break;
193
0
      case XMSS_SHAKE_10_512:
194
0
         m_element_size = 64;
195
0
         m_hash_id_size = 64;
196
0
         m_w = 16;
197
0
         m_len = 131;
198
0
         m_tree_height = 10;
199
0
         m_name = "XMSS-SHAKE_10_512";
200
0
         m_hash_name = "SHAKE-256(512)";
201
0
         m_strength = 512;
202
0
         m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE_512;
203
0
         break;
204
0
      case XMSS_SHAKE_16_512:
205
0
         m_element_size = 64;
206
0
         m_hash_id_size = 64;
207
0
         m_w = 16;
208
0
         m_len = 131;
209
0
         m_tree_height = 16;
210
0
         m_name = "XMSS-SHAKE_16_512";
211
0
         m_hash_name = "SHAKE-256(512)";
212
0
         m_strength = 512;
213
0
         m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE_512;
214
0
         break;
215
0
      case XMSS_SHAKE_20_512:
216
0
         m_element_size = 64;
217
0
         m_hash_id_size = 64;
218
0
         m_w = 16;
219
0
         m_len = 131;
220
0
         m_tree_height = 20;
221
0
         m_name = "XMSS-SHAKE_20_512";
222
0
         m_hash_name = "SHAKE-256(512)";
223
0
         m_strength = 512;
224
0
         m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE_512;
225
0
         break;
226
0
      case XMSS_SHA2_10_192:
227
0
         m_element_size = 24;
228
0
         m_hash_id_size = 4;
229
0
         m_w = 16;
230
0
         m_len = 51;
231
0
         m_tree_height = 10;
232
0
         m_name = "XMSS-SHA2_10_192";
233
0
         m_hash_name = "Truncated(SHA-256,192)";
234
0
         m_strength = 192;
235
0
         m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHA2_192;
236
0
         break;
237
0
      case XMSS_SHA2_16_192:
238
0
         m_element_size = 24;
239
0
         m_hash_id_size = 4;
240
0
         m_w = 16;
241
0
         m_len = 51;
242
0
         m_tree_height = 16;
243
0
         m_name = "XMSS-SHA2_16_192";
244
0
         m_hash_name = "Truncated(SHA-256,192)";
245
0
         m_strength = 192;
246
0
         m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHA2_192;
247
0
         break;
248
0
      case XMSS_SHA2_20_192:
249
0
         m_element_size = 24;
250
0
         m_hash_id_size = 4;
251
0
         m_w = 16;
252
0
         m_len = 51;
253
0
         m_tree_height = 20;
254
0
         m_name = "XMSS-SHA2_20_192";
255
0
         m_hash_name = "Truncated(SHA-256,192)";
256
0
         m_strength = 192;
257
0
         m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHA2_192;
258
0
         break;
259
0
      case XMSS_SHAKE256_10_256:
260
0
         m_element_size = 32;
261
0
         m_hash_id_size = 32;
262
0
         m_w = 16;
263
0
         m_len = 67;
264
0
         m_tree_height = 10;
265
0
         m_name = "XMSS-SHAKE256_10_256";
266
0
         m_hash_name = "SHAKE-256(256)";
267
0
         m_strength = 256;
268
0
         m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE_256_256;
269
0
         break;
270
0
      case XMSS_SHAKE256_16_256:
271
0
         m_element_size = 32;
272
0
         m_hash_id_size = 32;
273
0
         m_w = 16;
274
0
         m_len = 67;
275
0
         m_tree_height = 16;
276
0
         m_name = "XMSS-SHAKE256_16_256";
277
0
         m_hash_name = "SHAKE-256(256)";
278
0
         m_strength = 256;
279
0
         m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE_256_256;
280
0
         break;
281
0
      case XMSS_SHAKE256_20_256:
282
0
         m_element_size = 32;
283
0
         m_hash_id_size = 32;
284
0
         m_w = 16;
285
0
         m_len = 67;
286
0
         m_tree_height = 20;
287
0
         m_name = "XMSS-SHAKE256_20_256";
288
0
         m_hash_name = "SHAKE-256(256)";
289
0
         m_strength = 256;
290
0
         m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE_256_256;
291
0
         break;
292
0
      case XMSS_SHAKE256_10_192:
293
0
         m_element_size = 24;
294
0
         m_hash_id_size = 4;
295
0
         m_w = 16;
296
0
         m_len = 51;
297
0
         m_tree_height = 10;
298
0
         m_name = "XMSS-SHAKE256_10_192";
299
0
         m_hash_name = "SHAKE-256(192)";
300
0
         m_strength = 192;
301
0
         m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE_256_192;
302
0
         break;
303
0
      case XMSS_SHAKE256_16_192:
304
0
         m_element_size = 24;
305
0
         m_hash_id_size = 4;
306
0
         m_w = 16;
307
0
         m_len = 51;
308
0
         m_tree_height = 16;
309
0
         m_name = "XMSS-SHAKE256_16_192";
310
0
         m_hash_name = "SHAKE-256(192)";
311
0
         m_strength = 192;
312
0
         m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE_256_192;
313
0
         break;
314
0
      case XMSS_SHAKE256_20_192:
315
0
         m_element_size = 24;
316
0
         m_hash_id_size = 4;
317
0
         m_w = 16;
318
0
         m_len = 51;
319
0
         m_tree_height = 20;
320
0
         m_name = "XMSS-SHAKE256_20_192";
321
0
         m_hash_name = "SHAKE-256(192)";
322
0
         m_strength = 192;
323
0
         m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE_256_192;
324
0
         break;
325
326
0
      default:
327
0
         throw Not_Implemented("Algorithm id does not match any known XMSS algorithm id:" + std::to_string(oid));
328
0
   }
329
0
}
330
331
}  // namespace Botan