static int caam_rsa_dec_priv_f1(struct akcipher_request *req) { struct crypto_akcipher *tfm = crypto_akcipher_reqtfm(req); struct caam_rsa_ctx *ctx = akcipher_tfm_ctx(tfm); struct device *jrdev = ctx->dev; struct rsa_edesc *edesc; int ret; /* Allocate extended descriptor */ edesc = rsa_edesc_alloc(req, DESC_RSA_PRIV_F1_LEN); if (IS_ERR(edesc)) return PTR_ERR(edesc); /* Set RSA Decrypt Protocol Data Block - Private Key Form #1 */ ret = set_rsa_priv_f1_pdb(req, edesc); if (ret) goto init_fail; /* Initialize Job Descriptor */ init_rsa_priv_f1_desc(edesc->hw_desc, &edesc->pdb.priv_f1); ret = caam_jr_enqueue(jrdev, edesc->hw_desc, rsa_priv_f1_done, req); if (!ret) return -EINPROGRESS; rsa_priv_f1_unmap(jrdev, edesc, req); init_fail: rsa_io_unmap(jrdev, edesc, req); kfree(edesc); return ret; }
static int caam_rsa_dec(struct akcipher_request *req) { struct crypto_akcipher *tfm = crypto_akcipher_reqtfm(req); struct caam_rsa_ctx *ctx = akcipher_tfm_ctx(tfm); struct caam_rsa_key *key = &ctx->key; struct device *jrdev = ctx->dev; struct rsa_edesc *edesc; int ret; if (unlikely(!key->n || !key->d)) return -EINVAL; if (req->dst_len < key->n_sz) { req->dst_len = key->n_sz; dev_err(jrdev, "Output buffer length less than parameter n\n"); return -EOVERFLOW; } /* Allocate extended descriptor */ edesc = rsa_edesc_alloc(req, DESC_RSA_PRIV_F1_LEN); if (IS_ERR(edesc)) return PTR_ERR(edesc); /* Set RSA Decrypt Protocol Data Block - Private Key Form #1 */ ret = set_rsa_priv_f1_pdb(req, edesc); if (ret) goto init_fail; /* Initialize Job Descriptor */ init_rsa_priv_f1_desc(edesc->hw_desc, &edesc->pdb.priv_f1); ret = caam_jr_enqueue(jrdev, edesc->hw_desc, rsa_priv_f1_done, req); if (!ret) return -EINPROGRESS; rsa_priv_f1_unmap(jrdev, edesc, req); init_fail: rsa_io_unmap(jrdev, edesc, req); kfree(edesc); return ret; }