Skip to content

Commit

Permalink
crypto: sun4i-ss - simplify the pad length calculation
Browse files Browse the repository at this point in the history
When sending the last block of data to the engine, it should be padded
so that the total length of the request can be given to the engine as
the last 2 words of the last 64 bytes block.

Simplify the calculation of this pad offset.

Signed-off-by: Antoine Tenart <antoine.tenart@free-electrons.com>
Tested-by: Corentin Labbe <clabbe.montjoie@gmail.com>
Acked-by: Corentin Labbe <clabbe.montjoie@gmail.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
  • Loading branch information
Antoine Ténart authored and Herbert Xu committed Jun 19, 2017
1 parent 7e6df1f commit 214a9bd
Showing 1 changed file with 12 additions and 17 deletions.
29 changes: 12 additions & 17 deletions drivers/crypto/sunxi-ss/sun4i-ss-hash.c
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ static int sun4i_hash(struct ahash_request *areq)
*
* in_i: advancement in the current SG
*/
unsigned int i = 0, end, index, padlen, nwait, nbw = 0, j = 0, todo;
unsigned int i = 0, end, fill, min_fill, nwait, nbw = 0, j = 0, todo;
unsigned int in_i = 0;
u32 spaces, rx_cnt = SS_RX_DEFAULT, bf[32] = {0}, wb = 0, v, ivmode = 0;
struct sun4i_req_ctx *op = ahash_request_ctx(areq);
Expand All @@ -186,7 +186,7 @@ static int sun4i_hash(struct ahash_request *areq)
struct sun4i_ss_ctx *ss = tfmctx->ss;
struct scatterlist *in_sg = areq->src;
struct sg_mapping_iter mi;
int in_r, err = 0, zeros;
int in_r, err = 0;
size_t copied = 0;

dev_dbg(ss->dev, "%s %s bc=%llu len=%u mode=%x wl=%u h0=%0x",
Expand Down Expand Up @@ -387,6 +387,8 @@ static int sun4i_hash(struct ahash_request *areq)
nbw = op->len - 4 * nwait;
wb = *(u32 *)(op->buf + nwait * 4);
wb &= (0xFFFFFFFF >> (4 - nbw) * 8);

op->byte_count += nbw;
}

/* write the remaining bytes of the nbw buffer */
Expand All @@ -402,22 +404,15 @@ static int sun4i_hash(struct ahash_request *areq)
* I take the operations from other MD5/SHA1 implementations
*/

/* we have already send 4 more byte of which nbw data */
if (op->mode == SS_OP_MD5) {
index = (op->byte_count + 4) & 0x3f;
op->byte_count += nbw;
if (index > 56)
zeros = (120 - index) / 4;
else
zeros = (56 - index) / 4;
} else {
op->byte_count += nbw;
index = op->byte_count & 0x3f;
padlen = (index < 56) ? (56 - index) : ((64 + 56) - index);
zeros = (padlen - 1) / 4;
}
/* last block size */
fill = 64 - (op->byte_count % 64);
min_fill = 2 * sizeof(u32) + (nbw ? 0 : sizeof(u32));

/* if we can't fill all data, jump to the next 64 block */
if (fill < min_fill)
fill += 64;

j += zeros;
j += (fill - min_fill) / sizeof(u32);

/* write the length of data */
if (op->mode == SS_OP_SHA1) {
Expand Down

0 comments on commit 214a9bd

Please sign in to comment.