From: Wenkai Lin linwenkai6@hisilicon.com
Ensure that soft_ctx is initialized before invoking software calculation and reduces repeated judgments for digest soft init.
Signed-off-by: Wenkai Lin linwenkai6@hisilicon.com --- src/uadk_digest.c | 83 ++++++++++++++++++++--------------------------- 1 file changed, 36 insertions(+), 47 deletions(-)
diff --git a/src/uadk_digest.c b/src/uadk_digest.c index ed68ee2..f7882e4 100644 --- a/src/uadk_digest.c +++ b/src/uadk_digest.c @@ -189,70 +189,56 @@ static EVP_MD *uadk_sha512;
static int uadk_e_digests_soft_md(struct digest_priv_ctx *priv) { - int app_datasize = 0; + int app_datasize;
- if (priv->soft_md) + if (priv->soft_md && priv->soft_ctx) return 1;
switch (priv->e_nid) { - case NID_sm3: - priv->soft_md = EVP_sm3(); - break; case NID_md5: priv->soft_md = EVP_md5(); + /* OpenSSL 3.0 has no app_datasize, need set manually + * check crypto/evp/legacy_md5.c: md5_md as example + */ + app_datasize = EVP_MD_meth_get_app_datasize(priv->soft_md); + if (!app_datasize) + app_datasize = sizeof(EVP_MD *) + sizeof(MD5_CTX); + break; + case NID_sm3: + priv->soft_md = EVP_sm3(); + app_datasize = EVP_MD_meth_get_app_datasize(priv->soft_md); + if (!app_datasize) + app_datasize = sizeof(EVP_MD *) + sizeof(SM3_CTX); break; case NID_sha1: priv->soft_md = EVP_sha1(); + app_datasize = EVP_MD_meth_get_app_datasize(priv->soft_md); + if (!app_datasize) + app_datasize = sizeof(EVP_MD *) + sizeof(SHA_CTX); break; case NID_sha224: - priv->soft_md = EVP_sha224(); - break; case NID_sha256: - priv->soft_md = EVP_sha256(); + if (priv->e_nid == NID_sha224) + priv->soft_md = EVP_sha224(); + else + priv->soft_md = EVP_sha256(); + app_datasize = EVP_MD_meth_get_app_datasize(priv->soft_md); + if (!app_datasize) + app_datasize = sizeof(EVP_MD *) + sizeof(SHA256_CTX); break; case NID_sha384: - priv->soft_md = EVP_sha384(); - break; case NID_sha512: - priv->soft_md = EVP_sha512(); + if (priv->e_nid == NID_sha384) + priv->soft_md = EVP_sha384(); + else + priv->soft_md = EVP_sha512(); + app_datasize = EVP_MD_meth_get_app_datasize(priv->soft_md); + if (!app_datasize) + app_datasize = sizeof(EVP_MD *) + sizeof(SHA512_CTX); break; default: - break; - } - - if (unlikely(priv->soft_md == NULL)) + fprintf(stderr, "digest nid %d is invalid.\n", priv->e_nid); return 0; - - app_datasize = EVP_MD_meth_get_app_datasize(priv->soft_md); - if (app_datasize == 0) { - /* OpenSSL 3.0 has no app_datasize, need set manually - * check crypto/evp/legacy_md5.c: md5_md as example - */ - switch (priv->e_nid) { - case NID_sm3: - app_datasize = sizeof(EVP_MD *) + sizeof(SM3_CTX); - break; - case NID_md5: - app_datasize = sizeof(EVP_MD *) + sizeof(MD5_CTX); - break; - case NID_sha1: - app_datasize = sizeof(EVP_MD *) + sizeof(SHA_CTX); - break; - case NID_sha224: - app_datasize = sizeof(EVP_MD *) + sizeof(SHA256_CTX); - break; - case NID_sha256: - app_datasize = sizeof(EVP_MD *) + sizeof(SHA256_CTX); - break; - case NID_sha384: - app_datasize = sizeof(EVP_MD *) + sizeof(SHA512_CTX); - break; - case NID_sha512: - app_datasize = sizeof(EVP_MD *) + sizeof(SHA512_CTX); - break; - default: - break; - } }
if (priv->soft_ctx == NULL) { @@ -262,8 +248,10 @@ static int uadk_e_digests_soft_md(struct digest_priv_ctx *priv) return 0;
ctx->md_data = OPENSSL_malloc(app_datasize); - if (ctx->md_data == NULL) + if (ctx->md_data == NULL) { + EVP_MD_CTX_free(ctx); return 0; + }
priv->soft_ctx = ctx; priv->app_datasize = app_datasize; @@ -1015,6 +1003,7 @@ static int uadk_e_digest_copy(EVP_MD_CTX *to, const EVP_MD_CTX *from) }
if (t->soft_ctx) { + t->soft_md = NULL; t->soft_ctx = NULL; ret = digest_soft_init(t); if (!ret)