| From 20e833dc36355ed642d00067641a679c618303fa Mon Sep 17 00:00:00 2001 |
| From: "Hook, Gary" <Gary.Hook@amd.com> |
| Date: Wed, 10 Jul 2019 00:09:22 +0000 |
| Subject: crypto: ccp - memset structure fields to zero before reuse |
| |
| From: Hook, Gary <Gary.Hook@amd.com> |
| |
| commit 20e833dc36355ed642d00067641a679c618303fa upstream. |
| |
| The AES GCM function reuses an 'op' data structure, which members |
| contain values that must be cleared for each (re)use. |
| |
| This fix resolves a crypto self-test failure: |
| alg: aead: gcm-aes-ccp encryption test failed (wrong result) on test vector 2, cfg="two even aligned splits" |
| |
| Fixes: 36cf515b9bbe ("crypto: ccp - Enable support for AES GCM on v5 CCPs") |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Gary R Hook <gary.hook@amd.com> |
| Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/crypto/ccp/ccp-ops.c | 12 +++++++++++- |
| 1 file changed, 11 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/crypto/ccp/ccp-ops.c |
| +++ b/drivers/crypto/ccp/ccp-ops.c |
| @@ -622,6 +622,7 @@ static int ccp_run_aes_gcm_cmd(struct cc |
| |
| unsigned long long *final; |
| unsigned int dm_offset; |
| + unsigned int jobid; |
| unsigned int ilen; |
| bool in_place = true; /* Default value */ |
| int ret; |
| @@ -660,9 +661,11 @@ static int ccp_run_aes_gcm_cmd(struct cc |
| p_tag = scatterwalk_ffwd(sg_tag, p_inp, ilen); |
| } |
| |
| + jobid = CCP_NEW_JOBID(cmd_q->ccp); |
| + |
| memset(&op, 0, sizeof(op)); |
| op.cmd_q = cmd_q; |
| - op.jobid = CCP_NEW_JOBID(cmd_q->ccp); |
| + op.jobid = jobid; |
| op.sb_key = cmd_q->sb_key; /* Pre-allocated */ |
| op.sb_ctx = cmd_q->sb_ctx; /* Pre-allocated */ |
| op.init = 1; |
| @@ -813,6 +816,13 @@ static int ccp_run_aes_gcm_cmd(struct cc |
| final[0] = cpu_to_be64(aes->aad_len * 8); |
| final[1] = cpu_to_be64(ilen * 8); |
| |
| + memset(&op, 0, sizeof(op)); |
| + op.cmd_q = cmd_q; |
| + op.jobid = jobid; |
| + op.sb_key = cmd_q->sb_key; /* Pre-allocated */ |
| + op.sb_ctx = cmd_q->sb_ctx; /* Pre-allocated */ |
| + op.init = 1; |
| + op.u.aes.type = aes->type; |
| op.u.aes.mode = CCP_AES_MODE_GHASH; |
| op.u.aes.action = CCP_AES_GHASHFINAL; |
| op.src.type = CCP_MEMTYPE_SYSTEM; |