Coverage Report

Created: 2024-11-25 06:31

/src/gnutls/lib/x509/key_decode.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright (C) 2011-2012 Free Software Foundation, Inc.
3
 * Copyright (C) 2013-2017 Red Hat
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 "errors.h"
26
#include "global.h"
27
#include <libtasn1.h>
28
#include "datum.h"
29
#include "common.h"
30
#include "x509_int.h"
31
#include "pk.h"
32
#include "num.h"
33
#include "ecc.h"
34
35
static int _gnutls_x509_read_rsa_pubkey(uint8_t *der, int dersize,
36
          gnutls_pk_params_st *params);
37
static int _gnutls_x509_read_dsa_pubkey(uint8_t *der, int dersize,
38
          gnutls_pk_params_st *params);
39
static int _gnutls_x509_read_ecc_pubkey(uint8_t *der, int dersize,
40
          gnutls_pk_params_st *params);
41
static int _gnutls_x509_read_eddsa_pubkey(gnutls_ecc_curve_t curve,
42
            uint8_t *der, int dersize,
43
            gnutls_pk_params_st *params);
44
static int _gnutls_x509_read_ecdh_pubkey(gnutls_ecc_curve_t curve, uint8_t *der,
45
           int dersize,
46
           gnutls_pk_params_st *params);
47
static int _gnutls_x509_read_gost_pubkey(uint8_t *der, int dersize,
48
           gnutls_pk_params_st *params);
49
50
static int _gnutls_x509_read_dsa_params(uint8_t *der, int dersize,
51
          gnutls_pk_params_st *params);
52
53
/*
54
 * some x509 certificate parsing functions that relate to MPI parameter
55
 * extraction. This reads the BIT STRING subjectPublicKey.
56
 * Returns 2 parameters (m,e). It does not set params_nr.
57
 */
58
int _gnutls_x509_read_rsa_pubkey(uint8_t *der, int dersize,
59
         gnutls_pk_params_st *params)
60
60.2k
{
61
60.2k
  int result;
62
60.2k
  asn1_node spk = NULL;
63
64
60.2k
  if ((result = asn1_create_element(_gnutls_get_gnutls_asn(),
65
60.2k
            "GNUTLS.RSAPublicKey", &spk)) !=
66
60.2k
      ASN1_SUCCESS) {
67
0
    gnutls_assert();
68
0
    return _gnutls_asn2err(result);
69
0
  }
70
71
60.2k
  result = asn1_der_decoding(&spk, der, dersize, NULL);
72
73
60.2k
  if (result != ASN1_SUCCESS) {
74
1.11k
    gnutls_assert();
75
1.11k
    asn1_delete_structure(&spk);
76
1.11k
    return _gnutls_asn2err(result);
77
1.11k
  }
78
79
59.1k
  if (_gnutls_x509_read_int(spk, "modulus", &params->params[0]) < 0) {
80
14
    gnutls_assert();
81
14
    asn1_delete_structure(&spk);
82
14
    return GNUTLS_E_ASN1_GENERIC_ERROR;
83
14
  }
84
85
59.1k
  if (_gnutls_x509_read_int(spk, "publicExponent", &params->params[1]) <
86
59.1k
      0) {
87
50
    gnutls_assert();
88
50
    _gnutls_mpi_release(&params->params[0]);
89
50
    asn1_delete_structure(&spk);
90
50
    return GNUTLS_E_ASN1_GENERIC_ERROR;
91
50
  }
92
93
59.1k
  asn1_delete_structure(&spk);
94
95
59.1k
  return 0;
96
59.1k
}
97
98
/*
99
 * some x509 certificate parsing functions that relate to MPI parameter
100
 * extraction. This reads the BIT STRING subjectPublicKey.
101
 * Returns 2 parameters (m,e). It does not set params_nr.
102
 */
103
int _gnutls_x509_read_ecc_pubkey(uint8_t *der, int dersize,
104
         gnutls_pk_params_st *params)
105
22.6k
{
106
  /* RFC5480 defines the public key to be an ECPoint (i.e. OCTET STRING),
107
   * Then it says that the OCTET STRING _value_ is converted to BIT STRING.
108
   * That means that the value we place there is the raw X9.62 one. */
109
22.6k
  return _gnutls_ecc_ansi_x962_import(
110
22.6k
    der, dersize, &params->params[ECC_X], &params->params[ECC_Y]);
111
22.6k
}
112
113
int _gnutls_x509_read_eddsa_pubkey(gnutls_ecc_curve_t curve, uint8_t *der,
114
           int dersize, gnutls_pk_params_st *params)
