Coverage Report

Created: 2023-03-26 08:33

/src/gnutls/lib/algorithms/sign.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright (C) 2011-2012 Free Software Foundation, Inc.
3
 * Copyright (C) 2017 Red Hat, Inc.
4
 *
5
 * Author: Nikos Mavrogiannopoulos
6
 *
7
 * This file is part of GnuTLS.
8
 *
9
 * The GnuTLS is free software; you can redistribute it and/or
10
 * modify it under the terms of the GNU Lesser General Public License
11
 * as published by the Free Software Foundation; either version 2.1 of
12
 * the License, or (at your option) any later version.
13
 *
14
 * This library is distributed in the hope that it will be useful, but
15
 * WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17
 * Lesser General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU Lesser General Public License
20
 * along with this program.  If not, see <https://www.gnu.org/licenses/>
21
 *
22
 */
23
24
#include "gnutls_int.h"
25
#include <algorithms.h>
26
#include "errors.h"
27
#include <x509/common.h>
28
#include <assert.h>
29
#include "c-strcase.h"
30
#include "pk.h"
31
32
/* signature algorithms;
33
 */
34
35
#ifdef ALLOW_SHA1
36
# define SHA1_SECURE_VAL _SECURE
37
#else
38
# define SHA1_SECURE_VAL _INSECURE_FOR_CERTS
39
#endif
40
41
static SYSTEM_CONFIG_OR_CONST gnutls_sign_entry_st sign_algorithms[] = {
42
  /* RSA-PKCS#1 1.5: must be before PSS,
43
   * so that gnutls_pk_to_sign() will return
44
   * these first for backwards compatibility. */
45
  {.name = "RSA-SHA256",
46
   .oid = SIG_RSA_SHA256_OID,
47
   .id = GNUTLS_SIGN_RSA_SHA256,
48
   .pk = GNUTLS_PK_RSA,
49
   .hash = GNUTLS_DIG_SHA256,
50
   .aid = {{4, 1}, SIG_SEM_DEFAULT}},
51
  {.name = "RSA-SHA384",
52
   .oid = SIG_RSA_SHA384_OID,
53
   .id = GNUTLS_SIGN_RSA_SHA384,
54
   .pk = GNUTLS_PK_RSA,
55
   .hash = GNUTLS_DIG_SHA384,
56
   .aid = {{5, 1}, SIG_SEM_DEFAULT}},
57
  {.name = "RSA-SHA512",
58
   .oid = SIG_RSA_SHA512_OID,
59
   .id = GNUTLS_SIGN_RSA_SHA512,
60
   .pk = GNUTLS_PK_RSA,
61
   .hash = GNUTLS_DIG_SHA512,
62
   .aid = {{6, 1}, SIG_SEM_DEFAULT}},
63
64
  /* RSA-PSS */
65
  {.name = "RSA-PSS-SHA256",
66
   .oid = PK_PKIX1_RSA_PSS_OID,
67
   .id = GNUTLS_SIGN_RSA_PSS_SHA256,
68
   .pk = GNUTLS_PK_RSA_PSS,
69
   .priv_pk = GNUTLS_PK_RSA,  /* PKCS#11 doesn't separate RSA from RSA-PSS privkeys */
70
   .hash = GNUTLS_DIG_SHA256,
71
   .flags = GNUTLS_SIGN_FLAG_TLS13_OK,
72
   .aid = {{8, 9}, SIG_SEM_DEFAULT}},
73
  {.name = "RSA-PSS-RSAE-SHA256",
74
   .oid = PK_PKIX1_RSA_PSS_OID,
75
   .id = GNUTLS_SIGN_RSA_PSS_RSAE_SHA256,
76
   .pk = GNUTLS_PK_RSA_PSS,
77
   .cert_pk = GNUTLS_PK_RSA,
78
   .priv_pk = GNUTLS_PK_RSA,
79
   .hash = GNUTLS_DIG_SHA256,
80
   .flags = GNUTLS_SIGN_FLAG_TLS13_OK,
81
   .aid = {{8, 4}, SIG_SEM_DEFAULT}},
82
  {.name = "RSA-PSS-SHA384",
83
   .oid = PK_PKIX1_RSA_PSS_OID,
84
   .id = GNUTLS_SIGN_RSA_PSS_SHA384,
85
   .pk = GNUTLS_PK_RSA_PSS,
86
   .priv_pk = GNUTLS_PK_RSA,
87
   .hash = GNUTLS_DIG_SHA384,
88
   .flags = GNUTLS_SIGN_FLAG_TLS13_OK,
89
   .aid = {{8, 0x0A}, SIG_SEM_DEFAULT}},
90
  {.name = "RSA-PSS-RSAE-SHA384",
91
   .oid = PK_PKIX1_RSA_PSS_OID,
92
   .id = GNUTLS_SIGN_RSA_PSS_RSAE_SHA384,
93
   .pk = GNUTLS_PK_RSA_PSS,
94
   .cert_pk = GNUTLS_PK_RSA,
95
   .priv_pk = GNUTLS_PK_RSA,
96
   .hash = GNUTLS_DIG_SHA384,
97
   .flags = GNUTLS_SIGN_FLAG_TLS13_OK,
98
   .aid = {{8, 5}, SIG_SEM_DEFAULT}},
99
  {.name = "RSA-PSS-SHA512",
100
   .oid = PK_PKIX1_RSA_PSS_OID,
101
   .id = GNUTLS_SIGN_RSA_PSS_SHA512,
102
   .pk = GNUTLS_PK_RSA_PSS,
103
   .priv_pk = GNUTLS_PK_RSA,
104
   .hash = GNUTLS_DIG_SHA512,
105
   .flags = GNUTLS_SIGN_FLAG_TLS13_OK,
106
   .aid = {{8, 0x0B}, SIG_SEM_DEFAULT}},
107
  {.name = "RSA-PSS-RSAE-SHA512",
108
   .oid = PK_PKIX1_RSA_PSS_OID,
109
   .id = GNUTLS_SIGN_RSA_PSS_RSAE_SHA512,
110
   .pk = GNUTLS_PK_RSA_PSS,
111
   .cert_pk = GNUTLS_PK_RSA,
112
   .priv_pk = GNUTLS_PK_RSA,
113
   .hash = GNUTLS_DIG_SHA512,
114
   .flags = GNUTLS_SIGN_FLAG_TLS13_OK,
115
   .aid = {{8, 6}, SIG_SEM_DEFAULT}},
116
117
  /* Ed25519: The hash algorithm here is set to be SHA512, although that is
118
   * an internal detail of Ed25519; we set it, because CMS/PKCS#7 requires
119
   * that mapping. */
120
  {.name = "EdDSA-Ed25519",
121
   .oid = SIG_EDDSA_SHA512_OID,
122
   .id = GNUTLS_SIGN_EDDSA_ED25519,
123
   .pk = GNUTLS_PK_EDDSA_ED25519,
124
   .hash = GNUTLS_DIG_SHA512,
125
   .flags = GNUTLS_SIGN_FLAG_TLS13_OK,
126
   .aid = {{8, 7}, SIG_SEM_DEFAULT}},
127
128
  /* Ed448: The hash algorithm here is set to be SHAKE256, although that is
129
   * an internal detail of Ed448; we set it, because CMS/PKCS#7 requires
130
   * that mapping. */
131
  {.name = "EdDSA-Ed448",
132
   .oid = SIG_ED448_OID,
133
   .id = GNUTLS_SIGN_EDDSA_ED448,
134
   .pk = GNUTLS_PK_EDDSA_ED448,
135
   .hash = GNUTLS_DIG_SHAKE_256,
136
   .flags = GNUTLS_SIGN_FLAG_TLS13_OK,
137
   .aid = {{8, 8}, SIG_SEM_DEFAULT},
138
   .hash_output_size = 114},
139
140
  /* ECDSA */
141
  /* The following three signature algorithms
142
   * have different semantics when used under TLS 1.2
143
   * or TLS 1.3. Under the former they behave as the
144
   * as ECDSA signed by SHAXXX by any curve, but under the
145
   * latter they are restricted to a single curve.
146
   * For this reason the ECDSA-SHAXXX algorithms act
147
   * as an alias to them. */
148
  /* we have intentionally the ECDSA-SHAXXX algorithms first
149
   * so that gnutls_pk_to_sign() will return these. */
150
  {.name = "ECDSA-SHA256",
151
   .oid = "1.2.840.10045.4.3.2",
152
   .id = GNUTLS_SIGN_ECDSA_SHA256,
153
   .pk = GNUTLS_PK_ECDSA,
154
   .hash = GNUTLS_DIG_SHA256,
155
   .aid = {{4, 3}, SIG_SEM_PRE_TLS12}},
156
  {.name = "ECDSA-SHA384",
157
   .oid = "1.2.840.10045.4.3.3",
158
   .id = GNUTLS_SIGN_ECDSA_SHA384,
159
   .pk = GNUTLS_PK_ECDSA,
160
   .hash = GNUTLS_DIG_SHA384,
161
   .aid = {{5, 3}, SIG_SEM_PRE_TLS12}},
162
  {.name = "ECDSA-SHA512",
163
   .oid = "1.2.840.10045.4.3.4",
164
   .id = GNUTLS_SIGN_ECDSA_SHA512,
165
   .pk = GNUTLS_PK_ECDSA,
166
   .hash = GNUTLS_DIG_SHA512,
167
   .aid = {{6, 3}, SIG_SEM_PRE_TLS12}},
168
169
  {.name = "ECDSA-SECP256R1-SHA256",
170
   .id = GNUTLS_SIGN_ECDSA_SECP256R1_SHA256,
171
   .pk = GNUTLS_PK_ECDSA,
172
   .curve = GNUTLS_ECC_CURVE_SECP256R1,
173
   .hash = GNUTLS_DIG_SHA256,
174
   .flags = GNUTLS_SIGN_FLAG_TLS13_OK,
175
   .aid = {{4, 3}, SIG_SEM_TLS13}},
176
  {.name = "ECDSA-SECP384R1-SHA384",
177
   .id = GNUTLS_SIGN_ECDSA_SECP384R1_SHA384,
178
   .pk = GNUTLS_PK_ECDSA,
179
   .curve = GNUTLS_ECC_CURVE_SECP384R1,
180
   .hash = GNUTLS_DIG_SHA384,
181
   .flags = GNUTLS_SIGN_FLAG_TLS13_OK,
182
   .aid = {{5, 3}, SIG_SEM_TLS13}},
183
  {.name = "ECDSA-SECP521R1-SHA512",
184
   .id = GNUTLS_SIGN_ECDSA_SECP521R1_SHA512,
185
   .pk = GNUTLS_PK_ECDSA,
186
   .curve = GNUTLS_ECC_CURVE_SECP521R1,
187
   .hash = GNUTLS_DIG_SHA512,
188
   .flags = GNUTLS_SIGN_FLAG_TLS13_OK,
189
   .aid = {{6, 3}, SIG_SEM_TLS13}},
190
191
  /* ECDSA-SHA3 */
192
  {.name = "ECDSA-SHA3-224",
193
   .oid = SIG_ECDSA_SHA3_224_OID,
194
   .id = GNUTLS_SIGN_ECDSA_SHA3_224,
195
   .pk = GNUTLS_PK_EC,
196
   .hash = GNUTLS_DIG_SHA3_224,
197
   .aid = TLS_SIGN_AID_UNKNOWN},
198
  {.name = "ECDSA-SHA3-256",
199
   .oid = SIG_ECDSA_SHA3_256_OID,
200
   .id = GNUTLS_SIGN_ECDSA_SHA3_256,
201
   .pk = GNUTLS_PK_EC,
202
   .hash = GNUTLS_DIG_SHA3_256,
203
   .aid = TLS_SIGN_AID_UNKNOWN},
204
  {.name = "ECDSA-SHA3-384",
205
   .oid = SIG_ECDSA_SHA3_384_OID,
206
   .id = GNUTLS_SIGN_ECDSA_SHA3_384,
207
   .pk = GNUTLS_PK_EC,
208
   .hash = GNUTLS_DIG_SHA3_384,
209
   .aid = TLS_SIGN_AID_UNKNOWN},
210
  {.name = "ECDSA-SHA3-512",
211
   .oid = SIG_ECDSA_SHA3_512_OID,
212
   .id = GNUTLS_SIGN_ECDSA_SHA3_512,
213
   .pk = GNUTLS_PK_EC,
214
   .hash = GNUTLS_DIG_SHA3_512,
215
   .aid = TLS_SIGN_AID_UNKNOWN},
216
  {.name = "RSA-SHA3-224",
217
   .oid = SIG_RSA_SHA3_224_OID,
218
   .id = GNUTLS_SIGN_RSA_SHA3_224,
219
   .pk = GNUTLS_PK_RSA,
220
   .hash = GNUTLS_DIG_SHA3_224,
221
   .aid = TLS_SIGN_AID_UNKNOWN},
222
  {.name = "RSA-SHA3-256",
223
   .oid = SIG_RSA_SHA3_256_OID,
224
   .id = GNUTLS_SIGN_RSA_SHA3_256,
225
   .pk = GNUTLS_PK_RSA,
226
   .hash = GNUTLS_DIG_SHA3_256,
227
   .aid = TLS_SIGN_AID_UNKNOWN},
228
  {.name = "RSA-SHA3-384",
229
   .oid = SIG_RSA_SHA3_384_OID,
230
   .id = GNUTLS_SIGN_RSA_SHA3_384,
231
   .pk = GNUTLS_PK_RSA,
232
   .hash = GNUTLS_DIG_SHA3_384,
233
   .aid = TLS_SIGN_AID_UNKNOWN},
234
  {.name = "RSA-SHA3-512",
235
   .oid = SIG_RSA_SHA3_512_OID,
236
   .id = GNUTLS_SIGN_RSA_SHA3_512,
237
   .pk = GNUTLS_PK_RSA,
238
   .hash = GNUTLS_DIG_SHA3_512,
239
   .aid = TLS_SIGN_AID_UNKNOWN},
240
241
  /* DSA-SHA3 */
242
  {.name = "DSA-SHA3-224",
243
   .oid = SIG_DSA_SHA3_224_OID,
244
   .id = GNUTLS_SIGN_DSA_SHA3_224,
245
   .pk = GNUTLS_PK_DSA,
246
   .hash = GNUTLS_DIG_SHA3_224,
247
   .aid = TLS_SIGN_AID_UNKNOWN},
248
  {.name = "DSA-SHA3-256",
249
   .oid = SIG_DSA_SHA3_256_OID,
250
   .id = GNUTLS_SIGN_DSA_SHA3_256,
251
   .pk = GNUTLS_PK_DSA,
252
   .hash = GNUTLS_DIG_SHA3_256,
253
   .aid = TLS_SIGN_AID_UNKNOWN},
254
  {.name = "DSA-SHA3-384",
255
   .oid = SIG_DSA_SHA3_384_OID,
256
   .id = GNUTLS_SIGN_DSA_SHA3_384,
257
   .pk = GNUTLS_PK_DSA,
258
   .hash = GNUTLS_DIG_SHA3_384,
259
   .aid = TLS_SIGN_AID_UNKNOWN},
260
  {.name = "DSA-SHA3-512",
261
   .oid = SIG_DSA_SHA3_512_OID,
262
   .id = GNUTLS_SIGN_DSA_SHA3_512,
263
   .pk = GNUTLS_PK_DSA,
264
   .hash = GNUTLS_DIG_SHA3_512,
265
   .aid = TLS_SIGN_AID_UNKNOWN},
266
267
  /* legacy */
268
  {.name = "RSA-RAW",
269
   .oid = NULL,
270
   .id = GNUTLS_SIGN_RSA_RAW,
271
   .pk = GNUTLS_PK_RSA,
272
   .hash = GNUTLS_DIG_UNKNOWN,
273
   .aid = TLS_SIGN_AID_UNKNOWN},
274
  {.name = "RSA-SHA1",
275
   .oid = SIG_RSA_SHA1_OID,
276
   .id = GNUTLS_SIGN_RSA_SHA1,
277
   .pk = GNUTLS_PK_RSA,
278
   .hash = GNUTLS_DIG_SHA1,
279
   .slevel = SHA1_SECURE_VAL,
280
   .aid = {{2, 1}, SIG_SEM_DEFAULT}},
281
  {.name = "RSA-SHA1",
282
   .oid = ISO_SIG_RSA_SHA1_OID,
283
   .id = GNUTLS_SIGN_RSA_SHA1,
284
   .pk = GNUTLS_PK_RSA,
285
   .slevel = SHA1_SECURE_VAL,
286
   .hash = GNUTLS_DIG_SHA1,
287
   .aid = {{2, 1}, SIG_SEM_DEFAULT}},
288
  {.name = "RSA-SHA224",
289
   .oid = SIG_RSA_SHA224_OID,
290
   .id = GNUTLS_SIGN_RSA_SHA224,
291
   .pk = GNUTLS_PK_RSA,
292
   .hash = GNUTLS_DIG_SHA224,
293
   .aid = TLS_SIGN_AID_UNKNOWN},
294
  {.name = "RSA-RMD160",
295
   .oid = SIG_RSA_RMD160_OID,
296
   .id = GNUTLS_SIGN_RSA_RMD160,
297
   .pk = GNUTLS_PK_RSA,
298
   .hash = GNUTLS_DIG_RMD160,
299
   .slevel = _INSECURE_FOR_CERTS,
300
   .aid = TLS_SIGN_AID_UNKNOWN},
301
  {.name = "DSA-SHA1",
302
   .oid = SIG_DSA_SHA1_OID,
303
   .id = GNUTLS_SIGN_DSA_SHA1,
304
   .pk = GNUTLS_PK_DSA,
305
   .slevel = SHA1_SECURE_VAL,
306
   .hash = GNUTLS_DIG_SHA1,
307
   .aid = {{2, 2}, SIG_SEM_PRE_TLS12}},
308
  {.name = "DSA-SHA1",
309
   .oid = "1.3.14.3.2.27",
310
   .id = GNUTLS_SIGN_DSA_SHA1,
311
   .pk = GNUTLS_PK_DSA,
312
   .hash = GNUTLS_DIG_SHA1,
313
   .slevel = SHA1_SECURE_VAL,
314
   .aid = {{2, 2}, SIG_SEM_PRE_TLS12}},
315
  {.name = "DSA-SHA224",
316
   .oid = SIG_DSA_SHA224_OID,
317
   .id = GNUTLS_SIGN_DSA_SHA224,
318
   .pk = GNUTLS_PK_DSA,
319
   .hash = GNUTLS_DIG_SHA224,
320
   .aid = TLS_SIGN_AID_UNKNOWN},
321
  {.name = "DSA-SHA256",
322
   .oid = SIG_DSA_SHA256_OID,
323
   .id = GNUTLS_SIGN_DSA_SHA256,
324
   .pk = GNUTLS_PK_DSA,
325
   .hash = GNUTLS_DIG_SHA256,
326
   .aid = TLS_SIGN_AID_UNKNOWN},
327
  {.name = "RSA-MD5",
328
   .oid = SIG_RSA_MD5_OID,
329
   .id = GNUTLS_SIGN_RSA_MD5,
330
   .pk = GNUTLS_PK_RSA,
331
   .hash = GNUTLS_DIG_MD5,
332
   .slevel = _INSECURE,
333
   .aid = TLS_SIGN_AID_UNKNOWN},
334
  {.name = "RSA-MD5",
335
   .oid = "1.3.14.3.2.25",
336
   .id = GNUTLS_SIGN_RSA_MD5,
337
   .pk = GNUTLS_PK_RSA,
338
   .hash = GNUTLS_DIG_MD5,
339
   .slevel = _INSECURE,
340
   .aid = TLS_SIGN_AID_UNKNOWN},
341
  {.name = "RSA-MD2",
342
   .oid = SIG_RSA_MD2_OID,
343
   .id = GNUTLS_SIGN_RSA_MD2,
344
   .pk = GNUTLS_PK_RSA,
345
   .hash = GNUTLS_DIG_MD2,
346
   .slevel = _INSECURE,
347
   .aid = TLS_SIGN_AID_UNKNOWN},
348
  {.name = "ECDSA-SHA1",
349
   .oid = "1.2.840.10045.4.1",
350
   .id = GNUTLS_SIGN_ECDSA_SHA1,
351
   .pk = GNUTLS_PK_EC,
352
   .slevel = SHA1_SECURE_VAL,
353
   .hash = GNUTLS_DIG_SHA1,
354
   .aid = {{2, 3}, SIG_SEM_DEFAULT}},
355
  {.name = "ECDSA-SHA224",
356
   .oid = "1.2.840.10045.4.3.1",
357
   .id = GNUTLS_SIGN_ECDSA_SHA224,
358
   .pk = GNUTLS_PK_EC,
359
   .hash = GNUTLS_DIG_SHA224,
360
   .aid = TLS_SIGN_AID_UNKNOWN},
361
  /* GOST R 34.10-2012-512 */
362
  {.name = "GOSTR341012-512",
363
   .oid = SIG_GOST_R3410_2012_512_OID,
364
   .id = GNUTLS_SIGN_GOST_512,
365
   .pk = GNUTLS_PK_GOST_12_512,
366
   .hash = GNUTLS_DIG_STREEBOG_512,
367
   .flags = GNUTLS_SIGN_FLAG_CRT_VRFY_REVERSE,
368
   .aid = {{8, 65}, SIG_SEM_PRE_TLS12}},
369
  /* GOST R 34.10-2012-256 */
370
  {.name = "GOSTR341012-256",
371
   .oid = SIG_GOST_R3410_2012_256_OID,
372
   .id = GNUTLS_SIGN_GOST_256,
373
   .pk = GNUTLS_PK_GOST_12_256,
374
   .hash = GNUTLS_DIG_STREEBOG_256,
375
   .flags = GNUTLS_SIGN_FLAG_CRT_VRFY_REVERSE,
376
   .aid = {{8, 64}, SIG_SEM_PRE_TLS12}},
377
  /* GOST R 34.10-2001 */
378
  {.name = "GOSTR341001",
379
   .oid = SIG_GOST_R3410_2001_OID,
380
   .id = GNUTLS_SIGN_GOST_94,
381
   .pk = GNUTLS_PK_GOST_01,
382
   .hash = GNUTLS_DIG_GOSTR_94,
383
   .flags = GNUTLS_SIGN_FLAG_CRT_VRFY_REVERSE,
384
   .aid = TLS_SIGN_AID_UNKNOWN},
385
  /* GOST R 34.10-94 */
386
  {.name = "GOSTR341094",
387
   .oid = SIG_GOST_R3410_94_OID,
388
   .id = 0,
389
   .pk = 0,
390
   .hash = 0,
391
   .aid = TLS_SIGN_AID_UNKNOWN},
392
  {.name = "DSA-SHA384",
393
   .oid = SIG_DSA_SHA384_OID,
394
   .id = GNUTLS_SIGN_DSA_SHA384,
395
   .pk = GNUTLS_PK_DSA,
396
   .hash = GNUTLS_DIG_SHA384,
397
   .aid = TLS_SIGN_AID_UNKNOWN},
398
  {.name = "DSA-SHA512",
399
   .oid = SIG_DSA_SHA512_OID,
400
   .id = GNUTLS_SIGN_DSA_SHA512,
401
   .pk = GNUTLS_PK_DSA,
402
   .hash = GNUTLS_DIG_SHA512,
403
   .aid = TLS_SIGN_AID_UNKNOWN},
404
405
  {.name = 0,
406
   .oid = 0,
407
   .id = 0,
408
   .pk = 0,
409
   .hash = 0,
410
   .aid = TLS_SIGN_AID_UNKNOWN}
411
};
412
413
#define GNUTLS_SIGN_LOOP(b) \
414
0
  do {                      \
415
0
    const gnutls_sign_entry_st *p;                 \
416
0
    for(p = sign_algorithms; p->name != NULL; p++) { b ; }         \
417
0
  } while (0)
418
419
#define GNUTLS_SIGN_ALG_LOOP(a) \
420
0
  GNUTLS_SIGN_LOOP( if(p->id && p->id == sign) { a; break; } )
421
422
/**
423
 * gnutls_sign_get_name:
424
 * @algorithm: is a sign algorithm
425
 *
426
 * Convert a #gnutls_sign_algorithm_t value to a string.
427
 *
428
 * Returns: a string that contains the name of the specified sign
429
 *   algorithm, or %NULL.
430
 **/
431
const char *gnutls_sign_get_name(gnutls_sign_algorithm_t algorithm)
432
0
{
433
0
  gnutls_sign_algorithm_t sign = algorithm;
434
0
  const char *ret = NULL;
435
436
  /* avoid prefix */
437
0
  GNUTLS_SIGN_ALG_LOOP(ret = p->name);
438
439
0
  return ret;
440
0
}
441
442
/**
443
 * gnutls_sign_is_secure:
444
 * @algorithm: is a sign algorithm
445
 *
446
 * Returns: Non-zero if the provided signature algorithm is considered to be secure.
447
 **/
448
unsigned gnutls_sign_is_secure(gnutls_sign_algorithm_t algorithm)
449
0
{
450
0
  return gnutls_sign_is_secure2(algorithm, 0);
451
0
}
452
453
bool _gnutls_sign_is_secure2(const gnutls_sign_entry_st * se,
454
           unsigned int flags)
455
0
{
456
0
  if (se->hash != GNUTLS_DIG_UNKNOWN &&
457
0
      _gnutls_digest_is_insecure2(se->hash,
458
0
          flags &
459
0
          GNUTLS_SIGN_FLAG_ALLOW_INSECURE_REVERTIBLE
460
0
          ?
461
0
          GNUTLS_MAC_FLAG_ALLOW_INSECURE_REVERTIBLE
462
0
          : 0)) {
463
0
    return gnutls_assert_val(false);
464
0
  }
465
466
0
  return (flags & GNUTLS_SIGN_FLAG_SECURE_FOR_CERTS ?
467
0
    se->slevel == _SECURE :
468
0
    (se->slevel == _SECURE || se->slevel == _INSECURE_FOR_CERTS)) ||
469
0
      (flags & GNUTLS_SIGN_FLAG_ALLOW_INSECURE_REVERTIBLE &&
470
0
       se->flags & GNUTLS_SIGN_FLAG_INSECURE_REVERTIBLE);
471
0
}
472
473
/* This is only called by cfg_apply in priority.c, in blocklisting mode. */
474
int _gnutls_sign_mark_insecure(gnutls_sign_algorithm_t sign,
475
             hash_security_level_t level)
476
0
{
477
0
#ifndef DISABLE_SYSTEM_CONFIG
478
0
  gnutls_sign_entry_st *p;
479
480
0
  if (unlikely(level == _SECURE))
481
0
    return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
482
483
0
  for (p = sign_algorithms; p->name != NULL; p++) {
484
0
    if (p->id && p->id == sign) {
485
0
      if (p->slevel < level)
486
0
        p->slevel = level;
487
0
      return 0;
488
0
    }
489
0
  }
490
0
#endif
491
0
  return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
492
0
}
493
494
/* This is only called by cfg_apply in priority.c, in allowlisting mode. */
495
void _gnutls_sign_mark_insecure_all(hash_security_level_t level)
496
0
{
497
0
#ifndef DISABLE_SYSTEM_CONFIG
498
0
  gnutls_sign_entry_st *p;
499
500
0
  for (p = sign_algorithms; p->name != NULL; p++) {
501
0
    if (p->slevel < level)
502
0
      p->slevel = level;
503
0
    p->flags |= GNUTLS_SIGN_FLAG_INSECURE_REVERTIBLE;
504
0
  }
505
0
#endif
506
0
}
507
508
int
509
_gnutls_sign_set_secure(gnutls_sign_algorithm_t sign,
510
      hash_security_level_t slevel)
