From c2e3200185b080425bb1c361f530226916048c6d Mon Sep 17 00:00:00 2001 From: JiangShui <1175135535@qq.com> Date: Wed, 21 Jun 2023 14:06:45 +0800 Subject: [PATCH] Backport uadk engine patch form v1.0.1 to 1.2.0 --- ...igest-support-digest-multiple-update.patch | 161 --- ...-export-PKG_CONFIG_PATH-on-openEuler.patch | 85 ++ ..._engine-define-the-variable-as-const.patch | 38 - ...-use-calloc-to-replace-malloc-memset.patch | 222 +++++ 0003-ecc-fix-codecheck-warning.patch | 113 --- 0003-v1-some-code-clean.patch | 125 +++ 0004-rsa-delete-redundant-copy.patch | 28 - ...declaration-of-function-OPENSSL_call.patch | 41 + 0005-rsa-fix-coverity-warning.patch | 35 - ...uild-uadk_engine-only-if-openssl-1.1.patch | 93 ++ ...anup-duplicate-public-key-allocation.patch | 165 ---- 0006-uadk-support-openssl-3.0.patch | 915 ++++++++++++++++++ 0007-README-update-openssl-3.0.patch | 173 ++++ ...p-about-reducing-function-parameters.patch | 349 ------- 0008-cipher-fix-double-free-error.patch | 29 + ...-cleanup-sm2-compute-digest-function.patch | 355 ------- 0009-cipher-fix-set-key-error.patch | 56 ++ ...gfix-about-ecc-init-after-alloc-sess.patch | 232 ----- ...r-fix-async-hardware-computing-error.patch | 36 + 0010-rsa-cleanup-about-prime-generation.patch | 110 --- ...cleanup-the-form-of-the-return-value.patch | 209 ---- ...-fix-uadk-engine-compatibility-issue.patch | 140 --- ...t-modify-the-process-of-free-session.patch | 31 - ...e-process-of-soft-and-hardware-hando.patch | 153 --- 0015-ecc-bugfix-about-sm2-decryption.patch | 114 --- 0016-dh-bugfix-about-dh-compute-key.patch | 103 -- 0017-ecc-bugfix-about-ecc-general-init.patch | 28 - 0018-digest-fix-codecheck-warning.patch | 113 --- 0019-cipher-fixup-a-code-check-warning.patch | 27 - 0020-rsa-fixup-a-code-check-warning.patch | 27 - 0021-cipher-delete-a-redundant-branch.patch | 32 - ...-engine-can-t-work-under-hybrid-mode.patch | 65 -- 0023-engine-add-the-kae-log-feature.patch | 62 -- 0024-rsa-fix-interface-name.patch | 32 - 0025-ecc-cleanup-sm2-unreachable-code.patch | 28 - 0026-rsa-cleanup-of-code-style.patch | 68 -- ...1-fixup-about-uninitialized-variable.patch | 62 -- 0028-ecc-fix-checking-conditions.patch | 42 - 0029-ecc-cleanup-print-log.patch | 55 -- 0030-engine-fix-function-return-type.patch | 218 ----- 0031-rsa-fixup-about-the-wrong-copy.patch | 30 - 0032-README-modify-the-engine-id-name.patch | 164 ---- ...igest-improve-the-digest-performance.patch | 226 ----- 0034-cipher-support-the-sm4-ecb-alg.patch | 90 -- ...gmentation-fault-for-uadk_e_ctx_init.patch | 42 - ...-ecb-algorithm-is-deleted-by-mistake.patch | 28 - ...-redundant-and-inefficient-operation.patch | 694 ------------- ...uadk-engine-change-Copyright-to-2022.patch | 177 ---- ...E-move-test-script-to-sanity_test.sh.patch | 197 ---- ...-uadk_engine-fix-string-compare-mode.patch | 38 - ...ze-the-process-of-ctx-initialization.patch | 32 - ...-adding-an-iv-update-to-a-decryption.patch | 59 -- ...ix-cipher-decrypto-failed-as-use-jdk.patch | 47 - 0044-engine-add-receiving-timeout-count.patch | 169 ---- ...est-fix-the-fault-as-using-the-nginx.patch | 49 - 0046-ecc-cleanup-of-static-code-check.patch | 121 --- ...-ecc-bugfix-about-return-value-check.patch | 260 ----- ...multiple-definition-of-ecx-structure.patch | 170 ---- ...-uadk_engine-remove-redundant-extern.patch | 76 -- ...timeout-protection-mechanism-in-poll.patch | 212 ---- 0051-rsa-cleanup-redundant-BN-operation.patch | 272 ------ ...bugfix-memory-leak-in-genkey-process.patch | 189 ---- 0053-rsa-remove-unused-software-method.patch | 97 -- 0054-doc-Modify-maintainers.patch | 26 - ...efault-algorithm-of-keygen-soft-algo.patch | 52 - ...ngine-initialize-resources-only-once.patch | 224 ----- 0057-engine-fix-function-type.patch | 105 -- ...the-full-mac-buffer-length-as-doing-.patch | 74 -- 0059-uadk_utils-fix-x86-local-build.patch | 59 -- ...-about-segfault-in-sm2-ctrl-function.patch | 188 ---- ...HW_V2-HW_V3-to-distinguish-different.patch | 142 --- ...te-the-numa-parameter-of-the-schedul.patch | 73 -- ...bugfix-side-effects-of-right-operand.patch | 205 ---- ...nup-static-check-warning-of-clangtid.patch | 118 --- ...e-bugfix-enable-environment-variable.patch | 38 - ...ne-cleanup-magic-number-and-comments.patch | 537 ---------- 0067-uadk_engine-cleanup-header-file.patch | 250 ----- uadk_engine-1.0.0.tar.gz | Bin 486414 -> 0 bytes uadk_engine-1.2.0.tar.gz | Bin 0 -> 102891 bytes uadk_engine.spec | 92 +- 80 files changed, 1797 insertions(+), 8795 deletions(-) delete mode 100644 0001-digest-support-digest-multiple-update.patch create mode 100644 0001-readme-export-PKG_CONFIG_PATH-on-openEuler.patch delete mode 100644 0002-uadk_engine-define-the-variable-as-const.patch create mode 100644 0002-uadk_engine-use-calloc-to-replace-malloc-memset.patch delete mode 100644 0003-ecc-fix-codecheck-warning.patch create mode 100644 0003-v1-some-code-clean.patch delete mode 100644 0004-rsa-delete-redundant-copy.patch create mode 100644 0004-v1-fix-implicit-declaration-of-function-OPENSSL_call.patch delete mode 100644 0005-rsa-fix-coverity-warning.patch create mode 100644 0005-uadk-build-uadk_engine-only-if-openssl-1.1.patch delete mode 100644 0006-ecc-cleanup-duplicate-public-key-allocation.patch create mode 100644 0006-uadk-support-openssl-3.0.patch create mode 100644 0007-README-update-openssl-3.0.patch delete mode 100644 0007-rsa-cleanup-about-reducing-function-parameters.patch create mode 100644 0008-cipher-fix-double-free-error.patch delete mode 100644 0008-ecc-cleanup-sm2-compute-digest-function.patch create mode 100644 0009-cipher-fix-set-key-error.patch delete mode 100644 0009-ecc-bugfix-about-ecc-init-after-alloc-sess.patch create mode 100644 0010-cipher-fix-async-hardware-computing-error.patch delete mode 100644 0010-rsa-cleanup-about-prime-generation.patch delete mode 100644 0011-ecc-cleanup-the-form-of-the-return-value.patch delete mode 100644 0012-engine-fix-uadk-engine-compatibility-issue.patch delete mode 100644 0013-digest-modify-the-process-of-free-session.patch delete mode 100644 0014-digest-modify-the-process-of-soft-and-hardware-hando.patch delete mode 100644 0015-ecc-bugfix-about-sm2-decryption.patch delete mode 100644 0016-dh-bugfix-about-dh-compute-key.patch delete mode 100644 0017-ecc-bugfix-about-ecc-general-init.patch delete mode 100644 0018-digest-fix-codecheck-warning.patch delete mode 100644 0019-cipher-fixup-a-code-check-warning.patch delete mode 100644 0020-rsa-fixup-a-code-check-warning.patch delete mode 100644 0021-cipher-delete-a-redundant-branch.patch delete mode 100644 0022-engine-fix-engine-can-t-work-under-hybrid-mode.patch delete mode 100644 0023-engine-add-the-kae-log-feature.patch delete mode 100644 0024-rsa-fix-interface-name.patch delete mode 100644 0025-ecc-cleanup-sm2-unreachable-code.patch delete mode 100644 0026-rsa-cleanup-of-code-style.patch delete mode 100644 0027-v1-fixup-about-uninitialized-variable.patch delete mode 100644 0028-ecc-fix-checking-conditions.patch delete mode 100644 0029-ecc-cleanup-print-log.patch delete mode 100644 0030-engine-fix-function-return-type.patch delete mode 100644 0031-rsa-fixup-about-the-wrong-copy.patch delete mode 100644 0032-README-modify-the-engine-id-name.patch delete mode 100644 0033-digest-improve-the-digest-performance.patch delete mode 100644 0034-cipher-support-the-sm4-ecb-alg.patch delete mode 100644 0035-cipher-fix-segmentation-fault-for-uadk_e_ctx_init.patch delete mode 100644 0036-cipher-sm4-ecb-algorithm-is-deleted-by-mistake.patch delete mode 100644 0037-rsa-bugfix-about-redundant-and-inefficient-operation.patch delete mode 100644 0038-uadk-engine-change-Copyright-to-2022.patch delete mode 100644 0039-README-move-test-script-to-sanity_test.sh.patch delete mode 100644 0040-uadk_engine-fix-string-compare-mode.patch delete mode 100644 0041-cipher-optimize-the-process-of-ctx-initialization.patch delete mode 100644 0042-cipher-adding-an-iv-update-to-a-decryption.patch delete mode 100644 0043-cipher-fix-cipher-decrypto-failed-as-use-jdk.patch delete mode 100644 0044-engine-add-receiving-timeout-count.patch delete mode 100644 0045-digest-fix-the-fault-as-using-the-nginx.patch delete mode 100644 0046-ecc-cleanup-of-static-code-check.patch delete mode 100644 0047-ecc-bugfix-about-return-value-check.patch delete mode 100644 0048-ecc-bugfix-multiple-definition-of-ecx-structure.patch delete mode 100644 0049-uadk_engine-remove-redundant-extern.patch delete mode 100644 0050-uadk_engine-add-timeout-protection-mechanism-in-poll.patch delete mode 100644 0051-rsa-cleanup-redundant-BN-operation.patch delete mode 100644 0052-rsa-bugfix-memory-leak-in-genkey-process.patch delete mode 100644 0053-rsa-remove-unused-software-method.patch delete mode 100644 0054-doc-Modify-maintainers.patch delete mode 100644 0055-rsa-modify-the-default-algorithm-of-keygen-soft-algo.patch delete mode 100644 0056-engine-initialize-resources-only-once.patch delete mode 100644 0057-engine-fix-function-type.patch delete mode 100644 0058-uadk_digest-fix-the-full-mac-buffer-length-as-doing-.patch delete mode 100644 0059-uadk_utils-fix-x86-local-build.patch delete mode 100644 0060-sm2-bugfix-about-segfault-in-sm2-ctrl-function.patch delete mode 100644 0061-uadk_engine-use-HW_V2-HW_V3-to-distinguish-different.patch delete mode 100644 0062-uadk-engine-update-the-numa-parameter-of-the-schedul.patch delete mode 100644 0063-uadk_engine-bugfix-side-effects-of-right-operand.patch delete mode 100644 0064-uadk_engine-cleanup-static-check-warning-of-clangtid.patch delete mode 100644 0065-uadk_engine-bugfix-enable-environment-variable.patch delete mode 100644 0066-uadk_engine-cleanup-magic-number-and-comments.patch delete mode 100644 0067-uadk_engine-cleanup-header-file.patch delete mode 100644 uadk_engine-1.0.0.tar.gz create mode 100644 uadk_engine-1.2.0.tar.gz diff --git a/0001-digest-support-digest-multiple-update.patch b/0001-digest-support-digest-multiple-update.patch deleted file mode 100644 index 92f060c..0000000 --- a/0001-digest-support-digest-multiple-update.patch +++ /dev/null @@ -1,161 +0,0 @@ -From 8cc0e8724565c12f0fa6f099070ec57504cd21fa Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Thu, 9 Dec 2021 15:39:32 +0800 -Subject: [PATCH 01/18] digest: support digest multiple update - -Support digest multiple updating by using the SEC stream mode. - -Signed-off-by: Kai Ye ---- - src/uadk_digest.c | 77 ++++++++++++++++++++++++++++++++++++++--------- - 1 file changed, 62 insertions(+), 15 deletions(-) - -diff --git a/src/uadk_digest.c b/src/uadk_digest.c -index db33d16..41de449 100644 ---- a/src/uadk_digest.c -+++ b/src/uadk_digest.c -@@ -31,6 +31,8 @@ - #define CTX_SYNC 0 - #define CTX_ASYNC 1 - #define CTX_NUM 2 -+#define DIGEST_DOING 1 -+#define DIGEST_END 0 - #define ENV_ENABLED 1 - - /* The max BD data length is 16M-512B */ -@@ -41,6 +43,7 @@ - #define SM3_SMALL_PACKET_OFFLOAD_THRESHOLD_DEFAULT (512) - #define MD5_SMALL_PACKET_OFFLOAD_THRESHOLD_DEFAULT (8 * 1024) - #define SHA_SMALL_PACKET_OFFLOAD_THRESHOLD_DEFAULT (512) -+#define MAX_DIGEST_LENGTH 64 - - struct digest_threshold_table { - int nid; -@@ -69,12 +72,16 @@ struct evp_md_ctx_st { - int (*update)(EVP_MD_CTX *ctx, const void *data, size_t count); - }; - -+#define DIGEST_BLOCK_SIZE 4096 -+ - struct digest_priv_ctx { - handle_t sess; - struct wd_digest_sess_setup setup; - struct wd_digest_req req; - unsigned char *data; -- long tail; -+ unsigned char out[MAX_DIGEST_LENGTH]; -+ size_t tail; -+ size_t last_update_bufflen; - bool copy; - uint32_t e_nid; - EVP_MD_CTX *soft_ctx; -@@ -496,6 +503,13 @@ static int uadk_e_digest_init(EVP_MD_CTX *ctx) - if (unlikely(!priv->sess)) - return 0; - -+ priv->data = malloc(DIGEST_BLOCK_SIZE); -+ if (priv->data == NULL) { -+ wd_digest_free_sess(priv->sess); -+ return 0; -+ } -+ memset(priv->data, 0, DIGEST_BLOCK_SIZE); -+ - priv->switch_threshold = sec_digest_get_sw_threshold(nid); - - return 1; -@@ -504,6 +518,45 @@ soft_init: - return digest_soft_init(priv->soft_ctx, priv->e_nid); - } - -+static int digest_update_inner(EVP_MD_CTX *ctx, const void *data, size_t data_len) -+{ -+ struct digest_priv_ctx *priv = -+ (struct digest_priv_ctx *) EVP_MD_CTX_md_data(ctx); -+ const unsigned char *tmpdata = (const unsigned char *)data; -+ size_t left_len = data_len; -+ int copy_to_bufflen; -+ int ret; -+ -+ priv->req.has_next = DIGEST_DOING; -+ -+ while (priv->last_update_bufflen + left_len > DIGEST_BLOCK_SIZE) { -+ copy_to_bufflen = DIGEST_BLOCK_SIZE - priv->last_update_bufflen; -+ memcpy(priv->data + priv->last_update_bufflen, tmpdata, copy_to_bufflen); -+ -+ priv->last_update_bufflen = DIGEST_BLOCK_SIZE; -+ priv->req.in_bytes = DIGEST_BLOCK_SIZE; -+ priv->req.in = priv->data; -+ priv->req.out = priv->out; -+ left_len -= copy_to_bufflen; -+ tmpdata += copy_to_bufflen; -+ -+ ret = wd_do_digest_sync(priv->sess, &priv->req); -+ if (ret) -+ return 0; -+ -+ priv->last_update_bufflen = 0; -+ memset(priv->data, 0, DIGEST_BLOCK_SIZE); -+ if (left_len <= DIGEST_BLOCK_SIZE) { -+ priv->last_update_bufflen = left_len; -+ memcpy(priv->data, tmpdata, priv->last_update_bufflen); -+ break; -+ } -+ -+ } -+ -+ return 1; -+} -+ - static int uadk_e_digest_update(EVP_MD_CTX *ctx, const void *data, size_t data_len) - { - struct digest_priv_ctx *priv = -@@ -512,20 +565,13 @@ static int uadk_e_digest_update(EVP_MD_CTX *ctx, const void *data, size_t data_l - if (unlikely(priv->switch_flag == UADK_DO_SOFT)) - goto soft_update; - -- if ((data_len <= BUF_LEN - priv->tail) && (data_len > 0)) { -- if (!priv->data) { -- priv->data = OPENSSL_malloc(BUF_LEN); -- if (priv->data == NULL) -- return 0; -- } -- -- memcpy(priv->data + priv->tail, data, data_len); -- priv->tail += data_len; -- -+ if (priv->last_update_bufflen + data_len <= DIGEST_BLOCK_SIZE) { -+ memcpy(priv->data + priv->last_update_bufflen, data, data_len); -+ priv->last_update_bufflen += data_len; - return 1; - } - -- return 0; -+ return digest_update_inner(ctx, data, data_len); - - soft_update: - return digest_soft_update(priv->soft_ctx, priv->e_nid, data, data_len); -@@ -606,10 +652,10 @@ static int uadk_e_digest_final(EVP_MD_CTX *ctx, unsigned char *digest) - (struct digest_priv_ctx *)EVP_MD_CTX_md_data(ctx); - int ret = 1; - struct async_op op; -- -+ priv->req.has_next = DIGEST_END; - priv->req.in = priv->data; -- priv->req.out = digest; -- priv->req.in_bytes = priv->tail; -+ priv->req.out = priv->out; -+ priv->req.in_bytes = priv->last_update_bufflen; - priv->e_nid = EVP_MD_nid(EVP_MD_CTX_md(ctx)); - - ret = async_setup_async_event_notification(&op); -@@ -634,6 +680,7 @@ static int uadk_e_digest_final(EVP_MD_CTX *ctx, unsigned char *digest) - if (!ret) - goto clear; - } -+ memcpy(digest, priv->req.out, priv->req.out_bytes); - - return 1; - --- -2.24.4 - diff --git a/0001-readme-export-PKG_CONFIG_PATH-on-openEuler.patch b/0001-readme-export-PKG_CONFIG_PATH-on-openEuler.patch new file mode 100644 index 0000000..fe1a1f9 --- /dev/null +++ b/0001-readme-export-PKG_CONFIG_PATH-on-openEuler.patch @@ -0,0 +1,85 @@ +From 2f129935991cb3d8e3fdb8b85f5c8e500390ab01 Mon Sep 17 00:00:00 2001 +From: Zhangfei Gao +Date: Tue, 6 Jun 2023 03:44:14 +0000 +Subject: [PATCH 1/7] readme: export PKG_CONFIG_PATH on openEuler + +openEuler requires setting PKG_CONFIG_PATH though /usr/local/lib/pkgconfig + +Signed-off-by: Zhangfei Gao +--- + README.md | 26 +++++++++++++++++++------- + 1 file changed, 19 insertions(+), 7 deletions(-) + +diff --git a/README.md b/README.md +index 2fe165a..ac721e3 100644 +--- a/README.md ++++ b/README.md +@@ -21,21 +21,32 @@ Installation Instruction + ======================== + + Build and install OpenSSL +------------------------ ++------------------------ + + ``` + git clone https://github.com/openssl/openssl.git + cd openssl + git checkout -b OpenSSL_1_1_1f OpenSSL_1_1_1f +- ./config -Wl,-rpath=/usr/local/lib ++ ./config + make +- make test + sudo make install + openssl version + ``` + ++Run pkg-config to ensure env is setup correctly ++----------------------------------------------- ++ ++``` ++ $ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/ ++ $ pkg-config libcrypto --libs ++ -L/usr/local/lib -lcrypto ++``` ++ ++* export ``PKG_CONFIG_PATH`` is required on openEuler, ++ where /usr/local/lib is not set as the default pkgconfig search path. ++ + Build and install UADK +--------------------- ++---------------------- + + ``` + git clone https://github.com/Linaro/uadk.git +@@ -46,16 +57,17 @@ Build and install UADK + make + sudo make install + ``` ++ + * If get error:"cannot find -lnuma", please install the libnuma-dev + * If get error:"fatal error: zlib.h: No such file or directory", please install zlib. + + Build and install UADK Engine +------------------------------------ ++----------------------------- + ``` + git clone https://github.com/Linaro/uadk_engine.git + cd uadk_engine + autoreconf -i +- ./configure --libdir=/usr/local/lib/engines-1.1/ --enable-kae ++ ./configure --libdir=/usr/local/lib/engines-1.1/ [--enable-kae] + make + sudo make install + +@@ -93,7 +105,7 @@ Install libraries to the temp folder + -L/tmp/build/lib -lwd + + $ cd uadk_engine +- $ autoreconf ++ $ autoreconf -i + $ ./configure --prefix=/tmp/build + $ make; make install + +-- +2.25.1 + diff --git a/0002-uadk_engine-define-the-variable-as-const.patch b/0002-uadk_engine-define-the-variable-as-const.patch deleted file mode 100644 index 87c6930..0000000 --- a/0002-uadk_engine-define-the-variable-as-const.patch +++ /dev/null @@ -1,38 +0,0 @@ -From b7bb19a4e5c239035926f952d24c2e95bf813fd8 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Mon, 20 Dec 2021 02:48:54 +0000 -Subject: [PATCH 02/18] uadk_engine: define the variable as 'const' - -Parameter: 'n' in the function has not been changed, -it should be defined as 'const'. - -Signed-off-by: Weili Qian ---- - src/uadk_rsa.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index bab3c24..75ae0d1 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -174,7 +174,7 @@ static int prime_mul_res(int num, BIGNUM *rsa_p, BIGNUM *rsa_q, BIGNUM *r1, - } - - static int check_prime_sufficient(int *num, const int *bitsr, int *bitse, -- int *n, BIGNUM *rsa_p, BIGNUM *rsa_q, -+ const int *n, BIGNUM *rsa_p, BIGNUM *rsa_q, - BIGNUM *r1, BIGNUM *r2, BN_CTX *ctx, - BN_GENCB *cb) - { -@@ -268,7 +268,7 @@ static int check_prime_equal(int num, BIGNUM *rsa_p, BIGNUM *rsa_q, - return UADK_E_SUCCESS; - } - --static int check_prime_useful(int *n, BIGNUM *prime, BIGNUM *r1, BIGNUM *r2, -+static int check_prime_useful(const int *n, BIGNUM *prime, BIGNUM *r1, BIGNUM *r2, - BIGNUM *e_pub, BN_CTX *ctx, BN_GENCB *cb) - { - unsigned long err; --- -2.24.4 - diff --git a/0002-uadk_engine-use-calloc-to-replace-malloc-memset.patch b/0002-uadk_engine-use-calloc-to-replace-malloc-memset.patch new file mode 100644 index 0000000..f84e879 --- /dev/null +++ b/0002-uadk_engine-use-calloc-to-replace-malloc-memset.patch @@ -0,0 +1,222 @@ +From e6dcaa276f295a5baa6ea5109a943d2299ade757 Mon Sep 17 00:00:00 2001 +From: Zhangfei Gao +Date: Tue, 6 Jun 2023 05:06:32 +0000 +Subject: [PATCH 2/7] uadk_engine: use calloc to replace malloc+memset + +malloc + memset(0) can be replaced by calloc + +Signed-off-by: Zhangfei Gao +--- + src/uadk_async.c | 5 +---- + src/uadk_ecx.c | 6 ++---- + src/uadk_sm2.c | 4 +--- + src/v1/alg/dh/hpre_dh_wd.c | 3 +-- + src/v1/async/async_task_queue.c | 4 +--- + src/v1/utils/engine_log.c | 6 ++---- + src/v1/wdmngr/wd_alg_queue.c | 6 ++---- + src/v1/wdmngr/wd_queue_memory.c | 11 ++++------- + 8 files changed, 14 insertions(+), 31 deletions(-) + +diff --git a/src/uadk_async.c b/src/uadk_async.c +index f21eabb..86aa9e5 100644 +--- a/src/uadk_async.c ++++ b/src/uadk_async.c +@@ -362,13 +362,10 @@ int async_module_init(void) + if (pthread_mutex_init(&(poll_queue.async_task_mutex), NULL) < 0) + return 0; + +- poll_queue.head = malloc(sizeof(struct async_poll_task) * ASYNC_QUEUE_TASK_NUM); ++ poll_queue.head = calloc(ASYNC_QUEUE_TASK_NUM, sizeof(struct async_poll_task)); + if (poll_queue.head == NULL) + return 0; + +- memset(poll_queue.head, 0, +- sizeof(struct async_poll_task) * ASYNC_QUEUE_TASK_NUM); +- + if (sem_init(&poll_queue.empty_sem, 0, ASYNC_QUEUE_TASK_NUM) != 0) + goto err; + +diff --git a/src/uadk_ecx.c b/src/uadk_ecx.c +index 2824a0d..0537890 100644 +--- a/src/uadk_ecx.c ++++ b/src/uadk_ecx.c +@@ -89,12 +89,11 @@ static int x25519_init(EVP_PKEY_CTX *ctx) + return UADK_E_FAIL; + } + +- x25519_ctx = malloc(sizeof(struct ecx_ctx)); ++ x25519_ctx = calloc(1, sizeof(struct ecx_ctx)); + if (!x25519_ctx) { + fprintf(stderr, "failed to alloc x25519 ctx\n"); + return UADK_E_FAIL; + } +- memset(x25519_ctx, 0, sizeof(struct ecx_ctx)); + + setup.alg = "x25519"; + setup.key_bits = X25519_KEYBITS; +@@ -146,13 +145,12 @@ static int x448_init(EVP_PKEY_CTX *ctx) + return UADK_E_FAIL; + } + +- x448_ctx = malloc(sizeof(struct ecx_ctx)); ++ x448_ctx = calloc(1, sizeof(struct ecx_ctx)); + if (!x448_ctx) { + fprintf(stderr, "failed to alloc x448 ctx\n"); + return UADK_E_FAIL; + } + +- memset(x448_ctx, 0, sizeof(struct ecx_ctx)); + setup.alg = "x448"; + setup.key_bits = X448_KEYBITS; + params.numa_id = uadk_e_ecc_get_numa_id(); +diff --git a/src/uadk_sm2.c b/src/uadk_sm2.c +index 01186ef..63d4fdf 100644 +--- a/src/uadk_sm2.c ++++ b/src/uadk_sm2.c +@@ -1157,14 +1157,12 @@ static int sm2_init(EVP_PKEY_CTX *ctx) + struct sm2_ctx *smctx; + int ret; + +- smctx = malloc(sizeof(*smctx)); ++ smctx = calloc(1, sizeof(*smctx)); + if (!smctx) { + fprintf(stderr, "failed to alloc sm2 ctx\n"); + return 0; + } + +- memset(smctx, 0, sizeof(*smctx)); +- + ret = uadk_e_ecc_get_support_state(SM2_SUPPORT); + if (!ret) { + fprintf(stderr, "sm2 is not supported\n"); +diff --git a/src/v1/alg/dh/hpre_dh_wd.c b/src/v1/alg/dh/hpre_dh_wd.c +index 38a3d09..8dbb9b4 100644 +--- a/src/v1/alg/dh/hpre_dh_wd.c ++++ b/src/v1/alg/dh/hpre_dh_wd.c +@@ -265,12 +265,11 @@ static hpre_dh_engine_ctx_t *hpre_dh_new_eng_ctx(DH *alg) + { + hpre_dh_engine_ctx_t *eng_ctx = NULL; + +- eng_ctx = (hpre_dh_engine_ctx_t *)OPENSSL_malloc(sizeof(hpre_dh_engine_ctx_t)); ++ eng_ctx = (hpre_dh_engine_ctx_t *)OPENSSL_calloc(1, sizeof(hpre_dh_engine_ctx_t)); + if (eng_ctx == NULL) { + US_ERR("hpre engine_ctx malloc fail"); + return NULL; + } +- kae_memset(eng_ctx, 0, sizeof(hpre_dh_engine_ctx_t)); + + eng_ctx->priv_ctx.ssl_alg = alg; + eng_ctx->qlist = kae_get_node_from_pool(g_hpre_dh_qnode_pool); +diff --git a/src/v1/async/async_task_queue.c b/src/v1/async/async_task_queue.c +index 2feea7e..0ef1e84 100644 +--- a/src/v1/async/async_task_queue.c ++++ b/src/v1/async/async_task_queue.c +@@ -60,13 +60,11 @@ int async_poll_task_init_v1(void) + kae_memset(&g_async_poll_queue, 0, sizeof(g_async_poll_queue)); + + g_async_poll_queue.async_poll_task_queue_head = +- (async_poll_task *)malloc(sizeof(async_poll_task) * ASYNC_POLL_TASK_NUM); ++ (async_poll_task *)calloc(ASYNC_POLL_TASK_NUM, sizeof(async_poll_task)); + if (g_async_poll_queue.async_poll_task_queue_head == NULL) { + US_ERR("no enough memory for task queue, errno=%d", errno); //lint !e666 + return 0; + } +- kae_memset(g_async_poll_queue.async_poll_task_queue_head, 0, +- sizeof(async_poll_task) * ASYNC_POLL_TASK_NUM); + g_async_poll_queue.left_task = ASYNC_POLL_TASK_NUM; + + ret = sem_init(&g_async_poll_queue.empty_sem, 0, (unsigned int)g_async_poll_queue.left_task); +diff --git a/src/v1/utils/engine_log.c b/src/v1/utils/engine_log.c +index 6e32b97..ef009e5 100644 +--- a/src/v1/utils/engine_log.c ++++ b/src/v1/utils/engine_log.c +@@ -60,12 +60,10 @@ static void kae_set_conf_debuglevel(void) + + if (conf_path == NULL || strlen(conf_path) > MAX_CONFIG_LEN) + goto err; +- file_path = (char *)kae_malloc(strlen(conf_path) + strlen(filename) + 1); +- debuglev = (char *)kae_malloc(MAX_LEVEL_LEN); ++ file_path = (char *)kae_calloc(1, strlen(conf_path) + strlen(filename) + 1); ++ debuglev = (char *)kae_calloc(1, MAX_LEVEL_LEN); + if (!file_path || !debuglev) + goto err; +- memset(debuglev, 0, MAX_LEVEL_LEN); +- memset(file_path, 0, sizeof(conf_path) + sizeof(filename) + 1); + strcat(file_path, conf_path); + strcat(file_path, filename); + ret = kae_drv_get_item(file_path, "LogSection", "debug_level", debuglev); +diff --git a/src/v1/wdmngr/wd_alg_queue.c b/src/v1/wdmngr/wd_alg_queue.c +index 5cd33ae..098231f 100644 +--- a/src/v1/wdmngr/wd_alg_queue.c ++++ b/src/v1/wdmngr/wd_alg_queue.c +@@ -21,16 +21,14 @@ + + struct wd_queue *wd_new_queue(int algtype) + { +- struct wd_queue *queue = (struct wd_queue *)kae_malloc(sizeof(struct wd_queue)); + int ret; +- ++ struct wd_queue *queue = (struct wd_queue *)kae_calloc(1, ++ sizeof(struct wd_queue)); + if (queue == NULL) { + US_ERR("malloc failed"); + return NULL; + } + +- kae_memset(queue, 0, sizeof(struct wd_queue)); +- + switch (algtype) { + case WCRYPTO_RSA: + queue->capa.alg = "rsa"; +diff --git a/src/v1/wdmngr/wd_queue_memory.c b/src/v1/wdmngr/wd_queue_memory.c +index e6e7a2c..5f28357 100644 +--- a/src/v1/wdmngr/wd_queue_memory.c ++++ b/src/v1/wdmngr/wd_queue_memory.c +@@ -62,13 +62,12 @@ struct wd_queue_mempool *wd_queue_mempool_create(struct wd_queue *q, unsigned in + kae_memset(addr, 0, rsv_mm_sz); + + bitmap_sz = (block_num / BLOCKS_PER_BITMAP + 1) * sizeof(unsigned int); +- pool = +- (struct wd_queue_mempool *)kae_malloc(sizeof(struct wd_queue_mempool) + bitmap_sz); ++ pool = (struct wd_queue_mempool *)kae_calloc(1, ++ sizeof(struct wd_queue_mempool) + bitmap_sz); + if (pool == NULL) { + US_ERR("Alloc pool handle fail!"); + return NULL; + } +- kae_memset(pool, 0, sizeof(struct wd_queue_mempool) + bitmap_sz); + + pool->base = addr; + sem_init(&pool->mempool_sem, 0, 1); +@@ -190,13 +189,12 @@ KAE_QUEUE_POOL_HEAD_S *kae_init_queue_pool(int algtype) + + /* malloc a pool */ + kae_pool->kae_queue_pool = (KAE_QUEUE_POOL_NODE_S *) +- kae_malloc(KAE_QUEUE_POOL_MAX_SIZE * sizeof(KAE_QUEUE_POOL_NODE_S)); ++ kae_calloc(KAE_QUEUE_POOL_MAX_SIZE, sizeof(KAE_QUEUE_POOL_NODE_S)); + if (kae_pool->kae_queue_pool == NULL) { + US_ERR("malloc failed"); + kae_free(kae_pool); + return NULL; + } +- kae_memset(kae_pool->kae_queue_pool, 0, KAE_QUEUE_POOL_MAX_SIZE * sizeof(KAE_QUEUE_POOL_NODE_S)); + + pthread_mutex_init(&kae_pool->kae_queue_mutex, NULL); + pthread_mutex_init(&kae_pool->destroy_mutex, NULL); +@@ -271,12 +269,11 @@ static KAE_QUEUE_DATA_NODE_S *kae_new_wd_queue_memory(int algtype) + { + KAE_QUEUE_DATA_NODE_S *queue_node = NULL; + +- queue_node = (KAE_QUEUE_DATA_NODE_S *)kae_malloc(sizeof(KAE_QUEUE_DATA_NODE_S)); ++ queue_node = (KAE_QUEUE_DATA_NODE_S *)kae_calloc(1, sizeof(KAE_QUEUE_DATA_NODE_S)); + if (queue_node == NULL) { + US_ERR("malloc failed"); + return NULL; + } +- kae_memset(queue_node, 0, sizeof(KAE_QUEUE_DATA_NODE_S)); + + queue_node->kae_wd_queue = wd_new_queue(algtype); + if (queue_node->kae_wd_queue == NULL) { +-- +2.25.1 + diff --git a/0003-ecc-fix-codecheck-warning.patch b/0003-ecc-fix-codecheck-warning.patch deleted file mode 100644 index f6eb7ea..0000000 --- a/0003-ecc-fix-codecheck-warning.patch +++ /dev/null @@ -1,113 +0,0 @@ -From 1cd8bd255ae0f55742d2dffa7ba09aea28d56c9a Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Wed, 22 Dec 2021 03:37:13 +0000 -Subject: [PATCH 03/18] ecc: fix codecheck warning - -fix a more than 50 lines function 'uadk_wd_ecc_init'. - -Signed-off-by: Weili Qian ---- - src/uadk_pkey.c | 61 +++++++++++++++++++++++++------------------------ - 1 file changed, 31 insertions(+), 30 deletions(-) - -diff --git a/src/uadk_pkey.c b/src/uadk_pkey.c -index c20b22b..62362b0 100644 ---- a/src/uadk_pkey.c -+++ b/src/uadk_pkey.c -@@ -178,38 +178,20 @@ static int uadk_e_wd_ecc_env_init(struct uacce_dev *dev) - return async_register_poll_fn(ASYNC_TASK_ECC, uadk_e_ecc_env_poll); - } - --static int uadk_wd_ecc_init(struct ecc_res_config *config) -+static int uadk_e_wd_ecc_general_init(struct uacce_dev *dev, -+ struct wd_sched *sched) - { -- struct wd_sched *sched = &config->sched.wd_sched; - struct wd_ctx_config *ctx_cfg; -- struct uacce_dev *dev; - int ret, i; - -- /* ctx is no difference for sm2/ecdsa/ecdh/x25519/x448 */ -- dev = wd_get_accel_dev("ecdsa"); -- if (!dev) -- return -ENOMEM; -- -- config->numa_id = dev->numa_id; -- -- ret = uadk_e_is_env_enabled("ecc"); -- if (ret == ENV_ENABLED) { -- ret = uadk_e_wd_ecc_env_init(dev); -- goto free_dev; -- } -- -- if (ecc_res.ctx_res) { -- ret = 0; -- goto free_dev; -- } -+ if (ecc_res.ctx_res) -+ return 0; - - ctx_cfg = calloc(1, sizeof(struct wd_ctx_config)); -- if (!ctx_cfg) { -+ if (!ctx_cfg) - ret = -ENOMEM; -- goto free_dev; -- } -- ecc_res.ctx_res = ctx_cfg; - -+ ecc_res.ctx_res = ctx_cfg; - ctx_cfg->ctx_num = CTX_NUM; - ctx_cfg->ctxs = calloc(CTX_NUM, sizeof(struct wd_ctx)); - if (!ctx_cfg->ctxs) { -@@ -230,23 +212,42 @@ static int uadk_wd_ecc_init(struct ecc_res_config *config) - if (ret) - goto free_ctx; - -- free(dev); -- - return async_register_poll_fn(ASYNC_TASK_ECC, uadk_ecc_poll); - - free_ctx: - for (i = 0; i < CTX_NUM; i++) { -- if (ctx_cfg->ctxs[i].ctx) { -+ if (ctx_cfg->ctxs[i].ctx) - wd_release_ctx(ctx_cfg->ctxs[i].ctx); -- ctx_cfg->ctxs[i].ctx = 0; -- } - } - free(ctx_cfg->ctxs); - free_cfg: - free(ctx_cfg); - ecc_res.ctx_res = NULL; --free_dev: -+ -+ return ret; -+} -+ -+static int uadk_wd_ecc_init(struct ecc_res_config *config) -+{ -+ struct wd_sched *sched = &config->sched.wd_sched; -+ struct uacce_dev *dev; -+ int ret; -+ -+ /* ctx is no difference for sm2/ecdsa/ecdh/x25519/x448 */ -+ dev = wd_get_accel_dev("ecdsa"); -+ if (!dev) -+ return -ENOMEM; -+ -+ config->numa_id = dev->numa_id; -+ -+ ret = uadk_e_is_env_enabled("ecc"); -+ if (ret) -+ ret = uadk_e_wd_ecc_env_init(dev); -+ else -+ ret = uadk_e_wd_ecc_general_init(dev, sched); -+ - free(dev); -+ - return ret; - } - --- -2.24.4 - diff --git a/0003-v1-some-code-clean.patch b/0003-v1-some-code-clean.patch new file mode 100644 index 0000000..922a812 --- /dev/null +++ b/0003-v1-some-code-clean.patch @@ -0,0 +1,125 @@ +From e6dae9e2197dad6173f9ec7fbc55373adcfbb29e Mon Sep 17 00:00:00 2001 +From: Zhangfei Gao +Date: Tue, 6 Jun 2023 06:12:23 +0000 +Subject: [PATCH 3/7] v1: some code clean + +remove #if 0, print address, etc + +Signed-off-by: Zhangfei Gao +--- + src/v1/alg/ciphers/sec_ciphers_soft.c | 15 ++++----------- + src/v1/alg/pkey/hpre_rsa.c | 20 +------------------- + src/v1/alg/pkey/hpre_rsa_utils.c | 5 ++--- + 3 files changed, 7 insertions(+), 33 deletions(-) + +diff --git a/src/v1/alg/ciphers/sec_ciphers_soft.c b/src/v1/alg/ciphers/sec_ciphers_soft.c +index 71fbb33..9c597b5 100644 +--- a/src/v1/alg/ciphers/sec_ciphers_soft.c ++++ b/src/v1/alg/ciphers/sec_ciphers_soft.c +@@ -110,11 +110,11 @@ int sec_ciphers_sw_impl_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, + + /* allowed iv to be empty. */ + if (unlikely(key == NULL)) { +- US_ERR("kae sw init parameter is NULL. key=%p", key); ++ US_ERR("kae sw init parameter is NULL"); + return KAE_FAIL; + } + if (unlikely(ctx == NULL)) { +- US_ERR("kae sw init parameter is NULL. ctx=%p", ctx); ++ US_ERR("kae sw init parameter is NULL"); + return KAE_FAIL; + } + +@@ -155,11 +155,10 @@ int sec_ciphers_sw_impl_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, + ret = EVP_CIPHER_meth_get_init(sw_cipher)(ctx, key, iv, enc); + EVP_CIPHER_CTX_set_cipher_data(ctx, priv_ctx); + if (ret != OPENSSL_SUCCESS) { +- US_ERR("OPENSSL init key failed. ctx=%p", ctx); ++ US_ERR("OPENSSL init key failed."); + kae_free(priv_ctx->sw_ctx_data); + return KAE_FAIL; + } +- US_DEBUG("kae sw init impl success. ctx=%p", ctx); + + return KAE_SUCCESS; + } +@@ -185,18 +184,14 @@ int sec_ciphers_sw_impl_cleanup(EVP_CIPHER_CTX *ctx) + + kae_free(priv_ctx->sw_ctx_data); + +- US_DEBUG("kae sw cleanup impl success, ctx=%p", ctx); +- + return KAE_SUCCESS; + } + + static int sec_ciphers_sw_impl_do_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, + const unsigned char *in, size_t inl) + { +- if (unlikely((ctx == NULL) || (out == NULL) || (in == NULL))) { +- US_ERR("kae sw cipher parameter is null.ctx=%p, in=%p, out=%p, inl=%d", ctx, out, in, (int)inl); ++ if (unlikely((ctx == NULL) || (out == NULL) || (in == NULL))) + return KAE_FAIL; +- } + + cipher_priv_ctx_t *priv_ctx = (cipher_priv_ctx_t *)EVP_CIPHER_CTX_get_cipher_data(ctx); + +@@ -277,8 +272,6 @@ int sec_ciphers_sw_hw_ctx_sync(EVP_CIPHER_CTX *ctx, sec_cipher_priv_ctx_syncto_t + } + } + +- US_DEBUG("state sync success, direct=%d[1:SW_TO_HW, 2:HW_TO_SW], offset=%d", direction, num); +- + return KAE_SUCCESS; + } + +diff --git a/src/v1/alg/pkey/hpre_rsa.c b/src/v1/alg/pkey/hpre_rsa.c +index 6c1d96d..4e21dde 100644 +--- a/src/v1/alg/pkey/hpre_rsa.c ++++ b/src/v1/alg/pkey/hpre_rsa.c +@@ -67,25 +67,7 @@ RSA_METHOD *hpre_get_rsa_methods(void) + return g_hpre_rsa_method; + if (g_soft_rsa_method != NULL) + return g_soft_rsa_method; +-#if 0 +- if (!kae_get_device(g_hpre_device)) { +- const RSA_METHOD *default_soft_method = RSA_PKCS1_OpenSSL(); +- +- g_soft_rsa_method = RSA_meth_new("SOFT RSA METHOD", 0); +- ret &= RSA_meth_set_pub_enc(g_soft_rsa_method, RSA_meth_get_pub_enc(default_soft_method)); +- ret &= RSA_meth_set_priv_enc(g_soft_rsa_method, RSA_meth_get_priv_enc(default_soft_method)); +- ret &= RSA_meth_set_pub_dec(g_soft_rsa_method, RSA_meth_get_pub_dec(default_soft_method)); +- ret &= RSA_meth_set_priv_dec(g_soft_rsa_method, RSA_meth_get_priv_dec(default_soft_method)); +- ret &= RSA_meth_set_keygen(g_soft_rsa_method, hpre_rsa_soft_genkey); +- ret &= RSA_meth_set_mod_exp(g_soft_rsa_method, RSA_meth_get_mod_exp(default_soft_method)); +- ret &= RSA_meth_set_bn_mod_exp(g_soft_rsa_method, RSA_meth_get_bn_mod_exp(default_soft_method)); +- if (ret == 0) { +- US_ERR("Failed to set SOFT RSA methods"); +- return NULL; +- } +- return g_soft_rsa_method; +- } +-#endif ++ + g_hpre_rsa_method = RSA_meth_new("HPRE RSA method", 0); + if (g_hpre_rsa_method == NULL) { + KAEerr(KAE_F_HPRE_GET_RSA_METHODS, KAE_R_MALLOC_FAILURE); +diff --git a/src/v1/alg/pkey/hpre_rsa_utils.c b/src/v1/alg/pkey/hpre_rsa_utils.c +index 0630b28..317a5a0 100644 +--- a/src/v1/alg/pkey/hpre_rsa_utils.c ++++ b/src/v1/alg/pkey/hpre_rsa_utils.c +@@ -44,10 +44,9 @@ void hpre_free_bn_ctx_buf(BN_CTX *bn_ctx, unsigned char *in_buf, int num) + int hpre_rsa_check_para(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa) + { +- if ((rsa == NULL || from == NULL || to == NULL || flen <= 0)) { +- US_ERR("RSA key %p, input %p or output %p are NULL, or flen invalid length.\n", rsa, from, to); ++ if ((rsa == NULL || from == NULL || to == NULL || flen <= 0)) + return HPRE_CRYPTO_FAIL; +- } ++ + return HPRE_CRYPTO_SUCC; + } + +-- +2.25.1 + diff --git a/0004-rsa-delete-redundant-copy.patch b/0004-rsa-delete-redundant-copy.patch deleted file mode 100644 index 8bf9eae..0000000 --- a/0004-rsa-delete-redundant-copy.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 6c916851ae54c9272a96c7af73cba83598ab3c43 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Wed, 22 Dec 2021 03:51:48 +0000 -Subject: [PATCH 04/18] rsa: delete redundant copy - -'from_buf' and 'req.src' point to the same address space, -redundant copy is not required. - -Signed-off-by: Weili Qian ---- - src/uadk_rsa.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index 75ae0d1..1e1e226 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -1595,7 +1595,6 @@ static int uadk_e_rsa_private_sign(int flen, const unsigned char *from, - goto free_buf; - } - -- memcpy(rsa_sess->req.src, from_buf, rsa_sess->req.src_bytes); - ret = rsa_do_crypto(rsa_sess); - if (!ret || rsa_sess->req.status) { - ret = UADK_DO_SOFT; --- -2.24.4 - diff --git a/0004-v1-fix-implicit-declaration-of-function-OPENSSL_call.patch b/0004-v1-fix-implicit-declaration-of-function-OPENSSL_call.patch new file mode 100644 index 0000000..aac63af --- /dev/null +++ b/0004-v1-fix-implicit-declaration-of-function-OPENSSL_call.patch @@ -0,0 +1,41 @@ +From 1d05480962b3110b8da9f467cc3dbd9047f04589 Mon Sep 17 00:00:00 2001 +From: Zhangfei Gao +Date: Fri, 16 Jun 2023 02:09:00 +0000 +Subject: [PATCH 4/7] =?UTF-8?q?v1:=20fix=20implicit=20declaration=20of=20f?= + =?UTF-8?q?unction=20=E2=80=98OPENSSL=5Fcalloc=E2=80=99?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Fix implicit declaration of function ‘OPENSSL_calloc’ with calloc + +Signed-off-by: Zhangfei Gao +--- + src/v1/alg/dh/hpre_dh_wd.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/v1/alg/dh/hpre_dh_wd.c b/src/v1/alg/dh/hpre_dh_wd.c +index 8dbb9b4..b8ca9a1 100644 +--- a/src/v1/alg/dh/hpre_dh_wd.c ++++ b/src/v1/alg/dh/hpre_dh_wd.c +@@ -199,7 +199,7 @@ void hpre_dh_free_eng_ctx(hpre_dh_engine_ctx_t *eng_ctx) + eng_ctx->opdata.pri = NULL; + eng_ctx->opdata.x_p = NULL; + eng_ctx->opdata.pv = NULL; +- OPENSSL_free(eng_ctx); ++ free(eng_ctx); + eng_ctx = NULL; + } + +@@ -265,7 +265,7 @@ static hpre_dh_engine_ctx_t *hpre_dh_new_eng_ctx(DH *alg) + { + hpre_dh_engine_ctx_t *eng_ctx = NULL; + +- eng_ctx = (hpre_dh_engine_ctx_t *)OPENSSL_calloc(1, sizeof(hpre_dh_engine_ctx_t)); ++ eng_ctx = (hpre_dh_engine_ctx_t *)calloc(1, sizeof(hpre_dh_engine_ctx_t)); + if (eng_ctx == NULL) { + US_ERR("hpre engine_ctx malloc fail"); + return NULL; +-- +2.25.1 + diff --git a/0005-rsa-fix-coverity-warning.patch b/0005-rsa-fix-coverity-warning.patch deleted file mode 100644 index f444142..0000000 --- a/0005-rsa-fix-coverity-warning.patch +++ /dev/null @@ -1,35 +0,0 @@ -From f5fac71459234b4e44fe8ff386b19627e88ad680 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Wed, 22 Dec 2021 06:39:46 +0000 -Subject: [PATCH 05/18] rsa: fix coverity warning - -Parameter: 'n' in the function 'get_prime_once' has not -been changed, it should be defined as 'const'. - -Signed-off-by: Weili Qian ---- - src/uadk_rsa.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index 1e1e226..cb98159 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -307,10 +307,10 @@ static int check_prime_useful(const int *n, BIGNUM *prime, BIGNUM *r1, BIGNUM *r - return GET_ERR_FINISH; - } - --static int get_prime_once(int num, const int *bitsr, int *n, BIGNUM *prime, -- BIGNUM *rsa_p, BIGNUM *rsa_q, BIGNUM *r1, -- BIGNUM *r2, BIGNUM *e_pub, BN_CTX *ctx, -- BN_GENCB *cb) -+static int get_prime_once(int num, const int *bitsr, const int *n, -+ BIGNUM *prime, BIGNUM *rsa_p, BIGNUM *rsa_q, -+ BIGNUM *r1, BIGNUM *r2, BIGNUM *e_pub, -+ BN_CTX *ctx, BN_GENCB *cb) - { - int ret = -1; - --- -2.24.4 - diff --git a/0005-uadk-build-uadk_engine-only-if-openssl-1.1.patch b/0005-uadk-build-uadk_engine-only-if-openssl-1.1.patch new file mode 100644 index 0000000..07c8f1d --- /dev/null +++ b/0005-uadk-build-uadk_engine-only-if-openssl-1.1.patch @@ -0,0 +1,93 @@ +From aa06f50efb5725a99f5ff93cca04c968ec981635 Mon Sep 17 00:00:00 2001 +From: Zhangfei Gao +Date: Fri, 9 Jun 2023 04:52:30 +0000 +Subject: [PATCH 5/7] uadk: build uadk_engine only if openssl 1.1 + +Rename e_uadk.c to uadk_engine_init.c +Build uadk_engine only if openssl 1.1 + +Signed-off-by: Zhangfei Gao +--- + Makefile.am | 2 -- + configure.ac | 7 ++++--- + src/Makefile.am | 11 ++++++++--- + src/{e_uadk.c => uadk_engine_init.c} | 0 + 4 files changed, 12 insertions(+), 8 deletions(-) + rename src/{e_uadk.c => uadk_engine_init.c} (100%) + +diff --git a/Makefile.am b/Makefile.am +index 55fd400..1ade214 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -1,7 +1,5 @@ + ACLOCAL_AMFLAGS = -I m4 + +-if HAVE_CRYPTO + if HAVE_WD + SUBDIRS = src + endif +-endif +diff --git a/configure.ac b/configure.ac +index fb03a5b..0fc14ed 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1,6 +1,5 @@ + AC_PREREQ([2.69]) + AC_INIT([uadk_engine], [1.2]) +-AC_CONFIG_SRCDIR([src/e_uadk.c]) + AM_INIT_AUTOMAKE([1.10 no-define]) + + AC_CONFIG_MACRO_DIR([m4]) +@@ -15,8 +14,6 @@ AC_ARG_ENABLE(kae, + AC_SUBST(enable_kae) + AM_CONDITIONAL([WD_KAE], [test "$enable_kae" = "yes"]) + +-AC_CHECK_HEADERS([openssl/engine.h]) +- + PKG_CHECK_MODULES(WD, libwd libwd_crypto, [with_wd=yes], [with_wd=no]) + AM_CONDITIONAL(HAVE_WD, [test "$with_wd" != "no"]) + +@@ -24,6 +21,10 @@ PKG_CHECK_MODULES(libcrypto, libcrypto < 3.0 libcrypto >= 1.1, + [with_crypto=yes], [with_crypto=no]) + AM_CONDITIONAL(HAVE_CRYPTO, test "$with_crypto" != "no") + ++PKG_CHECK_MODULES(libcrypto, libcrypto >= 3.0, ++ [with_crypto3=yes], [with_crypto3=no]) ++AM_CONDITIONAL(HAVE_CRYPTO3, test "$with_crypto3" != "no") ++ + AC_CONFIG_FILES([ + Makefile + src/Makefile]) +diff --git a/src/Makefile.am b/src/Makefile.am +index 8ced0e8..65afe1d 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -1,13 +1,18 @@ + VERSION = 1:2 + ACLOCAL_AMFLAGS = -I m4 + ++if HAVE_CRYPTO + lib_LTLIBRARIES=uadk_engine.la ++endif #HAVE_CRYPTO ++ ++uadk_engine_la_SOURCES=uadk_utils.c uadk_engine_init.c uadk_cipher.c \ ++ uadk_digest.c uadk_async.c uadk_rsa.c uadk_sm2.c \ ++ uadk_pkey.c uadk_dh.c uadk_ec.c uadk_ecx.c + +-uadk_engine_la_SOURCES=uadk_utils.c e_uadk.c uadk_cipher.c uadk_digest.c uadk_async.c \ +- uadk_rsa.c uadk_sm2.c uadk_pkey.c uadk_dh.c uadk_ec.c uadk_ecx.c + uadk_engine_la_LIBADD=-ldl $(WD_LIBS) -lpthread + uadk_engine_la_LDFLAGS=-module -version-number $(VERSION) +-uadk_engine_la_CFLAGS=$(WD_CFLAGS) ++uadk_engine_la_CFLAGS=$(WD_CFLAGS) $(libcrypto_CFLAGS) ++uadk_engine_la_CFLAGS+=-DCRYPTO + + AUTOMAKE_OPTIONS = subdir-objects + +diff --git a/src/e_uadk.c b/src/uadk_engine_init.c +similarity index 100% +rename from src/e_uadk.c +rename to src/uadk_engine_init.c +-- +2.25.1 + diff --git a/0006-ecc-cleanup-duplicate-public-key-allocation.patch b/0006-ecc-cleanup-duplicate-public-key-allocation.patch deleted file mode 100644 index 95b735b..0000000 --- a/0006-ecc-cleanup-duplicate-public-key-allocation.patch +++ /dev/null @@ -1,165 +0,0 @@ -From 941c89ea6fefe3e78255437788c3f274b6c81414 Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Wed, 22 Dec 2021 08:27:45 +0000 -Subject: [PATCH 06/18] ecc: cleanup duplicate public key allocation - -Remove duplicate allocation and copy of public key. - -Signed-off-by: Zhiqi Song ---- - src/uadk_ec.c | 95 +++++++++++++++++++++++++++------------------------ - 1 file changed, 51 insertions(+), 44 deletions(-) - -diff --git a/src/uadk_ec.c b/src/uadk_ec.c -index d97436b..9040d3c 100644 ---- a/src/uadk_ec.c -+++ b/src/uadk_ec.c -@@ -784,59 +784,78 @@ static int sm2_keygen_init_iot(handle_t sess, struct wd_ecc_req *req) - - static int eckey_create_key(EC_KEY *eckey) - { -- const EC_GROUP *group; -- EC_POINT *pub_key; - BIGNUM *priv_key; -+ int ret; - -- group = EC_KEY_get0_group(eckey); -- pub_key = (EC_POINT *)EC_KEY_get0_public_key(eckey); -- if (!pub_key) { -- pub_key = EC_POINT_new(group); -- if (!pub_key) { -- fprintf(stderr, "failed to new pub_key\n"); -- return -1; -- } -- EC_KEY_set_public_key(eckey, pub_key); -+ priv_key = (BIGNUM *)EC_KEY_get0_private_key(eckey); -+ if (priv_key) -+ return 1; -+ -+ priv_key = BN_new(); -+ if (!priv_key) { -+ fprintf(stderr, "failed to BN_new priv_key\n"); -+ return 0; - } - -+ ret = EC_KEY_set_private_key(eckey, priv_key); -+ if (!ret) -+ fprintf(stderr, "failed to set private key\n"); -+ -+ BN_free(priv_key); -+ return ret; -+} -+ -+static int ecdh_set_private_key(EC_KEY *eckey, BIGNUM *order) -+{ -+ BIGNUM *priv_key; -+ int ret; -+ -+ priv_key = (BIGNUM *)EC_KEY_get0_private_key(eckey); -+ if (priv_key) -+ return 1; -+ - priv_key = BN_new(); - if (!priv_key) { - fprintf(stderr, "failed to BN_new priv_key\n"); -- return -1; -+ return 0; - } -- EC_KEY_set_private_key(eckey, priv_key); - -- return 0; -+ do { -+ if (!BN_rand_range(priv_key, order)) { -+ fprintf(stderr, "failed to generate random value\n"); -+ ret = 0; -+ goto free_priv_key; -+ } -+ } while (BN_is_zero(priv_key)); -+ -+ ret = EC_KEY_set_private_key(eckey, priv_key); -+ if (!ret) -+ fprintf(stderr, "failed to set private key\n"); -+ -+free_priv_key: -+ BN_free(priv_key); -+ return ret; - } - - static int ecdh_create_key(EC_KEY *eckey) - { -- BIGNUM *priv_key, *order; - const EC_GROUP *group; -- EC_POINT *pub_key; -+ BIGNUM *order; - BN_CTX *ctx; -- int ret = 0; -+ int ret; - - group = EC_KEY_get0_group(eckey); -- pub_key = (EC_POINT *)EC_KEY_get0_public_key(eckey); -- if (!pub_key) { -- pub_key = EC_POINT_new(group); -- if (!pub_key) { -- fprintf(stderr, "failed to new pub_key\n"); -- return ret; -- } -- ret = EC_KEY_set_public_key(eckey, pub_key); -- } - - ctx = BN_CTX_new(); - if (!ctx) { - fprintf(stderr, "failed to allocate ctx\n"); -- return ret; -+ return 0; - } - -- order = BN_CTX_get(ctx); -+ order = BN_CTX_get(ctx); - if (!order) { - fprintf(stderr, "failed to allocate order\n"); -+ ret = 0; - goto free_ctx; - } - -@@ -846,26 +865,14 @@ static int ecdh_create_key(EC_KEY *eckey) - goto free_order; - } - -- priv_key = (BIGNUM *)EC_KEY_get0_private_key(eckey); -- if (!priv_key) { -- priv_key = BN_new(); -- if (!priv_key) { -- fprintf(stderr, "failed to BN_new priv_key\n"); -- goto free_order; -- } -- do { -- if (!BN_rand_range(priv_key, order)) -- fprintf(stderr, "failed to generate random value\n"); -- } while (BN_is_zero(priv_key)); -- ret = EC_KEY_set_private_key(eckey, priv_key); -- } -- ret = 1; -+ ret = ecdh_set_private_key(eckey, order); -+ if (!ret) -+ fprintf(stderr, "failed to set private key\n"); - - free_order: - BN_clear(order); - free_ctx: - BN_CTX_free(ctx); -- - return ret; - } - -@@ -880,7 +887,7 @@ static int sm2_generate_key(EC_KEY *eckey) - goto do_soft; - - ret = eckey_create_key(eckey); -- if (ret) -+ if (!ret) - return ret; - - ret = UADK_DO_SOFT; --- -2.24.4 - diff --git a/0006-uadk-support-openssl-3.0.patch b/0006-uadk-support-openssl-3.0.patch new file mode 100644 index 0000000..0a28d7f --- /dev/null +++ b/0006-uadk-support-openssl-3.0.patch @@ -0,0 +1,915 @@ +From c6aab5dadf83fad2716b1687366d040303b1301c Mon Sep 17 00:00:00 2001 +From: Zhangfei Gao +Date: Fri, 9 Jun 2023 09:04:30 +0000 +Subject: [PATCH 6/7] uadk: support openssl 3.0 + +Openssl3.0 provoder will be built when libcrypto >= 3.0 + +First step to support digest + +Test with +openssl speed -provider xx/uadk_provider.so -provider default -evp md5 +openssl speed -provider xx/uadk_provider.so -provider default -evp sm3 +openssl speed -provider xx/uadk_provider.so -provider default -evp sha1 +openssl speed -provider xx/uadk_provider.so -provider default -evp sha2-224 +openssl speed -provider xx/uadk_provider.so -provider default -evp sha2-256 +openssl speed -provider xx/uadk_provider.so -provider default -evp sha2-384 +openssl speed -provider xx/uadk_provider.so -provider default -evp sha2-512 + +Signed-off-by: Zhangfei Gao +--- + src/Makefile.am | 11 + + src/uadk_prov.h | 30 ++ + src/uadk_prov_digest.c | 699 +++++++++++++++++++++++++++++++++++++++++ + src/uadk_prov_init.c | 110 +++++++ + 4 files changed, 850 insertions(+) + create mode 100644 src/uadk_prov.h + create mode 100644 src/uadk_prov_digest.c + create mode 100644 src/uadk_prov_init.c + +diff --git a/src/Makefile.am b/src/Makefile.am +index 65afe1d..bfaeb78 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -5,6 +5,10 @@ if HAVE_CRYPTO + lib_LTLIBRARIES=uadk_engine.la + endif #HAVE_CRYPTO + ++if HAVE_CRYPTO3 ++lib_LTLIBRARIES=uadk_provider.la ++endif #HAVE_CRYPTO3 ++ + uadk_engine_la_SOURCES=uadk_utils.c uadk_engine_init.c uadk_cipher.c \ + uadk_digest.c uadk_async.c uadk_rsa.c uadk_sm2.c \ + uadk_pkey.c uadk_dh.c uadk_ec.c uadk_ecx.c +@@ -45,3 +49,10 @@ uadk_engine_la_SOURCES+=v1/alg/ciphers/sec_ciphers.c \ + v1/async/async_poll.c \ + v1/async/async_task_queue.c + endif #WD_KAE ++ ++uadk_provider_la_SOURCES=uadk_prov_init.c uadk_prov_digest.c uadk_async.c uadk_utils.c ++ ++uadk_provider_la_LDFLAGS=-module -version-number $(VERSION) ++uadk_provider_la_LIBADD=$(WD_LIBS) -lpthread ++uadk_provider_la_CFLAGS=$(WD_CFLAGS) $(libcrypto_CFLAGS) ++uadk_provider_la_CFLAGS+=-DCRYPTO3 +diff --git a/src/uadk_prov.h b/src/uadk_prov.h +new file mode 100644 +index 0000000..c63c3fe +--- /dev/null ++++ b/src/uadk_prov.h +@@ -0,0 +1,30 @@ ++/* ++ * Copyright 2023-2024 Huawei Technologies Co.,Ltd. All rights reserved. ++ * Copyright 2023-2024 Linaro ltd. ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ * ++ */ ++#ifndef UADK_PROV_H ++#define UADK_PROV_H ++ ++extern const OSSL_DISPATCH uadk_md5_functions[]; ++extern const OSSL_DISPATCH uadk_sm3_functions[]; ++extern const OSSL_DISPATCH uadk_sha1_functions[]; ++extern const OSSL_DISPATCH uadk_sha224_functions[]; ++extern const OSSL_DISPATCH uadk_sha256_functions[]; ++extern const OSSL_DISPATCH uadk_sha384_functions[]; ++extern const OSSL_DISPATCH uadk_sha512_functions[]; ++ ++void uadk_prov_destroy_digest(void); ++#endif +diff --git a/src/uadk_prov_digest.c b/src/uadk_prov_digest.c +new file mode 100644 +index 0000000..fd05753 +--- /dev/null ++++ b/src/uadk_prov_digest.c +@@ -0,0 +1,699 @@ ++/* ++ * Copyright 2023-2024 Huawei Technologies Co.,Ltd. All rights reserved. ++ * Copyright 2023-2024 Linaro ltd. ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "uadk.h" ++#include "uadk_async.h" ++#include "uadk_utils.h" ++ ++#define UADK_DO_SOFT (-0xE0) ++#define CTX_SYNC 0 ++#define CTX_ASYNC 1 ++#define CTX_NUM 2 ++#define DIGEST_DOING 1 ++#define DIGEST_END 0 ++ ++/* The max BD data length is 16M-512B */ ++#define BUF_LEN 0xFFFE00 ++ ++#define SM3_DIGEST_LENGTH 32 ++#define SM3_CBLOCK 64 ++#define SM3_SMALL_PACKET_OFFLOAD_THRESHOLD_DEFAULT (512) ++#define MD5_SMALL_PACKET_OFFLOAD_THRESHOLD_DEFAULT (8 * 1024) ++#define SHA_SMALL_PACKET_OFFLOAD_THRESHOLD_DEFAULT (512) ++#define MAX_DIGEST_LENGTH 64 ++#define DIGEST_BLOCK_SIZE (512 * 1024) ++#define ALG_NAME_SIZE 128 ++ ++enum sec_digest_state { ++ SEC_DIGEST_INIT, ++ SEC_DIGEST_FIRST_UPDATING, ++ SEC_DIGEST_DOING, ++ SEC_DIGEST_FINAL ++}; ++ ++struct digest_threshold_table { ++ int nid; ++ int threshold; ++}; ++ ++struct digest_prov { ++ int pid; ++}; ++ ++static struct digest_prov prov; ++static pthread_mutex_t digest_mutex = PTHREAD_MUTEX_INITIALIZER; ++ ++struct evp_md_ctx_st { ++ const EVP_MD *digest; ++ /* Functional reference if 'digest' is ENGINE-provided */ ++ ENGINE *engine; ++ unsigned long flags; ++ void *md_data; ++ /* Public key context for sign/verify */ ++ EVP_PKEY_CTX *pctx; ++ /* Update function: usually copied from EVP_MD */ ++ int (*update)(EVP_MD_CTX *ctx, const void *data, size_t count); ++}; ++ ++struct digest_priv_ctx { ++ handle_t sess; ++ struct wd_digest_sess_setup setup; ++ struct wd_digest_req req; ++ unsigned char *data; ++ unsigned char out[MAX_DIGEST_LENGTH]; ++ EVP_MD_CTX *soft_ctx; ++ EVP_MD *soft_md; ++ size_t last_update_bufflen; ++ uint32_t e_nid; ++ uint32_t state; ++ uint32_t switch_threshold; ++ int switch_flag; ++ size_t md_size; ++ size_t blk_size; ++ char alg_name[ALG_NAME_SIZE]; ++}; ++ ++struct digest_info { ++ int nid; ++ enum wd_digest_mode mode; ++ enum wd_digest_type alg; ++ __u32 out_len; ++}; ++ ++static struct digest_threshold_table digest_pkt_threshold_table[] = { ++ { NID_sm3, SM3_SMALL_PACKET_OFFLOAD_THRESHOLD_DEFAULT }, ++ { NID_md5, MD5_SMALL_PACKET_OFFLOAD_THRESHOLD_DEFAULT }, ++ { NID_sha1, SHA_SMALL_PACKET_OFFLOAD_THRESHOLD_DEFAULT }, ++ { NID_sha224, SHA_SMALL_PACKET_OFFLOAD_THRESHOLD_DEFAULT }, ++ { NID_sha256, SHA_SMALL_PACKET_OFFLOAD_THRESHOLD_DEFAULT }, ++ { NID_sha384, SHA_SMALL_PACKET_OFFLOAD_THRESHOLD_DEFAULT }, ++ { NID_sha512, SHA_SMALL_PACKET_OFFLOAD_THRESHOLD_DEFAULT }, ++}; ++ ++static struct digest_info digest_info_table[] = { ++ {NID_md5, WD_DIGEST_NORMAL, WD_DIGEST_MD5, 16}, ++ {NID_sm3, WD_DIGEST_NORMAL, WD_DIGEST_SM3, 32}, ++ {NID_sha1, WD_DIGEST_NORMAL, WD_DIGEST_SHA1, 20}, ++ {NID_sha224, WD_DIGEST_NORMAL, WD_DIGEST_SHA224, 28}, ++ {NID_sha256, WD_DIGEST_NORMAL, WD_DIGEST_SHA256, 32}, ++ {NID_sha384, WD_DIGEST_NORMAL, WD_DIGEST_SHA384, 48}, ++ {NID_sha512, WD_DIGEST_NORMAL, WD_DIGEST_SHA512, 64}, ++}; ++ ++static int uadk_e_digests_soft_md(struct digest_priv_ctx *priv) ++{ ++ if (priv->soft_md) ++ return 1; ++ ++ switch (priv->e_nid) { ++ case NID_sm3: ++ priv->soft_md = EVP_MD_fetch(NULL, OSSL_DIGEST_NAME_SM3, "provider=default"); ++ break; ++ case NID_md5: ++ priv->soft_md = EVP_MD_fetch(NULL, OSSL_DIGEST_NAME_MD5, "provider=default"); ++ break; ++ case NID_sha1: ++ priv->soft_md = EVP_MD_fetch(NULL, OSSL_DIGEST_NAME_SHA1, "provider=default"); ++ break; ++ case NID_sha224: ++ priv->soft_md = EVP_MD_fetch(NULL, OSSL_DIGEST_NAME_SHA3_224, "provider=default"); ++ break; ++ case NID_sha256: ++ priv->soft_md = EVP_MD_fetch(NULL, OSSL_DIGEST_NAME_SHA3_256, "provider=default"); ++ break; ++ case NID_sha384: ++ priv->soft_md = EVP_MD_fetch(NULL, OSSL_DIGEST_NAME_SHA3_384, "provider=default"); ++ break; ++ case NID_sha512: ++ priv->soft_md = EVP_MD_fetch(NULL, OSSL_DIGEST_NAME_SHA3_512, "provider=default"); ++ break; ++ default: ++ break; ++ } ++ ++ if (unlikely(priv->soft_md == NULL)) ++ return 0; ++ ++ return 1; ++} ++ ++static uint32_t sec_digest_get_sw_threshold(int n_id) ++{ ++ int threshold_table_size = ARRAY_SIZE(digest_pkt_threshold_table); ++ int i = 0; ++ ++ do { ++ if (digest_pkt_threshold_table[i].nid == n_id) ++ return digest_pkt_threshold_table[i].threshold; ++ } while (++i < threshold_table_size); ++ ++ fprintf(stderr, "nid %d not found in digest threshold table", n_id); ++ return 0; ++} ++ ++static int digest_soft_init(struct digest_priv_ctx *priv) ++{ ++ return EVP_DigestInit(priv->soft_ctx, priv->soft_md); ++} ++ ++static int digest_soft_update(EVP_MD_CTX *ctx, const void *data, size_t len) ++{ ++ return EVP_DigestUpdate(ctx, data, len); ++} ++ ++static int digest_soft_final(struct digest_priv_ctx *priv, unsigned char *digest) ++{ ++ unsigned int digest_length = EVP_MD_get_size(priv->soft_md); ++ ++ return EVP_DigestFinal(priv->soft_ctx, digest, &digest_length); ++} ++ ++static void digest_soft_cleanup(struct digest_priv_ctx *priv) ++{ ++ EVP_MD_CTX *ctx = priv->soft_ctx; ++ ++ if (ctx != NULL) { ++ if (ctx->md_data) { ++ OPENSSL_free(ctx->md_data); ++ ctx->md_data = NULL; ++ } ++ EVP_MD_CTX_free(ctx); ++ ctx = NULL; ++ } ++ ++ if (priv->soft_md) { ++ EVP_MD_free(priv->soft_md); ++ priv->soft_md = NULL; ++ } ++} ++ ++static int uadk_e_digest_soft_work(struct digest_priv_ctx *priv, int len, ++ unsigned char *digest) ++{ ++ digest_soft_init(priv); ++ ++ if (len != 0) ++ digest_soft_update(priv->soft_ctx, priv->data, len); ++ ++ digest_soft_final(priv, digest); ++ digest_soft_cleanup(priv); ++ ++ return 1; ++} ++ ++static int uadk_e_digest_env_poll(void *ctx) ++{ ++ __u64 rx_cnt = 0; ++ __u32 recv = 0; ++ /* Poll one packet currently */ ++ int expt = 1; ++ int ret; ++ ++ do { ++ ret = wd_digest_poll(expt, &recv); ++ if (ret < 0 || recv == expt) ++ return ret; ++ rx_cnt++; ++ } while (rx_cnt < ENGINE_RECV_MAX_CNT); ++ ++ fprintf(stderr, "failed to poll msg: timeout!\n"); ++ ++ return -ETIMEDOUT; ++} ++ ++static int uadk_digest_init(struct digest_priv_ctx *priv) ++{ ++ int digest_counts = ARRAY_SIZE(digest_info_table); ++ struct sched_params params = {0}; ++ int nid = priv->e_nid; ++ int ret, i; ++ ++ pthread_mutex_lock(&digest_mutex); ++ if (prov.pid != getpid()) { ++ ret = wd_digest_init2(priv->alg_name, 0, 0); ++ if (unlikely(ret)) { ++ priv->switch_flag = UADK_DO_SOFT; ++ goto soft_init; ++ } ++ prov.pid = getpid(); ++ async_register_poll_fn(ASYNC_TASK_DIGEST, uadk_e_digest_env_poll); ++ } ++ pthread_mutex_unlock(&digest_mutex); ++ ++ for (i = 0; i < digest_counts; i++) { ++ if (nid == digest_info_table[i].nid) { ++ priv->setup.alg = digest_info_table[i].alg; ++ priv->setup.mode = digest_info_table[i].mode; ++ priv->req.out_buf_bytes = MAX_DIGEST_LENGTH; ++ priv->req.out_bytes = digest_info_table[i].out_len; ++ break; ++ } ++ } ++ ++ if (unlikely(i == digest_counts)) { ++ fprintf(stderr, "failed to setup the private ctx.\n"); ++ return 0; ++ } ++ ++ /* Use the default numa parameters */ ++ params.numa_id = -1; ++ priv->setup.sched_param = ¶ms; ++ priv->sess = wd_digest_alloc_sess(&priv->setup); ++ if (unlikely(!priv->sess)) ++ return 0; ++ ++ priv->data = malloc(DIGEST_BLOCK_SIZE); ++ if (unlikely(!priv->data)) { ++ wd_digest_free_sess(priv->sess); ++ return 0; ++ } ++ ++ if (uadk_e_digests_soft_md(priv)) ++ priv->switch_threshold = sec_digest_get_sw_threshold(nid); ++ ++ return 1; ++ ++soft_init: ++ pthread_mutex_unlock(&digest_mutex); ++ fprintf(stderr, "uadk failed to initialize digest.\n"); ++ return digest_soft_init(priv); ++} ++ ++static void digest_update_out_length(struct digest_priv_ctx *priv) ++{ ++ /* Sha224 and Sha384 need full length mac buffer as doing long hash */ ++ if (priv->e_nid == NID_sha224) ++ priv->req.out_bytes = WD_DIGEST_SHA224_FULL_LEN; ++ ++ if (priv->e_nid == NID_sha384) ++ priv->req.out_bytes = WD_DIGEST_SHA384_FULL_LEN; ++} ++ ++static int digest_update_inner(struct digest_priv_ctx *priv, const void *data, size_t data_len) ++{ ++ const unsigned char *tmpdata = (const unsigned char *)data; ++ size_t left_len = data_len; ++ int copy_to_bufflen; ++ int ret; ++ ++ digest_update_out_length(priv); ++ ++ priv->req.has_next = DIGEST_DOING; ++ ++ while (priv->last_update_bufflen + left_len > DIGEST_BLOCK_SIZE) { ++ copy_to_bufflen = DIGEST_BLOCK_SIZE - priv->last_update_bufflen; ++ uadk_memcpy(priv->data + priv->last_update_bufflen, tmpdata, ++ copy_to_bufflen); ++ ++ priv->last_update_bufflen = DIGEST_BLOCK_SIZE; ++ priv->req.in_bytes = DIGEST_BLOCK_SIZE; ++ priv->req.in = priv->data; ++ priv->req.out = priv->out; ++ left_len -= copy_to_bufflen; ++ tmpdata += copy_to_bufflen; ++ if (priv->state == SEC_DIGEST_INIT) ++ priv->state = SEC_DIGEST_FIRST_UPDATING; ++ else if (priv->state == SEC_DIGEST_FIRST_UPDATING) ++ priv->state = SEC_DIGEST_DOING; ++ ++ ret = wd_do_digest_sync(priv->sess, &priv->req); ++ if (ret) { ++ fprintf(stderr, "do sec digest sync failed, switch to soft digest.\n"); ++ goto do_soft_digest; ++ } ++ ++ priv->last_update_bufflen = 0; ++ if (left_len <= DIGEST_BLOCK_SIZE) { ++ priv->last_update_bufflen = left_len; ++ uadk_memcpy(priv->data, tmpdata, priv->last_update_bufflen); ++ break; ++ } ++ } ++ ++ return 1; ++ ++do_soft_digest: ++ if (priv->state == SEC_DIGEST_FIRST_UPDATING ++ && priv->data ++ && priv->last_update_bufflen != 0) { ++ priv->switch_flag = UADK_DO_SOFT; ++ digest_soft_init(priv); ++ ret = digest_soft_update(priv->soft_ctx, ++ priv->data, priv->last_update_bufflen); ++ if (ret != 1) ++ return ret; ++ ++ return digest_soft_update(priv->soft_ctx, ++ tmpdata, left_len); ++ } ++ ++ fprintf(stderr, "do soft digest failed during updating!\n"); ++ return 0; ++} ++ ++static int uadk_digest_update(struct digest_priv_ctx *priv, const void *data, size_t data_len) ++{ ++ if (unlikely(priv->switch_flag == UADK_DO_SOFT)) ++ goto soft_update; ++ ++ if (priv->last_update_bufflen + data_len <= DIGEST_BLOCK_SIZE) { ++ uadk_memcpy(priv->data + priv->last_update_bufflen, data, data_len); ++ priv->last_update_bufflen += data_len; ++ return 1; ++ } ++ ++ return digest_update_inner(priv, data, data_len); ++ ++soft_update: ++ return digest_soft_update(priv->soft_ctx, data, data_len); ++} ++ ++static void async_cb(struct wd_digest_req *req, void *data) ++{ ++ struct uadk_e_cb_info *cb_param; ++ struct async_op *op; ++ ++ if (!req) ++ return; ++ ++ cb_param = req->cb_param; ++ if (!cb_param) ++ return; ++ op = cb_param->op; ++ if (op && op->job && !op->done) { ++ op->done = 1; ++ async_free_poll_task(op->idx, 1); ++ async_wake_job(op->job); ++ } ++} ++ ++static int do_digest_sync(struct digest_priv_ctx *priv) ++{ ++ int ret; ++ ++ if (priv->req.in_bytes <= priv->switch_threshold && ++ priv->state == SEC_DIGEST_INIT) ++ return 0; ++ ++ ret = wd_do_digest_sync(priv->sess, &priv->req); ++ if (ret) { ++ fprintf(stderr, "do sec digest sync failed, switch to soft digest.\n"); ++ return 0; ++ } ++ return 1; ++} ++ ++static int do_digest_async(struct digest_priv_ctx *priv, struct async_op *op) ++{ ++ struct uadk_e_cb_info cb_param; ++ int idx, ret; ++ ++ if (unlikely(priv->switch_flag == UADK_DO_SOFT)) { ++ fprintf(stderr, "async cipher init failed.\n"); ++ return 0; ++ } ++ ++ cb_param.op = op; ++ cb_param.priv = priv; ++ priv->req.cb = (void *)async_cb; ++ priv->req.cb_param = &cb_param; ++ ++ ret = async_get_free_task(&idx); ++ if (!ret) ++ return 0; ++ ++ op->idx = idx; ++ ++ do { ++ ret = wd_do_digest_async(priv->sess, &priv->req); ++ if (ret < 0 && ret != -EBUSY) { ++ fprintf(stderr, "do sec digest async failed.\n"); ++ async_free_poll_task(op->idx, 0); ++ return 0; ++ } ++ } while (ret == -EBUSY); ++ ++ ret = async_pause_job(priv, op, ASYNC_TASK_DIGEST, idx); ++ if (!ret) ++ return 0; ++ return 1; ++} ++ ++static int uadk_digest_final(struct digest_priv_ctx *priv, unsigned char *digest) ++{ ++ struct async_op op; ++ int ret; ++ ++ priv->req.has_next = DIGEST_END; ++ priv->req.in = priv->data; ++ priv->req.out = priv->out; ++ priv->req.in_bytes = priv->last_update_bufflen; ++ ++ if (priv->e_nid == NID_sha224) ++ priv->req.out_bytes = WD_DIGEST_SHA224_LEN; ++ ++ if (priv->e_nid == NID_sha384) ++ priv->req.out_bytes = WD_DIGEST_SHA384_LEN; ++ ++ ret = async_setup_async_event_notification(&op); ++ if (unlikely(!ret)) { ++ fprintf(stderr, "failed to setup async event notification.\n"); ++ return 0; ++ } ++ ++ if (op.job == NULL) { ++ /* Synchronous, only the synchronous mode supports soft computing */ ++ if (unlikely(priv->switch_flag == UADK_DO_SOFT)) { ++ ret = digest_soft_final(priv, digest); ++ digest_soft_cleanup(priv); ++ goto clear; ++ } ++ ++ ret = do_digest_sync(priv); ++ if (!ret) ++ goto sync_err; ++ } else { ++ ret = do_digest_async(priv, &op); ++ if (!ret) ++ goto clear; ++ } ++ memcpy(digest, priv->req.out, priv->req.out_bytes); ++ ++ return 1; ++ ++sync_err: ++ if (priv->state == SEC_DIGEST_INIT) { ++ ret = uadk_e_digest_soft_work(priv, priv->req.in_bytes, digest); ++ } else { ++ ret = 0; ++ fprintf(stderr, "do sec digest stream mode failed.\n"); ++ } ++clear: ++ async_clear_async_event_notification(); ++ return ret; ++} ++ ++static int uadk_digest_cleanup(struct digest_priv_ctx *priv) ++{ ++ if (priv->sess) { ++ wd_digest_free_sess(priv->sess); ++ priv->sess = 0; ++ } ++ ++ if (priv->data) ++ OPENSSL_free(priv->data); ++ ++ return 1; ++} ++ ++/* some params related code is copied from OpenSSL v3.0 prov/digestcommon.h */ ++static const OSSL_PARAM uadk_digest_default_known_gettable_params[] = { ++ OSSL_PARAM_size_t(OSSL_DIGEST_PARAM_BLOCK_SIZE, NULL), ++ OSSL_PARAM_size_t(OSSL_DIGEST_PARAM_SIZE, NULL), ++ OSSL_PARAM_int(OSSL_DIGEST_PARAM_XOF, NULL), ++ OSSL_PARAM_int(OSSL_DIGEST_PARAM_ALGID_ABSENT, NULL), ++ OSSL_PARAM_END ++}; ++ ++static const OSSL_PARAM *uadk_prov_gettable_params(void *provctx) ++{ ++ return uadk_digest_default_known_gettable_params; ++} ++ ++static int uadk_digest_default_get_params(OSSL_PARAM params[], size_t blksz, ++ size_t paramsz) ++{ ++ OSSL_PARAM *p = NULL; ++ ++ p = OSSL_PARAM_locate(params, OSSL_DIGEST_PARAM_BLOCK_SIZE); ++ if (p != NULL && !OSSL_PARAM_set_size_t(p, blksz)) { ++ ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER); ++ return 0; ++ } ++ p = OSSL_PARAM_locate(params, OSSL_DIGEST_PARAM_SIZE); ++ if (p != NULL && !OSSL_PARAM_set_size_t(p, paramsz)) { ++ ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER); ++ return 0; ++ } ++ p = OSSL_PARAM_locate(params, OSSL_DIGEST_PARAM_XOF); ++ if (p != NULL ++ && !OSSL_PARAM_set_int(p, 0)) { ++ ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER); ++ return 0; ++ } ++ p = OSSL_PARAM_locate(params, OSSL_DIGEST_PARAM_ALGID_ABSENT); ++ if (p != NULL ++ && !OSSL_PARAM_set_int(p, 0)) { ++ ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER); ++ return 0; ++ } ++ ++ return 1; ++} ++ ++static void uadk_prov_freectx(void *dctx) ++{ ++ struct digest_priv_ctx *priv = (struct digest_priv_ctx *)dctx; ++ ++ uadk_digest_cleanup(priv); ++ OPENSSL_clear_free(priv, sizeof(*priv)); ++} ++ ++static void *uadk_prov_dupctx(void *dctx) ++{ ++ struct digest_priv_ctx *in; ++ struct digest_priv_ctx *ret; ++ ++ in = (struct digest_priv_ctx *)dctx; ++ ret = OPENSSL_zalloc(sizeof(struct digest_priv_ctx *)); ++ ++ if (ret != NULL) ++ *ret = *in; ++ return ret; ++} ++ ++static int uadk_prov_init(void *dctx, const OSSL_PARAM params[]) ++{ ++ struct digest_priv_ctx *priv = ++ (struct digest_priv_ctx *) dctx; ++ ++ return uadk_digest_init(priv); ++} ++ ++static int uadk_prov_update(void *dctx, const unsigned char *in, size_t inl) ++{ ++ return uadk_digest_update((struct digest_priv_ctx *)dctx, in, inl); ++} ++ ++/* ++ * Note: ++ * The I parameter contains a pointer to the provider side context. ++ * The digest should be written to I<*out> and the length of the digest to I<*outl>. ++ * The digest should not exceed I bytes. ++ */ ++static int uadk_prov_final(void *dctx, unsigned char *out, ++ size_t *outl, size_t outsz) ++{ ++ struct digest_priv_ctx *priv = ++ (struct digest_priv_ctx *) dctx; ++ int ret; ++ ++ if (outsz > 0) { ++ ret = uadk_digest_final(priv, out); ++ if (!ret) ++ return ret; ++ } ++ ++ if (unlikely(outl != NULL)) ++ *outl = priv->md_size; ++ ++ return 1; ++} ++ ++void uadk_prov_destroy_digest(void) ++{ ++ pthread_mutex_lock(&digest_mutex); ++ if (prov.pid == getpid()) { ++ wd_digest_uninit2(); ++ prov.pid = 0; ++ } ++ pthread_mutex_unlock(&digest_mutex); ++} ++ ++static OSSL_FUNC_digest_freectx_fn uadk_prov_freectx; ++static OSSL_FUNC_digest_dupctx_fn uadk_prov_dupctx; ++static OSSL_FUNC_digest_init_fn uadk_prov_init; ++static OSSL_FUNC_digest_update_fn uadk_prov_update; ++static OSSL_FUNC_digest_final_fn uadk_prov_final; ++static OSSL_FUNC_digest_gettable_params_fn ++ uadk_prov_gettable_params; ++ ++#define UADK_PROVIDER_IMPLEMENTATION(name, nid, mdsize, blksize) \ ++static OSSL_FUNC_digest_newctx_fn uadk_##name##_newctx; \ ++static void *uadk_##name##_newctx(void *provctx) \ ++{ \ ++ struct digest_priv_ctx *ctx = OPENSSL_zalloc(sizeof(*ctx)); \ ++ \ ++ if (ctx == NULL) \ ++ return NULL; \ ++ ctx->blk_size = blksize; \ ++ ctx->md_size = mdsize; \ ++ ctx->e_nid = nid; \ ++ ctx->soft_ctx = EVP_MD_CTX_new(); \ ++ if (ctx->soft_ctx == NULL) \ ++ fprintf(stderr, "EVP_MD_CTX_new failed.\n"); \ ++ strncpy(ctx->alg_name, #name, ALG_NAME_SIZE - 1); \ ++ return ctx; \ ++} \ ++static OSSL_FUNC_digest_get_params_fn uadk_##name##_get_params; \ ++static int uadk_##name##_get_params(OSSL_PARAM params[]) \ ++{ \ ++ return uadk_digest_default_get_params(params, blksize, mdsize); \ ++} \ ++const OSSL_DISPATCH uadk_##name##_functions[] = { \ ++ { OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))uadk_##name##_newctx }, \ ++ { OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))uadk_prov_freectx }, \ ++ { OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))uadk_prov_dupctx }, \ ++ { OSSL_FUNC_DIGEST_INIT, (void (*)(void))uadk_prov_init }, \ ++ { OSSL_FUNC_DIGEST_UPDATE, (void (*)(void))uadk_prov_update }, \ ++ { OSSL_FUNC_DIGEST_FINAL, (void (*)(void))uadk_prov_final }, \ ++ { OSSL_FUNC_DIGEST_GET_PARAMS, \ ++ (void (*)(void))uadk_##name##_get_params }, \ ++ { OSSL_FUNC_DIGEST_GETTABLE_PARAMS, \ ++ (void (*)(void))uadk_prov_gettable_params }, \ ++ { 0, NULL } \ ++} ++ ++UADK_PROVIDER_IMPLEMENTATION(md5, NID_md5, MD5_DIGEST_LENGTH, MD5_CBLOCK); ++UADK_PROVIDER_IMPLEMENTATION(sm3, NID_sm3, SM3_DIGEST_LENGTH, SM3_CBLOCK); ++UADK_PROVIDER_IMPLEMENTATION(sha1, NID_sha1, 20, 64); ++UADK_PROVIDER_IMPLEMENTATION(sha224, NID_sha224, 28, 64); ++UADK_PROVIDER_IMPLEMENTATION(sha256, NID_sha256, 32, 64); ++UADK_PROVIDER_IMPLEMENTATION(sha384, NID_sha384, 48, 128); ++UADK_PROVIDER_IMPLEMENTATION(sha512, NID_sha512, 64, 128); +diff --git a/src/uadk_prov_init.c b/src/uadk_prov_init.c +new file mode 100644 +index 0000000..e363584 +--- /dev/null ++++ b/src/uadk_prov_init.c +@@ -0,0 +1,110 @@ ++/* ++ * Copyright 2023-2024 Huawei Technologies Co.,Ltd. All rights reserved. ++ * Copyright 2023-2024 Linaro ltd. ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ * ++ */ ++ ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include "uadk_async.h" ++#include "uadk_prov.h" ++ ++struct p_uadk_ctx { ++ const OSSL_CORE_HANDLE *handle; ++ OSSL_LIB_CTX *libctx; ++}; ++ ++const char *engine_uadk_id = "uadk_provider"; ++static const char UADK_DEFAULT_PROPERTIES[] = "provider=uadk"; ++ ++const OSSL_ALGORITHM uadk_prov_digests[] = { ++ { OSSL_DIGEST_NAME_MD5, UADK_DEFAULT_PROPERTIES, ++ uadk_md5_functions, "uadk_provider md5" }, ++ { OSSL_DIGEST_NAME_SM3, UADK_DEFAULT_PROPERTIES, ++ uadk_sm3_functions, "uadk_provider sm3" }, ++ { OSSL_DIGEST_NAME_SHA1, UADK_DEFAULT_PROPERTIES, ++ uadk_sha1_functions, "uadk_provider sha1" }, ++ { OSSL_DIGEST_NAME_SHA2_224, UADK_DEFAULT_PROPERTIES, ++ uadk_sha224_functions, "uadk_provider sha2-224" }, ++ { OSSL_DIGEST_NAME_SHA2_256, UADK_DEFAULT_PROPERTIES, ++ uadk_sha256_functions, "uadk_provider sha2-256" }, ++ { OSSL_DIGEST_NAME_SHA2_384, UADK_DEFAULT_PROPERTIES, ++ uadk_sha384_functions, "uadk_provider sha2-384" }, ++ { OSSL_DIGEST_NAME_SHA2_512, UADK_DEFAULT_PROPERTIES, ++ uadk_sha512_functions, "uadk_provider sha2-512" }, ++ { NULL, NULL, NULL } ++}; ++ ++static const OSSL_ALGORITHM *p_prov_query(void *provctx, int operation_id, ++ int *no_cache) ++{ ++ *no_cache = 0; ++ ++ switch (operation_id) { ++ case OSSL_OP_DIGEST: ++ return uadk_prov_digests; ++ } ++ return NULL; ++} ++ ++static void p_teardown(void *provctx) ++{ ++ struct p_uadk_ctx *ctx = (struct p_uadk_ctx *)provctx; ++ ++ uadk_prov_destroy_digest(); ++ OPENSSL_free(ctx); ++} ++ ++static const OSSL_DISPATCH p_test_table[] = { ++ { OSSL_FUNC_PROVIDER_QUERY_OPERATION, (void (*)(void))p_prov_query }, ++ { OSSL_FUNC_PROVIDER_TEARDOWN, (void (*)(void))p_teardown }, ++ { 0, NULL } ++}; ++ ++static void provider_init_child_at_fork_handler(void) ++{ ++ int ret; ++ ++ ret = async_module_init(); ++ if (!ret) ++ fprintf(stderr, "async_module_init fail!\n"); ++} ++ ++int OSSL_provider_init(const OSSL_CORE_HANDLE *handle, ++ const OSSL_DISPATCH *oin, ++ const OSSL_DISPATCH **out, ++ void **provctx) ++{ ++ struct p_uadk_ctx *ctx; ++ int ret; ++ ++ ctx = OPENSSL_zalloc(sizeof(*ctx)); ++ if (ctx == NULL) ++ return 0; ++ ++ ret = async_module_init(); ++ if (!ret) ++ fprintf(stderr, "async_module_init fail!\n"); ++ pthread_atfork(NULL, NULL, provider_init_child_at_fork_handler); ++ ++ *provctx = (void *)ctx; ++ *out = p_test_table; ++ return 1; ++} +-- +2.25.1 + diff --git a/0007-README-update-openssl-3.0.patch b/0007-README-update-openssl-3.0.patch new file mode 100644 index 0000000..d565bb8 --- /dev/null +++ b/0007-README-update-openssl-3.0.patch @@ -0,0 +1,173 @@ +From bbf050d5f1eb525e881c7d581f913f2df27d2637 Mon Sep 17 00:00:00 2001 +From: Zhangfei Gao +Date: Tue, 13 Jun 2023 09:24:19 +0000 +Subject: [PATCH 7/7] README: update openssl 3.0 + +Update build steps for openssl 3.0 + +Also update sanity_test.sh +If ./configure --libdir=/usr/local/lib/ossl-modules/ +$ ./test/sanity_test.sh + +If ./configure --prefix=/tmp/build +$ ./test/sanity_test.sh /tmp/build/lib/uadk_provider.so + +Signed-off-by: Zhangfei Gao +--- + README.md | 34 ++++++++++++++++++++++++++------ + test/sanity_test.sh | 48 +++++++++++++++++++++++++++++++++++++++------ + 2 files changed, 70 insertions(+), 12 deletions(-) + +diff --git a/README.md b/README.md +index ac721e3..86676db 100644 +--- a/README.md ++++ b/README.md +@@ -13,7 +13,7 @@ OpenSSL engine for uadk + Prerequisites + ============= + * CPU: aarch64 +-* OpenSSL: 1.1.1f ++* OpenSSL: 1.1.1f or 3.0 + * libnuma + * zlib + +@@ -26,24 +26,26 @@ Build and install OpenSSL + ``` + git clone https://github.com/openssl/openssl.git + cd openssl +- git checkout -b OpenSSL_1_1_1f OpenSSL_1_1_1f ++ // For openssl1.1.1f ++ git checkout -b opensssl1.1 OpenSSL_1_1_1f ++ // for openssl 3.0 ++ git checkout -b openssl3.0 openssl-3.0.0 + ./config + make + sudo make install + openssl version + ``` + +-Run pkg-config to ensure env is setup correctly ++Setup env on-demand + ----------------------------------------------- + + ``` + $ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/ + $ pkg-config libcrypto --libs + -L/usr/local/lib -lcrypto +-``` + +-* export ``PKG_CONFIG_PATH`` is required on openEuler, +- where /usr/local/lib is not set as the default pkgconfig search path. ++ $ export LD_LIBRARY_PATH=/usr/local/lib ++``` + + Build and install UADK + ---------------------- +@@ -63,6 +65,7 @@ Build and install UADK + + Build and install UADK Engine + ----------------------------- ++For openssl 1.1 + ``` + git clone https://github.com/Linaro/uadk_engine.git + cd uadk_engine +@@ -74,6 +77,20 @@ Build and install UADK Engine + Option --enable-kae can be chosen to enable KAE for non-sva version + ``` + ++For openssl 3.0 ++``` ++ git clone https://github.com/Linaro/uadk_engine.git ++ cd uadk_engine ++ autoreconf -i ++ // openEuler ++ ./configure --libdir=/usr/local/lib/engines-3/ ++ // ubuntu ++ ./configure --libdir=/usr/local/lib/ossl-modules/ ++ make ++ sudo make install ++ ++``` ++ + Testing + ------- + ``` +@@ -109,9 +126,14 @@ Install libraries to the temp folder + $ ./configure --prefix=/tmp/build + $ make; make install + ++ // For openssl 1.1 + $ openssl engine -c /tmp/build/lib/uadk_engine.so + $ ./test/sanity_test.sh /tmp/build/lib/uadk_engine.so + ++ // For openssl 3.0 ++ $ openssl speed -provider /tmp/build/lib/uadk_provider.so -provider default -evp md5 ++ $ ./test/sanity_test.sh /tmp/build/lib/uadk_provider.so ++ + ``` + + Environment variable of uadk engine +diff --git a/test/sanity_test.sh b/test/sanity_test.sh +index bdedc15..899d02c 100755 +--- a/test/sanity_test.sh ++++ b/test/sanity_test.sh +@@ -2,14 +2,50 @@ + + sudo chmod 666 /dev/hisi_* + +-if [ ! -n "$1" ]; then +- engine_id=uadk_engine +-else +- engine_id=$1 ++ ++version=$(openssl version) ++echo $version ++if [[ $version =~ "3.0" ]]; then ++ echo "openssl 3.0" ++ if [ ! -n "$1" ]; then ++ engine_id=uadk_provider ++ else ++ engine_id=$1 ++ fi ++ ++ digest_algs=$(openssl list -provider $engine_id -digest-algorithms) ++fi ++ ++if [[ $digest_algs =~ "uadk_provider" ]]; then ++ echo "uadk_provider testing digest" ++ openssl speed -provider $engine_id -provider default -evp md5 ++ openssl speed -provider $engine_id -provider default -evp sm3 ++ openssl speed -provider $engine_id -provider default -evp sha1 ++ openssl speed -provider $engine_id -provider default -evp sha2-224 ++ openssl speed -provider $engine_id -provider default -evp sha2-256 ++ openssl speed -provider $engine_id -provider default -evp sha2-384 ++ openssl speed -provider $engine_id -provider default -evp sha2-512 ++ ++ openssl speed -provider $engine_id -provider default -async_jobs 1 -evp md5 ++ openssl speed -provider $engine_id -provider default -async_jobs 1 -evp sm3 ++ openssl speed -provider $engine_id -provider default -async_jobs 1 -evp sha1 ++ openssl speed -provider $engine_id -provider default -async_jobs 1 -evp sha2-224 ++ openssl speed -provider $engine_id -provider default -async_jobs 1 -evp sha2-256 ++ openssl speed -provider $engine_id -provider default -async_jobs 1 -evp sha2-384 ++ openssl speed -provider $engine_id -provider default -async_jobs 1 -evp sha2-512 + fi + +-algs=$(openssl engine -c $engine_id) +-echo $algs ++if [[ $version =~ "1.1.1" ]]; then ++ echo "openssl 1.1.1" ++ if [ ! -n "$1" ]; then ++ engine_id=uadk_engine ++ else ++ engine_id=$1 ++ fi ++ ++ algs=$(openssl engine -c $engine_id) ++ echo $algs ++fi + + #digest + if [[ $algs =~ "MD5" ]]; then +-- +2.25.1 + diff --git a/0007-rsa-cleanup-about-reducing-function-parameters.patch b/0007-rsa-cleanup-about-reducing-function-parameters.patch deleted file mode 100644 index b732175..0000000 --- a/0007-rsa-cleanup-about-reducing-function-parameters.patch +++ /dev/null @@ -1,349 +0,0 @@ -From 273cf10d03532e73dfcd9f8a1223bfecb64d0f16 Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Wed, 22 Dec 2021 10:51:48 +0000 -Subject: [PATCH 07/18] rsa: cleanup about reducing function parameters - -Reduce the number of parameters of functions -related to prime, and make the name of those -functions clearer. - -Signed-off-by: Zhiqi Song ---- - src/uadk_rsa.c | 155 ++++++++++++++++++++++++++++++------------------- - 1 file changed, 95 insertions(+), 60 deletions(-) - -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index cb98159..c1609ca 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -97,6 +97,14 @@ struct rsa_prikey_param { - int is_crt; - }; - -+struct rsa_prime_param { -+ BIGNUM *r1; -+ BIGNUM *r2; -+ BIGNUM *rsa_p; -+ BIGNUM *rsa_q; -+ BIGNUM *prime; -+}; -+ - struct uadk_rsa_sess { - handle_t sess; - struct wd_rsa_sess_setup setup; -@@ -156,15 +164,14 @@ static int rsa_check_bit_useful(const int bits, int flen) - } - } - --static int prime_mul_res(int num, BIGNUM *rsa_p, BIGNUM *rsa_q, BIGNUM *r1, -- BN_CTX *ctx, BN_GENCB *cb) -+static int rsa_prime_mul_res(int num, BIGNUM *rsa_p, BIGNUM *rsa_q, BIGNUM *r1, -+ BN_CTX *ctx, BN_GENCB *cb) - { -- /* calculate n = p * q */ - if (num == 1) { - if (!BN_mul(r1, rsa_p, rsa_q, ctx)) - return BN_ERR; - } else { -- /* if num == 0, use number 3 to indicate do nothing */ -+ /* If num == 0, use number 3 to indicate do nothing */ - if (!BN_GENCB_call(cb, 3, num)) - return BN_ERR; - return BN_CONTINUE; -@@ -173,20 +180,21 @@ static int prime_mul_res(int num, BIGNUM *rsa_p, BIGNUM *rsa_q, BIGNUM *r1, - return BN_VALID; - } - --static int check_prime_sufficient(int *num, const int *bitsr, int *bitse, -- const int *n, BIGNUM *rsa_p, BIGNUM *rsa_q, -- BIGNUM *r1, BIGNUM *r2, BN_CTX *ctx, -- BN_GENCB *cb) -+static int check_rsa_prime_sufficient(int *num, const int *bitsr, -+ int *bitse, const int *n, -+ struct rsa_prime_param *param, -+ BN_CTX *ctx, BN_GENCB *cb) - { - static int retries; - BN_ULONG bitst; - int ret; - -- ret = prime_mul_res(*num, rsa_p, rsa_q, r1, ctx, cb); -+ ret = rsa_prime_mul_res(*num, param->rsa_p, param->rsa_q, -+ param->r1, ctx, cb); - if (ret) - return ret; - /* -- * if |r1|, product of factors so far, is not as long as expected -+ * If |r1|, product of factors so far, is not as long as expected - * (by checking the first 4 bits are less than 0x9 or greater than - * 0xF). If so, re-generate the last prime. - * -@@ -199,10 +207,10 @@ static int check_prime_sufficient(int *num, const int *bitsr, int *bitse, - * key by using the modulus in a certificate. This is also covered - * by checking the length should not be less than 0x9. - */ -- if (!BN_rshift(r2, r1, *bitse - 4)) -+ if (!BN_rshift(param->r2, param->r1, *bitse - 4)) - return BN_ERR; - -- bitst = BN_get_word(r2); -+ bitst = BN_get_word(param->r2); - if (bitst < 0x9 || bitst > 0xF) { - /* - * For keys with more than 4 primes, we attempt longer factor to -@@ -216,7 +224,9 @@ static int check_prime_sufficient(int *num, const int *bitsr, int *bitse, - *bitse -= bitsr[*num]; - else - return -1; -- if (!BN_GENCB_call(cb, 2, *n++)) -+ -+ ret = BN_GENCB_call(cb, 2, *n++); -+ if (!ret) - return -1; - if (retries == 4) { - *num = -1; -@@ -227,14 +237,17 @@ static int check_prime_sufficient(int *num, const int *bitsr, int *bitse, - retries++; - return BN_REDO; - } -- if (!BN_GENCB_call(cb, 3, *num)) -+ -+ ret = BN_GENCB_call(cb, 3, *num); -+ if (!ret) - return BN_ERR; - retries = 0; - - return BN_VALID; - } - --static void set_primes(int num, BIGNUM *rsa_p, BIGNUM *rsa_q, BIGNUM **prime) -+static void rsa_set_primes(int num, BIGNUM *rsa_p, BIGNUM *rsa_q, -+ BIGNUM **prime) - { - if (num == 0) - *prime = rsa_p; -@@ -244,8 +257,8 @@ static void set_primes(int num, BIGNUM *rsa_p, BIGNUM *rsa_q, BIGNUM **prime) - BN_set_flags(*prime, BN_FLG_CONSTTIME); - } - --static int check_prime_equal(int num, BIGNUM *rsa_p, BIGNUM *rsa_q, -- BIGNUM *prime) -+static int check_rsa_prime_equal(int num, BIGNUM *rsa_p, BIGNUM *rsa_q, -+ BIGNUM *prime) - { - BIGNUM *prev_prime; - int j; -@@ -268,8 +281,8 @@ static int check_prime_equal(int num, BIGNUM *rsa_p, BIGNUM *rsa_q, - return UADK_E_SUCCESS; - } - --static int check_prime_useful(const int *n, BIGNUM *prime, BIGNUM *r1, BIGNUM *r2, -- BIGNUM *e_pub, BN_CTX *ctx, BN_GENCB *cb) -+static int check_rsa_prime_useful(const int *n, struct rsa_prime_param *param, -+ BIGNUM *e_pub, BN_CTX *ctx, BN_GENCB *cb) - { - unsigned long err; - /* -@@ -278,10 +291,10 @@ static int check_prime_useful(const int *n, BIGNUM *prime, BIGNUM *r1, BIGNUM *r - * BN_value_one() returns a BIGNUM constant of value 1. - * r2 = prime - 1. - */ -- if (!BN_sub(r2, prime, BN_value_one())) -+ if (!BN_sub(param->r2, param->prime, BN_value_one())) - return -1; - ERR_set_mark(); -- BN_set_flags(r2, BN_FLG_CONSTTIME); -+ BN_set_flags(param->r2, BN_FLG_CONSTTIME); - /* - * BN_mod_inverse(r,a,n,ctx) used to compute inverse modulo n. - * Precisely, it computes the inverse of "a" modulo "n", and places -@@ -290,7 +303,7 @@ static int check_prime_useful(const int *n, BIGNUM *prime, BIGNUM *r1, BIGNUM *r - * The expected result: (r2 * r1) % e_pub ==1, - * the inverse of r2 exist, that is r1. - */ -- if (BN_mod_inverse(r1, r2, e_pub, ctx)) -+ if (BN_mod_inverse(param->r1, param->r2, e_pub, ctx)) - return UADK_E_SUCCESS; - - err = ERR_peek_last_error(); -@@ -307,10 +320,9 @@ static int check_prime_useful(const int *n, BIGNUM *prime, BIGNUM *r1, BIGNUM *r - return GET_ERR_FINISH; - } - --static int get_prime_once(int num, const int *bitsr, const int *n, -- BIGNUM *prime, BIGNUM *rsa_p, BIGNUM *rsa_q, -- BIGNUM *r1, BIGNUM *r2, BIGNUM *e_pub, -- BN_CTX *ctx, BN_GENCB *cb) -+static int get_rsa_prime_once(int num, const int *bitsr, const int *n, -+ BIGNUM *e_pub, struct rsa_prime_param *param, -+ BN_CTX *ctx, BN_GENCB *cb) - { - int ret = -1; - -@@ -318,12 +330,13 @@ static int get_prime_once(int num, const int *bitsr, const int *n, - return ret; - while (1) { - /* Generate prime with bitsr[num] len. */ -- if (!BN_generate_prime_ex(prime, bitsr[num], -+ if (!BN_generate_prime_ex(param->prime, bitsr[num], - 0, NULL, NULL, cb)) - return BN_ERR; -- if (!check_prime_equal(num, rsa_p, rsa_q, prime)) -+ if (!check_rsa_prime_equal(num, param->rsa_p, param->rsa_q, -+ param->prime)) - continue; -- ret = check_prime_useful(n, prime, r1, r2, e_pub, ctx, cb); -+ ret = check_rsa_prime_useful(n, param, e_pub, ctx, cb); - if (ret == BN_ERR) - return BN_ERR; - else if (ret == UADK_E_SUCCESS) -@@ -333,8 +346,7 @@ static int get_prime_once(int num, const int *bitsr, const int *n, - return ret; - } - --static void switch_p_q(BIGNUM *rsa_p, BIGNUM *rsa_q, -- BIGNUM *p, BIGNUM *q) -+static void rsa_switch_p_q(BIGNUM *rsa_p, BIGNUM *rsa_q, BIGNUM *p, BIGNUM *q) - { - BIGNUM *tmp; - -@@ -373,13 +385,37 @@ static int check_rsa_is_crt(RSA *rsa) - return UN_SET; - } - -+static int get_rsa_prime_param(struct rsa_prime_param *param, BN_CTX *ctx) -+{ -+ param->r1 = BN_CTX_get(ctx); -+ if (!param->r1) -+ goto end; -+ -+ param->r2 = BN_CTX_get(ctx); -+ if (!param->r2) -+ goto end; -+ -+ param->rsa_p = BN_CTX_get(ctx); -+ if (!param->rsa_p) -+ goto end; -+ -+ param->rsa_q = BN_CTX_get(ctx); -+ if (!param->rsa_q) -+ goto end; -+ -+ return UADK_E_SUCCESS; -+ -+end: -+ fprintf(stderr, "failed to malloc params\n"); -+ return UADK_E_FAIL; -+} -+ - static int rsa_primes_gen(int bits, BIGNUM *e_pub, BIGNUM *p, - BIGNUM *q, BN_GENCB *cb) - { -- BIGNUM *r1, *r2, *rsa_p, *rsa_q; -+ struct rsa_prime_param *param = NULL; - int bitsr[RSA_MAX_PRIME_NUM] = {0}; - int flag, quo, rmd, i; -- BIGNUM *prime = NULL; - BN_CTX *ctx; - int bitse = 0; - int ret = 0; -@@ -391,12 +427,15 @@ static int rsa_primes_gen(int bits, BIGNUM *e_pub, BIGNUM *p, - return ret; - - BN_CTX_start(ctx); -- r1 = BN_CTX_get(ctx); -- r2 = BN_CTX_get(ctx); -- rsa_p = BN_CTX_get(ctx); -- rsa_q = BN_CTX_get(ctx); -- if (!r1 || !r2 || !rsa_p || !rsa_q) -- goto err; -+ param = OPENSSL_zalloc(sizeof(struct rsa_prime_param)); -+ if (!param) { -+ fprintf(stderr, "failed to malloc rsa prime param\n"); -+ goto free_ctx; -+ } -+ -+ ret = get_rsa_prime_param(param, ctx); -+ if (!ret) -+ goto free_param; - - /* Divide bits into 'primes' pieces evenly */ - quo = bits / RSA_MAX_PRIME_NUM; -@@ -409,39 +448,37 @@ static int rsa_primes_gen(int bits, BIGNUM *e_pub, BIGNUM *p, - /* flag: whether primes are generated correctely. */ - flag = 1; - /* Set flag for primes rsa_p and rsa_q separately. */ -- set_primes(i, rsa_p, rsa_q, &prime); -+ rsa_set_primes(i, param->rsa_p, param->rsa_q, ¶m->prime); - while (flag == 1) { -- if (get_prime_once(i, bitsr, &n, prime, rsa_p, rsa_q, -- r1, r2, e_pub, ctx, cb) == -1) -- goto err; -+ ret = get_rsa_prime_once(i, bitsr, &n, e_pub, param, -+ ctx, cb); -+ if (ret == -1) -+ goto free_param; - bitse += bitsr[i]; -- ret = check_prime_sufficient(&i, bitsr, &bitse, &n, -- rsa_p, rsa_q, r1, r2, -- ctx, cb); -+ ret = check_rsa_prime_sufficient(&i, bitsr, &bitse, &n, -+ param, ctx, cb); - if (ret == BN_ERR) -- goto err; -+ goto free_param; - else if (ret == BN_REDO) - continue; - else - flag = 0; - } - } -- switch_p_q(rsa_p, rsa_q, p, q); -+ rsa_switch_p_q(param->rsa_p, param->rsa_q, p, q); - - ret = UADK_E_SUCCESS; - --err: -- if (ctx) { -- BN_CTX_end(ctx); -- BN_CTX_free(ctx); -- } -- -+free_param: -+ OPENSSL_free(param); -+free_ctx: -+ BN_CTX_end(ctx); -+ BN_CTX_free(ctx); - return ret; - } - - static int add_rsa_pubenc_padding(int flen, const unsigned char *from, -- unsigned char *buf, int num, -- int padding) -+ unsigned char *buf, int num, int padding) - { - int ret; - -@@ -852,8 +889,7 @@ static struct uadk_rsa_sess *rsa_get_eng_session(RSA *rsa, unsigned int bits, - - static int rsa_fill_pubkey(struct rsa_pubkey_param *pubkey_param, - struct uadk_rsa_sess *rsa_sess, -- unsigned char *in_buf, -- unsigned char *to) -+ unsigned char *in_buf, unsigned char *to) - { - struct wd_rsa_pubkey *pubkey = NULL; - struct wd_dtb *wd_e = NULL; -@@ -882,8 +918,7 @@ static int rsa_fill_pubkey(struct rsa_pubkey_param *pubkey_param, - - static int rsa_fill_prikey(RSA *rsa, struct uadk_rsa_sess *rsa_sess, - struct rsa_prikey_param *pri, -- unsigned char *in_buf, -- unsigned char *to) -+ unsigned char *in_buf, unsigned char *to) - { - struct wd_rsa_prikey *prikey; - struct wd_dtb *wd_dq; --- -2.24.4 - diff --git a/0008-cipher-fix-double-free-error.patch b/0008-cipher-fix-double-free-error.patch new file mode 100644 index 0000000..e229475 --- /dev/null +++ b/0008-cipher-fix-double-free-error.patch @@ -0,0 +1,29 @@ +From 516c9a1c8f77e8d1d91c78478425b4df585ec485 Mon Sep 17 00:00:00 2001 +From: taoqi +Date: Tue, 20 Jun 2023 22:38:01 +0800 +Subject: [PATCH 08/10] cipher: fix double free error + +When wd_cipher_set_key() failed, after the handle +is released, the handle should be set to 0 to avoid +reusing. + +Signed-off-by: taoqi +--- + src/uadk_cipher.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c +index c7be21a..1905e47 100644 +--- a/src/uadk_cipher.c ++++ b/src/uadk_cipher.c +@@ -878,6 +878,7 @@ static void uadk_e_ctx_init(EVP_CIPHER_CTX *ctx, struct cipher_priv_ctx *priv) + ret = wd_cipher_set_key(priv->sess, priv->key, EVP_CIPHER_CTX_key_length(ctx)); + if (ret) { + wd_cipher_free_sess(priv->sess); ++ priv->sess = 0; + fprintf(stderr, "uadk failed to set key!\n"); + } + } +-- +2.25.1 + diff --git a/0008-ecc-cleanup-sm2-compute-digest-function.patch b/0008-ecc-cleanup-sm2-compute-digest-function.patch deleted file mode 100644 index e4647bb..0000000 --- a/0008-ecc-cleanup-sm2-compute-digest-function.patch +++ /dev/null @@ -1,355 +0,0 @@ -From b99452edd6ae045e833e3ae01866b8546fd5733a Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Fri, 24 Dec 2021 07:30:22 +0000 -Subject: [PATCH 08/18] ecc: cleanup sm2 compute digest function - -The operation flow of sm2_compute_z_digest() -is modularized and encapsulated to reduce -the code line of sm2_compute_z_digest() and -make the code easier to understand. - -Signed-off-by: Zhiqi Song ---- - src/uadk_sm2.c | 277 +++++++++++++++++++++++++++++++++++-------------- - 1 file changed, 197 insertions(+), 80 deletions(-) - -diff --git a/src/uadk_sm2.c b/src/uadk_sm2.c -index d74aa3a..6d5dad0 100644 ---- a/src/uadk_sm2.c -+++ b/src/uadk_sm2.c -@@ -62,6 +62,26 @@ typedef struct sm2_ciphertext { - ASN1_OCTET_STRING *C2; - } SM2_Ciphertext; - -+struct sm2_param { -+ /* -+ * p: BIGNUM with the prime number (GFp) or the polynomial -+ * defining the underlying field (GF2m) -+ */ -+ BIGNUM *p; -+ /* a: BIGNUM for parameter a of the equation */ -+ BIGNUM *a; -+ /* b: BIGNUM for parameter b of the equation */ -+ BIGNUM *b; -+ /* xG: BIGNUM for the x-coordinate value of G point */ -+ BIGNUM *xG; -+ /* yG: BIGNUM for the y-coordinate value of G point */ -+ BIGNUM *yG; -+ /* xA: BIGNUM for the x-coordinate value of PA point */ -+ BIGNUM *xA; -+ /* yA: BIGNUM for the y-coordinate value of PA point */ -+ BIGNUM *yA; -+}; -+ - DECLARE_ASN1_FUNCTIONS(SM2_Ciphertext) - - ASN1_SEQUENCE(SM2_Ciphertext) = { -@@ -695,8 +715,7 @@ static int sm2_verify_init(EVP_PKEY_CTX *ctx) - } - - static int sm2_verify_init_iot(handle_t sess, struct wd_ecc_req *req, -- struct wd_dtb *e, -- struct wd_dtb *r, -+ struct wd_dtb *e, struct wd_dtb *r, - struct wd_dtb *s) - { - struct wd_ecc_in *ecc_in; -@@ -1229,119 +1248,217 @@ static int sm2_ctrl_str(EVP_PKEY_CTX *ctx, - return UADK_E_INVALID; - } - --static int sm2_compute_z_digest(uint8_t *out, -- const EVP_MD *digest, -- const uint8_t *id, -- const size_t id_len, -- const EC_KEY *key) -+static int get_sm2_param(struct sm2_param *sm2_param, BN_CTX *ctx) - { -- const EC_GROUP *group = EC_KEY_get0_group(key); -- EVP_MD_CTX *hash = NULL; -- uint8_t *buf = NULL; -- BN_CTX *ctx = NULL; -- BIGNUM *p = NULL; -- BIGNUM *a = NULL; -- BIGNUM *b = NULL; -- BIGNUM *xG = NULL; -- BIGNUM *yG = NULL; -- BIGNUM *xA = NULL; -- BIGNUM *yA = NULL; -- uint8_t e_byte; -- uint16_t entl; -- int p_bytes; -- int rc = 0; -+ sm2_param->p = BN_CTX_get(ctx); -+ if (!sm2_param->p) -+ goto end; - -- hash = EVP_MD_CTX_new(); -- ctx = BN_CTX_new(); -- if (hash == NULL || ctx == NULL) { -- fprintf(stderr, "failed to EVP_CTX_new\n"); -- goto done; -- } -+ sm2_param->a = BN_CTX_get(ctx); -+ if (!sm2_param->a) -+ goto end; - -- p = BN_CTX_get(ctx); -- a = BN_CTX_get(ctx); -- b = BN_CTX_get(ctx); -- xG = BN_CTX_get(ctx); -- yG = BN_CTX_get(ctx); -- xA = BN_CTX_get(ctx); -- yA = BN_CTX_get(ctx); -- if (yA == NULL) { -- fprintf(stderr, "failed to malloc\n"); -- goto done; -- } -+ sm2_param->b = BN_CTX_get(ctx); -+ if (!sm2_param->b) -+ goto end; -+ -+ sm2_param->xG = BN_CTX_get(ctx); -+ if (!sm2_param->xG) -+ goto end; -+ -+ sm2_param->yG = BN_CTX_get(ctx); -+ if (!sm2_param->yG) -+ goto end; -+ -+ sm2_param->xA = BN_CTX_get(ctx); -+ if (!sm2_param->xA) -+ goto end; -+ -+ sm2_param->yA = BN_CTX_get(ctx); -+ if (!sm2_param->yA) -+ goto end; -+ -+ return 1; -+ -+end: -+ fprintf(stderr, "failed to malloc params\n"); -+ return 0; -+} -+ -+static int check_digest_evp_lib(const EVP_MD *digest, EVP_MD_CTX *hash, -+ const size_t id_len, const uint8_t *id) -+{ -+ uint8_t e_byte; -+ uint16_t entl; - - if (!EVP_DigestInit(hash, digest)) { - fprintf(stderr, "error evp lib\n"); -- goto done; -+ return 0; - } - - /* Z = h(ENTL || ID || a || b || xG || yG || xA || yA) */ - if (id_len >= (UINT16_MAX / 8)) { -- /* too large */ - fprintf(stderr, "id too large\n"); -- goto done; -+ return 0; - } - - entl = (uint16_t)(8 * id_len); - - e_byte = entl >> 8; -- if (!EVP_DigestUpdate(hash, &e_byte, 1)) { -- fprintf(stderr, "error evp lib\n"); -- goto done; -- } -+ if (!EVP_DigestUpdate(hash, &e_byte, 1)) { -+ fprintf(stderr, "error evp lib\n"); -+ return 0; -+ } -+ - e_byte = entl & 0xFF; - if (!EVP_DigestUpdate(hash, &e_byte, 1)) { - fprintf(stderr, "error evp lib\n"); -- goto done; -+ return 0; - } - - if (id_len > 0 && !EVP_DigestUpdate(hash, id, id_len)) { - fprintf(stderr, "error evp lib\n"); -- goto done; -+ return 0; - } - -- if (!EC_GROUP_get_curve(group, p, a, b, ctx)) { -- fprintf(stderr, "error ec lib\n"); -- goto done; -+ return 1; -+} -+ -+static int check_equation_param(struct sm2_param *param, EVP_MD_CTX *hash, -+ uint8_t *buf, int p_bytes) -+{ -+ if (BN_bn2binpad(param->a, buf, p_bytes) < 0 || -+ !EVP_DigestUpdate(hash, buf, p_bytes) || -+ BN_bn2binpad(param->b, buf, p_bytes) < 0 || -+ !EVP_DigestUpdate(hash, buf, p_bytes)) { -+ fprintf(stderr, "failed to check equation param\n"); -+ return 0; - } - -- p_bytes = BN_num_bytes(p); -- buf = OPENSSL_zalloc(p_bytes); -- if (buf == NULL) { -- fprintf(stderr, "failed to malloc\n"); -- goto done; -+ return 1; -+} -+ -+ -+static int check_base_point_group_param(struct sm2_param *param, BN_CTX *ctx, -+ const EC_KEY *key) -+{ -+ const EC_GROUP *group = EC_KEY_get0_group(key); -+ -+ if (!EC_POINT_get_affine_coordinates(group, -+ EC_GROUP_get0_generator(group), -+ param->xG, param->yG, ctx)) { -+ fprintf(stderr, "failed to check base point group param\n"); -+ return 0; - } - -- if (BN_bn2binpad(a, buf, p_bytes) < 0 -- || !EVP_DigestUpdate(hash, buf, p_bytes) -- || BN_bn2binpad(b, buf, p_bytes) < 0 -- || !EVP_DigestUpdate(hash, buf, p_bytes) -- || !EC_POINT_get_affine_coordinates(group, -- EC_GROUP_get0_generator(group), -- xG, yG, ctx) -- || BN_bn2binpad(xG, buf, p_bytes) < 0 -- || !EVP_DigestUpdate(hash, buf, p_bytes) -- || BN_bn2binpad(yG, buf, p_bytes) < 0 -- || !EVP_DigestUpdate(hash, buf, p_bytes) -- || !EC_POINT_get_affine_coordinates(group, -- EC_KEY_get0_public_key(key), -- xA, yA, ctx) -- || BN_bn2binpad(xA, buf, p_bytes) < 0 -- || !EVP_DigestUpdate(hash, buf, p_bytes) -- || BN_bn2binpad(yA, buf, p_bytes) < 0 -- || !EVP_DigestUpdate(hash, buf, p_bytes) -- || !EVP_DigestFinal(hash, out, NULL)) { -- fprintf(stderr, "internal error\n"); -- goto done; -+ return 1; -+} -+ -+static int check_base_point_param(struct sm2_param *param, EVP_MD_CTX *hash, -+ uint8_t *buf, int p_bytes) -+{ -+ if (BN_bn2binpad(param->xG, buf, p_bytes) < 0 || -+ !EVP_DigestUpdate(hash, buf, p_bytes) || -+ BN_bn2binpad(param->yG, buf, p_bytes) < 0 || -+ !EVP_DigestUpdate(hash, buf, p_bytes)) { -+ fprintf(stderr, "failed to check base point param\n"); -+ return 0; - } - -- rc = 1; -+ return 1; -+} - --done: -+static int check_pkey_point_group_param(struct sm2_param *param, BN_CTX *ctx, -+ const EC_KEY *key) -+{ -+ const EC_GROUP *group = EC_KEY_get0_group(key); -+ -+ if (!EC_POINT_get_affine_coordinates(group, -+ EC_KEY_get0_public_key(key), -+ param->xA, param->yA, ctx)) { -+ fprintf(stderr, "failed to check pkey point group param\n"); -+ return 0; -+ } -+ return 1; -+} -+ -+static int check_pkey_point_param(struct sm2_param *param, EVP_MD_CTX *hash, -+ uint8_t *buf, int p_bytes, uint8_t *out) -+{ -+ if (BN_bn2binpad(param->xA, buf, p_bytes) < 0 || -+ !EVP_DigestUpdate(hash, buf, p_bytes) || -+ BN_bn2binpad(param->yA, buf, p_bytes) < 0 || -+ !EVP_DigestUpdate(hash, buf, p_bytes) || -+ !EVP_DigestFinal(hash, out, NULL)) { -+ fprintf(stderr, "failed to check pkey point param\n"); -+ return 0; -+ } -+ -+ return 1; -+} -+ -+static int sm2_compute_z_digest(uint8_t *out, const EVP_MD *digest, -+ const uint8_t *id, const size_t id_len, -+ const EC_KEY *key) -+{ -+ const EC_GROUP *group = EC_KEY_get0_group(key); -+ struct sm2_param *param = NULL; -+ EVP_MD_CTX *hash = NULL; -+ uint8_t *buf = NULL; -+ BN_CTX *ctx = NULL; -+ int p_bytes; -+ int ret = 0; -+ -+ hash = EVP_MD_CTX_new(); -+ if (!hash) -+ return ret; -+ -+ ctx = BN_CTX_new(); -+ if (!ctx) -+ goto free_hash; -+ -+ param = OPENSSL_zalloc(sizeof(struct sm2_param)); -+ if (!param) { -+ fprintf(stderr, "failed to malloc sm2 param\n"); -+ goto free_ctx; -+ } -+ -+ if (!get_sm2_param(param, ctx)) -+ goto free_param; -+ -+ if (!check_digest_evp_lib(digest, hash, id_len, id)) -+ goto free_param; -+ -+ if (!EC_GROUP_get_curve(group, param->p, param->a, param->b, ctx)) { -+ fprintf(stderr, "failed to get curve\n"); -+ goto free_param; -+ } -+ -+ p_bytes = BN_num_bytes(param->p); -+ buf = OPENSSL_zalloc(p_bytes); -+ if (!buf) { -+ fprintf(stderr, "failed to malloc buf\n"); -+ goto free_param; -+ } -+ -+ if (!check_equation_param(param, hash, buf, p_bytes) || -+ !check_base_point_group_param(param, ctx, key) || -+ !check_base_point_param(param, hash, buf, p_bytes) || -+ !check_pkey_point_group_param(param, ctx, key) || -+ !check_pkey_point_param(param, hash, buf, p_bytes, out)) -+ goto free_buf; -+ -+ ret = 1; -+ -+free_buf: - OPENSSL_free(buf); -+free_param: -+ OPENSSL_free(param); -+free_ctx: - BN_CTX_free(ctx); -+free_hash: - EVP_MD_CTX_free(hash); -- return rc; -+ return ret; - } - - static int sm2_digest_custom(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx) --- -2.24.4 - diff --git a/0009-cipher-fix-set-key-error.patch b/0009-cipher-fix-set-key-error.patch new file mode 100644 index 0000000..4575d1d --- /dev/null +++ b/0009-cipher-fix-set-key-error.patch @@ -0,0 +1,56 @@ +From c8f3d1d021f028a9ca500d079c4158038e1b22c9 Mon Sep 17 00:00:00 2001 +From: taoqi +Date: Tue, 20 Jun 2023 23:05:06 +0800 +Subject: [PATCH 09/10] cipher: fix set key error + +Initialize the algorithm type again to prevent +the algorithm type from being changed. + +Signed-off-by: taoqi +--- + src/uadk_cipher.c | 20 +++++++++++++++++++- + 1 file changed, 19 insertions(+), 1 deletion(-) + +diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c +index 1905e47..cc13823 100644 +--- a/src/uadk_cipher.c ++++ b/src/uadk_cipher.c +@@ -840,8 +840,10 @@ static int do_cipher_async(struct cipher_priv_ctx *priv, struct async_op *op) + + static void uadk_e_ctx_init(EVP_CIPHER_CTX *ctx, struct cipher_priv_ctx *priv) + { ++ __u32 cipher_counts = ARRAY_SIZE(cipher_info_table); + struct sched_params params = {0}; +- int ret; ++ int nid, ret; ++ __u32 i; + + priv->req.iv_bytes = EVP_CIPHER_CTX_iv_length(ctx); + priv->req.iv = priv->iv; +@@ -869,7 +871,23 @@ static void uadk_e_ctx_init(EVP_CIPHER_CTX *ctx, struct cipher_priv_ctx *priv) + /* Use the default numa parameters */ + params.numa_id = -1; + priv->setup.sched_param = ¶ms; ++ + if (!priv->sess) { ++ nid = EVP_CIPHER_CTX_nid(ctx); ++ ++ for (i = 0; i < cipher_counts; i++) { ++ if (nid == cipher_info_table[i].nid) { ++ cipher_priv_ctx_setup(priv, cipher_info_table[i].alg, ++ cipher_info_table[i].mode, cipher_info_table[i].out_bytes); ++ break; ++ } ++ } ++ ++ if (i == cipher_counts) { ++ fprintf(stderr, "failed to setup the private ctx.\n"); ++ return; ++ } ++ + priv->sess = wd_cipher_alloc_sess(&priv->setup); + if (!priv->sess) + fprintf(stderr, "uadk failed to alloc session!\n"); +-- +2.25.1 + diff --git a/0009-ecc-bugfix-about-ecc-init-after-alloc-sess.patch b/0009-ecc-bugfix-about-ecc-init-after-alloc-sess.patch deleted file mode 100644 index af9a35e..0000000 --- a/0009-ecc-bugfix-about-ecc-init-after-alloc-sess.patch +++ /dev/null @@ -1,232 +0,0 @@ -From 1bb24b3d0769f82e6903ca94fa6b8ad466eb5bbe Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Fri, 24 Dec 2021 08:44:03 +0000 -Subject: [PATCH 09/18] ecc: bugfix about ecc init after alloc sess - -When executing allocating session operation, it needs -sched_init(), which is supported by init operation -in the engine, so the init operation should be done -before executing allocating session operation. - -Signed-off-by: Zhiqi Song ---- - src/uadk_ec.c | 93 +++++++++++++++++++++++---------------------------- - 1 file changed, 42 insertions(+), 51 deletions(-) - -diff --git a/src/uadk_ec.c b/src/uadk_ec.c -index 9040d3c..0c8a011 100644 ---- a/src/uadk_ec.c -+++ b/src/uadk_ec.c -@@ -426,7 +426,10 @@ static ECDSA_SIG *ecdsa_do_sign(const unsigned char *dgst, int dlen, - if (ret) - goto do_soft; - -- ret = UADK_DO_SOFT; -+ ret = uadk_init_ecc(); -+ if (ret) -+ goto do_soft; -+ - sess = ecc_alloc_sess(eckey, "ecdsa"); - if (!sess) - goto do_soft; -@@ -438,33 +441,28 @@ static ECDSA_SIG *ecdsa_do_sign(const unsigned char *dgst, int dlen, - if (ret) - goto free_sess; - -- ret = uadk_ecc_set_private_key(sess, eckey); -+ ret = uadk_ecc_set_private_key(sess, eckey); - if (ret) - goto uninit_iot; - -- ret = uadk_init_ecc(); -- if (ret) { -- ret = UADK_DO_SOFT; -- goto uninit_iot; -- } -- - ret = uadk_ecc_crypto(sess, &req, (void *)sess); -- if (ret != 1) { -- ret = UADK_DO_SOFT; -+ if (ret != 1) - goto uninit_iot; -- } - - sig = create_ecdsa_sig(&req); - -+ wd_ecc_del_in(sess, req.src); -+ wd_ecc_del_out(sess, req.dst); -+ wd_ecc_free_sess(sess); -+ -+ return sig; -+ - uninit_iot: - wd_ecc_del_in(sess, req.src); - wd_ecc_del_out(sess, req.dst); - free_sess: - wd_ecc_free_sess(sess); - do_soft: -- if (ret != UADK_DO_SOFT) -- return sig; -- - fprintf(stderr, "switch to execute openssl software calculation.\n"); - return openssl_do_sign(dgst, dlen, in_kinv, in_r, eckey); - } -@@ -617,7 +615,10 @@ static int ecdsa_do_verify(const unsigned char *dgst, int dlen, - if (ret) - goto do_soft; - -- ret = UADK_DO_SOFT; -+ ret = uadk_init_ecc(); -+ if (ret) -+ goto do_soft; -+ - sess = ecc_alloc_sess(eckey, "ecdsa"); - if (!sess) - goto do_soft; -@@ -633,24 +634,19 @@ static int ecdsa_do_verify(const unsigned char *dgst, int dlen, - if (ret) - goto uninit_iot; - -- ret = uadk_init_ecc(); -- if (ret) { -- ret = UADK_DO_SOFT; -- goto uninit_iot; -- } -- - ret = uadk_ecc_crypto(sess, &req, (void *)sess); - if (ret != 1) { -- printf("failed to uadk_ecc_crypto, ret = %d\n", ret); -- ret = UADK_DO_SOFT; -+ fprintf(stderr, "failed to uadk_ecc_crypto, ret = %d\n", ret); -+ goto uninit_iot; - } -+ -+ return ret; -+ - uninit_iot: - wd_ecc_del_in(sess, req.src); - free_sess: - wd_ecc_free_sess(sess); - do_soft: -- if (ret != UADK_DO_SOFT) -- return ret; - fprintf(stderr, "switch to execute openssl software calculation.\n"); - return openssl_do_verify(dgst, dlen, sig, eckey); - } -@@ -888,9 +884,12 @@ static int sm2_generate_key(EC_KEY *eckey) - - ret = eckey_create_key(eckey); - if (!ret) -- return ret; -+ goto do_soft; -+ -+ ret = uadk_init_ecc(); -+ if (ret) -+ goto do_soft; - -- ret = UADK_DO_SOFT; - sess = ecc_alloc_sess(eckey, "sm2"); - if (!sess) - goto do_soft; -@@ -900,35 +899,29 @@ static int sm2_generate_key(EC_KEY *eckey) - if (ret) - goto free_sess; - -- ret = uadk_init_ecc(); -- if (ret) { -- ret = UADK_DO_SOFT; -- goto uninit_iot; -- } -- - ret = uadk_ecc_crypto(sess, &req, (void *)sess); -- if (ret != 1) { -- ret = UADK_DO_SOFT; -+ if (ret != 1) - goto uninit_iot; -- } - - ret = set_key_to_ec_key(eckey, &req); - if (ret) - goto uninit_iot; - - ret = 1; -+ wd_ecc_del_out(sess, req.dst); -+ wd_ecc_free_sess(sess); -+ -+ return ret; -+ - uninit_iot: - wd_ecc_del_out(sess, req.dst); - free_sess: - wd_ecc_free_sess(sess); - do_soft: -- if (ret != UADK_DO_SOFT) -- return ret; - fprintf(stderr, "switch to execute openssl software calculation.\n"); - return openssl_do_generate(eckey); - } - -- - static int ecdh_keygen_init_iot(handle_t sess, struct wd_ecc_req *req, - EC_KEY *ecdh) - { -@@ -1108,6 +1101,10 @@ static int ecdh_generate_key(EC_KEY *ecdh) - if (!ret) - goto do_soft; - -+ ret = uadk_init_ecc(); -+ if (ret) -+ goto do_soft; -+ - sess = ecc_alloc_sess(ecdh, "ecdh"); - if (!sess) - goto do_soft; -@@ -1121,10 +1118,6 @@ static int ecdh_generate_key(EC_KEY *ecdh) - if (ret) - goto uninit_iot; - -- ret = uadk_init_ecc(); -- if (ret) -- goto uninit_iot; -- - ret = uadk_ecc_crypto(sess, &req, (void *)sess); - if (ret != 1) - goto uninit_iot; -@@ -1202,10 +1195,8 @@ static int ecc_compkey_check(unsigned char **out, - return 1; - } - --static int ecdh_compute_key(unsigned char **out, -- size_t *outlen, -- const EC_POINT *pub_key, -- const EC_KEY *ecdh) -+static int ecdh_compute_key(unsigned char **out, size_t *outlen, -+ const EC_POINT *pub_key, const EC_KEY *ecdh) - { - struct wd_ecc_req req; - handle_t sess; -@@ -1215,6 +1206,10 @@ static int ecdh_compute_key(unsigned char **out, - if (!ret) - goto do_soft; - -+ ret = uadk_init_ecc(); -+ if (ret) -+ goto do_soft; -+ - sess = ecc_alloc_sess(ecdh, "ecdh"); - if (!sess) - goto do_soft; -@@ -1232,10 +1227,6 @@ static int ecdh_compute_key(unsigned char **out, - if (ret) - goto uninit_iot; - -- ret = uadk_init_ecc(); -- if (ret) -- goto uninit_iot; -- - ret = uadk_ecc_crypto(sess, &req, (void *)sess); - if (ret != 1) - goto uninit_iot; --- -2.24.4 - diff --git a/0010-cipher-fix-async-hardware-computing-error.patch b/0010-cipher-fix-async-hardware-computing-error.patch new file mode 100644 index 0000000..6a91b91 --- /dev/null +++ b/0010-cipher-fix-async-hardware-computing-error.patch @@ -0,0 +1,36 @@ +From 9fa67d9748d0e8b710bc8a0cdd3f289e3a1b2f8f Mon Sep 17 00:00:00 2001 +From: taoqi +Date: Tue, 20 Jun 2023 23:07:31 +0800 +Subject: [PATCH 10/10] cipher: fix async hardware computing error + +If the length of the input data does not reach to +hardware computing threshold, directly switch to +soft cipher. + +Signed-off-by: taoqi +--- + src/uadk_cipher.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c +index cc13823..940c26c 100644 +--- a/src/uadk_cipher.c ++++ b/src/uadk_cipher.c +@@ -927,6 +927,14 @@ static int uadk_e_do_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, + if (!ret) + goto sync_err; + } else { ++ /* ++ * If the length of the input data ++ * does not reach to hardware computing threshold, ++ * directly switch to soft cipher. ++ */ ++ if (priv->req.in_bytes <= priv->switch_threshold) ++ goto sync_err; ++ + ret = do_cipher_async(priv, &op); + if (!ret) + goto out_notify; +-- +2.25.1 + diff --git a/0010-rsa-cleanup-about-prime-generation.patch b/0010-rsa-cleanup-about-prime-generation.patch deleted file mode 100644 index 22d3d17..0000000 --- a/0010-rsa-cleanup-about-prime-generation.patch +++ /dev/null @@ -1,110 +0,0 @@ -From fc023b87189ff488b4e760567d92afeca2635559 Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Sat, 25 Dec 2021 01:35:03 +0000 -Subject: [PATCH 10/18] rsa: cleanup about prime generation - -Reduce parameter number of rsa_prime_mul_res(), -and add comments of BN_GENCB_call(). - -Signed-off-by: Zhiqi Song ---- - src/uadk_rsa.c | 28 +++++++++++++++++----------- - 1 file changed, 17 insertions(+), 11 deletions(-) - -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index c1609ca..2526af9 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -164,14 +164,17 @@ static int rsa_check_bit_useful(const int bits, int flen) - } - } - --static int rsa_prime_mul_res(int num, BIGNUM *rsa_p, BIGNUM *rsa_q, BIGNUM *r1, -+static int rsa_prime_mul_res(int num, struct rsa_prime_param *param, - BN_CTX *ctx, BN_GENCB *cb) - { - if (num == 1) { -- if (!BN_mul(r1, rsa_p, rsa_q, ctx)) -+ if (!BN_mul(param->r1, param->rsa_p, param->rsa_q, ctx)) - return BN_ERR; - } else { -- /* If num == 0, use number 3 to indicate do nothing */ -+ /* -+ * Use the number 3 to indicate whether -+ * the generator has been found. -+ */ - if (!BN_GENCB_call(cb, 3, num)) - return BN_ERR; - return BN_CONTINUE; -@@ -189,8 +192,7 @@ static int check_rsa_prime_sufficient(int *num, const int *bitsr, - BN_ULONG bitst; - int ret; - -- ret = rsa_prime_mul_res(*num, param->rsa_p, param->rsa_q, -- param->r1, ctx, cb); -+ ret = rsa_prime_mul_res(*num, param, ctx, cb); - if (ret) - return ret; - /* -@@ -224,7 +226,10 @@ static int check_rsa_prime_sufficient(int *num, const int *bitsr, - *bitse -= bitsr[*num]; - else - return -1; -- -+ /* -+ * Use the number 2 to indicate whether -+ * a prime has been found. -+ */ - ret = BN_GENCB_call(cb, 2, *n++); - if (!ret) - return -1; -@@ -237,7 +242,7 @@ static int check_rsa_prime_sufficient(int *num, const int *bitsr, - retries++; - return BN_REDO; - } -- -+ /* Use the number 3 to indicate whether the generator has been found. */ - ret = BN_GENCB_call(cb, 3, *num); - if (!ret) - return BN_ERR; -@@ -314,6 +319,7 @@ static int check_rsa_prime_useful(const int *n, struct rsa_prime_param *param, - else - return BN_ERR; - -+ /* Use the number 2 to indicate whether a prime has been found. */ - if (!BN_GENCB_call(cb, 2, *n++)) - return BN_ERR; - -@@ -1094,7 +1100,7 @@ static int uadk_e_soft_rsa_keygen(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb) - int ret; - - if (!default_meth) { -- printf("failed to get soft method.\n"); -+ fprintf(stderr, "failed to get soft method.\n"); - return UADK_E_FAIL; - } - -@@ -1121,7 +1127,7 @@ static int rsa_fill_keygen_data(struct uadk_rsa_sess *rsa_sess, - return UADK_E_FAIL; - - keygen_param->wd_e->dsize = BN_bn2bin(bn_param->e, -- (unsigned char *)keygen_param->wd_e->data); -+ (unsigned char *)keygen_param->wd_e->data); - - wd_rsa_get_prikey(rsa_sess->sess, &key_pair->prikey); - if (!key_pair->prikey) -@@ -1133,9 +1139,9 @@ static int rsa_fill_keygen_data(struct uadk_rsa_sess *rsa_sess, - return UADK_E_FAIL; - - keygen_param->wd_q->dsize = BN_bn2bin(bn_param->q, -- (unsigned char *)keygen_param->wd_q->data); -+ (unsigned char *)keygen_param->wd_q->data); - keygen_param->wd_p->dsize = BN_bn2bin(bn_param->p, -- (unsigned char *)keygen_param->wd_p->data); -+ (unsigned char *)keygen_param->wd_p->data); - - rsa_sess->req.src_bytes = rsa_sess->key_size; - rsa_sess->req.dst_bytes = rsa_sess->key_size; --- -2.24.4 - diff --git a/0011-ecc-cleanup-the-form-of-the-return-value.patch b/0011-ecc-cleanup-the-form-of-the-return-value.patch deleted file mode 100644 index 50f7402..0000000 --- a/0011-ecc-cleanup-the-form-of-the-return-value.patch +++ /dev/null @@ -1,209 +0,0 @@ -From dbb4ff29da9ed378d8753a6e5d18e86756c1d254 Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Mon, 27 Dec 2021 07:04:43 +0000 -Subject: [PATCH 11/18] ecc: cleanup the form of the return value - -This patch includes: -1. Unified the return value form. -2. Remove redundant goto jumps. - -Signed-off-by: Zhiqi Song ---- - src/uadk_ec.c | 20 +++++++++++--------- - src/uadk_ecx.c | 8 ++++---- - src/uadk_pkey.c | 5 ++--- - src/uadk_sm2.c | 8 ++++---- - 4 files changed, 21 insertions(+), 20 deletions(-) - -diff --git a/src/uadk_ec.c b/src/uadk_ec.c -index 0c8a011..db69871 100644 ---- a/src/uadk_ec.c -+++ b/src/uadk_ec.c -@@ -446,7 +446,7 @@ static ECDSA_SIG *ecdsa_do_sign(const unsigned char *dgst, int dlen, - goto uninit_iot; - - ret = uadk_ecc_crypto(sess, &req, (void *)sess); -- if (ret != 1) -+ if (!ret) - goto uninit_iot; - - sig = create_ecdsa_sig(&req); -@@ -635,11 +635,14 @@ static int ecdsa_do_verify(const unsigned char *dgst, int dlen, - goto uninit_iot; - - ret = uadk_ecc_crypto(sess, &req, (void *)sess); -- if (ret != 1) { -+ if (!ret) { - fprintf(stderr, "failed to uadk_ecc_crypto, ret = %d\n", ret); - goto uninit_iot; - } - -+ wd_ecc_del_in(sess, req.src); -+ wd_ecc_free_sess(sess); -+ - return ret; - - uninit_iot: -@@ -701,7 +704,7 @@ static int set_key_to_ec_key(EC_KEY *ec, struct wd_ecc_req *req) - tmp = BN_bin2bn((unsigned char *)privkey->data, privkey->dsize, NULL); - ret = EC_KEY_set_private_key(ec, tmp); - BN_free(tmp); -- if (ret != 1) { -+ if (!ret) { - fprintf(stderr, "failed to EC KEY set private key\n"); - return -EINVAL; - } -@@ -725,7 +728,7 @@ static int set_key_to_ec_key(EC_KEY *ec, struct wd_ecc_req *req) - - ret = EC_KEY_set_public_key(ec, point); - EC_POINT_free(point); -- if (ret != 1) { -+ if (!ret) { - fprintf(stderr, "failed to EC_KEY_set_public_key\n"); - return -EINVAL; - } -@@ -900,18 +903,17 @@ static int sm2_generate_key(EC_KEY *eckey) - goto free_sess; - - ret = uadk_ecc_crypto(sess, &req, (void *)sess); -- if (ret != 1) -+ if (!ret) - goto uninit_iot; - - ret = set_key_to_ec_key(eckey, &req); - if (ret) - goto uninit_iot; - -- ret = 1; - wd_ecc_del_out(sess, req.dst); - wd_ecc_free_sess(sess); - -- return ret; -+ return 1; - - uninit_iot: - wd_ecc_del_out(sess, req.dst); -@@ -1119,7 +1121,7 @@ static int ecdh_generate_key(EC_KEY *ecdh) - goto uninit_iot; - - ret = uadk_ecc_crypto(sess, &req, (void *)sess); -- if (ret != 1) -+ if (!ret) - goto uninit_iot; - - ret = ecdh_set_key_to_ec_key(ecdh, &req); -@@ -1228,7 +1230,7 @@ static int ecdh_compute_key(unsigned char **out, size_t *outlen, - goto uninit_iot; - - ret = uadk_ecc_crypto(sess, &req, (void *)sess); -- if (ret != 1) -+ if (!ret) - goto uninit_iot; - - ret = ecdh_get_shared_key(ecdh, out, outlen, &req); -diff --git a/src/uadk_ecx.c b/src/uadk_ecx.c -index 6a9f78c..67f9350 100644 ---- a/src/uadk_ecx.c -+++ b/src/uadk_ecx.c -@@ -399,7 +399,7 @@ static int x25519_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) - goto uninit_iot; - - ret = uadk_ecc_crypto(keygen_ctx->sess, &req, (void *)keygen_ctx->sess); -- if (ret != 1) -+ if (!ret) - goto uninit_iot; - - ret = ecx_keygen_set_pkey(pkey, keygen_ctx, &req, ecx_key); -@@ -457,7 +457,7 @@ static int x448_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) - goto uninit_iot; - - ret = uadk_ecc_crypto(keygen_ctx->sess, &req, (void *)keygen_ctx->sess); -- if (ret != 1) -+ if (!ret) - goto uninit_iot; - - ret = ecx_keygen_set_pkey(pkey, keygen_ctx, &req, ecx_key); -@@ -659,7 +659,7 @@ static int x25519_derive(EVP_PKEY_CTX *ctx, unsigned char *key, - goto uninit_iot; - - ret = uadk_ecc_crypto(derive_ctx->sess, &req, (void *)derive_ctx); -- if (ret != 1) -+ if (!ret) - goto uninit_iot; - - wd_ecxdh_get_out_params(req.dst, &s_key); -@@ -745,7 +745,7 @@ static int x448_derive(EVP_PKEY_CTX *ctx, unsigned char *key, - goto uninit_iot; - - ret = uadk_ecc_crypto(derive_ctx->sess, &req, (void *)derive_ctx); -- if (ret != 1) -+ if (!ret) - goto uninit_iot; - - wd_ecxdh_get_out_params(req.dst, &s_key); -diff --git a/src/uadk_pkey.c b/src/uadk_pkey.c -index 62362b0..7ca998b 100644 ---- a/src/uadk_pkey.c -+++ b/src/uadk_pkey.c -@@ -273,8 +273,7 @@ static void uadk_wd_ecc_uninit(void) - ecc_res.pid = 0; - } - --int uadk_ecc_crypto(handle_t sess, -- struct wd_ecc_req *req, void *usr) -+int uadk_ecc_crypto(handle_t sess, struct wd_ecc_req *req, void *usr) - { - struct uadk_e_cb_info cb_param; - struct async_op op; -@@ -314,7 +313,7 @@ int uadk_ecc_crypto(handle_t sess, - } else { - ret = wd_do_ecc_sync(sess, req); - if (ret < 0) -- return ret; -+ return 0; - } - return 1; - err: -diff --git a/src/uadk_sm2.c b/src/uadk_sm2.c -index 6d5dad0..f602e48 100644 ---- a/src/uadk_sm2.c -+++ b/src/uadk_sm2.c -@@ -359,7 +359,7 @@ static int sign_bin_to_ber(EC_KEY *ec, struct wd_dtb *r, struct wd_dtb *s, - } - - ret = ECDSA_SIG_set0(e_sig, br, bs); -- if (ret != 1) { -+ if (!ret) { - fprintf(stderr, "failed to ECDSA_SIG_set0\n"); - ret = -EINVAL; - goto free_s; -@@ -686,7 +686,7 @@ static int sm2_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, - } - - ret = uadk_ecc_crypto(smctx->sess, &req, smctx); -- if (ret != 1) { -+ if (!ret) { - fprintf(stderr, "failed to uadk_ecc_crypto, ret = %d\n", ret); - ret = UADK_DO_SOFT; - goto uninit_iot; -@@ -907,7 +907,7 @@ static int sm2_encrypt(EVP_PKEY_CTX *ctx, - } - - ret = uadk_ecc_crypto(smctx->sess, &req, smctx); -- if (ret != 1) { -+ if (!ret) { - ret = UADK_DO_SOFT; - fprintf(stderr, "failed to uadk_ecc_crypto, ret = %d\n", ret); - goto uninit_iot; -@@ -1061,7 +1061,7 @@ static int sm2_decrypt(EVP_PKEY_CTX *ctx, - } - - ret = uadk_ecc_crypto(smctx->sess, &req, smctx); -- if (ret != 1) { -+ if (!ret) { - ret = UADK_DO_SOFT; - fprintf(stderr, "failed to uadk_ecc_crypto, ret = %d\n", ret); - goto uninit_iot; --- -2.24.4 - diff --git a/0012-engine-fix-uadk-engine-compatibility-issue.patch b/0012-engine-fix-uadk-engine-compatibility-issue.patch deleted file mode 100644 index ee913ea..0000000 --- a/0012-engine-fix-uadk-engine-compatibility-issue.patch +++ /dev/null @@ -1,140 +0,0 @@ -From c212eedcab9135acc0433a125c8fab151674e8c5 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Tue, 23 Nov 2021 09:14:31 +0000 -Subject: [PATCH 12/18] engine: fix uadk engine compatibility issue - -When uadk use no sva mode, it should use wd_get_available_dev_num, -otherwise, it will not find old kernel's device path with attrs. - -Signed-off-by: Wenkai Lin ---- - src/e_uadk.c | 70 +++++++++++++++--------------------- - src/v1/uadk_v1.h | 1 + - src/v1/wdmngr/wd_alg_queue.c | 4 +++ - src/v1/wdmngr/wd_alg_queue.h | 2 ++ - 4 files changed, 36 insertions(+), 41 deletions(-) - -diff --git a/src/e_uadk.c b/src/e_uadk.c -index 18c2e4e..4e87c86 100644 ---- a/src/e_uadk.c -+++ b/src/e_uadk.c -@@ -239,54 +239,42 @@ static void engine_init_child_at_fork_handler(void) - #ifdef KAE - static void bind_fn_kae_alg(ENGINE *e) - { -- struct uacce_dev *dev; -+ int dev_num; - -- dev = wd_get_accel_dev("cipher"); -- if (dev) { -- if (!(dev->flags & UACCE_DEV_SVA)) { -- cipher_module_init(); -- if (!ENGINE_set_ciphers(e, sec_engine_ciphers)) -- fprintf(stderr, "uadk bind cipher failed\n"); -- else -- uadk_cipher_nosva = 1; -- } -- free(dev); -+ dev_num = wd_get_nosva_dev_num("cipher"); -+ if (dev_num > 0) { -+ cipher_module_init(); -+ if (!ENGINE_set_ciphers(e, sec_engine_ciphers)) -+ fprintf(stderr, "uadk bind cipher failed\n"); -+ else -+ uadk_cipher_nosva = 1; - } - -- dev = wd_get_accel_dev("digest"); -- if (dev) { -- if (!(dev->flags & UACCE_DEV_SVA)) { -- digest_module_init(); -- if (!ENGINE_set_digests(e, sec_engine_digests)) -- fprintf(stderr, "uadk bind digest failed\n"); -- else -- uadk_digest_nosva = 1; -- } -- free(dev); -+ dev_num = wd_get_nosva_dev_num("digest"); -+ if (dev_num > 0) { -+ digest_module_init(); -+ if (!ENGINE_set_digests(e, sec_engine_digests)) -+ fprintf(stderr, "uadk bind digest failed\n"); -+ else -+ uadk_digest_nosva = 1; - } - -- dev = wd_get_accel_dev("rsa"); -- if (dev) { -- if (!(dev->flags & UACCE_DEV_SVA)) { -- hpre_module_init(); -- if (!ENGINE_set_RSA(e, hpre_get_rsa_methods())) -- fprintf(stderr, "uadk bind rsa failed\n"); -- else -- uadk_rsa_nosva = 1; -- } -- free(dev); -+ dev_num = wd_get_nosva_dev_num("rsa"); -+ if (dev_num > 0) { -+ hpre_module_init(); -+ if (!ENGINE_set_RSA(e, hpre_get_rsa_methods())) -+ fprintf(stderr, "uadk bind rsa failed\n"); -+ else -+ uadk_rsa_nosva = 1; - } - -- dev = wd_get_accel_dev("dh"); -- if (dev) { -- if (!(dev->flags & UACCE_DEV_SVA)) { -- hpre_module_dh_init(); -- if (!ENGINE_set_DH(e, hpre_get_dh_methods())) -- fprintf(stderr, "uadk bind dh failed\n"); -- else -- uadk_dh_nosva = 1; -- } -- free(dev); -+ dev_num = wd_get_nosva_dev_num("dh"); -+ if (dev_num > 0) { -+ hpre_module_dh_init(); -+ if (!ENGINE_set_DH(e, hpre_get_dh_methods())) -+ fprintf(stderr, "uadk bind dh failed\n"); -+ else -+ uadk_dh_nosva = 1; - } - } - #endif -diff --git a/src/v1/uadk_v1.h b/src/v1/uadk_v1.h -index f5081e3..d921706 100644 ---- a/src/v1/uadk_v1.h -+++ b/src/v1/uadk_v1.h -@@ -35,4 +35,5 @@ extern void hpre_dh_destroy(void); - - extern int hpre_pkey_meths(ENGINE *e, EVP_PKEY_METHOD **pmeth, - const int **pnids, int nid); -+extern int wd_get_nosva_dev_num(const char *algorithm); - #endif -diff --git a/src/v1/wdmngr/wd_alg_queue.c b/src/v1/wdmngr/wd_alg_queue.c -index 79c9a6d..5cd33ae 100644 ---- a/src/v1/wdmngr/wd_alg_queue.c -+++ b/src/v1/wdmngr/wd_alg_queue.c -@@ -74,3 +74,7 @@ void wd_free_queue(struct wd_queue *queue) - } - } - -+int wd_get_nosva_dev_num(const char *algorithm) -+{ -+ return wd_get_available_dev_num(algorithm); -+} -diff --git a/src/v1/wdmngr/wd_alg_queue.h b/src/v1/wdmngr/wd_alg_queue.h -index 4fd3a9d..955eed5 100644 ---- a/src/v1/wdmngr/wd_alg_queue.h -+++ b/src/v1/wdmngr/wd_alg_queue.h -@@ -25,4 +25,6 @@ - struct wd_queue *wd_new_queue(int algtype); - - void wd_free_queue(struct wd_queue *queue); -+ -+int wd_get_nosva_dev_num(const char *algorithm); - #endif --- -2.24.4 - diff --git a/0013-digest-modify-the-process-of-free-session.patch b/0013-digest-modify-the-process-of-free-session.patch deleted file mode 100644 index 701bbcd..0000000 --- a/0013-digest-modify-the-process-of-free-session.patch +++ /dev/null @@ -1,31 +0,0 @@ -From ca59dfa548656d82d6d50a6dad6bfc88b2825473 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Thu, 6 Jan 2022 14:49:27 +0800 -Subject: [PATCH 13/18] digest: modify the process of free session - -Currently, release the session in the cleanup instead of final. so not -should free session in the final. Here is fix it. - -Signed-off-by: Kai Ye ---- - src/uadk_digest.c | 4 ---- - 1 file changed, 4 deletions(-) - -diff --git a/src/uadk_digest.c b/src/uadk_digest.c -index 41de449..cbfb539 100644 ---- a/src/uadk_digest.c -+++ b/src/uadk_digest.c -@@ -688,10 +688,6 @@ sync_err: - ret = uadk_e_digest_soft_work(priv, priv->tail, digest); - clear: - async_clear_async_event_notification(); -- if (priv->sess) { -- wd_digest_free_sess(priv->sess); -- priv->sess = 0; -- } - return ret; - } - --- -2.24.4 - diff --git a/0014-digest-modify-the-process-of-soft-and-hardware-hando.patch b/0014-digest-modify-the-process-of-soft-and-hardware-hando.patch deleted file mode 100644 index 5c90457..0000000 --- a/0014-digest-modify-the-process-of-soft-and-hardware-hando.patch +++ /dev/null @@ -1,153 +0,0 @@ -From 7efc5b169d74b84af8108bc736d80eedbe3a8004 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Thu, 6 Jan 2022 14:48:13 +0800 -Subject: [PATCH 14/18] digest: modify the process of soft and hardware handoff - -Due to has added the stream mode for digest. So need to modify the -process of software and hardware handoff. - -Signed-off-by: Kai Ye ---- - src/uadk_digest.c | 60 +++++++++++++++++++++++++++++++++++++---------- - 1 file changed, 48 insertions(+), 12 deletions(-) - -diff --git a/src/uadk_digest.c b/src/uadk_digest.c -index cbfb539..bf738af 100644 ---- a/src/uadk_digest.c -+++ b/src/uadk_digest.c -@@ -44,6 +44,14 @@ - #define MD5_SMALL_PACKET_OFFLOAD_THRESHOLD_DEFAULT (8 * 1024) - #define SHA_SMALL_PACKET_OFFLOAD_THRESHOLD_DEFAULT (512) - #define MAX_DIGEST_LENGTH 64 -+#define DIGEST_BLOCK_SIZE (512 * 1024) -+ -+enum sec_digestz_state { -+ SEC_DIGEST_INIT, -+ SEC_DIGEST_FIRST_UPDATING, -+ SEC_DIGEST_DOING, -+ SEC_DIGEST_FINAL -+}; - - struct digest_threshold_table { - int nid; -@@ -72,21 +80,19 @@ struct evp_md_ctx_st { - int (*update)(EVP_MD_CTX *ctx, const void *data, size_t count); - }; - --#define DIGEST_BLOCK_SIZE 4096 -- - struct digest_priv_ctx { - handle_t sess; - struct wd_digest_sess_setup setup; - struct wd_digest_req req; - unsigned char *data; - unsigned char out[MAX_DIGEST_LENGTH]; -- size_t tail; -+ EVP_MD_CTX *soft_ctx; - size_t last_update_bufflen; -- bool copy; - uint32_t e_nid; -- EVP_MD_CTX *soft_ctx; -- size_t switch_threshold; -+ uint32_t state; -+ uint32_t switch_threshold; - int switch_flag; -+ bool copy; - }; - - static int digest_nids[] = { -@@ -150,7 +156,7 @@ static const EVP_MD *uadk_e_digests_soft_md(uint32_t e_nid) - return digest_md; - } - --static int sec_digest_get_sw_threshold(int n_id) -+static uint32_t sec_digest_get_sw_threshold(int n_id) - { - int threshold_table_size = ARRAY_SIZE(digest_pkt_threshold_table); - int i = 0; -@@ -464,6 +470,7 @@ static int uadk_e_digest_init(EVP_MD_CTX *ctx) - priv->soft_ctx = EVP_MD_CTX_new(); - priv->e_nid = nid; - -+ priv->state = SEC_DIGEST_INIT; - ret = uadk_e_init_digest(); - if (!ret) { - priv->switch_flag = UADK_DO_SOFT; -@@ -504,7 +511,7 @@ static int uadk_e_digest_init(EVP_MD_CTX *ctx) - return 0; - - priv->data = malloc(DIGEST_BLOCK_SIZE); -- if (priv->data == NULL) { -+ if (!priv->data) { - wd_digest_free_sess(priv->sess); - return 0; - } -@@ -540,9 +547,16 @@ static int digest_update_inner(EVP_MD_CTX *ctx, const void *data, size_t data_le - left_len -= copy_to_bufflen; - tmpdata += copy_to_bufflen; - -+ if (priv->state == SEC_DIGEST_INIT) -+ priv->state = SEC_DIGEST_FIRST_UPDATING; -+ else if (priv->state == SEC_DIGEST_FIRST_UPDATING) -+ priv->state = SEC_DIGEST_DOING; -+ - ret = wd_do_digest_sync(priv->sess, &priv->req); -- if (ret) -- return 0; -+ if (ret) { -+ fprintf(stderr, "do sec digest sync failed, switch to soft digest.\n"); -+ goto do_soft_digest; -+ } - - priv->last_update_bufflen = 0; - memset(priv->data, 0, DIGEST_BLOCK_SIZE); -@@ -551,10 +565,26 @@ static int digest_update_inner(EVP_MD_CTX *ctx, const void *data, size_t data_le - memcpy(priv->data, tmpdata, priv->last_update_bufflen); - break; - } -+ } -+ -+ return 1; -+do_soft_digest: -+ if (priv->state == SEC_DIGEST_FIRST_UPDATING -+ && priv->data -+ && priv->last_update_bufflen != 0) { -+ priv->switch_flag = UADK_DO_SOFT; -+ digest_soft_init(priv->soft_ctx, priv->e_nid); -+ ret = digest_soft_update(priv->soft_ctx, priv->e_nid, -+ priv->data, priv->last_update_bufflen); -+ if (ret != 1) -+ return ret; - -+ return digest_soft_update(priv->soft_ctx, priv->e_nid, -+ tmpdata, left_len); - } - -- return 1; -+ fprintf(stderr, "do soft digest failed during updating!\n"); -+ return 0; - } - - static int uadk_e_digest_update(EVP_MD_CTX *ctx, const void *data, size_t data_len) -@@ -681,11 +711,17 @@ static int uadk_e_digest_final(EVP_MD_CTX *ctx, unsigned char *digest) - goto clear; - } - memcpy(digest, priv->req.out, priv->req.out_bytes); -+ priv->last_update_bufflen = 0; - - return 1; - - sync_err: -- ret = uadk_e_digest_soft_work(priv, priv->tail, digest); -+ if (priv->state == SEC_DIGEST_INIT) { -+ ret = uadk_e_digest_soft_work(priv, priv->req.in_bytes, digest); -+ } else { -+ ret = 0; -+ fprintf(stderr, "do sec digest stream mode failed.\n"); -+ } - clear: - async_clear_async_event_notification(); - return ret; --- -2.24.4 - diff --git a/0015-ecc-bugfix-about-sm2-decryption.patch b/0015-ecc-bugfix-about-sm2-decryption.patch deleted file mode 100644 index 3c64c7b..0000000 --- a/0015-ecc-bugfix-about-sm2-decryption.patch +++ /dev/null @@ -1,114 +0,0 @@ -From 32c58bf68e7f33d0170b3cc9040a11395a68df72 Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Sat, 8 Jan 2022 07:24:22 +0000 -Subject: [PATCH 15/18] ecc: bugfix about sm2 decryption - -When doing sm2_decrypt_check(), if the out param is NULL, -it is supposed to use sm2_plaintext_size() function to -get the output plain text length, rather than use -sm2_ciphertext_size(). - -Signed-off-by: Zhiqi Song ---- - src/uadk_sm2.c | 29 ++++++++++++++++++++++------- - 1 file changed, 22 insertions(+), 7 deletions(-) - -diff --git a/src/uadk_sm2.c b/src/uadk_sm2.c -index f602e48..b39c418 100644 ---- a/src/uadk_sm2.c -+++ b/src/uadk_sm2.c -@@ -524,7 +524,7 @@ static int cipher_ber_to_bin(unsigned char *ber, size_t ber_len, - len = BN_num_bytes(ctext_struct->C1x); - len1 = BN_num_bytes(ctext_struct->C1y); - c1->x.data = malloc(len + len1 + ctext_struct->C2->length + -- ctext_struct->C3->length); -+ ctext_struct->C3->length); - if (!c1->x.data) { - ret = -ENOMEM; - goto free_ctext; -@@ -547,7 +547,6 @@ free_ctext: - - static size_t ec_field_size(const EC_GROUP *group) - { -- /* Is there some simpler way to do this? */ - BIGNUM *p = BN_new(); - BIGNUM *a = BN_new(); - BIGNUM *b = BN_new(); -@@ -559,7 +558,7 @@ static size_t ec_field_size(const EC_GROUP *group) - if (!EC_GROUP_get_curve(group, p, a, b, NULL)) - goto done; - -- /* Pad and convert bits to bytes*/ -+ /* Pad and convert bits to bytes */ - field_size = (BN_num_bits(p) + 7) / 8; - - done: -@@ -570,6 +569,22 @@ done: - return field_size; - } - -+static int sm2_plaintext_size(const unsigned char *ct, size_t ct_size, size_t *pt_size) -+{ -+ struct sm2_ciphertext *sm2_ctext; -+ -+ sm2_ctext = d2i_SM2_Ciphertext(NULL, &ct, ct_size); -+ if (!sm2_ctext) { -+ fprintf(stderr, "invalid sm2 encoding\n"); -+ return 0; -+ } -+ -+ *pt_size = sm2_ctext->C2->length; -+ SM2_Ciphertext_free(sm2_ctext); -+ -+ return 1; -+} -+ - static int sm2_ciphertext_size(const EC_KEY *key, - const EVP_MD *digest, size_t msg_len, - size_t *ct_size) -@@ -589,6 +604,7 @@ static int sm2_ciphertext_size(const EC_KEY *key, - + ASN1_object_size(0, md_size, V_ASN1_OCTET_STRING) - + ASN1_object_size(0, msg_len, V_ASN1_OCTET_STRING); - *ct_size = ASN1_object_size(1, sz, V_ASN1_SEQUENCE); -+ - return 1; - } - -@@ -792,7 +808,7 @@ static int sm2_verify(EVP_PKEY_CTX *ctx, - } - - ret = uadk_ecc_crypto(smctx->sess, &req, smctx); -- if (ret != 1) { -+ if (!ret) { - ret = UADK_DO_SOFT; - fprintf(stderr, "failed to uadk_ecc_crypto, ret = %d\n", ret); - goto uninit_iot; -@@ -941,8 +957,6 @@ static int sm2_decrypt_check(EVP_PKEY_CTX *ctx, - const unsigned char *in, size_t inlen) - { - struct sm2_ctx *smctx = EVP_PKEY_CTX_get_data(ctx); -- EVP_PKEY *p_key = EVP_PKEY_CTX_get0_pkey(ctx); -- EC_KEY *ec = EVP_PKEY_get0(p_key); - const EVP_MD *md; - int hash_size; - -@@ -959,7 +973,7 @@ static int sm2_decrypt_check(EVP_PKEY_CTX *ctx, - } - - if (!out) { -- if (!sm2_ciphertext_size(ec, md, inlen, outlen)) -+ if (!sm2_plaintext_size(in, inlen, outlen)) - return -1; - else - return 1; -@@ -1039,6 +1053,7 @@ static int sm2_decrypt(EVP_PKEY_CTX *ctx, - } - - md = (smctx->ctx.md == NULL) ? EVP_sm3() : smctx->ctx.md; -+ - ret = cipher_ber_to_bin((void *)in, inlen, &c1, &c2, &c3); - if (ret) - goto do_soft; --- -2.24.4 - diff --git a/0016-dh-bugfix-about-dh-compute-key.patch b/0016-dh-bugfix-about-dh-compute-key.patch deleted file mode 100644 index c9f8f60..0000000 --- a/0016-dh-bugfix-about-dh-compute-key.patch +++ /dev/null @@ -1,103 +0,0 @@ -From ff486764bbab601177acad102febb1497262a88c Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Sat, 8 Jan 2022 08:42:55 +0000 -Subject: [PATCH 16/18] dh: bugfix about dh compute key - -This patch includes: -1. Add an UADK_DO_SOFT tag when dh_do_crypto() failed. -2. Do some tiny cleanup. - -Signed-off-by: Zhiqi Song ---- - src/uadk_dh.c | 14 ++++---------- - 1 file changed, 4 insertions(+), 10 deletions(-) - -diff --git a/src/uadk_dh.c b/src/uadk_dh.c -index 9c2bfbf..989c9ec 100644 ---- a/src/uadk_dh.c -+++ b/src/uadk_dh.c -@@ -741,13 +741,12 @@ static int dh_soft_set_pkey(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key) - return UADK_E_SUCCESS; - } - --/* Main Phase1: Generate public key */ - static int uadk_e_dh_generate_key(DH *dh) - { - struct uadk_dh_sess *dh_sess = NULL; -- int bits = DH_bits(dh); -- BIGNUM *pub_key = NULL; - BIGNUM *priv_key = NULL; -+ BIGNUM *pub_key = NULL; -+ int bits = DH_bits(dh); - const BIGNUM *p = NULL; - const BIGNUM *g = NULL; - const BIGNUM *q = NULL; -@@ -771,7 +770,6 @@ static int uadk_e_dh_generate_key(DH *dh) - goto exe_soft; - } - -- /* Fill request data */ - ret = dh_fill_genkey_req(g, p, priv_key, dh_sess); - if (!ret) { - fprintf(stderr, "failed to fill req\n"); -@@ -786,7 +784,6 @@ static int uadk_e_dh_generate_key(DH *dh) - goto free_sess; - } - -- /* Get the generated public key from uadk(->hardware) */ - ret = dh_get_pubkey(dh_sess, &pub_key); - if (!ret) { - fprintf(stderr, "failed to get public key\n"); -@@ -794,7 +791,6 @@ static int uadk_e_dh_generate_key(DH *dh) - goto free_sess; - } - -- /* Set the public key and private key */ - ret = dh_soft_set_pkey(dh, pub_key, priv_key); - - free_sess: -@@ -806,16 +802,15 @@ exe_soft: - return uadk_e_dh_soft_generate_key(dh); - } - --/* Main Phase2: Compute shared key */ - static int uadk_e_dh_compute_key(unsigned char *key, const BIGNUM *pub_key, - DH *dh) - { - struct uadk_dh_sess *dh_sess = NULL; -+ BIGNUM *priv_key = NULL; - int bits = DH_bits(dh); - const BIGNUM *p = NULL; - const BIGNUM *g = NULL; - const BIGNUM *q = NULL; -- BIGNUM *priv_key = NULL; - int ret; - - if (!dh || !key || !pub_key || !DH_get0_priv_key(dh)) -@@ -845,6 +840,7 @@ static int uadk_e_dh_compute_key(unsigned char *key, const BIGNUM *pub_key, - ret = dh_do_crypto(dh_sess); - if (!ret) { - fprintf(stderr, "failed to generate DH shared key\n"); -+ ret = UADK_DO_SOFT; - goto free_sess; - } - -@@ -894,7 +890,6 @@ static void uadk_e_delete_dh_meth(void) - uadk_dh_method = NULL; - } - -- - int uadk_e_bind_dh(ENGINE *e) - { - pthread_spin_init(&g_dh_res.lock, PTHREAD_PROCESS_PRIVATE); -@@ -905,7 +900,6 @@ int uadk_e_bind_dh(ENGINE *e) - void uadk_e_destroy_dh(void) - { - pthread_spin_destroy(&g_dh_res.lock); -- - uadk_e_delete_dh_meth(); - uadk_e_wd_dh_uninit(); - } --- -2.24.4 - diff --git a/0017-ecc-bugfix-about-ecc-general-init.patch b/0017-ecc-bugfix-about-ecc-general-init.patch deleted file mode 100644 index c008750..0000000 --- a/0017-ecc-bugfix-about-ecc-general-init.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 3ff18ada641a8ad6c54a6054b4b8323b0b4389a2 Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Sat, 8 Jan 2022 09:03:00 +0000 -Subject: [PATCH 17/18] ecc: bugfix about ecc general init - -When calloc failed, it should return with error code directly. - -Signed-off-by: Zhiqi Song ---- - src/uadk_pkey.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/uadk_pkey.c b/src/uadk_pkey.c -index 7ca998b..14e0b8f 100644 ---- a/src/uadk_pkey.c -+++ b/src/uadk_pkey.c -@@ -189,7 +189,7 @@ static int uadk_e_wd_ecc_general_init(struct uacce_dev *dev, - - ctx_cfg = calloc(1, sizeof(struct wd_ctx_config)); - if (!ctx_cfg) -- ret = -ENOMEM; -+ return -ENOMEM; - - ecc_res.ctx_res = ctx_cfg; - ctx_cfg->ctx_num = CTX_NUM; --- -2.24.4 - diff --git a/0018-digest-fix-codecheck-warning.patch b/0018-digest-fix-codecheck-warning.patch deleted file mode 100644 index 20a28e8..0000000 --- a/0018-digest-fix-codecheck-warning.patch +++ /dev/null @@ -1,113 +0,0 @@ -From e26726746340428c58ea1ce2460c0fb669bb7545 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Fri, 7 Jan 2022 09:56:54 +0800 -Subject: [PATCH 18/18] digest: fix codecheck warning - -fix a more than 50 lines function uadk_e_digest_init. - -Signed-off-by: Kai Ye ---- - src/uadk_digest.c | 57 ++++++++++++++++++++++++++--------------------- - 1 file changed, 31 insertions(+), 26 deletions(-) - -diff --git a/src/uadk_digest.c b/src/uadk_digest.c -index bf738af..5b843a0 100644 ---- a/src/uadk_digest.c -+++ b/src/uadk_digest.c -@@ -95,6 +95,13 @@ struct digest_priv_ctx { - bool copy; - }; - -+struct digest_info { -+ int nid; -+ enum wd_digest_mode mode; -+ enum wd_digest_type alg; -+ __u32 out_len; -+}; -+ - static int digest_nids[] = { - NID_md5, - NID_sm3, -@@ -116,6 +123,16 @@ static struct digest_threshold_table digest_pkt_threshold_table[] = { - { NID_sha512, SHA_SMALL_PACKET_OFFLOAD_THRESHOLD_DEFAULT }, - }; - -+static struct digest_info digest_info_table[] = { -+ {NID_md5, WD_DIGEST_NORMAL, WD_DIGEST_MD5, 16}, -+ {NID_sm3, WD_DIGEST_NORMAL, WD_DIGEST_SM3, 32}, -+ {NID_sha1, WD_DIGEST_NORMAL, WD_DIGEST_SHA1, 20}, -+ {NID_sha224, WD_DIGEST_NORMAL, WD_DIGEST_SHA224, 28}, -+ {NID_sha256, WD_DIGEST_NORMAL, WD_DIGEST_SHA256, 32}, -+ {NID_sha384, WD_DIGEST_NORMAL, WD_DIGEST_SHA384, 48}, -+ {NID_sha512, WD_DIGEST_NORMAL, WD_DIGEST_SHA512, 64}, -+}; -+ - static EVP_MD *uadk_md5; - static EVP_MD *uadk_sm3; - static EVP_MD *uadk_sha1; -@@ -451,8 +468,8 @@ static void digest_priv_ctx_setup(struct digest_priv_ctx *priv, - enum wd_digest_type alg, enum wd_digest_mode mode, - __u32 out_len) - { -- priv->setup.mode = alg; -- priv->setup.alg = mode; -+ priv->setup.alg = alg; -+ priv->setup.mode = mode; - priv->req.out_buf_bytes = out_len; - priv->req.out_bytes = out_len; - } -@@ -461,9 +478,10 @@ static int uadk_e_digest_init(EVP_MD_CTX *ctx) - { - struct digest_priv_ctx *priv = - (struct digest_priv_ctx *) EVP_MD_CTX_md_data(ctx); -+ int digest_counts = ARRAY_SIZE(digest_info_table); - int nid = EVP_MD_nid(EVP_MD_CTX_md(ctx)); - struct sched_params params = {0}; -- int ret; -+ int ret, i; - - /* Allocate a soft ctx for hardware engine */ - if (priv->soft_ctx == NULL) -@@ -478,29 +496,16 @@ static int uadk_e_digest_init(EVP_MD_CTX *ctx) - goto soft_init; - } - -- switch (nid) { -- case NID_md5: -- digest_priv_ctx_setup(priv, WD_DIGEST_NORMAL, WD_DIGEST_MD5, 16); -- break; -- case NID_sm3: -- digest_priv_ctx_setup(priv, WD_DIGEST_NORMAL, WD_DIGEST_SM3, 32); -- break; -- case NID_sha1: -- digest_priv_ctx_setup(priv, WD_DIGEST_NORMAL, WD_DIGEST_SHA1, 20); -- break; -- case NID_sha224: -- digest_priv_ctx_setup(priv, WD_DIGEST_NORMAL, WD_DIGEST_SHA224, 28); -- break; -- case NID_sha256: -- digest_priv_ctx_setup(priv, WD_DIGEST_NORMAL, WD_DIGEST_SHA256, 32); -- break; -- case NID_sha384: -- digest_priv_ctx_setup(priv, WD_DIGEST_NORMAL, WD_DIGEST_SHA384, 48); -- break; -- case NID_sha512: -- digest_priv_ctx_setup(priv, WD_DIGEST_NORMAL, WD_DIGEST_SHA512, 64); -- break; -- default: -+ for (i = 0; i < digest_counts; i++) { -+ if (nid == digest_info_table[i].nid) { -+ digest_priv_ctx_setup(priv, digest_info_table[i].alg, -+ digest_info_table[i].mode, digest_info_table[i].out_len); -+ break; -+ } -+ } -+ -+ if (i == digest_counts) { -+ fprintf(stderr, "failed to setup the private ctx.\n"); - return 0; - } - --- -2.24.4 - diff --git a/0019-cipher-fixup-a-code-check-warning.patch b/0019-cipher-fixup-a-code-check-warning.patch deleted file mode 100644 index 181b5e3..0000000 --- a/0019-cipher-fixup-a-code-check-warning.patch +++ /dev/null @@ -1,27 +0,0 @@ -From e82ec8d48be21d107635e5f1a4874fb8999a27c4 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Wed, 19 Jan 2022 09:41:25 +0800 -Subject: [PATCH 19/22] cipher: fixup a code check warning - -Do not put two or more continuous blank lines inside function. - -Signed-off-by: Kai Ye ---- - src/uadk_cipher.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c -index 2b8bb9c..3d376bf 100644 ---- a/src/uadk_cipher.c -+++ b/src/uadk_cipher.c -@@ -890,7 +890,6 @@ static int uadk_e_do_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, - struct async_op op; - int ret; - -- - priv->req.src = (unsigned char *)in; - priv->req.in_bytes = inlen; - priv->req.dst = out; --- -2.24.4 - diff --git a/0020-rsa-fixup-a-code-check-warning.patch b/0020-rsa-fixup-a-code-check-warning.patch deleted file mode 100644 index da4fc40..0000000 --- a/0020-rsa-fixup-a-code-check-warning.patch +++ /dev/null @@ -1,27 +0,0 @@ -From d45c783eb7a7e1e38d5520239c218e7c927b1c00 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Fri, 21 Jan 2022 17:01:15 +0800 -Subject: [PATCH 20/22] rsa: fixup a code check warning - -Do not add blank lines on the start of a code block defined by braces. - -Signed-off-by: Kai Ye ---- - src/uadk_rsa.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index 2526af9..8cad2f7 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -1781,7 +1781,6 @@ exe_soft: - - static RSA_METHOD *uadk_e_get_rsa_sw_methods(void) - { -- - /* meth: default rsa software method */ - const RSA_METHOD *meth = RSA_PKCS1_OpenSSL(); - --- -2.24.4 - diff --git a/0021-cipher-delete-a-redundant-branch.patch b/0021-cipher-delete-a-redundant-branch.patch deleted file mode 100644 index 3854d71..0000000 --- a/0021-cipher-delete-a-redundant-branch.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 7a757c76d11b80282abc22e614f7126909027ecc Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Tue, 25 Jan 2022 14:21:48 +0800 -Subject: [PATCH 21/22] cipher: delete a redundant branch - -Find a redundant branch by DT-FUZZ, these codes have the same -logic as the following default code. - -Signed-off-by: Kai Ye ---- - src/uadk_cipher.c | 5 ----- - 1 file changed, 5 deletions(-) - -diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c -index 3d376bf..6e09a8c 100644 ---- a/src/uadk_cipher.c -+++ b/src/uadk_cipher.c -@@ -373,11 +373,6 @@ static int uadk_e_engine_ciphers(ENGINE *e, const EVP_CIPHER **cipher, - break; - } - -- if (i == size) { -- *cipher = NULL; -- return 0; -- } -- - switch (nid) { - case NID_aes_128_cbc: - *cipher = uadk_aes_128_cbc; --- -2.24.4 - diff --git a/0022-engine-fix-engine-can-t-work-under-hybrid-mode.patch b/0022-engine-fix-engine-can-t-work-under-hybrid-mode.patch deleted file mode 100644 index 582f218..0000000 --- a/0022-engine-fix-engine-can-t-work-under-hybrid-mode.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 02dbe7743190f334609a86b61bc46ea6e91e82b4 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Wed, 16 Feb 2022 16:11:06 +0800 -Subject: [PATCH 22/22] engine: fix engine can't work under hybrid mode - -If hpre works in no-sva mode, and sec works in sva mode, -it will init hpre device first and return straightly, this -casuse sec not initialized correctly. So uadk engine should -init for both sva and no-sva device. - -Signed-off-by: Wenkai Lin ---- - src/e_uadk.c | 25 ++++++++++++++----------- - 1 file changed, 14 insertions(+), 11 deletions(-) - -diff --git a/src/e_uadk.c b/src/e_uadk.c -index 4e87c86..2714d5b 100644 ---- a/src/e_uadk.c -+++ b/src/e_uadk.c -@@ -319,10 +319,15 @@ static void bind_fn_uadk_alg(ENGINE *e) - free(dev); - } - -- if (!uadk_e_bind_ecc(e)) -- fprintf(stderr, "uadk bind ecc failed\n"); -- else -- uadk_ecc = 1; -+ /* find an ecc device, no difference for sm2/ecdsa/ecdh/x25519/x448 */ -+ dev = wd_get_accel_dev("ecdsa"); -+ if (dev) { -+ if (!uadk_e_bind_ecc(e)) -+ fprintf(stderr, "uadk bind ecc failed\n"); -+ else -+ uadk_ecc = 1; -+ free(dev); -+ } - } - - /* -@@ -349,17 +354,15 @@ static int bind_fn(ENGINE *e, const char *id) - uadk_dh_nosva) { - async_module_init_v1(); - pthread_atfork(NULL, NULL, engine_init_child_at_fork_handler_v1); -- goto set_ctrl_cmd; - } - #endif -- async_module_init(); -- pthread_atfork(NULL, NULL, engine_init_child_at_fork_handler); -- - bind_fn_uadk_alg(e); - --#ifdef KAE --set_ctrl_cmd: --#endif -+ if (uadk_cipher || uadk_digest || uadk_rsa || uadk_dh || uadk_ecc) { -+ async_module_init(); -+ pthread_atfork(NULL, NULL, engine_init_child_at_fork_handler); -+ } -+ - ret = ENGINE_set_ctrl_function(e, uadk_engine_ctrl); - if (ret != 1) { - fprintf(stderr, "failed to set ctrl function\n"); --- -2.24.4 - diff --git a/0023-engine-add-the-kae-log-feature.patch b/0023-engine-add-the-kae-log-feature.patch deleted file mode 100644 index 8c390f1..0000000 --- a/0023-engine-add-the-kae-log-feature.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 351422390bf42e19a802d0e282f7f85342a1f792 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Tue, 22 Feb 2022 11:18:46 +0800 -Subject: [PATCH 23/23] engine: add the kae log feature - -The original version of the kae engine supports the log system. So -need to be enabled the kae log feature at uadk_engine. - -example: -insmod hisi_sec2.ko uacce_mode=2 - -export KAE_CONF_ENV=/var/log/ -cd /var/log/ -touch kae.cnf -write: -[LogSection] -debug_level=error - -the debug_level can be set to none/error/iofo/warning/debug, -the result is stored in /var/log/kae.log - -Signed-off-by: Kai Ye ---- - src/e_uadk.c | 2 ++ - src/v1/uadk_v1.h | 1 + - 2 files changed, 3 insertions(+) - -diff --git a/src/e_uadk.c b/src/e_uadk.c -index 2714d5b..79ecef8 100644 ---- a/src/e_uadk.c -+++ b/src/e_uadk.c -@@ -205,6 +205,7 @@ static int uadk_destroy(ENGINE *e) - hpre_destroy(); - if (uadk_dh_nosva) - hpre_dh_destroy(); -+ kae_debug_close_log(); - #endif - - if (uadk_cipher) -@@ -348,6 +349,7 @@ static int bind_fn(ENGINE *e, const char *id) - } - - #ifdef KAE -+ kae_debug_init_log(); - bind_fn_kae_alg(e); - - if (uadk_cipher_nosva || uadk_digest_nosva || uadk_rsa_nosva || -diff --git a/src/v1/uadk_v1.h b/src/v1/uadk_v1.h -index d921706..9ca0a94 100644 ---- a/src/v1/uadk_v1.h -+++ b/src/v1/uadk_v1.h -@@ -16,6 +16,7 @@ - #define UADK_V1_H - #include "async/async_poll.h" - #include "utils/engine_fork.h" -+#include "utils/engine_log.h" - - extern void sec_ciphers_free_ciphers(void); - extern int cipher_module_init(void); --- -2.24.4 - diff --git a/0024-rsa-fix-interface-name.patch b/0024-rsa-fix-interface-name.patch deleted file mode 100644 index 065a08f..0000000 --- a/0024-rsa-fix-interface-name.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 63c9bc75f229057657ff8b09c556bf416a493607 Mon Sep 17 00:00:00 2001 -From: Junchong Pan -Date: Wed, 2 Mar 2022 08:30:50 +0000 -Subject: [PATCH 24/31] rsa: fix interface name - -The name of the function wd_rsa_key_bits() -has been changed to wd_rsa_get_key_bits() -in uadk driver, so it needs to be modified -in engine synchronously. - -Signed-off-by: Junchong Pan -Signed-off-by: Zhiqi Song ---- - src/uadk_rsa.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index 8cad2f7..90cc535 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -986,7 +986,7 @@ static int rsa_get_keygen_param(struct wd_rsa_req *req, - struct wd_dtb wd_dq; - struct wd_dtb wd_dp; - -- key_bits = wd_rsa_key_bits(ctx); -+ key_bits = wd_rsa_get_key_bits(ctx); - key_size = key_bits >> BIT_BYTES_SHIFT; - wd_rsa_get_kg_out_params(out, &wd_d, &wd_n); - wd_rsa_get_kg_out_crt_params(out, &wd_qinv, &wd_dq, &wd_dp); --- -2.24.4 - diff --git a/0025-ecc-cleanup-sm2-unreachable-code.patch b/0025-ecc-cleanup-sm2-unreachable-code.patch deleted file mode 100644 index 4ddd2f7..0000000 --- a/0025-ecc-cleanup-sm2-unreachable-code.patch +++ /dev/null @@ -1,28 +0,0 @@ -From dcceb7e8f77306dda7dea31798ea8ab952fbe8ea Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Thu, 3 Mar 2022 02:00:46 +0000 -Subject: [PATCH 25/31] ecc: cleanup sm2 unreachable code - -The variable "b_s" should be judged, rather than "b_r". - -Signed-off-by: Zhiqi Song ---- - src/uadk_sm2.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/uadk_sm2.c b/src/uadk_sm2.c -index b39c418..8c75611 100644 ---- a/src/uadk_sm2.c -+++ b/src/uadk_sm2.c -@@ -422,7 +422,7 @@ static int sig_ber_to_bin(EC_KEY *ec, unsigned char *sig, size_t sig_len, - } - - b_s = (void *)ECDSA_SIG_get0_s((const ECDSA_SIG *)e_sig); -- if (!b_r) { -+ if (!b_s) { - fprintf(stderr, "failed to get s\n"); - ret = -EINVAL; - goto free_der; --- -2.24.4 - diff --git a/0026-rsa-cleanup-of-code-style.patch b/0026-rsa-cleanup-of-code-style.patch deleted file mode 100644 index 23e3cd7..0000000 --- a/0026-rsa-cleanup-of-code-style.patch +++ /dev/null @@ -1,68 +0,0 @@ -From 4bcecc067ed99f2323f1568779c34b858b5863a1 Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Thu, 3 Mar 2022 02:32:44 +0000 -Subject: [PATCH 26/31] rsa: cleanup of code style - -Fix the following problems: -1. Macro replacement list should be enclosed in parentheses. -2. Return value judgment should follow the function call. -3. Remove redundant judgment. - -Signed-off-by: Zhiqi Song ---- - src/uadk_rsa.c | 12 +++--------- - 1 file changed, 3 insertions(+), 9 deletions(-) - -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index 90cc535..f7755e3 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -49,7 +49,7 @@ - #define UADK_DO_SOFT (-0xE0) - #define UADK_E_POLL_SUCCESS 0 - #define UADK_E_INIT_SUCCESS 0 --#define CHECK_PADDING_FAIL -1 -+#define CHECK_PADDING_FAIL (-1) - #define ENV_ENABLED 1 - - static RSA_METHOD *rsa_hw_meth; -@@ -312,7 +312,6 @@ static int check_rsa_prime_useful(const int *n, struct rsa_prime_param *param, - return UADK_E_SUCCESS; - - err = ERR_peek_last_error(); -- - if (ERR_GET_LIB(err) == ERR_LIB_BN && - ERR_GET_REASON(err) == BN_R_NO_INVERSE) - ERR_pop_to_mark(); -@@ -500,18 +499,13 @@ static int add_rsa_pubenc_padding(int flen, const unsigned char *from, - fprintf(stderr, "RSA_PKCS1_PADDING err\n"); - break; - case RSA_PKCS1_OAEP_PADDING: -- ret = RSA_padding_add_PKCS1_OAEP(buf, num, from, flen, -- NULL, 0); -+ ret = RSA_padding_add_PKCS1_OAEP(buf, num, from, flen, NULL, 0); - if (!ret) - fprintf(stderr, "RSA_PKCS1_OAEP_PADDING err\n"); - break; - default: - ret = UADK_E_FAIL; - } -- if (ret <= 0) -- ret = UADK_E_FAIL; -- else -- ret = UADK_E_SUCCESS; - - return ret; - } -@@ -530,7 +524,7 @@ static int check_rsa_pridec_padding(unsigned char *to, int num, - break; - case RSA_PKCS1_OAEP_PADDING: - ret = RSA_padding_check_PKCS1_OAEP(to, num, buf, len, num, -- NULL, 0); -+ NULL, 0); - if (!ret) - fprintf(stderr, "RSA_PKCS1_OAEP_PADDING err\n"); - break; --- -2.24.4 - diff --git a/0027-v1-fixup-about-uninitialized-variable.patch b/0027-v1-fixup-about-uninitialized-variable.patch deleted file mode 100644 index 2966d88..0000000 --- a/0027-v1-fixup-about-uninitialized-variable.patch +++ /dev/null @@ -1,62 +0,0 @@ -From fe44bced638c7d3d3084f4e788478b2faa35ffa4 Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Thu, 3 Mar 2022 02:53:01 +0000 -Subject: [PATCH 27/31] v1: fixup about uninitialized variable - -Fix the compile warning of uninitialized variable. - -Signed-off-by: Zhiqi Song ---- - src/v1/alg/pkey/hpre_rsa.c | 12 ++++++++---- - 1 file changed, 8 insertions(+), 4 deletions(-) - -diff --git a/src/v1/alg/pkey/hpre_rsa.c b/src/v1/alg/pkey/hpre_rsa.c -index 93ba99a..6c1d96d 100644 ---- a/src/v1/alg/pkey/hpre_rsa.c -+++ b/src/v1/alg/pkey/hpre_rsa.c -@@ -316,7 +316,9 @@ static int hpre_rsa_public_encrypt(int flen, const unsigned char *from, - BIGNUM *ret_bn = NULL; - hpre_engine_ctx_t *eng_ctx = NULL; - unsigned char *in_buf = NULL; -- int key_bits, num_bytes; -+ BN_CTX *bn_ctx = NULL; -+ int num_bytes = 0; -+ int key_bits; - int ret; - - if (hpre_rsa_check_para(flen, from, to, rsa) != HPRE_CRYPTO_SUCC) -@@ -340,7 +342,7 @@ static int hpre_rsa_public_encrypt(int flen, const unsigned char *from, - GOTOEND_IF(ret != HPRE_CRYPTO_SUCC, "check public key fail", - KAE_F_HPRE_RSA_PUBENC, KAE_R_PUBLIC_KEY_INVALID); - -- BN_CTX *bn_ctx = BN_CTX_new(); -+ bn_ctx = BN_CTX_new(); - - GOTOEND_IF(bn_ctx == NULL, "bn_ctx MALLOC FAILED!", - KAE_F_HPRE_RSA_PUBENC, KAE_R_MALLOC_FAILURE); -@@ -403,7 +405,9 @@ static int hpre_rsa_private_encrypt(int flen, const unsigned char *from, - const BIGNUM *dmq1 = (const BIGNUM *)NULL; - const BIGNUM *iqmp = (const BIGNUM *)NULL; - unsigned char *in_buf = (unsigned char *)NULL; -+ int num_bytes = 0; - int key_bits; -+ int version; - - if (hpre_rsa_check_para(flen, from, to, rsa) != HPRE_CRYPTO_SUCC) - return HPRE_CRYPTO_FAIL; -@@ -431,10 +435,10 @@ static int hpre_rsa_private_encrypt(int flen, const unsigned char *from, - bn_ret = BN_CTX_get(bn_ctx); - RSA_get0_factors(rsa, &p, &q); - RSA_get0_crt_params(rsa, &dmp1, &dmq1, &iqmp); -- int version = RSA_get_version(rsa); -+ version = RSA_get_version(rsa); - - RSA_get0_key(rsa, &n, &e, &d); -- int num_bytes = BN_num_bytes(n); -+ num_bytes = BN_num_bytes(n); - - in_buf = (unsigned char *)OPENSSL_malloc(num_bytes); - GOTOEND_IF(bn_ret == NULL || in_buf == NULL, "OpenSSL malloc failure", --- -2.24.4 - diff --git a/0028-ecc-fix-checking-conditions.patch b/0028-ecc-fix-checking-conditions.patch deleted file mode 100644 index a95e09e..0000000 --- a/0028-ecc-fix-checking-conditions.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 8ce0ba841358d85eb89bf726d229dfaf4cd13156 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Thu, 3 Mar 2022 02:59:13 +0000 -Subject: [PATCH 28/31] ecc: fix checking conditions - -When initializing, the process is guaranteed -not to be initialized repeatedly. And when -uninitializing, the resource is released according -to whether the pid is equal or not. - -Signed-off-by: Weili Qian -Signed-off-by: Zhiqi Song ---- - src/uadk_pkey.c | 5 +---- - 1 file changed, 1 insertion(+), 4 deletions(-) - -diff --git a/src/uadk_pkey.c b/src/uadk_pkey.c -index 14e0b8f..ceb7a8f 100644 ---- a/src/uadk_pkey.c -+++ b/src/uadk_pkey.c -@@ -184,9 +184,6 @@ static int uadk_e_wd_ecc_general_init(struct uacce_dev *dev, - struct wd_ctx_config *ctx_cfg; - int ret, i; - -- if (ecc_res.ctx_res) -- return 0; -- - ctx_cfg = calloc(1, sizeof(struct wd_ctx_config)); - if (!ctx_cfg) - return -ENOMEM; -@@ -256,7 +253,7 @@ static void uadk_wd_ecc_uninit(void) - struct wd_ctx_config *ctx_cfg = ecc_res.ctx_res; - int i, ret; - -- if (!ctx_cfg) -+ if (ecc_res.pid != getpid()) - return; - - ret = uadk_e_is_env_enabled("ecc"); --- -2.24.4 - diff --git a/0029-ecc-cleanup-print-log.patch b/0029-ecc-cleanup-print-log.patch deleted file mode 100644 index 7d5c41a..0000000 --- a/0029-ecc-cleanup-print-log.patch +++ /dev/null @@ -1,55 +0,0 @@ -From a19b11343facb6ff073cb01bf3583c8bf6cbb009 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Thu, 3 Mar 2022 03:08:45 +0000 -Subject: [PATCH 29/31] ecc: cleanup print log - -print with '\n' - -Signed-off-by: Weili Qian ---- - src/uadk_pkey.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/src/uadk_pkey.c b/src/uadk_pkey.c -index ceb7a8f..216ccc3 100644 ---- a/src/uadk_pkey.c -+++ b/src/uadk_pkey.c -@@ -572,7 +572,7 @@ static int get_pkey_meths(ENGINE *e, EVP_PKEY_METHOD **pmeth, - case EVP_PKEY_SM2: - ret = uadk_sm2_create_pmeth(&pkey_meth); - if (!ret) { -- fprintf(stderr, "failed to register sm2 pmeth"); -+ fprintf(stderr, "failed to register sm2 pmeth.\n"); - return 0; - } - *pmeth = pkey_meth.sm2; -@@ -580,7 +580,7 @@ static int get_pkey_meths(ENGINE *e, EVP_PKEY_METHOD **pmeth, - case EVP_PKEY_EC: - ret = uadk_ec_create_pmeth(&pkey_meth); - if (!ret) { -- fprintf(stderr, "failed to register ec pmeth"); -+ fprintf(stderr, "failed to register ec pmeth.\n"); - return 0; - } - *pmeth = pkey_meth.ec; -@@ -588,7 +588,7 @@ static int get_pkey_meths(ENGINE *e, EVP_PKEY_METHOD **pmeth, - case EVP_PKEY_X448: - ret = uadk_x448_create_pmeth(&pkey_meth); - if (!ret) { -- fprintf(stderr, "failed to register x448 pmeth"); -+ fprintf(stderr, "failed to register x448 pmeth.\n"); - return 0; - } - *pmeth = pkey_meth.x448; -@@ -596,7 +596,7 @@ static int get_pkey_meths(ENGINE *e, EVP_PKEY_METHOD **pmeth, - case EVP_PKEY_X25519: - ret = uadk_x25519_create_pmeth(&pkey_meth); - if (!ret) { -- fprintf(stderr, "failed to register x25519 pmeth"); -+ fprintf(stderr, "failed to register x25519 pmeth.\n"); - return 0; - } - *pmeth = pkey_meth.x25519; --- -2.24.4 - diff --git a/0030-engine-fix-function-return-type.patch b/0030-engine-fix-function-return-type.patch deleted file mode 100644 index 4f14a7a..0000000 --- a/0030-engine-fix-function-return-type.patch +++ /dev/null @@ -1,218 +0,0 @@ -From 26360660c516fe54b48502a3ca9eb1bbf47146d5 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Thu, 3 Mar 2022 03:11:24 +0000 -Subject: [PATCH 30/31] engine: fix function return type - -The async_register_poll_fn() is an internal -function, and the probability of parameter -error is low. If the parameter is wrong, -a log will be printed, there is no need to -return an error code. And 'MAX_ALG_SIZE' is -chenged to 'ASYNC_TASK_MAX'. - -Signed-off-by: Weili Qian -Signed-off-by: Zhiqi Song ---- - src/uadk_async.c | 13 ++++++------- - src/uadk_async.h | 5 +++-- - src/uadk_cipher.c | 9 ++++++--- - src/uadk_dh.c | 8 ++++++-- - src/uadk_digest.c | 9 ++++++--- - src/uadk_pkey.c | 8 ++++++-- - src/uadk_rsa.c | 8 ++++++-- - 7 files changed, 39 insertions(+), 21 deletions(-) - -diff --git a/src/uadk_async.c b/src/uadk_async.c -index 5320ae6..c98153b 100644 ---- a/src/uadk_async.c -+++ b/src/uadk_async.c -@@ -22,11 +22,9 @@ - #include "uadk.h" - #include "uadk_async.h" - --#define MAX_ALG_SIZE 6 -- - static struct async_poll_queue poll_queue; - --static async_recv_t async_recv_func[MAX_ALG_SIZE]; -+static async_recv_t async_recv_func[ASYNC_TASK_MAX]; - - static void async_fd_cleanup(ASYNC_WAIT_CTX *ctx, const void *key, - OSSL_ASYNC_FD readfd, void *custom) -@@ -292,13 +290,14 @@ int async_wake_job(ASYNC_JOB *job) - return ret; - } - --int async_register_poll_fn(int type, async_recv_t func) -+void async_register_poll_fn(int type, async_recv_t func) - { -- if (type < 0 || type >= MAX_ALG_SIZE) -- return -1; -+ if (type < 0 || type >= ASYNC_TASK_MAX) { -+ fprintf(stderr, "alg type is error, type= %d.\n", type); -+ return; -+ } - - async_recv_func[type] = func; -- return 0; - } - - static void *async_poll_process_func(void *args) -diff --git a/src/uadk_async.h b/src/uadk_async.h -index cbb4b62..9836dbb 100644 ---- a/src/uadk_async.h -+++ b/src/uadk_async.h -@@ -42,7 +42,8 @@ enum task_type { - ASYNC_TASK_DIGEST, - ASYNC_TASK_RSA, - ASYNC_TASK_DH, -- ASYNC_TASK_ECC -+ ASYNC_TASK_ECC, -+ ASYNC_TASK_MAX - }; - - struct async_poll_task { -@@ -66,7 +67,7 @@ struct async_poll_queue { - extern int async_setup_async_event_notification(struct async_op *op); - extern int async_clear_async_event_notification(void); - extern int async_pause_job(void *ctx, struct async_op *op, enum task_type type, int id); --extern int async_register_poll_fn(int type, async_recv_t func); -+extern void async_register_poll_fn(int type, async_recv_t func); - extern void async_module_init(void); - extern int async_wake_job(ASYNC_JOB *job); - extern void async_free_poll_task(int id, bool is_cb); -diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c -index 6e09a8c..8f8af7e 100644 ---- a/src/uadk_cipher.c -+++ b/src/uadk_cipher.c -@@ -550,8 +550,9 @@ static int uadk_e_wd_cipher_env_init(struct uacce_dev *dev) - if (ret) - return ret; - -- return async_register_poll_fn(ASYNC_TASK_CIPHER, -- uadk_e_cipher_env_poll); -+ async_register_poll_fn(ASYNC_TASK_CIPHER, uadk_e_cipher_env_poll); -+ -+ return 0; - } - - static int uadk_e_wd_cipher_init(struct uacce_dev *dev) -@@ -596,7 +597,9 @@ static int uadk_e_wd_cipher_init(struct uacce_dev *dev) - if (ret) - goto err_freectx; - -- return async_register_poll_fn(ASYNC_TASK_CIPHER, uadk_e_cipher_poll); -+ async_register_poll_fn(ASYNC_TASK_CIPHER, uadk_e_cipher_poll); -+ -+ return 0; - - err_freectx: - for (j = 0; j < i; j++) -diff --git a/src/uadk_dh.c b/src/uadk_dh.c -index 989c9ec..40fb583 100644 ---- a/src/uadk_dh.c -+++ b/src/uadk_dh.c -@@ -296,7 +296,9 @@ static int uadk_e_wd_dh_env_init(struct uacce_dev *dev) - if (ret) - return ret; - -- return async_register_poll_fn(ASYNC_TASK_DH, uadk_e_dh_env_poll); -+ async_register_poll_fn(ASYNC_TASK_DH, uadk_e_dh_env_poll); -+ -+ return 0; - } - - static int uadk_e_wd_dh_init(struct dh_res_config *config, struct uacce_dev *dev) -@@ -335,7 +337,9 @@ static int uadk_e_wd_dh_init(struct dh_res_config *config, struct uacce_dev *dev - if (ret) - goto free_ctx; - -- return async_register_poll_fn(ASYNC_TASK_DH, uadk_e_dh_poll); -+ async_register_poll_fn(ASYNC_TASK_DH, uadk_e_dh_poll); -+ -+ return 0; - - free_ctx: - for (i = 0; i < CTX_NUM; i++) { -diff --git a/src/uadk_digest.c b/src/uadk_digest.c -index 5b843a0..ad24168 100644 ---- a/src/uadk_digest.c -+++ b/src/uadk_digest.c -@@ -374,8 +374,9 @@ static int uadk_e_wd_digest_env_init(struct uacce_dev *dev) - if (ret) - return ret; - -- return async_register_poll_fn(ASYNC_TASK_DIGEST, -- uadk_e_digest_env_poll); -+ async_register_poll_fn(ASYNC_TASK_DIGEST, uadk_e_digest_env_poll); -+ -+ return 0; - } - - static int uadk_e_wd_digest_init(struct uacce_dev *dev) -@@ -415,7 +416,9 @@ static int uadk_e_wd_digest_init(struct uacce_dev *dev) - if (ret) - goto err_freectx; - -- return async_register_poll_fn(ASYNC_TASK_DIGEST, uadk_e_digest_poll); -+ async_register_poll_fn(ASYNC_TASK_DIGEST, uadk_e_digest_poll); -+ -+ return 0; - - err_freectx: - for (j = 0; j < i; j++) -diff --git a/src/uadk_pkey.c b/src/uadk_pkey.c -index 216ccc3..f27e2f5 100644 ---- a/src/uadk_pkey.c -+++ b/src/uadk_pkey.c -@@ -175,7 +175,9 @@ static int uadk_e_wd_ecc_env_init(struct uacce_dev *dev) - if (ret) - return ret; - -- return async_register_poll_fn(ASYNC_TASK_ECC, uadk_e_ecc_env_poll); -+ async_register_poll_fn(ASYNC_TASK_ECC, uadk_e_ecc_env_poll); -+ -+ return 0; - } - - static int uadk_e_wd_ecc_general_init(struct uacce_dev *dev, -@@ -209,7 +211,9 @@ static int uadk_e_wd_ecc_general_init(struct uacce_dev *dev, - if (ret) - goto free_ctx; - -- return async_register_poll_fn(ASYNC_TASK_ECC, uadk_ecc_poll); -+ async_register_poll_fn(ASYNC_TASK_ECC, uadk_ecc_poll); -+ -+ return 0; - - free_ctx: - for (i = 0; i < CTX_NUM; i++) { -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index f7755e3..c5d4dbb 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -713,7 +713,9 @@ static int uadk_e_wd_rsa_env_init(struct uacce_dev *dev) - if (ret) - return ret; - -- return async_register_poll_fn(ASYNC_TASK_RSA, uadk_e_rsa_env_poll); -+ async_register_poll_fn(ASYNC_TASK_RSA, uadk_e_rsa_env_poll); -+ -+ return 0; - } - - static int uadk_e_wd_rsa_init(struct rsa_res_config *config, -@@ -753,7 +755,9 @@ static int uadk_e_wd_rsa_init(struct rsa_res_config *config, - if (ret) - goto free_ctx; - -- return async_register_poll_fn(ASYNC_TASK_RSA, uadk_e_rsa_poll); -+ async_register_poll_fn(ASYNC_TASK_RSA, uadk_e_rsa_poll); -+ -+ return 0; - - free_ctx: - for (i = 0; i < CTX_NUM; i++) { --- -2.24.4 - diff --git a/0031-rsa-fixup-about-the-wrong-copy.patch b/0031-rsa-fixup-about-the-wrong-copy.patch deleted file mode 100644 index a41a420..0000000 --- a/0031-rsa-fixup-about-the-wrong-copy.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 2c99863001cbb39838d983d76171ac131930c310 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Thu, 3 Mar 2022 03:25:03 +0000 -Subject: [PATCH 31/31] rsa: fixup about the wrong copy - -The pointer of 'req.src' is NULL, and the -direct memcpy operation will fail. Therefore, -delete the memcpy and assign a value directly later. - -Signed-off-by: Weili Qian -Signed-off-by: Zhiqi Song ---- - src/uadk_rsa.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index c5d4dbb..1488b98 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -902,7 +902,6 @@ static int rsa_fill_pubkey(struct rsa_pubkey_param *pubkey_param, - if (!rsa_sess->is_pubkey_ready) { - wd_rsa_get_pubkey(rsa_sess->sess, &pubkey); - wd_rsa_get_pubkey_params(pubkey, &wd_e, &wd_n); -- memcpy(rsa_sess->req.src, in_buf, rsa_sess->req.src_bytes); - wd_e->dsize = BN_bn2bin(pubkey_param->e, - (unsigned char *)wd_e->data); - wd_n->dsize = BN_bn2bin(pubkey_param->n, --- -2.24.4 - diff --git a/0032-README-modify-the-engine-id-name.patch b/0032-README-modify-the-engine-id-name.patch deleted file mode 100644 index 37b5b77..0000000 --- a/0032-README-modify-the-engine-id-name.patch +++ /dev/null @@ -1,164 +0,0 @@ -From a476a9881ed143f16eb579f3a34446ea24cb20f8 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Fri, 4 Mar 2022 14:44:07 +0800 -Subject: [PATCH 32/32] README: modify the engine id name - -The new engine id name is 'uadk_engine'. So need to update -the README. - -Signed-off-by: Kai Ye ---- - README | 98 +++++++++++++++++++++++++++++----------------------------- - 1 file changed, 49 insertions(+), 49 deletions(-) - -diff --git a/README b/README -index e02de8f..562a859 100644 ---- a/README -+++ b/README -@@ -67,60 +67,60 @@ Testing - ``` - 1. Cipher - ``` --openssl enc -aes-128-cbc -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -aes-128-cbc -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -aes-192-cbc -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -aes-192-cbc -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -aes-256-cbc -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -aes-256-cbc -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -aes-128-ecb -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -aes-128-ecb -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -aes-192-ecb -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -aes-192-ecb -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -aes-256-ecb -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -aes-256-ecb -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -aes-128-ctr -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -aes-128-ctr -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -aes-192-ctr -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -aes-192-ctr -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -aes-256-ctr -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -aes-256-ctr -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -sm4-cbc -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -sm4-cbc -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -sm4-ecb -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -sm4-ecb -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -des-ede3-cbc -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -des-ede3-cbc -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -des-ede3-ecb -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl enc -des-ede3-ecb -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk -p --openssl speed -engine uadk -async_jobs 1 -evp aes-128-cbc --openssl speed -engine uadk -async_jobs 1 -evp sm4-cbc --openssl speed -engine uadk -async_jobs 1 -evp des-ede3-cbc -+openssl enc -aes-128-cbc -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -aes-128-cbc -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -aes-192-cbc -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -aes-192-cbc -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -aes-256-cbc -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -aes-256-cbc -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -aes-128-ecb -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -aes-128-ecb -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -aes-192-ecb -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -aes-192-ecb -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -aes-256-ecb -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -aes-256-ecb -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -aes-128-ctr -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -aes-128-ctr -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -aes-192-ctr -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -aes-192-ctr -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -aes-256-ctr -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -aes-256-ctr -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -sm4-cbc -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -sm4-cbc -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -sm4-ecb -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -sm4-ecb -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -des-ede3-cbc -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -des-ede3-cbc -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -des-ede3-ecb -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl enc -des-ede3-ecb -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p -+openssl speed -engine uadk_engine -async_jobs 1 -evp aes-128-cbc -+openssl speed -engine uadk_engine -async_jobs 1 -evp sm4-cbc -+openssl speed -engine uadk_engine -async_jobs 1 -evp des-ede3-cbc - ``` - 2. RSA - ``` --openssl genrsa -out prikey.pem -engine uadk 2048 --openssl rsa -in prikey.pem -pubout -out pubkey.pem -engine uadk --openssl rsautl -encrypt -in plain.txt -inkey pubkey.pem -pubin -out enc.txt -engine uadk --openssl rsautl -decrypt -in enc.txt -inkey prikey.pem -out dec.txt -engine uadk --openssl rsautl -sign -in msg.txt -inkey prikey.pem -out signed.txt -engine uadk --openssl rsautl -verify -in signed.txt -inkey pubkey.pem -pubin -out verified.txt -engine uadk --openssl speed -elapsed -engine uadk rsa2048 --openssl speed -elapsed -engine uadk -async_jobs 10 rsa2048 -+openssl genrsa -out prikey.pem -engine uadk_engine 2048 -+openssl rsa -in prikey.pem -pubout -out pubkey.pem -engine uadk_engine -+openssl rsautl -encrypt -in plain.txt -inkey pubkey.pem -pubin -out enc.txt -engine uadk_engine -+openssl rsautl -decrypt -in enc.txt -inkey prikey.pem -out dec.txt -engine uadk_engine -+openssl rsautl -sign -in msg.txt -inkey prikey.pem -out signed.txt -engine uadk_engine -+openssl rsautl -verify -in signed.txt -inkey pubkey.pem -pubin -out verified.txt -engine uadk_engine -+openssl speed -elapsed -engine uadk_engine rsa2048 -+openssl speed -elapsed -engine uadk_engine -async_jobs 10 rsa2048 - ``` - 3. SM3 - ``` --openssl sm3 -engine uadk data -+openssl sm3 -engine uadk_engine data - ``` - 4. MD5 - ``` --openssl speed -engine uadk -async_jobs 1 -evp md5 -+openssl speed -engine uadk_engine -async_jobs 1 -evp md5 - ``` - 5. SHA - ``` --openssl sha1 -engine uadk data --openssl sha256 -engine uadk data --openssl sha512 -engine uadk data -+openssl sha1 -engine uadk_engine data -+openssl sha256 -engine uadk_engine data -+openssl sha512 -engine uadk_engine data - ``` - 6. DH - -@@ -142,9 +142,9 @@ openssl pkey -in privatekey2.pem -pubout -out publickey2.pem -engine uadk - [step 4] After exchanging public key, each user can derive the shared secret: - ``` - openssl pkeyutl -derive -inkey privatekey1.pem -peerkey publickey2.pem -out --secret1.bin -engine uadk -+secret1.bin -engine uadk_engine - openssl pkeyutl -derive -inkey privatekey2.pem -peerkey publickey1.pem -out --secret2.bin -engine uadk -+secret2.bin -engine uadk_engine - ``` - [step 5] Check secret1.bin and secret2.bin: - ``` -@@ -156,15 +156,15 @@ secret1.bin and secret2.bin should be the same. - - 7. SM2 - ``` --openssl speed -elapsed -engine uadk sm2 --openssl speed -elapsed -engine uadk -async_jobs 1 sm2 -+openssl speed -elapsed -engine uadk_engine sm2 -+openssl speed -elapsed -engine uadk_engine -async_jobs 1 sm2 - openssl ecparam -genkey -name SM2 -out SM2PrivateKey.pem - openssl ec -in SM2PrivateKey.pem -pubout -out SM2PublicKey.pem - ``` - 8. ECDSA - ``` --openssl speed -elapsed -engine uadk ecdsap256 --openssl speed -elapsed -engine uadk -async_jobs 1 ecdsap256 -+openssl speed -elapsed -engine uadk_engine ecdsap256 -+openssl speed -elapsed -engine uadk_engine -async_jobs 1 ecdsap256 - ``` - - Environment variable of uadk engine -@@ -184,7 +184,7 @@ openssl_cnf = openssl_def - [openssl_def] - engines = engine_section - [engine_section] --uadk = uadk_section -+uadk_engine = uadk_section - [uadk_section] - UADK_CMD_ENABLE_RSA_ENV = 1 - UADK_CMD_ENABLE_DH_ENV = 1 --- -2.24.4 - diff --git a/0033-digest-improve-the-digest-performance.patch b/0033-digest-improve-the-digest-performance.patch deleted file mode 100644 index d7aa57a..0000000 --- a/0033-digest-improve-the-digest-performance.patch +++ /dev/null @@ -1,226 +0,0 @@ -From 3cbf3c85645d7ec43aa149c1bcf346a556bbf30a Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Tue, 8 Mar 2022 15:44:00 +0800 -Subject: [PATCH 33/36] digest: improve the digest performance - -1. The memset function found to be a hotspot function by perf. so should - remove the memset in io path. it can improve three times - performance. -2. add some branch predictor function to improve a little performance. -3. use the uadk_memory_cpy can improve 5% performance. - -Signed-off-by: Kai Ye ---- - src/Makefile.am | 4 +-- - src/uadk.h | 1 + - src/uadk_digest.c | 17 ++++++------- - src/uadk_utils.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++ - src/uadk_utils.h | 24 ++++++++++++++++++ - 5 files changed, 98 insertions(+), 11 deletions(-) - create mode 100644 src/uadk_utils.c - create mode 100644 src/uadk_utils.h - -diff --git a/src/Makefile.am b/src/Makefile.am -index 636f559..75595aa 100644 ---- a/src/Makefile.am -+++ b/src/Makefile.am -@@ -7,8 +7,8 @@ UADK_ENGINE_VERSION = -version-number ${MAJOR}:${MINOR}:${REVISION} - - lib_LTLIBRARIES=uadk_engine.la - --uadk_engine_la_SOURCES=e_uadk.c uadk_cipher.c uadk_digest.c uadk_async.c uadk_rsa.c \ -- uadk_sm2.c uadk_pkey.c uadk_dh.c uadk_ec.c uadk_ecx.c -+uadk_engine_la_SOURCES=uadk_utils.c e_uadk.c uadk_cipher.c uadk_digest.c uadk_async.c \ -+ uadk_rsa.c uadk_sm2.c uadk_pkey.c uadk_dh.c uadk_ec.c uadk_ecx.c - uadk_engine_la_LIBADD=-ldl -lwd -lwd_crypto -lpthread - uadk_engine_la_LDFLAGS=-module $(UADK_ENGINE_VERSION) - -diff --git a/src/uadk.h b/src/uadk.h -index 0f9b0be..384e035 100644 ---- a/src/uadk.h -+++ b/src/uadk.h -@@ -19,6 +19,7 @@ - #include - #include - #include -+#include "uadk_utils.h" - - #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) - #define ENV_STRING_LEN 256 -diff --git a/src/uadk_digest.c b/src/uadk_digest.c -index ad24168..355917d 100644 ---- a/src/uadk_digest.c -+++ b/src/uadk_digest.c -@@ -493,7 +493,7 @@ static int uadk_e_digest_init(EVP_MD_CTX *ctx) - - priv->state = SEC_DIGEST_INIT; - ret = uadk_e_init_digest(); -- if (!ret) { -+ if (unlikely(!ret)) { - priv->switch_flag = UADK_DO_SOFT; - fprintf(stderr, "uadk failed to initialize digest.\n"); - goto soft_init; -@@ -507,7 +507,7 @@ static int uadk_e_digest_init(EVP_MD_CTX *ctx) - } - } - -- if (i == digest_counts) { -+ if (unlikely(i == digest_counts)) { - fprintf(stderr, "failed to setup the private ctx.\n"); - return 0; - } -@@ -519,11 +519,10 @@ static int uadk_e_digest_init(EVP_MD_CTX *ctx) - return 0; - - priv->data = malloc(DIGEST_BLOCK_SIZE); -- if (!priv->data) { -+ if (unlikely(!priv->data)) { - wd_digest_free_sess(priv->sess); - return 0; - } -- memset(priv->data, 0, DIGEST_BLOCK_SIZE); - - priv->switch_threshold = sec_digest_get_sw_threshold(nid); - -@@ -546,7 +545,8 @@ static int digest_update_inner(EVP_MD_CTX *ctx, const void *data, size_t data_le - - while (priv->last_update_bufflen + left_len > DIGEST_BLOCK_SIZE) { - copy_to_bufflen = DIGEST_BLOCK_SIZE - priv->last_update_bufflen; -- memcpy(priv->data + priv->last_update_bufflen, tmpdata, copy_to_bufflen); -+ uadk_memcpy(priv->data + priv->last_update_bufflen, tmpdata, -+ copy_to_bufflen); - - priv->last_update_bufflen = DIGEST_BLOCK_SIZE; - priv->req.in_bytes = DIGEST_BLOCK_SIZE; -@@ -567,10 +567,9 @@ static int digest_update_inner(EVP_MD_CTX *ctx, const void *data, size_t data_le - } - - priv->last_update_bufflen = 0; -- memset(priv->data, 0, DIGEST_BLOCK_SIZE); - if (left_len <= DIGEST_BLOCK_SIZE) { - priv->last_update_bufflen = left_len; -- memcpy(priv->data, tmpdata, priv->last_update_bufflen); -+ uadk_memcpy(priv->data, tmpdata, priv->last_update_bufflen); - break; - } - } -@@ -604,7 +603,7 @@ static int uadk_e_digest_update(EVP_MD_CTX *ctx, const void *data, size_t data_l - goto soft_update; - - if (priv->last_update_bufflen + data_len <= DIGEST_BLOCK_SIZE) { -- memcpy(priv->data + priv->last_update_bufflen, data, data_len); -+ uadk_memcpy(priv->data + priv->last_update_bufflen, data, data_len); - priv->last_update_bufflen += data_len; - return 1; - } -@@ -697,7 +696,7 @@ static int uadk_e_digest_final(EVP_MD_CTX *ctx, unsigned char *digest) - priv->e_nid = EVP_MD_nid(EVP_MD_CTX_md(ctx)); - - ret = async_setup_async_event_notification(&op); -- if (!ret) { -+ if (unlikely(!ret)) { - fprintf(stderr, "failed to setup async event notification.\n"); - return 0; - } -diff --git a/src/uadk_utils.c b/src/uadk_utils.c -new file mode 100644 -index 0000000..2b34b3a ---- /dev/null -+++ b/src/uadk_utils.c -@@ -0,0 +1,63 @@ -+/* -+ * Copyright 2020-2022 Huawei Technologies Co.,Ltd. All rights reserved. -+ * -+ * Licensed under the Apache License, Version 2.0 (the "License"); -+ * you may not use this file except in compliance with the License. -+ * You may obtain a copy of the License at -+ * -+ * http://www.apache.org/licenses/LICENSE-2.0 -+ * -+ * Unless required by applicable law or agreed to in writing, software -+ * distributed under the License is distributed on an "AS IS" BASIS, -+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+ * See the License for the specific language governing permissions and -+ * limitations under the License. -+ * -+ */ -+#include "uadk_utils.h" -+ -+#define UADK_MEM_IMPROVE_THRESHOLD 1024 -+ -+static void *memcpy_large(void *dstpp, const void *srcpp, size_t len) -+{ -+ __asm__ __volatile__( -+ "add x4, %[src], %[count]\n\t" -+ "add x5, %[res], %[count]\n\t" -+ "ldr q0, [%[src]]\n\t" -+ "str q0, [%[res]]\n\t" -+ "sub %[count], %[count], 80\n\t" -+ "and x14, %[src], 15\n\t" -+ "bic %[src], %[src], 15\n\t" -+ "sub x3, %[res], x14\n\t" -+ "add %[count], %[count], x14\n\t" -+ -+ "1:\n\t" -+ "ldp q0, q1, [%[src], 16]\n\t" -+ "stp q0, q1, [x3, 16]\n\t" -+ "ldp q0, q1, [%[src], 48]\n\t" -+ "stp q0, q1, [x3, 48]\n\t" -+ "add %[src], %[src], 64\n\t" -+ "add x3, x3, 64\n\t" -+ "subs %[count], %[count], 64\n\t" -+ "b.hi 1b\n\t" -+ -+ "ldp q0, q1, [x4, -64]\n\t" -+ "stp q0, q1, [x5, -64]\n\t" -+ "ldp q0, q1, [x4, -32]\n\t" -+ "stp q0, q1, [x5, -32]\n\t" -+ -+ : [res] "+r"(dstpp) -+ : [src] "r"(srcpp), [count] "r"(len) -+ : "x3", "x4", "x5", "x14", "q0", "q1" -+ ); -+ -+ return dstpp; -+} -+ -+void *uadk_memcpy(void *dstpp, const void *srcpp, size_t len) -+{ -+ if (len >= UADK_MEM_IMPROVE_THRESHOLD) -+ return memcpy_large(dstpp, srcpp, len); -+ else -+ return memcpy(dstpp, srcpp, len); -+} -diff --git a/src/uadk_utils.h b/src/uadk_utils.h -new file mode 100644 -index 0000000..a16536b ---- /dev/null -+++ b/src/uadk_utils.h -@@ -0,0 +1,24 @@ -+/* -+ * Copyright 2020-2022 Huawei Technologies Co.,Ltd. All rights reserved. -+ * -+ * Licensed under the Apache License, Version 2.0 (the "License"); -+ * you may not use this file except in compliance with the License. -+ * You may obtain a copy of the License at -+ * -+ * http://www.apache.org/licenses/LICENSE-2.0 -+ * -+ * Unless required by applicable law or agreed to in writing, software -+ * distributed under the License is distributed on an "AS IS" BASIS, -+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+ * See the License for the specific language governing permissions and -+ * limitations under the License. -+ * -+ */ -+#ifndef UADK_UTILS -+#define UADK_UTILS -+#include -+#include -+#include -+ -+void *uadk_memcpy(void *dstpp, const void *srcpp, size_t len); -+#endif --- -2.24.4 - diff --git a/0034-cipher-support-the-sm4-ecb-alg.patch b/0034-cipher-support-the-sm4-ecb-alg.patch deleted file mode 100644 index 4bb58d1..0000000 --- a/0034-cipher-support-the-sm4-ecb-alg.patch +++ /dev/null @@ -1,90 +0,0 @@ -From 2dc0aa3a544afd4861656f4e876e287aa3ead9b9 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Tue, 8 Mar 2022 16:15:32 +0800 -Subject: [PATCH 34/36] cipher: support the sm4-ecb alg - -the uadk sdk layer has supported the sm4-ecb alg. Kunpeng 920 -supports the sm4-ecb by new chip fs. - -Signed-off-by: Kai Ye ---- - src/uadk_cipher.c | 15 ++++++++------- - src/v1/alg/ciphers/sec_ciphers.c | 1 + - 2 files changed, 9 insertions(+), 7 deletions(-) - -diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c -index 8f8af7e..e4595be 100644 ---- a/src/uadk_cipher.c -+++ b/src/uadk_cipher.c -@@ -87,6 +87,7 @@ static int cipher_920_nids[] = { - NID_sm4_cbc, - NID_des_ede3_cbc, - NID_des_ede3_ecb, -+ NID_sm4_ecb, - 0, - }; - -@@ -103,7 +104,6 @@ static int cipher_930_nids[] = { - NID_aes_128_xts, - NID_aes_256_xts, - NID_sm4_cbc, -- NID_sm4_ecb, - NID_des_ede3_cbc, - NID_des_ede3_ecb, - NID_aes_128_cfb128, -@@ -984,6 +984,11 @@ static int bind_v2_cipher(void) - sizeof(struct cipher_priv_ctx), uadk_e_cipher_init, - uadk_e_do_cipher, uadk_e_cipher_cleanup, - EVP_CIPHER_set_asn1_iv, EVP_CIPHER_get_asn1_iv); -+ UADK_CIPHER_DESCR(sm4_ecb, 16, 16, 16, EVP_CIPH_ECB_MODE, -+ sizeof(struct cipher_priv_ctx), uadk_e_cipher_init, -+ uadk_e_do_cipher, uadk_e_cipher_cleanup, -+ EVP_CIPHER_set_asn1_iv, EVP_CIPHER_get_asn1_iv); -+ - return 0; - } - -@@ -1037,10 +1042,6 @@ static int bind_v3_cipher(void) - sizeof(struct cipher_priv_ctx), uadk_e_cipher_init, - uadk_e_do_cipher, uadk_e_cipher_cleanup, - EVP_CIPHER_set_asn1_iv, EVP_CIPHER_get_asn1_iv); -- UADK_CIPHER_DESCR(sm4_ecb, 16, 16, 16, EVP_CIPH_ECB_MODE, -- sizeof(struct cipher_priv_ctx), uadk_e_cipher_init, -- uadk_e_do_cipher, uadk_e_cipher_cleanup, -- EVP_CIPHER_set_asn1_iv, EVP_CIPHER_get_asn1_iv); - - return 0; - } -@@ -1088,6 +1089,8 @@ static void destroy_v2_cipher(void) - uadk_des_ede3_cbc = 0; - EVP_CIPHER_meth_free(uadk_des_ede3_ecb); - uadk_des_ede3_ecb = 0; -+ EVP_CIPHER_meth_free(uadk_sm4_ecb); -+ uadk_sm4_ecb = 0; - } - - static void destroy_v3_cipher(void) -@@ -1116,8 +1119,6 @@ static void destroy_v3_cipher(void) - uadk_sm4_ofb128 = 0; - EVP_CIPHER_meth_free(uadk_sm4_ctr); - uadk_sm4_ctr = 0; -- EVP_CIPHER_meth_free(uadk_sm4_ecb); -- uadk_sm4_ecb = 0; - } - - void uadk_e_destroy_cipher(void) -diff --git a/src/v1/alg/ciphers/sec_ciphers.c b/src/v1/alg/ciphers/sec_ciphers.c -index 2c619be..b4743ed 100644 ---- a/src/v1/alg/ciphers/sec_ciphers.c -+++ b/src/v1/alg/ciphers/sec_ciphers.c -@@ -85,6 +85,7 @@ static int g_known_cipher_nids[CIPHERS_COUNT] = { - NID_sm4_ctr, - NID_sm4_cbc, - NID_sm4_ofb128, -+ NID_sm4_ecb, - }; - - #define SEC_CIPHERS_RETURN_FAIL_IF(cond, mesg, ret) \ --- -2.24.4 - diff --git a/0035-cipher-fix-segmentation-fault-for-uadk_e_ctx_init.patch b/0035-cipher-fix-segmentation-fault-for-uadk_e_ctx_init.patch deleted file mode 100644 index d23b512..0000000 --- a/0035-cipher-fix-segmentation-fault-for-uadk_e_ctx_init.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 1ff08b383a59150a193870b3150d5265a03864ed Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 10 Mar 2022 20:03:20 +0800 -Subject: [PATCH 35/36] cipher: fix segmentation fault for uadk_e_ctx_init - -if uadk_e_init_cipher failed, there is no need to -alloc cipher session, and alloc session will meet -a segmentation fault because sched_init is not -set by wd_cipher_init. - -Signed-off-by: Wenkai Lin ---- - src/uadk_cipher.c | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - -diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c -index e4595be..d6dd8e8 100644 ---- a/src/uadk_cipher.c -+++ b/src/uadk_cipher.c -@@ -846,15 +846,16 @@ static void uadk_e_ctx_init(EVP_CIPHER_CTX *ctx, struct cipher_priv_ctx *priv) - struct sched_params params = {0}; - int ret; - -+ priv->req.iv_bytes = EVP_CIPHER_CTX_iv_length(ctx); -+ priv->req.iv = priv->iv; -+ - ret = uadk_e_init_cipher(); - if (unlikely(!ret)) { - priv->switch_flag = UADK_DO_SOFT; - fprintf(stderr, "uadk failed to init cipher HW!\n"); -+ return; - } - -- priv->req.iv_bytes = EVP_CIPHER_CTX_iv_length(ctx); -- priv->req.iv = priv->iv; -- - /* - * The internal RR scheduler used by environment variables, - * the cipher algorithm does not distinguish between --- -2.24.4 - diff --git a/0036-cipher-sm4-ecb-algorithm-is-deleted-by-mistake.patch b/0036-cipher-sm4-ecb-algorithm-is-deleted-by-mistake.patch deleted file mode 100644 index 0fb5eb4..0000000 --- a/0036-cipher-sm4-ecb-algorithm-is-deleted-by-mistake.patch +++ /dev/null @@ -1,28 +0,0 @@ -From cf720869f7637e41ff1094d8bc640180fca55f75 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Tue, 15 Mar 2022 17:07:59 +0800 -Subject: [PATCH 36/36] cipher: sm4-ecb algorithm is deleted by mistake - -Because sm4-ecb alg is deleted by mistake. So this alg -not be found in hardware V3. - -Signed-off-by: Kai Ye ---- - src/uadk_cipher.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c -index d6dd8e8..5ebad64 100644 ---- a/src/uadk_cipher.c -+++ b/src/uadk_cipher.c -@@ -104,6 +104,7 @@ static int cipher_930_nids[] = { - NID_aes_128_xts, - NID_aes_256_xts, - NID_sm4_cbc, -+ NID_sm4_ecb, - NID_des_ede3_cbc, - NID_des_ede3_ecb, - NID_aes_128_cfb128, --- -2.24.4 - diff --git a/0037-rsa-bugfix-about-redundant-and-inefficient-operation.patch b/0037-rsa-bugfix-about-redundant-and-inefficient-operation.patch deleted file mode 100644 index f529217..0000000 --- a/0037-rsa-bugfix-about-redundant-and-inefficient-operation.patch +++ /dev/null @@ -1,694 +0,0 @@ -From 50692e4bc425c5709a468946cb56ad483be90f7c Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Fri, 18 Mar 2022 23:25:47 +0800 -Subject: [PATCH 37/37] rsa: bugfix about redundant and inefficient operations - -Includes: -1. Remove redundant judgment conditions. -2. Remove redundant function parameters. -3. Remove the redundant operation in soft RSA keygen method. -4. Use more efficient BN memory allocation method, and add -judgment of the results. - -Signed-off-by: Zhiqi Song ---- - src/uadk_rsa.c | 331 ++++++++++++++++++++++--------------------------- - 1 file changed, 148 insertions(+), 183 deletions(-) - -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index 1488b98..821cb78 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -143,7 +143,7 @@ enum { - - static int rsa_check_bit_useful(const int bits, int flen) - { -- if (!flen && flen > bits) -+ if (flen > bits) - return SOFT; - - if (bits < RSA_MIN_MODULUS_BITS) -@@ -411,8 +411,8 @@ static int get_rsa_prime_param(struct rsa_prime_param *param, BN_CTX *ctx) - return UADK_E_SUCCESS; - - end: -- fprintf(stderr, "failed to malloc params\n"); -- return UADK_E_FAIL; -+ fprintf(stderr, "failed to allocate rsa prime params\n"); -+ return -ENOMEM; - } - - static int rsa_primes_gen(int bits, BIGNUM *e_pub, BIGNUM *p, -@@ -433,13 +433,11 @@ static int rsa_primes_gen(int bits, BIGNUM *e_pub, BIGNUM *p, - - BN_CTX_start(ctx); - param = OPENSSL_zalloc(sizeof(struct rsa_prime_param)); -- if (!param) { -- fprintf(stderr, "failed to malloc rsa prime param\n"); -+ if (!param) - goto free_ctx; -- } - - ret = get_rsa_prime_param(param, ctx); -- if (!ret) -+ if (ret != UADK_E_SUCCESS) - goto free_param; - - /* Divide bits into 'primes' pieces evenly */ -@@ -624,9 +622,10 @@ static int rsa_get_sign_res(int padding, BIGNUM *to_bn, const BIGNUM *n, - return UADK_E_SUCCESS; - } - --static int rsa_get_verify_res(int padding, BIGNUM *to_bn, const BIGNUM *n, -- BIGNUM *ret_bn) -+static int rsa_get_verify_res(int padding, const BIGNUM *n, BIGNUM *ret_bn) - { -+ BIGNUM *to_bn = NULL; -+ - if ((padding == RSA_X931_PADDING) && ((bn_get_words(ret_bn)[0] & 0xf) - != 0x0c)) { - if (!BN_sub(to_bn, n, ret_bn)) -@@ -840,6 +839,7 @@ static struct uadk_rsa_sess *rsa_new_eng_session(RSA *rsa) - rsa_sess = OPENSSL_malloc(sizeof(struct uadk_rsa_sess)); - if (!rsa_sess) - return NULL; -+ - memset(rsa_sess, 0, sizeof(struct uadk_rsa_sess)); - rsa_sess->alg = rsa; - rsa_sess->is_prikey_ready = UN_SET; -@@ -971,23 +971,44 @@ static int rsa_get_keygen_param(struct wd_rsa_req *req, - struct rsa_keygen_param_bn *bn_param) - { - struct wd_rsa_kg_out *out = (struct wd_rsa_kg_out *)req->dst; -+ struct wd_dtb wd_d, wd_n, wd_qinv, wd_dq, wd_dp; -+ BIGNUM *dmp1, *dmq1, *iqmp, *n, *d; - unsigned int key_bits, key_size; -- BIGNUM *dmp1 = BN_new(); -- BIGNUM *dmq1 = BN_new(); -- BIGNUM *iqmp = BN_new(); -- BIGNUM *n = BN_new(); -- BIGNUM *d = BN_new(); -- struct wd_dtb wd_d; -- struct wd_dtb wd_n; -- struct wd_dtb wd_qinv; -- struct wd_dtb wd_dq; -- struct wd_dtb wd_dp; -+ BN_CTX *bn_ctx; - - key_bits = wd_rsa_get_key_bits(ctx); -+ if (!key_bits) -+ return UADK_E_FAIL; -+ - key_size = key_bits >> BIT_BYTES_SHIFT; - wd_rsa_get_kg_out_params(out, &wd_d, &wd_n); - wd_rsa_get_kg_out_crt_params(out, &wd_qinv, &wd_dq, &wd_dp); - -+ bn_ctx = BN_CTX_new(); -+ if (!bn_ctx) -+ return UADK_E_FAIL; -+ -+ BN_CTX_start(bn_ctx); -+ dmp1 = BN_CTX_get(bn_ctx); -+ if (!dmp1) -+ goto free_bn_ctx; -+ -+ dmq1 = BN_CTX_get(bn_ctx); -+ if (!dmq1) -+ goto free_bn_ctx; -+ -+ iqmp = BN_CTX_get(bn_ctx); -+ if (!iqmp) -+ goto free_bn_ctx; -+ -+ n = BN_CTX_get(bn_ctx); -+ if (!n) -+ goto free_bn_ctx; -+ -+ d = BN_CTX_get(bn_ctx); -+ if (!d) -+ goto free_bn_ctx; -+ - BN_bin2bn((unsigned char *)wd_d.data, key_size, d); - BN_bin2bn((unsigned char *)wd_n.data, key_size, n); - BN_bin2bn((unsigned char *)wd_qinv.data, wd_qinv.dsize, iqmp); -@@ -997,16 +1018,13 @@ static int rsa_get_keygen_param(struct wd_rsa_req *req, - if (!(RSA_set0_key(rsa, n, bn_param->e, d) && - RSA_set0_factors(rsa, bn_param->p, bn_param->q) && - RSA_set0_crt_params(rsa, dmp1, dmq1, iqmp))) -- goto bn_free; -+ goto free_bn_ctx; - - return UADK_E_SUCCESS; - --bn_free: -- BN_clear_free(dmp1); -- BN_clear_free(dmq1); -- BN_clear_free(iqmp); -- BN_clear_free(n); -- BN_clear_free(d); -+free_bn_ctx: -+ BN_CTX_end(bn_ctx); -+ BN_CTX_free(bn_ctx); - - return UADK_E_FAIL; - } -@@ -1093,20 +1111,11 @@ err: - - static int uadk_e_soft_rsa_keygen(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb) - { -- const RSA_METHOD *default_meth = RSA_PKCS1_OpenSSL(); - int ret; - -- if (!default_meth) { -- fprintf(stderr, "failed to get soft method.\n"); -- return UADK_E_FAIL; -- } -- - UNUSED(cb); -- RSA_set_method(rsa, default_meth); - ret = RSA_generate_key_ex(rsa, bits, e, NULL); - -- RSA_set_method(rsa, rsa_hw_meth); -- - return ret; - } - -@@ -1131,7 +1140,7 @@ static int rsa_fill_keygen_data(struct uadk_rsa_sess *rsa_sess, - return UADK_E_FAIL; - - wd_rsa_get_crt_prikey_params(key_pair->prikey, NULL, NULL, NULL, -- &keygen_param->wd_q, &keygen_param->wd_p); -+ &keygen_param->wd_q, &keygen_param->wd_p); - if (!keygen_param->wd_q || !keygen_param->wd_p) - return UADK_E_FAIL; - -@@ -1170,9 +1179,11 @@ static int rsa_keygen_param_alloc(struct rsa_keygen_param **keygen_param, - struct rsa_keygen_param_bn **keygen_bn_param, - struct rsa_keypair **key_pair) - { -+ BN_CTX *bn_ctx; -+ - *keygen_param = OPENSSL_malloc(sizeof(struct rsa_keygen_param)); - if (!(*keygen_param)) -- return -ENOMEM; -+ goto err; - - *keygen_bn_param = (struct rsa_keygen_param_bn *) - OPENSSL_malloc(sizeof(struct rsa_keygen_param_bn)); -@@ -1183,16 +1194,35 @@ static int rsa_keygen_param_alloc(struct rsa_keygen_param **keygen_param, - if (!(*key_pair)) - goto free_keygen_bn_param; - -- (*keygen_bn_param)->e = BN_new(); -- (*keygen_bn_param)->p = BN_new(); -- (*keygen_bn_param)->q = BN_new(); -+ bn_ctx = BN_CTX_new(); -+ if (!bn_ctx) -+ goto free_key_pair; -+ -+ BN_CTX_start(bn_ctx); -+ (*keygen_bn_param)->e = BN_CTX_get(bn_ctx); -+ if (!(*keygen_bn_param)->e) -+ goto free_bn_ctx; -+ -+ (*keygen_bn_param)->p = BN_CTX_get(bn_ctx); -+ if (!(*keygen_bn_param)->p) -+ goto free_bn_ctx; -+ -+ (*keygen_bn_param)->q = BN_CTX_get(bn_ctx); -+ if (!(*keygen_bn_param)->q) -+ goto free_bn_ctx; - - return UADK_E_SUCCESS; - -+free_bn_ctx: -+ BN_CTX_end(bn_ctx); -+ BN_CTX_free(bn_ctx); -+free_key_pair: -+ OPENSSL_free(*key_pair); - free_keygen_bn_param: - OPENSSL_free(*keygen_bn_param); - free_keygen_param: - OPENSSL_free(*keygen_param); -+err: - return -ENOMEM; - } - -@@ -1236,81 +1266,56 @@ static void rsa_pkey_param_free(struct rsa_pubkey_param **pub, - } - - static int rsa_create_pub_bn_ctx(RSA *rsa, struct rsa_pubkey_param *pub, -- BN_CTX **bn_ctx, unsigned char **from_buf) -+ unsigned char **from_buf, int *num_bytes) - { -- BIGNUM *ret_bn; -- int num_bytes; -- - RSA_get0_key(rsa, &pub->n, &pub->e, NULL); -- -- *bn_ctx = BN_CTX_new(); -- if (!(*bn_ctx)) -+ if (!(pub->n) || !(pub->e)) - return UADK_E_FAIL; - -- BN_CTX_start(*bn_ctx); -- ret_bn = BN_CTX_get(*bn_ctx); -- if (!ret_bn) -- goto err; -- -- num_bytes = BN_num_bytes(pub->n); -- if (!num_bytes) -- goto err; -+ *num_bytes = BN_num_bytes(pub->n); -+ if (!(*num_bytes)) -+ return UADK_E_FAIL; - -- *from_buf = OPENSSL_malloc(num_bytes); -+ *from_buf = OPENSSL_malloc(*num_bytes); - if (!(*from_buf)) -- goto err; -+ return -ENOMEM; - - return UADK_E_SUCCESS; -- --err: -- BN_CTX_free(*bn_ctx); -- return UADK_E_FAIL; - } - --static void rsa_free_pub_bn_ctx(BN_CTX **bn_ctx, unsigned char **from_buf) -+static void rsa_free_pub_bn_ctx(unsigned char **from_buf) - { -- BN_CTX_free(*bn_ctx); -- - OPENSSL_free(*from_buf); - } - - static int rsa_create_pri_bn_ctx(RSA *rsa, struct rsa_prikey_param *pri, -- BN_CTX **bn_ctx, unsigned char **from_buf) -+ unsigned char **from_buf, int *num_bytes) - { -- BIGNUM *ret_bn; -- int num_bytes; -- - RSA_get0_key(rsa, &pri->n, &pri->e, &pri->d); -- RSA_get0_factors(rsa, &pri->p, &pri->q); -- RSA_get0_crt_params(rsa, &pri->dmp1, &pri->dmq1, &pri->iqmp); -+ if (!(pri->n) || !(pri->e) || !(pri->d)) -+ return UADK_E_FAIL; - -- *bn_ctx = BN_CTX_new(); -- if (!(*bn_ctx)) -+ RSA_get0_factors(rsa, &pri->p, &pri->q); -+ if (!(pri->p) || !(pri->q)) - return UADK_E_FAIL; - -- BN_CTX_start(*bn_ctx); -- ret_bn = BN_CTX_get(*bn_ctx); -- if (!ret_bn) -- goto err; -+ RSA_get0_crt_params(rsa, &pri->dmp1, &pri->dmq1, &pri->iqmp); -+ if (!(pri->dmp1) || !(pri->dmq1) || !(pri->iqmp)) -+ return UADK_E_FAIL; - -- num_bytes = BN_num_bytes(pri->n); -- if (!num_bytes) -- goto err; -+ *num_bytes = BN_num_bytes(pri->n); -+ if (!(*num_bytes)) -+ return UADK_E_FAIL; - -- *from_buf = OPENSSL_malloc(num_bytes); -+ *from_buf = OPENSSL_malloc(*num_bytes); - if (!(*from_buf)) -- goto err; -+ return -ENOMEM; - - return UADK_E_SUCCESS; --err: -- BN_CTX_free(*bn_ctx); -- return UADK_E_FAIL; - } - --static void rsa_free_pri_bn_ctx(BN_CTX **bn_ctx, unsigned char **from_buf) -+static void rsa_free_pri_bn_ctx(unsigned char **from_buf) - { -- BN_CTX_free(*bn_ctx); -- - OPENSSL_free(*from_buf); - } - -@@ -1318,14 +1323,13 @@ static int uadk_e_rsa_keygen(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb) - { - struct rsa_keygen_param *keygen_param = NULL; - struct rsa_keygen_param_bn *bn_param = NULL; -+ struct uadk_rsa_sess *rsa_sess = NULL; - struct rsa_keypair *key_pair = NULL; -- struct uadk_rsa_sess *rsa_sess; - int is_crt = 1; -- int key_size; - int ret; - -- key_size = rsa_check_bit_useful(bits, 0); -- if (!key_size || key_size == SOFT) -+ ret = rsa_check_bit_useful(bits, 0); -+ if (!ret || ret == SOFT) - goto exe_soft; - - ret = uadk_e_rsa_init(); -@@ -1388,14 +1392,11 @@ exe_soft: - static int uadk_e_rsa_public_encrypt(int flen, const unsigned char *from, - unsigned char *to, RSA *rsa, int padding) - { -+ struct uadk_rsa_sess *rsa_sess = NULL; - struct rsa_pubkey_param *pub = NULL; -- struct uadk_rsa_sess *rsa_sess; - unsigned char *from_buf = NULL; -+ int num_bytes, is_crt, ret; - BIGNUM *ret_bn = NULL; -- BN_CTX *bn_ctx = NULL; -- int num_bytes; -- int is_crt; -- int ret; - - ret = check_rsa_input_para(flen, from, to, rsa); - if (!ret || ret == SOFT) -@@ -1417,18 +1418,12 @@ static int uadk_e_rsa_public_encrypt(int flen, const unsigned char *from, - goto free_pkey; - } - -- ret = rsa_create_pub_bn_ctx(rsa, pub, &bn_ctx, &from_buf); -- if (!ret) { -+ ret = rsa_create_pub_bn_ctx(rsa, pub, &from_buf, &num_bytes); -+ if (ret <= 0 || flen > num_bytes) { - ret = UADK_DO_SOFT; - goto free_sess; - } - -- num_bytes = BN_num_bytes(pub->n); -- if (flen > num_bytes) { -- ret = UADK_DO_SOFT; -- goto free_buf; -- } -- - ret = add_rsa_pubenc_padding(flen, from, from_buf, num_bytes, padding); - if (!ret) { - ret = UADK_DO_SOFT; -@@ -1448,7 +1443,7 @@ static int uadk_e_rsa_public_encrypt(int flen, const unsigned char *from, - } - - ret_bn = BN_bin2bn((const unsigned char *)rsa_sess->req.dst, -- rsa_sess->req.dst_bytes, ret_bn); -+ rsa_sess->req.dst_bytes, NULL); - if (!ret_bn) { - ret = UADK_DO_SOFT; - goto free_buf; -@@ -1457,11 +1452,13 @@ static int uadk_e_rsa_public_encrypt(int flen, const unsigned char *from, - ret = BN_bn2binpad(ret_bn, to, num_bytes); - if (ret == -1) { - ret = UADK_DO_SOFT; -- goto free_buf; -+ goto free_bn; - } - -+free_bn: -+ BN_free(ret_bn); - free_buf: -- rsa_free_pub_bn_ctx(&bn_ctx, &from_buf); -+ rsa_free_pub_bn_ctx(&from_buf); - free_sess: - rsa_free_eng_session(rsa_sess); - free_pkey: -@@ -1480,11 +1477,8 @@ static int uadk_e_rsa_private_decrypt(int flen, const unsigned char *from, - struct rsa_prikey_param *pri = NULL; - unsigned char *from_buf = NULL; - struct uadk_rsa_sess *rsa_sess; -+ int num_bytes, len, ret; - BIGNUM *ret_bn = NULL; -- BN_CTX *bn_ctx = NULL; -- int num_bytes; -- int ret; -- int len; - - ret = check_rsa_input_para(flen, from, to, rsa); - if (!ret || ret == SOFT) -@@ -1506,18 +1500,12 @@ static int uadk_e_rsa_private_decrypt(int flen, const unsigned char *from, - goto free_pkey; - } - -- ret = rsa_create_pri_bn_ctx(rsa, pri, &bn_ctx, &from_buf); -- if (!ret) { -+ ret = rsa_create_pri_bn_ctx(rsa, pri, &from_buf, &num_bytes); -+ if (ret <= 0 || flen > num_bytes) { - ret = UADK_DO_SOFT; - goto free_sess; - } - -- num_bytes = BN_num_bytes(pri->n); -- if (flen > num_bytes) { -- ret = UADK_DO_SOFT; -- goto free_buf; -- } -- - ret = rsa_fill_prikey(rsa, rsa_sess, pri, from_buf, to); - if (!ret) { - ret = UADK_DO_SOFT; -@@ -1533,7 +1521,7 @@ static int uadk_e_rsa_private_decrypt(int flen, const unsigned char *from, - } - - ret_bn = BN_bin2bn((const unsigned char *)rsa_sess->req.dst, -- rsa_sess->req.dst_bytes, ret_bn); -+ rsa_sess->req.dst_bytes, NULL); - if (!ret_bn) { - ret = UADK_DO_SOFT; - goto free_buf; -@@ -1542,17 +1530,19 @@ static int uadk_e_rsa_private_decrypt(int flen, const unsigned char *from, - len = BN_bn2binpad(ret_bn, from_buf, num_bytes); - if (!len) { - ret = UADK_DO_SOFT; -- goto free_buf; -+ goto free_bn; - } - - ret = check_rsa_pridec_padding(to, num_bytes, from_buf, len, padding); - if (!ret) { - ret = UADK_DO_SOFT; -- goto free_buf; -+ goto free_bn; - } - -+free_bn: -+ BN_free(ret_bn); - free_buf: -- rsa_free_pri_bn_ctx(&bn_ctx, &from_buf); -+ rsa_free_pri_bn_ctx(&from_buf); - free_sess: - rsa_free_eng_session(rsa_sess); - free_pkey: -@@ -1568,14 +1558,13 @@ exe_soft: - static int uadk_e_rsa_private_sign(int flen, const unsigned char *from, - unsigned char *to, RSA *rsa, int padding) - { -+ struct uadk_rsa_sess *rsa_sess = NULL; - struct rsa_prikey_param *pri = NULL; -- struct uadk_rsa_sess *rsa_sess; - unsigned char *from_buf = NULL; -- BIGNUM *to_bn, *ret_bn; -- BN_CTX *bn_ctx = NULL; -+ BIGNUM *ret_bn = NULL; -+ BIGNUM *to_bn = NULL; - BIGNUM *res = NULL; -- int num_bytes; -- int ret; -+ int num_bytes, ret; - - ret = check_rsa_input_para(flen, from, to, rsa); - if (!ret || ret == SOFT) -@@ -1597,36 +1586,18 @@ static int uadk_e_rsa_private_sign(int flen, const unsigned char *from, - goto free_pkey; - } - -- ret = rsa_create_pri_bn_ctx(rsa, pri, &bn_ctx, &from_buf); -- if (!ret) { -+ ret = rsa_create_pri_bn_ctx(rsa, pri, &from_buf, &num_bytes); -+ if (ret <= 0 || flen > num_bytes) { - ret = UADK_DO_SOFT; - goto free_sess; - } - -- to_bn = BN_CTX_get(bn_ctx); -- if (!to_bn) { -- ret = UADK_DO_SOFT; -- goto free_buf; -- } -- -- num_bytes = BN_num_bytes(pri->n); -- if (flen > num_bytes) { -- ret = UADK_DO_SOFT; -- goto free_buf; -- } -- - ret = add_rsa_prienc_padding(flen, from, from_buf, num_bytes, padding); - if (!ret) { - ret = UADK_DO_SOFT; - goto free_buf; - } - -- ret_bn = BN_bin2bn(from_buf, num_bytes, to_bn); -- if (!ret_bn) { -- ret = UADK_DO_SOFT; -- goto free_buf; -- } -- - ret = rsa_fill_prikey(rsa, rsa_sess, pri, from_buf, to); - if (!ret) { - ret = UADK_DO_SOFT; -@@ -1639,24 +1610,33 @@ static int uadk_e_rsa_private_sign(int flen, const unsigned char *from, - goto free_buf; - } - -- ret_bn = NULL; - ret_bn = BN_bin2bn((const unsigned char *)rsa_sess->req.dst, -- rsa_sess->req.dst_bytes, ret_bn); -+ rsa_sess->req.dst_bytes, NULL); - if (!ret_bn) { - ret = UADK_DO_SOFT; - goto free_buf; - } - -+ to_bn = BN_bin2bn(from_buf, num_bytes, NULL); -+ if (!to_bn) { -+ ret = UADK_DO_SOFT; -+ goto free_ret_bn; -+ } -+ - ret = rsa_get_sign_res(padding, to_bn, pri->n, ret_bn, &res); - if (!ret) { - ret = UADK_DO_SOFT; -- goto free_buf; -+ goto free_to_bn; - } - - ret = BN_bn2binpad(res, to, num_bytes); - -+free_to_bn: -+ BN_free(to_bn); -+free_ret_bn: -+ BN_free(ret_bn); - free_buf: -- rsa_free_pri_bn_ctx(&bn_ctx, &from_buf); -+ rsa_free_pri_bn_ctx(&from_buf); - free_sess: - rsa_free_eng_session(rsa_sess); - free_pkey: -@@ -1672,15 +1652,11 @@ exe_soft: - static int uadk_e_rsa_public_verify(int flen, const unsigned char *from, - unsigned char *to, RSA *rsa, int padding) - { -- struct uadk_rsa_sess *rsa_sess; -+ struct uadk_rsa_sess *rsa_sess = NULL; -+ struct rsa_pubkey_param *pub = NULL; -+ int num_bytes, is_crt, len, ret; - unsigned char *from_buf = NULL; -- struct rsa_pubkey_param *pub; -- BIGNUM *ret_bn, *to_bn; -- BN_CTX *bn_ctx = NULL; -- int num_bytes; -- int is_crt; -- int ret; -- int len; -+ BIGNUM *ret_bn = NULL; - - ret = check_rsa_input_para(flen, from, to, rsa); - if (!ret) -@@ -1704,25 +1680,12 @@ static int uadk_e_rsa_public_verify(int flen, const unsigned char *from, - goto free_pkey; - } - -- ret = rsa_create_pub_bn_ctx(rsa, pub, &bn_ctx, &from_buf); -- if (!ret) { -+ ret = rsa_create_pub_bn_ctx(rsa, pub, &from_buf, &num_bytes); -+ if (ret <= 0 || flen > num_bytes) { - ret = UADK_DO_SOFT; - goto free_sess; - } - -- to_bn = BN_CTX_get(bn_ctx); -- if (!to_bn) { -- ret = UADK_DO_SOFT; -- goto free_buf; -- } -- -- num_bytes = BN_num_bytes(pub->n); -- ret_bn = BN_bin2bn(from_buf, num_bytes, to_bn); -- if (!ret_bn) { -- ret = UADK_DO_SOFT; -- goto free_buf; -- } -- - ret = rsa_fill_pubkey(pub, rsa_sess, from_buf, to); - if (!ret) { - ret = UADK_DO_SOFT; -@@ -1736,34 +1699,35 @@ static int uadk_e_rsa_public_verify(int flen, const unsigned char *from, - goto free_buf; - } - -- ret_bn = NULL; - ret_bn = BN_bin2bn((const unsigned char *)rsa_sess->req.dst, -- rsa_sess->req.dst_bytes, ret_bn); -+ rsa_sess->req.dst_bytes, NULL); - if (!ret_bn) { - ret = UADK_DO_SOFT; - goto free_buf; - } - -- ret = rsa_get_verify_res(padding, to_bn, pub->n, ret_bn); -+ ret = rsa_get_verify_res(padding, pub->n, ret_bn); - if (!ret) { - ret = UADK_DO_SOFT; -- goto free_buf; -+ goto free_bn; - } - - len = BN_bn2binpad(ret_bn, from_buf, num_bytes); - if (!len) { - ret = UADK_DO_SOFT; -- goto free_buf; -+ goto free_bn; - } - - ret = check_rsa_pubdec_padding(to, num_bytes, from_buf, len, padding); - if (!ret) { - ret = UADK_DO_SOFT; -- goto free_buf; -+ goto free_bn; - } - -+free_bn: -+ BN_free(ret_bn); - free_buf: -- rsa_free_pub_bn_ctx(&bn_ctx, &from_buf); -+ rsa_free_pub_bn_ctx(&from_buf); - free_sess: - rsa_free_eng_session(rsa_sess); - free_pkey: -@@ -1786,7 +1750,7 @@ static RSA_METHOD *uadk_e_get_rsa_sw_methods(void) - (void)RSA_meth_set_priv_enc(rsa_sw_meth, RSA_meth_get_priv_enc(meth)); - (void)RSA_meth_set_pub_dec(rsa_sw_meth, RSA_meth_get_pub_dec(meth)); - (void)RSA_meth_set_priv_dec(rsa_sw_meth, RSA_meth_get_priv_dec(meth)); -- (void)RSA_meth_set_keygen(rsa_sw_meth, RSA_meth_get_keygen(meth)); -+ (void)RSA_meth_set_keygen(rsa_sw_meth, uadk_e_soft_rsa_keygen); - (void)RSA_meth_set_mod_exp(rsa_sw_meth, RSA_meth_get_mod_exp(meth)); - (void)RSA_meth_set_bn_mod_exp(rsa_sw_meth, - RSA_meth_get_bn_mod_exp(meth)); -@@ -1798,6 +1762,7 @@ static RSA_METHOD *uadk_e_get_rsa_hw_methods(void) - { - if (rsa_hw_meth) - return rsa_hw_meth; -+ - rsa_hw_meth = RSA_meth_new("uadk hardware rsa method", 0); - if (!rsa_hw_meth) { - fprintf(stderr, "failed to allocate rsa hardware method\n"); --- -2.24.4 - diff --git a/0038-uadk-engine-change-Copyright-to-2022.patch b/0038-uadk-engine-change-Copyright-to-2022.patch deleted file mode 100644 index 2b07c14..0000000 --- a/0038-uadk-engine-change-Copyright-to-2022.patch +++ /dev/null @@ -1,177 +0,0 @@ -From 1b8b65e31da0c6347575d0d201c8417241e81453 Mon Sep 17 00:00:00 2001 -From: Zhangfei Gao -Date: Mon, 28 Mar 2022 02:31:53 +0000 -Subject: [PATCH 38/57] uadk-engine: change Copyright to 2022 - -Change Copyright to 2022 -Add Linaro Copyright as well - -Signed-off-by: Zhangfei Gao ---- - src/e_uadk.c | 3 ++- - src/uadk.h | 3 ++- - src/uadk_async.c | 3 ++- - src/uadk_async.h | 3 ++- - src/uadk_cipher.c | 3 ++- - src/uadk_dh.c | 2 +- - src/uadk_digest.c | 3 ++- - src/uadk_ec.c | 2 +- - src/uadk_ecx.c | 2 +- - src/uadk_pkey.c | 2 +- - src/uadk_pkey.h | 2 +- - src/uadk_rsa.c | 2 +- - src/uadk_sm2.c | 2 +- - 13 files changed, 19 insertions(+), 13 deletions(-) - -diff --git a/src/e_uadk.c b/src/e_uadk.c -index 79ecef8..4288569 100644 ---- a/src/e_uadk.c -+++ b/src/e_uadk.c -@@ -1,5 +1,6 @@ - /* -- * Copyright 2020-2021 Huawei Technologies Co.,Ltd. All rights reserved. -+ * Copyright 2020-2022 Huawei Technologies Co.,Ltd. All rights reserved. -+ * Copyright 2020-2022 Linaro ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. -diff --git a/src/uadk.h b/src/uadk.h -index 384e035..ef09274 100644 ---- a/src/uadk.h -+++ b/src/uadk.h -@@ -1,5 +1,6 @@ - /* -- * Copyright 2020-2021 Huawei Technologies Co.,Ltd. All rights reserved. -+ * Copyright 2020-2022 Huawei Technologies Co.,Ltd. All rights reserved. -+ * Copyright 2020-2022 Linaro ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. -diff --git a/src/uadk_async.c b/src/uadk_async.c -index c98153b..11d624c 100644 ---- a/src/uadk_async.c -+++ b/src/uadk_async.c -@@ -1,5 +1,6 @@ - /* -- * Copyright 2020-2021 Huawei Technologies Co.,Ltd. All rights reserved. -+ * Copyright 2020-2022 Huawei Technologies Co.,Ltd. All rights reserved. -+ * Copyright 2020-2022 Linaro ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. -diff --git a/src/uadk_async.h b/src/uadk_async.h -index 9836dbb..d2a7e16 100644 ---- a/src/uadk_async.h -+++ b/src/uadk_async.h -@@ -1,5 +1,6 @@ - /* -- * Copyright 2020-2021 Huawei Technologies Co.,Ltd. All rights reserved. -+ * Copyright 2020-2022 Huawei Technologies Co.,Ltd. All rights reserved. -+ * Copyright 2020-2022 Linaro ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. -diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c -index 5ebad64..91895cc 100644 ---- a/src/uadk_cipher.c -+++ b/src/uadk_cipher.c -@@ -1,5 +1,6 @@ - /* -- * Copyright 2020-2021 Huawei Technologies Co.,Ltd. All rights reserved. -+ * Copyright 2020-2022 Huawei Technologies Co.,Ltd. All rights reserved. -+ * Copyright 2020-2022 Linaro ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. -diff --git a/src/uadk_dh.c b/src/uadk_dh.c -index 40fb583..3882306 100644 ---- a/src/uadk_dh.c -+++ b/src/uadk_dh.c -@@ -1,5 +1,5 @@ - /* -- * Copyright 2020-2021 Huawei Technologies Co.,Ltd. All rights reserved. -+ * Copyright 2020-2022 Huawei Technologies Co.,Ltd. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. -diff --git a/src/uadk_digest.c b/src/uadk_digest.c -index 355917d..ecc0ce6 100644 ---- a/src/uadk_digest.c -+++ b/src/uadk_digest.c -@@ -1,5 +1,6 @@ - /* -- * Copyright 2020-2021 Huawei Technologies Co.,Ltd. All rights reserved. -+ * Copyright 2020-2022 Huawei Technologies Co.,Ltd. All rights reserved. -+ * Copyright 2020-2022 Linaro ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. -diff --git a/src/uadk_ec.c b/src/uadk_ec.c -index db69871..e219bdf 100644 ---- a/src/uadk_ec.c -+++ b/src/uadk_ec.c -@@ -1,5 +1,5 @@ - /* -- * Copyright 2020-2021 Huawei Technologies Co.,Ltd. All rights reserved. -+ * Copyright 2020-2022 Huawei Technologies Co.,Ltd. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. -diff --git a/src/uadk_ecx.c b/src/uadk_ecx.c -index 67f9350..5d0ff76 100644 ---- a/src/uadk_ecx.c -+++ b/src/uadk_ecx.c -@@ -1,5 +1,5 @@ - /* -- * Copyright 2020-2021 Huawei Technologies Co.,Ltd. All rights reserved. -+ * Copyright 2020-2022 Huawei Technologies Co.,Ltd. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. -diff --git a/src/uadk_pkey.c b/src/uadk_pkey.c -index f27e2f5..d4ec30e 100644 ---- a/src/uadk_pkey.c -+++ b/src/uadk_pkey.c -@@ -1,5 +1,5 @@ - /* -- * Copyright 2020-2021 Huawei Technologies Co.,Ltd. All rights reserved. -+ * Copyright 2020-2022 Huawei Technologies Co.,Ltd. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. -diff --git a/src/uadk_pkey.h b/src/uadk_pkey.h -index dfe6fbe..b30c2de 100644 ---- a/src/uadk_pkey.h -+++ b/src/uadk_pkey.h -@@ -1,5 +1,5 @@ - /* -- * Copyright 2020-2021 Huawei Technologies Co.,Ltd. All rights reserved. -+ * Copyright 2020-2022 Huawei Technologies Co.,Ltd. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index 821cb78..a80d203 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -1,5 +1,5 @@ - /* -- * Copyright 2020-2021 Huawei Technologies Co.,Ltd. All rights reserved. -+ * Copyright 2020-2022 Huawei Technologies Co.,Ltd. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. -diff --git a/src/uadk_sm2.c b/src/uadk_sm2.c -index 8c75611..a478a94 100644 ---- a/src/uadk_sm2.c -+++ b/src/uadk_sm2.c -@@ -1,5 +1,5 @@ - /* -- * Copyright 2020-2021 Huawei Technologies Co.,Ltd. All rights reserved. -+ * Copyright 2020-2022 Huawei Technologies Co.,Ltd. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. --- -2.27.0 - diff --git a/0039-README-move-test-script-to-sanity_test.sh.patch b/0039-README-move-test-script-to-sanity_test.sh.patch deleted file mode 100644 index f423381..0000000 --- a/0039-README-move-test-script-to-sanity_test.sh.patch +++ /dev/null @@ -1,197 +0,0 @@ -From 5dab65ce804d8e7995cef2eecfb375270d55f2ed Mon Sep 17 00:00:00 2001 -From: Zhangfei Gao -Date: Wed, 30 Mar 2022 07:34:43 +0000 -Subject: [PATCH 39/57] README: move test script to sanity_test.sh - -Move test script from README to sanity_test.sh - -Signed-off-by: Zhangfei Gao ---- - README | 103 +------------------------------------------- - test/sanity_test.sh | 39 ++++++++++++++++- - 2 files changed, 39 insertions(+), 103 deletions(-) - -diff --git a/README b/README -index 562a859..ed49128 100644 ---- a/README -+++ b/README -@@ -63,108 +63,7 @@ Build & Install OpenSSL UADK Engine - Testing - ------- - ``` -- sudo test/sanity_test.sh --``` --1. Cipher --``` --openssl enc -aes-128-cbc -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -aes-128-cbc -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -aes-192-cbc -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -aes-192-cbc -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -aes-256-cbc -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -aes-256-cbc -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -aes-128-ecb -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -aes-128-ecb -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -aes-192-ecb -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -aes-192-ecb -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -aes-256-ecb -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -aes-256-ecb -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -aes-128-ctr -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -aes-128-ctr -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -aes-192-ctr -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -aes-192-ctr -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -aes-256-ctr -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -aes-256-ctr -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -sm4-cbc -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -sm4-cbc -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -sm4-ecb -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -sm4-ecb -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -des-ede3-cbc -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -des-ede3-cbc -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -des-ede3-ecb -a -in data -out data.en -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl enc -des-ede3-ecb -a -d -in data.en -out data.de -pass pass:123456 -K abc -iv abc -engine uadk_engine -p --openssl speed -engine uadk_engine -async_jobs 1 -evp aes-128-cbc --openssl speed -engine uadk_engine -async_jobs 1 -evp sm4-cbc --openssl speed -engine uadk_engine -async_jobs 1 -evp des-ede3-cbc --``` --2. RSA --``` --openssl genrsa -out prikey.pem -engine uadk_engine 2048 --openssl rsa -in prikey.pem -pubout -out pubkey.pem -engine uadk_engine --openssl rsautl -encrypt -in plain.txt -inkey pubkey.pem -pubin -out enc.txt -engine uadk_engine --openssl rsautl -decrypt -in enc.txt -inkey prikey.pem -out dec.txt -engine uadk_engine --openssl rsautl -sign -in msg.txt -inkey prikey.pem -out signed.txt -engine uadk_engine --openssl rsautl -verify -in signed.txt -inkey pubkey.pem -pubin -out verified.txt -engine uadk_engine --openssl speed -elapsed -engine uadk_engine rsa2048 --openssl speed -elapsed -engine uadk_engine -async_jobs 10 rsa2048 --``` --3. SM3 --``` --openssl sm3 -engine uadk_engine data --``` --4. MD5 --``` --openssl speed -engine uadk_engine -async_jobs 1 -evp md5 --``` --5. SHA --``` --openssl sha1 -engine uadk_engine data --openssl sha256 -engine uadk_engine data --openssl sha512 -engine uadk_engine data --``` --6. DH -- --[step 1] Generate global public parameters, and save them in the file --dhparam.pem: --``` --openssl dhparam -out dhparam.pem 2048 --``` --[step 2] Generate own private key: --``` --openssl genpkey -paramfile dhparam.pem -out privatekey1.pem --openssl genpkey -paramfile dhparam.pem -out privatekey2.pem --``` --[step 3] Generate public key: --``` --openssl pkey -in privatekey1.pem -pubout -out publickey1.pem -engine uadk --openssl pkey -in privatekey2.pem -pubout -out publickey2.pem -engine uadk --``` --[step 4] After exchanging public key, each user can derive the shared secret: --``` --openssl pkeyutl -derive -inkey privatekey1.pem -peerkey publickey2.pem -out --secret1.bin -engine uadk_engine --openssl pkeyutl -derive -inkey privatekey2.pem -peerkey publickey1.pem -out --secret2.bin -engine uadk_engine --``` --[step 5] Check secret1.bin and secret2.bin: --``` --cmp secret1.bin secret2.bin --xxd secret1.bin --xxd secret2.bin --``` --secret1.bin and secret2.bin should be the same. -- --7. SM2 --``` --openssl speed -elapsed -engine uadk_engine sm2 --openssl speed -elapsed -engine uadk_engine -async_jobs 1 sm2 --openssl ecparam -genkey -name SM2 -out SM2PrivateKey.pem --openssl ec -in SM2PrivateKey.pem -pubout -out SM2PublicKey.pem --``` --8. ECDSA --``` --openssl speed -elapsed -engine uadk_engine ecdsap256 --openssl speed -elapsed -engine uadk_engine -async_jobs 1 ecdsap256 -+ ./test/sanity_test.sh - ``` - - Environment variable of uadk engine -diff --git a/test/sanity_test.sh b/test/sanity_test.sh -index 4273310..2c0c504 100755 ---- a/test/sanity_test.sh -+++ b/test/sanity_test.sh -@@ -1,6 +1,6 @@ - #!/bin/bash - --chmod 666 /dev/hisi_* -+sudo chmod 666 /dev/hisi_* - - if [ ! -n "$1" ]; then - engine_id=uadk_engine -@@ -24,6 +24,12 @@ if [[ $algs =~ "SM3" ]]; then - openssl speed -engine $engine_id -async_jobs 1 -evp sm3 - fi - -+if [[ $algs =~ "SM2" ]]; then -+ echo "testing SM2" -+ openssl speed -engine $engine_id -evp sm2 -+ openssl speed -engine $engine_id -async_jobs 1 -evp sm2 -+fi -+ - if [[ $algs =~ "SHA" ]]; then - echo "testing SHA" - openssl speed -engine $engine_id -evp sha1 -@@ -58,6 +64,12 @@ if [[ $algs =~ "AES" ]]; then - openssl speed -engine $engine_id -async_jobs 1 -evp aes-128-xts - openssl speed -engine $engine_id -evp aes-256-xts - openssl speed -engine $engine_id -async_jobs 1 -evp aes-256-xts -+ openssl speed -engine $engine_id -evp aes-128-ctr -+ openssl speed -engine $engine_id -async_jobs 1 -evp aes-128-ctr -+ openssl speed -engine $engine_id -evp aes-192-ctr -+ openssl speed -engine $engine_id -async_jobs 1 -evp aes-192-ctr -+ openssl speed -engine $engine_id -evp aes-256-ctr -+ openssl speed -engine $engine_id -async_jobs 1 -evp aes-256-ctr - fi - - if [[ $algs =~ "SM4-CBC" ]]; then -@@ -134,3 +146,28 @@ if [[ $algs =~ "id-ecPublicKey" ]]; then - openssl speed -elapsed -engine $engine_id ecdhbrp384r1 - openssl speed -elapsed -engine $engine_id -async_jobs 1 ecdhbrp384r1 - fi -+ -+#DH -+if [[ $algs =~ "DH" ]]; then -+ echo "testing DH" -+ #1. Generate global public parameters, and save them in the file dhparam.pem: -+ openssl dhparam -out dhparam.pem 2048 -+ -+ #2. Generate own private key: -+ openssl genpkey -paramfile dhparam.pem -out privatekey1.pem -+ openssl genpkey -paramfile dhparam.pem -out privatekey2.pem -+ -+ #3. Generate public key: -+ openssl pkey -in privatekey1.pem -pubout -out publickey1.pem -engine $engine_id -+ openssl pkey -in privatekey2.pem -pubout -out publickey2.pem -engine $engine_id -+ -+ #4. After exchanging public key, each user can derive the shared secret: -+ openssl pkeyutl -derive -inkey privatekey1.pem -peerkey publickey2.pem -out secret1.bin -engine $engine_id -+ openssl pkeyutl -derive -inkey privatekey2.pem -peerkey publickey1.pem -out secret2.bin -engine $engine_id -+ -+ #5. Check secret1.bin and secret2.bin: -+ cmp secret1.bin secret2.bin -+ xxd secret1.bin -+ xxd secret2.bin -+ #secret1.bin and secret2.bin should be same. -+fi --- -2.27.0 - diff --git a/0040-uadk_engine-fix-string-compare-mode.patch b/0040-uadk_engine-fix-string-compare-mode.patch deleted file mode 100644 index 97c3511..0000000 --- a/0040-uadk_engine-fix-string-compare-mode.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 4763c7f374d4ba29a070b06147e2d47504902cf3 Mon Sep 17 00:00:00 2001 -From: JunchongPan -Date: Sat, 2 Apr 2022 09:47:08 +0800 -Subject: [PATCH 40/57] uadk_engine:fix string compare mode - -String compare now use '==' while compare point and string, -changed to strcmp - -Signed-off-by: JunchongPan ---- - src/e_uadk.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/e_uadk.c b/src/e_uadk.c -index 4288569..58a10de 100644 ---- a/src/e_uadk.c -+++ b/src/e_uadk.c -@@ -116,7 +116,7 @@ int uadk_e_is_env_enabled(const char *alg_name) - int i = 0; - - while (i < len) { -- if (uadk_env_enabled[i].alg_name == alg_name) -+ if (strcmp(uadk_env_enabled[i].alg_name, alg_name)) - return uadk_env_enabled[i].env_enabled; - i++; - } -@@ -130,7 +130,7 @@ static void uadk_e_set_env_enabled(const char *alg_name, __u8 value) - int i = 0; - - while (i < len) { -- if (uadk_env_enabled[i].alg_name == alg_name) { -+ if (strcmp(uadk_env_enabled[i].alg_name, alg_name)) { - uadk_env_enabled[i].env_enabled = value; - return; - } --- -2.27.0 - diff --git a/0041-cipher-optimize-the-process-of-ctx-initialization.patch b/0041-cipher-optimize-the-process-of-ctx-initialization.patch deleted file mode 100644 index 6eece84..0000000 --- a/0041-cipher-optimize-the-process-of-ctx-initialization.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 17bfd66f31e712ffd9364bfb43c9899e10e84a7d Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Sat, 2 Apr 2022 11:19:16 +0800 -Subject: [PATCH 41/57] cipher: optimize the process of ctx initialization - -Optimize the process of ctx initialization as switching to soft work. -If the ctx resources of a thread are insufficient at the beginning, the -thread can't apply for resources again. Therefore, an flag checking is -required. - -Signed-off-by: Kai Ye ---- - src/uadk_cipher.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c -index 91895cc..8a2c39d 100644 ---- a/src/uadk_cipher.c -+++ b/src/uadk_cipher.c -@@ -851,6 +851,9 @@ static void uadk_e_ctx_init(EVP_CIPHER_CTX *ctx, struct cipher_priv_ctx *priv) - priv->req.iv_bytes = EVP_CIPHER_CTX_iv_length(ctx); - priv->req.iv = priv->iv; - -+ if (priv->switch_flag == UADK_DO_SOFT) -+ return; -+ - ret = uadk_e_init_cipher(); - if (unlikely(!ret)) { - priv->switch_flag = UADK_DO_SOFT; --- -2.27.0 - diff --git a/0042-cipher-adding-an-iv-update-to-a-decryption.patch b/0042-cipher-adding-an-iv-update-to-a-decryption.patch deleted file mode 100644 index 7580b8d..0000000 --- a/0042-cipher-adding-an-iv-update-to-a-decryption.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 11016568bf6a929aebc216f5e7f5fd28b2e1d2a6 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Thu, 12 May 2022 10:31:56 +0800 -Subject: [PATCH 42/57] cipher: adding an iv update to a decryption - -Adding an iv update to de-crypto method as cbc mode. -the dst address should not be changed. So fix it. - -Signed-off-by: Kai Ye ---- - src/uadk_cipher.c | 25 ++++++++++++++----------- - 1 file changed, 14 insertions(+), 11 deletions(-) - -diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c -index 8a2c39d..49022f7 100644 ---- a/src/uadk_cipher.c -+++ b/src/uadk_cipher.c -@@ -763,10 +763,13 @@ static void uadk_cipher_update_priv_ctx(struct cipher_priv_ctx *priv) - - switch (priv->setup.mode) { - case WD_CIPHER_CBC: -- if (priv->req.op_type == WD_CIPHER_ENCRYPTION) { -- priv->req.dst += priv->req.in_bytes; -- memcpy(priv->iv, priv->req.dst - iv_bytes, iv_bytes); -- } -+ if (priv->req.op_type == WD_CIPHER_ENCRYPTION) -+ memcpy(priv->iv, priv->req.dst + priv->req.in_bytes - iv_bytes, -+ iv_bytes); -+ else -+ memcpy(priv->iv, priv->req.src + priv->req.in_bytes - iv_bytes, -+ iv_bytes); -+ - break; - case WD_CIPHER_OFB: - for (i = 0; i < IV_LEN; i++) { -@@ -776,13 +779,13 @@ static void uadk_cipher_update_priv_ctx(struct cipher_priv_ctx *priv) - memcpy(priv->iv, K, iv_bytes); - break; - case WD_CIPHER_CFB: -- if (priv->req.op_type == WD_CIPHER_ENCRYPTION) { -- priv->req.dst += priv->req.in_bytes; -- memcpy(priv->iv, priv->req.dst - iv_bytes, iv_bytes); -- } else { -- priv->req.src += priv->req.in_bytes; -- memcpy(priv->iv, priv->req.src - iv_bytes, iv_bytes); -- } -+ if (priv->req.op_type == WD_CIPHER_ENCRYPTION) -+ memcpy(priv->iv, priv->req.dst + priv->req.in_bytes - iv_bytes, -+ iv_bytes); -+ else -+ memcpy(priv->iv, priv->req.src + priv->req.in_bytes - iv_bytes, -+ iv_bytes); -+ - break; - case WD_CIPHER_CTR: - ctr_iv_inc(priv->iv, priv->req.in_bytes >> CTR_MODE_LEN_SHIFT); --- -2.27.0 - diff --git a/0043-cipher-fix-cipher-decrypto-failed-as-use-jdk.patch b/0043-cipher-fix-cipher-decrypto-failed-as-use-jdk.patch deleted file mode 100644 index dbeb155..0000000 --- a/0043-cipher-fix-cipher-decrypto-failed-as-use-jdk.patch +++ /dev/null @@ -1,47 +0,0 @@ -From d6b2f7a4b2486afb3b3a418f32ce9d43783ef8f0 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Thu, 12 May 2022 10:31:57 +0800 -Subject: [PATCH 43/57] cipher: fix cipher decrypto failed as use jdk - -Because the java releases the memory immediately after the -memory is used. So the engine should not use user memory for -storage the key. - -Signed-off-by: Kai Ye ---- - src/uadk_cipher.c | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c -index 49022f7..7eba992 100644 ---- a/src/uadk_cipher.c -+++ b/src/uadk_cipher.c -@@ -36,6 +36,7 @@ - #define BYTE_BITS 8 - #define IV_LEN 16 - #define ENV_ENABLED 1 -+#define MAX_KEY_LEN 64 - - struct cipher_engine { - struct wd_ctx_config ctx_cfg; -@@ -57,7 +58,7 @@ struct cipher_priv_ctx { - struct wd_cipher_sess_setup setup; - struct wd_cipher_req req; - unsigned char iv[IV_LEN]; -- const unsigned char *key; -+ unsigned char key[MAX_KEY_LEN]; - int switch_flag; - void *sw_ctx_data; - /* Crypto small packet offload threshold */ -@@ -694,7 +695,7 @@ static int uadk_e_cipher_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, - if (unlikely(ret != 1)) - return 0; - -- priv->key = key; -+ memcpy(priv->key, key, EVP_CIPHER_CTX_key_length(ctx)); - priv->switch_threshold = SMALL_PACKET_OFFLOAD_THRESHOLD_DEFAULT; - - return 1; --- -2.27.0 - diff --git a/0044-engine-add-receiving-timeout-count.patch b/0044-engine-add-receiving-timeout-count.patch deleted file mode 100644 index 08b33c5..0000000 --- a/0044-engine-add-receiving-timeout-count.patch +++ /dev/null @@ -1,169 +0,0 @@ -From 4fbef0e061a97e3ead086de7f3f5689e9d53f454 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Mon, 18 Jul 2022 09:41:39 +0800 -Subject: [PATCH 44/57] engine: add receiving timeout count - -Task fail due to hardware errors, but the process of poll -isn't exit. Increase the count of packet receiving timeout -as doing async jobs. Prevents falling into an infinite loop -in poll ctx. - -Signed-off-by: Kai Ye ---- - src/uadk.h | 5 +++-- - src/uadk_cipher.c | 7 +++++-- - src/uadk_dh.c | 7 +++++-- - src/uadk_digest.c | 7 +++++-- - src/uadk_pkey.c | 7 +++++-- - src/uadk_rsa.c | 7 +++++-- - 6 files changed, 28 insertions(+), 12 deletions(-) - -diff --git a/src/uadk.h b/src/uadk.h -index ef09274..e2635d4 100644 ---- a/src/uadk.h -+++ b/src/uadk.h -@@ -22,8 +22,9 @@ - #include - #include "uadk_utils.h" - --#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) --#define ENV_STRING_LEN 256 -+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) -+#define ENV_STRING_LEN 256 -+#define ENGINE_RECV_MAX_CNT 60000000 - - enum { - KUNPENG920, -diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c -index 7eba992..472c0ad 100644 ---- a/src/uadk_cipher.c -+++ b/src/uadk_cipher.c -@@ -504,6 +504,7 @@ static int sched_single_poll_policy(handle_t h_sched_ctx, - static int uadk_e_cipher_poll(void *ctx) - { - struct cipher_priv_ctx *priv = (struct cipher_priv_ctx *) ctx; -+ __u64 rx_cnt = 0; - __u32 recv = 0; - /* Poll one packet currently */ - int expt = 1; -@@ -520,9 +521,11 @@ static int uadk_e_cipher_poll(void *ctx) - return 0; - else if (ret < 0 && ret != -EAGAIN) - return ret; -- } while (ret == -EAGAIN); -+ } while (ret == -EAGAIN && (rx_cnt++ < ENGINE_RECV_MAX_CNT)); - -- return ret; -+ fprintf(stderr, "failed to recv msg: timeout!\n"); -+ -+ return -ETIMEDOUT; - } - - static int uadk_e_cipher_env_poll(void *ctx) -diff --git a/src/uadk_dh.c b/src/uadk_dh.c -index 3882306..893b0f2 100644 ---- a/src/uadk_dh.c -+++ b/src/uadk_dh.c -@@ -204,6 +204,7 @@ static __u32 dh_pick_next_ctx(handle_t sched_ctx, - - static int uadk_e_dh_poll(void *ctx) - { -+ __u64 rx_cnt = 0; - __u32 recv = 0; - int expect = 1; - int idx = 1; -@@ -215,9 +216,11 @@ static int uadk_e_dh_poll(void *ctx) - return UADK_E_POLL_SUCCESS; - else if (ret < 0 && ret != -EAGAIN) - return ret; -- } while (ret == -EAGAIN); -+ } while (ret == -EAGAIN && (rx_cnt++ < ENGINE_RECV_MAX_CNT)); - -- return ret; -+ fprintf(stderr, "failed to recv msg: timeout!\n"); -+ -+ return -ETIMEDOUT; - } - - static void uadk_e_dh_cb(void *req_t) -diff --git a/src/uadk_digest.c b/src/uadk_digest.c -index ecc0ce6..2e61e80 100644 ---- a/src/uadk_digest.c -+++ b/src/uadk_digest.c -@@ -332,6 +332,7 @@ static int sched_single_poll_policy(handle_t h_sched_ctx, - - static int uadk_e_digest_poll(void *ctx) - { -+ __u64 rx_cnt = 0; - __u32 recv = 0; - int expt = 1; - int ret = 0; -@@ -342,9 +343,11 @@ static int uadk_e_digest_poll(void *ctx) - return 0; - else if (ret < 0 && ret != -EAGAIN) - return ret; -- } while (ret == -EAGAIN); -+ } while (ret == -EAGAIN && (rx_cnt++ < ENGINE_RECV_MAX_CNT)); - -- return ret; -+ fprintf(stderr, "failed to recv msg: timeout!\n"); -+ -+ return -ETIMEDOUT; - } - - static int uadk_e_digest_env_poll(void *ctx) -diff --git a/src/uadk_pkey.c b/src/uadk_pkey.c -index d4ec30e..2616c5e 100644 ---- a/src/uadk_pkey.c -+++ b/src/uadk_pkey.c -@@ -113,6 +113,7 @@ void uadk_ecc_cb(void *req_t) - static int uadk_ecc_poll(void *ctx) - { - unsigned int recv = 0; -+ __u64 rx_cnt = 0; - int expt = 1; - int ret; - -@@ -122,9 +123,11 @@ static int uadk_ecc_poll(void *ctx) - return 0; - else if (ret < 0 && ret != -EAGAIN) - return ret; -- } while (ret == -EAGAIN); -+ } while (ret == -EAGAIN && (rx_cnt++ < ENGINE_RECV_MAX_CNT)); - -- return ret; -+ fprintf(stderr, "failed to recv msg: timeout!\n"); -+ -+ return -ETIMEDOUT; - } - - /* make resource configure static */ -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index a80d203..29b2521 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -656,6 +656,7 @@ static int rsa_poll_policy(handle_t h_sched_ctx, __u32 expect, __u32 *count) - - static int uadk_e_rsa_poll(void *ctx) - { -+ __u64 rx_cnt = 0; - __u32 recv = 0; - int expt = 1; - int ret; -@@ -666,9 +667,11 @@ static int uadk_e_rsa_poll(void *ctx) - return UADK_E_POLL_SUCCESS; - else if (ret < 0 && ret != -EAGAIN) - return ret; -- } while (ret == -EAGAIN); -+ } while (ret == -EAGAIN && (rx_cnt++ < ENGINE_RECV_MAX_CNT)); - -- return ret; -+ fprintf(stderr, "failed to recv msg: timeout!\n"); -+ -+ return -ETIMEDOUT; - } - - static struct rsa_res_config rsa_res_config = { --- -2.27.0 - diff --git a/0045-digest-fix-the-fault-as-using-the-nginx.patch b/0045-digest-fix-the-fault-as-using-the-nginx.patch deleted file mode 100644 index 0df7ca6..0000000 --- a/0045-digest-fix-the-fault-as-using-the-nginx.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 7718ed9e56633bf2781f108a591eefe093ccb18b Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Mon, 18 Jul 2022 14:43:53 +0800 -Subject: [PATCH 45/57] digest: fix the fault as using the nginx - -Prevent double-free after the private ctx copy is used. - -Signed-off-by: Kai Ye ---- - src/uadk_digest.c | 9 ++++++++- - 1 file changed, 8 insertions(+), 1 deletion(-) - -diff --git a/src/uadk_digest.c b/src/uadk_digest.c -index 2e61e80..8127373 100644 ---- a/src/uadk_digest.c -+++ b/src/uadk_digest.c -@@ -240,6 +240,10 @@ static void digest_soft_cleanup(struct digest_priv_ctx *md_ctx) - { - EVP_MD_CTX *ctx = md_ctx->soft_ctx; - -+ /* Prevent double-free after the copy is used */ -+ if (md_ctx->copy) -+ return; -+ - if (ctx != NULL) { - if (ctx->md_data) { - OPENSSL_free(ctx->md_data); -@@ -641,7 +645,9 @@ static int do_digest_sync(struct digest_priv_ctx *priv) - { - int ret; - -- /* Fix me: not support switch the soft work as input is lower */ -+ if (priv->req.in_bytes <= priv->switch_threshold && -+ priv->state == SEC_DIGEST_INIT) -+ return 0; - - ret = wd_do_digest_sync(priv->sess, &priv->req); - if (ret) { -@@ -743,6 +749,7 @@ static int uadk_e_digest_cleanup(EVP_MD_CTX *ctx) - struct digest_priv_ctx *priv = - (struct digest_priv_ctx *)EVP_MD_CTX_md_data(ctx); - -+ /* Prevent double-free after the copy is used */ - if (!priv || priv->copy) - return 1; - --- -2.27.0 - diff --git a/0046-ecc-cleanup-of-static-code-check.patch b/0046-ecc-cleanup-of-static-code-check.patch deleted file mode 100644 index 3a857ad..0000000 --- a/0046-ecc-cleanup-of-static-code-check.patch +++ /dev/null @@ -1,121 +0,0 @@ -From c8dbfbdd80ea8b8d422a50c634e057dd37ac9aea Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Sat, 23 Jul 2022 16:45:03 +0800 -Subject: [PATCH 46/57] ecc: cleanup of static code check - -1. Use macros instead of specific numbers to represent -the key size. -2. Global variable 'sm2_order' only used in function -'sm2_update_sess' should be declared in function scope. -3. Remove unused structure 'uadk_ecc_sess'. - -Signed-off-by: Zhiqi Song ---- - src/uadk_ec.c | 22 +++++++++++----------- - src/uadk_pkey.c | 9 --------- - src/uadk_sm2.c | 21 ++++++--------------- - 3 files changed, 17 insertions(+), 35 deletions(-) - -diff --git a/src/uadk_ec.c b/src/uadk_ec.c -index e219bdf..d78658b 100644 ---- a/src/uadk_ec.c -+++ b/src/uadk_ec.c -@@ -129,18 +129,18 @@ err: - static int get_smallest_hw_keybits(int bits) - { - /* ec curve order width */ -- if (bits > 384) -- return 521; -- else if (bits > 320) -- return 384; -- else if (bits > 256) -- return 320; -- else if (bits > 192) -- return 256; -- else if (bits > 128) -- return 192; -+ if (bits > ECC384BITS) -+ return ECC521BITS; -+ else if (bits > ECC320BITS) -+ return ECC384BITS; -+ else if (bits > ECC256BITS) -+ return ECC320BITS; -+ else if (bits > ECC192BITS) -+ return ECC256BITS; -+ else if (bits > ECC128BITS) -+ return ECC192BITS; - else -- return 128; -+ return ECC128BITS; - } - - static handle_t ecc_alloc_sess(const EC_KEY *eckey, char *alg) -diff --git a/src/uadk_pkey.c b/src/uadk_pkey.c -index 2616c5e..a0b74af 100644 ---- a/src/uadk_pkey.c -+++ b/src/uadk_pkey.c -@@ -44,15 +44,6 @@ struct ecc_res_config { - int numa_id; - }; - --typedef struct uadk_ecc_sess { -- handle_t sess; -- struct wd_ecc_sess_setup setup; -- struct wd_ecc_req req; -- int is_pubkey_ready; -- int is_privkey_ready; -- int key_size; --} uadk_ecc_sess_t; -- - /* ecc global hardware resource is saved here */ - struct ecc_res { - struct wd_ctx_config *ctx_res; -diff --git a/src/uadk_sm2.c b/src/uadk_sm2.c -index a478a94..fcca9f2 100644 ---- a/src/uadk_sm2.c -+++ b/src/uadk_sm2.c -@@ -46,15 +46,6 @@ struct sm2_ctx { - bool is_init; - }; - --typedef struct uadk_ecc_sess { -- handle_t sess; -- struct wd_ecc_sess_setup setup; -- struct wd_ecc_req req; -- int is_pubkey_ready; -- int is_privkey_ready; -- int key_size; --} uadk_ecc_sess_t; -- - typedef struct sm2_ciphertext { - BIGNUM *C1x; - BIGNUM *C1y; -@@ -115,12 +106,6 @@ typedef int (*PFUNC_DEC)(EVP_PKEY_CTX *ctx, - const unsigned char *in, - size_t inlen); - --const unsigned char sm2_order[] = { -- 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\ -- 0xff, 0xff, 0xff, 0xff, 0x72, 0x03, 0xdf, 0x6b, 0x21, 0xc6, 0x05, 0x2b,\ -- 0x53, 0xbb, 0xf4, 0x09, 0x39, 0xd5, 0x41, 0x23 --}; -- - static int get_hash_type(int nid_hash) - { - switch (nid_hash) { -@@ -166,6 +151,12 @@ static int compute_hash(const char *in, size_t in_len, - - static int sm2_update_sess(struct sm2_ctx *smctx) - { -+ const unsigned char sm2_order[] = { -+ 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, -+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -+ 0x72, 0x03, 0xdf, 0x6b, 0x21, 0xc6, 0x05, 0x2b, -+ 0x53, 0xbb, 0xf4, 0x09, 0x39, 0xd5, 0x41, 0x23 -+ }; - int nid_hash = smctx->ctx.md ? EVP_MD_type(smctx->ctx.md) : NID_sm3; - struct wd_ecc_sess_setup setup; - handle_t sess; --- -2.27.0 - diff --git a/0047-ecc-bugfix-about-return-value-check.patch b/0047-ecc-bugfix-about-return-value-check.patch deleted file mode 100644 index 02dc446..0000000 --- a/0047-ecc-bugfix-about-return-value-check.patch +++ /dev/null @@ -1,260 +0,0 @@ -From a8613bb37a229c64ab1846e4da2220912876fbfa Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Sat, 23 Jul 2022 16:56:02 +0800 -Subject: [PATCH 47/57] ecc: bugfix about return value check - -Check the return value of BN_CTX_get(), and add a new -structure to wrap the curve parameters to make the logic -of return value check clearer. - -Signed-off-by: Zhiqi Song ---- - src/uadk_ec.c | 159 ++++++++++++++++++++++++++++++++++---------------- - 1 file changed, 108 insertions(+), 51 deletions(-) - -diff --git a/src/uadk_ec.c b/src/uadk_ec.c -index d78658b..37683cd 100644 ---- a/src/uadk_ec.c -+++ b/src/uadk_ec.c -@@ -34,6 +34,19 @@ - #define ECC384BITS 384 - #define ECC521BITS 521 - -+struct curve_param { -+ /* prime */ -+ BIGNUM *p; -+ /* ecc coefficient 'a' */ -+ BIGNUM *a; -+ /* ecc coefficient 'b' */ -+ BIGNUM *b; -+ /* base point */ -+ const EC_POINT *g; -+ /* order of base point */ -+ const BIGNUM *order; -+}; -+ - typedef ECDSA_SIG* (*PFUNC_SIGN_SIG)(const unsigned char *, - int, - const BIGNUM *, -@@ -70,58 +83,92 @@ static void init_dtb_param(void *dtb, char *start, - } - } - -+static void fill_ecc_cv_param(struct wd_ecc_curve *pparam, -+ struct curve_param *cv_param, -+ BIGNUM *g_x, BIGNUM *g_y) -+{ -+ pparam->p.dsize = BN_bn2bin(cv_param->p, (void *)pparam->p.data); -+ pparam->a.dsize = BN_bn2bin(cv_param->a, (void *)pparam->a.data); -+ if (!pparam->a.dsize) { -+ pparam->a.dsize = 1; -+ pparam->a.data[0] = 0; -+ } -+ -+ pparam->b.dsize = BN_bn2bin(cv_param->b, (void *)pparam->b.data); -+ if (!pparam->b.dsize) { -+ pparam->b.dsize = 1; -+ pparam->b.data[0] = 0; -+ } -+ -+ pparam->g.x.dsize = BN_bn2bin(g_x, (void *)pparam->g.x.data); -+ pparam->g.y.dsize = BN_bn2bin(g_y, (void *)pparam->g.y.data); -+ pparam->n.dsize = BN_bn2bin(cv_param->order, (void *)pparam->n.data); -+} -+ - static int set_sess_setup_cv(const EC_GROUP *group, - struct wd_ecc_curve_cfg *cv) - { - struct wd_ecc_curve *pparam = cv->cfg.pparam; -- BIGNUM *p, *a, *b, *xg, *yg, *order; -- const EC_POINT *g; -+ struct curve_param *cv_param; -+ BIGNUM *g_x, *g_y; -+ int ret = -1; - BN_CTX *ctx; -- int ret; - - ctx = BN_CTX_new(); - if (!ctx) -- return -ENOMEM; -+ return ret; - - BN_CTX_start(ctx); -- p = BN_CTX_get(ctx); -- a = BN_CTX_get(ctx); -- b = BN_CTX_get(ctx); -- xg = BN_CTX_get(ctx); -- yg = BN_CTX_get(ctx); - -- ret = uadk_get_curve(group, p, a, b, ctx); -+ cv_param = OPENSSL_malloc(sizeof(struct curve_param)); -+ if (!cv_param) -+ goto free_ctx; -+ -+ cv_param->p = BN_CTX_get(ctx); -+ if (!cv_param->p) -+ goto free_cv; -+ -+ cv_param->a = BN_CTX_get(ctx); -+ if (!cv_param->a) -+ goto free_cv; -+ -+ cv_param->b = BN_CTX_get(ctx); -+ if (!cv_param->b) -+ goto free_cv; -+ -+ g_x = BN_CTX_get(ctx); -+ if (!g_x) -+ goto free_cv; -+ -+ g_y = BN_CTX_get(ctx); -+ if (!g_y) -+ goto free_cv; -+ -+ ret = uadk_get_curve(group, cv_param->p, cv_param->a, cv_param->b, ctx); - if (ret) -- goto err; -+ goto free_cv; - -- g = EC_GROUP_get0_generator(group); -- ret = uadk_get_affine_coordinates(group, g, xg, yg, ctx); -+ cv_param->g = EC_GROUP_get0_generator(group); -+ if (!cv_param->g) -+ goto free_cv; -+ -+ ret = uadk_get_affine_coordinates(group, cv_param->g, g_x, g_y, ctx); - if (ret) -- goto err; -+ goto free_cv; - -- order = (BIGNUM *)EC_GROUP_get0_order(group); -- pparam->p.dsize = BN_bn2bin(p, (void *)pparam->p.data); -- pparam->a.dsize = BN_bn2bin(a, (void *)pparam->a.data); -- /* a or b is all zero, but uadk not allow parameter length is zero */ -- if (!pparam->a.dsize) { -- pparam->a.dsize = 1; -- pparam->a.data[0] = 0; -- } -- pparam->b.dsize = BN_bn2bin(b, (void *)pparam->b.data); -- if (!pparam->b.dsize) { -- pparam->b.dsize = 1; -- pparam->b.data[0] = 0; -- } -- pparam->g.x.dsize = BN_bn2bin(xg, (void *)pparam->g.x.data); -- pparam->g.y.dsize = BN_bn2bin(yg, (void *)pparam->g.y.data); -- pparam->n.dsize = BN_bn2bin(order, (void *)pparam->n.data); -+ cv_param->order = EC_GROUP_get0_order(group); -+ if (!cv_param->order) -+ goto free_cv; -+ -+ fill_ecc_cv_param(pparam, cv_param, g_x, g_y); - cv->type = WD_CV_CFG_PARAM; - ret = 0; --err: -- if (ctx) { -- BN_CTX_end(ctx); -- BN_CTX_free(ctx); -- } -+ -+free_cv: -+ OPENSSL_free(cv_param); -+free_ctx: -+ BN_CTX_end(ctx); -+ BN_CTX_free(ctx); - - return ret; - } -@@ -166,12 +213,13 @@ static handle_t ecc_alloc_sess(const EC_KEY *eckey, char *alg) - sp.cv.cfg.pparam = ¶m; - group = EC_KEY_get0_group(eckey); - ret = set_sess_setup_cv(group, &sp.cv); -- if (ret) { -- free(dev); -- return (handle_t)0; -- } -+ if (ret) -+ goto free_dev; - - order = EC_GROUP_get0_order(group); -+ if (!order) -+ goto free_dev; -+ - key_bits = BN_num_bits(order); - sp.alg = alg; - sp.key_bits = get_smallest_hw_keybits(key_bits); -@@ -184,8 +232,11 @@ static handle_t ecc_alloc_sess(const EC_KEY *eckey, char *alg) - fprintf(stderr, "failed to alloc ecc sess\n"); - - free(dev); -- - return sess; -+ -+free_dev: -+ free(dev); -+ return (handle_t)0; - } - - static int check_ecc_bit_useful(const int bits) -@@ -506,6 +557,10 @@ static int ecdsa_do_verify_check(EC_KEY *eckey, - const BIGNUM *order; - int ret; - -+ ret = eckey_check(eckey); -+ if (ret) -+ return ret; -+ - if (!dgst) { - fprintf(stderr, "dgst is NULL\n"); - return -1; -@@ -516,10 +571,6 @@ static int ecdsa_do_verify_check(EC_KEY *eckey, - return -1; - } - -- ret = eckey_check(eckey); -- if (ret) -- return ret; -- - pub_key = EC_KEY_get0_public_key(eckey); - if (!pub_key) { - fprintf(stderr, "pub_key is NULL\n"); -@@ -957,10 +1008,20 @@ static int ecdh_compkey_init_iot(handle_t sess, struct wd_ecc_req *req, - ctx = BN_CTX_new(); - if (!ctx) - return -ENOMEM; -+ -+ BN_CTX_start(ctx); - pkey_x = BN_CTX_get(ctx); -+ if (!pkey_x) -+ goto free_ctx; -+ - pkey_y = BN_CTX_get(ctx); -+ if (!pkey_y) -+ goto free_ctx; - - group = EC_KEY_get0_group(ecdh); -+ if (!group) -+ goto free_ctx; -+ - uadk_get_affine_coordinates(group, pubkey, pkey_x, pkey_y, ctx); - in_pkey.x.data = buf_x; - in_pkey.y.data = buf_y; -@@ -986,13 +1047,9 @@ static int ecdh_compkey_init_iot(handle_t sess, struct wd_ecc_req *req, - ret = 1; - - free_ctx: -- if (ctx) { -- if (pkey_x) -- BN_clear(pkey_x); -- if (pkey_y) -- BN_clear(pkey_y); -- BN_CTX_free(ctx); -- } -+ BN_CTX_end(ctx); -+ BN_CTX_free(ctx); -+ - return ret; - } - --- -2.27.0 - diff --git a/0048-ecc-bugfix-multiple-definition-of-ecx-structure.patch b/0048-ecc-bugfix-multiple-definition-of-ecx-structure.patch deleted file mode 100644 index fcb2341..0000000 --- a/0048-ecc-bugfix-multiple-definition-of-ecx-structure.patch +++ /dev/null @@ -1,170 +0,0 @@ -From 7989e5639ab9a2de5d03ecb06942ad556ed41d93 Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Sat, 23 Jul 2022 16:57:50 +0800 -Subject: [PATCH 48/57] ecc: bugfix multiple definition of ecx structure - -The structure 'ECX_KEY' is defined in the libcrypto of OpenSSL, -but OpenSSL does not put this definition in the header file in -its 1.1.1x release version, so we can not use this structure -directly. We should define a new structure that provides the -same function to avoid conflict with the definition in OpenSSL -when using static compilation. - -Signed-off-by: Zhiqi Song ---- - src/uadk_ecx.c | 43 +++++++++++++++++++++++-------------------- - 1 file changed, 23 insertions(+), 20 deletions(-) - -diff --git a/src/uadk_ecx.c b/src/uadk_ecx.c -index 5d0ff76..df23156 100644 ---- a/src/uadk_ecx.c -+++ b/src/uadk_ecx.c -@@ -31,14 +31,14 @@ - #define X448_KEYLEN 56 - #define X25519_KEYBITS 256 - #define X448_KEYBITS 448 --#define MAX_KEYLEN 57 -+#define ECX_MAX_KEYLEN 57 - #define UADK_E_SUCCESS 1 - #define UADK_E_FAIL 0 - --typedef struct { -- unsigned char pubkey[MAX_KEYLEN]; -+struct ecx_key { -+ unsigned char pubkey[ECX_MAX_KEYLEN]; - unsigned char *privkey; --} ECX_KEY; -+}; - - struct ecx_ctx { - handle_t sess; -@@ -224,12 +224,12 @@ static int ecx_get_nid(EVP_PKEY_CTX *ctx) - return nid; - } - --static int ecx_create_privkey(ECX_KEY **ecx_key, int key_size) -+static int ecx_create_privkey(struct ecx_key **ecx_key, int key_size) - { - unsigned char *privkey; - int ret; - -- *ecx_key = OPENSSL_zalloc(sizeof(ECX_KEY)); -+ *ecx_key = OPENSSL_zalloc(sizeof(struct ecx_key)); - if (!(*ecx_key)) { - fprintf(stderr, "failed to alloc ecx_key\n"); - return UADK_E_FAIL; -@@ -259,7 +259,8 @@ free_ecx_key: - return UADK_E_FAIL; - } - --static int ecx_keygen_set_private_key(struct ecx_ctx *ecx_ctx, ECX_KEY *ecx_key) -+static int ecx_keygen_set_private_key(struct ecx_ctx *ecx_ctx, -+ struct ecx_key *ecx_key) - { - handle_t sess = ecx_ctx->sess; - struct wd_ecc_key *ecc_key; -@@ -280,14 +281,14 @@ static int ecx_keygen_set_private_key(struct ecx_ctx *ecx_ctx, ECX_KEY *ecx_key) - } - - static int ecx_keygen_set_pkey(EVP_PKEY *pkey, struct ecx_ctx *ecx_ctx, -- struct wd_ecc_req *req, ECX_KEY *ecx_key) -+ struct wd_ecc_req *req, struct ecx_key *ecx_key) - { - struct wd_ecc_point *pubkey = NULL; - int key_size = ecx_ctx->key_size; - int ret; - - wd_ecxdh_get_out_params(req->dst, &pubkey); -- if (key_size > MAX_KEYLEN) { -+ if (key_size > ECX_MAX_KEYLEN) { - fprintf(stderr, "invalid key size, key_size = %d\n", key_size); - return UADK_E_FAIL; - } -@@ -368,8 +369,8 @@ static int openssl_do_ecx_genkey(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) - static int x25519_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) - { - struct ecx_ctx *keygen_ctx = NULL; -+ struct ecx_key *ecx_key = NULL; - struct wd_ecc_req req = {0}; -- ECX_KEY *ecx_key = NULL; - int ret; - - ret = ecx_genkey_check(ctx, pkey); -@@ -426,8 +427,8 @@ do_soft: - static int x448_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) - { - struct ecx_ctx *keygen_ctx = NULL; -+ struct ecx_key *ecx_key = NULL; - struct wd_ecc_req req = {0}; -- ECX_KEY *ecx_key = NULL; - int ret; - - ret = ecx_genkey_check(ctx, pkey); -@@ -482,12 +483,13 @@ do_soft: - } - - static int ecx_compkey_init_iot(struct ecx_ctx *ecx_ctx, struct wd_ecc_req *req, -- ECX_KEY *peer_ecx_key, ECX_KEY *ecx_key) -+ struct ecx_key *peer_ecx_key, -+ struct ecx_key *ecx_key) - { - int key_size = ecx_ctx->key_size; -+ char buf_y[ECX_MAX_KEYLEN] = {0}; - handle_t sess = ecx_ctx->sess; - struct wd_ecc_point in_pubkey; -- char buf_y[MAX_KEYLEN] = {0}; - struct wd_ecc_out *ecx_out; - struct wd_ecc_in *ecx_in; - int ret; -@@ -542,7 +544,8 @@ static void ecx_compkey_uninit_iot(handle_t sess, struct wd_ecc_req *req) - wd_ecc_del_in(sess, req->src); - } - --static int ecx_derive_set_private_key(struct ecx_ctx *ecx_ctx, ECX_KEY *ecx_key) -+static int ecx_derive_set_private_key(struct ecx_ctx *ecx_ctx, -+ struct ecx_key *ecx_key) - { - int key_size = ecx_ctx->key_size; - handle_t sess = ecx_ctx->sess; -@@ -576,8 +579,8 @@ static int ecx_derive_set_private_key(struct ecx_ctx *ecx_ctx, ECX_KEY *ecx_key) - return UADK_E_SUCCESS; - } - --static int ecx_get_key(EVP_PKEY_CTX *ctx, ECX_KEY **ecx_key, -- ECX_KEY **peer_ecx_key) -+static int ecx_get_key(EVP_PKEY_CTX *ctx, struct ecx_key **ecx_key, -+ struct ecx_key **peer_ecx_key) - { - EVP_PKEY *pkey, *peer_key; - -@@ -623,11 +626,11 @@ static void x25519_pad_out_key(unsigned char *dst_key, unsigned char *src_key, - static int x25519_derive(EVP_PKEY_CTX *ctx, unsigned char *key, - size_t *keylen) - { -+ struct ecx_key *peer_ecx_key = NULL; - struct wd_ecc_point *s_key = NULL; - struct ecx_ctx *derive_ctx = NULL; -- ECX_KEY *peer_ecx_key = NULL; -+ struct ecx_key *ecx_key = NULL; - struct wd_ecc_req req = {0}; -- ECX_KEY *ecx_key = NULL; - int ret; - - ret = x25519_init(ctx); -@@ -709,11 +712,11 @@ static void x448_pad_out_key(unsigned char *dst_key, unsigned char *src_key, - static int x448_derive(EVP_PKEY_CTX *ctx, unsigned char *key, - size_t *keylen) - { -+ struct ecx_key *peer_ecx_key = NULL; - struct wd_ecc_point *s_key = NULL; - struct ecx_ctx *derive_ctx = NULL; -- ECX_KEY *peer_ecx_key = NULL; -+ struct ecx_key *ecx_key = NULL; - struct wd_ecc_req req = {0}; -- ECX_KEY *ecx_key = NULL; - int ret; - - ret = x448_init(ctx); --- -2.27.0 - diff --git a/0049-uadk_engine-remove-redundant-extern.patch b/0049-uadk_engine-remove-redundant-extern.patch deleted file mode 100644 index a00e806..0000000 --- a/0049-uadk_engine-remove-redundant-extern.patch +++ /dev/null @@ -1,76 +0,0 @@ -From 55edca5dd3c13ff623c078eaea2dfb9a7f444eb7 Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Sat, 23 Jul 2022 17:06:29 +0800 -Subject: [PATCH 49/57] uadk_engine: remove redundant extern - -Remove the "extern" keyword before function declaration in -the header file. Because the function in header file is -'extern' by default, there is no need to specify explicitly. - -Signed-off-by: Zhiqi Song ---- - src/uadk.h | 24 ++++++++++++------------ - src/uadk_async.h | 16 ++++++++-------- - 2 files changed, 20 insertions(+), 20 deletions(-) - -diff --git a/src/uadk.h b/src/uadk.h -index e2635d4..0188f0b 100644 ---- a/src/uadk.h -+++ b/src/uadk.h -@@ -32,16 +32,16 @@ enum { - }; - - extern const char *engine_uadk_id; --extern int uadk_e_bind_cipher(ENGINE *e); --extern void uadk_e_destroy_cipher(void); --extern int uadk_e_bind_digest(ENGINE *e); --extern void uadk_e_destroy_digest(void); --extern int uadk_e_bind_rsa(ENGINE *e); --extern void uadk_e_destroy_rsa(void); --extern int uadk_e_bind_dh(ENGINE *e); --extern void uadk_e_destroy_dh(void); --extern int uadk_e_bind_ecc(ENGINE *e); --extern void uadk_e_destroy_ecc(void); --extern int uadk_e_is_env_enabled(const char *alg_name); --extern int uadk_e_set_env(const char *var_name, int numa_id); -+int uadk_e_bind_cipher(ENGINE *e); -+void uadk_e_destroy_cipher(void); -+int uadk_e_bind_digest(ENGINE *e); -+void uadk_e_destroy_digest(void); -+int uadk_e_bind_rsa(ENGINE *e); -+void uadk_e_destroy_rsa(void); -+int uadk_e_bind_dh(ENGINE *e); -+void uadk_e_destroy_dh(void); -+int uadk_e_bind_ecc(ENGINE *e); -+void uadk_e_destroy_ecc(void); -+int uadk_e_is_env_enabled(const char *alg_name); -+int uadk_e_set_env(const char *var_name, int numa_id); - #endif -diff --git a/src/uadk_async.h b/src/uadk_async.h -index d2a7e16..78f7a21 100644 ---- a/src/uadk_async.h -+++ b/src/uadk_async.h -@@ -65,12 +65,12 @@ struct async_poll_queue { - pthread_t thread_id; - }; - --extern int async_setup_async_event_notification(struct async_op *op); --extern int async_clear_async_event_notification(void); --extern int async_pause_job(void *ctx, struct async_op *op, enum task_type type, int id); --extern void async_register_poll_fn(int type, async_recv_t func); --extern void async_module_init(void); --extern int async_wake_job(ASYNC_JOB *job); --extern void async_free_poll_task(int id, bool is_cb); --extern int async_get_free_task(int *id); -+int async_setup_async_event_notification(struct async_op *op); -+int async_clear_async_event_notification(void); -+int async_pause_job(void *ctx, struct async_op *op, enum task_type type, int id); -+void async_register_poll_fn(int type, async_recv_t func); -+void async_module_init(void); -+int async_wake_job(ASYNC_JOB *job); -+void async_free_poll_task(int id, bool is_cb); -+int async_get_free_task(int *id); - #endif --- -2.27.0 - diff --git a/0050-uadk_engine-add-timeout-protection-mechanism-in-poll.patch b/0050-uadk_engine-add-timeout-protection-mechanism-in-poll.patch deleted file mode 100644 index 98980e3..0000000 --- a/0050-uadk_engine-add-timeout-protection-mechanism-in-poll.patch +++ /dev/null @@ -1,212 +0,0 @@ -From ba0a9ede4f72387f065e88c054e35dc6fdb59079 Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Sat, 23 Jul 2022 17:10:47 +0800 -Subject: [PATCH 50/57] uadk_engine: add timeout protection mechanism in poll - -Count the cycle times of poll. When the count times exceed the -maximum number, exit to prevent the task from timeout. - -Signed-off-by: Zhiqi Song ---- - src/uadk_cipher.c | 13 ++++++++----- - src/uadk_dh.c | 11 +++++++---- - src/uadk_digest.c | 11 +++++++---- - src/uadk_pkey.c | 13 ++++++++----- - src/uadk_rsa.c | 11 +++++++---- - 5 files changed, 37 insertions(+), 22 deletions(-) - -diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c -index 472c0ad..54d0a7d 100644 ---- a/src/uadk_cipher.c -+++ b/src/uadk_cipher.c -@@ -517,7 +517,7 @@ static int uadk_e_cipher_poll(void *ctx) - - do { - ret = wd_cipher_poll_ctx(idx, expt, &recv); -- if (recv >= expt) -+ if (recv == expt) - return 0; - else if (ret < 0 && ret != -EAGAIN) - return ret; -@@ -530,18 +530,21 @@ static int uadk_e_cipher_poll(void *ctx) - - static int uadk_e_cipher_env_poll(void *ctx) - { -+ __u64 rx_cnt = 0; - __u32 recv = 0; -- /* poll one packet currently */ -+ /* Poll one packet currently */ - int expt = 1; - int ret; - - do { - ret = wd_cipher_poll(expt, &recv); -- if (ret < 0) -+ if (ret < 0 || recv == expt) - return ret; -- } while (recv < expt); -+ } while (rx_cnt++ < ENGINE_RECV_MAX_CNT); - -- return ret; -+ fprintf(stderr, "failed to poll msg: timeout!\n"); -+ -+ return -ETIMEDOUT; - } - - static int uadk_e_wd_cipher_env_init(struct uacce_dev *dev) -diff --git a/src/uadk_dh.c b/src/uadk_dh.c -index 893b0f2..cf319e5 100644 ---- a/src/uadk_dh.c -+++ b/src/uadk_dh.c -@@ -212,7 +212,7 @@ static int uadk_e_dh_poll(void *ctx) - - do { - ret = wd_dh_poll_ctx(idx, expect, &recv); -- if (recv >= expect) -+ if (recv == expect) - return UADK_E_POLL_SUCCESS; - else if (ret < 0 && ret != -EAGAIN) - return ret; -@@ -273,6 +273,7 @@ static struct dh_res_config dh_res_config = { - - static int uadk_e_dh_env_poll(void *ctx) - { -+ __u64 rx_cnt = 0; - __u32 recv = 0; - /* Poll one packet currently */ - int expt = 1; -@@ -280,11 +281,13 @@ static int uadk_e_dh_env_poll(void *ctx) - - do { - ret = wd_dh_poll(expt, &recv); -- if (ret < 0) -+ if (ret < 0 || recv == expt) - return ret; -- } while (recv < expt); -+ } while (rx_cnt++ < ENGINE_RECV_MAX_CNT); - -- return ret; -+ fprintf(stderr, "failed to poll msg: timeout!\n"); -+ -+ return -ETIMEDOUT; - } - - static int uadk_e_wd_dh_env_init(struct uacce_dev *dev) -diff --git a/src/uadk_digest.c b/src/uadk_digest.c -index 8127373..853aa39 100644 ---- a/src/uadk_digest.c -+++ b/src/uadk_digest.c -@@ -343,7 +343,7 @@ static int uadk_e_digest_poll(void *ctx) - - do { - ret = wd_digest_poll_ctx(CTX_ASYNC, expt, &recv); -- if (recv >= expt) -+ if (recv == expt) - return 0; - else if (ret < 0 && ret != -EAGAIN) - return ret; -@@ -356,6 +356,7 @@ static int uadk_e_digest_poll(void *ctx) - - static int uadk_e_digest_env_poll(void *ctx) - { -+ __u64 rx_cnt = 0; - __u32 recv = 0; - /* Poll one packet currently */ - int expt = 1; -@@ -363,11 +364,13 @@ static int uadk_e_digest_env_poll(void *ctx) - - do { - ret = wd_digest_poll(expt, &recv); -- if (ret < 0) -+ if (ret < 0 || recv == expt) - return ret; -- } while (recv < expt); -+ } while (rx_cnt++ < ENGINE_RECV_MAX_CNT); - -- return ret; -+ fprintf(stderr, "failed to poll msg: timeout!\n"); -+ -+ return -ETIMEDOUT; - } - - static int uadk_e_wd_digest_env_init(struct uacce_dev *dev) -diff --git a/src/uadk_pkey.c b/src/uadk_pkey.c -index a0b74af..9a3a725 100644 ---- a/src/uadk_pkey.c -+++ b/src/uadk_pkey.c -@@ -110,7 +110,7 @@ static int uadk_ecc_poll(void *ctx) - - do { - ret = wd_ecc_poll_ctx(CTX_ASYNC, expt, &recv); -- if (recv >= expt) -+ if (recv == expt) - return 0; - else if (ret < 0 && ret != -EAGAIN) - return ret; -@@ -143,18 +143,21 @@ int uadk_e_ecc_get_numa_id(void) - - static int uadk_e_ecc_env_poll(void *ctx) - { -+ __u64 rx_cnt = 0; - __u32 recv = 0; -- /* poll one packet currently */ -+ /* Poll one packet currently */ - int expt = 1; - int ret; - - do { - ret = wd_ecc_poll(expt, &recv); -- if (ret < 0) -+ if (ret < 0 || recv == expt) - return ret; -- } while (recv < expt); -+ } while (rx_cnt++ < ENGINE_RECV_MAX_CNT); - -- return ret; -+ fprintf(stderr, "failed to poll msg: timeout!\n"); -+ -+ return -ETIMEDOUT; - } - - static int uadk_e_wd_ecc_env_init(struct uacce_dev *dev) -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index 29b2521..a74343f 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -663,7 +663,7 @@ static int uadk_e_rsa_poll(void *ctx) - - do { - ret = wd_rsa_poll_ctx(CTX_ASYNC, expt, &recv); -- if (recv >= expt) -+ if (recv == expt) - return UADK_E_POLL_SUCCESS; - else if (ret < 0 && ret != -EAGAIN) - return ret; -@@ -689,6 +689,7 @@ static struct rsa_res_config rsa_res_config = { - - static int uadk_e_rsa_env_poll(void *ctx) - { -+ __u64 rx_cnt = 0; - __u32 recv = 0; - /* Poll one packet currently */ - int expt = 1; -@@ -696,11 +697,13 @@ static int uadk_e_rsa_env_poll(void *ctx) - - do { - ret = wd_rsa_poll(expt, &recv); -- if (ret < 0) -+ if (ret < 0 || recv == expt) - return ret; -- } while (recv < expt); -+ } while (rx_cnt++ < ENGINE_RECV_MAX_CNT); - -- return ret; -+ fprintf(stderr, "failed to poll msg: timeout!\n"); -+ -+ return -ETIMEDOUT; - } - - static int uadk_e_wd_rsa_env_init(struct uacce_dev *dev) --- -2.27.0 - diff --git a/0051-rsa-cleanup-redundant-BN-operation.patch b/0051-rsa-cleanup-redundant-BN-operation.patch deleted file mode 100644 index 3d2e807..0000000 --- a/0051-rsa-cleanup-redundant-BN-operation.patch +++ /dev/null @@ -1,272 +0,0 @@ -From 25b026f401195e0385fc575c51752e1c0c731394 Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Sat, 23 Jul 2022 17:13:09 +0800 -Subject: [PATCH 51/57] rsa: cleanup redundant BN operation - -Remove redundant codes for big number and rsa crt -mode judgment. - -Signed-off-by: Zhiqi Song ---- - src/uadk_rsa.c | 92 ++++++++++++++++++++++---------------------------- - 1 file changed, 40 insertions(+), 52 deletions(-) - -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index a74343f..f95632b 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -871,8 +871,8 @@ static struct uadk_rsa_sess *rsa_get_eng_session(RSA *rsa, unsigned int bits, - int is_crt) - { - unsigned int key_size = bits >> BIT_BYTES_SHIFT; -- struct uadk_rsa_sess *rsa_sess; - struct sched_params params = {0}; -+ struct uadk_rsa_sess *rsa_sess; - - rsa_sess = rsa_new_eng_session(rsa); - if (!rsa_sess) -@@ -882,11 +882,7 @@ static struct uadk_rsa_sess *rsa_get_eng_session(RSA *rsa, unsigned int bits, - rsa_sess->setup.key_bits = key_size << BIT_BYTES_SHIFT; - params.numa_id = g_rsa_res.numa_id; - rsa_sess->setup.sched_param = ¶ms; -- -- if (is_crt) -- rsa_sess->setup.is_crt = IS_SET; -- else -- rsa_sess->setup.is_crt = UN_SET; -+ rsa_sess->setup.is_crt = is_crt; - - rsa_sess->sess = wd_rsa_alloc_sess(&rsa_sess->setup); - if (!rsa_sess->sess) { -@@ -1377,10 +1373,8 @@ static int uadk_e_rsa_keygen(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb) - - ret = rsa_get_keygen_param(&rsa_sess->req, rsa_sess->sess, - rsa, bn_param); -- if (!ret) { -+ if (!ret) - ret = UADK_DO_SOFT; -- goto free_kg_in_out; -- } - - free_kg_in_out: - rsa_free_keygen_data(rsa_sess); -@@ -1398,11 +1392,11 @@ exe_soft: - static int uadk_e_rsa_public_encrypt(int flen, const unsigned char *from, - unsigned char *to, RSA *rsa, int padding) - { -+ struct rsa_pubkey_param *pub_enc = NULL; - struct uadk_rsa_sess *rsa_sess = NULL; -- struct rsa_pubkey_param *pub = NULL; - unsigned char *from_buf = NULL; - int num_bytes, is_crt, ret; -- BIGNUM *ret_bn = NULL; -+ BIGNUM *enc_bn = NULL; - - ret = check_rsa_input_para(flen, from, to, rsa); - if (!ret || ret == SOFT) -@@ -1412,7 +1406,7 @@ static int uadk_e_rsa_public_encrypt(int flen, const unsigned char *from, - if (ret) - goto exe_soft; - -- ret = rsa_pkey_param_alloc(&pub, NULL); -+ ret = rsa_pkey_param_alloc(&pub_enc, NULL); - if (ret == -ENOMEM) - goto exe_soft; - -@@ -1424,7 +1418,7 @@ static int uadk_e_rsa_public_encrypt(int flen, const unsigned char *from, - goto free_pkey; - } - -- ret = rsa_create_pub_bn_ctx(rsa, pub, &from_buf, &num_bytes); -+ ret = rsa_create_pub_bn_ctx(rsa, pub_enc, &from_buf, &num_bytes); - if (ret <= 0 || flen > num_bytes) { - ret = UADK_DO_SOFT; - goto free_sess; -@@ -1436,7 +1430,7 @@ static int uadk_e_rsa_public_encrypt(int flen, const unsigned char *from, - goto free_buf; - } - -- ret = rsa_fill_pubkey(pub, rsa_sess, from_buf, to); -+ ret = rsa_fill_pubkey(pub_enc, rsa_sess, from_buf, to); - if (!ret) { - ret = UADK_DO_SOFT; - goto free_buf; -@@ -1448,27 +1442,25 @@ static int uadk_e_rsa_public_encrypt(int flen, const unsigned char *from, - goto free_buf; - } - -- ret_bn = BN_bin2bn((const unsigned char *)rsa_sess->req.dst, -+ enc_bn = BN_bin2bn((const unsigned char *)rsa_sess->req.dst, - rsa_sess->req.dst_bytes, NULL); -- if (!ret_bn) { -+ if (!enc_bn) { - ret = UADK_DO_SOFT; - goto free_buf; - } - -- ret = BN_bn2binpad(ret_bn, to, num_bytes); -- if (ret == -1) { -+ ret = BN_bn2binpad(enc_bn, to, num_bytes); -+ if (ret == -1) - ret = UADK_DO_SOFT; -- goto free_bn; -- } - --free_bn: -- BN_free(ret_bn); -+ BN_free(enc_bn); -+ - free_buf: - rsa_free_pub_bn_ctx(&from_buf); - free_sess: - rsa_free_eng_session(rsa_sess); - free_pkey: -- rsa_pkey_param_free(&pub, NULL); -+ rsa_pkey_param_free(&pub_enc, NULL); - if (ret != UADK_DO_SOFT) - return ret; - exe_soft: -@@ -1484,7 +1476,7 @@ static int uadk_e_rsa_private_decrypt(int flen, const unsigned char *from, - unsigned char *from_buf = NULL; - struct uadk_rsa_sess *rsa_sess; - int num_bytes, len, ret; -- BIGNUM *ret_bn = NULL; -+ BIGNUM *dec_bn = NULL; - - ret = check_rsa_input_para(flen, from, to, rsa); - if (!ret || ret == SOFT) -@@ -1526,27 +1518,25 @@ static int uadk_e_rsa_private_decrypt(int flen, const unsigned char *from, - goto free_buf; - } - -- ret_bn = BN_bin2bn((const unsigned char *)rsa_sess->req.dst, -+ dec_bn = BN_bin2bn((const unsigned char *)rsa_sess->req.dst, - rsa_sess->req.dst_bytes, NULL); -- if (!ret_bn) { -+ if (!dec_bn) { - ret = UADK_DO_SOFT; - goto free_buf; - } - -- len = BN_bn2binpad(ret_bn, from_buf, num_bytes); -+ len = BN_bn2binpad(dec_bn, from_buf, num_bytes); - if (!len) { - ret = UADK_DO_SOFT; -- goto free_bn; -+ goto free_dec_bn; - } - - ret = check_rsa_pridec_padding(to, num_bytes, from_buf, len, padding); -- if (!ret) { -+ if (!ret) - ret = UADK_DO_SOFT; -- goto free_bn; -- } - --free_bn: -- BN_free(ret_bn); -+free_dec_bn: -+ BN_free(dec_bn); - free_buf: - rsa_free_pri_bn_ctx(&from_buf); - free_sess: -@@ -1567,7 +1557,7 @@ static int uadk_e_rsa_private_sign(int flen, const unsigned char *from, - struct uadk_rsa_sess *rsa_sess = NULL; - struct rsa_prikey_param *pri = NULL; - unsigned char *from_buf = NULL; -- BIGNUM *ret_bn = NULL; -+ BIGNUM *sign_bn = NULL; - BIGNUM *to_bn = NULL; - BIGNUM *res = NULL; - int num_bytes, ret; -@@ -1616,9 +1606,9 @@ static int uadk_e_rsa_private_sign(int flen, const unsigned char *from, - goto free_buf; - } - -- ret_bn = BN_bin2bn((const unsigned char *)rsa_sess->req.dst, -+ sign_bn = BN_bin2bn((const unsigned char *)rsa_sess->req.dst, - rsa_sess->req.dst_bytes, NULL); -- if (!ret_bn) { -+ if (!sign_bn) { - ret = UADK_DO_SOFT; - goto free_buf; - } -@@ -1626,10 +1616,10 @@ static int uadk_e_rsa_private_sign(int flen, const unsigned char *from, - to_bn = BN_bin2bn(from_buf, num_bytes, NULL); - if (!to_bn) { - ret = UADK_DO_SOFT; -- goto free_ret_bn; -+ goto free_sign_bn; - } - -- ret = rsa_get_sign_res(padding, to_bn, pri->n, ret_bn, &res); -+ ret = rsa_get_sign_res(padding, to_bn, pri->n, sign_bn, &res); - if (!ret) { - ret = UADK_DO_SOFT; - goto free_to_bn; -@@ -1639,8 +1629,8 @@ static int uadk_e_rsa_private_sign(int flen, const unsigned char *from, - - free_to_bn: - BN_free(to_bn); --free_ret_bn: -- BN_free(ret_bn); -+free_sign_bn: -+ BN_free(sign_bn); - free_buf: - rsa_free_pri_bn_ctx(&from_buf); - free_sess: -@@ -1662,7 +1652,7 @@ static int uadk_e_rsa_public_verify(int flen, const unsigned char *from, - struct rsa_pubkey_param *pub = NULL; - int num_bytes, is_crt, len, ret; - unsigned char *from_buf = NULL; -- BIGNUM *ret_bn = NULL; -+ BIGNUM *verify_bn = NULL; - - ret = check_rsa_input_para(flen, from, to, rsa); - if (!ret) -@@ -1705,33 +1695,31 @@ static int uadk_e_rsa_public_verify(int flen, const unsigned char *from, - goto free_buf; - } - -- ret_bn = BN_bin2bn((const unsigned char *)rsa_sess->req.dst, -+ verify_bn = BN_bin2bn((const unsigned char *)rsa_sess->req.dst, - rsa_sess->req.dst_bytes, NULL); -- if (!ret_bn) { -+ if (!verify_bn) { - ret = UADK_DO_SOFT; - goto free_buf; - } - -- ret = rsa_get_verify_res(padding, pub->n, ret_bn); -+ ret = rsa_get_verify_res(padding, pub->n, verify_bn); - if (!ret) { - ret = UADK_DO_SOFT; -- goto free_bn; -+ goto free_verify_bn; - } - -- len = BN_bn2binpad(ret_bn, from_buf, num_bytes); -+ len = BN_bn2binpad(verify_bn, from_buf, num_bytes); - if (!len) { - ret = UADK_DO_SOFT; -- goto free_bn; -+ goto free_verify_bn; - } - - ret = check_rsa_pubdec_padding(to, num_bytes, from_buf, len, padding); -- if (!ret) { -+ if (!ret) - ret = UADK_DO_SOFT; -- goto free_bn; -- } - --free_bn: -- BN_free(ret_bn); -+free_verify_bn: -+ BN_free(verify_bn); - free_buf: - rsa_free_pub_bn_ctx(&from_buf); - free_sess: --- -2.27.0 - diff --git a/0052-rsa-bugfix-memory-leak-in-genkey-process.patch b/0052-rsa-bugfix-memory-leak-in-genkey-process.patch deleted file mode 100644 index e4b62d9..0000000 --- a/0052-rsa-bugfix-memory-leak-in-genkey-process.patch +++ /dev/null @@ -1,189 +0,0 @@ -From 8d27c38b9bbf0dee3ba17aac4d1bf9529bdafdea Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Sat, 23 Jul 2022 17:15:05 +0800 -Subject: [PATCH 52/57] rsa: bugfix memory leak in genkey process - -The process of releasing keygen parameter is supplemented: -When an abnormal situation occurs, uadk engine needs to switch -to software keygen function, so we need to free BN ctx we alloced -before. But in normal situation, the BN ctx should be freed by -OpenSSL tools or users, because the OpenSSL tool, for example, -genrsa, has implemented the free operation, we should not free -it again. - -Signed-off-by: Zhiqi Song ---- - src/e_uadk.c | 3 +-- - src/uadk_rsa.c | 57 ++++++++++++++++++++++++++------------------------ - 2 files changed, 31 insertions(+), 29 deletions(-) - -diff --git a/src/e_uadk.c b/src/e_uadk.c -index 58a10de..23fe0f2 100644 ---- a/src/e_uadk.c -+++ b/src/e_uadk.c -@@ -333,8 +333,7 @@ static void bind_fn_uadk_alg(ENGINE *e) - } - - /* -- * This stuff is needed if this ENGINE is being -- * compiled into a self-contained shared-library. -+ * Connect uadk_engine to OpenSSL engine library. - */ - static int bind_fn(ENGINE *e, const char *id) - { -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index f95632b..5b23dab 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -968,15 +968,14 @@ static int rsa_fill_prikey(RSA *rsa, struct uadk_rsa_sess *rsa_sess, - return UADK_E_SUCCESS; - } - --static int rsa_get_keygen_param(struct wd_rsa_req *req, -- handle_t ctx, RSA *rsa, -- struct rsa_keygen_param_bn *bn_param) -+static int rsa_get_keygen_param(struct wd_rsa_req *req, handle_t ctx, RSA *rsa, -+ struct rsa_keygen_param_bn *bn_param, BN_CTX **bn_ctx_in) - { - struct wd_rsa_kg_out *out = (struct wd_rsa_kg_out *)req->dst; - struct wd_dtb wd_d, wd_n, wd_qinv, wd_dq, wd_dp; - BIGNUM *dmp1, *dmq1, *iqmp, *n, *d; - unsigned int key_bits, key_size; -- BN_CTX *bn_ctx; -+ BN_CTX *bn_ctx = *bn_ctx_in; - - key_bits = wd_rsa_get_key_bits(ctx); - if (!key_bits) -@@ -986,30 +985,25 @@ static int rsa_get_keygen_param(struct wd_rsa_req *req, - wd_rsa_get_kg_out_params(out, &wd_d, &wd_n); - wd_rsa_get_kg_out_crt_params(out, &wd_qinv, &wd_dq, &wd_dp); - -- bn_ctx = BN_CTX_new(); -- if (!bn_ctx) -- return UADK_E_FAIL; -- -- BN_CTX_start(bn_ctx); - dmp1 = BN_CTX_get(bn_ctx); - if (!dmp1) -- goto free_bn_ctx; -+ return UADK_E_FAIL; - - dmq1 = BN_CTX_get(bn_ctx); - if (!dmq1) -- goto free_bn_ctx; -+ return UADK_E_FAIL; - - iqmp = BN_CTX_get(bn_ctx); - if (!iqmp) -- goto free_bn_ctx; -+ return UADK_E_FAIL; - - n = BN_CTX_get(bn_ctx); - if (!n) -- goto free_bn_ctx; -+ return UADK_E_FAIL; - - d = BN_CTX_get(bn_ctx); - if (!d) -- goto free_bn_ctx; -+ return UADK_E_FAIL; - - BN_bin2bn((unsigned char *)wd_d.data, key_size, d); - BN_bin2bn((unsigned char *)wd_n.data, key_size, n); -@@ -1020,15 +1014,9 @@ static int rsa_get_keygen_param(struct wd_rsa_req *req, - if (!(RSA_set0_key(rsa, n, bn_param->e, d) && - RSA_set0_factors(rsa, bn_param->p, bn_param->q) && - RSA_set0_crt_params(rsa, dmp1, dmq1, iqmp))) -- goto free_bn_ctx; -+ return UADK_E_FAIL; - - return UADK_E_SUCCESS; -- --free_bn_ctx: -- BN_CTX_end(bn_ctx); -- BN_CTX_free(bn_ctx); -- -- return UADK_E_FAIL; - } - - static void uadk_e_rsa_cb(void *req_t) -@@ -1179,7 +1167,7 @@ static void rsa_free_keygen_data(struct uadk_rsa_sess *rsa_sess) - - static int rsa_keygen_param_alloc(struct rsa_keygen_param **keygen_param, - struct rsa_keygen_param_bn **keygen_bn_param, -- struct rsa_keypair **key_pair) -+ struct rsa_keypair **key_pair, BN_CTX **bn_ctx_in) - { - BN_CTX *bn_ctx; - -@@ -1201,6 +1189,8 @@ static int rsa_keygen_param_alloc(struct rsa_keygen_param **keygen_param, - goto free_key_pair; - - BN_CTX_start(bn_ctx); -+ *bn_ctx_in = bn_ctx; -+ - (*keygen_bn_param)->e = BN_CTX_get(bn_ctx); - if (!(*keygen_bn_param)->e) - goto free_bn_ctx; -@@ -1230,8 +1220,21 @@ err: - - static void rsa_keygen_param_free(struct rsa_keygen_param **keygen_param, - struct rsa_keygen_param_bn **keygen_bn_param, -- struct rsa_keypair **key_pair) -+ struct rsa_keypair **key_pair, BN_CTX **bn_ctx, -+ int free_bn_ctx_tag) - { -+ /* -+ * When an abnormal situation occurs, uadk engine needs -+ * to switch to software keygen function, so we need to -+ * free BN ctx we alloced before. But in normal situation, -+ * the BN ctx should be freed by OpenSSL tools or users. -+ * Therefore, we use a tag to distinguish these cases. -+ */ -+ if (free_bn_ctx_tag == UADK_DO_SOFT) { -+ BN_CTX_end(*bn_ctx); -+ BN_CTX_free(*bn_ctx); -+ } -+ - OPENSSL_free(*keygen_bn_param); - OPENSSL_free(*keygen_param); - OPENSSL_free(*key_pair); -@@ -1327,6 +1330,7 @@ static int uadk_e_rsa_keygen(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb) - struct rsa_keygen_param_bn *bn_param = NULL; - struct uadk_rsa_sess *rsa_sess = NULL; - struct rsa_keypair *key_pair = NULL; -+ BN_CTX *bn_ctx = NULL; - int is_crt = 1; - int ret; - -@@ -1338,7 +1342,7 @@ static int uadk_e_rsa_keygen(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb) - if (ret) - goto exe_soft; - -- ret = rsa_keygen_param_alloc(&keygen_param, &bn_param, &key_pair); -+ ret = rsa_keygen_param_alloc(&keygen_param, &bn_param, &key_pair, &bn_ctx); - if (ret == -ENOMEM) - goto exe_soft; - -@@ -1371,8 +1375,7 @@ static int uadk_e_rsa_keygen(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb) - goto free_kg_in_out; - } - -- ret = rsa_get_keygen_param(&rsa_sess->req, rsa_sess->sess, -- rsa, bn_param); -+ ret = rsa_get_keygen_param(&rsa_sess->req, rsa_sess->sess, rsa, bn_param, &bn_ctx); - if (!ret) - ret = UADK_DO_SOFT; - -@@ -1381,7 +1384,7 @@ free_kg_in_out: - free_sess: - rsa_free_eng_session(rsa_sess); - free_keygen: -- rsa_keygen_param_free(&keygen_param, &bn_param, &key_pair); -+ rsa_keygen_param_free(&keygen_param, &bn_param, &key_pair, &bn_ctx, ret); - if (ret != UADK_DO_SOFT) - return ret; - exe_soft: --- -2.27.0 - diff --git a/0053-rsa-remove-unused-software-method.patch b/0053-rsa-remove-unused-software-method.patch deleted file mode 100644 index 7cac77f..0000000 --- a/0053-rsa-remove-unused-software-method.patch +++ /dev/null @@ -1,97 +0,0 @@ -From ff703a9aa6a0a2dada51b7bf88cc9e1a8ce2d6cd Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Sat, 23 Jul 2022 17:16:59 +0800 -Subject: [PATCH 53/57] rsa: remove unused software method - -Switching to software methods in abnormal scenarios has been -implemented in other functions, uadk_e_get_rsa_sw_methods() -is actually unused, so we remove it. - -Signed-off-by: Zhiqi Song ---- - src/uadk_rsa.c | 49 +++++-------------------------------------------- - 1 file changed, 5 insertions(+), 44 deletions(-) - -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index 5b23dab..7983bc0 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -53,7 +53,6 @@ - #define ENV_ENABLED 1 - - static RSA_METHOD *rsa_hw_meth; --static RSA_METHOD *rsa_sw_meth; - - struct bignum_st { - BN_ULONG *d; -@@ -1737,25 +1736,11 @@ exe_soft: - (flen, from, to, rsa, padding); - } - --static RSA_METHOD *uadk_e_get_rsa_sw_methods(void) --{ -- /* meth: default rsa software method */ -- const RSA_METHOD *meth = RSA_PKCS1_OpenSSL(); -- -- rsa_sw_meth = RSA_meth_new("rsa soft method", 0); -- (void)RSA_meth_set_pub_enc(rsa_sw_meth, RSA_meth_get_pub_enc(meth)); -- (void)RSA_meth_set_priv_enc(rsa_sw_meth, RSA_meth_get_priv_enc(meth)); -- (void)RSA_meth_set_pub_dec(rsa_sw_meth, RSA_meth_get_pub_dec(meth)); -- (void)RSA_meth_set_priv_dec(rsa_sw_meth, RSA_meth_get_priv_dec(meth)); -- (void)RSA_meth_set_keygen(rsa_sw_meth, uadk_e_soft_rsa_keygen); -- (void)RSA_meth_set_mod_exp(rsa_sw_meth, RSA_meth_get_mod_exp(meth)); -- (void)RSA_meth_set_bn_mod_exp(rsa_sw_meth, -- RSA_meth_get_bn_mod_exp(meth)); -- -- return rsa_sw_meth; --} -- --static RSA_METHOD *uadk_e_get_rsa_hw_methods(void) -+/** -+ * uadk_get_rsa_method() - Set rsa hardware methods of the RSA implementation which -+ * can be called from ENGINE structure. -+ */ -+static RSA_METHOD *uadk_e_get_rsa_methods(void) - { - if (rsa_hw_meth) - return rsa_hw_meth; -@@ -1780,36 +1765,12 @@ static RSA_METHOD *uadk_e_get_rsa_hw_methods(void) - return rsa_hw_meth; - } - --/** -- * uadk_get_rsa_method() - Set rsa methods of the RSA implementation which -- * can be called from ENGINE structure. -- */ --static RSA_METHOD *uadk_e_get_rsa_methods(void) --{ -- struct uacce_dev *dev; -- -- dev = wd_get_accel_dev("rsa"); -- if (!dev) -- return uadk_e_get_rsa_sw_methods(); -- -- free(dev); -- return uadk_e_get_rsa_hw_methods(); --} -- - static void uadk_e_delete_rsa_meth(void) - { -- if (!rsa_hw_meth && !rsa_sw_meth) -- return; -- - if (rsa_hw_meth) { - RSA_meth_free(rsa_hw_meth); - rsa_hw_meth = NULL; - } -- -- if (rsa_sw_meth) { -- RSA_meth_free(rsa_sw_meth); -- rsa_sw_meth = NULL; -- } - } - - /** --- -2.27.0 - diff --git a/0054-doc-Modify-maintainers.patch b/0054-doc-Modify-maintainers.patch deleted file mode 100644 index 7038758..0000000 --- a/0054-doc-Modify-maintainers.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 9dd29d1cfd3b3038bc8a347c51f1f176c28ec0b5 Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Mon, 25 Jul 2022 11:42:11 +0800 -Subject: [PATCH 54/57] doc: Modify maintainers - -Personnel change, replace a maintainer. - -Signed-off-by: Zhiqi Song ---- - docs/maintenance.md | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/docs/maintenance.md b/docs/maintenance.md -index 50ed1fe..1a563ce 100644 ---- a/docs/maintenance.md -+++ b/docs/maintenance.md -@@ -28,5 +28,5 @@ sudo test/sanity_test.sh - ``` - Zhangfei Gao - Zhou Wang --Hui Tang -+Zhiqi Song - ``` --- -2.27.0 - diff --git a/0055-rsa-modify-the-default-algorithm-of-keygen-soft-algo.patch b/0055-rsa-modify-the-default-algorithm-of-keygen-soft-algo.patch deleted file mode 100644 index 0b7c0bf..0000000 --- a/0055-rsa-modify-the-default-algorithm-of-keygen-soft-algo.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 623c8687b64381b0dc454ea2d2c81ee5f6bfdbc7 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Tue, 26 Jul 2022 10:39:01 +0800 -Subject: [PATCH 55/57] rsa: modify the default algorithm of keygen soft - algorithm - -When the hardware algorithm execution fails, the engine needs to -switch to the soft algorithm execution, and the callback needs to -be modified to the soft algorithm to prevent it from being -re-transferred to the hardware interface. - -Signed-off-by: Weili Qian ---- - src/uadk_rsa.c | 11 +++++++++++ - 1 file changed, 11 insertions(+) - -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index 7983bc0..03f2ce5 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -140,6 +140,8 @@ enum { - MAX_CODE, - }; - -+static int uadk_e_rsa_keygen(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); -+ - static int rsa_check_bit_useful(const int bits, int flen) - { - if (flen > bits) -@@ -1100,10 +1102,19 @@ err: - - static int uadk_e_soft_rsa_keygen(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb) - { -+ const RSA_METHOD *default_meth = RSA_PKCS1_OpenSSL(); - int ret; - -+ if (!default_meth) { -+ fprintf(stderr, "failed to get soft method.\n"); -+ return UADK_E_FAIL; -+ } -+ - UNUSED(cb); -+ (void)RSA_meth_set_keygen(rsa_hw_meth, -+ RSA_meth_get_keygen(default_meth)); - ret = RSA_generate_key_ex(rsa, bits, e, NULL); -+ (void)RSA_meth_set_keygen(rsa_hw_meth, uadk_e_rsa_keygen); - - return ret; - } --- -2.27.0 - diff --git a/0056-engine-initialize-resources-only-once.patch b/0056-engine-initialize-resources-only-once.patch deleted file mode 100644 index eb0f202..0000000 --- a/0056-engine-initialize-resources-only-once.patch +++ /dev/null @@ -1,224 +0,0 @@ -From 0245d700da510dd54926eab3fb9377bde991024f Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Tue, 26 Jul 2022 10:54:03 +0800 -Subject: [PATCH 56/57] engine: initialize resources only once - -If multiple threads load the engine repeatedly, the -poll_queue and global locks in the algorithm API are -repeatedly initialized. As a result, tasks of other -threads are abnormal. - -Therefore, this patch moves resource initialization -to the function 'uadk_init' and only initialize once. - -Signed-off-by: Weili Qian ---- - src/e_uadk.c | 37 +++++++++++++++++++++++++++++++++---- - src/uadk.h | 5 +++++ - src/uadk_cipher.c | 7 +++++-- - src/uadk_dh.c | 7 +++++-- - src/uadk_digest.c | 7 +++++-- - src/uadk_pkey.c | 7 +++++-- - src/uadk_rsa.c | 6 ++++-- - 7 files changed, 62 insertions(+), 14 deletions(-) - -diff --git a/src/e_uadk.c b/src/e_uadk.c -index 23fe0f2..1b95284 100644 ---- a/src/e_uadk.c -+++ b/src/e_uadk.c -@@ -43,6 +43,8 @@ static int uadk_digest; - static int uadk_rsa; - static int uadk_dh; - static int uadk_ecc; -+static int uadk_inited; -+static pthread_mutex_t uadk_engine_mutex = PTHREAD_MUTEX_INITIALIZER; - - #ifdef KAE - static int uadk_cipher_nosva; -@@ -219,12 +221,41 @@ static int uadk_destroy(ENGINE *e) - uadk_e_destroy_ecc(); - if (uadk_dh) - uadk_e_destroy_dh(); -+ -+ pthread_mutex_lock(&uadk_engine_mutex); -+ uadk_inited = 0; -+ pthread_mutex_unlock(&uadk_engine_mutex); -+ - return 1; - } - -- - static int uadk_init(ENGINE *e) - { -+ int ret; -+ -+ pthread_mutex_lock(&uadk_engine_mutex); -+ if (uadk_inited) { -+ pthread_mutex_unlock(&uadk_engine_mutex); -+ return 1; -+ } -+ -+ if (uadk_cipher || uadk_digest || uadk_rsa || uadk_dh || uadk_ecc) -+ async_module_init(); -+ -+ if (uadk_digest) -+ uadk_e_digest_lock_init(); -+ if (uadk_cipher) -+ uadk_e_cipher_lock_init(); -+ if (uadk_rsa) -+ uadk_e_rsa_lock_init(); -+ if (uadk_dh) -+ uadk_e_dh_lock_init(); -+ if (uadk_ecc) -+ uadk_e_ecc_lock_init(); -+ -+ uadk_inited = 1; -+ pthread_mutex_unlock(&uadk_engine_mutex); -+ - return 1; - } - -@@ -360,10 +391,8 @@ static int bind_fn(ENGINE *e, const char *id) - #endif - bind_fn_uadk_alg(e); - -- if (uadk_cipher || uadk_digest || uadk_rsa || uadk_dh || uadk_ecc) { -- async_module_init(); -+ if (uadk_cipher || uadk_digest || uadk_rsa || uadk_dh || uadk_ecc) - pthread_atfork(NULL, NULL, engine_init_child_at_fork_handler); -- } - - ret = ENGINE_set_ctrl_function(e, uadk_engine_ctrl); - if (ret != 1) { -diff --git a/src/uadk.h b/src/uadk.h -index 0188f0b..cd3447c 100644 ---- a/src/uadk.h -+++ b/src/uadk.h -@@ -44,4 +44,9 @@ int uadk_e_bind_ecc(ENGINE *e); - void uadk_e_destroy_ecc(void); - int uadk_e_is_env_enabled(const char *alg_name); - int uadk_e_set_env(const char *var_name, int numa_id); -+void uadk_e_ecc_lock_init(void); -+void uadk_e_rsa_lock_init(void); -+void uadk_e_dh_lock_init(void); -+void uadk_e_cipher_lock_init(void); -+void uadk_e_digest_lock_init(void); - #endif -diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c -index 54d0a7d..c5bc7af 100644 ---- a/src/uadk_cipher.c -+++ b/src/uadk_cipher.c -@@ -1076,8 +1076,6 @@ int uadk_e_bind_cipher(ENGINE *e) - if (platform > KUNPENG920) - bind_v3_cipher(); - -- pthread_spin_init(&engine.lock, PTHREAD_PROCESS_PRIVATE); -- - return ENGINE_set_ciphers(e, uadk_e_engine_ciphers); - } - -@@ -1160,3 +1158,8 @@ void uadk_e_destroy_cipher(void) - if (platform > KUNPENG920) - destroy_v3_cipher(); - } -+ -+void uadk_e_cipher_lock_init(void) -+{ -+ pthread_spin_init(&engine.lock, PTHREAD_PROCESS_PRIVATE); -+} -diff --git a/src/uadk_dh.c b/src/uadk_dh.c -index cf319e5..37f84e9 100644 ---- a/src/uadk_dh.c -+++ b/src/uadk_dh.c -@@ -902,8 +902,6 @@ static void uadk_e_delete_dh_meth(void) - - int uadk_e_bind_dh(ENGINE *e) - { -- pthread_spin_init(&g_dh_res.lock, PTHREAD_PROCESS_PRIVATE); -- - return ENGINE_set_DH(e, uadk_e_get_dh_methods()); - } - -@@ -913,3 +911,8 @@ void uadk_e_destroy_dh(void) - uadk_e_delete_dh_meth(); - uadk_e_wd_dh_uninit(); - } -+ -+void uadk_e_dh_lock_init(void) -+{ -+ pthread_spin_init(&g_dh_res.lock, PTHREAD_PROCESS_PRIVATE); -+} -diff --git a/src/uadk_digest.c b/src/uadk_digest.c -index 853aa39..b2646cb 100644 ---- a/src/uadk_digest.c -+++ b/src/uadk_digest.c -@@ -804,6 +804,11 @@ do { \ - return 0; \ - } while (0) - -+void uadk_e_digest_lock_init(void) -+{ -+ pthread_spin_init(&engine.lock, PTHREAD_PROCESS_PRIVATE); -+} -+ - int uadk_e_bind_digest(ENGINE *e) - { - UADK_DIGEST_DESCR(md5, md5WithRSAEncryption, MD5_DIGEST_LENGTH, -@@ -849,8 +854,6 @@ int uadk_e_bind_digest(ENGINE *e) - uadk_e_digest_final, uadk_e_digest_cleanup, - uadk_e_digest_copy); - -- pthread_spin_init(&engine.lock, PTHREAD_PROCESS_PRIVATE); -- - return ENGINE_set_digests(e, uadk_engine_digests); - } - -diff --git a/src/uadk_pkey.c b/src/uadk_pkey.c -index 9a3a725..211f1cc 100644 ---- a/src/uadk_pkey.c -+++ b/src/uadk_pkey.c -@@ -615,6 +615,11 @@ static int uadk_ecc_bind_pmeth(ENGINE *e) - return ENGINE_set_pkey_meths(e, get_pkey_meths); - } - -+void uadk_e_ecc_lock_init(void) -+{ -+ pthread_spin_init(&ecc_res.lock, PTHREAD_PROCESS_PRIVATE); -+} -+ - int uadk_e_bind_ecc(ENGINE *e) - { - int ret; -@@ -631,8 +636,6 @@ int uadk_e_bind_ecc(ENGINE *e) - return ret; - } - -- pthread_spin_init(&ecc_res.lock, PTHREAD_PROCESS_PRIVATE); -- - return ret; - } - -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index 03f2ce5..ef1739d 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -1790,8 +1790,6 @@ static void uadk_e_delete_rsa_meth(void) - */ - int uadk_e_bind_rsa(ENGINE *e) - { -- pthread_spin_init(&g_rsa_res.lock, PTHREAD_PROCESS_PRIVATE); -- - return ENGINE_set_RSA(e, uadk_e_get_rsa_methods()); - } - -@@ -1802,3 +1800,7 @@ void uadk_e_destroy_rsa(void) - uadk_e_rsa_uninit(); - } - -+void uadk_e_rsa_lock_init(void) -+{ -+ pthread_spin_init(&g_rsa_res.lock, PTHREAD_PROCESS_PRIVATE); -+} --- -2.27.0 - diff --git a/0057-engine-fix-function-type.patch b/0057-engine-fix-function-type.patch deleted file mode 100644 index 7b7f386..0000000 --- a/0057-engine-fix-function-type.patch +++ /dev/null @@ -1,105 +0,0 @@ -From f43d50084550042f053de2dcce03d91d5f8b040a Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Tue, 26 Jul 2022 10:58:56 +0800 -Subject: [PATCH 57/57] engine: fix function type - -If return type of the function 'async_module_init' is void, -when function executes failed, the app continues to execute tasks. -The process will be abnormal. Change 'async_module_init' type to int. -If function executes failed, 0 is returned. - -Signed-off-by: Weili Qian ---- - src/e_uadk.c | 16 +++++++++++++--- - src/uadk_async.c | 9 +++++---- - src/uadk_async.h | 2 +- - 3 files changed, 19 insertions(+), 8 deletions(-) - -diff --git a/src/e_uadk.c b/src/e_uadk.c -index 1b95284..77612d7 100644 ---- a/src/e_uadk.c -+++ b/src/e_uadk.c -@@ -239,8 +239,14 @@ static int uadk_init(ENGINE *e) - return 1; - } - -- if (uadk_cipher || uadk_digest || uadk_rsa || uadk_dh || uadk_ecc) -- async_module_init(); -+ if (uadk_cipher || uadk_digest || uadk_rsa || uadk_dh || uadk_ecc) { -+ ret = async_module_init(); -+ if (!ret) { -+ pthread_mutex_unlock(&uadk_engine_mutex); -+ fprintf(stderr, "failed to init async module!\n"); -+ return 0; -+ } -+ } - - if (uadk_digest) - uadk_e_digest_lock_init(); -@@ -266,7 +272,11 @@ static int uadk_finish(ENGINE *e) - - static void engine_init_child_at_fork_handler(void) - { -- async_module_init(); -+ int ret; -+ -+ ret = async_module_init(); -+ if (!ret) -+ fprintf(stderr, "failed to init child async module!\n"); - } - - #ifdef KAE -diff --git a/src/uadk_async.c b/src/uadk_async.c -index 11d624c..3f2e1db 100644 ---- a/src/uadk_async.c -+++ b/src/uadk_async.c -@@ -336,7 +336,7 @@ static void *async_poll_process_func(void *args) - return NULL; - } - --void async_module_init(void) -+int async_module_init(void) - { - pthread_t thread_id; - pthread_attr_t thread_attr; -@@ -344,11 +344,11 @@ void async_module_init(void) - memset(&poll_queue, 0, sizeof(struct async_poll_queue)); - - if (pthread_mutex_init(&(poll_queue.async_task_mutex), NULL) < 0) -- return; -+ return 0; - - poll_queue.head = malloc(sizeof(struct async_poll_task) * ASYNC_QUEUE_TASK_NUM); - if (poll_queue.head == NULL) -- return; -+ return 0; - - memset(poll_queue.head, 0, - sizeof(struct async_poll_task) * ASYNC_QUEUE_TASK_NUM); -@@ -368,8 +368,9 @@ void async_module_init(void) - poll_queue.thread_id = thread_id; - OPENSSL_atexit(async_poll_task_free); - -- return; -+ return 1; - - err: - async_poll_task_free(); -+ return 0; - } -diff --git a/src/uadk_async.h b/src/uadk_async.h -index 78f7a21..9bae3f4 100644 ---- a/src/uadk_async.h -+++ b/src/uadk_async.h -@@ -69,7 +69,7 @@ int async_setup_async_event_notification(struct async_op *op); - int async_clear_async_event_notification(void); - int async_pause_job(void *ctx, struct async_op *op, enum task_type type, int id); - void async_register_poll_fn(int type, async_recv_t func); --void async_module_init(void); -+int async_module_init(void); - int async_wake_job(ASYNC_JOB *job); - void async_free_poll_task(int id, bool is_cb); - int async_get_free_task(int *id); --- -2.27.0 - diff --git a/0058-uadk_digest-fix-the-full-mac-buffer-length-as-doing-.patch b/0058-uadk_digest-fix-the-full-mac-buffer-length-as-doing-.patch deleted file mode 100644 index b19486b..0000000 --- a/0058-uadk_digest-fix-the-full-mac-buffer-length-as-doing-.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 36ea42a1d9556e937be5ebf47f41f66b51a29cb6 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Tue, 16 Aug 2022 09:57:18 +0800 -Subject: uadk_digest: fix the full mac buffer length as doing long hash - -Sha224 and Sha384 need full length mac buffer as doing long hash. - -Depends-on:uadk 802878d71999("digest: fix mac buffer len as long hash") -Signed-off-by: Kai Ye ---- - src/uadk_digest.c | 25 +++++++++++++++++++++++-- - 1 file changed, 23 insertions(+), 2 deletions(-) - -diff --git a/src/uadk_digest.c b/src/uadk_digest.c -index b2646cb..63887e7 100644 ---- a/src/uadk_digest.c -+++ b/src/uadk_digest.c -@@ -484,7 +484,7 @@ static void digest_priv_ctx_setup(struct digest_priv_ctx *priv, - { - priv->setup.alg = alg; - priv->setup.mode = mode; -- priv->req.out_buf_bytes = out_len; -+ priv->req.out_buf_bytes = MAX_DIGEST_LENGTH; - priv->req.out_bytes = out_len; - } - -@@ -543,15 +543,30 @@ soft_init: - return digest_soft_init(priv->soft_ctx, priv->e_nid); - } - -+static void digest_update_out_length(EVP_MD_CTX *ctx) -+{ -+ struct digest_priv_ctx *priv = -+ (struct digest_priv_ctx *)EVP_MD_CTX_md_data(ctx); -+ -+ /* Sha224 and Sha384 need full length mac buffer as doing long hash */ -+ if (priv->e_nid == NID_sha224) -+ priv->req.out_bytes = WD_DIGEST_SHA224_FULL_LEN; -+ -+ if (priv->e_nid == NID_sha384) -+ priv->req.out_bytes = WD_DIGEST_SHA384_FULL_LEN; -+} -+ - static int digest_update_inner(EVP_MD_CTX *ctx, const void *data, size_t data_len) - { - struct digest_priv_ctx *priv = -- (struct digest_priv_ctx *) EVP_MD_CTX_md_data(ctx); -+ (struct digest_priv_ctx *)EVP_MD_CTX_md_data(ctx); - const unsigned char *tmpdata = (const unsigned char *)data; - size_t left_len = data_len; - int copy_to_bufflen; - int ret; - -+ digest_update_out_length(ctx); -+ - priv->req.has_next = DIGEST_DOING; - - while (priv->last_update_bufflen + left_len > DIGEST_BLOCK_SIZE) { -@@ -708,6 +723,12 @@ static int uadk_e_digest_final(EVP_MD_CTX *ctx, unsigned char *digest) - priv->req.in_bytes = priv->last_update_bufflen; - priv->e_nid = EVP_MD_nid(EVP_MD_CTX_md(ctx)); - -+ if (priv->e_nid == NID_sha224) -+ priv->req.out_bytes = WD_DIGEST_SHA224_LEN; -+ -+ if (priv->e_nid == NID_sha384) -+ priv->req.out_bytes = WD_DIGEST_SHA384_LEN; -+ - ret = async_setup_async_event_notification(&op); - if (unlikely(!ret)) { - fprintf(stderr, "failed to setup async event notification.\n"); --- -1.8.3.1 - diff --git a/0059-uadk_utils-fix-x86-local-build.patch b/0059-uadk_utils-fix-x86-local-build.patch deleted file mode 100644 index e8673e6..0000000 --- a/0059-uadk_utils-fix-x86-local-build.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 06fd1fe00a03bfbc7430ec8e1b1f7356f47da55d Mon Sep 17 00:00:00 2001 -From: Zhangfei Gao -Date: Tue, 18 Oct 2022 15:39:11 +0800 -Subject: uadk_utils: fix x86 local build -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -On x86 local build: -autoreconf -i -./configure --libdir=/usr/local/lib/engines-1.1/ -make -j4 - -uadk_utils.c: In function ‘uadk_memcpy’: -uadk_utils.c:23:2: error: unknown register name ‘q1’ in ‘asm’ - __asm__ __volatile__( - ^ -uadk_utils.c:23:2: error: unknown register name ‘q0’ in ‘asm’ -uadk_utils.c:23:2: error: unknown register name ‘x14’ in ‘asm’ -uadk_utils.c:23:2: error: unknown register name ‘x5’ in ‘asm’ -uadk_utils.c:23:2: error: unknown register name ‘x4’ in ‘asm’ -uadk_utils.c:23:2: error: unknown register name ‘x3’ in ‘asm’ - -With this patch, x86 build is OK - -Signed-off-by: Zhangfei Gao ---- - src/uadk_utils.c | 11 +++++++++++ - 1 file changed, 11 insertions(+) - -diff --git a/src/uadk_utils.c b/src/uadk_utils.c -index 2b34b3a..275a124 100644 ---- a/src/uadk_utils.c -+++ b/src/uadk_utils.c -@@ -16,6 +16,8 @@ - */ - #include "uadk_utils.h" - -+#if defined(__AARCH64_CMODEL_SMALL__) && __AARCH64_CMODEL_SMALL__ -+ - #define UADK_MEM_IMPROVE_THRESHOLD 1024 - - static void *memcpy_large(void *dstpp, const void *srcpp, size_t len) -@@ -61,3 +63,12 @@ void *uadk_memcpy(void *dstpp, const void *srcpp, size_t len) - else - return memcpy(dstpp, srcpp, len); - } -+ -+#else -+ -+void *uadk_memcpy(void *dstpp, const void *srcpp, size_t len) -+{ -+ return memcpy(dstpp, srcpp, len); -+} -+ -+#endif --- -1.8.3.1 - diff --git a/0060-sm2-bugfix-about-segfault-in-sm2-ctrl-function.patch b/0060-sm2-bugfix-about-segfault-in-sm2-ctrl-function.patch deleted file mode 100644 index 8e0b7e3..0000000 --- a/0060-sm2-bugfix-about-segfault-in-sm2-ctrl-function.patch +++ /dev/null @@ -1,188 +0,0 @@ -From 8c4f478b1e8965e592467be92d042c8b00c8c426 Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Sat, 22 Oct 2022 15:14:03 +0800 -Subject: sm2: bugfix about segfault in sm2 ctrl function - -When there is no available instance of hpre device, the sm2_init() -in uadk_engine will failed, the setting of sched_init() will failed, -so sched_init() will be NULL. If the sm2_ctrl() function still call -the sm2_update_sess() in this situation, and make wd_ecc_alloc_sess() -to call sched_init(), there will be a segfault. - -The solution is to modify the status field of sm2_ctx, make the -variable 'init_status' to indicate the status of init operation: -'CTX_UNINIT' indicates the init operation has not been performed, -'CTX_INIT_SUCC' indicates the init operation has been succeeded, -'CTX_INIT_FAIL' indicates the init operation has been failed. - -The sm2_update_sess() will only be called if the 'init_status' is -'CTX_INIT_SUCC'. Then there will be no segfault. - -And when there is no available instance, it should switch to openssl -software method, so modify some return values to help finish this -process. - -Signed-off-by: Zhiqi Song ---- - src/uadk_sm2.c | 44 ++++++++++++++++++++++++++++++++------------ - 1 file changed, 32 insertions(+), 12 deletions(-) - -diff --git a/src/uadk_sm2.c b/src/uadk_sm2.c -index fcca9f2..8a9adca 100644 ---- a/src/uadk_sm2.c -+++ b/src/uadk_sm2.c -@@ -25,6 +25,12 @@ - #include "uadk.h" - #include "uadk_pkey.h" - -+enum { -+ CTX_INIT_FAIL = -1, -+ CTX_UNINIT, -+ CTX_INIT_SUCC -+}; -+ - typedef struct { - /* Key and paramgen group */ - EC_GROUP *gen_group; -@@ -43,7 +49,7 @@ struct sm2_ctx { - const BIGNUM *prikey; - const EC_POINT *pubkey; - BIGNUM *order; -- bool is_init; -+ int init_status; - }; - - typedef struct sm2_ciphertext { -@@ -165,6 +171,7 @@ static int sm2_update_sess(struct sm2_ctx *smctx) - - memset(&setup, 0, sizeof(setup)); - setup.alg = "sm2"; -+ - if (smctx->ctx.md) { - setup.hash.cb = compute_hash; - setup.hash.usr = (void *)smctx->ctx.md; -@@ -189,6 +196,7 @@ static int sm2_update_sess(struct sm2_ctx *smctx) - - if (smctx->sess) - wd_ecc_free_sess(smctx->sess); -+ - smctx->sess = sess; - smctx->prikey = NULL; - smctx->pubkey = NULL; -@@ -636,7 +644,7 @@ static int sm2_sign_check(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, - - if (!smctx || !smctx->sess) { - fprintf(stderr, "smctx or sess NULL\n"); -- return -EINVAL; -+ return UADK_DO_SOFT; - } - - if (sig_sz <= 0) { -@@ -676,7 +684,7 @@ static int sm2_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, - if (ret) - goto do_soft; - -- if (!smctx->is_init) { -+ if (smctx->init_status != CTX_INIT_SUCC) { - ret = UADK_DO_SOFT; - goto do_soft; - } -@@ -744,6 +752,13 @@ static int sm2_verify_check(EVP_PKEY_CTX *ctx, - const unsigned char *tbs, - size_t tbslen) - { -+ struct sm2_ctx *smctx = EVP_PKEY_CTX_get_data(ctx); -+ -+ if (!smctx || !smctx->sess) { -+ fprintf(stderr, "smctx or sess NULL\n"); -+ return UADK_DO_SOFT; -+ } -+ - if (tbslen > SM2_KEY_BYTES) - return UADK_DO_SOFT; - -@@ -772,7 +787,7 @@ static int sm2_verify(EVP_PKEY_CTX *ctx, - if (ret) - goto do_soft; - -- if (!smctx->is_init) { -+ if (smctx->init_status != CTX_INIT_SUCC) { - ret = UADK_DO_SOFT; - goto do_soft; - } -@@ -853,7 +868,7 @@ static int sm2_encrypt_check(EVP_PKEY_CTX *ctx, - - if (!smctx || !smctx->sess) { - fprintf(stderr, "smctx or sess NULL\n"); -- return 0; -+ return UADK_DO_SOFT; - } - - md = (smctx->ctx.md == NULL) ? EVP_sm3() : smctx->ctx.md; -@@ -897,7 +912,7 @@ static int sm2_encrypt(EVP_PKEY_CTX *ctx, - if (ret) - goto do_soft; - -- if (!smctx->is_init) { -+ if (smctx->init_status != CTX_INIT_SUCC) { - ret = UADK_DO_SOFT; - goto do_soft; - } -@@ -953,7 +968,7 @@ static int sm2_decrypt_check(EVP_PKEY_CTX *ctx, - - if (!smctx || !smctx->sess) { - fprintf(stderr, "smctx or sess NULL\n"); -- return -EINVAL; -+ return UADK_DO_SOFT; - } - - md = (smctx->ctx.md == NULL) ? EVP_sm3() : smctx->ctx.md; -@@ -1038,7 +1053,7 @@ static int sm2_decrypt(EVP_PKEY_CTX *ctx, - if (ret) - goto do_soft; - -- if (!smctx->is_init) { -+ if (smctx->init_status != CTX_INIT_SUCC) { - ret = UADK_DO_SOFT; - goto do_soft; - } -@@ -1124,18 +1139,18 @@ static int sm2_init(EVP_PKEY_CTX *ctx) - ret = uadk_init_ecc(); - if (ret) { - fprintf(stderr, "failed to uadk_init_ecc, ret = %d\n", ret); -- smctx->is_init = false; -+ smctx->init_status = CTX_INIT_FAIL; - goto end; - } - - ret = sm2_update_sess(smctx); - if (ret) { - fprintf(stderr, "failed to update sess\n"); -- smctx->is_init = false; -+ smctx->init_status = CTX_INIT_FAIL; - goto end; - } - -- smctx->is_init = true; -+ smctx->init_status = CTX_INIT_SUCC; - end: - EVP_PKEY_CTX_set_data(ctx, smctx); - EVP_PKEY_CTX_set0_keygen_info(ctx, NULL, 0); -@@ -1196,8 +1211,13 @@ static int sm2_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) - return 1; - case EVP_PKEY_CTRL_MD: - smctx->ctx.md = p2; -- if (sm2_update_sess(smctx)) -+ if (smctx->init_status != CTX_INIT_SUCC) -+ return 1; -+ -+ if (sm2_update_sess(smctx)) { -+ fprintf(stderr, "failed to set MD\n"); - return 0; -+ } - return 1; - case EVP_PKEY_CTRL_GET_MD: - *(const EVP_MD **)p2 = smctx->ctx.md; --- -1.8.3.1 - diff --git a/0061-uadk_engine-use-HW_V2-HW_V3-to-distinguish-different.patch b/0061-uadk_engine-use-HW_V2-HW_V3-to-distinguish-different.patch deleted file mode 100644 index 55ab785..0000000 --- a/0061-uadk_engine-use-HW_V2-HW_V3-to-distinguish-different.patch +++ /dev/null @@ -1,142 +0,0 @@ -From e34a0bb0cc5c381f45877e05d927fd4bc5dc98f6 Mon Sep 17 00:00:00 2001 -From: Hao Fang -Date: Sat, 22 Oct 2022 15:27:20 +0800 -Subject: uadk_engine: use HW_V2/HW_V3 to distinguish different hardware - platforms - -Hardware version numbers are used to distinguish different hardware. - -Signed-off-by: Hao Fang -Tested-by: Junchong Pan ---- - src/uadk.h | 4 ++-- - src/uadk_cipher.c | 22 +++++++++++----------- - test/sanity_test.sh | 8 ++++---- - 3 files changed, 17 insertions(+), 17 deletions(-) - -diff --git a/src/uadk.h b/src/uadk.h -index cd3447c..99c65c7 100644 ---- a/src/uadk.h -+++ b/src/uadk.h -@@ -27,8 +27,8 @@ - #define ENGINE_RECV_MAX_CNT 60000000 - - enum { -- KUNPENG920, -- KUNPENG930, -+ HW_V2, -+ HW_V3, - }; - - extern const char *engine_uadk_id; -diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c -index c5bc7af..c6878c3 100644 ---- a/src/uadk_cipher.c -+++ b/src/uadk_cipher.c -@@ -77,7 +77,7 @@ static int platform; - - #define SMALL_PACKET_OFFLOAD_THRESHOLD_DEFAULT 192 - --static int cipher_920_nids[] = { -+static int cipher_hw_v2_nids[] = { - NID_aes_128_cbc, - NID_aes_192_cbc, - NID_aes_256_cbc, -@@ -93,7 +93,7 @@ static int cipher_920_nids[] = { - 0, - }; - --static int cipher_930_nids[] = { -+static int cipher_hw_v3_nids[] = { - NID_aes_128_cbc, - NID_aes_192_cbc, - NID_aes_256_cbc, -@@ -342,9 +342,9 @@ static int uadk_get_accel_platform(char *alg_name) - return 0; - - if (!strcmp(dev->api, "hisi_qm_v2")) -- platform = KUNPENG920; -+ platform = HW_V2; - else -- platform = KUNPENG930; -+ platform = HW_V3; - free(dev); - - return 1; -@@ -358,12 +358,12 @@ static int uadk_e_engine_ciphers(ENGINE *e, const EVP_CIPHER **cipher, - int size; - int i; - -- if (platform == KUNPENG920) { -- size = (sizeof(cipher_920_nids) - 1) / sizeof(int); -- cipher_nids = cipher_920_nids; -+ if (platform == HW_V2) { -+ size = (sizeof(cipher_hw_v2_nids) - 1) / sizeof(int); -+ cipher_nids = cipher_hw_v2_nids; - } else { -- size = (sizeof(cipher_930_nids) - 1) / sizeof(int); -- cipher_nids = cipher_930_nids; -+ size = (sizeof(cipher_hw_v3_nids) - 1) / sizeof(int); -+ cipher_nids = cipher_hw_v3_nids; - } - - if (!cipher) { -@@ -1073,7 +1073,7 @@ int uadk_e_bind_cipher(ENGINE *e) - } - - bind_v2_cipher(); -- if (platform > KUNPENG920) -+ if (platform > HW_V2) - bind_v3_cipher(); - - return ENGINE_set_ciphers(e, uadk_e_engine_ciphers); -@@ -1155,7 +1155,7 @@ void uadk_e_destroy_cipher(void) - pthread_spin_destroy(&engine.lock); - - destroy_v2_cipher(); -- if (platform > KUNPENG920) -+ if (platform > HW_V2) - destroy_v3_cipher(); - } - -diff --git a/test/sanity_test.sh b/test/sanity_test.sh -index 2c0c504..bdedc15 100755 ---- a/test/sanity_test.sh -+++ b/test/sanity_test.sh -@@ -103,7 +103,7 @@ if [[ $algs =~ "RSA" ]]; then - openssl speed -elapsed -engine $engine_id -async_jobs 1 rsa4096 - fi - --#ecdsa only supported in Kunpeng930 or later -+#ecdsa only supported in HW_V3 or later - if [[ $algs =~ "id-ecPublicKey" ]]; then - echo "testing ECDSA" - openssl speed -elapsed -engine $engine_id ecdsap224 -@@ -116,21 +116,21 @@ if [[ $algs =~ "id-ecPublicKey" ]]; then - openssl speed -elapsed -engine $engine_id -async_jobs 1 ecdsap521 - fi - --#X25519 only supported in Kunpeng930 or later -+#X25519 only supported in HW_V3 or later - if [[ $algs =~ "X25519" ]]; then - echo "testing X25519" - openssl speed -elapsed -engine $engine_id ecdhx25519 - openssl speed -elapsed -engine $engine_id -async_jobs 1 ecdhx25519 - fi - --#X448 only supported in Kunpeng930 or later -+#X448 only supported in HW_V3 or later - if [[ $algs =~ "X448" ]]; then - echo "testing X448" - openssl speed -elapsed -engine $engine_id ecdhx448 - openssl speed -elapsed -engine $engine_id -async_jobs 1 ecdhx448 - fi - --#ecdh only supported in Kunpeng930 or later -+#ecdh only supported in HW_V3 or later - if [[ $algs =~ "id-ecPublicKey" ]]; then - echo "testing ECDH" - openssl speed -elapsed -engine $engine_id ecdhp192 --- -1.8.3.1 - diff --git a/0062-uadk-engine-update-the-numa-parameter-of-the-schedul.patch b/0062-uadk-engine-update-the-numa-parameter-of-the-schedul.patch deleted file mode 100644 index 1c5a5d9..0000000 --- a/0062-uadk-engine-update-the-numa-parameter-of-the-schedul.patch +++ /dev/null @@ -1,73 +0,0 @@ -From 01580bb856fe7a2206990954b38d8213efd06098 Mon Sep 17 00:00:00 2001 -From: Longfang Liu -Date: Sat, 22 Oct 2022 15:31:24 +0800 -Subject: uadk/engine: update the numa parameter of the scheduler - -In the scenario where multiple devices are enabled at the -same time through environment variables, fixing a numa id -will make other devices unusable. When using the default -numa parameter, the scheduler will automatically allocate -device resources according to the CPU id of the thread, -so as to realize all devices. - -Signed-off-by: Longfang Liu ---- - src/uadk_cipher.c | 4 ++-- - src/uadk_digest.c | 3 ++- - src/uadk_rsa.c | 4 +++- - 3 files changed, 7 insertions(+), 4 deletions(-) - -diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c -index c6878c3..8e8c5f3 100644 ---- a/src/uadk_cipher.c -+++ b/src/uadk_cipher.c -@@ -469,7 +469,6 @@ static handle_t sched_single_init(handle_t h_sched_ctx, void *sched_param) - return (handle_t)0; - } - -- skey->numa_id = param->numa_id; - skey->type = param->type; - - return (handle_t)skey; -@@ -881,7 +880,8 @@ static void uadk_e_ctx_init(EVP_CIPHER_CTX *ctx, struct cipher_priv_ctx *priv) - if (ret) - params.type = 0; - -- params.numa_id = engine.numa_id; -+ /* Use the default numa parameters */ -+ params.numa_id = -1; - priv->setup.sched_param = ¶ms; - if (!priv->sess) { - priv->sess = wd_cipher_alloc_sess(&priv->setup); -diff --git a/src/uadk_digest.c b/src/uadk_digest.c -index 63887e7..8370490 100644 ---- a/src/uadk_digest.c -+++ b/src/uadk_digest.c -@@ -523,7 +523,8 @@ static int uadk_e_digest_init(EVP_MD_CTX *ctx) - return 0; - } - -- params.numa_id = engine.numa_id; -+ /* Use the default numa parameters */ -+ params.numa_id = -1; - priv->setup.sched_param = ¶ms; - priv->sess = wd_digest_alloc_sess(&priv->setup); - if (unlikely(!priv->sess)) -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index ef1739d..74852e7 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -881,7 +881,9 @@ static struct uadk_rsa_sess *rsa_get_eng_session(RSA *rsa, unsigned int bits, - - rsa_sess->key_size = key_size; - rsa_sess->setup.key_bits = key_size << BIT_BYTES_SHIFT; -- params.numa_id = g_rsa_res.numa_id; -+ -+ /* Use the default numa parameters */ -+ params.numa_id = -1; - rsa_sess->setup.sched_param = ¶ms; - rsa_sess->setup.is_crt = is_crt; - --- -1.8.3.1 - diff --git a/0063-uadk_engine-bugfix-side-effects-of-right-operand.patch b/0063-uadk_engine-bugfix-side-effects-of-right-operand.patch deleted file mode 100644 index 838d1e7..0000000 --- a/0063-uadk_engine-bugfix-side-effects-of-right-operand.patch +++ /dev/null @@ -1,205 +0,0 @@ -From 5b59c17f84d5a1f6e7c996a499f5a70059d89ee7 Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Sat, 22 Oct 2022 15:35:17 +0800 -Subject: uadk_engine: bugfix side effects of right operand - -The right operand of while condition may contains side effects, -variables change "rx_cnt++". Move 'rx_cnt++' from condition -to statement. - -Signed-off-by: Zhiqi Song ---- - src/uadk_cipher.c | 13 ++++++++----- - src/uadk_dh.c | 18 +++++++++++------- - src/uadk_digest.c | 13 ++++++++----- - src/uadk_pkey.c | 13 ++++++++----- - src/uadk_rsa.c | 14 +++++++++----- - 5 files changed, 44 insertions(+), 27 deletions(-) - -diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c -index 8e8c5f3..9d4f692 100644 ---- a/src/uadk_cipher.c -+++ b/src/uadk_cipher.c -@@ -516,11 +516,13 @@ static int uadk_e_cipher_poll(void *ctx) - - do { - ret = wd_cipher_poll_ctx(idx, expt, &recv); -- if (recv == expt) -+ if (!ret && recv == expt) - return 0; -- else if (ret < 0 && ret != -EAGAIN) -- return ret; -- } while (ret == -EAGAIN && (rx_cnt++ < ENGINE_RECV_MAX_CNT)); -+ else if (ret == -EAGAIN) -+ rx_cnt++; -+ else -+ return -1; -+ } while (rx_cnt < ENGINE_RECV_MAX_CNT); - - fprintf(stderr, "failed to recv msg: timeout!\n"); - -@@ -539,7 +541,8 @@ static int uadk_e_cipher_env_poll(void *ctx) - ret = wd_cipher_poll(expt, &recv); - if (ret < 0 || recv == expt) - return ret; -- } while (rx_cnt++ < ENGINE_RECV_MAX_CNT); -+ rx_cnt++; -+ } while (rx_cnt < ENGINE_RECV_MAX_CNT); - - fprintf(stderr, "failed to poll msg: timeout!\n"); - -diff --git a/src/uadk_dh.c b/src/uadk_dh.c -index 37f84e9..2af2455 100644 ---- a/src/uadk_dh.c -+++ b/src/uadk_dh.c -@@ -48,6 +48,7 @@ - #define UADK_E_SUCCESS 1 - #define UADK_E_FAIL 0 - #define UADK_E_POLL_SUCCESS 0 -+#define UADK_E_POLL_FAIL (-1) - #define UADK_E_INIT_SUCCESS 0 - #define ENV_ENABLED 1 - -@@ -206,17 +207,19 @@ static int uadk_e_dh_poll(void *ctx) - { - __u64 rx_cnt = 0; - __u32 recv = 0; -- int expect = 1; -+ int expt = 1; - int idx = 1; - int ret; - - do { -- ret = wd_dh_poll_ctx(idx, expect, &recv); -- if (recv == expect) -+ ret = wd_dh_poll_ctx(idx, expt, &recv); -+ if (!ret && recv == expt) - return UADK_E_POLL_SUCCESS; -- else if (ret < 0 && ret != -EAGAIN) -- return ret; -- } while (ret == -EAGAIN && (rx_cnt++ < ENGINE_RECV_MAX_CNT)); -+ else if (ret == -EAGAIN) -+ rx_cnt++; -+ else -+ return UADK_E_POLL_FAIL; -+ } while (rx_cnt < ENGINE_RECV_MAX_CNT); - - fprintf(stderr, "failed to recv msg: timeout!\n"); - -@@ -283,7 +286,8 @@ static int uadk_e_dh_env_poll(void *ctx) - ret = wd_dh_poll(expt, &recv); - if (ret < 0 || recv == expt) - return ret; -- } while (rx_cnt++ < ENGINE_RECV_MAX_CNT); -+ rx_cnt++; -+ } while (rx_cnt < ENGINE_RECV_MAX_CNT); - - fprintf(stderr, "failed to poll msg: timeout!\n"); - -diff --git a/src/uadk_digest.c b/src/uadk_digest.c -index 8370490..9568a98 100644 ---- a/src/uadk_digest.c -+++ b/src/uadk_digest.c -@@ -343,11 +343,13 @@ static int uadk_e_digest_poll(void *ctx) - - do { - ret = wd_digest_poll_ctx(CTX_ASYNC, expt, &recv); -- if (recv == expt) -+ if (!ret && recv == expt) - return 0; -- else if (ret < 0 && ret != -EAGAIN) -- return ret; -- } while (ret == -EAGAIN && (rx_cnt++ < ENGINE_RECV_MAX_CNT)); -+ else if (ret == -EAGAIN) -+ rx_cnt++; -+ else -+ return -1; -+ } while (rx_cnt < ENGINE_RECV_MAX_CNT); - - fprintf(stderr, "failed to recv msg: timeout!\n"); - -@@ -366,7 +368,8 @@ static int uadk_e_digest_env_poll(void *ctx) - ret = wd_digest_poll(expt, &recv); - if (ret < 0 || recv == expt) - return ret; -- } while (rx_cnt++ < ENGINE_RECV_MAX_CNT); -+ rx_cnt++; -+ } while (rx_cnt < ENGINE_RECV_MAX_CNT); - - fprintf(stderr, "failed to poll msg: timeout!\n"); - -diff --git a/src/uadk_pkey.c b/src/uadk_pkey.c -index 211f1cc..6920cff 100644 ---- a/src/uadk_pkey.c -+++ b/src/uadk_pkey.c -@@ -110,11 +110,13 @@ static int uadk_ecc_poll(void *ctx) - - do { - ret = wd_ecc_poll_ctx(CTX_ASYNC, expt, &recv); -- if (recv == expt) -+ if (!ret && recv == expt) - return 0; -- else if (ret < 0 && ret != -EAGAIN) -- return ret; -- } while (ret == -EAGAIN && (rx_cnt++ < ENGINE_RECV_MAX_CNT)); -+ else if (ret == -EAGAIN) -+ rx_cnt++; -+ else -+ return -1; -+ } while (rx_cnt < ENGINE_RECV_MAX_CNT); - - fprintf(stderr, "failed to recv msg: timeout!\n"); - -@@ -153,7 +155,8 @@ static int uadk_e_ecc_env_poll(void *ctx) - ret = wd_ecc_poll(expt, &recv); - if (ret < 0 || recv == expt) - return ret; -- } while (rx_cnt++ < ENGINE_RECV_MAX_CNT); -+ rx_cnt++; -+ } while (rx_cnt < ENGINE_RECV_MAX_CNT); - - fprintf(stderr, "failed to poll msg: timeout!\n"); - -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index 74852e7..bcdd6bc 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -48,6 +48,7 @@ - #define UADK_E_FAIL 0 - #define UADK_DO_SOFT (-0xE0) - #define UADK_E_POLL_SUCCESS 0 -+#define UADK_E_POLL_FAIL (-1) - #define UADK_E_INIT_SUCCESS 0 - #define CHECK_PADDING_FAIL (-1) - #define ENV_ENABLED 1 -@@ -664,11 +665,13 @@ static int uadk_e_rsa_poll(void *ctx) - - do { - ret = wd_rsa_poll_ctx(CTX_ASYNC, expt, &recv); -- if (recv == expt) -+ if (!ret && recv == expt) - return UADK_E_POLL_SUCCESS; -- else if (ret < 0 && ret != -EAGAIN) -- return ret; -- } while (ret == -EAGAIN && (rx_cnt++ < ENGINE_RECV_MAX_CNT)); -+ else if (ret == -EAGAIN) -+ rx_cnt++; -+ else -+ return UADK_E_POLL_FAIL; -+ } while (rx_cnt < ENGINE_RECV_MAX_CNT); - - fprintf(stderr, "failed to recv msg: timeout!\n"); - -@@ -700,7 +703,8 @@ static int uadk_e_rsa_env_poll(void *ctx) - ret = wd_rsa_poll(expt, &recv); - if (ret < 0 || recv == expt) - return ret; -- } while (rx_cnt++ < ENGINE_RECV_MAX_CNT); -+ rx_cnt++; -+ } while (rx_cnt < ENGINE_RECV_MAX_CNT); - - fprintf(stderr, "failed to poll msg: timeout!\n"); - --- -1.8.3.1 - diff --git a/0064-uadk_engine-cleanup-static-check-warning-of-clangtid.patch b/0064-uadk_engine-cleanup-static-check-warning-of-clangtid.patch deleted file mode 100644 index 9107679..0000000 --- a/0064-uadk_engine-cleanup-static-check-warning-of-clangtid.patch +++ /dev/null @@ -1,118 +0,0 @@ -From f17c89d7d27b3a728232c7e641c2978db238a2f3 Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Sat, 22 Oct 2022 15:37:45 +0800 -Subject: uadk_engine: cleanup static check warning of clangtidy tool - -Cleanup the following warning: -1. Parameters of function should not be used as working -variable. -2. Cleanup uninitialized value. -3. Storage class should be specified after a type. - -Signed-off-by: Zhiqi Song ---- - src/e_uadk.c | 6 ++---- - src/uadk_cipher.c | 9 +++++---- - src/uadk_ec.c | 5 +++-- - src/uadk_rsa.c | 16 ++++++++-------- - 4 files changed, 18 insertions(+), 18 deletions(-) - -diff --git a/src/e_uadk.c b/src/e_uadk.c -index 77612d7..21ceb86 100644 ---- a/src/e_uadk.c -+++ b/src/e_uadk.c -@@ -89,13 +89,11 @@ static const ENGINE_CMD_DEFN g_uadk_cmd_defns[] = { - } - }; - --__attribute__((constructor)) --static void uadk_constructor(void) -+static void __attribute__((constructor)) uadk_constructor(void) - { - } - --__attribute__((destructor)) --static void uadk_destructor(void) -+static void __attribute__((destructor)) uadk_destructor(void) - { - } - -diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c -index 9d4f692..14e2af2 100644 ---- a/src/uadk_cipher.c -+++ b/src/uadk_cipher.c -@@ -749,17 +749,18 @@ static void ctr_iv_inc(uint8_t *counter, __u32 c) - { - uint32_t n = CTR_128BIT_COUNTER; - uint8_t *counter1 = counter; -+ __u32 c_value = c; - - /* - * Since the counter has been increased 1 by the hardware, - * so the c need to decrease 1. - */ -- c = c - 1; -+ c_value -= 1; - do { - --n; -- c += counter1[n]; -- counter1[n] = (uint8_t)c; -- c >>= BYTE_BITS; -+ c_value += counter1[n]; -+ counter1[n] = (uint8_t)c_value; -+ c_value >>= BYTE_BITS; - } while (n); - } - -diff --git a/src/uadk_ec.c b/src/uadk_ec.c -index 37683cd..247b875 100644 ---- a/src/uadk_ec.c -+++ b/src/uadk_ec.c -@@ -72,14 +72,15 @@ static void init_dtb_param(void *dtb, char *start, - __u32 dsz, __u32 bsz, __u32 num) - { - struct wd_dtb *tmp = dtb; -+ char *buff = start; - int i = 0; - - while (i++ < num) { -- tmp->data = start; -+ tmp->data = buff; - tmp->dsize = dsz; - tmp->bsize = bsz; - tmp += 1; -- start += bsz; -+ buff += bsz; - } - } - -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index bcdd6bc..7d25338 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -932,14 +932,14 @@ static int rsa_fill_prikey(RSA *rsa, struct uadk_rsa_sess *rsa_sess, - struct rsa_prikey_param *pri, - unsigned char *in_buf, unsigned char *to) - { -- struct wd_rsa_prikey *prikey; -- struct wd_dtb *wd_dq; -- struct wd_dtb *wd_dp; -- struct wd_dtb *wd_q; -- struct wd_dtb *wd_p; -- struct wd_dtb *wd_qinv; -- struct wd_dtb *wd_d; -- struct wd_dtb *wd_n; -+ struct wd_rsa_prikey *prikey = NULL; -+ struct wd_dtb *wd_qinv = NULL; -+ struct wd_dtb *wd_dq = NULL; -+ struct wd_dtb *wd_dp = NULL; -+ struct wd_dtb *wd_q = NULL; -+ struct wd_dtb *wd_p = NULL; -+ struct wd_dtb *wd_d = NULL; -+ struct wd_dtb *wd_n = NULL; - - if (!(rsa_sess->is_prikey_ready) && (pri->is_crt)) { - wd_rsa_get_prikey(rsa_sess->sess, &prikey); --- -1.8.3.1 - diff --git a/0065-uadk_engine-bugfix-enable-environment-variable.patch b/0065-uadk_engine-bugfix-enable-environment-variable.patch deleted file mode 100644 index 2fab708..0000000 --- a/0065-uadk_engine-bugfix-enable-environment-variable.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 7ef97aab7a5cd964241fe9879588ceb54a547003 Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Sat, 22 Oct 2022 15:53:53 +0800 -Subject: uadk_engine: bugfix enable environment variable - -When the 'alg_name' set by the user is valid, the 'env_enabled' -field should be set or returned. - -Signed-off-by: Zhiqi Song ---- - src/e_uadk.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/e_uadk.c b/src/e_uadk.c -index 21ceb86..0a9e3e6 100644 ---- a/src/e_uadk.c -+++ b/src/e_uadk.c -@@ -116,7 +116,7 @@ int uadk_e_is_env_enabled(const char *alg_name) - int i = 0; - - while (i < len) { -- if (strcmp(uadk_env_enabled[i].alg_name, alg_name)) -+ if (!strcmp(uadk_env_enabled[i].alg_name, alg_name)) - return uadk_env_enabled[i].env_enabled; - i++; - } -@@ -130,7 +130,7 @@ static void uadk_e_set_env_enabled(const char *alg_name, __u8 value) - int i = 0; - - while (i < len) { -- if (strcmp(uadk_env_enabled[i].alg_name, alg_name)) { -+ if (!strcmp(uadk_env_enabled[i].alg_name, alg_name)) { - uadk_env_enabled[i].env_enabled = value; - return; - } --- -1.8.3.1 - diff --git a/0066-uadk_engine-cleanup-magic-number-and-comments.patch b/0066-uadk_engine-cleanup-magic-number-and-comments.patch deleted file mode 100644 index b9a5379..0000000 --- a/0066-uadk_engine-cleanup-magic-number-and-comments.patch +++ /dev/null @@ -1,537 +0,0 @@ -From 20049f2becb9cc339276d4839f6d9f909273f5a5 Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Sat, 22 Oct 2022 15:54:51 +0800 -Subject: uadk_engine: cleanup magic number and comments - -Use macros to replace magic numbers and related operations. -Simplify code comments and unify style. - -Signed-off-by: Zhiqi Song ---- - src/uadk_cipher.c | 4 +--- - src/uadk_dh.c | 5 ++--- - src/uadk_digest.c | 2 +- - src/uadk_ec.c | 51 ++++++++++++++++++++++++++------------------------- - src/uadk_ecx.c | 40 +++++++++++++++++++++++----------------- - src/uadk_pkey.c | 9 ++++----- - src/uadk_pkey.h | 6 +++++- - src/uadk_rsa.c | 25 ++++++++++--------------- - src/uadk_sm2.c | 23 ++++++++++++----------- - 9 files changed, 84 insertions(+), 81 deletions(-) - -diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c -index 14e2af2..de5f078 100644 ---- a/src/uadk_cipher.c -+++ b/src/uadk_cipher.c -@@ -480,13 +480,11 @@ static __u32 sched_single_pick_next_ctx(handle_t sched_ctx, - struct sched_params *key = (struct sched_params *)sched_key; - - if (sched_mode) { -- /* async */ - if (key->type == WD_CIPHER_ENCRYPTION) - return CTX_ASYNC_ENC; - else - return CTX_ASYNC_DEC; - } else { -- /* sync */ - if (key->type == WD_CIPHER_ENCRYPTION) - return CTX_SYNC_ENC; - else -@@ -744,7 +742,7 @@ static void async_cb(struct wd_cipher_req *req, void *data) - } - } - --/* increment counter (128-bit int) by c */ -+/* Increment counter (128-bit int) by c */ - static void ctr_iv_inc(uint8_t *counter, __u32 c) - { - uint32_t n = CTR_128BIT_COUNTER; -diff --git a/src/uadk_dh.c b/src/uadk_dh.c -index 2af2455..6356872 100644 ---- a/src/uadk_dh.c -+++ b/src/uadk_dh.c -@@ -603,7 +603,7 @@ static int dh_fill_genkey_req(const BIGNUM *g, const BIGNUM *p, - if (!ag_bin) - return UADK_E_FAIL; - -- /* malloc a contiguous chunk of memory */ -+ /* Malloc a contiguous chunk of memory */ - apriv_key_bin = OPENSSL_malloc(key_size * DH_PARAMS_CNT); - if (!apriv_key_bin) - goto free_ag; -@@ -615,7 +615,7 @@ static int dh_fill_genkey_req(const BIGNUM *g, const BIGNUM *p, - memset(ap_bin, 0, key_size); - memset(out_pri, 0, key_size); - -- /* construct data block of g */ -+ /* Construct data block of g */ - ret = dh_set_g(g, key_size, ag_bin, dh_sess); - if (!ret) - goto free_apriv; -@@ -623,7 +623,6 @@ static int dh_fill_genkey_req(const BIGNUM *g, const BIGNUM *p, - dh_sess->req.xbytes = BN_bn2bin(priv_key, apriv_key_bin); - dh_sess->req.pbytes = BN_bn2bin(p, ap_bin); - dh_sess->req.x_p = (void *)apriv_key_bin; -- /* the output from uadk */ - dh_sess->req.pri = out_pri; - dh_sess->req.pri_bytes = key_size; - dh_sess->req.op_type = WD_DH_PHASE1; -diff --git a/src/uadk_digest.c b/src/uadk_digest.c -index 9568a98..9d009a9 100644 ---- a/src/uadk_digest.c -+++ b/src/uadk_digest.c -@@ -71,7 +71,7 @@ static struct digest_engine engine; - - struct evp_md_ctx_st { - const EVP_MD *digest; -- /* functional reference if 'digest' is ENGINE-provided */ -+ /* Functional reference if 'digest' is ENGINE-provided */ - ENGINE *engine; - unsigned long flags; - void *md_data; -diff --git a/src/uadk_ec.c b/src/uadk_ec.c -index 247b875..9b48ae7 100644 ---- a/src/uadk_ec.c -+++ b/src/uadk_ec.c -@@ -27,23 +27,23 @@ - #include "uadk.h" - - #define ECC128BITS 128 --#define ECC192BITS 192 --#define ECC224BITS 224 --#define ECC256BITS 256 --#define ECC320BITS 320 --#define ECC384BITS 384 --#define ECC521BITS 521 -+#define ECC192BITS 192 -+#define ECC224BITS 224 -+#define ECC256BITS 256 -+#define ECC320BITS 320 -+#define ECC384BITS 384 -+#define ECC521BITS 521 - - struct curve_param { -- /* prime */ -+ /* Prime */ - BIGNUM *p; -- /* ecc coefficient 'a' */ -+ /* ECC coefficient 'a' */ - BIGNUM *a; -- /* ecc coefficient 'b' */ -+ /* ECC coefficient 'b' */ - BIGNUM *b; -- /* base point */ -+ /* Base point */ - const EC_POINT *g; -- /* order of base point */ -+ /* Order of base point */ - const BIGNUM *order; - }; - -@@ -176,7 +176,6 @@ free_ctx: - - static int get_smallest_hw_keybits(int bits) - { -- /* ec curve order width */ - if (bits > ECC384BITS) - return ECC521BITS; - else if (bits > ECC320BITS) -@@ -283,7 +282,7 @@ static int eckey_check(const EC_KEY *eckey) - return -1; - } - -- /* field GF(2m) is not supported by uadk */ -+ /* Field GF(2m) is not supported by uadk */ - if (!uadk_prime_field(group)) - return UADK_DO_SOFT; - -@@ -336,22 +335,25 @@ static int set_digest(handle_t sess, struct wd_dtb *e, - unsigned int dlen = sdgst->dsize; - BIGNUM *m; - -- if (dlen << UADK_BITS_2_BYTES_SHIFT > order_bits) { -+ if (dlen << TRANS_BITS_BYTES_SHIFT > order_bits) { - m = BN_new(); - - /* Need to truncate digest if it is too long: first truncate - * whole bytes - */ -- dlen = (order_bits + 7) >> UADK_BITS_2_BYTES_SHIFT; -+ dlen = BITS_TO_BYTES(order_bits); - if (!BN_bin2bn(dgst, dlen, m)) { - fprintf(stderr, "failed to BN_bin2bn digest\n"); - BN_free(m); - return -1; - } - -- /* If still too long, truncate remaining bits with a shift */ -- if (dlen << UADK_BITS_2_BYTES_SHIFT > order_bits && -- !BN_rshift(m, m, 8 - (order_bits & 0x7))) { -+ /* If the length of digest is still longer than the length -+ * of the base point order, truncate remaining bits with a -+ * shift to that length -+ */ -+ if (dlen << TRANS_BITS_BYTES_SHIFT > order_bits && -+ !BN_rshift(m, m, DGST_SHIFT_NUM(order_bits))) { - fprintf(stderr, "failed to truncate input digest\n"); - BN_free(m); - return -1; -@@ -743,7 +745,7 @@ err: - - static int set_key_to_ec_key(EC_KEY *ec, struct wd_ecc_req *req) - { -- unsigned char buff[SM2_KEY_BYTES * 2 + 1] = {UADK_OCTET_STRING}; -+ unsigned char buff[ECC_POINT_SIZE(SM2_KEY_BYTES) + 1] = {UADK_OCTET_STRING}; - struct wd_ecc_point *pubkey = NULL; - struct wd_dtb *privkey = NULL; - const EC_GROUP *group; -@@ -768,8 +770,8 @@ static int set_key_to_ec_key(EC_KEY *ec, struct wd_ecc_req *req) - return -ENOMEM; - } - -- memcpy(buff + 1, pubkey->x.data, SM2_KEY_BYTES * 2); -- tmp = BN_bin2bn(buff, SM2_KEY_BYTES * 2 + 1, NULL); -+ memcpy(buff + 1, pubkey->x.data, ECC_POINT_SIZE(SM2_KEY_BYTES)); -+ tmp = BN_bin2bn(buff, ECC_POINT_SIZE(SM2_KEY_BYTES) + 1, NULL); - ptr = EC_POINT_bn2point(group, tmp, point, NULL); - BN_free(tmp); - if (!ptr) { -@@ -1029,7 +1031,7 @@ static int ecdh_compkey_init_iot(handle_t sess, struct wd_ecc_req *req, - in_pkey.x.dsize = BN_bn2bin(pkey_x, (unsigned char *)in_pkey.x.data); - in_pkey.y.dsize = BN_bn2bin(pkey_y, (unsigned char *)in_pkey.y.data); - -- /* set public key */ -+ /* Set public key */ - ecdh_in = wd_ecxdh_new_in(sess, &in_pkey); - if (!ecdh_in) { - fprintf(stderr, "failed to new ecxdh in\n"); -@@ -1075,7 +1077,7 @@ static int ecdh_set_key_to_ec_key(EC_KEY *ecdh, struct wd_ecc_req *req) - } - - key_size_std = (unsigned int)(EC_GROUP_get_degree(group) + -- UADK_ECC_PADDING) >> UADK_BITS_2_BYTES_SHIFT; -+ UADK_ECC_PADDING) >> TRANS_BITS_BYTES_SHIFT; - key_size_x = pubkey->x.dsize; - key_size_y = pubkey->y.dsize; - if ((key_size_x > key_size_std) || (key_size_y > key_size_std)) { -@@ -1088,9 +1090,8 @@ static int ecdh_set_key_to_ec_key(EC_KEY *ecdh, struct wd_ecc_req *req) - * tag - 1 byte - * point_x - [key_size_std] bytes - * point_y - [key_size_std] bytes -- * so the malloc size is: key_size_std * 2 + 1 - */ -- buff_size = key_size_std * 2 + 1; -+ buff_size = ECC_POINT_SIZE(key_size_std) + 1; - x_shift = key_size_std - key_size_x + 1; - y_shift = buff_size - key_size_y; - buff = (unsigned char *)OPENSSL_malloc(buff_size); -diff --git a/src/uadk_ecx.c b/src/uadk_ecx.c -index df23156..67042a3 100644 ---- a/src/uadk_ecx.c -+++ b/src/uadk_ecx.c -@@ -295,33 +295,39 @@ static int ecx_keygen_set_pkey(EVP_PKEY *pkey, struct ecx_ctx *ecx_ctx, - - memcpy(ecx_key->pubkey, (const unsigned char *)pubkey->x.data, - key_size); -- /* trans public key from big-endian to little-endian */ -+ /* Trans public key from big-endian to little-endian */ - ret = reverse_bytes(ecx_key->pubkey, key_size); - if (!ret) { - fprintf(stderr, "failed to trans public key\n"); - return UADK_E_FAIL; - } -- /* trans private key from big-endian to little-endian */ -+ /* Trans private key from big-endian to little-endian */ - ret = reverse_bytes(ecx_key->privkey, key_size); - if (!ret) { - fprintf(stderr, "failed to trans private key\n"); - return UADK_E_FAIL; - } - /* -- * This is a pretreatment of X25519/X448, as described in RFC 7748: -- * For X25519, in order to decode 32 random bytes as an integer -- * scaler, set the three LSB of the first byte and MSB of the last -- * to zero, set the second MSB of the last byte to 1. -- * For X448, set the two LSB of the first byte to 0, and MSB of the -- * last byte to 1. Decode in little-endian mode. -+ * This is a pretreatment of X25519/X448 described in RFC 7748. -+ * In order to decode the random bytes as an integer scaler, there -+ * are some special data processing. And use little-endian mode for -+ * decoding. - */ - if (ecx_ctx->nid == EVP_PKEY_X25519) { -- ecx_key->privkey[0] &= 248; -- ecx_key->privkey[X25519_KEYLEN - 1] &= 127; -- ecx_key->privkey[X25519_KEYLEN - 1] |= 64; -+ /* Set the three LSB of the first byte to 0 */ -+ ecx_key->privkey[0] &= 0xF8; -+ -+ /* Set the MSB of the last byte to 0 */ -+ ecx_key->privkey[X25519_KEYLEN - 1] &= 0x7F; -+ -+ /* Set the second MSB of the last byte to 1 */ -+ ecx_key->privkey[X25519_KEYLEN - 1] |= 0x40; - } else if (ecx_ctx->nid == EVP_PKEY_X448) { -- ecx_key->privkey[0] &= 252; -- ecx_key->privkey[X448_KEYLEN - 1] |= 128; -+ /* Set the two LSB of the first byte to 0 */ -+ ecx_key->privkey[0] &= 0xFC; -+ -+ /* Set the MSB of the last byte to 1 */ -+ ecx_key->privkey[X448_KEYLEN - 1] |= 0x80; - } - - ret = EVP_PKEY_assign(pkey, ecx_ctx->nid, ecx_key); -@@ -494,7 +500,7 @@ static int ecx_compkey_init_iot(struct ecx_ctx *ecx_ctx, struct wd_ecc_req *req, - struct wd_ecc_in *ecx_in; - int ret; - -- /* trans public key from little-endian to big-endian */ -+ /* Trans public key from little-endian to big-endian */ - ret = reverse_bytes(peer_ecx_key->pubkey, key_size); - if(!ret) { - fprintf(stderr, "failed to trans public key\n"); -@@ -521,7 +527,7 @@ static int ecx_compkey_init_iot(struct ecx_ctx *ecx_ctx, struct wd_ecc_req *req, - - uadk_ecc_fill_req(req, WD_ECXDH_COMPUTE_KEY, ecx_in, ecx_out); - -- /* trans public key from big-endian to little-endian */ -+ /* Trans public key from big-endian to little-endian */ - ret = reverse_bytes(peer_ecx_key->pubkey, key_size); - if (!ret) { - fprintf(stderr, "failed to trans public key\n"); -@@ -553,7 +559,7 @@ static int ecx_derive_set_private_key(struct ecx_ctx *ecx_ctx, - struct wd_dtb prikey; - int ret; - -- /* trans private key from little-endian to big-endian */ -+ /* Trans private key from little-endian to big-endian */ - ret = reverse_bytes(ecx_key->privkey, key_size); - if (!ret) { - fprintf(stderr, "failed to trans private key\n"); -@@ -569,7 +575,7 @@ static int ecx_derive_set_private_key(struct ecx_ctx *ecx_ctx, - return UADK_E_FAIL; - } - -- /* trans private key from big-endian to little-endian */ -+ /* Trans private key from big-endian to little-endian */ - ret = reverse_bytes(ecx_key->privkey, key_size); - if (!ret) { - fprintf(stderr, "failed to trans private key\n"); -diff --git a/src/uadk_pkey.c b/src/uadk_pkey.c -index 6920cff..6b5ae9a 100644 ---- a/src/uadk_pkey.c -+++ b/src/uadk_pkey.c -@@ -44,7 +44,7 @@ struct ecc_res_config { - int numa_id; - }; - --/* ecc global hardware resource is saved here */ -+/* ECC global hardware resource is saved here */ - struct ecc_res { - struct wd_ctx_config *ctx_res; - int pid; -@@ -123,7 +123,7 @@ static int uadk_ecc_poll(void *ctx) - return -ETIMEDOUT; - } - --/* make resource configure static */ -+/* Make resource configure static */ - struct ecc_res_config ecc_res_config = { - .sched = { - .sched_type = -1, -@@ -234,7 +234,7 @@ static int uadk_wd_ecc_init(struct ecc_res_config *config) - struct uacce_dev *dev; - int ret; - -- /* ctx is no difference for sm2/ecdsa/ecdh/x25519/x448 */ -+ /* The ctx is no difference for sm2/ecdsa/ecdh/x25519/x448 */ - dev = wd_get_accel_dev("ecdsa"); - if (!dev) - return -ENOMEM; -@@ -396,8 +396,7 @@ int uadk_ecc_set_private_key(handle_t sess, const EC_KEY *eckey) - return -EINVAL; - } - -- /* pad and convert bits to bytes */ -- buflen = (EC_GROUP_get_degree(group) + 7) / 8; -+ buflen = BITS_TO_BYTES(EC_GROUP_get_degree(group)); - ecc_key = wd_ecc_get_key(sess); - prikey.data = (void *)bin; - prikey.dsize = BN_bn2binpad(d, bin, buflen); -diff --git a/src/uadk_pkey.h b/src/uadk_pkey.h -index b30c2de..6d1cc77 100644 ---- a/src/uadk_pkey.h -+++ b/src/uadk_pkey.h -@@ -26,7 +26,6 @@ - #define UADK_ECC_MAX_KEY_BITS 521 - #define UADK_ECC_MAX_KEY_BYTES 66 - #define UADK_ECC_CV_PARAM_NUM 6 --#define UADK_BITS_2_BYTES_SHIFT 3 - #define SM2_KEY_BYTES 32 - #define UADK_OCTET_STRING 4 - #define UADK_ECC_PUBKEY_PARAM_NUM 2 -@@ -34,6 +33,11 @@ - #define UADK_ECDH_CV_NUM 8 - #define ENV_ENABLED 1 - #define UADK_E_INVALID (-2) -+#define TRANS_BITS_BYTES_SHIFT 3 -+#define ECC_POINT_SIZE(n) ((n) * 2) -+#define GET_MS_BYTE(n) ((n) >> 8) -+#define GET_LS_BYTE(n) ((n) & 0xFF) -+#define DGST_SHIFT_NUM(n) (8 - ((n) & 0x7)) - - struct uadk_pkey_meth { - EVP_PKEY_METHOD *sm2; -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index 7d25338..e9a2c53 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -52,6 +52,9 @@ - #define UADK_E_INIT_SUCCESS 0 - #define CHECK_PADDING_FAIL (-1) - #define ENV_ENABLED 1 -+#define PRIME_RETRY_COUNT 4 -+#define GENCB_NEXT 2 -+#define GENCB_RETRY 3 - - static RSA_METHOD *rsa_hw_meth; - -@@ -173,11 +176,7 @@ static int rsa_prime_mul_res(int num, struct rsa_prime_param *param, - if (!BN_mul(param->r1, param->rsa_p, param->rsa_q, ctx)) - return BN_ERR; - } else { -- /* -- * Use the number 3 to indicate whether -- * the generator has been found. -- */ -- if (!BN_GENCB_call(cb, 3, num)) -+ if (!BN_GENCB_call(cb, GENCB_RETRY, num)) - return BN_ERR; - return BN_CONTINUE; - } -@@ -228,14 +227,11 @@ static int check_rsa_prime_sufficient(int *num, const int *bitsr, - *bitse -= bitsr[*num]; - else - return -1; -- /* -- * Use the number 2 to indicate whether -- * a prime has been found. -- */ -- ret = BN_GENCB_call(cb, 2, *n++); -+ -+ ret = BN_GENCB_call(cb, GENCB_NEXT, *n++); - if (!ret) - return -1; -- if (retries == 4) { -+ if (retries == PRIME_RETRY_COUNT) { - *num = -1; - *bitse = 0; - retries = 0; -@@ -244,8 +240,8 @@ static int check_rsa_prime_sufficient(int *num, const int *bitsr, - retries++; - return BN_REDO; - } -- /* Use the number 3 to indicate whether the generator has been found. */ -- ret = BN_GENCB_call(cb, 3, *num); -+ -+ ret = BN_GENCB_call(cb, GENCB_RETRY, *num); - if (!ret) - return BN_ERR; - retries = 0; -@@ -320,8 +316,7 @@ static int check_rsa_prime_useful(const int *n, struct rsa_prime_param *param, - else - return BN_ERR; - -- /* Use the number 2 to indicate whether a prime has been found. */ -- if (!BN_GENCB_call(cb, 2, *n++)) -+ if (!BN_GENCB_call(cb, GENCB_NEXT, *n++)) - return BN_ERR; - - return GET_ERR_FINISH; -diff --git a/src/uadk_sm2.c b/src/uadk_sm2.c -index 8a9adca..578d2d8 100644 ---- a/src/uadk_sm2.c -+++ b/src/uadk_sm2.c -@@ -34,12 +34,12 @@ enum { - typedef struct { - /* Key and paramgen group */ - EC_GROUP *gen_group; -- /* message digest */ -+ /* Message digest */ - const EVP_MD *md; - /* Distinguishing Identifier, ISO/IEC 15946-3 */ - uint8_t *id; - size_t id_len; -- /* id_set indicates if the 'id' field is set (1) or not (0) */ -+ /* Indicates if the 'id' field is set (1) or not (0) */ - int id_set; - } SM2_PKEY_CTX; - -@@ -557,8 +557,7 @@ static size_t ec_field_size(const EC_GROUP *group) - if (!EC_GROUP_get_curve(group, p, a, b, NULL)) - goto done; - -- /* Pad and convert bits to bytes */ -- field_size = (BN_num_bits(p) + 7) / 8; -+ field_size = BITS_TO_BYTES(BN_num_bits(p)); - - done: - BN_free(p); -@@ -1172,7 +1171,7 @@ static int sm2_set_ctx_id(struct sm2_ctx *smctx, int p1, const void *p2) - OPENSSL_free(smctx->ctx.id); - smctx->ctx.id = tmp_id; - } else { -- /* set null-ID */ -+ /* Set null-ID */ - OPENSSL_free(smctx->ctx.id); - smctx->ctx.id = NULL; - } -@@ -1231,7 +1230,7 @@ static int sm2_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) - *(size_t *)p2 = smctx->ctx.id_len; - return 1; - case EVP_PKEY_CTRL_DIGESTINIT: -- /* nothing to be inited, this is to suppress the error... */ -+ /* Nothing to be inited, for suppress the error */ - return 1; - default: - fprintf(stderr, "sm2 ctrl type = %d error\n", type); -@@ -1323,20 +1322,22 @@ static int check_digest_evp_lib(const EVP_MD *digest, EVP_MD_CTX *hash, - } - - /* Z = h(ENTL || ID || a || b || xG || yG || xA || yA) */ -- if (id_len >= (UINT16_MAX / 8)) { -+ if (id_len >= (UINT16_MAX >> TRANS_BITS_BYTES_SHIFT)) { - fprintf(stderr, "id too large\n"); - return 0; - } - -- entl = (uint16_t)(8 * id_len); -+ entl = (uint16_t)(id_len << TRANS_BITS_BYTES_SHIFT); - -- e_byte = entl >> 8; -+ /* Update the most significant (first) byte of 'entl' */ -+ e_byte = GET_MS_BYTE(entl); - if (!EVP_DigestUpdate(hash, &e_byte, 1)) { - fprintf(stderr, "error evp lib\n"); - return 0; - } - -- e_byte = entl & 0xFF; -+ /* Update the least significant (second) byte of 'entl' */ -+ e_byte = GET_LS_BYTE(entl); - if (!EVP_DigestUpdate(hash, &e_byte, 1)) { - fprintf(stderr, "error evp lib\n"); - return 0; -@@ -1516,7 +1517,7 @@ static int sm2_digest_custom(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx) - return 0; - } - -- /* get hashed prefix 'z' of tbs message */ -+ /* Get hashed prefix 'z' of tbs message */ - if (!sm2_compute_z_digest(z, md, smctx->ctx.id, smctx->ctx.id_len, ec)) - return 0; - --- -1.8.3.1 - diff --git a/0067-uadk_engine-cleanup-header-file.patch b/0067-uadk_engine-cleanup-header-file.patch deleted file mode 100644 index b6f7fbc..0000000 --- a/0067-uadk_engine-cleanup-header-file.patch +++ /dev/null @@ -1,250 +0,0 @@ -From 1dd1503428df2b33f679f81b1541a4314fe0aa11 Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Sat, 22 Oct 2022 15:56:54 +0800 -Subject: uadk_engine: cleanup header file - -Remove redundant header file and modify magic number. - -Signed-off-by: Zhiqi Song ---- - src/uadk.h | 3 --- - src/uadk_async.c | 1 + - src/uadk_async.h | 2 +- - src/uadk_cipher.c | 1 + - src/uadk_dh.c | 1 + - src/uadk_digest.c | 2 ++ - src/uadk_ec.c | 1 + - src/uadk_ecx.c | 2 +- - src/uadk_pkey.c | 5 ++++- - src/uadk_rsa.c | 6 +++++- - src/uadk_sm2.c | 7 +++++-- - 11 files changed, 22 insertions(+), 9 deletions(-) - -diff --git a/src/uadk.h b/src/uadk.h -index 99c65c7..30c099f 100644 ---- a/src/uadk.h -+++ b/src/uadk.h -@@ -18,9 +18,6 @@ - #ifndef UADK_H - #define UADK_H - #include --#include --#include --#include "uadk_utils.h" - - #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) - #define ENV_STRING_LEN 256 -diff --git a/src/uadk_async.c b/src/uadk_async.c -index 3f2e1db..2edd6ea 100644 ---- a/src/uadk_async.c -+++ b/src/uadk_async.c -@@ -20,6 +20,7 @@ - #include - #include - #include -+#include - #include "uadk.h" - #include "uadk_async.h" - -diff --git a/src/uadk_async.h b/src/uadk_async.h -index 9bae3f4..8a4822e 100644 ---- a/src/uadk_async.h -+++ b/src/uadk_async.h -@@ -19,8 +19,8 @@ - #define UADK_ASYNC_H - - #include --#include - #include -+#include - - #define ASYNC_QUEUE_TASK_NUM 1024 - -diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c -index de5f078..cc06429 100644 ---- a/src/uadk_cipher.c -+++ b/src/uadk_cipher.c -@@ -22,6 +22,7 @@ - #include - #include - #include -+#include - #include "uadk.h" - #include "uadk_async.h" - -diff --git a/src/uadk_dh.c b/src/uadk_dh.c -index 6356872..680564c 100644 ---- a/src/uadk_dh.c -+++ b/src/uadk_dh.c -@@ -23,6 +23,7 @@ - #include - #include - #include -+#include - #include "uadk.h" - #include "uadk_async.h" - -diff --git a/src/uadk_digest.c b/src/uadk_digest.c -index 9d009a9..26a6272 100644 ---- a/src/uadk_digest.c -+++ b/src/uadk_digest.c -@@ -25,8 +25,10 @@ - #include - #include - #include -+#include - #include "uadk.h" - #include "uadk_async.h" -+#include "uadk_utils.h" - - #define UADK_DO_SOFT (-0xE0) - #define CTX_SYNC 0 -diff --git a/src/uadk_ec.c b/src/uadk_ec.c -index 9b48ae7..6106083 100644 ---- a/src/uadk_ec.c -+++ b/src/uadk_ec.c -@@ -23,6 +23,7 @@ - #include - #include - #include -+#include - #include "uadk_pkey.h" - #include "uadk.h" - -diff --git a/src/uadk_ecx.c b/src/uadk_ecx.c -index 67042a3..b62f81d 100644 ---- a/src/uadk_ecx.c -+++ b/src/uadk_ecx.c -@@ -14,7 +14,6 @@ - * limitations under the License. - * - */ --#include - #include - #include - #include -@@ -24,6 +23,7 @@ - #include - #include - #include -+#include - #include "uadk_pkey.h" - #include "uadk.h" - -diff --git a/src/uadk_pkey.c b/src/uadk_pkey.c -index 6b5ae9a..7b7a345 100644 ---- a/src/uadk_pkey.c -+++ b/src/uadk_pkey.c -@@ -17,6 +17,7 @@ - #include - #include - #include -+#include - #include "uadk_async.h" - #include "uadk.h" - #include "uadk_pkey.h" -@@ -381,6 +382,7 @@ int uadk_ecc_set_private_key(handle_t sess, const EC_KEY *eckey) - const EC_GROUP *group; - struct wd_dtb prikey; - const BIGNUM *d; -+ size_t degree; - int buflen; - int ret; - -@@ -396,7 +398,8 @@ int uadk_ecc_set_private_key(handle_t sess, const EC_KEY *eckey) - return -EINVAL; - } - -- buflen = BITS_TO_BYTES(EC_GROUP_get_degree(group)); -+ degree = EC_GROUP_get_degree(group); -+ buflen = BITS_TO_BYTES(degree); - ecc_key = wd_ecc_get_key(sess); - prikey.data = (void *)bin; - prikey.dsize = BN_bn2binpad(d, bin, buflen); -diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c -index e9a2c53..96c898f 100644 ---- a/src/uadk_rsa.c -+++ b/src/uadk_rsa.c -@@ -20,6 +20,7 @@ - #include - #include - #include -+#include - #include "uadk_async.h" - #include "uadk.h" - -@@ -55,6 +56,7 @@ - #define PRIME_RETRY_COUNT 4 - #define GENCB_NEXT 2 - #define GENCB_RETRY 3 -+#define PRIME_CHECK_BIT_NUM 4 - - static RSA_METHOD *rsa_hw_meth; - -@@ -210,7 +212,7 @@ static int check_rsa_prime_sufficient(int *num, const int *bitsr, - * key by using the modulus in a certificate. This is also covered - * by checking the length should not be less than 0x9. - */ -- if (!BN_rshift(param->r2, param->r1, *bitse - 4)) -+ if (!BN_rshift(param->r2, param->r1, *bitse - PRIME_CHECK_BIT_NUM)) - return BN_ERR; - - bitst = BN_get_word(param->r2); -@@ -231,6 +233,7 @@ static int check_rsa_prime_sufficient(int *num, const int *bitsr, - ret = BN_GENCB_call(cb, GENCB_NEXT, *n++); - if (!ret) - return -1; -+ - if (retries == PRIME_RETRY_COUNT) { - *num = -1; - *bitse = 0; -@@ -288,6 +291,7 @@ static int check_rsa_prime_useful(const int *n, struct rsa_prime_param *param, - BIGNUM *e_pub, BN_CTX *ctx, BN_GENCB *cb) - { - unsigned long err; -+ - /* - * BN_sub(r,a,b) substracts b from a and place the result in r, - * r = a-b. -diff --git a/src/uadk_sm2.c b/src/uadk_sm2.c -index 578d2d8..b14fbcf 100644 ---- a/src/uadk_sm2.c -+++ b/src/uadk_sm2.c -@@ -22,6 +22,7 @@ - #include - #include - #include -+#include - #include "uadk.h" - #include "uadk_pkey.h" - -@@ -550,6 +551,7 @@ static size_t ec_field_size(const EC_GROUP *group) - BIGNUM *a = BN_new(); - BIGNUM *b = BN_new(); - size_t field_size = 0; -+ size_t p_bits; - - if (p == NULL || a == NULL || b == NULL) - goto done; -@@ -557,7 +559,8 @@ static size_t ec_field_size(const EC_GROUP *group) - if (!EC_GROUP_get_curve(group, p, a, b, NULL)) - goto done; - -- field_size = BITS_TO_BYTES(BN_num_bits(p)); -+ p_bits = BN_num_bits(p); -+ field_size = BITS_TO_BYTES(p_bits); - - done: - BN_free(p); -@@ -598,7 +601,7 @@ static int sm2_ciphertext_size(const EC_KEY *key, - * Integer and string are simple type; set constructed = 0, means - * primitive and definite length encoding. - */ -- sz = 2 * ASN1_object_size(0, field_size + 1, V_ASN1_INTEGER) -+ sz = ECC_POINT_SIZE(ASN1_object_size(0, field_size + 1, V_ASN1_INTEGER)) - + ASN1_object_size(0, md_size, V_ASN1_OCTET_STRING) - + ASN1_object_size(0, msg_len, V_ASN1_OCTET_STRING); - *ct_size = ASN1_object_size(1, sz, V_ASN1_SEQUENCE); --- -1.8.3.1 - diff --git a/uadk_engine-1.0.0.tar.gz b/uadk_engine-1.0.0.tar.gz deleted file mode 100644 index 63b7d49a9e2c0f8f13daed8bf67aa6a61eb80c4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 486414 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%0DE^d&ldI}1wi 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%0DZ`b|sXl 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

71q+j#=3SjsRgaTHl{!5q9 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%0A)-|+u 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 AjQ{`u diff --git a/uadk_engine-1.2.0.tar.gz b/uadk_engine-1.2.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..1f652fe907649ca9bec2b25d697b282842c1f9a5 GIT binary patch literal 102891 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
&c8T4GPiB3lR4$krJtEy|N+cEfSD_Q76 z^k0Ez&k$mFd>x;+N626mufuoMXo0q{bnm==b!rIY81Fw%50B!*gSvh2^6>QZ@J$TT zU{$*BPqf6o^)cw*_EUWSd#9s6eG1|~uB@*5`u~mP^=bU?2l;&E^Z)b)czXK(2B&|c z%}+k|QJtSs3%F-}E!$x*@6hwK4#72!ycg|)LK%)!p`w(?g8y=oc}o9LT4kZ{KX!JX zZv6Ce@AM>sf5p?4<<&KMj9=vQ^(Pzr9KML>tIKN)2ET~sPnMsq(sTSGp06$ch2h{A zi_Yu%LH&5^^zb-djaKdDjTR6N4&$BOS(`j-XBTh7@iIK#+xaUWzyCx>*qky8E7lpG zi?LjN8QTl`k3dFHbPhN}n;y@ZXj;M|z}8@UfK8d-&Aq2LCCyE}8$e6H&bXZjl)Up@ zLki}3eBMO^h8PxZ#rVwoV)VcV-AJ|NKe#5@(0Vh%k2i-0r~Kqvd;AJ~IHfpr5+u|Z zSoFoXQ?WC8PN^bgc|gD4P;*DFgR<<7E;*e0i%x+G0Xk}! z1LG#wRHy{Xs{&u}pQYKERDbNb6qRsucqxlh#Bb-=UnV>fj%p7C2H=(z@-2z!X7_dd zG&Ws1sgWEQOA}Ye#b)UE&WQZpDlez*$k5ks_^8){YhK5p z@gT{?o()K94Z?850?z^?xqu8)V>5)79cH{%hZpK;!EmGhX!(&2lf2Z-gbcA%Rw-RA zm{p2PrYx`!6@C?3yf&5*=arHv#!!VzR9`Cf)Xr`##Z;tgsb{F1R-Zb?WjdlsCIg}Q z)C8ik*11J#4gw3-%*U6~25eU6lBxha11c!*XL_TxRLd221Fxo;qG`tE2EhVe1ITX7 z6CC?xa|2Ka-w^SIAz}a*VQHe^IVZ}NNai==;(#ZIP;0e_N2QuY_Cl1%oP@M(AkKme zc<9urmKpyq6K;WGSA(vEw_K4OFI=E%e{L2g#>0%FeqKCUZ;eYht)oSpH!T0ZEF0)yPOsMED*?gPcJ>W!q`nQN`_Xs)X6blpaYYEj9Ov{>sy zhxkPvFnamIob^zi*!n9R6n4(`q0e|&oMiBjhhZq=`1J5F-rqWYT`!=CV4Wgz7^tWh z?(u^U9hWt-&wFeR6OZMcpEuGfT#dKAJHxJ80iY_X4sAPPsBtY5TkN5`cSB>RN%o=* zEDU%GZU;g8P+mN>iW#`aeDsp~BQmGVm zUX~1;SXka*ilcD$CAPY# zv{7J)N`N>Fp&-&K9t;h5p4ffwI++LG+wXe|*DsvV)b6g1o1rkN!JkINu#ZASQ*H;{ zK74ajdJ7HK{%(bXiMlqG4)RBDDjo#I17u)1@`2%4-$qbyt?@CUpxpWv{T`{#+=C#Y ztyW6N5rX|mX+h=i#Jyl>Wrozg`&IV9Ld%`>hNwH7wIAwUhBv}*d66L08}L>k0snSK z6=<+Q1bwZd>*}kAFB4uqU>j=kaWNC)X*P!9Htm^tpfA$I6Lp1VpXkdo`$S)x*(dtK z?3tZpG}KYbc6@q1NE+`Q-NLfpwFkT>aj!Bw-gw^Ybzqx_FIU+D7ruV#4O+-=#0?C_tR0YAn5UuYC@w>Ap=zt+~)Q}I96H#VmBUk~wlc>gaY z+fBnhP0hUSDbUAnI{^=GdYI|oZJ#3pM6UO#6??CgJ=Leyb@y_xq;HmD&by-=!RUZx zF6eZ$>VKf~RWuLH#lTFJq6E)bEJM$Dx}x(=4`h}`t2NlfG=8&aFNXcg0`EVFN1G{J ztmKB+@Ex6dmu4@+dYt$~oza3tC;&NZ)_w91z%RBK9hma3;X=9fqr=1fc(=Z_6Q4*6EPLax0=MLt1gK~#G+d(C zxSLUMHluY>7sakXMduRVIsD}+<*;hFKu84D;=Gmktt4)p;GOe1tXio)1T&V;@yGV7$_8dQbR6vx~QEIsYUUC_+XcnqH>rToy6uLc8hbJf(>WR5SDQZNXFR6yxs<{0q)vBY5DQ-KRQ0V)J)bMparR4uR zx_}h;e>{D%?#KV#SYMyY{}1w+%KuaO|6fi1pTKkD9{n?vD@C4T25!EnG`yPwhb)vIu&u^z39z_(k+c;7}>VbK#=fvzG?;_ZXe$oh=n zHQh-a{X~y{$5$uO`m%Wmhq9B?ty8?gJ3INE7En}KsN;`nrZAl$$}2s0zBG(ptWp|= zy)DC}pCtTJGI+K;9RN#q;aQ@mJQk(|kH%$uj@cf{h-86=Sx%4pzMJ&d5!1155dX~4 z#=~0!Gp1F{;j|WIpH1gkh|lY+HdeW%te!CeqQ&%?O`R+Xk8D25qWe&=`1qOax*TYOB$t0A<_W%UU@H&*MRrETL}gx(sf zlrQBD^S5n0vvmZkiB83Wh1wyP@Jf2tLqcivZI8^S-psBqP4*R2{i0LAp3B}$8zKt~D#TAa@O zEYuGU-_+mm6xoaL?ApW=qT0_B(0--_KgBp}MJSz#kS+TA*- zucYI7mDc9oq1n}Rv-hKH)e@UZAxcT`lwd~LGq;ZxS=A|Fq(SBNeC%_aL?dMHOJOgK(VXmT~R-O+-i~4x~ss73Rpp_<(*b1 zxbMONP1`FX0HOEil*G*Z@}xrrrQ6fe6Utf$OR`NN2D%=Gt{1KI9zh8w{TXwXN;>NH z)G14?A&uiwArTwOk|-WNlel$eySk<4x-CV`s?H*`sEG_iP|`tk7%M$t7uCnDO4Sl4zo5JNSSS;L-bSd8B^@i` zv@Fjs?y;2J+NoMZ)ov(ADVakncW0&e>?DmYv=i>?OctA>Jk2(wU3#6vN@X1W8~WbU ze)g^Q5PMs*2Ac3xi9Y4<@yw>BHcAq;HP_dZRNYJ;5?Rq=?fShcn8H;xjRP%*pgJp~ zvCisPgNn3J-k{#}8{=UT<5TE|poUt+kpz@V_3#(t%x)k!6RQSyA?lB=21%n8-?Uqu zBwA2YNes!nNjfbKkNZVrA$z1-zvwhBqksMrt1%ASyT8Q$efTmyuAiK}sqe&R2lc-m z)wfUUJNv(DbgD*r)L=d)10bqnU@AX9_r0n$4R9H}XBu~Of?mG8p>UEZP?M8Ez>}j) z{m{nL(gcf(wUlR>vV`?}?Er!zb2cJ{#chzgu(3v|amcX3y`$Pw2cyW{hO)O*cgsaW zGq1D>(&G7GQSJx1r;9u^cvXM7!<|AIm6i^DZJ%VtKG2)pH68FOco^(m1PfP-L>^02 z!lH`d(pt(;GARKZhS@T<QNBAN=mCbYZ(;FgZ@RY=iRa&QiJ-mcwhd2?HjJH+Q^5*TMc3=j}fM~-qAT$C` z#-p&1$fplcOrOtEg>ihxrX+6+SuVPFzSbk>pUK0I_;qkKkSdxbl8!#yqD!VW$`?tAmclkkUbRJ#e-%T0wD2~TZR-;SJ&`<}{ zT?O!{U=?~)s<=oO9H9*{(Rj{VLfr^&qK}bFS^HAF0UnL*`V(7`q$f=~E(Cy5GT#{Q>T(8;HzewFm_K>9e zR0>chLguFSUxLGhmDGg33@HjBzDOG%l7Ol`<^3>#`i@KNjk+gz?$XkYQlz=Ii&dKy zL}^+-HQxJ5x`h{MEnR)<_14}2>s*xv4L+4@O8tJRIJ=FupD1_f|^{k~#-SB}#z4n=_djgc?ys)f_q|zJU7H zcJ|-vC(Hk%eVGhL!=-y^1HC++uCHhLf75r@|6~2h+SC7t*6*eDg3rIX|3|_650hrB zzTZ9&KvDkprz;!o{I4#rudGe|e;(rVZSub|Nkt^cUNoAC$^W8gEgBE;rtwqD7MVH< zO&x`98z|tUz8&xEy{?~}p18pRQZIy`jbMG`>|f+>E?K4HsKO6D!5Vc(s<5(~Rxc|S z4y#3=@O4X_tF^_wu8Q^}qH3_EL_=c`%4l9gX!USzO4UrYj@p2B7jdBLz%np=5W-}v zG>kEH;mK+|^5LL7&*eHvw-^%Z`#Z_S2#V+X^2=7zzWm;Z7Q__L#WG_G_yx7Gl%8Zh z3%N6+^V>|$|I6?HxAy|h-~XRHUE5gk_y6V9)#?8K5TEZe|C=JY>7GB`^KYL4-rK-~ zF9NCE{3FlY?4-`Op;GkY`}0K3^e@hKSGFF&Bsj$mkLxG9hxGrBsCy#UdzT5lM)dLGNHhk*tuMz*AmemtS&|^=O0S3JMMPc?~@K`{#&R;r8ioQigl}-{75Izp$iUr^o8LV zt>|*q(XG4PZ;vWWeI}M|bu+8<7&Xv|UtV8&D&dcG)OdLm^F>+AB5Vdo7^_An4bi){ z;L_Pplo4V1p0s+OdV}}5=b4O}#C2|8y-})uhF7zKX$~0qiAejA78{95MGrdZKG{)j`L z?u)kkrK=Wf?}rwNl@~n_Nl+wH$}LkfqMCCxMJXDov%P~;3~HY;8I)s<0}bb~oK+x$ zQ}d&R7YTAy8>U)uQ4AWbOSF_truOQB-D*?3M(aCZDNq2nvHkkNrU*D~U;;nRg9#g0 z7$)v)yIUu_K41~t+PZSLThC#DVR8Q1glk5z7zRWg78YS--HuC`U$lEyAxEZx%o=84 zzU%HB!r&=jRHyHy43N-7RxKtlq$*OkHKQe}5p-aFVk758-o)?MlC5oWNP4Dxupw>hTwPw!^h zGe1++Q9GoFRzup%aPS*l_l+f2(7TUgYtGIn_M%6p(*W#Mug=F87ued5w&54i-oeq? zX}rC)y;~>qL&f^>79Gx?=sBjVJx`U57NVSX5F6=gnN<|<$$?UfRM%@hLRGo^L;Xx6 zj5SQ(7oPhN@wFc4=*PfowM}@Wm!dt|9CGOM)!s4uJv-XjI^8>Xtu0ieBG7KNqDFQO z1#B$K8bGH8^@u4nOF*&e3V)}jwP?p zPcvknSunrL8Z9%aKc^>MA(#(I1K8BAN(DqK$T9~o_s^I;6d0Y(x?`a7W|gN1Z0qsk zOneGn<2XDrZc?UInzxu7vM7i2%#5$!;Qh{2pd2BT4p;3{xm!ZfmQ>=zhEwC6*>DreImMd2{}Jx|=nz6% zS1pR7xhDGppe%qQki^#Ao71AqWKu{u3_a-o_-ezL@}Rl8jM{L zLPjc2R!mb?a!AvZY)xJ%xweeq68^1~xY_YId2tJtr`w#wDtUOzpi4B2iOqYoyNVIh%(p%&x8|q|PMizC&Ee81(?Ew$ZPT`zE3Z>;QRv5QpF6#@+ z$+B>WL0M33f%*MsNlw#I_QrP)5|~S}g>u)AjyRj`2_*KyOc`7Y+;+VvKk00SIgvif z71M15v|O%a*(Cv~egE8YVqPhjoVI-qZQVT90VbygCcO=_LwdKhX+7O@B{S)`t-1k12oS=4G&T1F~!6d*~Z0OHU2`Y(43UDm7}QHSVr8}%E__jt?I1Gv4$ z9i(ofm;)I|uxEQ_$UWQ~Z0$RRT&@oq`F)RA0qR z=boK36A>qez#KT?J@V!5nV>4hX9wSWuyfS4YJeDCfznp?$uV8>jNGNj(x$yTSSxSC zExby}-efTpW2>cNQS=*w>r&Bga<;%+KKmSXlylHa_;oqDipUybbk*phK|%6i+~^?F z_~j-Bi0KxOKYOd1vyz2?_*htw%aIQ{9rnQ+-V$b;05<|s<~Mz zsw>eTP6bvk61rEZ#-h1325%@MUX3)VQ`^Xf;3c@0{i4{~#0h&=|UPWr2>cj&w zL_GVIVgb3qfWBrlpy-}L0r`=DzJ3HCFR=2Y(SM>HUff$IR@Ez5oWrX}kvT;C(Ep<= z1&!b`cS8X^bo?JX2-!PHxtsX{t(JTE$ASN{8 z6M>*Z#u!WUWS-tihRtW^?QY8)-p5@WG#gtDAE5k!rT-5DB(rRVj<&%?lqkN8LhCvi zUG-YSO2BlLzmo~64X$i#dD&t}!SRfAY|TaeUTO=p(Ud5rt)^0DQ!}ZC5CeEw@h*^k z+o*6wczf=}lD8#GVz#3*Pm&8yVTWai3{%`%5< zkJ7EwQpQ&Z&abQP;|gkXsZf2^bQe^oLZRAvVHDI?#X=Aoedfv(?kof*&-6+SZK_&O z+oVHtF-|sp%hxg{^=M@_)1cH4X4d)+R^ziXbD8`6P|{e%kDh6l9Q+^-N>0*aSU-5Z zcTfj`sU{1`k7Ycnm-Fg|s-OnW#r!;4xMvnL_Ot8+^nWO}W0dgAw|fWgqJ`+NpLBsM z>#N;OGbcK7w-P;@>1m6kee>DD*-3q;k~mk+&Uzz(iw4&) z*T;|Hk-O(5`P@y48^gL`V>?dCwJc44YRKQ zNvAj;9rUalmah3CQdJreMOf`!Xxm%pE%j}2agjm|-5G%BL@LfC6?D4B;~MfG5&bOm zMNyrQ&67e$PY%m3EGcX zy|lKNllI!E?P8O7HRX%e_T8t=Y-6j`-3s|Z>y6~0_B`i)$=UKLR&ZWjb%~q5Q93eS zsMmhnVDx7S#S9)^hT{d}abogt!Mv$-+NhL(sGhasz7RE5{nOEFZ zlV2Ai75HUxzo0y^r0=aTs~+pJRfJs6B|svBg_Y$zJnhQ3pRUs94xJT%H?zVEJH7uv z;j#T7!?Q<+`};8+wV(O%KeddBz4=g!R`eO*kqPHVw+$A8y{y%T<&+{`ku41;pA5VN zh1$r{zc0ms)8x`?jXRt|(XQg0@Cn*FC%`9RenEgxb8KVDU>H2D`DOtl8Ss((g7o4k zMO-b15~OBv<$qxyu?gZok*oA=fp6`B>vcpjzG7=YzP&q+G33PIHg)CfxK6#)@}J5ZqcI3v ziv&~*>Wx1HLRE}iSJu;61as@C2>-jNDq}1i)wv$cfLB1)=uTpg9~@B6*cqeGNSWF; z!Z-E*s^c$Dfc_lF>jyCfS{0C9*tnpb#6!+YaqQ5CsC0x0W38KGzraE6y1DKZ_v3@b z$GKZOAF`LIvYs*4y!YUX7=`@}GvH6^Fp)8Qj^ap+7R|I@+A%^Fqik;4GG||3Ta`C8 z{%RP0>yym%bDPfu@gHv&{P{l$&;M&1PyF-$^787+^!)!2pYJUGGgIR9)IUA--$$(H zaG+-y<@slItXD^OM@L}aeeAn0kZB^PG-_*Cx4np3~RVro-Mrky07R>;19H{8Ys?#DnS4SIb_NfT&6h$i= z=u$Vnc1{E2j^>z%(*YE(Rcg*tH+qKqj-sdd#SgajDL^0&A`*jZPbM;;2Cii`{aT(( z<^RSSvl&JI!8Wcx#Us464cMuQx0EhQ{N@Ci=8)xmT6lqyY(`5<(N*JPf+rc^YpuKr zoOdc1Nd>^)w&uq=H-bO52J>WD+)Vu*vRr7uJ?#hOuLWOaCWi&D_u0|rctOP%U z*K{-UojM-b^!7yDlu|Tm zbJ_+hm*gTDBuHZIi|Ef>>CZSLTx~(Ej}{q48eMIthmO-AW(+sAN0rhLZ<6ihkJh-6%6kuC6LPPb5B~^uaMp+D<55Ura@(I7Bo2*7S`S5lZ=WLR8K`pJ5@_-J;V7o zd<*Ugvl338^$zc~?_hy1)qi|J9t^YUMB(yF$!MkM2f|3F(-~$b{9~=`px)4?^x;TiIs2*4 zHJt_S#t*sE)=pVheJIxqT4 zh>S4{5^`|5_x7&p;GIeE!8fytFi`wWJ~!}O^o&B(P(r2<_-m#ton=WamV?9NHyG77 zSfzQ6_-Is`=T-MUDpl)~9%EBQI^WUEe@F!-qNc(tRl^G{(ofnYQwD{_(i8{i7Ljj? zHu%!%wr8{MZh1A&n?K#eXt zR%V?e^c3p)=}FUO-fq$X69b4AZx&YN#GEuoER<%lvn+TLofh4^(5+>%EZ`gfG?8CH zQmL{irofqFHQcavatFJnb_mDK-f;>q+LmUsq8Eo!HRP~zhif~5NnJX`dKm+d9eFtw z9WYH8!F}vY`d~P5%6n}9ZPrr#ZD~ zMa+y_5oHKyN_3ZpD^E^Pp(aaCj*hs=)+2)(x-F97R7y^rjxH`Xku-;NH<89=quovW z&fhW|AEC3E8*MHWsSnTHrrSS1kJh0m$^`H%T8~EU>tyJ#A=}0C@$iQ7+d@g|ie^O` z9EZnaL6-^;U$Nnn1H(vXKSdJu6AZm9ya_zAge>;&d>j=cbBBJcz zqnQVeR84KNmf6}>19zg&6t*odFh3bFR-^xddB90}22_BeaA0Kp5UeGI@mq`^(&AMD zbk^w5If@QccyBU_8Y49`bPW3uGh4un=N;GVKs@I@B9{u}z@g9{6=fKir#Y(mlfa&C z=Grwk_GjUs>5Eqm3Of4_VHD^G8P${TmF1nr?-~2l;$m`;Q62|Maet=p18_P`G?}qD(fGZOGK_V`}$tTZ3SfblA!^KK=cu zF8u-nugp6y+9hjpD=XDh0hFzbYfxpm>OgmDhYC2gslWoXVTv3a#@q3m!<~9mIomrp zjo)njwd%gy+J7C%mlJuA6!CwUp7(cT|AqX2W7)I+TiJNJwm#+m5Apdn{NM5WXh_>X zq_-)rpYrXdkp-kBXBBao&hXZNj;|C1niM;=qa|B>(e=l}I7|9_azccA|T*bxg=Qw~4n@OQc7Ll&oQ z^Y#y4d)IvFmzH1O4405NyeOYt7`0Z4+xr^;+UL4Y`h0#M{%=sgHuvkl);04boDL2T z>JE~0K#gDR?bqX@t<&8onp^tV7%agOS%O_;5&oUaD<2>3@1(0N_Bt)M8X`jhLowdx z>hfQnuB@*vFRM_Ux&UFT0~jKvDnKXQnI0b>9;@$ohT>S9_-pUr)uH-I$kix>Af0%` z=(7h2TULHdI&5S~md?uF5@+7s4==9a!Q$c~?QNh1VzwrI7)$|aVvtx`inB)c2iu$Q3`E&&s+Epaah8xHNIwp zYe#m)R#Ne(0JeChqE?0b0j-330gvy1<$0^(v_5~{3gh#wuin0kPm%nu0-M~ajRN_9 zV|95WW&a1or}F;;e7*zupTj*(PXN;sz`dRT&QACCeN(^C>pa;$84S7;>3f2QfTDv2 zK864BRx15M8DN(y4+O`@4&CX?WHf5GD%D7publjT67xeV3>_Ws9h@HR?L>dbOR|2u z_526eI$op#N4i23x1^BhT!-pFqR34n2)OQf^3X68|RSblimY%cn=?Fgjvl=bw z;5q8a+vRsv34<(3kM<4-mCA=IF&z>e`|U2eck%VsV|Z0fS3(4WmGDnirPJfzO+Ba5 zXmFEP@9e-f=hPc_MKx0oi%>kLMyoYo6pc8GZxOKDLg|Z zl}C|&_$3Va3y7S!Q=qA?jsh&ZpkvMg-hvRU#vjy%m9Euf4@oy(mej9>uLP5 z@PZ!Fo$8ljs5FlGP*q3bnC>ol-Y5`B7Z)v1iftB`VKvaMR$-?mKEGw&UkTC=5k zt>`Deb=mA7=_HL|B3lgglOvRoCo0D%at;l+E@i(&1g?Bw=rxNaRrKcMIz~!_Ez>)d zbdyhh8@j4fNterQv>E6DFgCAAzdcop3TCxos9`i{UiY2jAe zbxh1aQ15&e%u&b>f{xvR^z|*+LVmrt2aMA zgMZ^s(fMDby}q>-aQ^v!W$npID*p4z)2aW*gM7Xh|34rw_&ZesOqBrlW&7)!_|By{ zn#`Yvmlm(i4z??_VbMI|qoXZ2!=S<+p3=cnmOrj6+rx>cwAGKS@$$4)H8 z%NRG?PWwD2f{&Y&0W4L3Uy}VH98Rqef-Rh!!g2jI#iLWDVNz+E9Sz^UgYqDS{KIyK zlf9Gs%j^1Se0;JMzp29%@0`GH44*kN%tX@^e5KN1%|%~o0VvzMTL-V97z5z?{FwuR zuX}ksY`h@=8TAPZ%0q$>P6PnP0*9i=F5eOg{2|$A2 z`N|~M`t~n4CP;C1wwYYfY#7D_DXws~d8Prx&JHX+1w@hT_&h-qe>k22_sRuAvm6F8 zXcq(F-e`Pab_6H}V>$&>GXXG~>MUS`b}=v&+lUe>p&odyG->ZN&aKJ~)iuY@KfJ#yj<2VP|&v${a?v?Djwa7&Wh=R`L-x zokeXVo-{};d32*ne zH}yAJP!XO9#90<1XMm*zg4glh2++lA#FwrVB^S=u?N%nR6WC<-cCxyQmiEfa3(o5i zoCVRoemuw?K7@AwJ5CUy509?B%Rt0U2=}1$0D2H{OTrz=9TEhm``j z0}Jf%`1dqWAE1iGG#R?A=q@q7>=7{u=aPO8Q=qR~CYneI zxUXP1PSTW-h6@ne!wD$k?BL|==;-kHG~V4h-T?udgH9+pY}_4=`~BVkg>$on@%ASZ z-YM*?AgWh`Y;^7rBq2UupZz{EJ~JBp7AfW+$+&!oh6>S$}86###AT(4(B zpQBs_mLpFHTZut2-a>63zB#Jz*X_Kc_(~}N4U@+6E}mEgjs^Y}fx+{rFIi4GSiu&Ed@8 z(chCnFB8~7{WpF0A7Jey=h@KSMe|Pw(JW|kpTJ{jsnv};k2;vU5NRFac7ssW`MeM! zoDlZ+wu!KCTKD(lX?;$~a8ci64=n-&Cl`)WnMTb5(V<3rWzmCkM+vCvpjiwRxjP*< zvD>LdPEhg0NkHM$h%2*rrqv{G?ZeZZ-vMP159)d}W2og?O2t*ZRb6!qta9=qbsxDR zTz6s6@Lsui*kng=$f%EqkE(vl-b`3q^d~gHE7VWfIa7p;?zPCuSE&q4dy(mQ2jq~( zw)oxTE7A^iANf3^7w)-5SR?D8NhnU^#NOgl#{ch*;eQJ6|JGJh@qgAgruM%N^7&rw z|E5lW)7!uMxcv*8-IjIRZovU5cxjl5hvS9E2)r^WVI9**<#|mWd#Kio=EzI0*}bqH zdgz(Qu7YstF+$(UvQt0-5+&AGR*gbj3W&U;BBsFTKf-=Irx5|+_SZR(-q_uU%dw9V z^q00)%vQl~s~n158~t1Z8DXx3OH~02^Fyd|bh?Yua{T7(wEkDpF7Ck*1kP@ovwX)X z>I{;Lm{OJKci1#}P?0;Jeo8_Cydif%K-uk}d876GbKPDynFHB+j-&|s1`7pgjJ~(K z7d`qyn9SAWWdZ|LS+iioQZ7$U4gxMhkEK1EHCqJ1hsK^-A|$O?X+r?S{RVI!ldKD2 zy7PvTl4HErR)VzSBMBo)I`HQ~V%yX$(#We8E8-Yo3TR~0?@hKImInpyY+D=s^Pgzw zhq*P(yK3~pquHvPeKCZOFvLv5`%$-{dyJ1(aEt<&3rNn=GJ%3@^ML##4Z*`vnHcJ~ zbj6G9RjoK0iyLk2aDG2Y{^>d~G0X>MTa7a1)~R+h@2XJa#~*DfBy7ig$s zU2mD|rl2@?|H@R(N48BaFhJ~|5vCRAM3L|6Pe zyh`n24^D$a=rb3Dbg(2Z({S^IU5R<-p}xha-c#rTkqvirjou2E@#s3n?9vtSSTABF zN|;^0(*p^4+yPnK_dxo^f}KlCagjxS;n~ zw#MB-`GAHEaqxPhzzr4o`EP$#`%}8sa=6CA0yL)fj;!$qf@pLI$;XH#Gh3pP5QQzg zpntl(T145s>VKsQ<=5KG#V|?2ut|P6sn-GO!H!{h25)ciC?*yLH23z0wbsH9%d7k+ z!avW#vW9C54VM@-N!C_WG zGskB`o-a7^QRgg38gqaK72&{FHNshNC49p;F_TcVe=c_VZoB?lZ_s-CL+f1x!@B$v z5M9)UacHSwa8GW5h(J1JGM=xs3J8}Zj^xVn>KbXlmcMLzYXe^?%mIoyAUQ%GH_{r8 z@{V5^V+^*PPc}R@RS3aj#!vp99-mik$tyf?sw)@d@kpFSt4yv)%s|}X8HPg&^$JEF zHR4IAD*n>mrcC{h*y|OhB-bgn14XDzKm0EVdQeyg!SZO?ht!fGV)J z4XPgK$_0v_xY3zpgs@NBUw8zqqDU3J(pKtdP%~V_k)u#IG$82A6K`XZK^5*Z>@kRz zMawz_sP7I~b81>IKl5BT@0n*opF9_mb+rpTC!eZd`JH;WeAaVvQcJ&K-!su=-=)m! zw&N-0y>lGEJdgpuu3!nrS<93-foCUgp3qfm>fx)sgROn@)OXf0FVuqgZO5IkSAOTo zG@DFHy%)+Q2@_t{QdG3FtBJ^c2hY7B7LU==-KDmjU4}yUwU&O5>nDc?4gsh9x*Xc| zy|T>XkaLxJ>G?^S=dR0>^H_Q=IWK$%BCnkYav&jwPw*j+=;lD}6o8^GxRrQzF{~Ljq4ZQaCR?Cjs*=+r_~x5^`EF zB|>fp=B4#1NMY+b2UsHZ%>D(Xx~BYM22;lQ9(nuL_Abfn9qrbSPr}4Wj3xapZFg^8 z1+3_ut_N)5&HJ>4yZ_3!S@+-j*5?kP`F7-Xl6P~_I$>THsO8L~J6-Tr^?|ud{j_em zOV|KiMV<@fcnAqL+46t6_^)@f04+NIZ9MVwKRjJoo92Ibkk9vG{|R(9jR8A71AZL? z(3DALmVKu=a?#Zd$`5;Qj*bt11*W|VGUhI(S71fzH;C3|qupUuVI86%ieIRFb>4DR zQ1PVd*B>UMRx$!|#jCEwDO)oJo!cbbz#eqE1)|K3w*Jw8crYrW>n<4E#ahIDV*4_E zAB3qF=FlMv$((_yUTMFNXLLoBvbM3&^)@y(oSQXL?mGTH-!kIe_cMk6eF&$*m;3d9 zjVTOxY|V2p$C!LtCkg4u(Lo!->o|_$_+zgFtfiC0aRsjg<{GWm%;&XQ^ut@I`40aj z1EY7y*#GGMF`Bcb*6}Uyz06Xb)?nttaxHqxz}`t0K3fV#LYG2dS*6D3GrASqUM>1* z*}hOB%eY*aW)%^PQJr;Nt5#>a4KMv+9v^1;gF^*U?2Ty5r0*}%a?SWy=v1 z2!w5i!;(}Z3NQzg^(;RWQlXL$bp=_N|CO>^f7SEf)8*wg|NOVSK0W_E$me@G|G{BI zImycu%+sUb^eA}yqadZvP}%wJlEgJXC7{gq_jQupr;1`wvL%Yrmj&x;NhfaiOE`Qz z*KaZNkW8*+bmj9u@#)sdFUpdfBL;qmM~&fo_QG2vUx15F;}R1u9O?_FFDBxtK6Uh9 z&5<*qlg_<8q(e`;(ScpLCHx8x54P(B%R23avH>t!oV6VvUXMO2ymXcY$M4TE^Ma48 zp3vd2rJ}JK^DKVMWvn$Qj*rc^5x{~SEHa?m>MDaq7=YvN(H`D29?O&9p-Uk)6L ziFTGux0UHLnS55HW1*zUY|)hBvGZWfoAR)dp-QLM>&F*eB?WTwK6@gEpD0ASrfJr) zH{7l?BtzrkVJAuYWH$FdXZ16+PVlN_@8Gn4{Oi`f=eJY{6?OZq-Wb_Gm7P`oU?0ZG zIEnkcUPr;eyc#;w#iy3xHs}TTq1$V5Sof~=vR=OVr42U zqow6EnM-vJYNJ8~BGfX*sfJ;SafeL`*{! z+ucx6xr1^??VM{PA3y@AsFF*0UXGDeF?Tksu`+j#mYZH66l3T-fpu+7fG3?J+D2#O z_Kyx8IlF%?OhDxjcw`W8=FwU99NLt_9ICKN6AL5xis$e$!1L3{lL&ofJR?`k!?EmzAfhYt#HM5Au0%{g0>n>0LxjVq+Do zm`Wq_qA;vVO#r-3sfVT-p{Yjb)*7L7)FvYlVZfA&cDFU;;3(SPY6O&c?K<;+jQhjC zs~9Rah!2`GmH}!*C*5Y3OvIoEg(1j`R$*n z4vYX0)i~MIPK0=Oaoxv~wMb%HlO1vbwO~U(K9{eJUoj61wDyi$lX8@b$0D(IbRR0x z4Fx5xm|?ET+4>dV$#j_19`^2!I(A}+aQi0H?e6) z-PBK))Wfcw0DaQrU_J$exd&x3`hH6~{hG9=LIA;k3V`WD)r)Pw7&&FE1TYi^vA9RUR&YX$DB&UiQkn;G*VlHS|GRgc( z%Gfl4x~RJ_bUfnx*0^^%c+3svv^9t><~wyNC|D%KG&NN^+{;9V709H?+NsK&bY{nR zXey!-S{V&@dX%}vr`-MTtzAFqQy~AZuCAx#|K*J*Q~CcPKHq`==k)4#D(K&@C#Z6P zP=0eZWuyBz>kd~$Yt6XBiB{HuZ_PTn;iZ}`9_kG7@?-Roo9TDv8emhZ!ucaK#CThY z88fhx*=_rp!TcM`&D?uLj=!37y(bFfX_YsN)t}a%1te3<=F>~f|4DX+RSh$~03=?^FQ1y8sx!J~)d{4$qFa>$88-xgVW}Bxr~V@!3fo3y9+O zktuu+CWK*gL66(|Hhrm-Eaa<}mGYcLEe1(KXRjZ(dQkJ@N=1JiMf2*bF?3hI-Pp&TAz`V-fW?CXwD3aNEucEhJcAi-U)&rINB)by_0HkZ*2(V&+oUwZ z$g996Vt8H=_HJsVI!U8D?tinMdA)F&p{}69%j+7eQ@_kE&6D-eLQ+{-t^(D5Q~qDD z|I>+rtUvCc11i}6pRBE=_J8V5z#dX%Ca@M*pfeNF1#b#%A8ye@&4> zq7AF!ML5_kZgx`m27*%YV1m0OiYnE2}FT0r_w0|M?)F@5TRfDhN&m!GCLI zkSN%`>^3^?Gm4VpKJt}5zOX8f?s@8@fWK#^#>tVNj}G_uS%^M3dlRiK{{_U=Qlg1; z4n=v#dSX6=tU}>=v}TB8f}f*hO#DaRUp#k2@RaFO8Y!%XG57Ju=Io4<)T2-o(!u;y zMn%{A!yh;4{gHlKtxEjt^TljYI(iP>tE7ans!qGeO?mIDu>1l9piRdnL?EP*>-Jz9 z=#4M0FhE9caKlW(>;<)mR>SijT65}am7MZ&!Uu_Qod`c1aWwUtcq9U?m@|mcayqq? zK^q!5!l{FUJq4hc;|URilfj~z*JvuIW6-0GoS>+Q$Q)0D!|jbWWrvJ8$=Vm4Wg@Q| z`XoiYSk8+f#eP{(ya1yjl&nh|%NB?X6BV_9hXvO7TA!_$b3kSt6RQ4dpX^jK8#?w{ z`r8b=^-i_+%QeXCrQ^Wl%j~1k_EDycL6KFetjySp7 z-iM3kDh2f5K-I_g?OP50T?Tg)$W_dD%;FRM5MHJsAi8bJLzuS=(I7cASvJX4+36CK z#g%V0U3RHLw+lEkmpJ_>hz{!zE8>^1Q5~x98N->3wfLbSF7>=7wICpwmxfhHebxfh`%K6*!=y`NoHm9Uu29qK7 z1n53j_!SlcGhxD#p*<#FrR28*>q^HE$=_c#iwm1|m_jSBRuC^=swN7-KGQm!tA2O( z4%3hODbW8XACvCrj^Q7R^#99GR{i+@8&981?LQvm^F7#qGV35x8%}LNr)vLirS?y2 z{U1>2e=}T4aJLOS#)WawDvm^1bR)pbyo{zlWW+)@0BIrmqNR;7D|{OIZEFvcPW@Hg z$;%+i?~|Kabcn()7k#xukv=Y3I!b;MxN+}V1m)us8-It|<~tWu(i}SmGbHD10hD`C znR`W&90lycg3(3mS@c6IT41RXzyHyls~Jp`l;;Z9Ly+x`$Vj5D&dQmG>Z4cj}9;ZB{4bC%+b1k*loX8p)A%IQe7x{>#mTGRxHq>G|4o5nd zhBe3@?R_|qjoWk~&UL2FG zjph~XtO<>iopla*_*jgg^Gpq&q%qm=RtpGhn7u;f)V$CDZo71&z_OLtz{Z%h`ff+{ zVO*KMv#|}LN0m~GF*~-6zo_~R5LJ;LdHryvlE_^@oH4dw=ed`iW@Zd6ZLGl(!vyTS zwA9_T_JYWz`HDciT6O{O$Z5jYz8T)0M7QVOA~0iD36Zgt38);2k?Fn8!sR~RiGIZe ztg|R6aTJ%7`RnyySF6t6qqJ8*_#o%hw_b1U9dN{?fVe|(EiVQzg&87GBIO-`u{0kY z^l(Cl<7+;A;JAQDpEU8HpbUN+@AbHXxNYg#%r0hQJ$qB%iO&w|e?6*ipVoKwe@_!T z4KDl^^sYgFm*l?k9g_Q3BuhM3CS~YSGCWIrR2{#RB0cwlenD-mNDj37DV;t5k@{vu zKvVVNT|Nc+KR%J(v5f-%ua)(uDgECDyq@a+9^mtR`G2Wc%*vr;s{Na4|L*4fg*WpU zxW{+>63=h#_Z2j=m3Nw)&DM8)F}lQWz4G}}>i*}B8$eO~kM&gimyM@u)A(->^7+R6 ze|q&ZW&U5`>PH>$>c7?xPEX?9I5zx0@G5w#61Y}TPQ38W+fB00yio;@M{e2e-Cr`x zS3XyxKj1iv|2}_S0KDpBadNtK3TLRZgOjtPqr+n;6fK8~z){V(w627U9R6axURN`q zkn(|xJh{tV$>!v0&E_?f-ZrobLY*@cB;t zKc@%5sVp${{!Dp)rcR%%pG%)g1EwDL?iCtHAv$@evOJg4mF3m7EW2%tHxkONx9Meo z6lSczf>4W0UYmI-Agx1YrvHZ@Fh#qXZiZv0gpx|;x{G+0^8VEi2#58(gVST3>0oI- z(%^7a(-CVh?vI#rn4e^fLs=};&5e`Qg7O`>J}G=U)5uKVm_paD%4j~z3C@^Ta5*P; zgG!^h!q-x%+#A-b!}0Riv@zGrE9=}bqy0LJlLy`PhW!G0`!UAv=z*QiHqo~3j_%cqT3Rv}rsEZ9 z{0_30qnFSwK;4ex_vYQbo>Pw20-I7J&Y-cEO#RnkY#YdGXEnwh*am(X?c&T#I|yp2ufIzft>)Gc|k4OB-)2sxR27R0{d zCS1+KCLff{j+w1E*JuR;(JPwE!(k?eSDBsYQ8o*y5(`cT$=BJM{#9?G%f|n{%N0P8 z{(m{8|9|>qeH#DiK|bGD|33}=Jw5M#jf>yyt^NI%TTb?u)C=9GOK4t9X7`x)_A+>G3 z1~#p2ZFMf1-3*60;(wll9Y%HbLpp0eIQNMS?+lv|?hYWyh$5I$5leksp(0v?ton4e zwew57{bnbwA8ftcugBYaN4xc7`1R|IPJRV1VHWF|Rd)7X*H2EVO2w-~fl4wf9-nMc ztx&bq>}or^nYEr|*Q#%CXI5LQ&cX=_xJMVbF`9ymkvn|4O1gYl=VQ9g;D$6I6QjBY z&Tyif6T8~nrak~?Rp~aa6J05Sw=GE(YAxGGMvwL-7YHc>9T@hB z3xZBSy#IABf%kmW`Z!#slG);GWU_DoisSK5ktn(;`;-S#@i+6pu!Crh7w;U5QAC3m z&GDj~d0$1`EOc?(pWGov-MWbl466%u)QPhFG>Uo5s)$bHJw&G)4RriE#<2}T8 zg6-&MtZZ)vAHg^@ulp$gZ`|3!f3eo0P-08l5i=9jK9TMgW$xY90%A$JdQmsj2Bbw#QQF zTVNIO$>}lLoA1{Th;EmG&}MvS&eikm3_YT7u+8xx!3$JGK{u=Kq#kjxfBrMVv4X*) z5<@i5xODybuu$i*)t^P^&$oxJ%WzS~Ci|1bdZL%q4&Lk~USsvx?AID?UEKKaE2;^v4R!j&-Ar#4AlKlA zphX^j%7=^8P>@WCz0ryj9vi(HlFl$Oa=6^96uo>Y(LE(RWOh%jp~CK|4bJPHdRo{$ z#guZoCpXmzx`)C{X5VQ4EbJMGOxPM?&yc_7bj$4elT6uFxh?_k$?nz8 zuG1+fTfR@QPvp(imDi&$z9Q0Dq*@E%tx}_-Xf|=%{}|1~AGKcX$l%)!z7DNZalBPr zmfBSEO>%E*P8*X_2x4s4&SMbM^peZKR0&tbn3i2WlVa+vo(wcmvMa{1cp*$Yj#p*I z@T$!C6%ce5W^nAk!1|3YDI@uqU&8=mK<*dGAn7Xeo8k59QqpV<8~FEX>GSIP`pRFH zKCi9)M5q6(9#WMOokXFzxR;1xPB-y&u%BP>&WJCayWOPeoY`@kKI|vmlaqa|i|w?} z2aUlEn~Mm^LoIlDz?Yhtv;^U^tahuCq{D&z^PjV%6mT{pbxc4*RlM}Xdh+NOu0;Y) zstP_0muD#|U4x&8>!A9??}bpQrDl&N&Yd*(s4LH{_UuPpQAfWSUmQw|v2$8*a8C)| zL%Uh&uDM52VI1n2mJ;Gxd~J+Sc&tdRd!dL4K$sZSRx*>?K7zfv#i{3xh*quaD}}$& zppzyPq4tvDp&p^pZXi&v0|j5W@xU`sOXD6M8m)QyA>K#GrM_vsMvdRv|oQy zKRAtdem~fHvxi>V_3dBcR|l19;N{D`gB^UQrn>qsW9u9G`1W6l^zPLFEZ_cXZDW0P z#kc=@vN4VS{vedr+t~t2rk22u(;18y}$&H_$egS;3 z(9BHPjm3Uh{d@?7HKA3RF{#?weY)|}%e~W+nHl&Z9;2r$KPR7A@nZeShI#?t#EaGC zH3bR3i5E|npRV!?{3c#tf>(Y)sa_p3ubtf(v!=c|+&SB?!v=ZkmVwu=>j(AYt<%Hf zcomuqzgeG|SvPOCcejoa65SvJGP26i*74SxlX&~!RKCF2mw-VXZ7F0MX9w{~9ZJsF za435x>d}f*o2;_^hx}~Wc}6YBCTI{2h;yP)^$U>M0b-*^$iWmpXIAsjfI?8K*sNAcl7T`yVv_~qg0>EW9gjwy~&W9E#za#djRM}r&c zOu@X*JClxe9jf8=h?=7iq2SCL0GK0I7pj_((yiMS@u*_kWQvg>0SXL>vipM<;-<_c z(HRx6fa4X+1hAG?7yfIZw9i~9I7}`@`HgB_y&MB~eDbDjmSY(}cS*PJG_~p1VhXUc zY(z#a1M$70d90sO6nr+$;|Kl5pm8mY3rwA=V+a_><0q>Kz264;uA6-3$o^JTHQ-?c zWCLQGveMplua%fM2J(@ibaMuQuB&ksZ}>&l_KZObR8%7jJcI23`WtJ}0EF7EN?9<& zJ)&?nHi1X-xv#I_$SSw>*-dvq*PA_IcEdt91zN!IfC@DNQi~oVXvYR8di+?m_ngWE zR<=CnXp)Nb#(_x&M4k)o4O!_L(hES-%tG@{H3&azjq`DR`&T-$!WoiO<2l||3zv#iVpEF^H4o3vJH)vnByY@9-iS+vD7ifdfn+b-1AMHXJ*BHt7(a*?d63onKgcvCh%)JfGm82SyvvQMGK`21#+I6%xpY!3!P zqR0nY3dDpo-0M@ACH(pbzmp#|tqJ{0-%_fyLugTHVv$s^5UrCH5sk#8Qc=Loy{5a3 zagdu{r`^2CU~asuIZ=!LHQ(%wyCccvg3IlT?|$JPG~Hk1aqQ=?Xd7dxDu$565Ff;&O=0} zzRRqoxKB3 z>jHZu1+>*Mz$PBB?Jy3=mK&W;uUT0! zvC=|FSB-eBDvE{{>Ia8!>TfnN8Wj)fqEhi8blq3eBy4Z+g{|EbX>GbMhZZYUAdFiI zDXuN8m@RHBS+fa0jXjFac>PjgSE&d+q%=NJ`^O)Zt*3;H-cHQsK4E|>^7$b#O&QJv zkWp2XxpWFCi4{j#{F2cq3A8A^v{eAM|1y#*93!Q8`^8&;H17&zjRj_J8G1-ez7hkg za8|>6R%Vzf*KGE<(QtQ?#*iR}OVV&=OqWQqNrxeqUN&bnSv+&!i*r)0{?3hrm|@50 z>%Yum>BAoQ=sD_(;F}J(CRO0dhrm?8pN8BVFwcE3E*xz?o`&SfG4hIohYmF_`9^u_ zxT`JJO1E5~LQ{@(NJ6bE-zh+>Btp?)oPzovJItOoGP%_|CvSx-`NA1=)ux9ckk|t^ zWf2;GGyI$W9A=MzZ(^7?6|)w>XR{?6knoF4?^{=uA6iwFw0R_#w6_4{5sU|V+zl>+ z@ZLx9UER$>Z-BMTMUtZKGW%rKMrjy}+8q`8Rn`j{z21z|IYqG^JM%X-=4+&ZE62D9 zXoxR)&#QWa@Q7~NJKTis0r3t1bwC(C7ayQi8f)v&md<5dUNycpWNkV=dmiZ!o7cQc zyPLDDZ?|auz{(9eS+I)WstU-ctr-9fCJQeBbv~BR#iSutgLLY^M`nC-4DvcH-D$Nt zx)z=HdYuTU?Q)eyEp-`+o3wsdCB5*A7w(K0x$;G%+u{w4{g$4%WNMT6~A4OJfw0O~QFlll65i(3$oSlj0 zBh0UU-T16L__%2AB2orld>4uAyFH}hda9+p)7c5G{*zj?g4V1Af?;d_gJGWy0Ac!6 zG^t^PMpsK{V6}vXQcD{vYimnCt^8$GRL9k3D?Hu!X$ft+me7uC$*t~HT2KxT6!hUd zp?e5CBEcY$r6iW2(n~gg0F9oBAYkmwo|y;Q!c06-re*etwkfkuv@w}|qOHiD!?!=n!0Z~#PXwc^wc8eCHTHXFV)w2PB3@8IjF-k?>X zHl*>Jw*+~Og(#b5B(v$KO)WIUDn}qCge(?wO%p2 zyp*K@fJ8a8yoo{T0v8dH7lh`P2?L;{E>%MuXg+7tV zMpGIb@Pq88$`0uT>?>$4fH**_Sqs6~XNd!f_ePtC*aF4!V%Istq$G0aufN)KGm6ZE zi!oF!{Jb|NcH}NR29iE=YOKsOsI{0m2Ozw>p{nGt&>gie$G!0onjUxGqhJC@sNR6@ zkeq%&(^+j}Om=B9ZE=wRTn%f3&Z#^E7%jnR>PN{N)NoLt^jme}(+m&Jd2&SbTM0e8 zP~KaGh5wp`K^+1wBF1-)8YdjeOBzLM%|;CD($?3E)2uOPH+F}Mud~IG-yTyPZfp&r z+`-@Us`dj_Yifj3h2i{yyoawTt3J8=3<8Q;5)N|@m-{%hzs4yIUvqmDDN7 zY&q^uI%`MknP0;j4@HKlVrDNZB@Gg*LR-RH@Tx3km1BMyeKRJO!K|{F+t+1cK4+RT zrZi*vntX@&K`tNodaTJWjkhs|3cXhWNZNSVuJZ@rU#s7oPqlh6yQ>u|%)-WBY1=Pj z++`ed$oy!Kj)Ih*uetKL*H52Al?3lf?&H49=N?HY#b)IMzt>+xGbqmlrbi=z*_QnC zg`C^eU0Jv(duyV{Y>^DV9@9A4hd9spST^A(T#=lb=VIrTwtj(JOW+E3-%i6sSN! zBQr@|86OKnb$~QPNJfdH(U;mBWB8kfoeM)7ZMpSJV8OvN1PUcj!FH)tHMHi1)@JhTkV{5r68pA>C-Y{#_~5qT-VqqNBl(;VVWup=T32oyJt?fnN`|C9 zT+$RghDH4N1L}&*F4HG%-X;G15QG7zy4MMNinhriz7;9GFU_U$dUMZrj$)W~nP_8i zWtkn~5>PE>=&W>utt&oPy1{TflwGZ+uRsAj`j!gAa$k|+>_SC&7W*tTCjF8PTITl5 z$ID6~x52=;@L=4 ze2Y^}M9%_tG3xe)Nv(AyNl9Kr&Dr?+E6*U5FW zuN-XsGjG-%fLiLluq$0&{&l%kf!lEw>pJhEg>syH?q|4y4t)02$iBVsi(Zq1>-Oni z$$(JQgQsr}4^H{jb*w!}RL|h8!U_KEjw*mcgO&lnBj=uLl}X-q%6Dl`#Y%NjCc65pSGtkVdjjfTUcBHs9Rv3}Ds3VOJ4 zw#;@~u9?JYN5_YFI)s1se%(5)Qv=^RpxcBW8UIg3IJ@^Y3i7{htgQL@zn?5WS)a!L zdx%d|^l@YN&E}L8QT=Mse>b}0#^5GeU0zb2;&4vTQ-Y#SffsMO9LCM9}#hEE8<%3`#G(XZMRif(aMp<`kWqG*Qhj7g(Q z=7FPRa7{t%aDQ)cEpqJ`W9&i@a|gZFn1ZF$6sQKpx>iB@NFy*u0max+ zH50DqXih-$|ubR$Dh=M&#!0%2GMn++qg_9 zxgWGU95=5NVl``fdc)W^2(}!VPi>?oa?$`yXnKZM?LI=fXkWl+_LD&qL08t7f2dM( zJs2JycnxSg!hESMoC7*v3^hamc@9#~MZ4LCsdS(VJnfYK-W$(F6{w5f26I(8>+m0r z$;WnUjIaigqz?rEB>F+KJ@g|%5}olPplL~w+6lDQge3^e>)NL@I8k1Jya?6l?FEha zdu#&aC!IvrHiTD~8AsIuGov*r`(kF}|H3*Z^g3;G&j{qq!T%e}c|3&+9JfQa! zfK;%L!}GrZDWp+vbZ__>OvkuG>w}W5T_??}Mi;Qw3k0a5JH(O=O;GftqkdjQjfjVb zz}4IiDi~fjQ9>orx<|;VZfg0r<#t$dFX-t>-j|AQ|JED4Pcem0 z@Q^SjK7^EJmq5F#yI~dp51s1Pb)yB0stiX6DMk8!;}!(!_6K2_}~ z>?EXTZhuT79FXChPXX9QcnnnU6(k-5jre(E$T41VDYmc;q<)|t=2h4fO&6|(Pgm{c zm0$)iStHm38mRO5*rusODu$s^>m*8GgnI-13qYu8ma9nt!(A>J0;SOCH=wazhZaS| z@id^7^qi;pvF1}3&hoEC{_v^MLu%GBP(RUg8kj+H-DsQjiE1XI6dV`o#&t4CIybNm zy6$5e=!wV?(tt`D_OAHL)nr1pq(*)|zb($LGL16!Xw>2T>Pc zPUxwnKn)QePl*+JmT9}o-7Tb`f?S!JM|wX`U@$LWD6)l@a=U#rXZkd!VDWx$*fLat z^I{WZ0bs^8oQ3m7hv*2SGmjDqEqy)is?m>d705wP>_Fi-Q3PzYSZMr*wcM@9@GjW~ z{AY0jj@a&Cf&5_348Lj>9$^hg(8m}K;)0tUZc?!AakB1 zs2Oc0#K{3^*^XU=Lk!bE(P4medNAI+U8BG&mLD^s)y3#FidERGjoYpztLS9Ro2#PL z;9*8AGs%?`*d-$|KoPPKz?q~tk_#}XdIKfAelmiQ(c}lLuhaU}Zc&bz?gGvH5PFP1 z7w~525)V$jn?`4Jvw$inSRx?Uee6-B^we&y&VL+xi%(lg&0H{~IGttZeANe|2!z`2 zG*~UnPXK4$YKQbh2^R9)CdGWii%D2cwHVmWiMQ|sJrNUh)F8jBfBo61sL1<3)2Nr! zA`&1tT_Sk?18wB$-DvF4kPgz9}|-DG(vQa?qMP#HXQ48YU(d=l-^*(6Jz** z5|ouxNNh&;42OW{NViG>_;G9K!lctEBkxkEH9L(qj5n7Ror6&%AaZmK-|WKb9S$3V zHm%MJjQFlkG)Y_UeRAPfhE+HQW9+A%IsjgSL}H|Rs^(YF9nzT$hyVe77V=!=R1=?Y zD)e5r80}r){F}4T5I7amw3(Dq`;t*;TsH7EF*$W`uhNnMo~_aG{VHA`y~xV!f@P{ zo1*1Gf(b`zT5c9ccsd;bMtVxWUM7T-=lNR_zX2tBOp^%)dJL;Z)BZ z9G>oN*XLmIeI9Y*m&Q=Hfg-nPN3Jfx0s<=~HL^5c0+c>_HX^+Lp);mT8WS2;WJ(Rx z^9nGEsS#)3j!+kBWyV#236F4aT#48K2F7r~t15Q2f?x!VKGSG6G>&$xMZOtH zRl{5yHYGE6h)k|)R{@2#nugEdmU(G+z%=~cpq3uxhL-h&mP?%t0;6={trQX<-~`B% z1po)F1?=RFnVT-^=itDMf<@ARL+I%hpTdxTrH5I}Hwh1Xlr~B}I78UOD@rIXI%;hZ z$GUNJ^Jd#Kz z6v`~2#>!M(SxFyT^c6WQ>YYpN^CU+zC1w$tf?yZ~i>@tw`^fbVdLyi4Zf|IRIq&hI z443UC9q(`(A=HLr*batCE8&YETn1uFR6{IXu!3}y*dq~UAS1%pdDZAdri`#O(G%k} z12RZ18w0*q^3NXXE?@&#p%y@f$QFeh-RdPAj)FvPaU+BSuP)SBe9_k!jce4K8Hon9 zUde!B>ZzZAlcHfR>}GPaTZ28OnzU>e)St$%M?u$kN@3&gUE}>UVgsWLaz_(7sHVak zIw)?nub0f zR4a%pDh>Q2sw|D_OJ{Pc85!p2bH^le`f$pr=7gHmt{|H;uEt7r9x6Hz4bm(Y2J>|9 zbiZDMQ9oGNJ9u@xckr6Bb=IOc_2cbbz;f&5-u~X{??ghc_D&D#Cu}~jrC=Ow9m9m3 z?Qb1NM`y=JhbML3ZTYsagEtF+e;xVahLuKurnYh2xO8>+ zSX-L}SmOXnhG>;+P#hK%2)2BcfC3Ebbn!w?0o5EDb#8z+s;dWlXO6qL*{ku^*gxpf zXpRk!8S|5NS52nit5Rc7$-NWTSYfw2Jto-8Uay65qlE78J#5Ooe!p=^iLuE7l9SJm z2fQ0KIy!j}8*y~QmLPZwfW#}ugBwnUKsZQ;D4_d_I0eHf(;KaiZMr1AQ05!30@NUA z;|2wuSHNEuqpc?H2{;Ox^J2?ecB2-H;y3a}beF4tS(tm>rlrv4RjA}w5-QMAi>JQ zGNm~No}5s0Eu}=QrS-<=H%i#B9lF60uw!b3`A>oxh1h6tVFIon?BKo{GK0g{`2W_? z5tQ2d>oc51QWyYJy@}GPckvxz^T}K%!RNGOg_^RYa1{z#vhKmc8Nf+=q!k-Adzimy zC!N+Xf;|G(JM;bX0VPHlMssi9%^BWD$_cgM-Dr9u#;Oi};xN4!Rd#yaKO2()u}n4a zN7aZ9>~vBcf`kFY08+leLmd#r&MmHIak&g{fTe#nccFByX9R#%K*i3G^21PRr7G2o zoXRrk0HIL^3_5v{q}kW|vA$hBPps7nU6N`{hFEcqEa>4Cvf(-0F5JscW&eU`0`0ZU zmAo1`ef4TIG*-{i7&Nc&(wd3E-Y34jfzP|>E#VD#dKazlsQ8^zJxBMD>NzT%>RBrj zCP?&*RqiFtb95hRp6@Jyi!{&C{iJ!03er4(Yy0NuC;ubu{}1ZFoqUZp^6mfmyKDcy zy1ueHwf}#JkDUK)y5!pLUEXsWlh6N?^^K|j$Af(2{BNDX=5l=hEZ`RNzr68eI{y#x zk@K(3-IK*e^FG@sn15L9PrdnHd$PJRo&SgUY;DI!$Mxg-|5VWtN;!myT(7-$Kv)g-@LUMQO*LsYA zG>)q99QyXpb$fH+rlCRIn)w?296f<^o&Ejdc?7e~VXqkpe&OJy9%bUTef;~;>0vFB z=y4r`qC-Qk_7K0fvomiR?-M*a&dwlB>R(J%aA-O@JN;Ml&i(oy$^X%(`OW>i|K3La z-*`IR{~zQd=N}i`(pP8$C-~|5`b6^I^4fny>t6wv)Mq;X?)(oMc+C*w_r>AWy|j@( z{~+vbta|gm{&eN(bp1cX=TDE8&fDFk^TzOMc6K;!^`hq0b*~j|Y-~hJt>ojOx4Z)+2{ph;2UZyBV^ZZ-y9G&=0MeLG~*~yzH*_h$WvX~98pWF^J ztQf{@H4n4Z2{2o|EoQ4>%yzeOFoTz+F}rH4+!D2tHC5Tw)wNrtL)VP*BFh30wlcGyk` zz*PCm>K)rG4?tG|O1WE`69AAylQhroHnt@J$f3Dgo8p}A9=69AAy^LaG9+t`)_ zAkn;2n-c(Vme*)-$MsnbfU~^r)Mj}A&holTn;Jk^Fj!mIez~0|9B_g10>awuxrwfv zg=u~JWj>}@U=mDky*72_5T-kMyU@-AyHE=zFKH!DZa<)tLU8KbdT<;Fv|$g1jnpt5 zpX5k>_%hvir_mpVv493JP30t2T*Pky0IFcx%R99>DFCQ~X*BQDCIO&nNt&%;gDvZ9 z_Q-ZO+Wjs5^$D41Hbx+4`7_sU!OR|!GyN~gP4*<#w|6F-Mnb3`l#! zXJE=rLD`_tr$|L*7@~h30J_!&%IubXr7}|`*UxNc)YE7I-9tnXN-;hQ&8~`O(VALh zND*KzlP*T#j}{1k-yTC(HKEuFKD=$^RjLe_JrS7MEFA(V2HNiWEki@&a|Ftesj7XK zn$BE+t2qEyvj76}Ym3p=#fYqHDL4dK$C^&4a6RK8I=(czDwZFc*K#6&VbUBVBd@dL zQ72kZWdTjZHr@3k8PE$4OT?Ukt}J4{!=iD>ZEH27trfqm)vUH)h}IXQZOm-$phfg; zt72yO>%LP$yq%r-{JAAx$_J{%pK_oJn}4*UU&Ph>t#4eWpXq1%nSQ39>1X= 2.3.21 BuildRequires: openssl-devel sed autoconf automake libtool ExclusiveArch: aarch64 -Patch0001: 0001-digest-support-digest-multiple-update.patch -Patch0002: 0002-uadk_engine-define-the-variable-as-const.patch -Patch0003: 0003-ecc-fix-codecheck-warning.patch -Patch0004: 0004-rsa-delete-redundant-copy.patch -Patch0005: 0005-rsa-fix-coverity-warning.patch -Patch0006: 0006-ecc-cleanup-duplicate-public-key-allocation.patch -Patch0007: 0007-rsa-cleanup-about-reducing-function-parameters.patch -Patch0008: 0008-ecc-cleanup-sm2-compute-digest-function.patch -Patch0009: 0009-ecc-bugfix-about-ecc-init-after-alloc-sess.patch -Patch0010: 0010-rsa-cleanup-about-prime-generation.patch -Patch0011: 0011-ecc-cleanup-the-form-of-the-return-value.patch -Patch0012: 0012-engine-fix-uadk-engine-compatibility-issue.patch -Patch0013: 0013-digest-modify-the-process-of-free-session.patch -Patch0014: 0014-digest-modify-the-process-of-soft-and-hardware-hando.patch -Patch0015: 0015-ecc-bugfix-about-sm2-decryption.patch -Patch0016: 0016-dh-bugfix-about-dh-compute-key.patch -Patch0017: 0017-ecc-bugfix-about-ecc-general-init.patch -Patch0018: 0018-digest-fix-codecheck-warning.patch -Patch0019: 0019-cipher-fixup-a-code-check-warning.patch -Patch0020: 0020-rsa-fixup-a-code-check-warning.patch -Patch0021: 0021-cipher-delete-a-redundant-branch.patch -Patch0022: 0022-engine-fix-engine-can-t-work-under-hybrid-mode.patch -Patch0023: 0023-engine-add-the-kae-log-feature.patch -Patch0024: 0024-rsa-fix-interface-name.patch -Patch0025: 0025-ecc-cleanup-sm2-unreachable-code.patch -Patch0026: 0026-rsa-cleanup-of-code-style.patch -Patch0027: 0027-v1-fixup-about-uninitialized-variable.patch -Patch0028: 0028-ecc-fix-checking-conditions.patch -Patch0029: 0029-ecc-cleanup-print-log.patch -Patch0030: 0030-engine-fix-function-return-type.patch -Patch0031: 0031-rsa-fixup-about-the-wrong-copy.patch -Patch0032: 0032-README-modify-the-engine-id-name.patch -Patch0033: 0033-digest-improve-the-digest-performance.patch -Patch0034: 0034-cipher-support-the-sm4-ecb-alg.patch -Patch0035: 0035-cipher-fix-segmentation-fault-for-uadk_e_ctx_init.patch -Patch0036: 0036-cipher-sm4-ecb-algorithm-is-deleted-by-mistake.patch -Patch0037: 0037-rsa-bugfix-about-redundant-and-inefficient-operation.patch -Patch0038: 0038-uadk-engine-change-Copyright-to-2022.patch -Patch0039: 0039-README-move-test-script-to-sanity_test.sh.patch -Patch0040: 0040-uadk_engine-fix-string-compare-mode.patch -Patch0041: 0041-cipher-optimize-the-process-of-ctx-initialization.patch -Patch0042: 0042-cipher-adding-an-iv-update-to-a-decryption.patch -Patch0043: 0043-cipher-fix-cipher-decrypto-failed-as-use-jdk.patch -Patch0044: 0044-engine-add-receiving-timeout-count.patch -Patch0045: 0045-digest-fix-the-fault-as-using-the-nginx.patch -Patch0046: 0046-ecc-cleanup-of-static-code-check.patch -Patch0047: 0047-ecc-bugfix-about-return-value-check.patch -Patch0048: 0048-ecc-bugfix-multiple-definition-of-ecx-structure.patch -Patch0049: 0049-uadk_engine-remove-redundant-extern.patch -Patch0050: 0050-uadk_engine-add-timeout-protection-mechanism-in-poll.patch -Patch0051: 0051-rsa-cleanup-redundant-BN-operation.patch -Patch0052: 0052-rsa-bugfix-memory-leak-in-genkey-process.patch -Patch0053: 0053-rsa-remove-unused-software-method.patch -Patch0054: 0054-doc-Modify-maintainers.patch -Patch0055: 0055-rsa-modify-the-default-algorithm-of-keygen-soft-algo.patch -Patch0056: 0056-engine-initialize-resources-only-once.patch -Patch0057: 0057-engine-fix-function-type.patch -Patch0058: 0058-uadk_digest-fix-the-full-mac-buffer-length-as-doing-.patch -Patch0059: 0059-uadk_utils-fix-x86-local-build.patch -Patch0060: 0060-sm2-bugfix-about-segfault-in-sm2-ctrl-function.patch -Patch0061: 0061-uadk_engine-use-HW_V2-HW_V3-to-distinguish-different.patch -Patch0062: 0062-uadk-engine-update-the-numa-parameter-of-the-schedul.patch -Patch0063: 0063-uadk_engine-bugfix-side-effects-of-right-operand.patch -Patch0064: 0064-uadk_engine-cleanup-static-check-warning-of-clangtid.patch -Patch0065: 0065-uadk_engine-bugfix-enable-environment-variable.patch -Patch0066: 0066-uadk_engine-cleanup-magic-number-and-comments.patch -Patch0067: 0067-uadk_engine-cleanup-header-file.patch +Patch0001: 0001-readme-export-PKG_CONFIG_PATH-on-openEuler.patch +Patch0002: 0002-uadk_engine-use-calloc-to-replace-malloc-memset.patch +Patch0003: 0003-v1-some-code-clean.patch +Patch0004: 0004-v1-fix-implicit-declaration-of-function-OPENSSL_call.patch +Patch0005: 0005-uadk-build-uadk_engine-only-if-openssl-1.1.patch +Patch0006: 0006-uadk-support-openssl-3.0.patch +Patch0007: 0007-README-update-openssl-3.0.patch +Patch0008: 0008-cipher-fix-double-free-error.patch +Patch0009: 0009-cipher-fix-set-key-error.patch +Patch0010: 0010-cipher-fix-async-hardware-computing-error.patch %description This package contains the UADK Accelerator Engine @@ -129,7 +72,16 @@ fi /sbin/ldconfig %changelog -* Mon june 8 2023 JiangShui Yang 1.0.0-8 +* Mon Jun 19 2023 JiangShui Yang 1.2.0-1 +- Backport uadk engine patch form v1.0.1 to 1.2.0 + +* Mon Mar 20 2023 linwenkai 1.0.0-10 +- Backport uadk engine build patch + +* Thu Feb 9 2023 linwenkai 1.0.0-9 +- Fix uadk engine build compatiable problem + +* Fri Dec 16 2022 JiangShui Yang 1.0.0-8 - Backport uadk engine patch for v1.0.1 * Tus Jul 26 2022 Yang Shen 1.0.0-7 -- Gitee