Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec
[linux-2.6-microblaze.git] / crypto / asymmetric_keys / x509_cert_parser.c
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_gost2012Signature256:
231                 ctx->cert->sig->hash_algo = "streebog256";
232                 goto ecrdsa;
233
234         case OID_gost2012Signature512:
235                 ctx->cert->sig->hash_algo = "streebog512";
236                 goto ecrdsa;
237
238         case OID_SM2_with_SM3:
239                 ctx->cert->sig->hash_algo = "sm3";
240                 goto sm2;
241         }
242
243 rsa_pkcs1:
244         ctx->cert->sig->pkey_algo = "rsa";
245         ctx->cert->sig->encoding = "pkcs1";
246         ctx->algo_oid = ctx->last_oid;
247         return 0;
248 ecrdsa:
249         ctx->cert->sig->pkey_algo = "ecrdsa";
250         ctx->cert->sig->encoding = "raw";
251         ctx->algo_oid = ctx->last_oid;
252         return 0;
253 sm2:
254         ctx->cert->sig->pkey_algo = "sm2";
255         ctx->cert->sig->encoding = "raw";
256         ctx->algo_oid = ctx->last_oid;
257         return 0;
258 }
259
260 /*
261  * Note the whereabouts and type of the signature.
262  */
263 int x509_note_signature(void *context, size_t hdrlen,
264                         unsigned char tag,
265                         const void *value, size_t vlen)
266 {
267         struct x509_parse_context *ctx = context;
268
269         pr_debug("Signature type: %u size %zu\n", ctx->last_oid, vlen);
270
271         if (ctx->last_oid != ctx->algo_oid) {
272                 pr_warn("Got cert with pkey (%u) and sig (%u) algorithm OIDs\n",
273                         ctx->algo_oid, ctx->last_oid);
274                 return -EINVAL;
275         }
276
277         if (strcmp(ctx->cert->sig->pkey_algo, "rsa") == 0 ||
278             strcmp(ctx->cert->sig->pkey_algo, "ecrdsa") == 0 ||
279             strcmp(ctx->cert->sig->pkey_algo, "sm2") == 0) {
280                 /* Discard the BIT STRING metadata */
281                 if (vlen < 1 || *(const u8 *)value != 0)
282                         return -EBADMSG;
283
284                 value++;
285                 vlen--;
286         }
287
288         ctx->cert->raw_sig = value;
289         ctx->cert->raw_sig_size = vlen;
290         return 0;
291 }
292
293 /*
294  * Note the certificate serial number
295  */
296 int x509_note_serial(void *context, size_t hdrlen,
297                      unsigned char tag,
298                      const void *value, size_t vlen)
299 {
300         struct x509_parse_context *ctx = context;
301         ctx->cert->raw_serial = value;
302         ctx->cert->raw_serial_size = vlen;
303         return 0;
304 }
305
306 /*
307  * Note some of the name segments from which we'll fabricate a name.
308  */
309 int x509_extract_name_segment(void *context, size_t hdrlen,
310                               unsigned char tag,
311                               const void *value, size_t vlen)
312 {
313         struct x509_parse_context *ctx = context;
314
315         switch (ctx->last_oid) {
316         case OID_commonName:
317                 ctx->cn_size = vlen;
318                 ctx->cn_offset = (unsigned long)value - ctx->data;
319                 break;
320         case OID_organizationName:
321                 ctx->o_size = vlen;
322                 ctx->o_offset = (unsigned long)value - ctx->data;
323                 break;
324         case OID_email_address:
325                 ctx->email_size = vlen;
326                 ctx->email_offset = (unsigned long)value - ctx->data;
327                 break;
328         default:
329                 break;
330         }
331
332         return 0;
333 }
334
335 /*
336  * Fabricate and save the issuer and subject names
337  */
338 static int x509_fabricate_name(struct x509_parse_context *ctx, size_t hdrlen,
339                                unsigned char tag,
340                                char **_name, size_t vlen)
341 {
342         const void *name, *data = (const void *)ctx->data;
343         size_t namesize;
344         char *buffer;
345
346         if (*_name)
347                 return -EINVAL;
348
349         /* Empty name string if no material */
350         if (!ctx->cn_size && !ctx->o_size && !ctx->email_size) {
351                 buffer = kmalloc(1, GFP_KERNEL);
352                 if (!buffer)
353                         return -ENOMEM;
354                 buffer[0] = 0;
355                 goto done;
356         }
357
358         if (ctx->cn_size && ctx->o_size) {
359                 /* Consider combining O and CN, but use only the CN if it is
360                  * prefixed by the O, or a significant portion thereof.
361                  */
362                 namesize = ctx->cn_size;
363                 name = data + ctx->cn_offset;
364                 if (ctx->cn_size >= ctx->o_size &&
365                     memcmp(data + ctx->cn_offset, data + ctx->o_offset,
366                            ctx->o_size) == 0)
367                         goto single_component;
368                 if (ctx->cn_size >= 7 &&
369                     ctx->o_size >= 7 &&
370                     memcmp(data + ctx->cn_offset, data + ctx->o_offset, 7) == 0)
371                         goto single_component;
372
373                 buffer = kmalloc(ctx->o_size + 2 + ctx->cn_size + 1,
374                                  GFP_KERNEL);
375                 if (!buffer)
376                         return -ENOMEM;
377
378                 memcpy(buffer,
379                        data + ctx->o_offset, ctx->o_size);
380                 buffer[ctx->o_size + 0] = ':';
381                 buffer[ctx->o_size + 1] = ' ';
382                 memcpy(buffer + ctx->o_size + 2,
383                        data + ctx->cn_offset, ctx->cn_size);
384                 buffer[ctx->o_size + 2 + ctx->cn_size] = 0;
385                 goto done;
386
387         } else if (ctx->cn_size) {
388                 namesize = ctx->cn_size;
389                 name = data + ctx->cn_offset;
390         } else if (ctx->o_size) {
391                 namesize = ctx->o_size;
392                 name = data + ctx->o_offset;
393         } else {
394                 namesize = ctx->email_size;
395                 name = data + ctx->email_offset;
396         }
397
398 single_component:
399         buffer = kmalloc(namesize + 1, GFP_KERNEL);
400         if (!buffer)
401                 return -ENOMEM;
402         memcpy(buffer, name, namesize);
403         buffer[namesize] = 0;
404
405 done:
406         *_name = buffer;
407         ctx->cn_size = 0;
408         ctx->o_size = 0;
409         ctx->email_size = 0;
410         return 0;
411 }
412
413 int x509_note_issuer(void *context, size_t hdrlen,
414                      unsigned char tag,
415                      const void *value, size_t vlen)
416 {
417         struct x509_parse_context *ctx = context;
418         ctx->cert->raw_issuer = value;
419         ctx->cert->raw_issuer_size = vlen;
420         return x509_fabricate_name(ctx, hdrlen, tag, &ctx->cert->issuer, vlen);
421 }
422
423 int x509_note_subject(void *context, size_t hdrlen,
424                       unsigned char tag,
425                       const void *value, size_t vlen)
426 {
427         struct x509_parse_context *ctx = context;
428         ctx->cert->raw_subject = value;
429         ctx->cert->raw_subject_size = vlen;
430         return x509_fabricate_name(ctx, hdrlen, tag, &ctx->cert->subject, vlen);
431 }
432
433 /*
434  * Extract the parameters for the public key
435  */
436 int x509_note_params(void *context, size_t hdrlen,
437                      unsigned char tag,
438                      const void *value, size_t vlen)
439 {
440         struct x509_parse_context *ctx = context;
441
442         /*
443          * AlgorithmIdentifier is used three times in the x509, we should skip
444          * first and ignore third, using second one which is after subject and
445          * before subjectPublicKey.
446          */
447         if (!ctx->cert->raw_subject || ctx->key)
448                 return 0;
449         ctx->params = value - hdrlen;
450         ctx->params_size = vlen + hdrlen;
451         return 0;
452 }
453
454 /*
455  * Extract the data for the public key algorithm
456  */
457 int x509_extract_key_data(void *context, size_t hdrlen,
458                           unsigned char tag,
459                           const void *value, size_t vlen)
460 {
461         struct x509_parse_context *ctx = context;
462
463         ctx->key_algo = ctx->last_oid;
464         switch (ctx->last_oid) {
465         case OID_rsaEncryption:
466                 ctx->cert->pub->pkey_algo = "rsa";
467                 break;
468         case OID_gost2012PKey256:
469         case OID_gost2012PKey512:
470                 ctx->cert->pub->pkey_algo = "ecrdsa";
471                 break;
472         case OID_id_ecPublicKey:
473                 ctx->cert->pub->pkey_algo = "sm2";
474                 break;
475         default:
476                 return -ENOPKG;
477         }
478
479         /* Discard the BIT STRING metadata */
480         if (vlen < 1 || *(const u8 *)value != 0)
481                 return -EBADMSG;
482         ctx->key = value + 1;
483         ctx->key_size = vlen - 1;
484         return 0;
485 }
486
487 /* The keyIdentifier in AuthorityKeyIdentifier SEQUENCE is tag(CONT,PRIM,0) */
488 #define SEQ_TAG_KEYID (ASN1_CONT << 6)
489
490 /*
491  * Process certificate extensions that are used to qualify the certificate.
492  */
493 int x509_process_extension(void *context, size_t hdrlen,
494                            unsigned char tag,
495                            const void *value, size_t vlen)
496 {
497         struct x509_parse_context *ctx = context;
498         struct asymmetric_key_id *kid;
499         const unsigned char *v = value;
500
501         pr_debug("Extension: %u\n", ctx->last_oid);
502
503         if (ctx->last_oid == OID_subjectKeyIdentifier) {
504                 /* Get hold of the key fingerprint */
505                 if (ctx->cert->skid || vlen < 3)
506                         return -EBADMSG;
507                 if (v[0] != ASN1_OTS || v[1] != vlen - 2)
508                         return -EBADMSG;
509                 v += 2;
510                 vlen -= 2;
511
512                 ctx->cert->raw_skid_size = vlen;
513                 ctx->cert->raw_skid = v;
514                 kid = asymmetric_key_generate_id(v, vlen, "", 0);
515                 if (IS_ERR(kid))
516                         return PTR_ERR(kid);
517                 ctx->cert->skid = kid;
518                 pr_debug("subjkeyid %*phN\n", kid->len, kid->data);
519                 return 0;
520         }
521
522         if (ctx->last_oid == OID_authorityKeyIdentifier) {
523                 /* Get hold of the CA key fingerprint */
524                 ctx->raw_akid = v;
525                 ctx->raw_akid_size = vlen;
526                 return 0;
527         }
528
529         return 0;
530 }
531
532 /**
533  * x509_decode_time - Decode an X.509 time ASN.1 object
534  * @_t: The time to fill in
535  * @hdrlen: The length of the object header
536  * @tag: The object tag
537  * @value: The object value
538  * @vlen: The size of the object value
539  *
540  * Decode an ASN.1 universal time or generalised time field into a struct the
541  * kernel can handle and check it for validity.  The time is decoded thus:
542  *
543  *      [RFC5280 ยง4.1.2.5]
544  *      CAs conforming to this profile MUST always encode certificate validity
545  *      dates through the year 2049 as UTCTime; certificate validity dates in
546  *      2050 or later MUST be encoded as GeneralizedTime.  Conforming
547  *      applications MUST be able to process validity dates that are encoded in
548  *      either UTCTime or GeneralizedTime.
549  */
550 int x509_decode_time(time64_t *_t,  size_t hdrlen,
551                      unsigned char tag,
552                      const unsigned char *value, size_t vlen)
553 {
554         static const unsigned char month_lengths[] = { 31, 28, 31, 30, 31, 30,
555                                                        31, 31, 30, 31, 30, 31 };
556         const unsigned char *p = value;
557         unsigned year, mon, day, hour, min, sec, mon_len;
558
559 #define dec2bin(X) ({ unsigned char x = (X) - '0'; if (x > 9) goto invalid_time; x; })
560 #define DD2bin(P) ({ unsigned x = dec2bin(P[0]) * 10 + dec2bin(P[1]); P += 2; x; })
561
562         if (tag == ASN1_UNITIM) {
563                 /* UTCTime: YYMMDDHHMMSSZ */
564                 if (vlen != 13)
565                         goto unsupported_time;
566                 year = DD2bin(p);
567                 if (year >= 50)
568                         year += 1900;
569                 else
570                         year += 2000;
571         } else if (tag == ASN1_GENTIM) {
572                 /* GenTime: YYYYMMDDHHMMSSZ */
573                 if (vlen != 15)
574                         goto unsupported_time;
575                 year = DD2bin(p) * 100 + DD2bin(p);
576                 if (year >= 1950 && year <= 2049)
577                         goto invalid_time;
578         } else {
579                 goto unsupported_time;
580         }
581
582         mon  = DD2bin(p);
583         day = DD2bin(p);
584         hour = DD2bin(p);
585         min  = DD2bin(p);
586         sec  = DD2bin(p);
587
588         if (*p != 'Z')
589                 goto unsupported_time;
590
591         if (year < 1970 ||
592             mon < 1 || mon > 12)
593                 goto invalid_time;
594
595         mon_len = month_lengths[mon - 1];
596         if (mon == 2) {
597                 if (year % 4 == 0) {
598                         mon_len = 29;
599                         if (year % 100 == 0) {
600                                 mon_len = 28;
601                                 if (year % 400 == 0)
602                                         mon_len = 29;
603                         }
604                 }
605         }
606
607         if (day < 1 || day > mon_len ||
608             hour > 24 || /* ISO 8601 permits 24:00:00 as midnight tomorrow */
609             min > 59 ||
610             sec > 60) /* ISO 8601 permits leap seconds [X.680 46.3] */
611                 goto invalid_time;
612
613         *_t = mktime64(year, mon, day, hour, min, sec);
614         return 0;
615
616 unsupported_time:
617         pr_debug("Got unsupported time [tag %02x]: '%*phN'\n",
618                  tag, (int)vlen, value);
619         return -EBADMSG;
620 invalid_time:
621         pr_debug("Got invalid time [tag %02x]: '%*phN'\n",
622                  tag, (int)vlen, value);
623         return -EBADMSG;
624 }
625 EXPORT_SYMBOL_GPL(x509_decode_time);
626
627 int x509_note_not_before(void *context, size_t hdrlen,
628                          unsigned char tag,
629                          const void *value, size_t vlen)
630 {
631         struct x509_parse_context *ctx = context;
632         return x509_decode_time(&ctx->cert->valid_from, hdrlen, tag, value, vlen);
633 }
634
635 int x509_note_not_after(void *context, size_t hdrlen,
636                         unsigned char tag,
637                         const void *value, size_t vlen)
638 {
639         struct x509_parse_context *ctx = context;
640         return x509_decode_time(&ctx->cert->valid_to, hdrlen, tag, value, vlen);
641 }
642
643 /*
644  * Note a key identifier-based AuthorityKeyIdentifier
645  */
646 int x509_akid_note_kid(void *context, size_t hdrlen,
647                        unsigned char tag,
648                        const void *value, size_t vlen)
649 {
650         struct x509_parse_context *ctx = context;
651         struct asymmetric_key_id *kid;
652
653         pr_debug("AKID: keyid: %*phN\n", (int)vlen, value);
654
655         if (ctx->cert->sig->auth_ids[1])
656                 return 0;
657
658         kid = asymmetric_key_generate_id(value, vlen, "", 0);
659         if (IS_ERR(kid))
660                 return PTR_ERR(kid);
661         pr_debug("authkeyid %*phN\n", kid->len, kid->data);
662         ctx->cert->sig->auth_ids[1] = kid;
663         return 0;
664 }
665
666 /*
667  * Note a directoryName in an AuthorityKeyIdentifier
668  */
669 int x509_akid_note_name(void *context, size_t hdrlen,
670                         unsigned char tag,
671                         const void *value, size_t vlen)
672 {
673         struct x509_parse_context *ctx = context;
674
675         pr_debug("AKID: name: %*phN\n", (int)vlen, value);
676
677         ctx->akid_raw_issuer = value;
678         ctx->akid_raw_issuer_size = vlen;
679         return 0;
680 }
681
682 /*
683  * Note a serial number in an AuthorityKeyIdentifier
684  */
685 int x509_akid_note_serial(void *context, size_t hdrlen,
686                           unsigned char tag,
687                           const void *value, size_t vlen)
688 {
689         struct x509_parse_context *ctx = context;
690         struct asymmetric_key_id *kid;
691
692         pr_debug("AKID: serial: %*phN\n", (int)vlen, value);
693
694         if (!ctx->akid_raw_issuer || ctx->cert->sig->auth_ids[0])
695                 return 0;
696
697         kid = asymmetric_key_generate_id(value,
698                                          vlen,
699                                          ctx->akid_raw_issuer,
700                                          ctx->akid_raw_issuer_size);
701         if (IS_ERR(kid))
702                 return PTR_ERR(kid);
703
704         pr_debug("authkeyid %*phN\n", kid->len, kid->data);
705         ctx->cert->sig->auth_ids[0] = kid;
706         return 0;
707 }