diff --git a/KAEOpensslEngine/src/v1/alg/digests/sec_digests.c b/KAEOpensslEngine/src/v1/alg/digests/sec_digests.c index 6b70e8a71c5fe8bdaf5fd3acf2ba1b29aa9cf01f..975120cfe0604cc7add2a6b836f4f4195b3818b8 100644 --- a/KAEOpensslEngine/src/v1/alg/digests/sec_digests.c +++ b/KAEOpensslEngine/src/v1/alg/digests/sec_digests.c @@ -34,7 +34,11 @@ #define DIGEST_SM3_SMALL_PACKET_OFFLOAD_THRESHOLD_DEFAULT (512) #define DIGEST_MD5_SMALL_PACKET_OFFLOAD_THRESHOLD_DEFAULT (8 * 1024) - +#if OPENSSL_VERSION_NUMBER >= 30000000L +#ifndef EVP_MD_CTX_md_data(ctx) +#define EVP_MD_CTX_md_data(ctx) EVP_MD_CTX_get0_md_data(ctx) +#endif +#endif struct digest_info { int nid; int is_enabled; @@ -604,6 +608,49 @@ static void sec_create_digests(void) } } +int sw_sec_digests_init(EVP_MD_CTX *ctx) +{ + int sts = 0; + int (*sw_fn_ptr)(EVP_MD_CTX *) = NULL; + sw_fn_ptr = EVP_MD_meth_get_init((EVP_MD *)EVP_sm3()); + sts = (*sw_fn_ptr)(ctx); + + return sts; +} + +int sw_sec_digests_update(EVP_MD_CTX *ctx) +{ + int sts = 0; + int (*sw_fn_ptr)(EVP_MD_CTX *) = NULL; + sw_fn_ptr = EVP_MD_meth_get_update((EVP_MD *)EVP_sm3()); + sts = (*sw_fn_ptr)(ctx); + + return sts; +} + +int sw_sec_digests_final(EVP_MD_CTX *ctx) +{ + int sts = 0; + int (*sw_fn_ptr)(EVP_MD_CTX *) = NULL; + sw_fn_ptr = EVP_MD_meth_get_final((EVP_MD *)EVP_sm3()); + sts = (*sw_fn_ptr)(ctx); + + return sts; +} + +int sw_sm3_md_methods(EVP_MD *c) +{ + int res = 1; + res &= EVP_MD_meth_set_result_size(c, 32); + res &= EVP_MD_meth_set_input_blocksize(c, SM3_CBLOCK); + res &= EVP_MD_meth_set_app_datasize(c, sizeof(EVP_MD *) + sizeof(sec_digest_priv_t)); + res &= EVP_MD_meth_set_flags(c, 0); + res &= EVP_MD_meth_set_init(c, sw_sec_digests_init); + res &= EVP_MD_meth_set_update(c, sw_sec_digests_update); + res &= EVP_MD_meth_set_final(c, sw_sec_digests_final); + return res; +} + /****************************************************************************** * function: * sec_engine_digests(ENGINE *e, @@ -643,9 +690,19 @@ int sec_engine_digests(ENGINE *e, const EVP_MD **digest, const int **nids, int n if (g_sec_digests_info[i].digest == NULL) sec_create_digests(); /*SM3 is disabled*/ - *digest = g_sec_digests_info[i].is_enabled - ? g_sec_digests_info[i].digest : (EVP_MD *)EVP_MD_meth_dup(EVP_sm3()); - return OPENSSL_SUCCESS; + if (g_sec_digests_info[i].is_enabled) { + *digest = g_sec_digests_info[i].digest; + } else { +#if OPENSSL_VERSION_NUMBER >= 30000000L + EVP_MD *tmp = EVP_MD_CTX_new(); + tmp = (EVP_MD *)EVP_MD_meth_dup(EVP_sm3()); + sw_sm3_md_methods(tmp); + *digest = tmp; +#else + *digest = (EVP_MD *)EVP_MD_meth_dup(EVP_sm3()); +#endif + } + return OPENSSL_SUCCESS; } } @@ -674,8 +731,15 @@ int sec_engine_soft_digests(ENGINE *e, const EVP_MD **digest, const int **nids, } *digest = EVP_get_digestbynid(nid); - - return OPENSSL_SUCCESS; +#if OPENSSL_VERSION_NUMBER >= 30000000L + if (nid == 1143 || nid == 40) { //sm3 and md5 + EVP_MD *tmp = EVP_MD_CTX_new(); + tmp = (EVP_MD *)EVP_MD_meth_dup(EVP_sm3()); + sw_sm3_md_methods(tmp); + *digest = tmp; + } +#endif + return OPENSSL_SUCCESS; } void sec_digests_free_methods(void) diff --git a/KAEOpensslEngine/src/v1/alg/digests/sec_digests_soft.c b/KAEOpensslEngine/src/v1/alg/digests/sec_digests_soft.c index 52b8afe8437cfd68c5f87250c70226eb1caf0fb4..c379936e78961557199557589d1b91b2411ce0d5 100644 --- a/KAEOpensslEngine/src/v1/alg/digests/sec_digests_soft.c +++ b/KAEOpensslEngine/src/v1/alg/digests/sec_digests_soft.c @@ -23,6 +23,12 @@ #include "../../utils/engine_opensslerr.h" #include "../../../utils/engine_log.h" +#if OPENSSL_VERSION_NUMBER >= 30000000L +#ifndef EVP_MD_CTX_md_data(ctx) +#define EVP_MD_CTX_md_data(ctx) EVP_MD_CTX_get0_md_data(ctx) +#endif +#endif + static int sec_digests_soft_md(sec_digest_priv_t *priv) { int app_datasize = 0; diff --git a/KAEOpensslEngine/src/v2/alg/digest/uadk_digest.c b/KAEOpensslEngine/src/v2/alg/digest/uadk_digest.c index 22f8f36192690a6bd0ab0f2a4793232ee27fb481..447fc3ad4c3f80729f0ebdf035c3b3b6600591c3 100644 --- a/KAEOpensslEngine/src/v2/alg/digest/uadk_digest.c +++ b/KAEOpensslEngine/src/v2/alg/digest/uadk_digest.c @@ -32,6 +32,11 @@ #include "v2/utils/uadk_utils.h" #include "utils/engine_log.h" +#if OPENSSL_VERSION_NUMBER >= 30000000L +#ifndef EVP_MD_CTX_md_data(ctx) +#define EVP_MD_CTX_md_data(ctx) EVP_MD_CTX_get0_md_data(ctx) +#endif +#endif #define UADK_DO_SOFT (-0xE0) #define CTX_SYNC 0 #define CTX_ASYNC 1