Coverage Report

Created: 2021-10-13 08:49

/src/botan/src/lib/tls/tls_algos.cpp
Line
Count
Source (jump to first uncovered line)
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
#include <botan/exceptn.h>
9
10
namespace Botan {
11
12
namespace TLS {
13
14
std::string kdf_algo_to_string(KDF_Algo algo)
15
18.8k
   {
16
18.8k
   switch(algo)
17
18.8k
      {
18
8.81k
      case KDF_Algo::SHA_1:
19
8.81k
         return "SHA-1";
20
5.14k
      case KDF_Algo::SHA_256:
21
5.14k
         return "SHA-256";
22
4.88k
      case KDF_Algo::SHA_384:
23
4.88k
         return "SHA-384";
24
18.8k
      }
25
26
0
   throw Invalid_State("kdf_algo_to_string unknown enum value");
27
18.8k
   }
28
29
std::string kex_method_to_string(Kex_Algo method)
30
0
   {
31
0
   switch(method)
32
0
      {
33
0
      case Kex_Algo::STATIC_RSA:
34
0
         return "RSA";
35
0
      case Kex_Algo::DH:
36
0
         return "DH";
37
0
      case Kex_Algo::ECDH:
38
0
         return "ECDH";
39
0
      case Kex_Algo::CECPQ1:
40
0
         return "CECPQ1";
41
0
      case Kex_Algo::PSK:
42
0
         return "PSK";
43
0
      case Kex_Algo::ECDHE_PSK:
44
0
         return "ECDHE_PSK";
45
0
      }
46
47
0
   throw Invalid_State("kex_method_to_string unknown enum value");
48
0
   }
49
50
Kex_Algo kex_method_from_string(const std::string& str)
51
0
   {
52
0
   if(str == "RSA")
53
0
      return Kex_Algo::STATIC_RSA;
54
55
0
   if(str == "DH")
56
0
      return Kex_Algo::DH;
57
58
0
   if(str == "ECDH")
59
0
      return Kex_Algo::ECDH;
60
61
0
   if(str == "CECPQ1")
62
0
      return Kex_Algo::CECPQ1;
63
64
0
   if(str == "PSK")
65
0
      return Kex_Algo::PSK;
66
67
0
   if(str == "ECDHE_PSK")
68
0
      return Kex_Algo::ECDHE_PSK;
69
70
0
   throw Invalid_Argument("Unknown kex method " + str);
71
0
   }
72
73
std::string auth_method_to_string(Auth_Method method)
74
564
   {
75
564
   switch(method)
76
564
      {
77
559
      case Auth_Method::RSA:
78
559
         return "RSA";
79
5
      case Auth_Method::ECDSA:
80
5
         return "ECDSA";
81
0
      case Auth_Method::IMPLICIT:
82
0
         return "IMPLICIT";
83
564
      }
84
85
0
    throw Invalid_State("auth_method_to_string unknown enum value");
86
564
   }
87
88
Auth_Method auth_method_from_string(const std::string& str)
89
0
   {
90
0
   if(str == "RSA")
91
0
      return Auth_Method::RSA;
92
0
   if(str == "ECDSA")
93
0
      return Auth_Method::ECDSA;
94
0
   if(str == "IMPLICIT")
95
0
      return Auth_Method::IMPLICIT;
96
97
0
   throw Invalid_Argument("Bad signature method " + str);
98
0
   }
99
100
bool group_param_is_dh(Group_Params group)
101
164k
   {
102
164k
   uint16_t group_id = static_cast<uint16_t>(group);
103
164k
   return (group_id >= 256 && group_id < 512);
104
164k
   }
105
106
Group_Params group_param_from_string(const std::string& group_name)
107
0
   {
108
0
   if(group_name == "secp256r1")
109
0
      return Group_Params::SECP256R1;
110
0
   if(group_name == "secp384r1")
111
0
      return Group_Params::SECP384R1;
112
0
   if(group_name == "secp521r1")
113
0
      return Group_Params::SECP521R1;
114
0
   if(group_name == "brainpool256r1")
115
0
      return Group_Params::BRAINPOOL256R1;
116
0
   if(group_name == "brainpool384r1")
117
0
      return Group_Params::BRAINPOOL384R1;
118
0
   if(group_name == "brainpool512r1")
119
0
      return Group_Params::BRAINPOOL512R1;
120
0
   if(group_name == "x25519")
121
0
      return Group_Params::X25519;
122
123
0
   if(group_name == "ffdhe/ietf/2048")
124
0
      return Group_Params::FFDHE_2048;
125
0
   if(group_name == "ffdhe/ietf/3072")
126
0
      return Group_Params::FFDHE_3072;
127
0
   if(group_name == "ffdhe/ietf/4096")
128
0
      return Group_Params::FFDHE_4096;
129
0
   if(group_name == "ffdhe/ietf/6144")
130
0
      return Group_Params::FFDHE_6144;
131
0
   if(group_name == "ffdhe/ietf/8192")
132
0
      return Group_Params::FFDHE_8192;
133
134
0
   return Group_Params::NONE; // unknown
135
0
   }
136
137
std::string group_param_to_string(Group_Params group)
138
17.5k
   {
139
17.5k
   switch(group)
140
17.5k
      {
141
1.79k
      case Group_Params::SECP256R1:
142
1.79k
         return "secp256r1";
143
1.86k
      case Group_Params::SECP384R1:
144
1.86k
         return "secp384r1";
145
8.59k
      case Group_Params::SECP521R1:
146
8.59k
         return "secp521r1";
147
2.16k
      case Group_Params::BRAINPOOL256R1:
148
2.16k
         return "brainpool256r1";
149
1.26k
      case Group_Params::BRAINPOOL384R1:
150
1.26k
         return "brainpool384r1";
151
1.90k
      case Group_Params::BRAINPOOL512R1:
152
1.90k
         return "brainpool512r1";
153
0
      case Group_Params::X25519:
154
0
         return "x25519";
155
156
0
      case Group_Params::FFDHE_2048:
157
0
         return "ffdhe/ietf/2048";
158
0
      case Group_Params::FFDHE_3072:
159
0
         return "ffdhe/ietf/3072";
160
0
      case Group_Params::FFDHE_4096:
161
0
         return "ffdhe/ietf/4096";
162
0
      case Group_Params::FFDHE_6144:
163
0
         return "ffdhe/ietf/6144";
164
0
      case Group_Params::FFDHE_8192:
165
0
         return "ffdhe/ietf/8192";
166
167
0
      default:
168
0
         return "";
169
17.5k
      }
170
17.5k
   }
171
172
173
std::string hash_function_of_scheme(Signature_Scheme scheme)
174
14.9k
   {
175
14.9k
   switch(scheme)
176
14.9k
      {
177
1.62k
      case Signature_Scheme::ECDSA_SHA256:
178
3.30k
      case Signature_Scheme::RSA_PKCS1_SHA256:
179
4.96k
      case Signature_Scheme::RSA_PSS_SHA256:
180
4.96k
         return "SHA-256";
181
182
1.62k
      case Signature_Scheme::ECDSA_SHA384:
183
3.38k
      case Signature_Scheme::RSA_PKCS1_SHA384:
184
5.02k
      case Signature_Scheme::RSA_PSS_SHA384:
185
5.02k
         return "SHA-384";
186
187
1.62k
      case Signature_Scheme::ECDSA_SHA512:
188
3.29k
      case Signature_Scheme::RSA_PKCS1_SHA512:
189
4.93k
      case Signature_Scheme::RSA_PSS_SHA512:
190
4.93k
         return "SHA-512";
191
192
0
      case Signature_Scheme::EDDSA_25519:
193
0
      case Signature_Scheme::EDDSA_448:
194
0
         return "Pure";
195
196
0
      case Signature_Scheme::NONE:
197
0
         return "";
198
14.9k
      }
199
200
0
   throw Invalid_State("hash_function_of_scheme: Unknown signature algorithm enum");
201
14.9k
   }
202
203
const std::vector<Signature_Scheme>& all_signature_schemes()
204
1.62k
   {
205
   /*
206
   * This is ordered in some approximate order of preference
207
   */
208
1.62k
   static const std::vector<Signature_Scheme> all_schemes = {
209
      //Signature_Scheme::EDDSA_448,
210
      //Signature_Scheme::EDDSA_25519,
211
212
1.62k
      Signature_Scheme::RSA_PSS_SHA384,
213
1.62k
      Signature_Scheme::RSA_PSS_SHA256,
214
1.62k
      Signature_Scheme::RSA_PSS_SHA512,
215
216
1.62k
      Signature_Scheme::RSA_PKCS1_SHA384,
217
1.62k
      Signature_Scheme::RSA_PKCS1_SHA512,
218
1.62k
      Signature_Scheme::RSA_PKCS1_SHA256,
219
220
1.62k
      Signature_Scheme::ECDSA_SHA384,
221
1.62k
      Signature_Scheme::ECDSA_SHA512,
222
1.62k
      Signature_Scheme::ECDSA_SHA256,
223
1.62k
   };
224
225
1.62k
   return all_schemes;
226
1.62k
   }
227
228
bool signature_scheme_is_known(Signature_Scheme scheme)
229
16.8k
   {
230
16.8k
   switch(scheme)
231
16.8k
      {
232
1.68k
      case Signature_Scheme::RSA_PKCS1_SHA256:
233
3.43k
      case Signature_Scheme::RSA_PKCS1_SHA384:
234
5.10k
      case Signature_Scheme::RSA_PKCS1_SHA512:
235
6.76k
      case Signature_Scheme::RSA_PSS_SHA256:
236
8.40k
      case Signature_Scheme::RSA_PSS_SHA384:
237
10.0k
      case Signature_Scheme::RSA_PSS_SHA512:
238
239
11.6k
      case Signature_Scheme::ECDSA_SHA256:
240
13.3k
      case Signature_Scheme::ECDSA_SHA384:
241
15.0k
      case Signature_Scheme::ECDSA_SHA512:
242
15.0k
         return true;
243
244
1.76k
      default:
245
1.76k
         return false;
246
16.8k
      }
247
248
16.8k
   }
249
250
std::string signature_algorithm_of_scheme(Signature_Scheme scheme)
251
15.0k
   {
252
15.0k
   switch(scheme)
253
15.0k
      {
254
1.68k
      case Signature_Scheme::RSA_PKCS1_SHA256:
255
3.43k
      case Signature_Scheme::RSA_PKCS1_SHA384:
256
5.10k
      case Signature_Scheme::RSA_PKCS1_SHA512:
257
6.76k
      case Signature_Scheme::RSA_PSS_SHA256:
258
8.40k
      case Signature_Scheme::RSA_PSS_SHA384:
259
10.0k
      case Signature_Scheme::RSA_PSS_SHA512:
260
10.0k
         return "RSA";
261
262
1.64k
      case Signature_Scheme::ECDSA_SHA256:
263
3.28k
      case Signature_Scheme::ECDSA_SHA384:
264
4.99k
      case Signature_Scheme::ECDSA_SHA512:
265
4.99k
         return "ECDSA";
266
267
0
      case Signature_Scheme::EDDSA_25519:
268
0
         return "Ed25519";
269
270
0
      case Signature_Scheme::EDDSA_448:
271
0
         return "Ed448";
272
273
0
      case Signature_Scheme::NONE:
274
0
         return "";
275
15.0k
      }
276
277
0
   throw Invalid_State("signature_algorithm_of_scheme: Unknown signature algorithm enum");
278
15.0k
   }
279
280
std::string sig_scheme_to_string(Signature_Scheme scheme)
281
0
   {
282
0
   switch(scheme)
283
0
      {
284
0
      case Signature_Scheme::RSA_PKCS1_SHA256:
285
0
         return "RSA_PKCS1_SHA256";
286
0
      case Signature_Scheme::RSA_PKCS1_SHA384:
287
0
         return "RSA_PKCS1_SHA384";
288
0
      case Signature_Scheme::RSA_PKCS1_SHA512:
289
0
         return "RSA_PKCS1_SHA512";
290
291
0
      case Signature_Scheme::ECDSA_SHA256:
292
0
         return "ECDSA_SHA256";
293
0
      case Signature_Scheme::ECDSA_SHA384:
294
0
         return "ECDSA_SHA384";
295
0
      case Signature_Scheme::ECDSA_SHA512:
296
0
         return "ECDSA_SHA512";
297
298
0
      case Signature_Scheme::RSA_PSS_SHA256:
299
0
         return "RSA_PSS_SHA256";
300
0
      case Signature_Scheme::RSA_PSS_SHA384:
301
0
         return "RSA_PSS_SHA384";
302
0
      case Signature_Scheme::RSA_PSS_SHA512:
303
0
         return "RSA_PSS_SHA512";
304
305
0
      case Signature_Scheme::EDDSA_25519:
306
0
         return "EDDSA_25519";
307
0
      case Signature_Scheme::EDDSA_448:
308
0
         return "EDDSA_448";
309
310
0
      case Signature_Scheme::NONE:
311
0
         return "";
312
0
      }
313
314
0
   throw Invalid_State("sig_scheme_to_string: Unknown signature algorithm enum");
315
0
   }
316
317
std::string padding_string_for_scheme(Signature_Scheme scheme)
318
0
   {
319
0
   switch(scheme)
320
0
      {
321
0
      case Signature_Scheme::RSA_PKCS1_SHA256:
322
0
         return "EMSA_PKCS1(SHA-256)";
323
0
      case Signature_Scheme::RSA_PKCS1_SHA384:
324
0
         return "EMSA_PKCS1(SHA-384)";
325
0
      case Signature_Scheme::RSA_PKCS1_SHA512:
326
0
         return "EMSA_PKCS1(SHA-512)";
327
328
0
      case Signature_Scheme::ECDSA_SHA256:
329
0
         return "EMSA1(SHA-256)";
330
0
      case Signature_Scheme::ECDSA_SHA384:
331
0
         return "EMSA1(SHA-384)";
332
0
      case Signature_Scheme::ECDSA_SHA512:
333
0
         return "EMSA1(SHA-512)";
334
335
0
      case Signature_Scheme::RSA_PSS_SHA256:
336
0
         return "PSSR(SHA-256,MGF1,32)";
337
0
      case Signature_Scheme::RSA_PSS_SHA384:
338
0
         return "PSSR(SHA-384,MGF1,48)";
339
0
      case Signature_Scheme::RSA_PSS_SHA512:
340
0
         return "PSSR(SHA-512,MGF1,64)";
341
342
0
      case Signature_Scheme::EDDSA_25519:
343
0
         return "Pure";
344
0
      case Signature_Scheme::EDDSA_448:
345
0
         return "Pure";
346
347
0
      case Signature_Scheme::NONE:
348
0
         return "";
349
0
      }
350
351
0
   throw Invalid_State("padding_string_for_scheme: Unknown signature algorithm enum");
352
0
   }
353
354
}
355
356
}