511
0
{
512
0
#ifndef DISABLE_SYSTEM_CONFIG
513
0
  gnutls_sign_entry_st *p;
514
515
0
  for (p = sign_algorithms; p->name != NULL; p++) {
516
0
    if (p->id && p->id == sign) {
517
0
      if (!(p->flags & GNUTLS_SIGN_FLAG_INSECURE_REVERTIBLE)) {
518
0
        return
519
0
            gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
520
0
      }
521
0
      p->slevel = slevel;
522
0
      return 0;
523
0
    }
524
0
  }
525
0
#endif
526
0
  return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
527
0
}
528
529
/**
530
 * gnutls_sign_is_secure2:
531
 * @algorithm: is a sign algorithm
532
 * @flags: zero or %GNUTLS_SIGN_FLAG_SECURE_FOR_CERTS
533
 *
534
 * Returns: Non-zero if the provided signature algorithm is considered to be secure.
535
 **/
536
unsigned gnutls_sign_is_secure2(gnutls_sign_algorithm_t algorithm,
537
        unsigned int flags)
538
0
{
539
0
  const gnutls_sign_entry_st *se;
540
541
0
  se = _gnutls_sign_to_entry(algorithm);
542
0
  if (se == NULL)
543
0
    return 0;
544
545
0
  return _gnutls_sign_is_secure2(se, flags);
546
0
}
547
548
/**
549
 * gnutls_sign_list:
550
 *
551
 * Get a list of supported public key signature algorithms.
552
 * This function is not thread safe.
553
 *
554
 * Returns: a (0)-terminated list of #gnutls_sign_algorithm_t
555
 *   integers indicating the available ciphers.
556
 *
557
 **/