115
19.6k
{
116
19.6k
  int size = gnutls_ecc_curve_get_size(curve);
117
19.6k
  if (dersize != size)
118
43
    return gnutls_assert_val(GNUTLS_E_ILLEGAL_PARAMETER);
119
120
19.5k
  return _gnutls_set_datum(&params->raw_pub, der, dersize);
121
19.6k
}
122
123
int _gnutls_x509_read_ecdh_pubkey(gnutls_ecc_curve_t curve, uint8_t *der,
124
          int dersize, gnutls_pk_params_st *params)
125
52
{
126
52
  int size = gnutls_ecc_curve_get_size(curve);
127
52
  if (dersize != size)
128
50
    return gnutls_assert_val(GNUTLS_E_ILLEGAL_PARAMETER);
129
130
2
  return _gnutls_set_datum(&params->raw_pub, der, dersize);
131
52
}
132
133
/* Pubkey is a concatenation of X (in little endian) and Y (also LE)
134
 * encoded into OCTET STRING. */
135
static int _gnutls_x509_read_gost_pubkey(uint8_t *der, int dersize,
136
           gnutls_pk_params_st *params)
137
13
{
138
13
  int ret;
139
13
  int len;
140
13
  bigint_t *x = &params->params[GOST_X];
141
13
  bigint_t *y = &params->params[GOST_Y];
142
143
  /* Quick and dirty parsing of OCTET STRING of 0x40 or 0x80 bytes */
144
13
  if (dersize < 1 || der[0] != ASN1_TAG_OCTET_STRING) {
145
3
    return gnutls_assert_val(GNUTLS_E_PARSING_ERROR);
146
3
  }
147
148
10
  der++;
149
10
  dersize--;
150
151
10
  ret = asn1_get_length_der(der, dersize, &len);
152
10
  if (ret <= 0 || ret % 2 != 0 || dersize != len + ret) {
153
3
    return gnutls_assert_val(GNUTLS_E_PARSING_ERROR);
154
3
  }
155
156
7
  der += len;
157
7
  dersize -= len;
158
159
  /* read data */
160
7
  ret = _gnutls_mpi_init_scan_le(x, der, dersize / 2);
161
7
  if (ret < 0)
162
0
    return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
163
164
7
  ret = _gnutls_mpi_init_scan_le(y, der + dersize / 2, dersize / 2);
165
7
  if (ret < 0) {
166
0
    _gnutls_mpi_release(y);
167
0
    return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
168
0
  }
169
170
7
  return 0;
171
7
}
172
173
/* reads p,q and g 
174
 * from the certificate (subjectPublicKey BIT STRING).
175
 * params[0-2]. It does NOT set params_nr.
176
 */
177
static int _gnutls_x509_read_dsa_params(uint8_t *der, int dersize,
178
          gnutls_pk_params_st *params)
179
4.28k
{
180
4.28k
  int result;
181
4.28k
  asn1_node spk = NULL;
182
183
4.28k
  if ((result = asn1_create_element(_gnutls_get_pkix(), "PKIX1.Dss-Parms",
184
4.28k
            &spk)) != ASN1_SUCCESS) {
185
0
    gnutls_assert();
186
0
    return _gnutls_asn2err(result);
187
0
  }
188
189
4.28k
  result = asn1_der_decoding(&spk, der, dersize, NULL);
190
191
4.28k
  if (result != ASN1_SUCCESS) {
192
14
    gnutls_assert();
193
14
    asn1_delete_structure(&spk);
194
14
    return _gnutls_asn2err(result);
195
14
  }
196
197
  /* If the parameters are not included in the certificate
198
   * then the issuer's parameters should be used. This is not
199
   * implemented, and is not used in practice (along with DSA).
200
   */
201
202
  /* Read p */
203
204
4.26k
  if (_gnutls_x509_read_int(spk, "p", &params->params[0]) < 0) {
205
5
    gnutls_assert();
206
5
    asn1_delete_structure(&spk);
207
5
    return GNUTLS_E_ASN1_GENERIC_ERROR;
208
5
  }
209
210
  /* Read q */
211
212
4.26k
  if (_gnutls_x509_read_int(spk, "q", &params->params[1]) < 0) {
213
1
    gnutls_assert();
214
1
    asn1_delete_structure(&spk);
215
1
    _gnutls_mpi_release(&params->params[0]);
216
1
    return GNUTLS_E_ASN1_GENERIC_ERROR;
217
1
  }
218
219
  /* Read g */
220
221
4.26k
  if (_gnutls_x509_read_int(spk, "g", &params->params[2]) < 0) {
222
3
    gnutls_assert();
223
3
    asn1_delete_structure(&spk);
224
3
    _gnutls_mpi_release(&params->params[0]);
225
3
    _gnutls_mpi_release(&params->params[1]);
226
3
    return GNUTLS_E_ASN1_GENERIC_ERROR;
227
3
  }
228
229
4.26k
  asn1_delete_structure(&spk);
230
231
4.26k
  params->params_nr = 3; /* public key is missing */
232
4.26k
  params->algo = GNUTLS_PK_DSA;
233
234
4.26k
  return 0;
235
4.26k
}
236
237
/* reads the curve from the certificate.
238
 * params[0-4]. It does NOT set params_nr.
239
 */
