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 |
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,
> > @@ -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 --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);
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(-)