558
const gnutls_sign_algorithm_t *gnutls_sign_list(void)
559
0
{
560
0
  static gnutls_sign_algorithm_t supported_sign[MAX_ALGOS + 1] = { 0 };
561
562
0
  if (supported_sign[0] == 0) {
563
0
    int i = 0;
564
565
0
    GNUTLS_SIGN_LOOP(
566
          /* list all algorithms, but not duplicates */
567
0
          if (supported_sign[i] != p->id &&
568
0
              _gnutls_pk_sign_exists(p->id)) {
569
0
          assert(i + 1 < MAX_ALGOS);
570
0
          supported_sign[i++] = p->id;
571
0
          supported_sign[i + 1] = 0;}
572
0
    ) ;
573
0
  }
574
575
0
  return supported_sign;
576
0
}
577
578
/**
579
 * gnutls_sign_get_id:
580
 * @name: is a sign algorithm name
581
 *
582
 * The names are compared in a case insensitive way.
583
 *
584
 * Returns: return a #gnutls_sign_algorithm_t value corresponding to
585
 *   the specified algorithm, or %GNUTLS_SIGN_UNKNOWN on error.
586
 **/
587
gnutls_sign_algorithm_t gnutls_sign_get_id(const char *name)
588
0
{
589
0
  gnutls_sign_algorithm_t ret = GNUTLS_SIGN_UNKNOWN;
590
591
0
  GNUTLS_SIGN_LOOP(if (c_strcasecmp(p->name, name) == 0) {
592
0
       ret = p->id; break;}
593
0
  ) ;
594
595
0
  return ret;
596
597
0
}
598
599
const gnutls_sign_entry_st *_gnutls_oid_to_sign_entry(const char *oid)
600
0
{
601
0
  GNUTLS_SIGN_LOOP(if (p->oid && strcmp(oid, p->oid) == 0) {
602
0
       return p;}
603
0
  ) ;
604
0
  return NULL;
605
0
}
606
607
/**
608
 * gnutls_oid_to_sign:
609
 * @oid: is an object identifier
610
 *
611
 * Converts a textual object identifier to a #gnutls_sign_algorithm_t value.
612
 *
613
 * Returns: a #gnutls_sign_algorithm_t id of the specified digest
614
 *   algorithm, or %GNUTLS_SIGN_UNKNOWN on failure.
615
 *
616
 * Since: 3.4.3
617
 **/
618
gnutls_sign_algorithm_t gnutls_oid_to_sign(const char *oid)
619
0
{
620
0
  const gnutls_sign_entry_st *se;
621
622
0
  se = _gnutls_oid_to_sign_entry(oid);
623
0
  if (se == NULL) {
624
0
    _gnutls_debug_log("Unknown SIGN OID: '%s'\n", oid);
625
0
    return GNUTLS_SIGN_UNKNOWN;
626
0
  }
627
0
  return se->id;
628
0
}
629
630
const gnutls_sign_entry_st *_gnutls_pk_to_sign_entry(gnutls_pk_algorithm_t pk,
631
                 gnutls_digest_algorithm_t
632
                 hash)
633
0
{
634
0
  GNUTLS_SIGN_LOOP(if (pk == p->pk && hash == p->hash) {
635
0
       return p;}
636
0
  ) ;
637
638
0
  return NULL;
639
0
}
640
641
/**
642
 * gnutls_pk_to_sign:
643
 * @pk: is a public key algorithm
644
 * @hash: a hash algorithm
645
 *
646
 * This function maps public key and hash algorithms combinations
647
 * to signature algorithms.
648
 *
649
 * Returns: return a #gnutls_sign_algorithm_t value, or %GNUTLS_SIGN_UNKNOWN on error.
650
 **/
