Commit 58068cfc authored by Iuliana Prodan's avatar Iuliana Prodan Committed by Herbert Xu

crypto: caam - unregister algorithm only if the registration succeeded

To know if a registration succeeded added a new struct,
caam_akcipher_alg, that keeps, also, the registration status.
This status is updated in caam_pkc_init and verified in
caam_pkc_exit to unregister an algorithm.

Fixes: 1b46c90c ("crypto: caam - convert top level drivers to libraries")
Signed-off-by: default avatarIuliana Prodan <iuliana.prodan@nxp.com>
Reviewed-by: default avatarHoria Geanta <horia.geanta@nxp.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 4e3a61c5
...@@ -35,6 +35,11 @@ static u8 *zero_buffer; ...@@ -35,6 +35,11 @@ static u8 *zero_buffer;
*/ */
static bool init_done; static bool init_done;
struct caam_akcipher_alg {
struct akcipher_alg akcipher;
bool registered;
};
static void rsa_io_unmap(struct device *dev, struct rsa_edesc *edesc, static void rsa_io_unmap(struct device *dev, struct rsa_edesc *edesc,
struct akcipher_request *req) struct akcipher_request *req)
{ {
...@@ -1058,22 +1063,24 @@ static void caam_rsa_exit_tfm(struct crypto_akcipher *tfm) ...@@ -1058,22 +1063,24 @@ static void caam_rsa_exit_tfm(struct crypto_akcipher *tfm)
caam_jr_free(ctx->dev); caam_jr_free(ctx->dev);
} }
static struct akcipher_alg caam_rsa = { static struct caam_akcipher_alg caam_rsa = {
.encrypt = caam_rsa_enc, .akcipher = {
.decrypt = caam_rsa_dec, .encrypt = caam_rsa_enc,
.set_pub_key = caam_rsa_set_pub_key, .decrypt = caam_rsa_dec,
.set_priv_key = caam_rsa_set_priv_key, .set_pub_key = caam_rsa_set_pub_key,
.max_size = caam_rsa_max_size, .set_priv_key = caam_rsa_set_priv_key,
.init = caam_rsa_init_tfm, .max_size = caam_rsa_max_size,
.exit = caam_rsa_exit_tfm, .init = caam_rsa_init_tfm,
.reqsize = sizeof(struct caam_rsa_req_ctx), .exit = caam_rsa_exit_tfm,
.base = { .reqsize = sizeof(struct caam_rsa_req_ctx),
.cra_name = "rsa", .base = {
.cra_driver_name = "rsa-caam", .cra_name = "rsa",
.cra_priority = 3000, .cra_driver_name = "rsa-caam",
.cra_module = THIS_MODULE, .cra_priority = 3000,
.cra_ctxsize = sizeof(struct caam_rsa_ctx), .cra_module = THIS_MODULE,
}, .cra_ctxsize = sizeof(struct caam_rsa_ctx),
},
}
}; };
/* Public Key Cryptography module initialization handler */ /* Public Key Cryptography module initialization handler */
...@@ -1101,13 +1108,15 @@ int caam_pkc_init(struct device *ctrldev) ...@@ -1101,13 +1108,15 @@ int caam_pkc_init(struct device *ctrldev)
if (!zero_buffer) if (!zero_buffer)
return -ENOMEM; return -ENOMEM;
err = crypto_register_akcipher(&caam_rsa); err = crypto_register_akcipher(&caam_rsa.akcipher);
if (err) { if (err) {
kfree(zero_buffer); kfree(zero_buffer);
dev_warn(ctrldev, "%s alg registration failed\n", dev_warn(ctrldev, "%s alg registration failed\n",
caam_rsa.base.cra_driver_name); caam_rsa.akcipher.base.cra_driver_name);
} else { } else {
init_done = true; init_done = true;
caam_rsa.registered = true;
dev_info(ctrldev, "caam pkc algorithms registered in /proc/crypto\n"); dev_info(ctrldev, "caam pkc algorithms registered in /proc/crypto\n");
} }
...@@ -1119,6 +1128,8 @@ void caam_pkc_exit(void) ...@@ -1119,6 +1128,8 @@ void caam_pkc_exit(void)
if (!init_done) if (!init_done)
return; return;
if (caam_rsa.registered)
crypto_unregister_akcipher(&caam_rsa.akcipher);
kfree(zero_buffer); kfree(zero_buffer);
crypto_unregister_akcipher(&caam_rsa);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment