
From: Wenkai Lin <linwenkai6@hisilicon.com> In the event of a soft failure, an error should be returned to avoid errors such as empty addresses in subsequent steps. Signed-off-by: Wenkai Lin <linwenkai6@hisilicon.com> Signed-off-by: JiangShui Yang <yangjiangshui@h-partners.com> --- src/uadk_digest.c | 38 ++++++++++++++++++++++++++++---------- src/uadk_prov_digest.c | 40 ++++++++++++++++++++++++++++++---------- 2 files changed, 58 insertions(+), 20 deletions(-) diff --git a/src/uadk_digest.c b/src/uadk_digest.c index ed68ee2..cb593a8 100644 --- a/src/uadk_digest.c +++ b/src/uadk_digest.c @@ -321,16 +321,23 @@ static void digest_soft_cleanup(struct digest_priv_ctx *md_ctx) static int uadk_e_digest_soft_work(struct digest_priv_ctx *md_ctx, int len, unsigned char *digest) { - (void)digest_soft_init(md_ctx); + int ret; - if (len != 0) - (void)digest_soft_update(md_ctx, md_ctx->data, len); + ret = digest_soft_init(md_ctx); + if (unlikely(!ret)) + return 0; - (void)digest_soft_final(md_ctx, digest); + if (len != 0) { + ret = digest_soft_update(md_ctx, md_ctx->data, len); + if (unlikely(!ret)) + goto out; + } - digest_soft_cleanup(md_ctx); + ret = digest_soft_final(md_ctx, digest); - return 1; +out: + digest_soft_cleanup(md_ctx); + return ret; } static int uadk_engine_digests(ENGINE *e, const EVP_MD **digest, @@ -730,19 +737,30 @@ static int digest_update_inner(EVP_MD_CTX *ctx, const void *data, size_t data_le do_soft_digest: if (priv->state == SEC_DIGEST_FIRST_UPDATING) { priv->switch_flag = UADK_DO_SOFT; - (void)digest_soft_init(priv); + ret = digest_soft_init(priv); + if (!ret) + return ret; /* filling buf has been executed */ if (processing_len < DIGEST_BLOCK_SIZE) { ret = digest_soft_update(priv, priv->data, DIGEST_BLOCK_SIZE); - if (ret != 1) - return ret; + if (!ret) + goto out; } - return digest_soft_update(priv, tmpdata, left_len); + ret = digest_soft_update(priv, tmpdata, left_len); + if (!ret) + goto out; + + /* the soft ctx will be free in the final stage. */ + return ret; } fprintf(stderr, "do soft digest failed during updating!\n"); return 0; + +out: + digest_soft_cleanup(priv); + return ret; } static int uadk_e_digest_update(EVP_MD_CTX *ctx, const void *data, size_t data_len) diff --git a/src/uadk_prov_digest.c b/src/uadk_prov_digest.c index 562e786..a2a5f09 100644 --- a/src/uadk_prov_digest.c +++ b/src/uadk_prov_digest.c @@ -218,18 +218,26 @@ static void digest_soft_cleanup(struct digest_priv_ctx *priv) static int uadk_digest_soft_work(struct digest_priv_ctx *priv, int len, unsigned char *digest) { + int ret; + if (!priv->soft_md) return UADK_DIGEST_FAIL; - uadk_digest_soft_init(priv); + ret = uadk_digest_soft_init(priv); + if (unlikely(ret == UADK_DIGEST_FAIL)) + return UADK_DIGEST_FAIL; - if (len != 0) - uadk_digest_soft_update(priv, priv->data, len); + if (len != 0) { + ret = uadk_digest_soft_update(priv, priv->data, len); + if (unlikely(ret == UADK_DIGEST_FAIL)) + goto out; + } - uadk_digest_soft_final(priv, digest); - digest_soft_cleanup(priv); + ret = uadk_digest_soft_final(priv, digest); - return UADK_DIGEST_SUCCESS; +out: + digest_soft_cleanup(priv); + return ret; } static int uadk_digest_poll(void *ctx) @@ -455,19 +463,31 @@ static int uadk_digest_update_inner(struct digest_priv_ctx *priv, const void *da do_soft_digest: if (priv->state == SEC_DIGEST_FIRST_UPDATING) { priv->switch_flag = UADK_DO_SOFT; - uadk_digest_soft_init(priv); + ret = uadk_digest_soft_init(priv); + if (!ret) + return ret; + /* filling buf has been executed */ if (processing_len < DIGEST_BLOCK_SIZE) { ret = uadk_digest_soft_update(priv, priv->data, DIGEST_BLOCK_SIZE); - if (ret != 1) - return ret; + if (!ret) + goto out; } - return uadk_digest_soft_update(priv, input_data, remain_len); + ret = uadk_digest_soft_update(priv, input_data, remain_len); + if (!ret) + goto out; + + /* the soft ctx will be free in the final stage. */ + return ret; } fprintf(stderr, "do soft digest failed during updating!\n"); return UADK_DIGEST_FAIL; + +out: + digest_soft_cleanup(priv); + return ret; } static int uadk_digest_update(struct digest_priv_ctx *priv, const void *data, size_t data_len) -- 2.33.0