Commit 89646fdd authored by Hook, Gary's avatar Hook, Gary Committed by Herbert Xu
Browse files

crypto: ccp - Fix 3DES complaint from ccp-crypto module



Crypto self-tests reveal an error:

alg: skcipher: cbc-des3-ccp encryption test failed (wrong output IV) on test vector 0, cfg="in-place"

The offset value should not be recomputed when retrieving the context.
Also, a code path exists which makes decisions based on older (version 3)
hardware; a v3 device deosn't support 3DES so remove this check.

Fixes: 990672d4 ('crypto: ccp - Enable 3DES function on v5 CCPs')

Signed-off-by: default avatarGary R Hook <gary.hook@amd.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent c3b359d6
Loading
Loading
Loading
Loading
+4 −11
Original line number Diff line number Diff line
@@ -1267,6 +1267,9 @@ static int ccp_run_des3_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
	int ret;

	/* Error checks */
	if (cmd_q->ccp->vdata->version < CCP_VERSION(5, 0))
		return -EINVAL;

	if (!cmd_q->ccp->vdata->perform->des3)
		return -EINVAL;

@@ -1349,8 +1352,6 @@ static int ccp_run_des3_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
	 * passthru option to convert from big endian to little endian.
	 */
	if (des3->mode != CCP_DES3_MODE_ECB) {
		u32 load_mode;

		op.sb_ctx = cmd_q->sb_ctx;

		ret = ccp_init_dm_workarea(&ctx, cmd_q,
@@ -1366,12 +1367,8 @@ static int ccp_run_des3_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
		if (ret)
			goto e_ctx;

		if (cmd_q->ccp->vdata->version == CCP_VERSION(3, 0))
			load_mode = CCP_PASSTHRU_BYTESWAP_NOOP;
		else
			load_mode = CCP_PASSTHRU_BYTESWAP_256BIT;
		ret = ccp_copy_to_sb(cmd_q, &ctx, op.jobid, op.sb_ctx,
				     load_mode);
				     CCP_PASSTHRU_BYTESWAP_256BIT);
		if (ret) {
			cmd->engine_error = cmd_q->cmd_error;
			goto e_ctx;
@@ -1433,10 +1430,6 @@ static int ccp_run_des3_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
		}

		/* ...but we only need the last DES3_EDE_BLOCK_SIZE bytes */
		if (cmd_q->ccp->vdata->version == CCP_VERSION(3, 0))
			dm_offset = CCP_SB_BYTES - des3->iv_len;
		else
			dm_offset = 0;
		ccp_get_dm_area(&ctx, dm_offset, des3->iv, 0,
				DES3_EDE_BLOCK_SIZE);
	}