From: lizhi <lizhi206@huawei.com> Introduce global variables to cache hardware version, reducing repeated device queries. Signed-off-by: lizhi <lizhi206@huawei.com> --- src/uadk_prov.h | 8 ++++++-- src/uadk_prov_cipher.c | 14 +++++++++----- src/uadk_prov_digest.c | 14 ++++++++++++-- src/uadk_prov_init.c | 10 +++++----- src/uadk_prov_pkey.c | 13 ++++++++++--- src/uadk_prov_pkey.h | 9 ++++++--- 6 files changed, 48 insertions(+), 20 deletions(-) diff --git a/src/uadk_prov.h b/src/uadk_prov.h index 0829b19..2261d3e 100644 --- a/src/uadk_prov.h +++ b/src/uadk_prov.h @@ -26,8 +26,6 @@ #define UADK_INIT_SUCCESS 1 #define UADK_INIT_FAIL 2 #define UADK_DEVICE_ERROR 3 -#define HW_SEC_V2 2 -#define HW_SEC_V3 3 #define POLL_ERROR (-1) #define PROV_SEND_MAX_CNT 90000000 #define PROV_RECV_MAX_CNT 60000000 @@ -44,6 +42,12 @@ #define PROV_NAMES_SHA2_512_224 "SHA2-512/224:SHA-512/224:SHA512-224:2.16.840.1.101.3.4.2.5" #define PROV_NAMES_SHA2_512_256 "SHA2-512/256:SHA-512/256:SHA512-256:2.16.840.1.101.3.4.2.6" +enum HW_SYMM_ENC_DEV { + HW_SYMM_ENC_INVALID = 0x0, + HW_SYMM_ENC_V2 = 0x2, + HW_SYMM_ENC_V3 = 0x3 +}; + typedef int CRYPTO_REF_COUNT; struct ossl_provider_st { diff --git a/src/uadk_prov_cipher.c b/src/uadk_prov_cipher.c index e5f1acf..73359c6 100644 --- a/src/uadk_prov_cipher.c +++ b/src/uadk_prov_cipher.c @@ -104,6 +104,7 @@ struct cipher_prov { int pid; }; static struct cipher_prov prov; +static enum HW_SYMM_ENC_DEV g_hw_symm_enc_dev; static pthread_mutex_t cipher_mutex = PTHREAD_MUTEX_INITIALIZER; struct cipher_priv_ctx { @@ -1342,22 +1343,25 @@ static void uadk_prov_cipher_freectx(void *ctx) int uadk_prov_cipher_version(void) { struct uacce_dev *dev; - int ver; + + if (g_hw_symm_enc_dev != HW_SYMM_ENC_INVALID) + return g_hw_symm_enc_dev; dev = uadk_get_accel_dev("cipher"); if (!dev) { UADK_ERR("no cipher device available!\n"); - return 0; + g_hw_symm_enc_dev = HW_SYMM_ENC_INVALID; + return g_hw_symm_enc_dev; } if (!strcmp(dev->api, "hisi_qm_v2")) - ver = HW_SEC_V2; + g_hw_symm_enc_dev = HW_SYMM_ENC_V2; else - ver = HW_SEC_V3; + g_hw_symm_enc_dev = HW_SYMM_ENC_V3; free(dev); - return ver; + return g_hw_symm_enc_dev; } #define UADK_CIPHER_DESCR(nm, blk_size, key_len, iv_len, \ diff --git a/src/uadk_prov_digest.c b/src/uadk_prov_digest.c index 001c389..239c31a 100644 --- a/src/uadk_prov_digest.c +++ b/src/uadk_prov_digest.c @@ -67,6 +67,11 @@ struct digest_prov { int pid; }; +enum { + HW_DIGEST_INVALID = 0x0, + HW_DIGEST_VALID = 0x1 +} g_digest_avaiable; + static struct digest_prov dprov; static pthread_mutex_t digest_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -1043,13 +1048,18 @@ int uadk_prov_digest_version(void) { struct uacce_dev *dev; + if (g_digest_avaiable != HW_DIGEST_INVALID) + return g_digest_avaiable; + dev = uadk_get_accel_dev("digest"); if (!dev) { UADK_ERR("no digest device available!\n"); - return UADK_DIGEST_FAIL; + g_digest_avaiable = HW_DIGEST_INVALID; + return g_digest_avaiable; } free(dev); + g_digest_avaiable = HW_DIGEST_VALID; - return UADK_DIGEST_SUCCESS; + return g_digest_avaiable; } diff --git a/src/uadk_prov_init.c b/src/uadk_prov_init.c index c057be2..0e050e1 100644 --- a/src/uadk_prov_init.c +++ b/src/uadk_prov_init.c @@ -709,7 +709,7 @@ static const OSSL_ALGORITHM *uadk_query(void *provctx, int operation_id, ver = uadk_prov_cipher_version(); if (!ver && uadk_get_sw_offload_state()) break; - else if (ver == HW_SEC_V2) + else if (ver == HW_SYMM_ENC_V2) return uadk_generate_cipher_array_v2(); return uadk_generate_cipher_array_v3(); case OSSL_OP_SIGNATURE: @@ -717,7 +717,7 @@ static const OSSL_ALGORITHM *uadk_query(void *provctx, int operation_id, ver = uadk_prov_pkey_version(); if (!ver && uadk_get_sw_offload_state()) break; - else if (ver == HW_PKEY_V2) + else if (ver == HW_ASYM_ENC_V2) return uadk_generate_signature_array_v2(); return uadk_generate_signature_array_v3(); case OSSL_OP_KEYMGMT: @@ -725,7 +725,7 @@ static const OSSL_ALGORITHM *uadk_query(void *provctx, int operation_id, ver = uadk_prov_pkey_version(); if (!ver && uadk_get_sw_offload_state()) break; - else if (ver == HW_PKEY_V2) + else if (ver == HW_ASYM_ENC_V2) return uadk_generate_keymgmt_array_v2(); return uadk_generate_keymgmt_array_v3(); case OSSL_OP_ASYM_CIPHER: @@ -733,7 +733,7 @@ static const OSSL_ALGORITHM *uadk_query(void *provctx, int operation_id, ver = uadk_prov_pkey_version(); if (!ver && uadk_get_sw_offload_state()) break; - else if (ver == HW_PKEY_V2) + else if (ver == HW_ASYM_ENC_V2) return uadk_generate_asym_cipher_array_v2(); return uadk_generate_asym_cipher_array_v3(); case OSSL_OP_KEYEXCH: @@ -741,7 +741,7 @@ static const OSSL_ALGORITHM *uadk_query(void *provctx, int operation_id, ver = uadk_prov_pkey_version(); if (!ver && uadk_get_sw_offload_state()) break; - else if (ver == HW_PKEY_V2) + else if (ver == HW_ASYM_ENC_V2) return uadk_generate_keyexch_array_v2(); return uadk_generate_keyexch_array_v3(); default: diff --git a/src/uadk_prov_pkey.c b/src/uadk_prov_pkey.c index 57ae3a4..9597e7f 100644 --- a/src/uadk_prov_pkey.c +++ b/src/uadk_prov_pkey.c @@ -39,6 +39,7 @@ 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]; static int p_keyexch_support_state[KEYEXCH_TYPE]; +static enum HW_ASYM_ENC_DEV g_hw_asym_enc_dev; struct ecc_prov { int pid; @@ -947,20 +948,26 @@ int uadk_prov_pkey_version(void) { struct uacce_dev *dev1, *dev2; + if (g_hw_asym_enc_dev != HW_ASYM_ENC_INVALID) + return g_hw_asym_enc_dev; + dev1 = uadk_get_accel_dev("rsa"); if (!dev1) { UADK_ERR("no pkey device available!\n"); - return HW_PKEY_INVALID; + g_hw_asym_enc_dev = HW_ASYM_ENC_INVALID; + return g_hw_asym_enc_dev; } dev2 = uadk_get_accel_dev("sm2"); if (!dev2) { free(dev1); - return HW_PKEY_V2; + g_hw_asym_enc_dev = HW_ASYM_ENC_V2; + return g_hw_asym_enc_dev; } free(dev1); free(dev2); + g_hw_asym_enc_dev = HW_ASYM_ENC_V3; - return HW_PKEY_V3; + return g_hw_asym_enc_dev; } diff --git a/src/uadk_prov_pkey.h b/src/uadk_prov_pkey.h index 507e7ec..2f44aeb 100644 --- a/src/uadk_prov_pkey.h +++ b/src/uadk_prov_pkey.h @@ -63,9 +63,12 @@ #define TRANS_BITS_BYTES_SHIFT 3 #define GET_MS_BYTE(n) ((n) >> 8) #define GET_LS_BYTE(n) ((n) & 0xFF) -#define HW_PKEY_V2 2 -#define HW_PKEY_V3 3 -#define HW_PKEY_INVALID 0 + +enum HW_ASYM_ENC_DEV { + HW_ASYM_ENC_INVALID = 0x0, + HW_ASYM_ENC_V2 = 0x2, + HW_ASYM_ENC_V3 = 0x3 +}; enum { KEYMGMT_SM2 = 0x0, -- 2.43.0