diff mbox series

crypto: starfive - Align rsa input data to 32-bit

Message ID 20240529002553.1372257-1-jiajie.ho@starfivetech.com (mailing list archive)
State Changes Requested
Delegated to: Herbert Xu
Headers show
Series crypto: starfive - Align rsa input data to 32-bit | expand

Commit Message

Jia Jie Ho May 29, 2024, 12:25 a.m. UTC
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(-)

Comments

Herbert Xu June 7, 2024, 11:16 a.m. UTC | #1
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.

Cheers,
Jia Jie Ho June 10, 2024, 10:50 a.m. UTC | #2
> 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
Jia Jie Ho June 12, 2024, 2:58 a.m. UTC | #3
> 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
Herbert Xu June 12, 2024, 7:46 a.m. UTC | #4
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 mbox series

Patch

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);