1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* X.509 certificate parser
3  *
4  * Copyright (C) 2012 Red Hat, Inc. All Rights Reserved.
5  * Written by David Howells (dhowells@redhat.com)
6  */
7 
8 #define pr_fmt(fmt) "X.509: "fmt
9 #include <linux/kernel.h>
10 #include <linux/export.h>
11 #include <linux/slab.h>
12 #include <linux/err.h>
13 #include <linux/oid_registry.h>
14 #include <crypto/public_key.h>
15 #include "x509_parser.h"
16 #include "x509.asn1.h"
17 #include "x509_akid.asn1.h"
18 
19 struct x509_parse_context {
20 	struct x509_certificate	*cert;		/* Certificate being constructed */
21 	unsigned long	data;			/* Start of data */
22 	const void	*cert_start;		/* Start of cert content */
23 	const void	*key;			/* Key data */
24 	size_t		key_size;		/* Size of key data */
25 	const void	*params;		/* Key parameters */
26 	size_t		params_size;		/* Size of key parameters */
27 	enum OID	key_algo;		/* Public key algorithm */
28 	enum OID	last_oid;		/* Last OID encountered */
29 	enum OID	algo_oid;		/* Algorithm OID */
30 	unsigned char	nr_mpi;			/* Number of MPIs stored */
31 	u8		o_size;			/* Size of organizationName (O) */
32 	u8		cn_size;		/* Size of commonName (CN) */
33 	u8		email_size;		/* Size of emailAddress */
34 	u16		o_offset;		/* Offset of organizationName (O) */
35 	u16		cn_offset;		/* Offset of commonName (CN) */
36 	u16		email_offset;		/* Offset of emailAddress */
37 	unsigned	raw_akid_size;
38 	const void	*raw_akid;		/* Raw authorityKeyId in ASN.1 */
39 	const void	*akid_raw_issuer;	/* Raw directoryName in authorityKeyId */
40 	unsigned	akid_raw_issuer_size;
41 };
42 
43 /*
44  * Free an X.509 certificate
45  */
46 void x509_free_certificate(struct x509_certificate *cert)
47 {
48 	if (cert) {
49 		public_key_free(cert->pub);
50 		public_key_signature_free(cert->sig);
51 		kfree(cert->issuer);
52 		kfree(cert->subject);
53 		kfree(cert->id);
54 		kfree(cert->skid);
55 		kfree(cert);
56 	}
57 }
58 EXPORT_SYMBOL_GPL(x509_free_certificate);
59 
60 /*
61  * Parse an X.509 certificate
62  */
63 struct x509_certificate *x509_cert_parse(const void *data, size_t datalen)
64 {
65 	struct x509_certificate *cert;
66 	struct x509_parse_context *ctx;
67 	struct asymmetric_key_id *kid;
68 	long ret;
69 
70 	ret = -ENOMEM;
71 	cert = kzalloc(sizeof(struct x509_certificate), GFP_KERNEL);
72 	if (!cert)
73 		goto error_no_cert;
74 	cert->pub = kzalloc(sizeof(struct public_key), GFP_KERNEL);
75 	if (!cert->pub)
76 		goto error_no_ctx;
77 	cert->sig = kzalloc(sizeof(struct public_key_signature), GFP_KERNEL);
78 	if (!cert->sig)
79 		goto error_no_ctx;
80 	ctx = kzalloc(sizeof(struct x509_parse_context), GFP_KERNEL);
81 	if (!ctx)
82 		goto error_no_ctx;
83 
84 	ctx->cert = cert;
85 	ctx->data = (unsigned long)data;
86 
87 	/* Attempt to decode the certificate */
88 	ret = asn1_ber_decoder(&x509_decoder, ctx, data, datalen);
89 	if (ret < 0)
90 		goto error_decode;
91 
92 	/* Decode the AuthorityKeyIdentifier */
93 	if (ctx->raw_akid) {
94 		pr_devel("AKID: %u %*phN\n",
95 			 ctx->raw_akid_size, ctx->raw_akid_size, ctx->raw_akid);
96 		ret = asn1_ber_decoder(&x509_akid_decoder, ctx,
97 				       ctx->raw_akid, ctx->raw_akid_size);
98 		if (ret < 0) {
99 			pr_warn("Couldn't decode AuthKeyIdentifier\n");
100 			goto error_decode;
101 		}
102 	}
103 
104 	ret = -ENOMEM;
105 	cert->pub->key = kmemdup(ctx->key, ctx->key_size, GFP_KERNEL);
106 	if (!cert->pub->key)
107 		goto error_decode;
108 
109 	cert->pub->keylen = ctx->key_size;
110 
111 	cert->pub->params = kmemdup(ctx->params, ctx->params_size, GFP_KERNEL);
112 	if (!cert->pub->params)
113 		goto error_decode;
114 
115 	cert->pub->paramlen = ctx->params_size;
116 	cert->pub->algo = ctx->key_algo;
117 
118 	/* Grab the signature bits */
119 	ret = x509_get_sig_params(cert);
120 	if (ret < 0)
121 		goto error_decode;
122 
123 	/* Generate cert issuer + serial number key ID */
124 	kid = asymmetric_key_generate_id(cert->raw_serial,
125 					 cert->raw_serial_size,
126 					 cert->raw_issuer,
127 					 cert->raw_issuer_size);
128 	if (IS_ERR(kid)) {
129 		ret = PTR_ERR(kid);
130 		goto error_decode;
131 	}
132 	cert->id = kid;
133 
134 	/* Detect self-signed certificates */
135 	ret = x509_check_for_self_signed(cert);
136 	if (ret < 0)
137 		goto error_decode;
138 
139 	kfree(ctx);
140 	return cert;
141 
142 error_decode:
143 	kfree(ctx);
144 error_no_ctx:
145 	x509_free_certificate(cert);
146 error_no_cert:
147 	return ERR_PTR(ret);
148 }
149 EXPORT_SYMBOL_GPL(x509_cert_parse);
150 
151 /*
152  * Note an OID when we find one for later processing when we know how
153  * to interpret it.
154  */
155 int x509_note_OID(void *context, size_t hdrlen,
156 	     unsigned char tag,
157 	     const void *value, size_t vlen)
158 {
159 	struct x509_parse_context *ctx = context;
160 
161 	ctx->last_oid = look_up_OID(value, vlen);
162 	if (ctx->last_oid == OID__NR) {
163 		char buffer[50];
164 		sprint_oid(value, vlen, buffer, sizeof(buffer));
165 		pr_debug("Unknown OID: [%lu] %s\n",
166 			 (unsigned long)value - ctx->data, buffer);
167 	}
168 	return 0;
169 }
170 
171 /*
172  * Save the position of the TBS data so that we can check the signature over it
173  * later.
174  */
175 int x509_note_tbs_certificate(void *context, size_t hdrlen,
176 			      unsigned char tag,
177 			      const void *value, size_t vlen)
178 {
179 	struct x509_parse_context *ctx = context;
180 
181 	pr_debug("x509_note_tbs_certificate(,%zu,%02x,%ld,%zu)!\n",
182 		 hdrlen, tag, (unsigned long)value - ctx->data, vlen);
183 
184 	ctx->cert->tbs = value - hdrlen;
185 	ctx->cert->tbs_size = vlen + hdrlen;
186 	return 0;
187 }
188 
189 /*
190  * Record the public key algorithm
191  */
192 int x509_note_pkey_algo(void *context, size_t hdrlen,
193 			unsigned char tag,
194 			const void *value, size_t vlen)
195 {
196 	struct x509_parse_context *ctx = context;
197 
198 	pr_debug("PubKey Algo: %u\n", ctx->last_oid);
199 
200 	switch (ctx->last_oid) {
201 	case OID_md2WithRSAEncryption:
202 	case OID_md3WithRSAEncryption:
203 	default:
204 		return -ENOPKG; /* Unsupported combination */
205 
206 	case OID_md4WithRSAEncryption:
207 		ctx->cert->sig->hash_algo = "md4";
208 		goto rsa_pkcs1;
209 
210 	case OID_sha1WithRSAEncryption:
211 		ctx->cert->sig->hash_algo = "sha1";
212 		goto rsa_pkcs1;
213 
214 	case OID_sha256WithRSAEncryption:
215 		ctx->cert->sig->hash_algo = "sha256";
216 		goto rsa_pkcs1;
217 
218 	case OID_sha384WithRSAEncryption:
219 		ctx->cert->sig->hash_algo = "sha384";
220 		goto rsa_pkcs1;
221 
222 	case OID_sha512WithRSAEncryption:
223 		ctx->cert->sig->hash_algo = "sha512";
224 		goto rsa_pkcs1;
225 
226 	case OID_sha224WithRSAEncryption:
227 		ctx->cert->sig->hash_algo = "sha224";
228 		goto rsa_pkcs1;
229 
230 	case OID_id_ecdsa_with_sha1:
231 		ctx->cert->sig->hash_algo = "sha1";
232 		goto ecdsa;
233 
234 	case OID_id_ecdsa_with_sha224:
235 		ctx->cert->sig->hash_algo = "sha224";
236 		goto ecdsa;
237 
238 	case OID_id_ecdsa_with_sha256:
239 		ctx->cert->sig->hash_algo = "sha256";
240 		goto ecdsa;
241 
242 	case OID_id_ecdsa_with_sha384:
243 		ctx->cert->sig->hash_algo = "sha384";
244 		goto ecdsa;
245 
246 	case OID_id_ecdsa_with_sha512:
247 		ctx->cert->sig->hash_algo = "sha512";
248 		goto ecdsa;
249 
250 	case OID_gost2012Signature256:
251 		ctx->cert->sig->hash_algo = "streebog256";
252 		goto ecrdsa;
253 
254 	case OID_gost2012Signature512:
255 		ctx->cert->sig->hash_algo = "streebog512";
256 		goto ecrdsa;
257 
258 	case OID_SM2_with_SM3:
259 		ctx->cert->sig->hash_algo = "sm3";
260 		goto sm2;
261 	}
262 
263 rsa_pkcs1:
264 	ctx->cert->sig->pkey_algo = "rsa";
265 	ctx->cert->sig->encoding = "pkcs1";
266 	ctx->algo_oid = ctx->last_oid;
267 	return 0;
268 ecrdsa:
269 	ctx->cert->sig->pkey_algo = "ecrdsa";
270 	ctx->cert->sig->encoding = "raw";
271 	ctx->algo_oid = ctx->last_oid;
272 	return 0;
273 sm2:
274 	ctx->cert->sig->pkey_algo = "sm2";
275 	ctx->cert->sig->encoding = "raw";
276 	ctx->algo_oid = ctx->last_oid;
277 	return 0;
278 ecdsa:
279 	ctx->cert->sig->pkey_algo = "ecdsa";
280 	ctx->cert->sig->encoding = "x962";
281 	ctx->algo_oid = ctx->last_oid;
282 	return 0;
283 }
284 
285 /*
286  * Note the whereabouts and type of the signature.
287  */
288 int x509_note_signature(void *context, size_t hdrlen,
289 			unsigned char tag,
290 			const void *value, size_t vlen)
291 {
292 	struct x509_parse_context *ctx = context;
293 
294 	pr_debug("Signature type: %u size %zu\n", ctx->last_oid, vlen);
295 
296 	if (ctx->last_oid != ctx->algo_oid) {
297 		pr_warn("Got cert with pkey (%u) and sig (%u) algorithm OIDs\n",
298 			ctx->algo_oid, ctx->last_oid);
299 		return -EINVAL;
300 	}
301 
302 	if (strcmp(ctx->cert->sig->pkey_algo, "rsa") == 0 ||
303 	    strcmp(ctx->cert->sig->pkey_algo, "ecrdsa") == 0 ||
304 	    strcmp(ctx->cert->sig->pkey_algo, "sm2") == 0 ||
305 	    strcmp(ctx->cert->sig->pkey_algo, "ecdsa") == 0) {
306 		/* Discard the BIT STRING metadata */
307 		if (vlen < 1 || *(const u8 *)value != 0)
308 			return -EBADMSG;
309 
310 		value++;
311 		vlen--;
312 	}
313 
314 	ctx->cert->raw_sig = value;
315 	ctx->cert->raw_sig_size = vlen;
316 	return 0;
317 }
318 
319 /*
320  * Note the certificate serial number
321  */
322 int x509_note_serial(void *context, size_t hdrlen,
323 		     unsigned char tag,
324 		     const void *value, size_t vlen)
325 {
326 	struct x509_parse_context *ctx = context;
327 	ctx->cert->raw_serial = value;
328 	ctx->cert->raw_serial_size = vlen;
329 	return 0;
330 }
331 
332 /*
333  * Note some of the name segments from which we'll fabricate a name.
334  */
335 int x509_extract_name_segment(void *context, size_t hdrlen,
336 			      unsigned char tag,
337 			      const void *value, size_t vlen)
338 {
339 	struct x509_parse_context *ctx = context;
340 
341 	switch (ctx->last_oid) {
342 	case OID_commonName:
343 		ctx->cn_size = vlen;
344 		ctx->cn_offset = (unsigned long)value - ctx->data;
345 		break;
346 	case OID_organizationName:
347 		ctx->o_size = vlen;
348 		ctx->o_offset = (unsigned long)value - ctx->data;
349 		break;
350 	case OID_email_address:
351 		ctx->email_size = vlen;
352 		ctx->email_offset = (unsigned long)value - ctx->data;
353 		break;
354 	default:
355 		break;
356 	}
357 
358 	return 0;
359 }
360 
361 /*
362  * Fabricate and save the issuer and subject names
363  */
364 static int x509_fabricate_name(struct x509_parse_context *ctx, size_t hdrlen,
365 			       unsigned char tag,
366 			       char **_name, size_t vlen)
367 {
368 	const void *name, *data = (const void *)ctx->data;
369 	size_t namesize;
370 	char *buffer;
371 
372 	if (*_name)
373 		return -EINVAL;
374 
375 	/* Empty name string if no material */
376 	if (!ctx->cn_size && !ctx->o_size && !ctx->email_size) {
377 		buffer = kmalloc(1, GFP_KERNEL);
378 		if (!buffer)
379 			return -ENOMEM;
380 		buffer[0] = 0;
381 		goto done;
382 	}
383 
384 	if (ctx->cn_size && ctx->o_size) {
385 		/* Consider combining O and CN, but use only the CN if it is
386 		 * prefixed by the O, or a significant portion thereof.
387 		 */
388 		namesize = ctx->cn_size;
389 		name = data + ctx->cn_offset;
390 		if (ctx->cn_size >= ctx->o_size &&
391 		    memcmp(data + ctx->cn_offset, data + ctx->o_offset,
392 			   ctx->o_size) == 0)
393 			goto single_component;
394 		if (ctx->cn_size >= 7 &&
395 		    ctx->o_size >= 7 &&
396 		    memcmp(data + ctx->cn_offset, data + ctx->o_offset, 7) == 0)
397 			goto single_component;
398 
399 		buffer = kmalloc(ctx->o_size + 2 + ctx->cn_size + 1,
400 				 GFP_KERNEL);
401 		if (!buffer)
402 			return -ENOMEM;
403 
404 		memcpy(buffer,
405 		       data + ctx->o_offset, ctx->o_size);
406 		buffer[ctx->o_size + 0] = ':';
407 		buffer[ctx->o_size + 1] = ' ';
408 		memcpy(buffer + ctx->o_size + 2,
409 		       data + ctx->cn_offset, ctx->cn_size);
410 		buffer[ctx->o_size + 2 + ctx->cn_size] = 0;
411 		goto done;
412 
413 	} else if (ctx->cn_size) {
414 		namesize = ctx->cn_size;
415 		name = data + ctx->cn_offset;
416 	} else if (ctx->o_size) {
417 		namesize = ctx->o_size;
418 		name = data + ctx->o_offset;
419 	} else {
420 		namesize = ctx->email_size;
421 		name = data + ctx->email_offset;
422 	}
423 
424 single_component:
425 	buffer = kmalloc(namesize + 1, GFP_KERNEL);
426 	if (!buffer)
427 		return -ENOMEM;
428 	memcpy(buffer, name, namesize);
429 	buffer[namesize] = 0;
430 
431 done:
432 	*_name = buffer;
433 	ctx->cn_size = 0;
434 	ctx->o_size = 0;
435 	ctx->email_size = 0;
436 	return 0;
437 }
438 
439 int x509_note_issuer(void *context, size_t hdrlen,
440 		     unsigned char tag,
441 		     const void *value, size_t vlen)
442 {
443 	struct x509_parse_context *ctx = context;
444 	ctx->cert->raw_issuer = value;
445 	ctx->cert->raw_issuer_size = vlen;
446 	return x509_fabricate_name(ctx, hdrlen, tag, &ctx->cert->issuer, vlen);
447 }
448 
449 int x509_note_subject(void *context, size_t hdrlen,
450 		      unsigned char tag,
451 		      const void *value, size_t vlen)
452 {
453 	struct x509_parse_context *ctx = context;
454 	ctx->cert->raw_subject = value;
455 	ctx->cert->raw_subject_size = vlen;
456 	return x509_fabricate_name(ctx, hdrlen, tag, &ctx->cert->subject, vlen);
457 }
458 
459 /*
460  * Extract the parameters for the public key
461  */
462 int x509_note_params(void *context, size_t hdrlen,
463 		     unsigned char tag,
464 		     const void *value, size_t vlen)
465 {
466 	struct x509_parse_context *ctx = context;
467 
468 	/*
469 	 * AlgorithmIdentifier is used three times in the x509, we should skip
470 	 * first and ignore third, using second one which is after subject and
471 	 * before subjectPublicKey.
472 	 */
473 	if (!ctx->cert->raw_subject || ctx->key)
474 		return 0;
475 	ctx->params = value - hdrlen;
476 	ctx->params_size = vlen + hdrlen;
477 	return 0;
478 }
479 
480 /*
481  * Extract the data for the public key algorithm
482  */
483 int x509_extract_key_data(void *context, size_t hdrlen,
484 			  unsigned char tag,
485 			  const void *value, size_t vlen)
486 {
487 	struct x509_parse_context *ctx = context;
488 	enum OID oid;
489 
490 	ctx->key_algo = ctx->last_oid;
491 	switch (ctx->last_oid) {
492 	case OID_rsaEncryption:
493 		ctx->cert->pub->pkey_algo = "rsa";
494 		break;
495 	case OID_gost2012PKey256:
496 	case OID_gost2012PKey512:
497 		ctx->cert->pub->pkey_algo = "ecrdsa";
498 		break;
499 	case OID_id_ecPublicKey:
500 		if (parse_OID(ctx->params, ctx->params_size, &oid) != 0)
501 			return -EBADMSG;
502 
503 		switch (oid) {
504 		case OID_sm2:
505 			ctx->cert->pub->pkey_algo = "sm2";
506 			break;
507 		case OID_id_prime192v1:
508 			ctx->cert->pub->pkey_algo = "ecdsa-nist-p192";
509 			break;
510 		case OID_id_prime256v1:
511 			ctx->cert->pub->pkey_algo = "ecdsa-nist-p256";
512 			break;
513 		case OID_id_ansip384r1:
514 			ctx->cert->pub->pkey_algo = "ecdsa-nist-p384";
515 			break;
516 		default:
517 			return -ENOPKG;
518 		}
519 		break;
520 	default:
521 		return -ENOPKG;
522 	}
523 
524 	/* Discard the BIT STRING metadata */
525 	if (vlen < 1 || *(const u8 *)value != 0)
526 		return -EBADMSG;
527 	ctx->key = value + 1;
528 	ctx->key_size = vlen - 1;
529 	return 0;
530 }
531 
532 /* The keyIdentifier in AuthorityKeyIdentifier SEQUENCE is tag(CONT,PRIM,0) */
533 #define SEQ_TAG_KEYID (ASN1_CONT << 6)
534 
535 /*
536  * Process certificate extensions that are used to qualify the certificate.
537  */
538 int x509_process_extension(void *context, size_t hdrlen,
539 			   unsigned char tag,
540 			   const void *value, size_t vlen)
541 {
542 	struct x509_parse_context *ctx = context;
543 	struct asymmetric_key_id *kid;
544 	const unsigned char *v = value;
545 
546 	pr_debug("Extension: %u\n", ctx->last_oid);
547 
548 	if (ctx->last_oid == OID_subjectKeyIdentifier) {
549 		/* Get hold of the key fingerprint */
550 		if (ctx->cert->skid || vlen < 3)
551 			return -EBADMSG;
552 		if (v[0] != ASN1_OTS || v[1] != vlen - 2)
553 			return -EBADMSG;
554 		v += 2;
555 		vlen -= 2;
556 
557 		ctx->cert->raw_skid_size = vlen;
558 		ctx->cert->raw_skid = v;
559 		kid = asymmetric_key_generate_id(v, vlen, "", 0);
560 		if (IS_ERR(kid))
561 			return PTR_ERR(kid);
562 		ctx->cert->skid = kid;
563 		pr_debug("subjkeyid %*phN\n", kid->len, kid->data);
564 		return 0;
565 	}
566 
567 	if (ctx->last_oid == OID_authorityKeyIdentifier) {
568 		/* Get hold of the CA key fingerprint */
569 		ctx->raw_akid = v;
570 		ctx->raw_akid_size = vlen;
571 		return 0;
572 	}
573 
574 	return 0;
575 }
576 
577 /**
578  * x509_decode_time - Decode an X.509 time ASN.1 object
579  * @_t: The time to fill in
580  * @hdrlen: The length of the object header
581  * @tag: The object tag
582  * @value: The object value
583  * @vlen: The size of the object value
584  *
585  * Decode an ASN.1 universal time or generalised time field into a struct the
586  * kernel can handle and check it for validity.  The time is decoded thus:
587  *
588  *	[RFC5280 §4.1.2.5]
589  *	CAs conforming to this profile MUST always encode certificate validity
590  *	dates through the year 2049 as UTCTime; certificate validity dates in
591  *	2050 or later MUST be encoded as GeneralizedTime.  Conforming
592  *	applications MUST be able to process validity dates that are encoded in
593  *	either UTCTime or GeneralizedTime.
594  */
595 int x509_decode_time(time64_t *_t,  size_t hdrlen,
596 		     unsigned char tag,
597 		     const unsigned char *value, size_t vlen)
598 {
599 	static const unsigned char month_lengths[] = { 31, 28, 31, 30, 31, 30,
600 						       31, 31, 30, 31, 30, 31 };
601 	const unsigned char *p = value;
602 	unsigned year, mon, day, hour, min, sec, mon_len;
603 
604 #define dec2bin(X) ({ unsigned char x = (X) - '0'; if (x > 9) goto invalid_time; x; })
605 #define DD2bin(P) ({ unsigned x = dec2bin(P[0]) * 10 + dec2bin(P[1]); P += 2; x; })
606 
607 	if (tag == ASN1_UNITIM) {
608 		/* UTCTime: YYMMDDHHMMSSZ */
609 		if (vlen != 13)
610 			goto unsupported_time;
611 		year = DD2bin(p);
612 		if (year >= 50)
613 			year += 1900;
614 		else
615 			year += 2000;
616 	} else if (tag == ASN1_GENTIM) {
617 		/* GenTime: YYYYMMDDHHMMSSZ */
618 		if (vlen != 15)
619 			goto unsupported_time;
620 		year = DD2bin(p) * 100 + DD2bin(p);
621 		if (year >= 1950 && year <= 2049)
622 			goto invalid_time;
623 	} else {
624 		goto unsupported_time;
625 	}
626 
627 	mon  = DD2bin(p);
628 	day = DD2bin(p);
629 	hour = DD2bin(p);
630 	min  = DD2bin(p);
631 	sec  = DD2bin(p);
632 
633 	if (*p != 'Z')
634 		goto unsupported_time;
635 
636 	if (year < 1970 ||
637 	    mon < 1 || mon > 12)
638 		goto invalid_time;
639 
640 	mon_len = month_lengths[mon - 1];
641 	if (mon == 2) {
642 		if (year % 4 == 0) {
643 			mon_len = 29;
644 			if (year % 100 == 0) {
645 				mon_len = 28;
646 				if (year % 400 == 0)
647 					mon_len = 29;
648 			}
649 		}
650 	}
651 
652 	if (day < 1 || day > mon_len ||
653 	    hour > 24 || /* ISO 8601 permits 24:00:00 as midnight tomorrow */
654 	    min > 59 ||
655 	    sec > 60) /* ISO 8601 permits leap seconds [X.680 46.3] */
656 		goto invalid_time;
657 
658 	*_t = mktime64(year, mon, day, hour, min, sec);
659 	return 0;
660 
661 unsupported_time:
662 	pr_debug("Got unsupported time [tag %02x]: '%*phN'\n",
663 		 tag, (int)vlen, value);
664 	return -EBADMSG;
665 invalid_time:
666 	pr_debug("Got invalid time [tag %02x]: '%*phN'\n",
667 		 tag, (int)vlen, value);
668 	return -EBADMSG;
669 }
670 EXPORT_SYMBOL_GPL(x509_decode_time);
671 
672 int x509_note_not_before(void *context, size_t hdrlen,
673 			 unsigned char tag,
674 			 const void *value, size_t vlen)
675 {
676 	struct x509_parse_context *ctx = context;
677 	return x509_decode_time(&ctx->cert->valid_from, hdrlen, tag, value, vlen);
678 }
679 
680 int x509_note_not_after(void *context, size_t hdrlen,
681 			unsigned char tag,
682 			const void *value, size_t vlen)
683 {
684 	struct x509_parse_context *ctx = context;
685 	return x509_decode_time(&ctx->cert->valid_to, hdrlen, tag, value, vlen);
686 }
687 
688 /*
689  * Note a key identifier-based AuthorityKeyIdentifier
690  */
691 int x509_akid_note_kid(void *context, size_t hdrlen,
692 		       unsigned char tag,
693 		       const void *value, size_t vlen)
694 {
695 	struct x509_parse_context *ctx = context;
696 	struct asymmetric_key_id *kid;
697 
698 	pr_debug("AKID: keyid: %*phN\n", (int)vlen, value);
699 
700 	if (ctx->cert->sig->auth_ids[1])
701 		return 0;
702 
703 	kid = asymmetric_key_generate_id(value, vlen, "", 0);
704 	if (IS_ERR(kid))
705 		return PTR_ERR(kid);
706 	pr_debug("authkeyid %*phN\n", kid->len, kid->data);
707 	ctx->cert->sig->auth_ids[1] = kid;
708 	return 0;
709 }
710 
711 /*
712  * Note a directoryName in an AuthorityKeyIdentifier
713  */
714 int x509_akid_note_name(void *context, size_t hdrlen,
715 			unsigned char tag,
716 			const void *value, size_t vlen)
717 {
718 	struct x509_parse_context *ctx = context;
719 
720 	pr_debug("AKID: name: %*phN\n", (int)vlen, value);
721 
722 	ctx->akid_raw_issuer = value;
723 	ctx->akid_raw_issuer_size = vlen;
724 	return 0;
725 }
726 
727 /*
728  * Note a serial number in an AuthorityKeyIdentifier
729  */
730 int x509_akid_note_serial(void *context, size_t hdrlen,
731 			  unsigned char tag,
732 			  const void *value, size_t vlen)
733 {
734 	struct x509_parse_context *ctx = context;
735 	struct asymmetric_key_id *kid;
736 
737 	pr_debug("AKID: serial: %*phN\n", (int)vlen, value);
738 
739 	if (!ctx->akid_raw_issuer || ctx->cert->sig->auth_ids[0])
740 		return 0;
741 
742 	kid = asymmetric_key_generate_id(value,
743 					 vlen,
744 					 ctx->akid_raw_issuer,
745 					 ctx->akid_raw_issuer_size);
746 	if (IS_ERR(kid))
747 		return PTR_ERR(kid);
748 
749 	pr_debug("authkeyid %*phN\n", kid->len, kid->data);
750 	ctx->cert->sig->auth_ids[0] = kid;
751 	return 0;
752 }
753