static int rsa_set_pub_key(struct crypto_akcipher *tfm, const void *key, unsigned int keylen) { struct rsa_key *pkey = akcipher_tfm_ctx(tfm); int ret; ret = rsa_parse_pub_key(pkey, key, keylen); if (ret) return ret; if (rsa_check_key_length(mpi_get_size(pkey->n) << 3)) { rsa_free_key(pkey); ret = -EINVAL; } return ret; }
static int caam_rsa_set_pub_key(struct crypto_akcipher *tfm, const void *key, unsigned int keylen) { struct caam_rsa_ctx *ctx = akcipher_tfm_ctx(tfm); struct rsa_key raw_key = {NULL}; struct caam_rsa_key *rsa_key = &ctx->key; int ret; /* Free the old RSA key if any */ caam_rsa_free_key(rsa_key); ret = rsa_parse_pub_key(&raw_key, key, keylen); if (ret) return ret; /* Copy key in DMA zone */ rsa_key->e = kzalloc(raw_key.e_sz, GFP_DMA | GFP_KERNEL); if (!rsa_key->e) goto err; /* * Skip leading zeros and copy the positive integer to a buffer * allocated in the GFP_DMA | GFP_KERNEL zone. The decryption descriptor * expects a positive integer for the RSA modulus and uses its length as * decryption output length. */ rsa_key->n = caam_read_raw_data(raw_key.n, &raw_key.n_sz); if (!rsa_key->n) goto err; if (caam_rsa_check_key_length(raw_key.n_sz << 3)) { caam_rsa_free_key(rsa_key); return -EINVAL; } rsa_key->e_sz = raw_key.e_sz; rsa_key->n_sz = raw_key.n_sz; memcpy(rsa_key->e, raw_key.e, raw_key.e_sz); return 0; err: caam_rsa_free_key(rsa_key); return -ENOMEM; }