Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3c8d758a authored by Dmitry Kasatkin's avatar Dmitry Kasatkin Committed by Herbert Xu
Browse files

crypto: omap-sham - hash-in-progress is stored in hw format



Hash-in-progress is now stored in hw format.
Only on final call, hash is converted to correct format.
Speedup copy procedure and will allow to use OMAP burst mode.

Signed-off-by: default avatarDmitry Kasatkin <dmitry.kasatkin@nokia.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 798eed5d
Loading
Loading
Loading
Loading
+24 −14
Original line number Diff line number Diff line
@@ -204,24 +204,35 @@ static void omap_sham_copy_hash(struct ahash_request *req, int out)
	u32 *hash = (u32 *)ctx->digest;
	int i;

	/* MD5 is almost unused. So copy sha1 size to reduce code */
	for (i = 0; i < SHA1_DIGEST_SIZE / sizeof(u32); i++) {
		if (out)
			hash[i] = omap_sham_read(ctx->dd,
						SHA_REG_DIGEST(i));
		else
			omap_sham_write(ctx->dd,
					SHA_REG_DIGEST(i), hash[i]);
	}
}

static void omap_sham_copy_ready_hash(struct ahash_request *req)
{
	struct omap_sham_reqctx *ctx = ahash_request_ctx(req);
	u32 *in = (u32 *)ctx->digest;
	u32 *hash = (u32 *)req->result;
	int i;

	if (!hash)
		return;

	if (likely(ctx->flags & FLAGS_SHA1)) {
		/* SHA1 results are in big endian */
		for (i = 0; i < SHA1_DIGEST_SIZE / sizeof(u32); i++)
			if (out)
				hash[i] = be32_to_cpu(omap_sham_read(ctx->dd,
							SHA_REG_DIGEST(i)));
			else
				omap_sham_write(ctx->dd, SHA_REG_DIGEST(i),
							cpu_to_be32(hash[i]));
			hash[i] = be32_to_cpu(in[i]);
	} else {
		/* MD5 results are in little endian */
		for (i = 0; i < MD5_DIGEST_SIZE / sizeof(u32); i++)
			if (out)
				hash[i] = le32_to_cpu(omap_sham_read(ctx->dd,
							SHA_REG_DIGEST(i)));
			else
				omap_sham_write(ctx->dd, SHA_REG_DIGEST(i),
							cpu_to_le32(hash[i]));
			hash[i] = le32_to_cpu(in[i]);
	}
}

@@ -474,8 +485,7 @@ static void omap_sham_cleanup(struct ahash_request *req)
	spin_unlock_irqrestore(&dd->lock, flags);

	if (ctx->digcnt)
		memcpy(req->result, ctx->digest, (ctx->flags & FLAGS_SHA1) ?
				SHA1_DIGEST_SIZE : MD5_DIGEST_SIZE);
		omap_sham_copy_ready_hash(req);

	dev_dbg(dd->dev, "digcnt: %d, bufcnt: %d\n", ctx->digcnt, ctx->bufcnt);
}