linux/crypto/asymmetric_keys/x509_cert_parser.c
<<
>>
Prefs
   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
  19struct 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 */
  46void 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}
  58EXPORT_SYMBOL_GPL(x509_free_certificate);
  59
  60/*
  61 * Parse an X.509 certificate
  62 */
  63struct 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
 142error_decode:
 143        kfree(ctx);
 144error_no_ctx:
 145        x509_free_certificate(cert);
 146error_no_cert:
 147        return ERR_PTR(ret);
 148}
 149EXPORT_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 */
 155int 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 */
 175int 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 */
 192int 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
 263rsa_pkcs1:
 264        ctx->cert->sig->pkey_algo = "rsa";
 265        ctx->cert->sig->encoding = "pkcs1";
 266        ctx->algo_oid = ctx->last_oid;
 267        return 0;
 268ecrdsa:
 269        ctx->cert->sig->pkey_algo = "ecrdsa";
 270        ctx->cert->sig->encoding = "raw";
 271        ctx->algo_oid = ctx->last_oid;
 272        return 0;
 273sm2:
 274        ctx->cert->sig->pkey_algo = "sm2";
 275        ctx->cert->sig->encoding = "raw";
 276        ctx->algo_oid = ctx->last_oid;
 277        return 0;
 278ecdsa:
 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 */
 288int 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 */
 322int 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 */
 335int 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 */
 364static 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
 424single_component:
 425        buffer = kmalloc(namesize + 1, GFP_KERNEL);
 426        if (!buffer)
 427                return -ENOMEM;
 428        memcpy(buffer, name, namesize);
 429        buffer[namesize] = 0;
 430
 431done:
 432        *_name = buffer;
 433        ctx->cn_size = 0;
 434        ctx->o_size = 0;
 435        ctx->email_size = 0;
 436        return 0;
 437}
 438
 439int 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
 449int 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 */
 462int 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 */
 483int 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 */
 538int 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 */
 595int 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
 661unsupported_time:
 662        pr_debug("Got unsupported time [tag %02x]: '%*phN'\n",
 663                 tag, (int)vlen, value);
 664        return -EBADMSG;
 665invalid_time:
 666        pr_debug("Got invalid time [tag %02x]: '%*phN'\n",
 667                 tag, (int)vlen, value);
 668        return -EBADMSG;
 669}
 670EXPORT_SYMBOL_GPL(x509_decode_time);
 671
 672int 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
 680int 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 */
 691int 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 */
 714int 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 */
 730int 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