uadk_engine/0002-uadk_provider-move-functions-to-uadk_prov_pkey.patch

237 lines
6.9 KiB
Diff
Raw Normal View History

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