From eca4ec079ef076296c791cea431f01b04dda412a Mon Sep 17 00:00:00 2001
From: Weili Qian <qianweili@huawei.com>
Date: Thu, 19 Dec 2024 15:57:51 +0800
Subject: [PATCH 02/10] uadk_provider: move functions to uadk_prov_pkey

The ecc algorithm initialization and resource release
processes are the same. Therefore, the functions uadk_prov_sm2_init()
and uadk_prov_sm2_uninit() functions are moved from uadk_prov_sm2.c to
uadk_prov_pkey.c and change the functions name.

Signed-off-by: Weili Qian <qianweili@huawei.com>
Signed-off-by: JiangShui Yang <yangjiangshui@h-partners.com>
---
 src/uadk_prov.h      |  2 +-
 src/uadk_prov_init.c |  2 +-
 src/uadk_prov_pkey.c | 44 ++++++++++++++++++++++++++++++++
 src/uadk_prov_pkey.h |  2 +-
 src/uadk_prov_sm2.c  | 61 ++++++--------------------------------------
 5 files changed, 55 insertions(+), 56 deletions(-)

diff --git a/src/uadk_prov.h b/src/uadk_prov.h
index ac82245..e85aff8 100644
--- a/src/uadk_prov.h
+++ b/src/uadk_prov.h
@@ -184,7 +184,7 @@ void uadk_prov_destroy_cipher(void);
 void uadk_prov_destroy_aead(void);
 void uadk_prov_destroy_rsa(void);
 void uadk_prov_destroy_dh(void);
-void uadk_prov_sm2_uninit(void);
+void uadk_prov_ecc_uninit(void);
 void uadk_prov_dh_uninit(void);
 int uadk_prov_cipher_version(void);
 
diff --git a/src/uadk_prov_init.c b/src/uadk_prov_init.c
index 772ddbb..55202ae 100644
--- a/src/uadk_prov_init.c
+++ b/src/uadk_prov_init.c
@@ -240,7 +240,7 @@ static void uadk_teardown(void *provctx)
 	uadk_prov_destroy_cipher();
 	uadk_prov_destroy_aead();
 	uadk_prov_destroy_rsa();
-	uadk_prov_sm2_uninit();
+	uadk_prov_ecc_uninit();
 	uadk_prov_dh_uninit();
 	OPENSSL_free(ctx);
 	OSSL_PROVIDER_unload(prov);
diff --git a/src/uadk_prov_pkey.c b/src/uadk_prov_pkey.c
index d1f7afe..6e0612e 100644
--- a/src/uadk_prov_pkey.c
+++ b/src/uadk_prov_pkey.c
@@ -34,6 +34,13 @@ static int p_keymgmt_support_state[KEYMGMT_TYPE];
 static int p_signature_support_state[SIGNATURE_TYPE];
 static int p_asym_cipher_support_state[ASYM_CIPHER_TYPE];
 
+struct ecc_prov {
+	int pid;
+};
+
+static struct ecc_prov g_ecc_prov;
+static pthread_mutex_t ecc_mutex = PTHREAD_MUTEX_INITIALIZER;
+
 /* Mapping between a flag and a name */
 static const OSSL_ITEM encoding_nameid_map[] = {
 	{ OPENSSL_EC_EXPLICIT_CURVE, OSSL_PKEY_EC_ENCODING_EXPLICIT },
@@ -767,3 +774,40 @@ void uadk_prov_asym_cipher_alg(void)
 			uadk_prov_asym_cipher_set_support_state(i, PROV_SUPPORT);
 	}
 }
+
+static void uadk_prov_ecc_mutex_infork(void)
+{
+	/* Release the replication lock of the child process */
+	pthread_mutex_unlock(&ecc_mutex);
+}
+
+int uadk_prov_ecc_init(const char *alg_name)
+{
+	int ret;
+
+	pthread_atfork(NULL, NULL, uadk_prov_ecc_mutex_infork);
+	pthread_mutex_lock(&ecc_mutex);
+	if (g_ecc_prov.pid != getpid()) {
+		ret = wd_ecc_init2((char *)alg_name, SCHED_POLICY_RR, TASK_HW);
+		if (unlikely(ret)) {
+			pthread_mutex_unlock(&ecc_mutex);
+			return UADK_P_FAIL;
+		}
+		g_ecc_prov.pid = getpid();
+		async_register_poll_fn(ASYNC_TASK_ECC, uadk_prov_ecc_poll);
+	}
+	pthread_mutex_unlock(&ecc_mutex);
+
+	return UADK_P_SUCCESS;
+}
+
+/* Uninit only when the process exits, will not uninit when thread exits. */
+void uadk_prov_ecc_uninit(void)
+{
+	pthread_mutex_lock(&ecc_mutex);
+	if (g_ecc_prov.pid == getpid()) {
+		wd_ecc_uninit2();
+		g_ecc_prov.pid = 0;
+	}
+	pthread_mutex_unlock(&ecc_mutex);
+}
diff --git a/src/uadk_prov_pkey.h b/src/uadk_prov_pkey.h
index 0e27fcb..3eb9667 100644
--- a/src/uadk_prov_pkey.h
+++ b/src/uadk_prov_pkey.h
@@ -41,7 +41,6 @@
 #define UADK_ECC_MAX_KEY_BITS		521
 #define UADK_ECC_MAX_KEY_BYTES		66
 #define UADK_ECC_CV_PARAM_NUM		6
-#define UADK_P_INTI_SUCCESS		0
 #define UADK_P_SUCCESS			1
 #define UADK_P_FAIL			0
 #define UADK_P_INVALID			(-1)
@@ -440,5 +439,6 @@ int uadk_prov_ecc_set_public_key(handle_t sess, const EC_KEY *eckey);
 void uadk_prov_signature_alg(void);
 void uadk_prov_asym_cipher_alg(void);
 int uadk_prov_asym_cipher_get_support_state(int alg_tag);
+int uadk_prov_ecc_init(const char *alg_name);
 
 #endif
diff --git a/src/uadk_prov_sm2.c b/src/uadk_prov_sm2.c
index b6d5d01..e27cccb 100644
--- a/src/uadk_prov_sm2.c
+++ b/src/uadk_prov_sm2.c
@@ -36,8 +36,6 @@ UADK_PKEY_KEYMGMT_DESCR(sm2, SM2);
 UADK_PKEY_SIGNATURE_DESCR(sm2, SM2);
 UADK_PKEY_ASYM_CIPHER_DESCR(sm2, SM2);
 
-static pthread_mutex_t sm2_mutex = PTHREAD_MUTEX_INITIALIZER;
-
 static const OSSL_PARAM sm2_asym_cipher_known_settable_ctx_params[] = {
 	OSSL_PARAM_utf8_string(OSSL_ASYM_CIPHER_PARAM_DIGEST, NULL, 0),
 	OSSL_PARAM_utf8_string(OSSL_ASYM_CIPHER_PARAM_PROPERTIES, NULL, 0),
@@ -64,12 +62,6 @@ static const OSSL_PARAM sm2_sig_known_gettable_ctx_params[] = {
 	OSSL_PARAM_END
 };
 
-struct sm2_prov {
-	int pid;
-};
-
-static struct sm2_prov g_sm2_prov;
-
 enum {
 	CTX_INIT_FAIL = -1,
 	CTX_UNINIT,
@@ -457,43 +449,6 @@ static const OSSL_PARAM *uadk_keymgmt_sm2_gen_settable_params(ossl_unused void *
 	return get_default_sm2_keymgmt().gen_settable_params(genctx, provctx);
 }
 
-static void uadk_prov_sm2_mutex_infork(void)
-{
-	/* Release the replication lock of the child process */
-	pthread_mutex_unlock(&sm2_mutex);
-}
-
-int uadk_prov_sm2_init(void)
-{
-	int ret;
-
-	pthread_atfork(NULL, NULL, uadk_prov_sm2_mutex_infork);
-	pthread_mutex_lock(&sm2_mutex);
-	if (g_sm2_prov.pid != getpid()) {
-		ret = wd_ecc_init2("sm2", SCHED_POLICY_RR, TASK_HW);
-		if (unlikely(ret)) {
-			pthread_mutex_unlock(&sm2_mutex);
-			return ret;
-		}
-		g_sm2_prov.pid = getpid();
-		async_register_poll_fn(ASYNC_TASK_ECC, uadk_prov_ecc_poll);
-	}
-	pthread_mutex_unlock(&sm2_mutex);
-
-	return UADK_P_INTI_SUCCESS;
-}
-
-/* Uninit only when the process exits, will not uninit when thread exits. */
-void uadk_prov_sm2_uninit(void)
-{
-	pthread_mutex_lock(&sm2_mutex);
-	if (g_sm2_prov.pid == getpid()) {
-		wd_ecc_uninit2();
-		g_sm2_prov.pid = 0;
-	}
-	pthread_mutex_unlock(&sm2_mutex);
-}
-
 static int uadk_prov_sm2_keygen_init_iot(handle_t sess, struct wd_ecc_req *req)
 {
 	struct wd_ecc_out *ecc_out = wd_sm2_new_kg_out(sess);
@@ -671,8 +626,8 @@ static void *uadk_keymgmt_sm2_gen(void *genctx, OSSL_CALLBACK *osslcb, void *cba
 	}
 
 	/* SM2 hardware init */
-	ret = uadk_prov_sm2_init();
-	if (ret) {
+	ret = uadk_prov_ecc_init("sm2");
+	if (ret == UADK_P_FAIL) {
 		fprintf(stderr, "failed to init sm2\n");
 		goto free_ec_key;
 	}
@@ -1001,10 +956,10 @@ static int uadk_signature_sm2_sign_init(void *vpsm2ctx, void *ec,
 	}
 
 	/* Init with UADK */
-	ret = uadk_prov_sm2_init();
-	if (ret) {
+	ret = uadk_prov_ecc_init("sm2");
+	if (ret == UADK_P_FAIL) {
 		fprintf(stderr, "failed to init sm2\n");
-		return UADK_P_FAIL;
+		return ret;
 	}
 
 	psm2ctx->sm2_pctx->init_status = CTX_INIT_SUCC;
@@ -2408,10 +2363,10 @@ static int uadk_asym_cipher_sm2_encrypt_init(void *vpsm2ctx, void *vkey,
 	}
 
 	/* Init with UADK */
-	ret = uadk_prov_sm2_init();
-	if (ret) {
+	ret = uadk_prov_ecc_init("sm2");
+	if (ret == UADK_P_FAIL) {
 		fprintf(stderr, "failed to init sm2\n");
-		return UADK_P_FAIL;
+		return ret;
 	}
 
 	smctx->init_status = CTX_INIT_SUCC;
-- 
2.25.1

