Message ID | 20240529002553.1372257-1-jiajie.ho@starfivetech.com |
---|---|
State | New |
Headers | show |
Series | crypto: starfive - Align rsa input data to 32-bit | expand |
> On Wed, May 29, 2024 at 08:25:53AM +0800, Jia Jie Ho wrote: > > Hardware expects RSA input plain/ciphertext to be 32-bit aligned. > > Allocate aligned buffer and shift data accordingly. > > > > Signed-off-by: Jia Jie Ho <jiajie.ho@starfivetech.com> > > --- > > drivers/crypto/starfive/jh7110-cryp.h | 3 +-- > > drivers/crypto/starfive/jh7110-rsa.c | 17 ++++++++++------- > > 2 files changed, 11 insertions(+), 9 deletions(-) > > > > diff --git a/drivers/crypto/starfive/jh7110-cryp.h > > b/drivers/crypto/starfive/jh7110-cryp.h > > index 494a74f52706..eeb4e2b9655f 100644 > > --- a/drivers/crypto/starfive/jh7110-cryp.h > > +++ b/drivers/crypto/starfive/jh7110-cryp.h > > @@ -217,12 +217,11 @@ struct starfive_cryp_request_ctx { > > struct scatterlist *out_sg; > > struct ahash_request ahash_fbk_req; > > size_t total; > > - size_t nents; > > unsigned int blksize; > > unsigned int digsize; > > unsigned long in_sg_len; > > unsigned char *adata; > > - u8 rsa_data[] __aligned(sizeof(u32)); > > + u8 *rsa_data; > > You didn't explain why this is moving from a pre-allocated buffer to one that's > allocated on the run. It would appear that there is no reason why you can't > build the extra space used for shifting into reqsize. > I'll update this in the next version. Thanks for reviewing this. Best regards, Jia Jie
> On Wed, May 29, 2024 at 08:25:53AM +0800, Jia Jie Ho wrote: > > Hardware expects RSA input plain/ciphertext to be 32-bit aligned. > > Allocate aligned buffer and shift data accordingly. > > > > Signed-off-by: Jia Jie Ho <jiajie.ho@starfivetech.com> > > --- > > drivers/crypto/starfive/jh7110-cryp.h | 3 +-- > > drivers/crypto/starfive/jh7110-rsa.c | 17 ++++++++++------- > > 2 files changed, 11 insertions(+), 9 deletions(-) > > > > diff --git a/drivers/crypto/starfive/jh7110-cryp.h > > b/drivers/crypto/starfive/jh7110-cryp.h > > index 494a74f52706..eeb4e2b9655f 100644 > > --- a/drivers/crypto/starfive/jh7110-cryp.h > > +++ b/drivers/crypto/starfive/jh7110-cryp.h > > @@ -217,12 +217,11 @@ struct starfive_cryp_request_ctx { > > struct scatterlist *out_sg; > > struct ahash_request ahash_fbk_req; > > size_t total; > > - size_t nents; > > unsigned int blksize; > > unsigned int digsize; > > unsigned long in_sg_len; > > unsigned char *adata; > > - u8 rsa_data[] __aligned(sizeof(u32)); > > + u8 *rsa_data; > > You didn't explain why this is moving from a pre-allocated buffer to one that's > allocated on the run. It would appear that there is no reason why you can't > build the extra space used for shifting into reqsize. > Hi Herbert, Can I fix the buffer length of the pre-allocated buffer to 256 bytes instead of the current variable length buffer? - u8 rsa_data[] __aligned(sizeof(u32)); + u8 rsa_data[STARFIVE_RSA_MAX_KEYSZ]; That's the maximum length supported by the hardware and most applications now use rsa2048 and above. Thanks, Jia Jie
On Wed, Jun 12, 2024 at 02:58:18AM +0000, JiaJie Ho wrote: > > Can I fix the buffer length of the pre-allocated buffer to 256 bytes instead of > the current variable length buffer? > > - u8 rsa_data[] __aligned(sizeof(u32)); > + u8 rsa_data[STARFIVE_RSA_MAX_KEYSZ]; > > That's the maximum length supported by the hardware and > most applications now use rsa2048 and above. I think that's fine. Thanks,
diff --git a/drivers/crypto/starfive/jh7110-cryp.h b/drivers/crypto/starfive/jh7110-cryp.h index 494a74f52706..eeb4e2b9655f 100644 --- a/drivers/crypto/starfive/jh7110-cryp.h +++ b/drivers/crypto/starfive/jh7110-cryp.h @@ -217,12 +217,11 @@ struct starfive_cryp_request_ctx { struct scatterlist *out_sg; struct ahash_request ahash_fbk_req; size_t total; - size_t nents; unsigned int blksize; unsigned int digsize; unsigned long in_sg_len; unsigned char *adata; - u8 rsa_data[] __aligned(sizeof(u32)); + u8 *rsa_data; }; struct starfive_cryp_dev *starfive_cryp_find_dev(struct starfive_cryp_ctx *ctx); diff --git a/drivers/crypto/starfive/jh7110-rsa.c b/drivers/crypto/starfive/jh7110-rsa.c index 33093ba4b13a..8e4ea607102a 100644 --- a/drivers/crypto/starfive/jh7110-rsa.c +++ b/drivers/crypto/starfive/jh7110-rsa.c @@ -74,14 +74,13 @@ static int starfive_rsa_montgomery_form(struct starfive_cryp_ctx *ctx, { struct starfive_cryp_dev *cryp = ctx->cryp; struct starfive_cryp_request_ctx *rctx = ctx->rctx; - int count = rctx->total / sizeof(u32) - 1; + int count = (ALIGN(rctx->total, sizeof(u32)) >> 2) - 1; int loop; u32 temp; u8 opsize; opsize = (bit_len - 1) >> 5; rctx->csr.pka.v = 0; - writel(rctx->csr.pka.v, cryp->base + STARFIVE_PKA_CACR_OFFSET); for (loop = 0; loop <= opsize; loop++) @@ -117,7 +116,6 @@ static int starfive_rsa_montgomery_form(struct starfive_cryp_ctx *ctx, rctx->csr.pka.cmd = CRYPTO_CMD_AERN; rctx->csr.pka.start = 1; rctx->csr.pka.ie = 1; - writel(rctx->csr.pka.v, cryp->base + STARFIVE_PKA_CACR_OFFSET); if (starfive_pka_wait_done(ctx)) @@ -251,12 +249,17 @@ static int starfive_rsa_enc_core(struct starfive_cryp_ctx *ctx, int enc) struct starfive_cryp_dev *cryp = ctx->cryp; struct starfive_cryp_request_ctx *rctx = ctx->rctx; struct starfive_rsa_key *key = &ctx->rsa_key; - int ret = 0; + int ret = 0, shift = 0; writel(STARFIVE_RSA_RESET, cryp->base + STARFIVE_PKA_CACR_OFFSET); - rctx->total = sg_copy_to_buffer(rctx->in_sg, rctx->nents, - rctx->rsa_data, rctx->total); + rctx->rsa_data = kzalloc(key->key_sz, GFP_KERNEL); + + if (!IS_ALIGNED(rctx->total, sizeof(u32))) + shift = sizeof(u32) - (rctx->total & 0x3); + + rctx->total = sg_copy_to_buffer(rctx->in_sg, sg_nents(rctx->in_sg), + rctx->rsa_data + shift, rctx->total); if (enc) { key->bitlen = key->e_bitlen; @@ -275,6 +278,7 @@ static int starfive_rsa_enc_core(struct starfive_cryp_ctx *ctx, int enc) rctx->rsa_data, key->key_sz, 0, 0); err_rsa_crypt: + kfree(rctx->rsa_data); writel(STARFIVE_RSA_RESET, cryp->base + STARFIVE_PKA_CACR_OFFSET); return ret; } @@ -305,7 +309,6 @@ static int starfive_rsa_enc(struct akcipher_request *req) rctx->in_sg = req->src; rctx->out_sg = req->dst; rctx->total = req->src_len; - rctx->nents = sg_nents(rctx->in_sg); ctx->rctx = rctx; return starfive_rsa_enc_core(ctx, 1);
Hardware expects RSA input plain/ciphertext to be 32-bit aligned. Allocate aligned buffer and shift data accordingly. Signed-off-by: Jia Jie Ho <jiajie.ho@starfivetech.com> --- drivers/crypto/starfive/jh7110-cryp.h | 3 +-- drivers/crypto/starfive/jh7110-rsa.c | 17 ++++++++++------- 2 files changed, 11 insertions(+), 9 deletions(-)