240
int _gnutls_x509_read_ecc_params(uint8_t *der, int dersize, unsigned int *curve)
241
23.0k
{
242
23.0k
  int ret;
243
23.0k
  asn1_node spk = NULL;
244
23.0k
  char oid[MAX_OID_SIZE];
245
23.0k
  int oid_size;
246
247
23.0k
  if ((ret = asn1_create_element(_gnutls_get_gnutls_asn(),
248
23.0k
               "GNUTLS.ECParameters", &spk)) !=
249
23.0k
      ASN1_SUCCESS) {
250
0
    gnutls_assert();
251
0
    return _gnutls_asn2err(ret);
252
0
  }
253
254
23.0k
  ret = asn1_der_decoding(&spk, der, dersize, NULL);
255
256
23.0k
  if (ret != ASN1_SUCCESS) {
257
125
    gnutls_assert();
258
125
    ret = _gnutls_asn2err(ret);
259
125
    goto cleanup;
260
125
  }
261
262
  /* read the curve */
263
22.8k
  oid_size = sizeof(oid);
264
22.8k
  ret = asn1_read_value(spk, "namedCurve", oid, &oid_size);
265
22.8k
  if (ret != ASN1_SUCCESS) {
266
0
    gnutls_assert();
267
0
    ret = _gnutls_asn2err(ret);
268
0
    goto cleanup;
269
0
  }
270
271
22.8k
  *curve = gnutls_oid_to_ecc_curve(oid);
272
22.8k
  if (*curve == GNUTLS_ECC_CURVE_INVALID) {
273
133
    _gnutls_debug_log("Curve %s is not supported\n", oid);
274
133
    gnutls_assert();
275
133
    ret = GNUTLS_E_ECC_UNSUPPORTED_CURVE;
276
133
    goto cleanup;
277
133
  }
278
279
22.7k
  ret = 0;
280
281
23.0k
cleanup:
282
283
23.0k
  asn1_delete_structure(&spk);
284
285
23.0k
  return ret;
286
22.7k
}
287
288
static int check_mgf1(asn1_node root, const char *name,
289
          gnutls_digest_algorithm_t digest, bool allow_null)
290
1.26k
{
291
1.26k
  char buffer[MAX_NAME_SIZE];
292
1.26k
  char oid[MAX_OID_SIZE];
293
1.26k
  gnutls_digest_algorithm_t digest2;
294
1.26k
  asn1_node ai = NULL;
295
1.26k
  int size;
296
1.26k
  int result;
297
1.26k
  gnutls_datum_t value = { NULL, 0 };
298
299
1.26k
  result = snprintf(buffer, sizeof(buffer), "%s.algorithm", name);
300
1.26k
  if (result < 0 || (size_t)result >= sizeof(buffer))
301
0
    return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
302
303
1.26k
  size = sizeof(oid);
304
1.26k
  result = asn1_read_value(root, buffer, oid, &size);
305
1.26k
  if (result != ASN1_SUCCESS) {
306
1.17k
    if (result == ASN1_ELEMENT_NOT_FOUND && allow_null)
307
1.17k
      return 0;
308
0
    gnutls_assert();
309
0
    return _gnutls_asn2err(result);
310
1.17k
  }
311
312
  /* Error out if algorithm other than mgf1 is specified */
313
93
  if (strcmp(oid, PKIX1_RSA_PSS_MGF1_OID) != 0) {
314
65
    gnutls_assert();
315
65
    _gnutls_debug_log("Unknown mask algorithm: %s\n", oid);
316
65
    return gnutls_assert_val(GNUTLS_E_UNKNOWN_ALGORITHM);
317
65
  }
318
319
  /* Check if maskGenAlgorithm.parameters does exist and
320
   * is identical to hashAlgorithm */
321
28
  result = snprintf(buffer, sizeof(buffer), "%s.parameters", name);
322
28
  if (result < 0 || (size_t)result >= sizeof(buffer))
323
0
    return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
324
325
28
  result = _gnutls_x509_read_value(root, buffer, &value);
326
28
  if (result < 0)
327
0
    return gnutls_assert_val(result);
328
329
28
  if ((result = asn1_create_element(_gnutls_get_pkix(),
330
28
            "PKIX1.AlgorithmIdentifier", &ai)) !=
331
28
      ASN1_SUCCESS) {
332
0
    gnutls_assert();
333
0
    result = _gnutls_asn2err(result);
334
0
    goto cleanup;
335
0
  }
336
337
28
  result = _asn1_strict_der_decode(&ai, value.data, value.size, NULL);
338
28
  if (result != ASN1_SUCCESS) {
339
2
    gnutls_assert();
340
2
    result = _gnutls_asn2err(result);
341
2
    goto cleanup;
342
2
  }
343
344
26
  size = sizeof(oid);
345
26
  result = asn1_read_value(ai, "algorithm", oid, &size);
346
26
  if (result == ASN1_SUCCESS)
347
26
    digest2 = gnutls_oid_to_digest(oid);
348
0
  else if (result == ASN1_ELEMENT_NOT_FOUND)
349
    /* The default hash algorithm for mgf1 is SHA-1 */
350
0
    digest2 = GNUTLS_DIG_SHA1;
351
0
  else {
352
0
    gnutls_assert();
353
0
    result = _gnutls_asn2err(result);
354
0
    goto cleanup;
355
0
  }
356
357
26
  if (digest != digest2) {
358
12
    gnutls_assert();
359
12
    result = GNUTLS_E_CONSTRAINT_ERROR;
360
12
    goto cleanup;
361
12
  }
362
363
14
  result = 0;
364
365
28
cleanup:
366
28
  _gnutls_free_datum(&value);
367
28
  asn1_delete_structure(&ai);
368
369
28
  return result;
370
14
}
371
372
/* Reads RSA-PSS parameters.
373
 */
374
int _gnutls_x509_read_rsa_pss_params(uint8_t *der, int dersize,
375
             gnutls_x509_spki_st *params)
376
1.68k
{
377
1.68k
  int result;
378
1.68k
  asn1_node spk = NULL;
379
1.68k
  gnutls_digest_algorithm_t digest;
380
1.68k
  char oid[MAX_OID_SIZE] = "";
381
1.68k
  int size;
382
1.68k
  unsigned int trailer;
383
384
1.68k
  if ((result = asn1_create_element(_gnutls_get_gnutls_asn(),
385
1.68k
            "GNUTLS.RSAPSSParameters", &spk)) !=
386
1.68k
      ASN1_SUCCESS) {
387
0
    gnutls_assert();
388
0
    result = _gnutls_asn2err(result);
389
0
    goto cleanup;
390
0
  }
391
392
1.68k
  result = _asn1_strict_der_decode(&spk, der, dersize, NULL);
393
394
1.68k
  if (result != ASN1_SUCCESS) {
395
360
    gnutls_assert();
396
360
    result = _gnutls_asn2err(result);
397
360
    goto cleanup;
398
360
  }
399
400
1.32k
  size = sizeof(oid);
401
1.32k
  result = asn1_read_value(spk, "hashAlgorithm.algorithm", oid, &size);
402
1.32k
  if (result == ASN1_SUCCESS)
403
165
    digest = gnutls_oid_to_digest(oid);
404
1.15k
  else if (result == ASN1_ELEMENT_NOT_FOUND)
405
    /* The default hash algorithm is SHA-1 */
406
1.15k
    digest = GNUTLS_DIG_SHA1;
407
0
  else {
408
0
    gnutls_assert();
409
0
    result = _gnutls_asn2err(result);
410
0
    goto cleanup;
411
0
  }
412
413
1.32k
  if (digest == GNUTLS_DIG_UNKNOWN) {
414
66
    gnutls_assert();
415
66
    _gnutls_debug_log("Unknown RSA-PSS hash: %s\n", oid);
416
66
    result = GNUTLS_E_UNKNOWN_HASH_ALGORITHM;
417
66
    goto cleanup;
418
66
  }
419
420
1.25k
  result = check_mgf1(spk, "maskGenAlgorithm", digest, true);
421
1.25k
  if (result < 0) {
422
79
    gnutls_assert();
423
79
    goto cleanup;
424
79
  }
425
426
1.17k
  memset(params, 0, sizeof(gnutls_x509_spki_st));
427
1.17k
  params->pk = GNUTLS_PK_RSA_PSS;
428
1.17k
  params->rsa_pss_dig = digest;
429
430
1.17k
  result = _gnutls_x509_read_uint(spk, "saltLength", &params->salt_size);
431
1.17k
  if (result == GNUTLS_E_ASN1_ELEMENT_NOT_FOUND ||
432
1.17k
      result == GNUTLS_E_ASN1_VALUE_NOT_FOUND)
433
1.15k
    params->salt_size = 20;
434
25
  else if (result < 0) {
435
8
    gnutls_assert();
436
8
    goto cleanup;
437
8
  }
438
439
1.17k
  result = _gnutls_x509_read_uint(spk, "trailerField", &trailer);
440
1.17k
  if (result == GNUTLS_E_ASN1_VALUE_NOT_FOUND ||
441
1.17k
      result == GNUTLS_E_ASN1_ELEMENT_NOT_FOUND)
442
1.15k
    trailer = 1;
443
17
  else if (result < 0) {
444
4
    gnutls_assert();
445
4
    goto cleanup;
446
4
  }
447
1.16k
  if (trailer != 1) {
448
5
    gnutls_assert();
449
5
    result = GNUTLS_E_CERTIFICATE_ERROR;
450
5
    goto cleanup;
451
5
  }
452
453
1.16k
  result = 0;
454
1.68k
cleanup:
455
1.68k
  asn1_delete_structure(&spk);
456
1.68k
  return result;
457
1.16k
}
458
459
static int read_rsa_oaep_label(asn1_node root, const char *name,
460
             gnutls_datum_t *label, bool allow_null)
461
12
{
462
12
  char buffer[MAX_NAME_SIZE];
463
12
  char oid[MAX_OID_SIZE] = "";
464
12
  int size;
465
12
  int result;
466
12
  gnutls_datum_t der = { NULL, 0 };
467
468
12
  result = snprintf(buffer, sizeof(buffer), "%s.algorithm", name);
469
12
  if (result < 0 || (size_t)result >= sizeof(buffer))
470
0
    return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
471
472
12
  size = sizeof(oid);
473
12
  result = asn1_read_value(root, buffer, oid, &size);
474
12
  if (result != ASN1_SUCCESS) {
475
12
    if (result != ASN1_ELEMENT_NOT_FOUND && allow_null)
476
0
      return 0;
477
478
12
    gnutls_assert();
479
12
    return _gnutls_asn2err(result);
480
12
  }
481
482
  /* Error out if algorithm other than mgf1 is specified */
483
0
  if (strcmp(oid, PKIX1_RSA_OAEP_P_SPECIFIED_OID) != 0) {
484
0
    gnutls_assert();
485
0
    _gnutls_debug_log("Unknown pSourceFunc algorithm: %s\n", oid);
486
0
    return GNUTLS_E_UNKNOWN_ALGORITHM;
487
0
  }
488
489
  /* Extract label from pSourceFunc.parameters */
490
0
  result = snprintf(buffer, sizeof(buffer), "%s.parameters", name);
491
0
  if (result < 0 || (size_t)result >= sizeof(buffer))
492
0
    return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
493
494
0
  result = _gnutls_x509_read_null_value(root, buffer, &der);
495
0
  if (result < 0) {
496
0
    gnutls_assert();
497
0
    goto cleanup;
498
0
  }
499
500
0
  result = _gnutls_x509_decode_string(ASN1_ETYPE_OCTET_STRING, der.data,
501
0
              der.size, label, 0);
502
0
  if (result < 0) {
503
0
    gnutls_assert();
504
0
    goto cleanup;
505
0
  }
506
507
0
  result = 0;
508
509
0
cleanup:
510
0
  _gnutls_free_datum(&der);
511
512
0
  return result;
513
0
}
514
515
/* Reads RSA-OAEP parameters.
516
 */
517
int _gnutls_x509_read_rsa_oaep_params(uint8_t *der, int dersize,
518
              gnutls_x509_spki_st *params)
