diff mbox series

[v2] crypto: starfive - Align rsa input data to 32-bit

Message ID 20240613083942.760182-1-jiajie.ho@starfivetech.com
State New
Headers show
Series [v2] crypto: starfive - Align rsa input data to 32-bit | expand

Commit Message

Jia Jie Ho June 13, 2024, 8:39 a.m. UTC
Hardware expects RSA input plain/ciphertext to be 32-bit aligned.
Set fixed length for preallocated buffer to the maximum supported
keysize of the hardware and shift input text accordingly.

v1->v2: Build the extra space required for shifting into reqsize.

Signed-off-by: Jia Jie Ho <jiajie.ho@starfivetech.com>
---
 drivers/crypto/starfive/jh7110-cryp.h |  4 ++--
 drivers/crypto/starfive/jh7110-rsa.c  | 17 +++++++++--------
 2 files changed, 11 insertions(+), 10 deletions(-)

Comments

Herbert Xu June 21, 2024, 11:39 a.m. UTC | #1
On Thu, Jun 13, 2024 at 04:39:42PM +0800, Jia Jie Ho wrote:
>
> @@ -217,12 +218,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[STARFIVE_RSA_MAX_KEYSZ];

I think you should retain the aligned attribute.

> @@ -74,14 +73,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;

This is a bit confusing.  Perhaps use 4 instead of sizeof(u32), i.e.

	int count = (ALIGN(rctx->total, 4) / 4) - 1;

>  	int loop;
>  	u32 temp;
>  	u8 opsize;
>  
>  	opsize = (bit_len - 1) >> 5;
>  	rctx->csr.pka.v = 0;
> -

Please do not make unrelated changes like this.

> -	rctx->total = sg_copy_to_buffer(rctx->in_sg, rctx->nents,
> -					rctx->rsa_data, rctx->total);
> +	if (!IS_ALIGNED(rctx->total, sizeof(u32))) {
> +		shift = sizeof(u32) - (rctx->total & 0x3);
> +		memset(rctx->rsa_data, 0, shift);
> +	}
> +
> +	rctx->total = sg_copy_to_buffer(rctx->in_sg, sg_nents(rctx->in_sg),
> +					rctx->rsa_data + shift, rctx->total);

The rctx->nents change appears to be unrelated to this patch so
if you want to do it please move it to another patch.

Thanks,
Jia Jie Ho June 24, 2024, 2:41 a.m. UTC | #2
> > @@ -217,12 +218,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[STARFIVE_RSA_MAX_KEYSZ];
> 
> I think you should retain the aligned attribute.

I'll add this back in the next version.

> > @@ -74,14 +73,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;
> 
> This is a bit confusing.  Perhaps use 4 instead of sizeof(u32), i.e.
> 
> 	int count = (ALIGN(rctx->total, 4) / 4) - 1;
> 

Will update this too.

> >  	int loop;
> >  	u32 temp;
> >  	u8 opsize;
> >
> >  	opsize = (bit_len - 1) >> 5;
> >  	rctx->csr.pka.v = 0;
> > -
> 
> Please do not make unrelated changes like this.

Got it. I'll remove it and the unrelated changes in the next version.
Thanks for review this patch.

Best regards,
Jia Jie
diff mbox series

Patch

diff --git a/drivers/crypto/starfive/jh7110-cryp.h b/drivers/crypto/starfive/jh7110-cryp.h
index 494a74f52706..ad0bc8878522 100644
--- a/drivers/crypto/starfive/jh7110-cryp.h
+++ b/drivers/crypto/starfive/jh7110-cryp.h
@@ -30,6 +30,7 @@ 
 #define MAX_KEY_SIZE				SHA512_BLOCK_SIZE
 #define STARFIVE_AES_IV_LEN			AES_BLOCK_SIZE
 #define STARFIVE_AES_CTR_LEN			AES_BLOCK_SIZE
+#define STARFIVE_RSA_MAX_KEYSZ			256
 
 union starfive_aes_csr {
 	u32 v;
@@ -217,12 +218,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[STARFIVE_RSA_MAX_KEYSZ];
 };
 
 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..f8a1bc5dcf0f 100644
--- a/drivers/crypto/starfive/jh7110-rsa.c
+++ b/drivers/crypto/starfive/jh7110-rsa.c
@@ -31,7 +31,6 @@ 
 /* A * A * R mod N ==> A */
 #define CRYPTO_CMD_AARN			0x7
 
-#define STARFIVE_RSA_MAX_KEYSZ		256
 #define STARFIVE_RSA_RESET		0x2
 
 static inline int starfive_pka_wait_done(struct starfive_cryp_ctx *ctx)
@@ -74,14 +73,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 +115,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 +248,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);
+	if (!IS_ALIGNED(rctx->total, sizeof(u32))) {
+		shift = sizeof(u32) - (rctx->total & 0x3);
+		memset(rctx->rsa_data, 0, shift);
+	}
+
+	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;
@@ -305,7 +307,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);