237 lines
6.9 KiB
Diff
237 lines
6.9 KiB
Diff
|
|
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
|
||
|
|
|