519
50
{
520
50
  int result;
521
50
  asn1_node spk = NULL;
522
50
  gnutls_digest_algorithm_t digest;
523
50
  char oid[MAX_OID_SIZE] = "";
524
50
  int size;
525
50
  gnutls_datum_t label = { NULL, 0 };
526
527
50
  if ((result = asn1_create_element(_gnutls_get_gnutls_asn(),
528
50
            "GNUTLS.RSAOAEPParameters", &spk)) !=
529
50
      ASN1_SUCCESS) {
530
0
    gnutls_assert();
531
0
    result = _gnutls_asn2err(result);
532
0
    goto cleanup;
533
0
  }
534
535
50
  result = _asn1_strict_der_decode(&spk, der, dersize, NULL);
536
537
50
  if (result != ASN1_SUCCESS) {
538
38
    gnutls_assert();
539
38
    result = _gnutls_asn2err(result);
540
38
    goto cleanup;
541
38
  }
542
543
12
  size = sizeof(oid);
544
12
  result = asn1_read_value(spk, "hashAlgorithm.algorithm", oid, &size);
545
12
  if (result == ASN1_SUCCESS)
546
0
    digest = gnutls_oid_to_digest(oid);
547
12
  else if (result == ASN1_ELEMENT_NOT_FOUND)
548
    /* The default hash algorithm is SHA-1 */
549
12
    digest = GNUTLS_DIG_SHA1;
550
0
  else {
551
0
    gnutls_assert();
552
0
    result = _gnutls_asn2err(result);
553
0
    goto cleanup;
554
0
  }
555
556
12
  if (digest == GNUTLS_DIG_UNKNOWN) {
557
0
    gnutls_assert();
558
0
    _gnutls_debug_log("Unknown RSA-OAEP hash: %s\n", oid);
559
0
    result = GNUTLS_E_UNKNOWN_HASH_ALGORITHM;
560
0
    goto cleanup;
561
0
  }
562
563
12
  result = check_mgf1(spk, "maskGenAlgorithm", digest, true);
564
12
  if (result < 0) {
565
0
    gnutls_assert();
566
0
    goto cleanup;
567
0
  }
568
569
12
  result = read_rsa_oaep_label(spk, "pSourceFunc", &label, true);
570
12
  if (result < 0) {
571
12
    gnutls_assert();
572
12
    goto cleanup;
573
12
  }
574
575
0
  memset(params, 0, sizeof(gnutls_x509_spki_st));
576
0
  params->pk = GNUTLS_PK_RSA_OAEP;
577
0
  params->rsa_oaep_dig = digest;
578
0
  if (label.data) {
579
0
    params->rsa_oaep_label = label;
580
0
    label.data = NULL;
581
0
  }
582
583
0
  result = 0;
584
50
cleanup:
585
50
  _gnutls_free_datum(&label);
586
50
  asn1_delete_structure(&spk);
587
50
  return result;
588
0
}
589
590
/* reads the curve from the certificate.
591
 * It does NOT set params_nr.
592
 */
593
int _gnutls_x509_read_gost_params(uint8_t *der, int dersize,
594
          gnutls_pk_params_st *params,
595
          gnutls_pk_algorithm_t algo)
596
434
{
597
434
  int ret;
598
434
  asn1_node spk = NULL;
599
434
  char oid[MAX_OID_SIZE];
600
434
  int oid_size;
601
434
  gnutls_ecc_curve_t curve;
602
434
  gnutls_gost_paramset_t param;
603
604
434
  if ((ret = asn1_create_element(_gnutls_get_gnutls_asn(),
605
434
               algo == GNUTLS_PK_GOST_01 ?
606
398
                 "GNUTLS.GOSTParametersOld" :
607
434
                 "GNUTLS.GOSTParameters",
608
434
               &spk)) != ASN1_SUCCESS) {
609
0
    gnutls_assert();
610
0
    return _gnutls_asn2err(ret);
611
0
  }
612
613
434
  ret = _asn1_strict_der_decode(&spk, der, dersize, NULL);
614
615
434
  if (ret != ASN1_SUCCESS) {
616
23
    gnutls_assert();
617
23
    ret = _gnutls_asn2err(ret);
618
23
    goto cleanup;
619
23
  }
620
621
  /* read the curve */
622
411
  oid_size = sizeof(oid);
623
411
  ret = asn1_read_value(spk, "publicKeyParamSet", oid, &oid_size);
624
411
  if (ret != ASN1_SUCCESS) {
625
6
    gnutls_assert();
626
6
    ret = _gnutls_asn2err(ret);
627
6
    goto cleanup;
628
6
  }
629
630
405
  curve = gnutls_oid_to_ecc_curve(oid);
631
405
  if (curve == GNUTLS_ECC_CURVE_INVALID) {
632
1
    _gnutls_debug_log("Curve %s is not supported\n", oid);
633
1
    gnutls_assert();
634
1
    ret = GNUTLS_E_ECC_UNSUPPORTED_CURVE;
635
1
    goto cleanup;
636
1
  }
637
638
  /* Read the digest */
639
404
  oid_size = sizeof(oid);
640
404
  ret = asn1_read_value(spk, "digestParamSet", oid, &oid_size);
641
404
  if (ret != ASN1_SUCCESS && ret != ASN1_ELEMENT_NOT_FOUND) {
642
0
    gnutls_assert();
643
0
    ret = _gnutls_asn2err(ret);
644
0
    goto cleanup;
645
0
  }
646
  /* For now ignore the OID: we use pk OID instead */
647
648
404
  oid_size = sizeof(oid);
649
404
  ret = asn1_read_value(spk, "encryptionParamSet", oid, &oid_size);
650
404
  if (ret != ASN1_SUCCESS && ret != ASN1_ELEMENT_NOT_FOUND) {
651
0
    gnutls_assert();
652
0
    ret = _gnutls_asn2err(ret);
653
0
    goto cleanup;
654
0
  }
655
656
404
  if (ret != ASN1_ELEMENT_NOT_FOUND)
657
0
    param = gnutls_oid_to_gost_paramset(oid);
658
404
  else
659
404
    param = _gnutls_gost_paramset_default(algo);
660
661
404
  if (param == GNUTLS_GOST_PARAMSET_UNKNOWN) {
662
0
    gnutls_assert();
663
0
    ret = param;
664
0
    goto cleanup;
665
0
  }
666
667
404
  params->curve = curve;
668
404
  params->gost_params = param;
669
404
  ret = 0;
670
671
434
cleanup:
672
673
434
  asn1_delete_structure(&spk);
674
675
434
  return ret;
676
404
}
677
678
/* This function must be called after _gnutls_x509_read_params()
679
 */
