net: phy: dp83848: add dp83822 PHY support
[cascardo/linux.git] / crypto / asymmetric_keys / x509_cert_parser.c
index 4a29bac..865f46e 100644 (file)
@@ -47,15 +47,12 @@ struct x509_parse_context {
 void x509_free_certificate(struct x509_certificate *cert)
 {
        if (cert) {
-               public_key_destroy(cert->pub);
+               public_key_free(cert->pub);
+               public_key_signature_free(cert->sig);
                kfree(cert->issuer);
                kfree(cert->subject);
                kfree(cert->id);
                kfree(cert->skid);
-               kfree(cert->akid_id);
-               kfree(cert->akid_skid);
-               kfree(cert->sig.digest);
-               kfree(cert->sig.s);
                kfree(cert);
        }
 }
@@ -78,6 +75,9 @@ struct x509_certificate *x509_cert_parse(const void *data, size_t datalen)
        cert->pub = kzalloc(sizeof(struct public_key), GFP_KERNEL);
        if (!cert->pub)
                goto error_no_ctx;
+       cert->sig = kzalloc(sizeof(struct public_key_signature), GFP_KERNEL);
+       if (!cert->sig)
+               goto error_no_ctx;
        ctx = kzalloc(sizeof(struct x509_parse_context), GFP_KERNEL);
        if (!ctx)
                goto error_no_ctx;
@@ -108,6 +108,11 @@ struct x509_certificate *x509_cert_parse(const void *data, size_t datalen)
 
        cert->pub->keylen = ctx->key_size;
 
+       /* Grab the signature bits */
+       ret = x509_get_sig_params(cert);
+       if (ret < 0)
+               goto error_decode;
+
        /* Generate cert issuer + serial number key ID */
        kid = asymmetric_key_generate_id(cert->raw_serial,
                                         cert->raw_serial_size,
@@ -119,6 +124,11 @@ struct x509_certificate *x509_cert_parse(const void *data, size_t datalen)
        }
        cert->id = kid;
 
+       /* Detect self-signed certificates */
+       ret = x509_check_for_self_signed(cert);
+       if (ret < 0)
+               goto error_decode;
+
        kfree(ctx);
        return cert;
 
@@ -188,33 +198,33 @@ int x509_note_pkey_algo(void *context, size_t hdrlen,
                return -ENOPKG; /* Unsupported combination */
 
        case OID_md4WithRSAEncryption:
-               ctx->cert->sig.hash_algo = "md4";
-               ctx->cert->sig.pkey_algo = "rsa";
+               ctx->cert->sig->hash_algo = "md4";
+               ctx->cert->sig->pkey_algo = "rsa";
                break;
 
        case OID_sha1WithRSAEncryption:
-               ctx->cert->sig.hash_algo = "sha1";
-               ctx->cert->sig.pkey_algo = "rsa";
+               ctx->cert->sig->hash_algo = "sha1";
+               ctx->cert->sig->pkey_algo = "rsa";
                break;
 
        case OID_sha256WithRSAEncryption:
-               ctx->cert->sig.hash_algo = "sha256";
-               ctx->cert->sig.pkey_algo = "rsa";
+               ctx->cert->sig->hash_algo = "sha256";
+               ctx->cert->sig->pkey_algo = "rsa";
                break;
 
        case OID_sha384WithRSAEncryption:
-               ctx->cert->sig.hash_algo = "sha384";
-               ctx->cert->sig.pkey_algo = "rsa";
+               ctx->cert->sig->hash_algo = "sha384";
+               ctx->cert->sig->pkey_algo = "rsa";
                break;
 
        case OID_sha512WithRSAEncryption:
-               ctx->cert->sig.hash_algo = "sha512";
-               ctx->cert->sig.pkey_algo = "rsa";
+               ctx->cert->sig->hash_algo = "sha512";
+               ctx->cert->sig->pkey_algo = "rsa";
                break;
 
        case OID_sha224WithRSAEncryption:
-               ctx->cert->sig.hash_algo = "sha224";
-               ctx->cert->sig.pkey_algo = "rsa";
+               ctx->cert->sig->hash_algo = "sha224";
+               ctx->cert->sig->pkey_algo = "rsa";
                break;
        }
 
@@ -572,14 +582,14 @@ int x509_akid_note_kid(void *context, size_t hdrlen,
 
        pr_debug("AKID: keyid: %*phN\n", (int)vlen, value);
 
-       if (ctx->cert->akid_skid)
+       if (ctx->cert->sig->auth_ids[1])
                return 0;
 
        kid = asymmetric_key_generate_id(value, vlen, "", 0);
        if (IS_ERR(kid))
                return PTR_ERR(kid);
        pr_debug("authkeyid %*phN\n", kid->len, kid->data);
-       ctx->cert->akid_skid = kid;
+       ctx->cert->sig->auth_ids[1] = kid;
        return 0;
 }
 
@@ -611,7 +621,7 @@ int x509_akid_note_serial(void *context, size_t hdrlen,
 
        pr_debug("AKID: serial: %*phN\n", (int)vlen, value);
 
-       if (!ctx->akid_raw_issuer || ctx->cert->akid_id)
+       if (!ctx->akid_raw_issuer || ctx->cert->sig->auth_ids[0])
                return 0;
 
        kid = asymmetric_key_generate_id(value,
@@ -622,6 +632,6 @@ int x509_akid_note_serial(void *context, size_t hdrlen,
                return PTR_ERR(kid);
 
        pr_debug("authkeyid %*phN\n", kid->len, kid->data);
-       ctx->cert->akid_id = kid;
+       ctx->cert->sig->auth_ids[0] = kid;
        return 0;
 }