651
gnutls_sign_algorithm_t
652
gnutls_pk_to_sign(gnutls_pk_algorithm_t pk, gnutls_digest_algorithm_t hash)
653
0
{
654
0
  const gnutls_sign_entry_st *e;
655
656
0
  e = _gnutls_pk_to_sign_entry(pk, hash);
657
0
  if (e == NULL)
658
0
    return GNUTLS_SIGN_UNKNOWN;
659
0
  return e->id;
660
0
}
661
662
/**
663
 * gnutls_sign_get_oid:
664
 * @sign: is a sign algorithm
665
 *
666
 * Convert a #gnutls_sign_algorithm_t value to its object identifier.
667
 *
668
 * Returns: a string that contains the object identifier of the specified sign
669
 *   algorithm, or %NULL.
670
 *
671
 * Since: 3.4.3
672
 **/
673
const char *gnutls_sign_get_oid(gnutls_sign_algorithm_t sign)
674
0
{
675
0
  const char *ret = NULL;
676
677
0
  GNUTLS_SIGN_ALG_LOOP(ret = p->oid);
678
679
0
  return ret;
680
0
}
681
682
/**
683
 * gnutls_sign_get_hash_algorithm:
684
 * @sign: is a signature algorithm
685
 *
686
 * This function returns the digest algorithm corresponding to
687
 * the given signature algorithms.
688
 *
689
 * Since: 3.1.1
690
 *
691
 * Returns: return a #gnutls_digest_algorithm_t value, or %GNUTLS_DIG_UNKNOWN on error.
692
 **/
693
gnutls_digest_algorithm_t
694
gnutls_sign_get_hash_algorithm(gnutls_sign_algorithm_t sign)
695
0
{
696
0
  gnutls_digest_algorithm_t ret = GNUTLS_DIG_UNKNOWN;
697
698
0
  GNUTLS_SIGN_ALG_LOOP(ret = p->hash);
699
700
0
  return ret;
701
0
}
702
703
/**
704
 * gnutls_sign_get_pk_algorithm:
705
 * @sign: is a signature algorithm
706
 *
707
 * This function returns the public key algorithm corresponding to
708
 * the given signature algorithms. Note that there may be multiple
709
 * public key algorithms supporting a particular signature type;
710
 * when dealing with such algorithms use instead gnutls_sign_supports_pk_algorithm().
711
 *
712
 * Since: 3.1.1
713
 *
714
 * Returns: return a #gnutls_pk_algorithm_t value, or %GNUTLS_PK_UNKNOWN on error.
715
 **/
