crypto: ccp - Replace BUG_ON with WARN_ON and a return code
Replace the usage of BUG_ON with WARN_ON and return an error. Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
9196d9676f
commit
355eba5dda
4 changed files with 105 additions and 42 deletions
|
@ -118,10 +118,19 @@ static int ccp_do_cmac_update(struct ahash_request *req, unsigned int nbytes,
|
||||||
if (rctx->buf_count) {
|
if (rctx->buf_count) {
|
||||||
sg_init_one(&rctx->buf_sg, rctx->buf, rctx->buf_count);
|
sg_init_one(&rctx->buf_sg, rctx->buf, rctx->buf_count);
|
||||||
sg = ccp_crypto_sg_table_add(&rctx->data_sg, &rctx->buf_sg);
|
sg = ccp_crypto_sg_table_add(&rctx->data_sg, &rctx->buf_sg);
|
||||||
|
if (!sg) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto e_free;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nbytes)
|
if (nbytes) {
|
||||||
sg = ccp_crypto_sg_table_add(&rctx->data_sg, req->src);
|
sg = ccp_crypto_sg_table_add(&rctx->data_sg, req->src);
|
||||||
|
if (!sg) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto e_free;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (need_pad) {
|
if (need_pad) {
|
||||||
int pad_length = block_size - (len & (block_size - 1));
|
int pad_length = block_size - (len & (block_size - 1));
|
||||||
|
@ -132,6 +141,10 @@ static int ccp_do_cmac_update(struct ahash_request *req, unsigned int nbytes,
|
||||||
rctx->pad[0] = 0x80;
|
rctx->pad[0] = 0x80;
|
||||||
sg_init_one(&rctx->pad_sg, rctx->pad, pad_length);
|
sg_init_one(&rctx->pad_sg, rctx->pad, pad_length);
|
||||||
sg = ccp_crypto_sg_table_add(&rctx->data_sg, &rctx->pad_sg);
|
sg = ccp_crypto_sg_table_add(&rctx->data_sg, &rctx->pad_sg);
|
||||||
|
if (!sg) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto e_free;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (sg) {
|
if (sg) {
|
||||||
sg_mark_end(sg);
|
sg_mark_end(sg);
|
||||||
|
@ -162,6 +175,11 @@ static int ccp_do_cmac_update(struct ahash_request *req, unsigned int nbytes,
|
||||||
|
|
||||||
ret = ccp_crypto_enqueue_request(&req->base, &rctx->cmd);
|
ret = ccp_crypto_enqueue_request(&req->base, &rctx->cmd);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
e_free:
|
||||||
|
sg_free_table(&rctx->data_sg);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -305,14 +305,16 @@ struct scatterlist *ccp_crypto_sg_table_add(struct sg_table *table,
|
||||||
for (sg = table->sgl; sg; sg = sg_next(sg))
|
for (sg = table->sgl; sg; sg = sg_next(sg))
|
||||||
if (!sg_page(sg))
|
if (!sg_page(sg))
|
||||||
break;
|
break;
|
||||||
BUG_ON(!sg);
|
if (WARN_ON(!sg))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
for (; sg && sg_add; sg = sg_next(sg), sg_add = sg_next(sg_add)) {
|
for (; sg && sg_add; sg = sg_next(sg), sg_add = sg_next(sg_add)) {
|
||||||
sg_set_page(sg, sg_page(sg_add), sg_add->length,
|
sg_set_page(sg, sg_page(sg_add), sg_add->length,
|
||||||
sg_add->offset);
|
sg_add->offset);
|
||||||
sg_last = sg;
|
sg_last = sg;
|
||||||
}
|
}
|
||||||
BUG_ON(sg_add);
|
if (WARN_ON(sg_add))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
return sg_last;
|
return sg_last;
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,7 +107,15 @@ static int ccp_do_sha_update(struct ahash_request *req, unsigned int nbytes,
|
||||||
|
|
||||||
sg_init_one(&rctx->buf_sg, rctx->buf, rctx->buf_count);
|
sg_init_one(&rctx->buf_sg, rctx->buf, rctx->buf_count);
|
||||||
sg = ccp_crypto_sg_table_add(&rctx->data_sg, &rctx->buf_sg);
|
sg = ccp_crypto_sg_table_add(&rctx->data_sg, &rctx->buf_sg);
|
||||||
|
if (!sg) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto e_free;
|
||||||
|
}
|
||||||
sg = ccp_crypto_sg_table_add(&rctx->data_sg, req->src);
|
sg = ccp_crypto_sg_table_add(&rctx->data_sg, req->src);
|
||||||
|
if (!sg) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto e_free;
|
||||||
|
}
|
||||||
sg_mark_end(sg);
|
sg_mark_end(sg);
|
||||||
|
|
||||||
sg = rctx->data_sg.sgl;
|
sg = rctx->data_sg.sgl;
|
||||||
|
@ -141,6 +149,11 @@ static int ccp_do_sha_update(struct ahash_request *req, unsigned int nbytes,
|
||||||
|
|
||||||
ret = ccp_crypto_enqueue_request(&req->base, &rctx->cmd);
|
ret = ccp_crypto_enqueue_request(&req->base, &rctx->cmd);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
e_free:
|
||||||
|
sg_free_table(&rctx->data_sg);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -611,15 +611,16 @@ static void ccp_get_dm_area(struct ccp_dm_workarea *wa, unsigned int wa_offset,
|
||||||
1);
|
1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ccp_reverse_set_dm_area(struct ccp_dm_workarea *wa,
|
static int ccp_reverse_set_dm_area(struct ccp_dm_workarea *wa,
|
||||||
struct scatterlist *sg,
|
struct scatterlist *sg,
|
||||||
unsigned int len, unsigned int se_len,
|
unsigned int len, unsigned int se_len,
|
||||||
bool sign_extend)
|
bool sign_extend)
|
||||||
{
|
{
|
||||||
unsigned int nbytes, sg_offset, dm_offset, ksb_len, i;
|
unsigned int nbytes, sg_offset, dm_offset, ksb_len, i;
|
||||||
u8 buffer[CCP_REVERSE_BUF_SIZE];
|
u8 buffer[CCP_REVERSE_BUF_SIZE];
|
||||||
|
|
||||||
BUG_ON(se_len > sizeof(buffer));
|
if (WARN_ON(se_len > sizeof(buffer)))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
sg_offset = len;
|
sg_offset = len;
|
||||||
dm_offset = 0;
|
dm_offset = 0;
|
||||||
|
@ -642,6 +643,8 @@ static void ccp_reverse_set_dm_area(struct ccp_dm_workarea *wa,
|
||||||
se_len - ksb_len);
|
se_len - ksb_len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ccp_reverse_get_dm_area(struct ccp_dm_workarea *wa,
|
static void ccp_reverse_get_dm_area(struct ccp_dm_workarea *wa,
|
||||||
|
@ -1606,8 +1609,10 @@ static int ccp_run_rsa_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
|
||||||
if (ret)
|
if (ret)
|
||||||
goto e_ksb;
|
goto e_ksb;
|
||||||
|
|
||||||
ccp_reverse_set_dm_area(&exp, rsa->exp, rsa->exp_len, CCP_KSB_BYTES,
|
ret = ccp_reverse_set_dm_area(&exp, rsa->exp, rsa->exp_len,
|
||||||
false);
|
CCP_KSB_BYTES, false);
|
||||||
|
if (ret)
|
||||||
|
goto e_exp;
|
||||||
ret = ccp_copy_to_ksb(cmd_q, &exp, op.jobid, op.ksb_key,
|
ret = ccp_copy_to_ksb(cmd_q, &exp, op.jobid, op.ksb_key,
|
||||||
CCP_PASSTHRU_BYTESWAP_NOOP);
|
CCP_PASSTHRU_BYTESWAP_NOOP);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -1623,11 +1628,15 @@ static int ccp_run_rsa_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
|
||||||
if (ret)
|
if (ret)
|
||||||
goto e_exp;
|
goto e_exp;
|
||||||
|
|
||||||
ccp_reverse_set_dm_area(&src, rsa->mod, rsa->mod_len, CCP_KSB_BYTES,
|
ret = ccp_reverse_set_dm_area(&src, rsa->mod, rsa->mod_len,
|
||||||
false);
|
CCP_KSB_BYTES, false);
|
||||||
|
if (ret)
|
||||||
|
goto e_src;
|
||||||
src.address += o_len; /* Adjust the address for the copy operation */
|
src.address += o_len; /* Adjust the address for the copy operation */
|
||||||
ccp_reverse_set_dm_area(&src, rsa->src, rsa->src_len, CCP_KSB_BYTES,
|
ret = ccp_reverse_set_dm_area(&src, rsa->src, rsa->src_len,
|
||||||
false);
|
CCP_KSB_BYTES, false);
|
||||||
|
if (ret)
|
||||||
|
goto e_src;
|
||||||
src.address -= o_len; /* Reset the address to original value */
|
src.address -= o_len; /* Reset the address to original value */
|
||||||
|
|
||||||
/* Prepare the output area for the operation */
|
/* Prepare the output area for the operation */
|
||||||
|
@ -1841,21 +1850,27 @@ static int ccp_run_ecc_mm_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
|
||||||
save = src.address;
|
save = src.address;
|
||||||
|
|
||||||
/* Copy the ECC modulus */
|
/* Copy the ECC modulus */
|
||||||
ccp_reverse_set_dm_area(&src, ecc->mod, ecc->mod_len,
|
ret = ccp_reverse_set_dm_area(&src, ecc->mod, ecc->mod_len,
|
||||||
CCP_ECC_OPERAND_SIZE, false);
|
CCP_ECC_OPERAND_SIZE, false);
|
||||||
|
if (ret)
|
||||||
|
goto e_src;
|
||||||
src.address += CCP_ECC_OPERAND_SIZE;
|
src.address += CCP_ECC_OPERAND_SIZE;
|
||||||
|
|
||||||
/* Copy the first operand */
|
/* Copy the first operand */
|
||||||
ccp_reverse_set_dm_area(&src, ecc->u.mm.operand_1,
|
ret = ccp_reverse_set_dm_area(&src, ecc->u.mm.operand_1,
|
||||||
ecc->u.mm.operand_1_len,
|
ecc->u.mm.operand_1_len,
|
||||||
CCP_ECC_OPERAND_SIZE, false);
|
CCP_ECC_OPERAND_SIZE, false);
|
||||||
|
if (ret)
|
||||||
|
goto e_src;
|
||||||
src.address += CCP_ECC_OPERAND_SIZE;
|
src.address += CCP_ECC_OPERAND_SIZE;
|
||||||
|
|
||||||
if (ecc->function != CCP_ECC_FUNCTION_MINV_384BIT) {
|
if (ecc->function != CCP_ECC_FUNCTION_MINV_384BIT) {
|
||||||
/* Copy the second operand */
|
/* Copy the second operand */
|
||||||
ccp_reverse_set_dm_area(&src, ecc->u.mm.operand_2,
|
ret = ccp_reverse_set_dm_area(&src, ecc->u.mm.operand_2,
|
||||||
ecc->u.mm.operand_2_len,
|
ecc->u.mm.operand_2_len,
|
||||||
CCP_ECC_OPERAND_SIZE, false);
|
CCP_ECC_OPERAND_SIZE, false);
|
||||||
|
if (ret)
|
||||||
|
goto e_src;
|
||||||
src.address += CCP_ECC_OPERAND_SIZE;
|
src.address += CCP_ECC_OPERAND_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1960,18 +1975,24 @@ static int ccp_run_ecc_pm_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
|
||||||
save = src.address;
|
save = src.address;
|
||||||
|
|
||||||
/* Copy the ECC modulus */
|
/* Copy the ECC modulus */
|
||||||
ccp_reverse_set_dm_area(&src, ecc->mod, ecc->mod_len,
|
ret = ccp_reverse_set_dm_area(&src, ecc->mod, ecc->mod_len,
|
||||||
CCP_ECC_OPERAND_SIZE, false);
|
CCP_ECC_OPERAND_SIZE, false);
|
||||||
|
if (ret)
|
||||||
|
goto e_src;
|
||||||
src.address += CCP_ECC_OPERAND_SIZE;
|
src.address += CCP_ECC_OPERAND_SIZE;
|
||||||
|
|
||||||
/* Copy the first point X and Y coordinate */
|
/* Copy the first point X and Y coordinate */
|
||||||
ccp_reverse_set_dm_area(&src, ecc->u.pm.point_1.x,
|
ret = ccp_reverse_set_dm_area(&src, ecc->u.pm.point_1.x,
|
||||||
ecc->u.pm.point_1.x_len,
|
ecc->u.pm.point_1.x_len,
|
||||||
CCP_ECC_OPERAND_SIZE, false);
|
CCP_ECC_OPERAND_SIZE, false);
|
||||||
|
if (ret)
|
||||||
|
goto e_src;
|
||||||
src.address += CCP_ECC_OPERAND_SIZE;
|
src.address += CCP_ECC_OPERAND_SIZE;
|
||||||
ccp_reverse_set_dm_area(&src, ecc->u.pm.point_1.y,
|
ret = ccp_reverse_set_dm_area(&src, ecc->u.pm.point_1.y,
|
||||||
ecc->u.pm.point_1.y_len,
|
ecc->u.pm.point_1.y_len,
|
||||||
CCP_ECC_OPERAND_SIZE, false);
|
CCP_ECC_OPERAND_SIZE, false);
|
||||||
|
if (ret)
|
||||||
|
goto e_src;
|
||||||
src.address += CCP_ECC_OPERAND_SIZE;
|
src.address += CCP_ECC_OPERAND_SIZE;
|
||||||
|
|
||||||
/* Set the first point Z coordianate to 1 */
|
/* Set the first point Z coordianate to 1 */
|
||||||
|
@ -1980,13 +2001,17 @@ static int ccp_run_ecc_pm_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
|
||||||
|
|
||||||
if (ecc->function == CCP_ECC_FUNCTION_PADD_384BIT) {
|
if (ecc->function == CCP_ECC_FUNCTION_PADD_384BIT) {
|
||||||
/* Copy the second point X and Y coordinate */
|
/* Copy the second point X and Y coordinate */
|
||||||
ccp_reverse_set_dm_area(&src, ecc->u.pm.point_2.x,
|
ret = ccp_reverse_set_dm_area(&src, ecc->u.pm.point_2.x,
|
||||||
ecc->u.pm.point_2.x_len,
|
ecc->u.pm.point_2.x_len,
|
||||||
CCP_ECC_OPERAND_SIZE, false);
|
CCP_ECC_OPERAND_SIZE, false);
|
||||||
|
if (ret)
|
||||||
|
goto e_src;
|
||||||
src.address += CCP_ECC_OPERAND_SIZE;
|
src.address += CCP_ECC_OPERAND_SIZE;
|
||||||
ccp_reverse_set_dm_area(&src, ecc->u.pm.point_2.y,
|
ret = ccp_reverse_set_dm_area(&src, ecc->u.pm.point_2.y,
|
||||||
ecc->u.pm.point_2.y_len,
|
ecc->u.pm.point_2.y_len,
|
||||||
CCP_ECC_OPERAND_SIZE, false);
|
CCP_ECC_OPERAND_SIZE, false);
|
||||||
|
if (ret)
|
||||||
|
goto e_src;
|
||||||
src.address += CCP_ECC_OPERAND_SIZE;
|
src.address += CCP_ECC_OPERAND_SIZE;
|
||||||
|
|
||||||
/* Set the second point Z coordianate to 1 */
|
/* Set the second point Z coordianate to 1 */
|
||||||
|
@ -1994,16 +2019,21 @@ static int ccp_run_ecc_pm_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
|
||||||
src.address += CCP_ECC_OPERAND_SIZE;
|
src.address += CCP_ECC_OPERAND_SIZE;
|
||||||
} else {
|
} else {
|
||||||
/* Copy the Domain "a" parameter */
|
/* Copy the Domain "a" parameter */
|
||||||
ccp_reverse_set_dm_area(&src, ecc->u.pm.domain_a,
|
ret = ccp_reverse_set_dm_area(&src, ecc->u.pm.domain_a,
|
||||||
ecc->u.pm.domain_a_len,
|
ecc->u.pm.domain_a_len,
|
||||||
CCP_ECC_OPERAND_SIZE, false);
|
CCP_ECC_OPERAND_SIZE, false);
|
||||||
|
if (ret)
|
||||||
|
goto e_src;
|
||||||
src.address += CCP_ECC_OPERAND_SIZE;
|
src.address += CCP_ECC_OPERAND_SIZE;
|
||||||
|
|
||||||
if (ecc->function == CCP_ECC_FUNCTION_PMUL_384BIT) {
|
if (ecc->function == CCP_ECC_FUNCTION_PMUL_384BIT) {
|
||||||
/* Copy the scalar value */
|
/* Copy the scalar value */
|
||||||
ccp_reverse_set_dm_area(&src, ecc->u.pm.scalar,
|
ret = ccp_reverse_set_dm_area(&src, ecc->u.pm.scalar,
|
||||||
ecc->u.pm.scalar_len,
|
ecc->u.pm.scalar_len,
|
||||||
CCP_ECC_OPERAND_SIZE, false);
|
CCP_ECC_OPERAND_SIZE,
|
||||||
|
false);
|
||||||
|
if (ret)
|
||||||
|
goto e_src;
|
||||||
src.address += CCP_ECC_OPERAND_SIZE;
|
src.address += CCP_ECC_OPERAND_SIZE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue