Botan 3.10.0
Crypto and TLS for C&
tls_algos.cpp
Go to the documentation of this file.
1/*
2* (C) 2017 Jack Lloyd
3*
4* Botan is released under the Simplified BSD License (see license.txt)
5*/
6
7#include <botan/tls_algos.h>
8
9#include <botan/exceptn.h>
10#include <botan/internal/fmt.h>
11
12namespace Botan::TLS {
13
14std::string kdf_algo_to_string(KDF_Algo algo) {
15 switch(algo) {
16 case KDF_Algo::SHA_1:
17 return "SHA-1";
19 return "SHA-256";
21 return "SHA-384";
22 }
23
24 throw Invalid_State("kdf_algo_to_string unknown enum value");
25}
26
27std::string kex_method_to_string(Kex_Algo method) {
28 switch(method) {
30 return "RSA";
31 case Kex_Algo::DH:
32 return "DH";
33 case Kex_Algo::ECDH:
34 return "ECDH";
35 case Kex_Algo::PSK:
36 return "PSK";
38 return "ECDHE_PSK";
40 return "DHE_PSK";
41 case Kex_Algo::KEM:
42 return "KEM";
44 return "KEM_PSK";
46 return "HYBRID";
48 return "HYBRID_PSK";
50 return "UNDEFINED";
51 }
52
53 throw Invalid_State("kex_method_to_string unknown enum value");
54}
55
56Kex_Algo kex_method_from_string(std::string_view str) {
57 if(str == "RSA") {
59 }
60
61 if(str == "DH") {
62 return Kex_Algo::DH;
63 }
64
65 if(str == "ECDH") {
66 return Kex_Algo::ECDH;
67 }
68
69 if(str == "PSK") {
70 return Kex_Algo::PSK;
71 }
72
73 if(str == "ECDHE_PSK") {
75 }
76
77 if(str == "DHE_PSK") {
78 return Kex_Algo::DHE_PSK;
79 }
80
81 if(str == "KEM") {
82 return Kex_Algo::KEM;
83 }
84
85 if(str == "KEM_PSK") {
86 return Kex_Algo::KEM_PSK;
87 }
88
89 if(str == "HYBRID") {
90 return Kex_Algo::HYBRID;
91 }
92
93 if(str == "HYBRID_PSK") {
95 }
96
97 if(str == "UNDEFINED") {
99 }
100
101 throw Invalid_Argument(fmt("Unknown kex method '{}'", str));
102}
103
105 switch(method) {
106 case Auth_Method::RSA:
107 return "RSA";
109 return "ECDSA";
111 return "IMPLICIT";
113 return "UNDEFINED";
114 }
115
116 throw Invalid_State("auth_method_to_string unknown enum value");
117}
118
120 if(str == "RSA") {
121 return Auth_Method::RSA;
122 }
123 if(str == "ECDSA") {
124 return Auth_Method::ECDSA;
125 }
126 if(str == "IMPLICIT") {
128 }
129 if(str == "UNDEFINED") {
131 }
132
133 throw Invalid_Argument(fmt("Unknown TLS signature method '{}'", str));
134}
135
137#if !defined(BOTAN_HAS_X25519)
138 if(is_x25519()) {
139 return false;
140 }
142 return false;
143 }
144#endif
145
146#if !defined(BOTAN_HAS_X448)
147 if(is_x448()) {
148 return false;
149 }
151 return false;
152 }
153#endif
154
155#if !defined(BOTAN_HAS_DIFFIE_HELLMAN)
156 if(is_in_ffdhe_range()) {
157 return false;
158 }
159#endif
160
161#if !defined(BOTAN_HAS_ML_KEM)
163 return false;
164 }
165#endif
166
167#if !defined(BOTAN_HAS_FRODOKEM)
169 return false;
170 }
171#endif
172
173 return true;
174}
175
206
207std::optional<Group_Params> Group_Params::from_string(std::string_view group_name) {
208 if(group_name == "secp256r1") {
209 return Group_Params::SECP256R1;
210 }
211 if(group_name == "secp384r1") {
212 return Group_Params::SECP384R1;
213 }
214 if(group_name == "secp521r1") {
215 return Group_Params::SECP521R1;
216 }
217 if(group_name == "brainpool256r1") {
218 return Group_Params::BRAINPOOL256R1;
219 }
220 if(group_name == "brainpool384r1") {
221 return Group_Params::BRAINPOOL384R1;
222 }
223 if(group_name == "brainpool512r1") {
224 return Group_Params::BRAINPOOL512R1;
225 }
226 if(group_name == "x25519") {
227 return Group_Params::X25519;
228 }
229 if(group_name == "x448") {
230 return Group_Params::X448;
231 }
232
233 if(group_name == "ffdhe/ietf/2048") {
234 return Group_Params::FFDHE_2048;
235 }
236 if(group_name == "ffdhe/ietf/3072") {
237 return Group_Params::FFDHE_3072;
238 }
239 if(group_name == "ffdhe/ietf/4096") {
240 return Group_Params::FFDHE_4096;
241 }
242 if(group_name == "ffdhe/ietf/6144") {
243 return Group_Params::FFDHE_6144;
244 }
245 if(group_name == "ffdhe/ietf/8192") {
246 return Group_Params::FFDHE_8192;
247 }
248
249 if(group_name == "ML-KEM-512") {
250 return Group_Params::ML_KEM_512;
251 }
252 if(group_name == "ML-KEM-768") {
253 return Group_Params::ML_KEM_768;
254 }
255 if(group_name == "ML-KEM-1024") {
256 return Group_Params::ML_KEM_1024;
257 }
258
259 if(group_name == "eFrodoKEM-640-SHAKE") {
260 return Group_Params::eFRODOKEM_640_SHAKE_OQS;
261 }
262 if(group_name == "eFrodoKEM-976-SHAKE") {
263 return Group_Params::eFRODOKEM_976_SHAKE_OQS;
264 }
265 if(group_name == "eFrodoKEM-1344-SHAKE") {
266 return Group_Params::eFRODOKEM_1344_SHAKE_OQS;
267 }
268 if(group_name == "eFrodoKEM-640-AES") {
269 return Group_Params::eFRODOKEM_640_AES_OQS;
270 }
271 if(group_name == "eFrodoKEM-976-AES") {
272 return Group_Params::eFRODOKEM_976_AES_OQS;
273 }
274 if(group_name == "eFrodoKEM-1344-AES") {
275 return Group_Params::eFRODOKEM_1344_AES_OQS;
276 }
277
278 if(group_name == "x25519/ML-KEM-768") {
279 return Group_Params::HYBRID_X25519_ML_KEM_768;
280 }
281 if(group_name == "secp256r1/ML-KEM-768") {
282 return Group_Params::HYBRID_SECP256R1_ML_KEM_768;
283 }
284 if(group_name == "secp384r1/ML-KEM-1024") {
285 return Group_Params::HYBRID_SECP384R1_ML_KEM_1024;
286 }
287
288 if(group_name == "x25519/eFrodoKEM-640-SHAKE") {
289 return Group_Params::HYBRID_X25519_eFRODOKEM_640_SHAKE_OQS;
290 }
291 if(group_name == "x25519/eFrodoKEM-640-AES") {
292 return Group_Params::HYBRID_X25519_eFRODOKEM_640_AES_OQS;
293 }
294 if(group_name == "x448/eFrodoKEM-976-SHAKE") {
295 return Group_Params::HYBRID_X448_eFRODOKEM_976_SHAKE_OQS;
296 }
297 if(group_name == "x448/eFrodoKEM-976-AES") {
298 return Group_Params::HYBRID_X448_eFRODOKEM_976_AES_OQS;
299 }
300
301 if(group_name == "secp256r1/eFrodoKEM-640-SHAKE") {
302 return Group_Params::HYBRID_SECP256R1_eFRODOKEM_640_SHAKE_OQS;
303 }
304 if(group_name == "secp256r1/eFrodoKEM-640-AES") {
305 return Group_Params::HYBRID_SECP256R1_eFRODOKEM_640_AES_OQS;
306 }
307
308 if(group_name == "secp384r1/eFrodoKEM-976-SHAKE") {
309 return Group_Params::HYBRID_SECP384R1_eFRODOKEM_976_SHAKE_OQS;
310 }
311 if(group_name == "secp384r1/eFrodoKEM-976-AES") {
312 return Group_Params::HYBRID_SECP384R1_eFRODOKEM_976_AES_OQS;
313 }
314
315 if(group_name == "secp521r1/eFrodoKEM-1344-SHAKE") {
316 return Group_Params::HYBRID_SECP521R1_eFRODOKEM_1344_SHAKE_OQS;
317 }
318 if(group_name == "secp521r1/eFrodoKEM-1344-AES") {
319 return Group_Params::HYBRID_SECP521R1_eFRODOKEM_1344_AES_OQS;
320 }
321
322 return std::nullopt;
323}
324
325std::optional<std::string> Group_Params::to_string() const {
326 switch(m_code) {
327 case Group_Params::SECP256R1:
328 return "secp256r1";
329 case Group_Params::SECP384R1:
330 return "secp384r1";
331 case Group_Params::SECP521R1:
332 return "secp521r1";
333 case Group_Params::BRAINPOOL256R1:
334 return "brainpool256r1";
335 case Group_Params::BRAINPOOL384R1:
336 return "brainpool384r1";
337 case Group_Params::BRAINPOOL512R1:
338 return "brainpool512r1";
339 case Group_Params::X25519:
340 return "x25519";
341 case Group_Params::X448:
342 return "x448";
343
344 case Group_Params::FFDHE_2048:
345 return "ffdhe/ietf/2048";
346 case Group_Params::FFDHE_3072:
347 return "ffdhe/ietf/3072";
348 case Group_Params::FFDHE_4096:
349 return "ffdhe/ietf/4096";
350 case Group_Params::FFDHE_6144:
351 return "ffdhe/ietf/6144";
352 case Group_Params::FFDHE_8192:
353 return "ffdhe/ietf/8192";
354
355 case Group_Params::ML_KEM_512:
356 return "ML-KEM-512";
357 case Group_Params::ML_KEM_768:
358 return "ML-KEM-768";
359 case Group_Params::ML_KEM_1024:
360 return "ML-KEM-1024";
361
362 case Group_Params::eFRODOKEM_640_SHAKE_OQS:
363 return "eFrodoKEM-640-SHAKE";
364 case Group_Params::eFRODOKEM_976_SHAKE_OQS:
365 return "eFrodoKEM-976-SHAKE";
366 case Group_Params::eFRODOKEM_1344_SHAKE_OQS:
367 return "eFrodoKEM-1344-SHAKE";
368 case Group_Params::eFRODOKEM_640_AES_OQS:
369 return "eFrodoKEM-640-AES";
370 case Group_Params::eFRODOKEM_976_AES_OQS:
371 return "eFrodoKEM-976-AES";
372 case Group_Params::eFRODOKEM_1344_AES_OQS:
373 return "eFrodoKEM-1344-AES";
374
375 case Group_Params::HYBRID_X25519_eFRODOKEM_640_SHAKE_OQS:
376 return "x25519/eFrodoKEM-640-SHAKE";
377 case Group_Params::HYBRID_X25519_eFRODOKEM_640_AES_OQS:
378 return "x25519/eFrodoKEM-640-AES";
379 case Group_Params::HYBRID_X448_eFRODOKEM_976_SHAKE_OQS:
380 return "x448/eFrodoKEM-976-SHAKE";
381 case Group_Params::HYBRID_X448_eFRODOKEM_976_AES_OQS:
382 return "x448/eFrodoKEM-976-AES";
383 case Group_Params::HYBRID_SECP256R1_eFRODOKEM_640_SHAKE_OQS:
384 return "secp256r1/eFrodoKEM-640-SHAKE";
385 case Group_Params::HYBRID_SECP256R1_eFRODOKEM_640_AES_OQS:
386 return "secp256r1/eFrodoKEM-640-AES";
387 case Group_Params::HYBRID_SECP384R1_eFRODOKEM_976_SHAKE_OQS:
388 return "secp384r1/eFrodoKEM-976-SHAKE";
389 case Group_Params::HYBRID_SECP384R1_eFRODOKEM_976_AES_OQS:
390 return "secp384r1/eFrodoKEM-976-AES";
391 case Group_Params::HYBRID_SECP521R1_eFRODOKEM_1344_SHAKE_OQS:
392 return "secp521r1/eFrodoKEM-1344-SHAKE";
393 case Group_Params::HYBRID_SECP521R1_eFRODOKEM_1344_AES_OQS:
394 return "secp521r1/eFrodoKEM-1344-AES";
395
396 case Group_Params::HYBRID_X25519_ML_KEM_768:
397 return "x25519/ML-KEM-768";
398 case Group_Params::HYBRID_SECP256R1_ML_KEM_768:
399 return "secp256r1/ML-KEM-768";
400 case Group_Params::HYBRID_SECP384R1_ML_KEM_1024:
401 return "secp384r1/ML-KEM-1024";
402
403 default:
404 return std::nullopt;
405 }
406}
407
408} // namespace Botan::TLS
constexpr bool is_in_ffdhe_range() const
Definition tls_algos.h:182
constexpr bool is_pqc_hybrid() const
Definition tls_algos.h:237
constexpr bool is_pure_frodokem() const
Definition tls_algos.h:198
std::optional< Group_Params_Code > pqc_hybrid_ecc() const
std::optional< std::string > to_string() const
static std::optional< Group_Params > from_string(std::string_view group_name)
constexpr bool is_pqc_hybrid_frodokem() const
Definition tls_algos.h:224
constexpr bool is_pure_ml_kem() const
Definition tls_algos.h:193
constexpr bool is_pqc_hybrid_ml_kem() const
Definition tls_algos.h:218
constexpr bool is_x448() const
Definition tls_algos.h:174
constexpr bool is_x25519() const
Definition tls_algos.h:172
Kex_Algo kex_method_from_string(std::string_view str)
Definition tls_algos.cpp:56
Auth_Method auth_method_from_string(std::string_view str)
std::string kdf_algo_to_string(KDF_Algo algo)
Definition tls_algos.cpp:14
std::string kex_method_to_string(Kex_Algo method)
Definition tls_algos.cpp:27
std::string auth_method_to_string(Auth_Method method)
std::string fmt(std::string_view format, const T &... args)
Definition fmt.h:53