716
gnutls_pk_algorithm_t gnutls_sign_get_pk_algorithm(gnutls_sign_algorithm_t sign)
717
0
{
718
0
  gnutls_pk_algorithm_t ret = GNUTLS_PK_UNKNOWN;
719
720
0
  GNUTLS_SIGN_ALG_LOOP(ret = p->pk);
721
722
0
  return ret;
723
0
}
724
725
/**
726
 * gnutls_sign_supports_pk_algorithm:
727
 * @sign: is a signature algorithm
728
 * @pk: is a public key algorithm
729
 *
730
 * This function returns non-zero if the public key algorithm corresponds to
731
 * the given signature algorithm. That is, if that signature can be generated
732
 * from the given private key algorithm.
733
 *
734
 * Since: 3.6.0
735
 *
736
 * Returns: return non-zero when the provided algorithms are compatible.
737
 **/
738
unsigned
739
gnutls_sign_supports_pk_algorithm(gnutls_sign_algorithm_t sign,
740
          gnutls_pk_algorithm_t pk)
741
0
{
742
0
  const gnutls_sign_entry_st *p;
743
0
  unsigned r;
744
745
0
  for (p = sign_algorithms; p->name != NULL; p++) {
746
0
    if (p->id && p->id == sign) {
747
0
      r = sign_supports_priv_pk_algorithm(p, pk);
748
0
      if (r != 0)
749
0
        return r;
750
0
    }
751
0
  }
752
753
0
  return 0;
754
0
}
755
756
gnutls_sign_algorithm_t
757
_gnutls_tls_aid_to_sign(uint8_t id0, uint8_t id1, const version_entry_st * ver)
758
0
{
759
0
  gnutls_sign_algorithm_t ret = GNUTLS_SIGN_UNKNOWN;
760
761
0
  if (id0 == 255 && id1 == 255)
762
0
    return ret;
763
764
0
  GNUTLS_SIGN_LOOP(if (p->aid.id[0] == id0 &&
765
0
           p->aid.id[1] == id1 &&
766
0
           ((p->aid.tls_sem & ver->tls_sig_sem) != 0)) {
767
768
0
       ret = p->id; break;}
769
0
  ) ;
770
771
0
  return ret;
772
0
}
773
774
/* Returns NULL if a valid AID is not found
775
 */
776
const sign_algorithm_st *_gnutls_sign_to_tls_aid(gnutls_sign_algorithm_t sign)
777
0
{
778
0
  const sign_algorithm_st *ret = NULL;
779
780
0
  GNUTLS_SIGN_ALG_LOOP(ret = &p->aid);
781
782
0
  if (ret != NULL && HAVE_UNKNOWN_SIGAID(ret))
783
0
    return NULL;
784
785
0
  return ret;
786
0
}
787
788
const gnutls_sign_entry_st *_gnutls_sign_to_entry(gnutls_sign_algorithm_t sign)
789
0
{
790
0
  const gnutls_sign_entry_st *ret = NULL;
791
792
0
  GNUTLS_SIGN_ALG_LOOP(ret = p);
793
794
0
  return ret;
795
0
}
796
797
const gnutls_sign_entry_st *_gnutls_tls_aid_to_sign_entry(uint8_t id0,
798
                uint8_t id1,
799
                const version_entry_st
800
                * ver)
801
0
{
802
0
  if (id0 == 255 && id1 == 255)
803
0
    return NULL;
804
805
0
  GNUTLS_SIGN_LOOP(if (p->aid.id[0] == id0 &&
806
0
           p->aid.id[1] == id1 &&
807
0
           ((p->aid.tls_sem & ver->tls_sig_sem) != 0)) {
808
809
0
       return p;}
810
0
  ) ;
811
812
0
  return NULL;
813
0
}
814
815
const gnutls_sign_entry_st
816
    * _gnutls13_sign_get_compatible_with_privkey(gnutls_privkey_t privkey)
817
0
{
818
0
  GNUTLS_SIGN_LOOP(if ((p->flags & GNUTLS_SIGN_FLAG_TLS13_OK) &&
819
0
           _gnutls_privkey_compatible_with_sig(privkey,
820
0
                 p->id)) {
821
0
       return p;}
822
0
  ) ;
823
824
0
  return NULL;
825
0
}
826
827
unsigned _gnutls_sign_get_hash_strength(gnutls_sign_algorithm_t sign)
828
0
{
829
0
  const gnutls_sign_entry_st *se = _gnutls_sign_to_entry(sign);
830
0
  const mac_entry_st *me;
831
0
  unsigned hash_output_size;
832
833
0
  if (unlikely(se == NULL))
834
0
    return 0;
835
836
0
  me = hash_to_entry(se->hash);
837
0
  if (unlikely(me == NULL))
838
0
    return 0;
839
840
0
  if (se->hash_output_size > 0)
841
0
    hash_output_size = se->hash_output_size;
842
0
  else
843
0
    hash_output_size = _gnutls_mac_get_algo_len(me);
844
845
0
  if (me->id == GNUTLS_MAC_SHAKE_128)
846
0
    return MIN(hash_output_size * 8 / 2, 128);
847
0
  else if (me->id == GNUTLS_MAC_SHAKE_256)
848
0
    return MIN(hash_output_size * 8 / 2, 256);
849
850
0
  return hash_output_size * 8 / 2;
851
0
}