• Home
  • Raw
  • Download

Lines Matching +full:jh7110 +full:- +full:crypto

1 // SPDX-License-Identifier: GPL-2.0
8 #include <linux/crypto.h>
11 #include <linux/dma-direct.h>
16 #include <crypto/akcipher.h>
17 #include <crypto/algapi.h>
18 #include <crypto/internal/akcipher.h>
19 #include <crypto/internal/rsa.h>
20 #include <crypto/scatterwalk.h>
22 #include "jh7110-cryp.h"
45 struct starfive_cryp_dev *cryp = ctx->cryp; in starfive_pka_wait_done()
47 return wait_for_completion_timeout(&cryp->pka_done, in starfive_pka_wait_done()
53 struct starfive_cryp_dev *cryp = ctx->cryp; in starfive_pka_irq_mask_clear()
56 stat = readl(cryp->base + STARFIVE_IE_MASK_OFFSET); in starfive_pka_irq_mask_clear()
58 writel(stat, cryp->base + STARFIVE_IE_MASK_OFFSET); in starfive_pka_irq_mask_clear()
60 reinit_completion(&cryp->pka_done); in starfive_pka_irq_mask_clear()
65 if (key->d) in starfive_rsa_free_key()
66 kfree_sensitive(key->d); in starfive_rsa_free_key()
67 if (key->e) in starfive_rsa_free_key()
68 kfree_sensitive(key->e); in starfive_rsa_free_key()
69 if (key->n) in starfive_rsa_free_key()
70 kfree_sensitive(key->n); in starfive_rsa_free_key()
81 value = pa[key_sz - i - 1]; in starfive_rsa_get_nbit()
92 struct starfive_cryp_dev *cryp = ctx->cryp; in starfive_rsa_montgomery_form()
93 struct starfive_cryp_request_ctx *rctx = ctx->rctx; in starfive_rsa_montgomery_form()
94 int count = rctx->total / sizeof(u32) - 1; in starfive_rsa_montgomery_form()
99 opsize = (bit_len - 1) >> 5; in starfive_rsa_montgomery_form()
100 rctx->csr.pka.v = 0; in starfive_rsa_montgomery_form()
102 writel(rctx->csr.pka.v, cryp->base + STARFIVE_PKA_CACR_OFFSET); in starfive_rsa_montgomery_form()
105 writel(mod[opsize - loop], cryp->base + STARFIVE_PKA_CANR_OFFSET + loop * 4); in starfive_rsa_montgomery_form()
108 rctx->csr.pka.v = 0; in starfive_rsa_montgomery_form()
109 rctx->csr.pka.cln_done = 1; in starfive_rsa_montgomery_form()
110 rctx->csr.pka.opsize = opsize; in starfive_rsa_montgomery_form()
111 rctx->csr.pka.exposize = opsize; in starfive_rsa_montgomery_form()
112 rctx->csr.pka.cmd = CRYPTO_CMD_PRE; in starfive_rsa_montgomery_form()
113 rctx->csr.pka.start = 1; in starfive_rsa_montgomery_form()
114 rctx->csr.pka.not_r2 = 1; in starfive_rsa_montgomery_form()
115 rctx->csr.pka.ie = 1; in starfive_rsa_montgomery_form()
118 writel(rctx->csr.pka.v, cryp->base + STARFIVE_PKA_CACR_OFFSET); in starfive_rsa_montgomery_form()
121 return -ETIMEDOUT; in starfive_rsa_montgomery_form()
124 writel(in[opsize - loop], cryp->base + STARFIVE_PKA_CAAR_OFFSET + loop * 4); in starfive_rsa_montgomery_form()
126 writel(0x1000000, cryp->base + STARFIVE_PKA_CAER_OFFSET); in starfive_rsa_montgomery_form()
129 writel(0, cryp->base + STARFIVE_PKA_CAER_OFFSET + loop * 4); in starfive_rsa_montgomery_form()
131 rctx->csr.pka.v = 0; in starfive_rsa_montgomery_form()
132 rctx->csr.pka.cln_done = 1; in starfive_rsa_montgomery_form()
133 rctx->csr.pka.opsize = opsize; in starfive_rsa_montgomery_form()
134 rctx->csr.pka.exposize = opsize; in starfive_rsa_montgomery_form()
135 rctx->csr.pka.cmd = CRYPTO_CMD_AERN; in starfive_rsa_montgomery_form()
136 rctx->csr.pka.start = 1; in starfive_rsa_montgomery_form()
137 rctx->csr.pka.ie = 1; in starfive_rsa_montgomery_form()
140 writel(rctx->csr.pka.v, cryp->base + STARFIVE_PKA_CACR_OFFSET); in starfive_rsa_montgomery_form()
143 return -ETIMEDOUT; in starfive_rsa_montgomery_form()
145 rctx->csr.pka.v = 0; in starfive_rsa_montgomery_form()
146 rctx->csr.pka.cln_done = 1; in starfive_rsa_montgomery_form()
147 rctx->csr.pka.opsize = opsize; in starfive_rsa_montgomery_form()
148 rctx->csr.pka.exposize = opsize; in starfive_rsa_montgomery_form()
149 rctx->csr.pka.cmd = CRYPTO_CMD_PRE; in starfive_rsa_montgomery_form()
150 rctx->csr.pka.start = 1; in starfive_rsa_montgomery_form()
151 rctx->csr.pka.pre_expf = 1; in starfive_rsa_montgomery_form()
152 rctx->csr.pka.ie = 1; in starfive_rsa_montgomery_form()
155 writel(rctx->csr.pka.v, cryp->base + STARFIVE_PKA_CACR_OFFSET); in starfive_rsa_montgomery_form()
158 return -ETIMEDOUT; in starfive_rsa_montgomery_form()
161 writel(in[count - loop], cryp->base + STARFIVE_PKA_CAER_OFFSET + loop * 4); in starfive_rsa_montgomery_form()
165 writel(0, cryp->base + STARFIVE_PKA_CAER_OFFSET + loop * 4); in starfive_rsa_montgomery_form()
167 rctx->csr.pka.v = 0; in starfive_rsa_montgomery_form()
168 rctx->csr.pka.cln_done = 1; in starfive_rsa_montgomery_form()
169 rctx->csr.pka.opsize = opsize; in starfive_rsa_montgomery_form()
170 rctx->csr.pka.exposize = opsize; in starfive_rsa_montgomery_form()
171 rctx->csr.pka.cmd = CRYPTO_CMD_ARN; in starfive_rsa_montgomery_form()
172 rctx->csr.pka.start = 1; in starfive_rsa_montgomery_form()
173 rctx->csr.pka.ie = 1; in starfive_rsa_montgomery_form()
176 writel(rctx->csr.pka.v, cryp->base + STARFIVE_PKA_CACR_OFFSET); in starfive_rsa_montgomery_form()
179 return -ETIMEDOUT; in starfive_rsa_montgomery_form()
183 temp = readl(cryp->base + STARFIVE_PKA_CAAR_OFFSET + 0x4 * loop); in starfive_rsa_montgomery_form()
184 out[opsize - loop] = temp; in starfive_rsa_montgomery_form()
193 struct starfive_cryp_dev *cryp = ctx->cryp; in starfive_rsa_cpu_start()
194 struct starfive_cryp_request_ctx *rctx = ctx->rctx; in starfive_rsa_cpu_start()
195 struct starfive_rsa_key *key = &ctx->rsa_key; in starfive_rsa_cpu_start()
201 opsize = (key_sz - 1) >> 2; in starfive_rsa_cpu_start()
205 return -ENOMEM; in starfive_rsa_cpu_start()
207 ret = starfive_rsa_montgomery_form(ctx, mta, (u32 *)rctx->rsa_data, in starfive_rsa_cpu_start()
210 dev_err_probe(cryp->dev, ret, "Conversion to Montgomery failed"); in starfive_rsa_cpu_start()
215 writel(mta[opsize - loop], in starfive_rsa_cpu_start()
216 cryp->base + STARFIVE_PKA_CAER_OFFSET + loop * 4); in starfive_rsa_cpu_start()
218 for (loop = key->bitlen - 1; loop > 0; loop--) { in starfive_rsa_cpu_start()
219 mlen = starfive_rsa_get_nbit(de, loop - 1, key_sz); in starfive_rsa_cpu_start()
221 rctx->csr.pka.v = 0; in starfive_rsa_cpu_start()
222 rctx->csr.pka.cln_done = 1; in starfive_rsa_cpu_start()
223 rctx->csr.pka.opsize = opsize; in starfive_rsa_cpu_start()
224 rctx->csr.pka.exposize = opsize; in starfive_rsa_cpu_start()
225 rctx->csr.pka.cmd = CRYPTO_CMD_AARN; in starfive_rsa_cpu_start()
226 rctx->csr.pka.start = 1; in starfive_rsa_cpu_start()
227 rctx->csr.pka.ie = 1; in starfive_rsa_cpu_start()
230 writel(rctx->csr.pka.v, cryp->base + STARFIVE_PKA_CACR_OFFSET); in starfive_rsa_cpu_start()
232 ret = -ETIMEDOUT; in starfive_rsa_cpu_start()
237 rctx->csr.pka.v = 0; in starfive_rsa_cpu_start()
238 rctx->csr.pka.cln_done = 1; in starfive_rsa_cpu_start()
239 rctx->csr.pka.opsize = opsize; in starfive_rsa_cpu_start()
240 rctx->csr.pka.exposize = opsize; in starfive_rsa_cpu_start()
241 rctx->csr.pka.cmd = CRYPTO_CMD_AERN; in starfive_rsa_cpu_start()
242 rctx->csr.pka.start = 1; in starfive_rsa_cpu_start()
243 rctx->csr.pka.ie = 1; in starfive_rsa_cpu_start()
246 writel(rctx->csr.pka.v, cryp->base + STARFIVE_PKA_CACR_OFFSET); in starfive_rsa_cpu_start()
254 temp = readl(cryp->base + STARFIVE_PKA_CAAR_OFFSET + 0x4 * loop); in starfive_rsa_cpu_start()
255 result[opsize - loop] = temp; in starfive_rsa_cpu_start()
260 dev_err_probe(cryp->dev, ret, "Conversion from Montgomery failed"); in starfive_rsa_cpu_start()
274 struct starfive_cryp_dev *cryp = ctx->cryp; in starfive_rsa_enc_core()
275 struct starfive_cryp_request_ctx *rctx = ctx->rctx; in starfive_rsa_enc_core()
276 struct starfive_rsa_key *key = &ctx->rsa_key; in starfive_rsa_enc_core()
279 writel(STARFIVE_RSA_RESET, cryp->base + STARFIVE_PKA_CACR_OFFSET); in starfive_rsa_enc_core()
281 rctx->total = sg_copy_to_buffer(rctx->in_sg, rctx->nents, in starfive_rsa_enc_core()
282 rctx->rsa_data, rctx->total); in starfive_rsa_enc_core()
285 key->bitlen = key->e_bitlen; in starfive_rsa_enc_core()
286 ret = starfive_rsa_start(ctx, rctx->rsa_data, key->e, in starfive_rsa_enc_core()
287 key->n, key->key_sz); in starfive_rsa_enc_core()
289 key->bitlen = key->d_bitlen; in starfive_rsa_enc_core()
290 ret = starfive_rsa_start(ctx, rctx->rsa_data, key->d, in starfive_rsa_enc_core()
291 key->n, key->key_sz); in starfive_rsa_enc_core()
297 sg_copy_buffer(rctx->out_sg, sg_nents(rctx->out_sg), in starfive_rsa_enc_core()
298 rctx->rsa_data, key->key_sz, 0, 0); in starfive_rsa_enc_core()
301 writel(STARFIVE_RSA_RESET, cryp->base + STARFIVE_PKA_CACR_OFFSET); in starfive_rsa_enc_core()
302 kfree(rctx->rsa_data); in starfive_rsa_enc_core()
310 struct starfive_cryp_dev *cryp = ctx->cryp; in starfive_rsa_enc()
311 struct starfive_rsa_key *key = &ctx->rsa_key; in starfive_rsa_enc()
315 if (!key->key_sz) { in starfive_rsa_enc()
316 akcipher_request_set_tfm(req, ctx->akcipher_fbk); in starfive_rsa_enc()
322 if (unlikely(!key->n || !key->e)) in starfive_rsa_enc()
323 return -EINVAL; in starfive_rsa_enc()
325 if (req->dst_len < key->key_sz) in starfive_rsa_enc()
326 return dev_err_probe(cryp->dev, -EOVERFLOW, in starfive_rsa_enc()
329 rctx->in_sg = req->src; in starfive_rsa_enc()
330 rctx->out_sg = req->dst; in starfive_rsa_enc()
331 rctx->total = req->src_len; in starfive_rsa_enc()
332 rctx->nents = sg_nents(rctx->in_sg); in starfive_rsa_enc()
333 ctx->rctx = rctx; in starfive_rsa_enc()
342 struct starfive_cryp_dev *cryp = ctx->cryp; in starfive_rsa_dec()
343 struct starfive_rsa_key *key = &ctx->rsa_key; in starfive_rsa_dec()
347 if (!key->key_sz) { in starfive_rsa_dec()
348 akcipher_request_set_tfm(req, ctx->akcipher_fbk); in starfive_rsa_dec()
354 if (unlikely(!key->n || !key->d)) in starfive_rsa_dec()
355 return -EINVAL; in starfive_rsa_dec()
357 if (req->dst_len < key->key_sz) in starfive_rsa_dec()
358 return dev_err_probe(cryp->dev, -EOVERFLOW, in starfive_rsa_dec()
361 rctx->in_sg = req->src; in starfive_rsa_dec()
362 rctx->out_sg = req->dst; in starfive_rsa_dec()
363 ctx->rctx = rctx; in starfive_rsa_dec()
364 rctx->total = req->src_len; in starfive_rsa_dec()
378 vlen--; in starfive_rsa_set_n()
380 rsa_key->key_sz = vlen; in starfive_rsa_set_n()
381 bitslen = rsa_key->key_sz << 3; in starfive_rsa_set_n()
385 return -EINVAL; in starfive_rsa_set_n()
387 ret = -ENOMEM; in starfive_rsa_set_n()
388 rsa_key->n = kmemdup(ptr, rsa_key->key_sz, GFP_KERNEL); in starfive_rsa_set_n()
389 if (!rsa_key->n) in starfive_rsa_set_n()
394 rsa_key->key_sz = 0; in starfive_rsa_set_n()
395 rsa_key->n = NULL; in starfive_rsa_set_n()
409 vlen--; in starfive_rsa_set_e()
413 if (!rsa_key->key_sz || !vlen || vlen > rsa_key->key_sz) { in starfive_rsa_set_e()
414 rsa_key->e = NULL; in starfive_rsa_set_e()
415 return -EINVAL; in starfive_rsa_set_e()
418 rsa_key->e = kzalloc(rsa_key->key_sz, GFP_KERNEL); in starfive_rsa_set_e()
419 if (!rsa_key->e) in starfive_rsa_set_e()
420 return -ENOMEM; in starfive_rsa_set_e()
422 for (loop = 8; loop > 0; loop--) { in starfive_rsa_set_e()
423 if (pt >> (loop - 1)) in starfive_rsa_set_e()
427 rsa_key->e_bitlen = (vlen - 1) * 8 + loop; in starfive_rsa_set_e()
429 memcpy(rsa_key->e + (rsa_key->key_sz - vlen), ptr, vlen); in starfive_rsa_set_e()
444 vlen--; in starfive_rsa_set_d()
448 ret = -EINVAL; in starfive_rsa_set_d()
449 if (!rsa_key->key_sz || !vlen || vlen > rsa_key->key_sz) in starfive_rsa_set_d()
452 ret = -ENOMEM; in starfive_rsa_set_d()
453 rsa_key->d = kzalloc(rsa_key->key_sz, GFP_KERNEL); in starfive_rsa_set_d()
454 if (!rsa_key->d) in starfive_rsa_set_d()
457 for (loop = 8; loop > 0; loop--) { in starfive_rsa_set_d()
458 if (pt >> (loop - 1)) in starfive_rsa_set_d()
462 rsa_key->d_bitlen = (vlen - 1) * 8 + loop; in starfive_rsa_set_d()
464 memcpy(rsa_key->d + (rsa_key->key_sz - vlen), ptr, vlen); in starfive_rsa_set_d()
468 rsa_key->d = NULL; in starfive_rsa_set_d()
477 struct starfive_rsa_key *rsa_key = &ctx->rsa_key; in starfive_rsa_setkey()
507 if (!rsa_key->n || !rsa_key->e) { in starfive_rsa_setkey()
508 ret = -EINVAL; in starfive_rsa_setkey()
512 if (private && !rsa_key->d) { in starfive_rsa_setkey()
513 ret = -EINVAL; in starfive_rsa_setkey()
529 ret = crypto_akcipher_set_pub_key(ctx->akcipher_fbk, key, keylen); in starfive_rsa_set_pub_key()
542 ret = crypto_akcipher_set_priv_key(ctx->akcipher_fbk, key, keylen); in starfive_rsa_set_priv_key()
553 if (ctx->rsa_key.key_sz) in starfive_rsa_max_size()
554 return ctx->rsa_key.key_sz; in starfive_rsa_max_size()
556 return crypto_akcipher_maxsize(ctx->akcipher_fbk); in starfive_rsa_max_size()
563 ctx->akcipher_fbk = crypto_alloc_akcipher("rsa-generic", 0, 0); in starfive_rsa_init_tfm()
564 if (IS_ERR(ctx->akcipher_fbk)) in starfive_rsa_init_tfm()
565 return PTR_ERR(ctx->akcipher_fbk); in starfive_rsa_init_tfm()
567 ctx->cryp = starfive_cryp_find_dev(ctx); in starfive_rsa_init_tfm()
568 if (!ctx->cryp) { in starfive_rsa_init_tfm()
569 crypto_free_akcipher(ctx->akcipher_fbk); in starfive_rsa_init_tfm()
570 return -ENODEV; in starfive_rsa_init_tfm()
582 struct starfive_rsa_key *key = (struct starfive_rsa_key *)&ctx->rsa_key; in starfive_rsa_exit_tfm()
584 crypto_free_akcipher(ctx->akcipher_fbk); in starfive_rsa_exit_tfm()
600 .cra_driver_name = "starfive-rsa",