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

Commit 393897c5 authored by Tom Lendacky's avatar Tom Lendacky Committed by Herbert Xu
Browse files

crypto: ccp - Check for caller result area before using it



For a hash operation, the caller doesn't have to supply a result
area on every call so don't use it / update it if it hasn't
been supplied.

Signed-off-by: default avatarTom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 77dc4a51
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -43,6 +43,8 @@ static int ccp_aes_cmac_complete(struct crypto_async_request *async_req,
	} else
		rctx->buf_count = 0;

	/* Update result area if supplied */
	if (req->result)
		memcpy(req->result, rctx->iv, digest_size);

e_free:
+5 −2
Original line number Diff line number Diff line
@@ -74,6 +74,7 @@ static int ccp_sha_finish_hmac(struct crypto_async_request *async_req)
	struct ahash_request *req = ahash_request_cast(async_req);
	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
	struct ccp_ctx *ctx = crypto_ahash_ctx(tfm);
	struct ccp_sha_req_ctx *rctx = ahash_request_ctx(req);
	struct scatterlist sg[2];
	unsigned int block_size =
		crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
@@ -81,7 +82,7 @@ static int ccp_sha_finish_hmac(struct crypto_async_request *async_req)

	sg_init_table(sg, ARRAY_SIZE(sg));
	sg_set_buf(&sg[0], ctx->u.sha.opad, block_size);
	sg_set_buf(&sg[1], req->result, digest_size);
	sg_set_buf(&sg[1], rctx->ctx, digest_size);

	return ccp_sync_hash(ctx->u.sha.hmac_tfm, req->result, sg,
			     block_size + digest_size);
@@ -106,6 +107,8 @@ static int ccp_sha_complete(struct crypto_async_request *async_req, int ret)
	} else
		rctx->buf_count = 0;

	/* Update result area if supplied */
	if (req->result)
		memcpy(req->result, rctx->ctx, digest_size);

	/* If we're doing an HMAC, we need to perform that on the final op */