680
int _gnutls_x509_read_pubkey(gnutls_pk_algorithm_t algo, uint8_t *der,
681
           int dersize, gnutls_pk_params_st *params)
682
102k
{
683
102k
  int ret;
684
685
102k
  switch (algo) {
686
51.9k
  case GNUTLS_PK_RSA:
687
60.2k
  case GNUTLS_PK_RSA_PSS:
688
60.2k
  case GNUTLS_PK_RSA_OAEP:
689
60.2k
    ret = _gnutls_x509_read_rsa_pubkey(der, dersize, params);
690
60.2k
    if (ret >= 0) {
691
59.1k
      params->algo = algo;
692
59.1k
      params->params_nr = RSA_PUBLIC_PARAMS;
693
59.1k
    }
694
60.2k
    break;
695
30
  case GNUTLS_PK_DSA:
696
30
    if (params->params_nr !=
697
30
        3) /* _gnutls_x509_read_pubkey_params must have been called */
698
0
      return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
699
700
30
    ret = _gnutls_x509_read_dsa_pubkey(der, dersize, params);
701
30
    if (ret >= 0) {
702
26
      params->algo = GNUTLS_PK_DSA;
703
26
      params->params_nr = DSA_PUBLIC_PARAMS;
704
26
    }
705
30
    break;
706
22.6k
  case GNUTLS_PK_ECDSA:
707
22.6k
    ret = _gnutls_x509_read_ecc_pubkey(der, dersize, params);
708
22.6k
    if (ret >= 0) {
709
22.6k
      params->algo = GNUTLS_PK_ECDSA;
710
22.6k
      params->params_nr = ECC_PUBLIC_PARAMS;
711
22.6k
    }
712
22.6k
    break;
713
9.82k
  case GNUTLS_PK_EDDSA_ED25519:
714
9.82k
    ret = _gnutls_x509_read_eddsa_pubkey(GNUTLS_ECC_CURVE_ED25519,
715
9.82k
                 der, dersize, params);
716
9.82k
    break;
717
9.81k
  case GNUTLS_PK_EDDSA_ED448:
718
9.81k
    ret = _gnutls_x509_read_eddsa_pubkey(GNUTLS_ECC_CURVE_ED448,
719
9.81k
                 der, dersize, params);
720
9.81k
    break;
721
26
  case GNUTLS_PK_ECDH_X25519:
722
26
    ret = _gnutls_x509_read_ecdh_pubkey(GNUTLS_ECC_CURVE_X25519,
723
26
                der, dersize, params);
724
26
    break;
725
26
  case GNUTLS_PK_ECDH_X448:
726
26
    ret = _gnutls_x509_read_ecdh_pubkey(GNUTLS_ECC_CURVE_X448, der,
727
26
                dersize, params);
728
26
    break;
729
12
  case GNUTLS_PK_GOST_01:
730
13
  case GNUTLS_PK_GOST_12_256:
731
13
  case GNUTLS_PK_GOST_12_512:
732
13
    ret = _gnutls_x509_read_gost_pubkey(der, dersize, params);
733
13
    if (ret >= 0) {
734
7
      params->algo = algo;
735
7
      params->params_nr = GOST_PUBLIC_PARAMS;
736
7
    }
737
13
    break;
738
0
  default:
739
0
    ret = gnutls_assert_val(GNUTLS_E_UNIMPLEMENTED_FEATURE);
740
0
    break;
741
102k
  }
742
102k
  return ret;
743
102k
}
744
745
/* This function must be called prior to _gnutls_x509_read_pubkey()
746
 */
747
int _gnutls_x509_read_pubkey_params(gnutls_pk_algorithm_t algo, uint8_t *der,
748
            int dersize, gnutls_pk_params_st *params)
