crypto: ccp - memset structure fields to zero before reuse
authorHook, Gary <Gary.Hook@amd.com>
Wed, 10 Jul 2019 00:09:22 +0000 (00:09 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 26 Jul 2019 07:14:20 +0000 (09:14 +0200)
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

index 0ea43cd..5df77e4 100644 (file)
@@ -625,6 +625,7 @@ static int ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q,
 
        unsigned long long *final;
        unsigned int dm_offset;
+       unsigned int jobid;
        unsigned int ilen;
        bool in_place = true; /* Default value */
        int ret;
@@ -663,9 +664,11 @@ static int ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q,
                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;
@@ -816,6 +819,13 @@ static int ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q,
        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;