749
31.6k
{
750
31.6k
  switch (algo) {
751
0
  case GNUTLS_PK_RSA:
752
0
  case GNUTLS_PK_EDDSA_ED25519:
753
0
  case GNUTLS_PK_EDDSA_ED448:
754
0
    return 0;
755
555
  case GNUTLS_PK_RSA_PSS:
756
555
    return _gnutls_x509_read_rsa_pss_params(der, dersize,
757
555
              &params->spki);
758
25
  case GNUTLS_PK_RSA_OAEP:
759
25
    return _gnutls_x509_read_rsa_oaep_params(der, dersize,
760
25
               &params->spki);
761
4.28k
  case GNUTLS_PK_DSA:
762
4.28k
    return _gnutls_x509_read_dsa_params(der, dersize, params);
763
22.7k
  case GNUTLS_PK_EC:
764
22.7k
    return _gnutls_x509_read_ecc_params(der, dersize,
765
22.7k
                &params->curve);
766
23
  case GNUTLS_PK_GOST_01:
767
30
  case GNUTLS_PK_GOST_12_256:
768
35
  case GNUTLS_PK_GOST_12_512:
769
35
    return _gnutls_x509_read_gost_params(der, dersize, params,
770
35
                 algo);
771
4.00k
  default:
772
4.00k
    return gnutls_assert_val(GNUTLS_E_UNIMPLEMENTED_FEATURE);
773
31.6k
  }
774
31.6k
}
775
776
/* This function must be called after _gnutls_x509_read_pubkey()
777
 */
778
int _gnutls_x509_check_pubkey_params(gnutls_pk_params_st *params)
779
101k
{
780
101k
  switch (params->algo) {
781
7.58k
  case GNUTLS_PK_RSA_PSS: {
782
7.58k
    unsigned bits;
783
7.58k
    const mac_entry_st *me;
784
7.58k
    size_t hash_size;
785
786
7.58k
    if (params->spki.pk ==
787
7.58k
        GNUTLS_PK_UNKNOWN) /* no params present */
788
7.20k
      return 0;
789
790
382
    bits = pubkey_to_bits(params);
791
792
382
    me = hash_to_entry(params->spki.rsa_pss_dig);
793
382
    if (unlikely(me == NULL))
794
0
      return gnutls_assert_val(
795
382
        GNUTLS_E_PK_INVALID_PUBKEY_PARAMS);
796
797
382
    hash_size = _gnutls_hash_get_algo_len(me);
798
382
    if (hash_size + params->spki.salt_size + 2 > (bits + 7) / 8)
799
30
      return gnutls_assert_val(
800
382
        GNUTLS_E_PK_INVALID_PUBKEY_PARAMS);
801
352
    return 0;
802
382
  }
803
0
  case GNUTLS_PK_RSA_OAEP: {
804
0
    unsigned bits;
805
0
    const mac_entry_st *me;
806
0
    size_t hash_size;
807
808
0
    if (params->spki.pk ==
809
0
        GNUTLS_PK_UNKNOWN) /* no params present */
810
0
      return 0;
811
812
0
    bits = pubkey_to_bits(params);
813
814
0
    me = hash_to_entry(params->spki.rsa_oaep_dig);
815
0
    if (unlikely(me == NULL))
816
0
      return gnutls_assert_val(
817
0
        GNUTLS_E_PK_INVALID_PUBKEY_PARAMS);
818
819
0
    hash_size = _gnutls_hash_get_algo_len(me);
820
0
    if (2 * hash_size + 2 > (bits + 7) / 8)
821
0
      return gnutls_assert_val(
822
0
        GNUTLS_E_PK_INVALID_PUBKEY_PARAMS);
823
0
    return 0;
824
0
  }
825
51.5k
  case GNUTLS_PK_RSA:
826
51.5k
  case GNUTLS_PK_DSA:
827
74.2k
  case GNUTLS_PK_ECDSA:
828
84.0k
  case GNUTLS_PK_EDDSA_ED25519:
829
93.8k
  case GNUTLS_PK_EDDSA_ED448:
830
93.8k
  case GNUTLS_PK_ECDH_X25519:
831
93.8k
  case GNUTLS_PK_ECDH_X448:
832
93.8k
  case GNUTLS_PK_GOST_01:
833
93.8k
  case GNUTLS_PK_GOST_12_256:
834
93.8k
  case GNUTLS_PK_GOST_12_512:
835
93.8k
    return 0;
836
0
  default:
837
0
    return gnutls_assert_val(GNUTLS_E_UNIMPLEMENTED_FEATURE);
838
101k
  }
839
101k
}
840
841
/* reads DSA's Y
842
 * from the certificate 
843
 * only sets params[3]
844
 */
845
int _gnutls_x509_read_dsa_pubkey(uint8_t *der, int dersize,
846
         gnutls_pk_params_st *params)
847
30
{
848
30
  return _gnutls_x509_read_der_int(der, dersize, &params->params[3]);
849
30
}