From f1b48e7ea4a80a8109296cc7d93a206d192d49b5 Mon Sep 17 00:00:00 2001 From: Yang Shen Date: Mon, 10 Oct 2022 10:26:20 +0800 Subject: [PATCH] libwd: update the source code to 2.3.37 Update the source code to 2.3.37. To get more information, please visit the homepage: https://github.comp/Linaro/uadk Signed-off-by: Yang Shen --- ...gest-add-stream-mode-for-digest-sync.patch | 213 - ...igest-support-the-digest-stream-mode.patch | 508 - ...d-cipher-digest-fix-some-code-issues.patch | 82 - ...-v1-fixed-hmac-key-0-length-checking.patch | 28 - ...the-length-of-the-key-need-to-be-cha.patch | 31 - ...-incorrect-configuration-of-the-type.patch | 67 - ...-incorrect-configuration-of-the-type.patch | 30 - ...se-the-uadk_tool-instead-of-uadk_ben.patch | 1125 - ...optimizations-for-digest-stream-mode.patch | 63 - ...ror-of-wd_get_avail_ctx-return-value.patch | 44 - 0011-uadk-fix-comment-content.patch | 85 - ...-max-numa-number-should-not-be-fixed.patch | 424 - ...k-mempool-remove-MISC_DVE_UACCE_CTRL.patch | 27 - ...adk-mempool-check-stats-null-pointer.patch | 32 - 0015-uadk-fix-wd_get_config_numa-info.patch | 29 - 0016-uadk-fix-static-check-warning.patch | 46 - ...-numa-array-use-too-much-stack-space.patch | 69 - 0018-uadk-fix-get_dev_info.patch | 86 - 0019-uadk-fix-pthread_spin_init.patch | 92 - 0020-uadk-env-optimize-find_async_queue.patch | 69 - 0021-uadk-env-optimize-some-function.patch | 175 - 0022-uadk-v1-delete-unused-parameter.patch | 37 - ...add_task_to_async_queue-return-value.patch | 212 - 0024-uadk-sched-fix-memory-leak.patch | 36 - ...si-sec-bugfix-for-out_bytes-checking.patch | 47 - ...dk-tools-modify-NO-SVA-test-scenario.patch | 421 - 0027-wd-fix-wd_parse_async_poll_num.patch | 31 - ...d_init_async_polling_thread_per_numa.patch | 81 - ...k-env-fix-wd_add_task_to_async_queue.patch | 113 - 0030-uadk-optimize-find_async_queue.patch | 41 - 0031-uadk-fix-check_after_sink.patch | 41 - 0032-uadk-fix-wd_request_ctx.patch | 42 - 0033-uadk-fix-sched-params-begin-issue.patch | 77 - 0034-uadk-optimize-wd_request_ctx.patch | 88 - ...uadk-env-bugfix-for-wd_init_resource.patch | 32 - 0036-uadk-env-fix-wd-ctx-num-init.patch | 256 - 0037-uadk-modify-for-free-and-return.patch | 39 - ...-uadk-include-fix-uadk-compatibility.patch | 516 - ...or-resources-are-repeatedly-released.patch | 50 - 0040-aead-modify-the-aead-s-request-api.patch | 785 - 0041-cipher-add-semi-weak-keys-checking.patch | 80 - ...octl-return-result-should-be-printed.patch | 41 - ...ix-environment-uninit-repeatly-error.patch | 412 - ..._free_ctx-and-wd_uninit_sched_config.patch | 140 - ...k-env-fix-free-ctx-table-memory-leak.patch | 206 - ...adk_benchmark-binary-and-header-file.patch | 32869 ---------------- ...-uadk-fix-for-wd_env_config-numa_num.patch | 51 - ...add-some-dfx-information-in-comments.patch | 588 - ...delete-some-dummy-parameter-checking.patch | 119 - ...si-qm-udrv-v1-deleted-a-dummy-branch.patch | 45 - ...pdate-the-SEC-BD1-mode-configuration.patch | 51 - ...dk-optimize-algorithm-initialization.patch | 116 - 0053-uadk-fix-send-exception-handling.patch | 135 - 0054-uadk-sec-fix-hisi_sec_digest_send.patch | 165 - 0055-uadk-sec-some-clean-code.patch | 606 - 0056-uadk-optimize-wd_ctx_qfr_mmap.patch | 59 - 0057-uadk-optimize-wd_sched_rr_instance.patch | 65 - 0058-uadk-optimize-wd_get_accel_list.patch | 127 - 0059-uadk-fix-staic-check-warning.patch | 38 - ...-the-waiting-time-for-receiving-task.patch | 134 - 0061-uadk-comp-optimize-for-spin-lock.patch | 43 - ...si-comp-cleanup-for-duplication-code.patch | 239 - 0063-wd_comp-remove-some-useless-printf.patch | 80 - 0064-sample-add-a-demo-for-comp.patch | 639 - ...tool-modify-uadk_benchmark-toos-code.patch | 291 - ...ols-modify-uadk-benchmark-clean-code.patch | 28 - ...adk-v1-fix-for-cookie-initialization.patch | 55 - ...dk-update-file-permission-on-cleanup.patch | 19 - ...ix-build-warning-of-sec_wd_benchmark.patch | 58 - 0070-rsa-fix-interface-name-and-log-msg.patch | 86 - 0071-uadk-modify-param-verification.patch | 127 - 0072-uadk-v1-cleanup-ret-value.patch | 38 - ...-uadk-wd-fixup-about-checking-device.patch | 46 - 0074-uadk-cleanup-hpre-code.patch | 347 - ...k-v1-fix-pool-cstatus-memset-problem.patch | 31 - ...ix-segment-fault-when-uninitializing.patch | 108 - ...rv-sec-support-sm4-ecb-alg-by-new-fs.patch | 47 - ...fy-the-process-of-represent-BD-state.patch | 74 - 0079-uadk-qm_udrv-Modify-goto-err_out.patch | 45 - 0080-uadk-unify-wd-print-format.patch | 992 - 0081-uadk-v1-fix-wd_bmm-pool_init.patch | 68 - ...adk-v1-fix-wd-create-ctx-memory-leak.patch | 116 - ...adk-mempool-fix-redundant-assignment.patch | 51 - 0084-uadk-v1-fix-del-ctx.patch | 126 - 0085-uadk-v1-clean-code-for-wd.patch | 110 - ...k-v1-fix-drv_reserve_mem-memory-leak.patch | 110 - ...dk-cipher-fix-wd_cipher_check_params.patch | 41 - 0088-sec-unify-print-format.patch | 308 - 0089-drv-hpre-unify-print-format.patch | 514 - 0090-rsa-dh-ecc-unify-print-format.patch | 1294 - ...pre-free-memory-when-BD-sends-failed.patch | 66 - ...pre-add-unlikely-for-branch-prefetch.patch | 29 - 0093-comp-unify-print-format.patch | 207 - 0094-drv-comp-unify-print-format.patch | 217 - ...omp-add-unlikely-for-branch-prefetch.patch | 272 - ...omp-add-unlikely-for-branch-prefetch.patch | 199 - ...-modify-the-return-value-of-function.patch | 73 - ...epoll-flag-from-environment-variable.patch | 955 - ...-test-enable-epoll-in-sanity-scripts.patch | 30 - ...-drv-sec-modification-for-clean-code.patch | 162 - 0101-uadk-fix-mempool-code.patch | 410 - 0102-uadk-some-clean-code-for-wd.patch | 142 - ...-wd-sched-modify-default-sched-param.patch | 108 - 0104-uadk-update-README.patch | 44 - 0105-uadk-add-BD-id-check-for-sync-mode.patch | 406 - ...adk-ecc-optimize-create_ecc_out-line.patch | 80 - ...meter-of-function-has-different-name.patch | 344 - ...x-local-variable-referenced-in-macro.patch | 31 - ...itch-statement-has-no-default-branch.patch | 44 - 0110-uadk-fix-macro-argument.patch | 112 - 0111-uadk-fix-ret-uninit-problem.patch | 29 - 0112-uadk-qm-optimize-sgl-copy-function.patch | 204 - ...oblems-with-referencing-header-files.patch | 823 - ...x-parameter-used-as-working-variable.patch | 761 - ...-move-parameter-check-into-wd_util.c.patch | 305 - 0116-comp-remove-unused-variable-priv.patch | 121 - ...move-the-lock-in-async-send-funciton.patch | 36 - 0118-dh-remove-the-lock-in-async-send.patch | 36 - 0119-comp-remove-the-lock-in-async-send.patch | 39 - 0120-dh-remove-repeated-send-BD.patch | 88 - 0121-ecc-remove-repeated-send-BD.patch | 87 - 0122-rsa-remove-repeated-send-BD.patch | 88 - ...ve-send-and-recv-code-into-wd_util.c.patch | 1040 - ...ssing-header-file-after-install-uadk.patch | 38 - ...port-some-uadk-dfx-stronger-features.patch | 1212 - 0126-uadk-sgl-data-can-be-dumped.patch | 96 - ...supports-zip-and-sec-message-dumping.patch | 631 - ...-uadk-add-device-isolation-interface.patch | 65 - 0129-uadk-add-WD_DEV_ERR-api.patch | 249 - 0130-uadk-ecc-remove-a-redefined-macro.patch | 42 - 0131-uadk-hisi-remove-a-redefined-macro.patch | 40 - ...-doc-fix-text-style-for-wd_design.md.patch | 542 - ...k_tool-Update-some-new-test-features.patch | 1246 - ...-SVA-test-function-of-HPRE-algorithm.patch | 4145 -- ...dd-No-SVA-mode-test-function-to-HPRE.patch | 2590 -- ...SVA-mode-test-function-to-ZIP-module.patch | 1296 - ...-SVA-mode-test-function-for-ZIP-modu.patch | 1295 - 0138-drv-qm-fix-spin-lock-destroy.patch | 115 - ...ify-the-lock-for-send-and-receive-BD.patch | 144 - 0140-uadk-v1-fix-goto-warning.patch | 475 - 0141-uadk-fix-comment-blank.patch | 68 - ...nt-name-in-declaration-and-definitio.patch | 155 - ...x-pointer-parameters-are-not-checked.patch | 126 - 0144-uadk-fix-cqe-phase.patch | 69 - 0145-uadk-v1-fix-include-file-order.patch | 92 - 0146-uadk-fix-BufferOverFlow.patch | 45 - 0147-uadk-fix-macro-argument-warning.patch | 44 - ...adk-driver-init-should-check-ctx-num.patch | 67 - 0149-uadk-fix-cast-pointer-problem.patch | 104 - 0150-uadk-fix-function-params-usage.patch | 60 - 0151-uadk-fix-size_t-usage.patch | 30 - 0152-uadk-fix-atoi-usage.patch | 79 - 0153-uadk-fix-lm-not-link-problem.patch | 37 - ...uadk-remove-unneed-comment-and-macro.patch | 47 - ...move-repeatedly-included-header-file.patch | 56 - 0156-drv-hpre-add-hpre_result_check.patch | 138 - ...move-format-check-to-is_hpre_bin_fmt.patch | 67 - 0158-drv-hpre-change-the-parameter-type.patch | 55 - ...drv-hpre-remove-redundant-blank-line.patch | 27 - ...-qm-add-unlikely-for-branch-prefetch.patch | 71 - 0161-drv-qm-remove-redundant-add-1.patch | 28 - ...move-useless-parameter-sq_head_index.patch | 41 - 0163-uadk-add-wd_-alg-_get_msg.patch | 106 - ...-support-dump-BD-when-BD-checks-fail.patch | 206 - ...bugfix-about-sm2-async-parsing-error.patch | 129 - ...-hpre-bugfix-async-tag-of-rsa-and-dh.patch | 74 - ...hpre-cleanup-ecc-sqe-parsing-process.patch | 47 - libwd-2.3.21.tar.gz | Bin 12540204 -> 0 bytes libwd-2.3.37.tar.gz | Bin 0 -> 670352 bytes warpdrive.spec | 174 +- 170 files changed, 5 insertions(+), 72494 deletions(-) delete mode 100644 0001-uadk-digest-add-stream-mode-for-digest-sync.patch delete mode 100644 0002-test-digest-support-the-digest-stream-mode.patch delete mode 100644 0003-aead-cipher-digest-fix-some-code-issues.patch delete mode 100644 0004-digest-v1-fixed-hmac-key-0-length-checking.patch delete mode 100644 0005-digest-v1-check-the-length-of-the-key-need-to-be-cha.patch delete mode 100644 0006-qm-v1-fixup-the-incorrect-configuration-of-the-type.patch delete mode 100644 0007-qm-fixup-the-incorrect-configuration-of-the-type.patch delete mode 100644 0008-uadk_benchmark-use-the-uadk_tool-instead-of-uadk_ben.patch delete mode 100644 0009-digest-some-optimizations-for-digest-stream-mode.patch delete mode 100644 0010-uadk-fix-error-of-wd_get_avail_ctx-return-value.patch delete mode 100644 0011-uadk-fix-comment-content.patch delete mode 100644 0012-uadk-max-numa-number-should-not-be-fixed.patch delete mode 100644 0013-uadk-mempool-remove-MISC_DVE_UACCE_CTRL.patch delete mode 100644 0014-uadk-mempool-check-stats-null-pointer.patch delete mode 100644 0015-uadk-fix-wd_get_config_numa-info.patch delete mode 100644 0016-uadk-fix-static-check-warning.patch delete mode 100644 0017-uadk-fix-numa-array-use-too-much-stack-space.patch delete mode 100644 0018-uadk-fix-get_dev_info.patch delete mode 100644 0019-uadk-fix-pthread_spin_init.patch delete mode 100644 0020-uadk-env-optimize-find_async_queue.patch delete mode 100644 0021-uadk-env-optimize-some-function.patch delete mode 100644 0022-uadk-v1-delete-unused-parameter.patch delete mode 100644 0023-uadk-env-fix-wd_add_task_to_async_queue-return-value.patch delete mode 100644 0024-uadk-sched-fix-memory-leak.patch delete mode 100644 0025-hisi-sec-bugfix-for-out_bytes-checking.patch delete mode 100644 0026-uadk-tools-modify-NO-SVA-test-scenario.patch delete mode 100644 0027-wd-fix-wd_parse_async_poll_num.patch delete mode 100644 0028-uadk-optimize-wd_init_async_polling_thread_per_numa.patch delete mode 100644 0029-uadk-env-fix-wd_add_task_to_async_queue.patch delete mode 100644 0030-uadk-optimize-find_async_queue.patch delete mode 100644 0031-uadk-fix-check_after_sink.patch delete mode 100644 0032-uadk-fix-wd_request_ctx.patch delete mode 100644 0033-uadk-fix-sched-params-begin-issue.patch delete mode 100644 0034-uadk-optimize-wd_request_ctx.patch delete mode 100644 0035-uadk-env-bugfix-for-wd_init_resource.patch delete mode 100644 0036-uadk-env-fix-wd-ctx-num-init.patch delete mode 100644 0037-uadk-modify-for-free-and-return.patch delete mode 100644 0038-uadk-include-fix-uadk-compatibility.patch delete mode 100644 0039-uadk-fix-for-resources-are-repeatedly-released.patch delete mode 100644 0040-aead-modify-the-aead-s-request-api.patch delete mode 100644 0041-cipher-add-semi-weak-keys-checking.patch delete mode 100644 0042-uadk-ioctl-return-result-should-be-printed.patch delete mode 100644 0043-uadk-fix-environment-uninit-repeatly-error.patch delete mode 100644 0044-uadk-fix-wd_free_ctx-and-wd_uninit_sched_config.patch delete mode 100644 0045-uadk-env-fix-free-ctx-table-memory-leak.patch delete mode 100644 0046-uadk-remove-uadk_benchmark-binary-and-header-file.patch delete mode 100644 0047-uadk-fix-for-wd_env_config-numa_num.patch delete mode 100644 0048-hisi-sec-add-some-dfx-information-in-comments.patch delete mode 100644 0049-hisi-sec-delete-some-dummy-parameter-checking.patch delete mode 100644 0050-hisi-qm-udrv-v1-deleted-a-dummy-branch.patch delete mode 100644 0051-hisi-sec-v1-update-the-SEC-BD1-mode-configuration.patch delete mode 100644 0052-uadk-optimize-algorithm-initialization.patch delete mode 100644 0053-uadk-fix-send-exception-handling.patch delete mode 100644 0054-uadk-sec-fix-hisi_sec_digest_send.patch delete mode 100644 0055-uadk-sec-some-clean-code.patch delete mode 100644 0056-uadk-optimize-wd_ctx_qfr_mmap.patch delete mode 100644 0057-uadk-optimize-wd_sched_rr_instance.patch delete mode 100644 0058-uadk-optimize-wd_get_accel_list.patch delete mode 100644 0059-uadk-fix-staic-check-warning.patch delete mode 100644 0060-uadk-v1-fix-the-waiting-time-for-receiving-task.patch delete mode 100644 0061-uadk-comp-optimize-for-spin-lock.patch delete mode 100644 0062-hisi-comp-cleanup-for-duplication-code.patch delete mode 100644 0063-wd_comp-remove-some-useless-printf.patch delete mode 100644 0064-sample-add-a-demo-for-comp.patch delete mode 100644 0065-uadk-tool-modify-uadk_benchmark-toos-code.patch delete mode 100644 0066-uadk-tools-modify-uadk-benchmark-clean-code.patch delete mode 100644 0067-uadk-v1-fix-for-cookie-initialization.patch delete mode 100644 0068-uadk-update-file-permission-on-cleanup.patch delete mode 100644 0069-uadk_tool-fix-build-warning-of-sec_wd_benchmark.patch delete mode 100644 0070-rsa-fix-interface-name-and-log-msg.patch delete mode 100644 0071-uadk-modify-param-verification.patch delete mode 100644 0072-uadk-v1-cleanup-ret-value.patch delete mode 100644 0073-uadk-wd-fixup-about-checking-device.patch delete mode 100644 0074-uadk-cleanup-hpre-code.patch delete mode 100644 0075-uadk-v1-fix-pool-cstatus-memset-problem.patch delete mode 100644 0076-uadk-bugfix-segment-fault-when-uninitializing.patch delete mode 100644 0077-drv-sec-support-sm4-ecb-alg-by-new-fs.patch delete mode 100644 0078-digest-simplify-the-process-of-represent-BD-state.patch delete mode 100644 0079-uadk-qm_udrv-Modify-goto-err_out.patch delete mode 100644 0080-uadk-unify-wd-print-format.patch delete mode 100644 0081-uadk-v1-fix-wd_bmm-pool_init.patch delete mode 100644 0082-uadk-v1-fix-wd-create-ctx-memory-leak.patch delete mode 100644 0083-uadk-mempool-fix-redundant-assignment.patch delete mode 100644 0084-uadk-v1-fix-del-ctx.patch delete mode 100644 0085-uadk-v1-clean-code-for-wd.patch delete mode 100644 0086-uadk-v1-fix-drv_reserve_mem-memory-leak.patch delete mode 100644 0087-uadk-cipher-fix-wd_cipher_check_params.patch delete mode 100644 0088-sec-unify-print-format.patch delete mode 100644 0089-drv-hpre-unify-print-format.patch delete mode 100644 0090-rsa-dh-ecc-unify-print-format.patch delete mode 100644 0091-drv-hpre-free-memory-when-BD-sends-failed.patch delete mode 100644 0092-v1-hpre-add-unlikely-for-branch-prefetch.patch delete mode 100644 0093-comp-unify-print-format.patch delete mode 100644 0094-drv-comp-unify-print-format.patch delete mode 100644 0095-comp-add-unlikely-for-branch-prefetch.patch delete mode 100644 0096-drv-comp-add-unlikely-for-branch-prefetch.patch delete mode 100644 0097-hisi_hpre-modify-the-return-value-of-function.patch delete mode 100644 0098-uadk-parse-epoll-flag-from-environment-variable.patch delete mode 100644 0099-test-enable-epoll-in-sanity-scripts.patch delete mode 100644 0100-drv-sec-modification-for-clean-code.patch delete mode 100644 0101-uadk-fix-mempool-code.patch delete mode 100644 0102-uadk-some-clean-code-for-wd.patch delete mode 100644 0103-wd-sched-modify-default-sched-param.patch delete mode 100644 0104-uadk-update-README.patch delete mode 100644 0105-uadk-add-BD-id-check-for-sync-mode.patch delete mode 100644 0106-uadk-ecc-optimize-create_ecc_out-line.patch delete mode 100644 0107-uadk-fix-parameter-of-function-has-different-name.patch delete mode 100644 0108-uadk-ecc-fix-local-variable-referenced-in-macro.patch delete mode 100644 0109-uadk-fix-switch-statement-has-no-default-branch.patch delete mode 100644 0110-uadk-fix-macro-argument.patch delete mode 100644 0111-uadk-fix-ret-uninit-problem.patch delete mode 100644 0112-uadk-qm-optimize-sgl-copy-function.patch delete mode 100644 0113-uadk-fix-problems-with-referencing-header-files.patch delete mode 100644 0114-uadk-fix-parameter-used-as-working-variable.patch delete mode 100644 0115-uadk-move-parameter-check-into-wd_util.c.patch delete mode 100644 0116-comp-remove-unused-variable-priv.patch delete mode 100644 0117-ecc-remove-the-lock-in-async-send-funciton.patch delete mode 100644 0118-dh-remove-the-lock-in-async-send.patch delete mode 100644 0119-comp-remove-the-lock-in-async-send.patch delete mode 100644 0120-dh-remove-repeated-send-BD.patch delete mode 100644 0121-ecc-remove-repeated-send-BD.patch delete mode 100644 0122-rsa-remove-repeated-send-BD.patch delete mode 100644 0123-uadk-move-send-and-recv-code-into-wd_util.c.patch delete mode 100644 0124-uadk-missing-header-file-after-install-uadk.patch delete mode 100644 0125-uadk-support-some-uadk-dfx-stronger-features.patch delete mode 100644 0126-uadk-sgl-data-can-be-dumped.patch delete mode 100644 0127-uadk-supports-zip-and-sec-message-dumping.patch delete mode 100644 0128-uadk-add-device-isolation-interface.patch delete mode 100644 0129-uadk-add-WD_DEV_ERR-api.patch delete mode 100644 0130-uadk-ecc-remove-a-redefined-macro.patch delete mode 100644 0131-uadk-hisi-remove-a-redefined-macro.patch delete mode 100644 0132-uadk-doc-fix-text-style-for-wd_design.md.patch delete mode 100644 0133-uadk_tool-Update-some-new-test-features.patch delete mode 100644 0134-uadk_tool-Add-SVA-test-function-of-HPRE-algorithm.patch delete mode 100644 0135-uadk_tool-Add-No-SVA-mode-test-function-to-HPRE.patch delete mode 100644 0136-uadk_tool-Add-SVA-mode-test-function-to-ZIP-module.patch delete mode 100644 0137-uadk_tool-Add-NO-SVA-mode-test-function-for-ZIP-modu.patch delete mode 100644 0138-drv-qm-fix-spin-lock-destroy.patch delete mode 100644 0139-drv-qm-modify-the-lock-for-send-and-receive-BD.patch delete mode 100644 0140-uadk-v1-fix-goto-warning.patch delete mode 100644 0141-uadk-fix-comment-blank.patch delete mode 100644 0142-uadk-fix-different-name-in-declaration-and-definitio.patch delete mode 100644 0143-uadk-fix-pointer-parameters-are-not-checked.patch delete mode 100644 0144-uadk-fix-cqe-phase.patch delete mode 100644 0145-uadk-v1-fix-include-file-order.patch delete mode 100644 0146-uadk-fix-BufferOverFlow.patch delete mode 100644 0147-uadk-fix-macro-argument-warning.patch delete mode 100644 0148-uadk-driver-init-should-check-ctx-num.patch delete mode 100644 0149-uadk-fix-cast-pointer-problem.patch delete mode 100644 0150-uadk-fix-function-params-usage.patch delete mode 100644 0151-uadk-fix-size_t-usage.patch delete mode 100644 0152-uadk-fix-atoi-usage.patch delete mode 100644 0153-uadk-fix-lm-not-link-problem.patch delete mode 100644 0154-uadk-remove-unneed-comment-and-macro.patch delete mode 100644 0155-drv-hpre-remove-repeatedly-included-header-file.patch delete mode 100644 0156-drv-hpre-add-hpre_result_check.patch delete mode 100644 0157-drv-hpre-move-format-check-to-is_hpre_bin_fmt.patch delete mode 100644 0158-drv-hpre-change-the-parameter-type.patch delete mode 100644 0159-drv-hpre-remove-redundant-blank-line.patch delete mode 100644 0160-drv-qm-add-unlikely-for-branch-prefetch.patch delete mode 100644 0161-drv-qm-remove-redundant-add-1.patch delete mode 100644 0162-drv-qm-remove-useless-parameter-sq_head_index.patch delete mode 100644 0163-uadk-add-wd_-alg-_get_msg.patch delete mode 100644 0164-drv-hpre-support-dump-BD-when-BD-checks-fail.patch delete mode 100644 0165-drv-hpre-bugfix-about-sm2-async-parsing-error.patch delete mode 100644 0166-drv-hpre-bugfix-async-tag-of-rsa-and-dh.patch delete mode 100644 0167-drv-hpre-cleanup-ecc-sqe-parsing-process.patch delete mode 100644 libwd-2.3.21.tar.gz create mode 100644 libwd-2.3.37.tar.gz diff --git a/0001-uadk-digest-add-stream-mode-for-digest-sync.patch b/0001-uadk-digest-add-stream-mode-for-digest-sync.patch deleted file mode 100644 index f3f2a27..0000000 --- a/0001-uadk-digest-add-stream-mode-for-digest-sync.patch +++ /dev/null @@ -1,213 +0,0 @@ -From c1e75c6c27ea54dec9e31223af49e33aa0d38490 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Mon, 13 Dec 2021 18:55:32 +0800 -Subject: [PATCH 01/28] uadk/digest - add stream mode for digest sync - -Support the sec digest steam mode. Using the session to store -the stream BD state, using the iv_bytes to notify the BD state -from message. So one session only supports one stream. User -can use the has_next flag to indicate whether there is any -packet to be input. - -Signed-off-by: Kai Ye ---- - drv/hisi_sec.c | 50 ++++++++++++++++++++----------------- - include/drv/wd_digest_drv.h | 2 ++ - wd_digest.c | 20 ++++++++++++--- - 3 files changed, 46 insertions(+), 26 deletions(-) - -diff --git a/drv/hisi_sec.c b/drv/hisi_sec.c -index e43ded2..2fd23f3 100644 ---- a/drv/hisi_sec.c -+++ b/drv/hisi_sec.c -@@ -73,6 +73,8 @@ - /* The max BD data length is 16M-512B */ - #define MAX_INPUT_DATA_LEN 0xFFFE00 - #define MAX_CCM_AAD_LEN 65279 -+#define SHA1_ALIGN_SZ 64 -+#define SHA512_ALIGN_SZ 128 - - #define AUTHPAD_OFFSET 2 - #define AUTHTYPE_OFFSET 6 -@@ -1229,31 +1231,24 @@ static int fill_digest_bd2_alg(struct wd_digest_msg *msg, - static void qm_fill_digest_long_bd(struct wd_digest_msg *msg, - struct hisi_sec_sqe *sqe) - { -- struct wd_digest_tag *digest_tag = (void *)(uintptr_t)msg->usr_data; - __u64 total_bits; - - if (msg->has_next && (msg->iv_bytes == 0)) { - /* LONG BD FIRST */ - sqe->ai_apd_cs = AI_GEN_INNER; - sqe->ai_apd_cs |= AUTHPAD_NOPAD << AUTHPAD_OFFSET; -- msg->iv_bytes = msg->out_bytes; - } else if (msg->has_next && (msg->iv_bytes != 0)) { - /* LONG BD MIDDLE */ - sqe->ai_apd_cs = AI_GEN_IVIN_ADDR; - sqe->ai_apd_cs |= AUTHPAD_NOPAD << AUTHPAD_OFFSET; - sqe->type2.a_ivin_addr = sqe->type2.mac_addr; -- msg->iv_bytes = msg->out_bytes; - } else if (!msg->has_next && (msg->iv_bytes != 0)) { - /* LONG BD END */ - sqe->ai_apd_cs = AI_GEN_IVIN_ADDR; - sqe->ai_apd_cs |= AUTHPAD_PAD << AUTHPAD_OFFSET; - sqe->type2.a_ivin_addr = sqe->type2.mac_addr; -- total_bits = digest_tag->long_data_len * BYTE_BITS; -+ total_bits = msg->long_data_len * BYTE_BITS; - sqe->type2.long_a_data_len = total_bits; -- msg->iv_bytes = 0; -- } else { -- /* SHORT BD */ -- msg->iv_bytes = 0; - } - } - -@@ -1282,21 +1277,37 @@ static void parse_digest_bd2(struct hisi_sec_sqe *sqe, struct wd_digest_msg *rec - #endif - } - --static int digest_len_check(struct wd_digest_msg *msg, enum sec_bd_type type) -+static int digest_long_bd_check(struct wd_digest_msg *msg) - { -- if (type == BD_TYPE2 && msg->in_bytes == 0) { -- WD_ERR("digest bd2 not supports 0 packet!\n"); -+ if (msg->alg >= WD_DIGEST_SHA512 && msg->in_bytes % SHA512_ALIGN_SZ) -+ return -WD_EINVAL; -+ else if (msg->in_bytes % SHA1_ALIGN_SZ) -+ return -WD_EINVAL; -+ -+ return 0; -+} -+ -+static int digest_len_check(struct wd_digest_msg *msg, enum sec_bd_type type) -+{ -+ int ret; -+ -+ /* End BD not need to check the input zero bytes */ -+ if (unlikely(type == BD_TYPE2 && (!msg->has_next && msg->in_bytes == 0))) { -+ WD_ERR("kunpeng 920, digest mode not support 0 size!\n"); - return -WD_EINVAL; - } - - if (unlikely(msg->in_bytes > MAX_INPUT_DATA_LEN)) { -- WD_ERR("failed to check digest input data length!\n"); -+ WD_ERR("input data length is too long, size:%u!\n", msg->in_bytes); - return -WD_EINVAL; - } - -- if (unlikely(msg->out_bytes & WORD_ALIGNMENT_MASK)) { -- WD_ERR("failed to check digest out length!\n"); -- return -WD_EINVAL; -+ if (msg->has_next) { -+ ret = digest_long_bd_check(msg); -+ if (ret) { -+ WD_ERR("input data isn't aligned, size:%u!\n", msg->in_bytes); -+ return -WD_EINVAL; -+ } - } - - return 0; -@@ -1435,31 +1446,24 @@ static int fill_digest_bd3_alg(struct wd_digest_msg *msg, - static void qm_fill_digest_long_bd3(struct wd_digest_msg *msg, - struct hisi_sec_sqe3 *sqe) - { -- struct wd_digest_tag *digest_tag = (void *)(uintptr_t)msg->usr_data; - __u64 total_bits; - - if (msg->has_next && (msg->iv_bytes == 0)) { - /* LONG BD FIRST */ - sqe->auth_mac_key |= AI_GEN_INNER << SEC_AI_GEN_OFFSET_V3; - sqe->stream_scene.stream_auth_pad = AUTHPAD_NOPAD; -- msg->iv_bytes = msg->out_bytes; - } else if (msg->has_next && (msg->iv_bytes != 0)) { - /* LONG BD MIDDLE */ - sqe->auth_mac_key |= AI_GEN_IVIN_ADDR << SEC_AI_GEN_OFFSET_V3; - sqe->stream_scene.stream_auth_pad = AUTHPAD_NOPAD; - sqe->auth_ivin.a_ivin_addr = sqe->mac_addr; -- msg->iv_bytes = msg->out_bytes; - } else if (!msg->has_next && (msg->iv_bytes != 0)) { - /* LONG BD END */ - sqe->auth_mac_key |= AI_GEN_IVIN_ADDR << SEC_AI_GEN_OFFSET_V3; - sqe->stream_scene.stream_auth_pad = AUTHPAD_PAD; - sqe->auth_ivin.a_ivin_addr = sqe->mac_addr; -- total_bits = digest_tag->long_data_len * BYTE_BITS; -+ total_bits = msg->long_data_len * BYTE_BITS; - sqe->stream_scene.long_a_data_len = total_bits; -- msg->iv_bytes = 0; -- } else { -- /* SHORT BD */ -- msg->iv_bytes = 0; - } - } - -diff --git a/include/drv/wd_digest_drv.h b/include/drv/wd_digest_drv.h -index 8ccf291..ac3b028 100644 ---- a/include/drv/wd_digest_drv.h -+++ b/include/drv/wd_digest_drv.h -@@ -45,6 +45,8 @@ struct wd_digest_msg { - __u8 *in; - /* output data pointer */ - __u8 *out; -+ /* total of data for stream mode */ -+ __u64 long_data_len; - }; - - struct wd_digest_driver { -diff --git a/wd_digest.c b/wd_digest.c -index 22aa98e..c110f7b 100644 ---- a/wd_digest.c -+++ b/wd_digest.c -@@ -46,6 +46,10 @@ struct wd_digest_sess { - unsigned char key[MAX_HMAC_KEY_SIZE]; - __u32 key_bytes; - void *sched_key; -+ /* Notify the BD state */ -+ int state; -+ /* Total of data for stream mode */ -+ __u64 long_data_len; - }; - - struct wd_env_config wd_digest_env_config; -@@ -286,11 +290,19 @@ static void fill_request_msg(struct wd_digest_msg *msg, - msg->in_bytes = req->in_bytes; - msg->out = req->out; - msg->out_bytes = req->out_bytes; -- msg->has_next = req->has_next; - msg->data_fmt = req->data_fmt; -+ msg->has_next = req->has_next; -+ sess->long_data_len += req->in_bytes; -+ msg->long_data_len = sess->long_data_len; -+ /* To store the stream bd state */ -+ msg->iv_bytes = sess->state; -+ if (req->has_next == 0) { -+ sess->long_data_len = 0; -+ sess->state = 0; -+ } - } - --static int send_recv_sync(struct wd_ctx_internal *ctx, -+static int send_recv_sync(struct wd_ctx_internal *ctx, struct wd_digest_sess *dsess, - struct wd_digest_msg *msg) - { - __u64 recv_cnt = 0; -@@ -320,6 +332,8 @@ static int send_recv_sync(struct wd_ctx_internal *ctx, - goto out; - } - } -+ if (msg->has_next) -+ dsess->state = msg->out_bytes; - } while (ret < 0); - - out: -@@ -353,7 +367,7 @@ int wd_do_digest_sync(handle_t h_sess, struct wd_digest_req *req) - return ret; - - ctx = config->ctxs + idx; -- ret = send_recv_sync(ctx, &msg); -+ ret = send_recv_sync(ctx, dsess, &msg); - req->state = msg.result; - - return ret; --- -2.31.1 - diff --git a/0002-test-digest-support-the-digest-stream-mode.patch b/0002-test-digest-support-the-digest-stream-mode.patch deleted file mode 100644 index 137e5ff..0000000 --- a/0002-test-digest-support-the-digest-stream-mode.patch +++ /dev/null @@ -1,508 +0,0 @@ -From 08d633649d4a3c557bf042241e3953c3dd5cf586 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Thu, 9 Sep 2021 19:18:05 +0800 -Subject: [PATCH 02/28] test/digest: support the digest stream mode - -Test the digest stream mode by compare to no stream mode. -Tools supports the multiple thread testing. - -For example: -test_hisi_sec --digest 0 --sync --optype 3 --pktlen 1024 \ - --keylen 16 --times 1 --multi 2 -more details: - test_hisi_sec --help - -Signed-off-by: Kai Ye ---- - test/hisi_sec_test/test_hisi_sec.c | 370 ++++++++++++++++++++++++++++- - test/hisi_sec_test/test_hisi_sec.h | 4 +- - 2 files changed, 360 insertions(+), 14 deletions(-) - -diff --git a/test/hisi_sec_test/test_hisi_sec.c b/test/hisi_sec_test/test_hisi_sec.c -index a2dba05..e1521f6 100644 ---- a/test/hisi_sec_test/test_hisi_sec.c -+++ b/test/hisi_sec_test/test_hisi_sec.c -@@ -6,6 +6,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -53,6 +54,8 @@ static unsigned int g_data_fmt = WD_FLAT_BUF; - static unsigned int g_sgl_num = 0; - static pthread_spinlock_t lock = 0; - -+static struct hash_testvec g_long_hash_tv; -+ - char *skcipher_names[MAX_ALGO_PER_TYPE] = - {"ecb(aes)", "cbc(aes)", "xts(aes)", "ofb(aes)", "cfb(aes)", "ecb(des3_ede)", - "cbc(des3_ede)", "cbc(sm4)", "xts(sm4)", "ofb(sm4)", "cfb(sm4)", "ecb(sm4)", NULL,}; -@@ -1509,7 +1512,7 @@ int get_digest_resource(struct hash_testvec **alg_tv, int* alg, int* mode) - } - if (g_ivlen == 1) { - tmp_tv = tv; -- tv = &long_hash_tv_template[0]; -+ tv = &g_long_hash_tv; - tv->dsize = tmp_tv->dsize; - } else if (g_ivlen == 2) { - tmp_tv = tv; -@@ -1587,7 +1590,7 @@ static int sec_digest_sync_once(void) - - /* if mode is HMAC, should set key */ - if (setup.mode == WD_DIGEST_HMAC) { -- ret = wd_digest_set_key(h_sess, (const __u8*)tv->key, tv->ksize); -+ ret = wd_digest_set_key(h_sess, (const __u8 *)tv->key, tv->ksize); - if (ret) { - SEC_TST_PRT("sess set key failed!\n"); - goto out_key; -@@ -1622,6 +1625,311 @@ out_src: - return ret; - } - -+static int sec_digest_sync_stream_cmp(void) -+{ -+ struct wd_digest_sess_setup setup = {0}; -+ struct hash_testvec *tv = NULL; -+ handle_t h_sess = 0; -+ struct wd_digest_req req; -+ unsigned long cnt = g_times; -+ int ret; -+ size_t unit_sz; -+ -+ /* config setup */ -+ ret = init_digest_ctx_config(CTX_TYPE_ENCRYPT, CTX_MODE_SYNC); -+ if (ret) { -+ SEC_TST_PRT("Fail to init sigle ctx config!\n"); -+ return ret; -+ } -+ -+ /* config arg */ -+ memset(&req, 0, sizeof(struct wd_digest_req)); -+ get_digest_resource(&tv, (int *)&setup.alg, (int *)&setup.mode); -+ -+ unit_sz = cal_unit_sz(BUFF_SIZE * 8, g_sgl_num); -+ req.in = create_buf(g_data_fmt, BUFF_SIZE * 8, unit_sz); -+ if (!req.in) { -+ ret = -ENOMEM; -+ goto out_src; -+ } -+ -+ req.in_bytes = tv->psize; -+ copy_mem(g_data_fmt, req.in, WD_FLAT_BUF, -+ (void *)tv->plaintext, tv->psize); -+ -+ req.out = create_buf(WD_FLAT_BUF, BUFF_SIZE, unit_sz); -+ if (!req.out) { -+ ret = -ENOMEM; -+ goto out_dst; -+ } -+ -+ req.out_buf_bytes = BUFF_SIZE; -+ req.out_bytes = tv->dsize; -+ req.data_fmt = g_data_fmt; -+ req.has_next = 0; -+ -+ h_sess = wd_digest_alloc_sess(&setup); -+ if (!h_sess) { -+ ret = -EINVAL; -+ goto out_sess; -+ } -+ -+ /* if mode is HMAC, should set key */ -+ ret = wd_digest_set_key(h_sess, (const __u8 *)tv->key, tv->ksize); -+ if (ret) { -+ SEC_TST_PRT("sess set key failed!\n"); -+ goto out_key; -+ } -+ -+ while (cnt) { -+ ret = wd_do_digest_sync(h_sess, &req); -+ cnt--; -+ } -+ -+ SEC_TST_PRT("one hash BD dump the out memory, cmp the stream mode:\n"); -+ dump_mem(WD_FLAT_BUF, req.out, 16); -+ -+out_key: -+ wd_digest_free_sess(h_sess); -+out_sess: -+ free_buf(WD_FLAT_BUF, req.out); -+out_dst: -+ free_buf(g_data_fmt, req.in); -+out_src: -+ digest_uninit_config(); -+ -+ return ret; -+} -+ -+static int sec_digest_sync_stream_mode(void) -+{ -+ struct wd_digest_sess_setup setup; -+ struct hash_testvec *tv = NULL; -+ handle_t h_sess = 0; -+ struct wd_digest_req req; -+ unsigned long cnt = g_times; -+ int ret, data_len; -+ void *bak_in = NULL; -+ -+ /* config setup */ -+ ret = init_digest_ctx_config(CTX_TYPE_ENCRYPT, CTX_MODE_SYNC); -+ if (ret) { -+ SEC_TST_PRT("Fail to init sigle ctx config!\n"); -+ return ret; -+ } -+ -+ /* config arg */ -+ memset(&req, 0, sizeof(struct wd_digest_req)); -+ get_digest_resource(&tv, (int *)&setup.alg, (int *)&setup.mode); -+ -+ req.in = malloc(BUFF_SIZE * 8); -+ if (!req.in) { -+ SEC_TST_PRT("req src in mem malloc failed!\n"); -+ ret = -1; -+ goto out; -+ } -+ bak_in = req.in; -+ -+ memcpy(req.in, tv->plaintext, tv->psize); -+ req.in_bytes = tv->psize; -+ -+ req.out = malloc(BUFF_SIZE); -+ if (!req.out) { -+ SEC_TST_PRT("req dst out mem malloc failed!\n"); -+ ret = -1; -+ goto out; -+ } -+ -+ req.out_buf_bytes = BUFF_SIZE; -+ req.out_bytes = tv->dsize; -+ req.data_fmt = g_data_fmt; -+ req.has_next = 0; -+ -+ h_sess = wd_digest_alloc_sess(&setup); -+ if (!h_sess) { -+ ret = -1; -+ goto out; -+ } -+ data_len = tv->psize; -+ -+ /* if mode is HMAC, should set key */ -+ ret = wd_digest_set_key(h_sess, (const __u8 *)tv->key, tv->ksize); -+ if (ret) { -+ SEC_TST_PRT("sess set key failed!\n"); -+ goto out; -+ } -+ -+ -+ while (cnt) { -+ do { -+ if (data_len > 256) { // soft block size -+ req.in_bytes = 256; -+ data_len -= 256; -+ req.has_next = 1; -+ } else { -+ req.has_next = 0; -+ req.in_bytes = data_len; -+ } -+ ret = wd_do_digest_sync(h_sess, &req); -+ -+ if (ret) -+ goto out; -+ -+ if (req.has_next != 0) -+ req.in += 256; -+ else -+ break; -+ } while (true); -+ data_len = tv->psize; -+ req.has_next = 0; -+ req.in = bak_in; -+ memcpy(req.in, tv->plaintext, tv->psize); -+ cnt--; -+ } -+ SEC_TST_PRT("long hash BD dump the out memory:--------->:\n"); -+ dump_mem(g_data_fmt, req.out, 16); -+ -+out: -+ free(req.out); -+ free(req.in); -+ if (h_sess) -+ wd_digest_free_sess(h_sess); -+ -+ digest_uninit_config(); -+ return ret; -+} -+ -+void *digest_sync_stream_mode_send_td(void *data) -+{ -+ int thread_id = (int)syscall(__NR_gettid); -+ struct wd_digest_sess_setup setup = {0}; -+ struct hash_testvec *tv = NULL; -+ unsigned long cnt = g_times; -+ struct wd_digest_req req; -+ int ret, data_len; -+ void *bak_in = NULL; -+ handle_t h_sess = 0; -+ -+ get_digest_resource(&tv, (int *)&setup.alg, (int *)&setup.mode); -+ -+ h_sess = wd_digest_alloc_sess(&setup); -+ if (!h_sess) { -+ ret = -EINVAL; -+ return NULL; -+ } -+ -+ /* if mode is HMAC, should set key */ -+ ret = wd_digest_set_key(h_sess, (const __u8 *)tv->key, tv->ksize); -+ if (ret) { -+ SEC_TST_PRT("sess set key failed!\n"); -+ goto out_key; -+ } -+ -+ /* config arg */ -+ memset(&req, 0, sizeof(struct wd_digest_req)); -+ -+ req.in = malloc(BUFF_SIZE * 8); -+ if (!req.in) { -+ SEC_TST_PRT("req src in mem malloc failed!\n"); -+ ret = -1; -+ goto out; -+ } -+ bak_in = req.in; -+ -+ memcpy(req.in, tv->plaintext, tv->psize); -+ req.in_bytes = tv->psize; -+ -+ req.out = malloc(BUFF_SIZE); -+ if (!req.out) { -+ SEC_TST_PRT("req dst out mem malloc failed!\n"); -+ ret = -1; -+ goto out; -+ } -+ -+ req.out_buf_bytes = BUFF_SIZE; -+ req.out_bytes = tv->dsize; -+ req.data_fmt = g_data_fmt; -+ req.has_next = 0; -+ -+ data_len = tv->psize; -+ -+ while (cnt) { -+ do { -+ if (data_len > 256) { // soft block size -+ req.in_bytes = 256; -+ data_len -= 256; -+ req.has_next = 1; -+ } else { -+ req.has_next = 0; -+ req.in_bytes = data_len; -+ } -+ ret = wd_do_digest_sync(h_sess, &req); -+ -+ if (ret) -+ goto out; -+ -+ if (req.has_next != 0) -+ req.in += 256; -+ else -+ break; -+ -+ } while (true); -+ data_len = tv->psize; -+ req.has_next = 0; -+ req.in = bak_in; -+ memcpy(req.in, tv->plaintext, tv->psize); -+ cnt--; -+ } -+ SEC_TST_PRT("Pid - %d, thread-id - %d, long hash BD dump the out memory:\n", getpid(), thread_id); -+ dump_mem(g_data_fmt, req.out, 16); -+out_key: -+ wd_digest_free_sess(h_sess); -+out: -+ if (req.out) -+ free(req.out); -+ if (bak_in) -+ free(bak_in); -+ return NULL; -+} -+ -+static int sec_digest_sync_stream_mode_multi(void) -+{ -+ static pthread_t sendtd[64]; -+ thread_data_d td_data; -+ int i, ret; -+ -+ /* config setup */ -+ ret = init_digest_ctx_config(CTX_TYPE_ENCRYPT, CTX_MODE_SYNC); -+ if (ret) { -+ SEC_TST_PRT("Fail to init sigle ctx config!\n"); -+ return ret; -+ } -+ -+ /* send thread */ -+ td_data.send_num = g_times; -+ td_data.recv_num = g_times; -+ for (i = 0; i < g_thread_num; i++) { -+ ret = pthread_create(&sendtd[i], NULL, digest_sync_stream_mode_send_td, &td_data); -+ if (ret) { -+ SEC_TST_PRT("Create send thread fail!\n"); -+ goto out_thr; -+ } -+ } -+ -+ /* join thread */ -+ for (i = 0; i < g_thread_num; i++) { -+ ret = pthread_join(sendtd[i], NULL); -+ if (ret) { -+ SEC_TST_PRT("Join sendtd thread fail!\n"); -+ goto out_thr; -+ } -+ } -+ -+out_thr: -+ digest_uninit_config(); -+ return ret; -+} -+ - static void *digest_async_cb(void *data) - { - // struct wd_digest_req *req = (struct wd_digest_req *)data; -@@ -1791,7 +2099,7 @@ static int sec_digest_async_once(void) - - /* if mode is HMAC, should set key */ - if (setup.mode == WD_DIGEST_HMAC) { -- ret = wd_digest_set_key(h_sess, (const __u8*)tv->key, tv->ksize); -+ ret = wd_digest_set_key(h_sess, (const __u8 *)tv->key, tv->ksize); - if (ret) { - SEC_TST_PRT("sess set key failed!\n"); - goto out_key; -@@ -1895,7 +2203,7 @@ static int sec_digest_sync_multi(void) - - /* if mode is HMAC, should set key */ - if (setup.mode == WD_DIGEST_HMAC) { -- ret = wd_digest_set_key(h_sess, (const __u8*)tv->key, tv->ksize); -+ ret = wd_digest_set_key(h_sess, (const __u8 *)tv->key, tv->ksize); - if (ret) { - SEC_TST_PRT("sess set key failed!\n"); - goto out_key; -@@ -1998,7 +2306,7 @@ static int sec_digest_async_multi(void) - - /* if mode is HMAC, should set key */ - if (setup.mode == WD_DIGEST_HMAC) { -- ret = wd_digest_set_key(h_sess, (const __u8*)tv->key, tv->ksize); -+ ret = wd_digest_set_key(h_sess, (const __u8 *)tv->key, tv->ksize); - if (ret) { - SEC_TST_PRT("sess set key failed!\n"); - goto out; -@@ -3471,7 +3779,7 @@ out_thr: - static void print_help(void) - { - SEC_TST_PRT("NAME\n"); -- SEC_TST_PRT(" test_hisi_sec: test wd sec function,etc\n"); -+ SEC_TST_PRT(" test_hisi_sec: test wd sec function,etc\n"); - SEC_TST_PRT("USAGE\n"); - SEC_TST_PRT(" test_hisi_sec [--cipher] [--digest] [--aead] [--perf]\n"); - SEC_TST_PRT(" test_hisi_sec [--optype] [--pktlen] [--keylen] [--times]\n"); -@@ -3498,6 +3806,7 @@ static void print_help(void) - SEC_TST_PRT(" [--optype]:\n"); - SEC_TST_PRT(" 0 : encryption operation or normal mode for hash\n"); - SEC_TST_PRT(" 1 : decryption operation or hmac mode for hash\n"); -+ SEC_TST_PRT(" 3 : hmac mode for stream hash mode\n"); - SEC_TST_PRT(" [--pktlen]:\n"); - SEC_TST_PRT(" set the length of BD message in bytes\n"); - SEC_TST_PRT(" [--keylen]:\n"); -@@ -3514,10 +3823,12 @@ static void print_help(void) - SEC_TST_PRT(" the number of QP queues used by the entire test task\n"); - SEC_TST_PRT(" [--help] = usage\n"); - SEC_TST_PRT("Example\n"); -- SEC_TST_PRT(" ./test_hisi_sec --cipher 0 --sync --optype 0 \n"); -- SEC_TST_PRT(" --pktlen 16 --keylen 16 --times 1 --multi 1\n"); -- SEC_TST_PRT(" ./test_hisi_sec --perf --sync --pktlen 1024 --block 1024 \n"); -- SEC_TST_PRT(" --blknum 100000 --times 10000 --multi 1 --ctxnum 1\n"); -+ SEC_TST_PRT(" ./test_hisi_sec --cipher 0 --sync --optype 0\n"); -+ SEC_TST_PRT("--pktlen 16 --keylen 16 --times 1 --multi 1\n"); -+ SEC_TST_PRT(" ./test_hisi_sec --digest 0 --sync --optype 3\n"); -+ SEC_TST_PRT("--pktlen 16 --keylen 16 --times 1 --multi 2\n"); -+ SEC_TST_PRT(" ./test_hisi_sec --perf --sync --pktlen 1024 --block 1024\n"); -+ SEC_TST_PRT("--blknum 100000 --times 10000 --multi 1 --ctxnum 1\n"); - SEC_TST_PRT("UPDATE:2020-11-06\n"); - } - -@@ -3684,6 +3995,28 @@ static int test_sec_default_case() - return test_sec_cipher_sync_once(); - } - -+static void long_hash_data_init(void) -+{ -+ g_long_hash_tv.plaintext = malloc(g_pktlen); -+ if (g_long_hash_tv.plaintext == NULL) -+ return; -+ -+ g_long_hash_tv.psize = g_pktlen; -+ -+ g_long_hash_tv.key = malloc(16); -+ if (g_long_hash_tv.key == NULL) { -+ free(g_long_hash_tv.plaintext); -+ return; -+ } -+ g_long_hash_tv.ksize = 16; -+} -+ -+static void long_hash_data_uninit(void) -+{ -+ free(g_long_hash_tv.plaintext); -+ free(g_long_hash_tv.key); -+} -+ - static int test_sec_run(__u32 sync_mode, __u32 alg_class) - { - int ret = 0; -@@ -3698,13 +4031,26 @@ static int test_sec_run(__u32 sync_mode, __u32 alg_class) - SEC_TST_PRT("currently cipher test is synchronize once, one thread!\n"); - } - } else if (alg_class == DIGEST_CLASS) { -- if (g_thread_num > 1) { -- SEC_TST_PRT("currently digest test is synchronize multi -%d threads!\n", g_thread_num); -+ SEC_TST_PRT("hisi_sec HMAC-digest mode.\n"); -+ long_hash_data_init(); -+ if (g_thread_num > 1 && g_direction != 3) { -+ SEC_TST_PRT("currently digest test is synchronize psize:%u, multi -%d threads!\n", g_pktlen, g_thread_num); - ret = sec_digest_sync_multi(); -+ } else if (g_thread_num > 1 && g_direction == 3) { -+ ret = sec_digest_sync_stream_mode_multi(); -+ (void)sec_digest_sync_stream_cmp(); -+ SEC_TST_PRT("currently digest long hash mode, psize:%u, multi thread!\n", g_pktlen); -+ } else if (g_thread_num == 1 && g_direction == 3) { -+ if (g_ivlen == 1) { -+ ret = sec_digest_sync_stream_mode(); -+ (void)sec_digest_sync_stream_cmp(); -+ SEC_TST_PRT("currently digest long hash mode, psize:%u, one thread!\n", g_pktlen); -+ } - } else { - ret = sec_digest_sync_once(); - SEC_TST_PRT("currently digest test is synchronize once, one thread!\n"); - } -+ long_hash_data_uninit(); - } else if (alg_class == AEAD_CLASS) { - if (g_thread_num > 1) { - SEC_TST_PRT("currently aead test is synchronize multi -%d threads!\n", g_thread_num); -diff --git a/test/hisi_sec_test/test_hisi_sec.h b/test/hisi_sec_test/test_hisi_sec.h -index f0d0812..defd3c4 100644 ---- a/test/hisi_sec_test/test_hisi_sec.h -+++ b/test/hisi_sec_test/test_hisi_sec.h -@@ -41,8 +41,8 @@ struct cipher_testvec { - }; - - struct hash_testvec { -- const char *key; -- const char *plaintext; -+ char *key; -+ char *plaintext; - const char *digest; - unsigned int psize; - unsigned short ksize; --- -2.31.1 - diff --git a/0003-aead-cipher-digest-fix-some-code-issues.patch b/0003-aead-cipher-digest-fix-some-code-issues.patch deleted file mode 100644 index e96da7f..0000000 --- a/0003-aead-cipher-digest-fix-some-code-issues.patch +++ /dev/null @@ -1,82 +0,0 @@ -From a119cf2838ee41078c452f93d5b48bea2561dfcc Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Tue, 14 Dec 2021 19:24:47 +0800 -Subject: [PATCH 03/28] aead/cipher/digest: fix some code issues - -1. Due to the schedule already has the a checking for poll - policy, so delete the checking for poll policy in poll. -2. modify some comments. - -Signed-off-by: Kai Ye ---- - wd_aead.c | 9 ++------- - wd_cipher.c | 5 ----- - wd_digest.c | 5 ----- - 3 files changed, 2 insertions(+), 17 deletions(-) - -diff --git a/wd_aead.c b/wd_aead.c -index 54bd28d..f93f791 100644 ---- a/wd_aead.c -+++ b/wd_aead.c -@@ -367,12 +367,12 @@ static int aead_param_check(struct wd_aead_sess *sess, - static int aead_init_check(struct wd_ctx_config *config, struct wd_sched *sched) - { - if (!config || !sched) { -- WD_ERR("failed to check aead init input param!\n"); -+ WD_ERR("wd aead config or sched is NULL!\n"); - return -WD_EINVAL; - } - - if (!wd_is_sva(config->ctxs[0].ctx)) { -- WD_ERR("failed to system is SVA mode!\n"); -+ WD_ERR("err, non sva, please check system!\n"); - return -WD_EINVAL; - } - -@@ -660,11 +660,6 @@ int wd_aead_poll(__u32 expt, __u32 *count) - handle_t h_ctx = wd_aead_setting.sched.h_sched_ctx; - struct wd_sched *sched = &wd_aead_setting.sched; - -- if (unlikely(!sched->poll_policy)) { -- WD_ERR("failed to check aead poll_policy!\n"); -- return -WD_EINVAL; -- } -- - return sched->poll_policy(h_ctx, expt, count); - } - -diff --git a/wd_cipher.c b/wd_cipher.c -index f9d643d..9977765 100644 ---- a/wd_cipher.c -+++ b/wd_cipher.c -@@ -580,11 +580,6 @@ int wd_cipher_poll(__u32 expt, __u32 *count) - handle_t h_ctx = wd_cipher_setting.sched.h_sched_ctx; - struct wd_sched *sched = &wd_cipher_setting.sched; - -- if (unlikely(!sched->poll_policy)) { -- WD_ERR("failed to check cipher poll_policy!\n"); -- return -WD_EINVAL; -- } -- - return sched->poll_policy(h_ctx, expt, count); - } - -diff --git a/wd_digest.c b/wd_digest.c -index c110f7b..1962f09 100644 ---- a/wd_digest.c -+++ b/wd_digest.c -@@ -484,11 +484,6 @@ int wd_digest_poll(__u32 expt, __u32 *count) - handle_t h_ctx = wd_digest_setting.sched.h_sched_ctx; - struct wd_sched *sched = &wd_digest_setting.sched; - -- if (unlikely(!sched->poll_policy)) { -- WD_ERR("failed to check digest poll_policy!\n"); -- return -WD_EINVAL; -- } -- - return sched->poll_policy(h_ctx, expt, count); - } - --- -2.31.1 - diff --git a/0004-digest-v1-fixed-hmac-key-0-length-checking.patch b/0004-digest-v1-fixed-hmac-key-0-length-checking.patch deleted file mode 100644 index ceb8e9d..0000000 --- a/0004-digest-v1-fixed-hmac-key-0-length-checking.patch +++ /dev/null @@ -1,28 +0,0 @@ -From d27f5accc09bc63d81a6a972fd019e208cddc9a8 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Tue, 14 Dec 2021 19:24:48 +0800 -Subject: [PATCH 04/28] digest/v1: fixed hmac key 0 length checking - -The length of keylen checking v1 and v2 should be the same. - -Signed-off-by: Kai Ye ---- - v1/wd_digest.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/v1/wd_digest.c b/v1/wd_digest.c -index 6b22cdd..d684512 100644 ---- a/v1/wd_digest.c -+++ b/v1/wd_digest.c -@@ -243,7 +243,7 @@ int wcrypto_set_digest_key(void *ctx, __u8 *key, __u16 key_len) - return -WD_EINVAL; - } - -- if (key_len > MAX_HMAC_KEY_SIZE) { -+ if (key_len == 0 || key_len > MAX_HMAC_KEY_SIZE) { - WD_ERR("%s: input key length err!\n", __func__); - return -WD_EINVAL; - } --- -2.31.1 - diff --git a/0005-digest-v1-check-the-length-of-the-key-need-to-be-cha.patch b/0005-digest-v1-check-the-length-of-the-key-need-to-be-cha.patch deleted file mode 100644 index 67d48d1..0000000 --- a/0005-digest-v1-check-the-length-of-the-key-need-to-be-cha.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 6136bd700e5f5b23843a3e8aae9e3a925c37ca50 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Tue, 14 Dec 2021 19:24:49 +0800 -Subject: [PATCH 05/28] digest/v1: check the length of the key need to be - changed. - -The maximum length of the key is fixed by digest spec. - -Signed-off-by: Kai Ye ---- - v1/wd_digest.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/v1/wd_digest.c b/v1/wd_digest.c -index d684512..aae4823 100644 ---- a/v1/wd_digest.c -+++ b/v1/wd_digest.c -@@ -243,7 +243,9 @@ int wcrypto_set_digest_key(void *ctx, __u8 *key, __u16 key_len) - return -WD_EINVAL; - } - -- if (key_len == 0 || key_len > MAX_HMAC_KEY_SIZE) { -+ if ((ctxt->setup.alg <= WCRYPTO_SHA224 && key_len > -+ MAX_HMAC_KEY_SIZE >> 1) || key_len == 0 || -+ key_len > MAX_HMAC_KEY_SIZE) { - WD_ERR("%s: input key length err!\n", __func__); - return -WD_EINVAL; - } --- -2.31.1 - diff --git a/0006-qm-v1-fixup-the-incorrect-configuration-of-the-type.patch b/0006-qm-v1-fixup-the-incorrect-configuration-of-the-type.patch deleted file mode 100644 index e6355a7..0000000 --- a/0006-qm-v1-fixup-the-incorrect-configuration-of-the-type.patch +++ /dev/null @@ -1,67 +0,0 @@ -From 1903e366f228ac6ee9dfb826b75b9d698bb180d8 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Wed, 22 Dec 2021 14:38:03 +0800 -Subject: [PATCH 07/28] qm/v1: fixup the incorrect configuration of the type - -1. SEC should setting the sqc type is 0. it doesn't depend on -encryption or decryption direction. -2. Modify the HPRE sqc type configuration. - -Signed-off-by: Kai Ye ---- - v1/drv/hisi_qm_udrv.c | 5 +++++ - v1/wd.h | 5 ++++- - 2 files changed, 9 insertions(+), 1 deletion(-) - -diff --git a/v1/drv/hisi_qm_udrv.c b/v1/drv/hisi_qm_udrv.c -index 7fb6599..02aaf81 100644 ---- a/v1/drv/hisi_qm_udrv.c -+++ b/v1/drv/hisi_qm_udrv.c -@@ -277,16 +277,19 @@ static bool hpre_alg_info_init(struct wd_queue *q, const char *alg) - struct qm_queue_info *info = qinfo->priv; - bool is_found = true; - -+ /* DH/RSA: qm sqc_type = 0, ECC: qm sqc_type = 1 */ - if (!strcmp(alg, "rsa")) { - qinfo->atype = WCRYPTO_RSA; - info->sqe_size = QM_HPRE_BD_SIZE; - info->sqe_fill[WCRYPTO_RSA] = qm_fill_rsa_sqe; - info->sqe_parse[WCRYPTO_RSA] = qm_parse_rsa_sqe; -+ priv->direction = 0; - } else if (!strcmp(alg, "dh")) { - qinfo->atype = WCRYPTO_DH; - info->sqe_size = QM_HPRE_BD_SIZE; - info->sqe_fill[WCRYPTO_DH] = qm_fill_dh_sqe; - info->sqe_parse[WCRYPTO_DH] = qm_parse_dh_sqe; -+ priv->direction = 0; - } else if (!strcmp(alg, "ecdh")) { - qinfo->atype = WCRYPTO_ECDH; - info->sqe_size = QM_HPRE_BD_SIZE; -@@ -414,6 +417,8 @@ static int qm_set_queue_alg_info(struct wd_queue *q) - } else if (zip_alg_info_init(qinfo, alg)) { - ret = WD_SUCCESS; - } else if (sec_alg_info_init(qinfo, alg)) { -+ /* setting the type is 0 for sqc_type */ -+ priv->direction = 0; - ret = WD_SUCCESS; - } else if (!strcmp(alg, "xts(aes)") || - !strcmp(alg, "xts(sm4)")) { -diff --git a/v1/wd.h b/v1/wd.h -index 30fbf89..3dd69eb 100644 ---- a/v1/wd.h -+++ b/v1/wd.h -@@ -73,7 +73,10 @@ struct wcrypto_cb_tag { - }; - - struct wcrypto_paras { -- /* 0--encipher/compress .etc, 1 ---decipher/decomp .etc */ -+ /* -+ * 0--encipher/compress .etc, 1 ---decipher/decomp .etc -+ * it not been used for HiSilicon SEC currently. -+ */ - __u8 direction; - __u8 is_poll; - --- -2.31.1 - diff --git a/0007-qm-fixup-the-incorrect-configuration-of-the-type.patch b/0007-qm-fixup-the-incorrect-configuration-of-the-type.patch deleted file mode 100644 index 649783f..0000000 --- a/0007-qm-fixup-the-incorrect-configuration-of-the-type.patch +++ /dev/null @@ -1,30 +0,0 @@ -From c602a3e77fbd95286e233c7ed257762687d8ebac Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Wed, 22 Dec 2021 14:38:04 +0800 -Subject: [PATCH 08/28] qm: fixup the incorrect configuration of the type - -SEC should setting the sqc type is 0. it doesn't depend on -global configuration. - -Signed-off-by: Kai Ye ---- - drv/hisi_sec.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/drv/hisi_sec.c b/drv/hisi_sec.c -index 2fd23f3..603bdda 100644 ---- a/drv/hisi_sec.c -+++ b/drv/hisi_sec.c -@@ -2306,7 +2306,8 @@ int hisi_sec_init(struct wd_ctx_config_internal *config, void *priv) - /* allocate qp for each context */ - for (i = 0; i < config->ctx_num; i++) { - h_ctx = config->ctxs[i].ctx; -- qm_priv.op_type = config->ctxs[i].op_type; -+ /* setting the type is 0 for sqc_type */ -+ qm_priv.op_type = 0; - qm_priv.qp_mode = config->ctxs[i].ctx_mode; - qm_priv.idx = i; - h_qp = hisi_qm_alloc_qp(&qm_priv, h_ctx); --- -2.31.1 - diff --git a/0008-uadk_benchmark-use-the-uadk_tool-instead-of-uadk_ben.patch b/0008-uadk_benchmark-use-the-uadk_tool-instead-of-uadk_ben.patch deleted file mode 100644 index 1c82e90..0000000 --- a/0008-uadk_benchmark-use-the-uadk_tool-instead-of-uadk_ben.patch +++ /dev/null @@ -1,1125 +0,0 @@ -From 3e5fb836012fded133ead1c6c4bbed15396e3b1e Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Thu, 23 Dec 2021 09:45:34 +0800 -Subject: [PATCH 09/28] uadk_benchmark: use the uadk_tool instead of - uadk_benchmark - -The uadk_tool include the benchmark and dfx function. The benchmark -supports performance test, and the dfx provides some maintenance -capabilities. Like library version and build time. Developers can -also add other features. - -Signed-off-by: Kai Ye ---- - Makefile.am | 2 +- - cleanup.sh | 4 +- - configure.ac | 2 +- - {uadk_benchmark => uadk_tool}/Makefile.am | 14 +-- - .../include/libcrypto.a | Bin - .../include/libcrypto.so.1.1 | Bin - .../include/openssl/aes.h | 0 - .../include/openssl/asn1.h | 0 - .../include/openssl/asn1_mac.h | 0 - .../include/openssl/asn1err.h | 0 - .../include/openssl/asn1t.h | 0 - .../include/openssl/async.h | 0 - .../include/openssl/asyncerr.h | 0 - .../include/openssl/bio.h | 0 - .../include/openssl/bioerr.h | 0 - .../include/openssl/blowfish.h | 0 - .../include/openssl/bn.h | 0 - .../include/openssl/bnerr.h | 0 - .../include/openssl/buffer.h | 0 - .../include/openssl/buffererr.h | 0 - .../include/openssl/camellia.h | 0 - .../include/openssl/cast.h | 0 - .../include/openssl/cmac.h | 0 - .../include/openssl/cms.h | 0 - .../include/openssl/cmserr.h | 0 - .../include/openssl/comp.h | 0 - .../include/openssl/comperr.h | 0 - .../include/openssl/conf.h | 0 - .../include/openssl/conf_api.h | 0 - .../include/openssl/conferr.h | 0 - .../include/openssl/crypto.h | 0 - .../include/openssl/cryptoerr.h | 0 - .../include/openssl/ct.h | 0 - .../include/openssl/cterr.h | 0 - .../include/openssl/des.h | 0 - .../include/openssl/dh.h | 0 - .../include/openssl/dherr.h | 0 - .../include/openssl/dsa.h | 0 - .../include/openssl/dsaerr.h | 0 - .../include/openssl/dtls1.h | 0 - .../include/openssl/e_os2.h | 0 - .../include/openssl/ebcdic.h | 0 - .../include/openssl/ec.h | 0 - .../include/openssl/ecdh.h | 0 - .../include/openssl/ecdsa.h | 0 - .../include/openssl/ecerr.h | 0 - .../include/openssl/engine.h | 0 - .../include/openssl/engineerr.h | 0 - .../include/openssl/err.h | 0 - .../include/openssl/evp.h | 0 - .../include/openssl/evperr.h | 0 - .../include/openssl/hmac.h | 0 - .../include/openssl/idea.h | 0 - .../include/openssl/kdf.h | 0 - .../include/openssl/kdferr.h | 0 - .../include/openssl/lhash.h | 0 - .../include/openssl/md2.h | 0 - .../include/openssl/md4.h | 0 - .../include/openssl/md5.h | 0 - .../include/openssl/mdc2.h | 0 - .../include/openssl/modes.h | 0 - .../include/openssl/obj_mac.h | 0 - .../include/openssl/objects.h | 0 - .../include/openssl/objectserr.h | 0 - .../include/openssl/ocsp.h | 0 - .../include/openssl/ocsperr.h | 0 - .../include/openssl/opensslconf.h | 0 - .../include/openssl/opensslv.h | 0 - .../include/openssl/ossl_typ.h | 0 - .../include/openssl/pem.h | 0 - .../include/openssl/pem2.h | 0 - .../include/openssl/pemerr.h | 0 - .../include/openssl/pkcs12.h | 0 - .../include/openssl/pkcs12err.h | 0 - .../include/openssl/pkcs7.h | 0 - .../include/openssl/pkcs7err.h | 0 - .../include/openssl/rand.h | 0 - .../include/openssl/rand_drbg.h | 0 - .../include/openssl/randerr.h | 0 - .../include/openssl/rc2.h | 0 - .../include/openssl/rc4.h | 0 - .../include/openssl/rc5.h | 0 - .../include/openssl/ripemd.h | 0 - .../include/openssl/rsa.h | 0 - .../include/openssl/rsaerr.h | 0 - .../include/openssl/safestack.h | 0 - .../include/openssl/seed.h | 0 - .../include/openssl/sha.h | 0 - .../include/openssl/srp.h | 0 - .../include/openssl/srtp.h | 0 - .../include/openssl/ssl.h | 0 - .../include/openssl/ssl2.h | 0 - .../include/openssl/ssl3.h | 0 - .../include/openssl/sslerr.h | 0 - .../include/openssl/stack.h | 0 - .../include/openssl/store.h | 0 - .../include/openssl/storeerr.h | 0 - .../include/openssl/symhacks.h | 0 - .../include/openssl/tls1.h | 0 - .../include/openssl/ts.h | 0 - .../include/openssl/tserr.h | 0 - .../include/openssl/txt_db.h | 0 - .../include/openssl/ui.h | 0 - .../include/openssl/uierr.h | 0 - .../include/openssl/whrlpool.h | 0 - .../include/openssl/x509.h | 0 - .../include/openssl/x509_vfy.h | 0 - .../include/openssl/x509err.h | 0 - .../include/openssl/x509v3.h | 0 - .../include/openssl/x509v3err.h | 0 - .../sec_soft_benchmark.c | 0 - .../sec_soft_benchmark.h | 0 - .../sec_uadk_benchmark.c | 0 - .../sec_uadk_benchmark.h | 0 - .../sec_wd_benchmark.c | 0 - .../sec_wd_benchmark.h | 0 - .../uadk_benchmark.c | 86 +++++++----------- - .../uadk_benchmark.h | 5 + - uadk_tool/uadk_dfx.c | 79 ++++++++++++++++ - uadk_tool/uadk_dfx.h | 10 ++ - uadk_tool/uadk_tool.c | 44 +++++++++ - 121 files changed, 183 insertions(+), 63 deletions(-) - mode change 100755 => 100644 cleanup.sh - rename {uadk_benchmark => uadk_tool}/Makefile.am (54%) - rename {uadk_benchmark => uadk_tool}/include/libcrypto.a (100%) - rename {uadk_benchmark => uadk_tool}/include/libcrypto.so.1.1 (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/aes.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/asn1.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/asn1_mac.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/asn1err.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/asn1t.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/async.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/asyncerr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/bio.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/bioerr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/blowfish.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/bn.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/bnerr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/buffer.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/buffererr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/camellia.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/cast.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/cmac.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/cms.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/cmserr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/comp.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/comperr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/conf.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/conf_api.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/conferr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/crypto.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/cryptoerr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/ct.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/cterr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/des.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/dh.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/dherr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/dsa.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/dsaerr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/dtls1.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/e_os2.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/ebcdic.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/ec.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/ecdh.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/ecdsa.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/ecerr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/engine.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/engineerr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/err.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/evp.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/evperr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/hmac.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/idea.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/kdf.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/kdferr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/lhash.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/md2.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/md4.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/md5.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/mdc2.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/modes.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/obj_mac.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/objects.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/objectserr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/ocsp.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/ocsperr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/opensslconf.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/opensslv.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/ossl_typ.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/pem.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/pem2.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/pemerr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/pkcs12.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/pkcs12err.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/pkcs7.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/pkcs7err.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/rand.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/rand_drbg.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/randerr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/rc2.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/rc4.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/rc5.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/ripemd.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/rsa.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/rsaerr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/safestack.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/seed.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/sha.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/srp.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/srtp.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/ssl.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/ssl2.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/ssl3.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/sslerr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/stack.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/store.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/storeerr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/symhacks.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/tls1.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/ts.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/tserr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/txt_db.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/ui.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/uierr.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/whrlpool.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/x509.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/x509_vfy.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/x509err.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/x509v3.h (100%) - rename {uadk_benchmark => uadk_tool}/include/openssl/x509v3err.h (100%) - rename {uadk_benchmark => uadk_tool}/sec_soft_benchmark.c (100%) - rename {uadk_benchmark => uadk_tool}/sec_soft_benchmark.h (100%) - rename {uadk_benchmark => uadk_tool}/sec_uadk_benchmark.c (100%) - rename {uadk_benchmark => uadk_tool}/sec_uadk_benchmark.h (100%) - rename {uadk_benchmark => uadk_tool}/sec_wd_benchmark.c (100%) - rename {uadk_benchmark => uadk_tool}/sec_wd_benchmark.h (100%) - rename {uadk_benchmark => uadk_tool}/uadk_benchmark.c (91%) - rename {uadk_benchmark => uadk_tool}/uadk_benchmark.h (93%) - create mode 100644 uadk_tool/uadk_dfx.c - create mode 100644 uadk_tool/uadk_dfx.h - create mode 100644 uadk_tool/uadk_tool.c - -diff --git a/Makefile.am b/Makefile.am -index f4f80fa..cd25bce 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -119,4 +119,4 @@ libhisi_hpre_la_DEPENDENCIES= libwd.la libwd_crypto.la - endif # WD_STATIC_DRV - - --SUBDIRS=. test v1/test uadk_benchmark sample -+SUBDIRS=. test v1/test uadk_tool sample -diff --git a/cleanup.sh b/cleanup.sh -old mode 100755 -new mode 100644 -index d11d498..60adc98 ---- a/cleanup.sh -+++ b/cleanup.sh -@@ -11,8 +11,8 @@ FILES="aclocal.m4 autom4te.cache compile config.guess config.h.in config.log \ - test/Makefile test/Makefile.in test/hisi_hpre_test/Makefile.in \ - test/hisi_hpre_test/Makefile test/hisi_sec_test/Makefile \ - test/hisi_sec_test/Makefile.in test/hisi_zip_test/Makefile \ -- test/hisi_zip_test/Makefile.in uadk_benchmark/Makefile \ -- uadk_benchmark/Makefile.in \ -+ test/hisi_zip_test/Makefile.in uadk_tool/Makefile \ -+ uadk_tool/Makefile.in \ - v1/Makefile.in v1/Makefile.in v1/test/Makefile v1/test/Makefile.in \ - v1/test/test_mm/Makefile v1/test/test_mm/Makefile.in \ - v1/test/bmm_test/Makefile v1/test/bmm_test/Makefile.in" -diff --git a/configure.ac b/configure.ac -index aa524f5..b509393 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -87,7 +87,7 @@ AC_CONFIG_FILES([Makefile - test/hisi_hpre_test/Makefile - test/hisi_sec_test/Makefile - test/hisi_zip_test/Makefile -- uadk_benchmark/Makefile -+ uadk_tool/Makefile - sample/Makefile - v1/test/Makefile - v1/test/bmm_test/Makefile -diff --git a/uadk_benchmark/Makefile.am b/uadk_tool/Makefile.am -similarity index 54% -rename from uadk_benchmark/Makefile.am -rename to uadk_tool/Makefile.am -index 5fd16a9..36536a2 100644 ---- a/uadk_benchmark/Makefile.am -+++ b/uadk_tool/Makefile.am -@@ -1,24 +1,24 @@ - ACLOCAL_AMFLAGS = -I m4 -I./include - AM_CFLAGS=-Wall -fno-strict-aliasing -I$(top_srcdir) -I$(top_srcdir)/include \ -- -I$(top_srcdir)/uadk_benchmark/include -pthread -+ -I$(top_srcdir)/uadk_tool/include -pthread - - #AUTOMAKE_OPTIONS = subdir-objects - --bin_PROGRAMS=uadk_benchmark -+bin_PROGRAMS=uadk_tool - --uadk_benchmark_SOURCES=uadk_benchmark.c \ -+uadk_tool_SOURCES=uadk_tool.c uadk_dfx.c uadk_benchmark.c \ - sec_uadk_benchmark.c sec_wd_benchmark.c sec_soft_benchmark.c - - if WD_STATIC_DRV - AM_CFLAGS+=-Bstatic --uadk_benchmark_LDADD=$(libwd_la_OBJECTS) \ -+uadk_tool_LDADD=$(libwd_la_OBJECTS) \ - $(libwd_crypto_la_OBJECTS) \ - ../.libs/libhisi_sec.a \ - ../.libs/libhisi_hpre.a \ - ../.libs/libhisi_zip.a \ - include/libcrypto.a -ldl -lnuma - else --uadk_benchmark_LDADD=-L../.libs -l:libwd.so.2 -l:libwd_crypto.so.2 \ -- -L$(top_srcdir)/uadk_benchmark/include -l:libcrypto.so.1.1 -lnuma -+uadk_tool_LDADD=-L../.libs -l:libwd.so.2 -l:libwd_crypto.so.2 \ -+ -L$(top_srcdir)/uadk_tool/include -l:libcrypto.so.1.1 -lnuma - endif --uadk_benchmark_LDFLAGS=-Wl,-rpath,'/usr/local/lib' -+uadk_tool_LDFLAGS=-Wl,-rpath,'/usr/local/lib' -diff --git a/uadk_benchmark/include/libcrypto.a b/uadk_tool/include/libcrypto.a -similarity index 100% -rename from uadk_benchmark/include/libcrypto.a -rename to uadk_tool/include/libcrypto.a -diff --git a/uadk_benchmark/include/libcrypto.so.1.1 b/uadk_tool/include/libcrypto.so.1.1 -similarity index 100% -rename from uadk_benchmark/include/libcrypto.so.1.1 -rename to uadk_tool/include/libcrypto.so.1.1 -diff --git a/uadk_benchmark/include/openssl/aes.h b/uadk_tool/include/openssl/aes.h -similarity index 100% -rename from uadk_benchmark/include/openssl/aes.h -rename to uadk_tool/include/openssl/aes.h -diff --git a/uadk_benchmark/include/openssl/asn1.h b/uadk_tool/include/openssl/asn1.h -similarity index 100% -rename from uadk_benchmark/include/openssl/asn1.h -rename to uadk_tool/include/openssl/asn1.h -diff --git a/uadk_benchmark/include/openssl/asn1_mac.h b/uadk_tool/include/openssl/asn1_mac.h -similarity index 100% -rename from uadk_benchmark/include/openssl/asn1_mac.h -rename to uadk_tool/include/openssl/asn1_mac.h -diff --git a/uadk_benchmark/include/openssl/asn1err.h b/uadk_tool/include/openssl/asn1err.h -similarity index 100% -rename from uadk_benchmark/include/openssl/asn1err.h -rename to uadk_tool/include/openssl/asn1err.h -diff --git a/uadk_benchmark/include/openssl/asn1t.h b/uadk_tool/include/openssl/asn1t.h -similarity index 100% -rename from uadk_benchmark/include/openssl/asn1t.h -rename to uadk_tool/include/openssl/asn1t.h -diff --git a/uadk_benchmark/include/openssl/async.h b/uadk_tool/include/openssl/async.h -similarity index 100% -rename from uadk_benchmark/include/openssl/async.h -rename to uadk_tool/include/openssl/async.h -diff --git a/uadk_benchmark/include/openssl/asyncerr.h b/uadk_tool/include/openssl/asyncerr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/asyncerr.h -rename to uadk_tool/include/openssl/asyncerr.h -diff --git a/uadk_benchmark/include/openssl/bio.h b/uadk_tool/include/openssl/bio.h -similarity index 100% -rename from uadk_benchmark/include/openssl/bio.h -rename to uadk_tool/include/openssl/bio.h -diff --git a/uadk_benchmark/include/openssl/bioerr.h b/uadk_tool/include/openssl/bioerr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/bioerr.h -rename to uadk_tool/include/openssl/bioerr.h -diff --git a/uadk_benchmark/include/openssl/blowfish.h b/uadk_tool/include/openssl/blowfish.h -similarity index 100% -rename from uadk_benchmark/include/openssl/blowfish.h -rename to uadk_tool/include/openssl/blowfish.h -diff --git a/uadk_benchmark/include/openssl/bn.h b/uadk_tool/include/openssl/bn.h -similarity index 100% -rename from uadk_benchmark/include/openssl/bn.h -rename to uadk_tool/include/openssl/bn.h -diff --git a/uadk_benchmark/include/openssl/bnerr.h b/uadk_tool/include/openssl/bnerr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/bnerr.h -rename to uadk_tool/include/openssl/bnerr.h -diff --git a/uadk_benchmark/include/openssl/buffer.h b/uadk_tool/include/openssl/buffer.h -similarity index 100% -rename from uadk_benchmark/include/openssl/buffer.h -rename to uadk_tool/include/openssl/buffer.h -diff --git a/uadk_benchmark/include/openssl/buffererr.h b/uadk_tool/include/openssl/buffererr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/buffererr.h -rename to uadk_tool/include/openssl/buffererr.h -diff --git a/uadk_benchmark/include/openssl/camellia.h b/uadk_tool/include/openssl/camellia.h -similarity index 100% -rename from uadk_benchmark/include/openssl/camellia.h -rename to uadk_tool/include/openssl/camellia.h -diff --git a/uadk_benchmark/include/openssl/cast.h b/uadk_tool/include/openssl/cast.h -similarity index 100% -rename from uadk_benchmark/include/openssl/cast.h -rename to uadk_tool/include/openssl/cast.h -diff --git a/uadk_benchmark/include/openssl/cmac.h b/uadk_tool/include/openssl/cmac.h -similarity index 100% -rename from uadk_benchmark/include/openssl/cmac.h -rename to uadk_tool/include/openssl/cmac.h -diff --git a/uadk_benchmark/include/openssl/cms.h b/uadk_tool/include/openssl/cms.h -similarity index 100% -rename from uadk_benchmark/include/openssl/cms.h -rename to uadk_tool/include/openssl/cms.h -diff --git a/uadk_benchmark/include/openssl/cmserr.h b/uadk_tool/include/openssl/cmserr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/cmserr.h -rename to uadk_tool/include/openssl/cmserr.h -diff --git a/uadk_benchmark/include/openssl/comp.h b/uadk_tool/include/openssl/comp.h -similarity index 100% -rename from uadk_benchmark/include/openssl/comp.h -rename to uadk_tool/include/openssl/comp.h -diff --git a/uadk_benchmark/include/openssl/comperr.h b/uadk_tool/include/openssl/comperr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/comperr.h -rename to uadk_tool/include/openssl/comperr.h -diff --git a/uadk_benchmark/include/openssl/conf.h b/uadk_tool/include/openssl/conf.h -similarity index 100% -rename from uadk_benchmark/include/openssl/conf.h -rename to uadk_tool/include/openssl/conf.h -diff --git a/uadk_benchmark/include/openssl/conf_api.h b/uadk_tool/include/openssl/conf_api.h -similarity index 100% -rename from uadk_benchmark/include/openssl/conf_api.h -rename to uadk_tool/include/openssl/conf_api.h -diff --git a/uadk_benchmark/include/openssl/conferr.h b/uadk_tool/include/openssl/conferr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/conferr.h -rename to uadk_tool/include/openssl/conferr.h -diff --git a/uadk_benchmark/include/openssl/crypto.h b/uadk_tool/include/openssl/crypto.h -similarity index 100% -rename from uadk_benchmark/include/openssl/crypto.h -rename to uadk_tool/include/openssl/crypto.h -diff --git a/uadk_benchmark/include/openssl/cryptoerr.h b/uadk_tool/include/openssl/cryptoerr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/cryptoerr.h -rename to uadk_tool/include/openssl/cryptoerr.h -diff --git a/uadk_benchmark/include/openssl/ct.h b/uadk_tool/include/openssl/ct.h -similarity index 100% -rename from uadk_benchmark/include/openssl/ct.h -rename to uadk_tool/include/openssl/ct.h -diff --git a/uadk_benchmark/include/openssl/cterr.h b/uadk_tool/include/openssl/cterr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/cterr.h -rename to uadk_tool/include/openssl/cterr.h -diff --git a/uadk_benchmark/include/openssl/des.h b/uadk_tool/include/openssl/des.h -similarity index 100% -rename from uadk_benchmark/include/openssl/des.h -rename to uadk_tool/include/openssl/des.h -diff --git a/uadk_benchmark/include/openssl/dh.h b/uadk_tool/include/openssl/dh.h -similarity index 100% -rename from uadk_benchmark/include/openssl/dh.h -rename to uadk_tool/include/openssl/dh.h -diff --git a/uadk_benchmark/include/openssl/dherr.h b/uadk_tool/include/openssl/dherr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/dherr.h -rename to uadk_tool/include/openssl/dherr.h -diff --git a/uadk_benchmark/include/openssl/dsa.h b/uadk_tool/include/openssl/dsa.h -similarity index 100% -rename from uadk_benchmark/include/openssl/dsa.h -rename to uadk_tool/include/openssl/dsa.h -diff --git a/uadk_benchmark/include/openssl/dsaerr.h b/uadk_tool/include/openssl/dsaerr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/dsaerr.h -rename to uadk_tool/include/openssl/dsaerr.h -diff --git a/uadk_benchmark/include/openssl/dtls1.h b/uadk_tool/include/openssl/dtls1.h -similarity index 100% -rename from uadk_benchmark/include/openssl/dtls1.h -rename to uadk_tool/include/openssl/dtls1.h -diff --git a/uadk_benchmark/include/openssl/e_os2.h b/uadk_tool/include/openssl/e_os2.h -similarity index 100% -rename from uadk_benchmark/include/openssl/e_os2.h -rename to uadk_tool/include/openssl/e_os2.h -diff --git a/uadk_benchmark/include/openssl/ebcdic.h b/uadk_tool/include/openssl/ebcdic.h -similarity index 100% -rename from uadk_benchmark/include/openssl/ebcdic.h -rename to uadk_tool/include/openssl/ebcdic.h -diff --git a/uadk_benchmark/include/openssl/ec.h b/uadk_tool/include/openssl/ec.h -similarity index 100% -rename from uadk_benchmark/include/openssl/ec.h -rename to uadk_tool/include/openssl/ec.h -diff --git a/uadk_benchmark/include/openssl/ecdh.h b/uadk_tool/include/openssl/ecdh.h -similarity index 100% -rename from uadk_benchmark/include/openssl/ecdh.h -rename to uadk_tool/include/openssl/ecdh.h -diff --git a/uadk_benchmark/include/openssl/ecdsa.h b/uadk_tool/include/openssl/ecdsa.h -similarity index 100% -rename from uadk_benchmark/include/openssl/ecdsa.h -rename to uadk_tool/include/openssl/ecdsa.h -diff --git a/uadk_benchmark/include/openssl/ecerr.h b/uadk_tool/include/openssl/ecerr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/ecerr.h -rename to uadk_tool/include/openssl/ecerr.h -diff --git a/uadk_benchmark/include/openssl/engine.h b/uadk_tool/include/openssl/engine.h -similarity index 100% -rename from uadk_benchmark/include/openssl/engine.h -rename to uadk_tool/include/openssl/engine.h -diff --git a/uadk_benchmark/include/openssl/engineerr.h b/uadk_tool/include/openssl/engineerr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/engineerr.h -rename to uadk_tool/include/openssl/engineerr.h -diff --git a/uadk_benchmark/include/openssl/err.h b/uadk_tool/include/openssl/err.h -similarity index 100% -rename from uadk_benchmark/include/openssl/err.h -rename to uadk_tool/include/openssl/err.h -diff --git a/uadk_benchmark/include/openssl/evp.h b/uadk_tool/include/openssl/evp.h -similarity index 100% -rename from uadk_benchmark/include/openssl/evp.h -rename to uadk_tool/include/openssl/evp.h -diff --git a/uadk_benchmark/include/openssl/evperr.h b/uadk_tool/include/openssl/evperr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/evperr.h -rename to uadk_tool/include/openssl/evperr.h -diff --git a/uadk_benchmark/include/openssl/hmac.h b/uadk_tool/include/openssl/hmac.h -similarity index 100% -rename from uadk_benchmark/include/openssl/hmac.h -rename to uadk_tool/include/openssl/hmac.h -diff --git a/uadk_benchmark/include/openssl/idea.h b/uadk_tool/include/openssl/idea.h -similarity index 100% -rename from uadk_benchmark/include/openssl/idea.h -rename to uadk_tool/include/openssl/idea.h -diff --git a/uadk_benchmark/include/openssl/kdf.h b/uadk_tool/include/openssl/kdf.h -similarity index 100% -rename from uadk_benchmark/include/openssl/kdf.h -rename to uadk_tool/include/openssl/kdf.h -diff --git a/uadk_benchmark/include/openssl/kdferr.h b/uadk_tool/include/openssl/kdferr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/kdferr.h -rename to uadk_tool/include/openssl/kdferr.h -diff --git a/uadk_benchmark/include/openssl/lhash.h b/uadk_tool/include/openssl/lhash.h -similarity index 100% -rename from uadk_benchmark/include/openssl/lhash.h -rename to uadk_tool/include/openssl/lhash.h -diff --git a/uadk_benchmark/include/openssl/md2.h b/uadk_tool/include/openssl/md2.h -similarity index 100% -rename from uadk_benchmark/include/openssl/md2.h -rename to uadk_tool/include/openssl/md2.h -diff --git a/uadk_benchmark/include/openssl/md4.h b/uadk_tool/include/openssl/md4.h -similarity index 100% -rename from uadk_benchmark/include/openssl/md4.h -rename to uadk_tool/include/openssl/md4.h -diff --git a/uadk_benchmark/include/openssl/md5.h b/uadk_tool/include/openssl/md5.h -similarity index 100% -rename from uadk_benchmark/include/openssl/md5.h -rename to uadk_tool/include/openssl/md5.h -diff --git a/uadk_benchmark/include/openssl/mdc2.h b/uadk_tool/include/openssl/mdc2.h -similarity index 100% -rename from uadk_benchmark/include/openssl/mdc2.h -rename to uadk_tool/include/openssl/mdc2.h -diff --git a/uadk_benchmark/include/openssl/modes.h b/uadk_tool/include/openssl/modes.h -similarity index 100% -rename from uadk_benchmark/include/openssl/modes.h -rename to uadk_tool/include/openssl/modes.h -diff --git a/uadk_benchmark/include/openssl/obj_mac.h b/uadk_tool/include/openssl/obj_mac.h -similarity index 100% -rename from uadk_benchmark/include/openssl/obj_mac.h -rename to uadk_tool/include/openssl/obj_mac.h -diff --git a/uadk_benchmark/include/openssl/objects.h b/uadk_tool/include/openssl/objects.h -similarity index 100% -rename from uadk_benchmark/include/openssl/objects.h -rename to uadk_tool/include/openssl/objects.h -diff --git a/uadk_benchmark/include/openssl/objectserr.h b/uadk_tool/include/openssl/objectserr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/objectserr.h -rename to uadk_tool/include/openssl/objectserr.h -diff --git a/uadk_benchmark/include/openssl/ocsp.h b/uadk_tool/include/openssl/ocsp.h -similarity index 100% -rename from uadk_benchmark/include/openssl/ocsp.h -rename to uadk_tool/include/openssl/ocsp.h -diff --git a/uadk_benchmark/include/openssl/ocsperr.h b/uadk_tool/include/openssl/ocsperr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/ocsperr.h -rename to uadk_tool/include/openssl/ocsperr.h -diff --git a/uadk_benchmark/include/openssl/opensslconf.h b/uadk_tool/include/openssl/opensslconf.h -similarity index 100% -rename from uadk_benchmark/include/openssl/opensslconf.h -rename to uadk_tool/include/openssl/opensslconf.h -diff --git a/uadk_benchmark/include/openssl/opensslv.h b/uadk_tool/include/openssl/opensslv.h -similarity index 100% -rename from uadk_benchmark/include/openssl/opensslv.h -rename to uadk_tool/include/openssl/opensslv.h -diff --git a/uadk_benchmark/include/openssl/ossl_typ.h b/uadk_tool/include/openssl/ossl_typ.h -similarity index 100% -rename from uadk_benchmark/include/openssl/ossl_typ.h -rename to uadk_tool/include/openssl/ossl_typ.h -diff --git a/uadk_benchmark/include/openssl/pem.h b/uadk_tool/include/openssl/pem.h -similarity index 100% -rename from uadk_benchmark/include/openssl/pem.h -rename to uadk_tool/include/openssl/pem.h -diff --git a/uadk_benchmark/include/openssl/pem2.h b/uadk_tool/include/openssl/pem2.h -similarity index 100% -rename from uadk_benchmark/include/openssl/pem2.h -rename to uadk_tool/include/openssl/pem2.h -diff --git a/uadk_benchmark/include/openssl/pemerr.h b/uadk_tool/include/openssl/pemerr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/pemerr.h -rename to uadk_tool/include/openssl/pemerr.h -diff --git a/uadk_benchmark/include/openssl/pkcs12.h b/uadk_tool/include/openssl/pkcs12.h -similarity index 100% -rename from uadk_benchmark/include/openssl/pkcs12.h -rename to uadk_tool/include/openssl/pkcs12.h -diff --git a/uadk_benchmark/include/openssl/pkcs12err.h b/uadk_tool/include/openssl/pkcs12err.h -similarity index 100% -rename from uadk_benchmark/include/openssl/pkcs12err.h -rename to uadk_tool/include/openssl/pkcs12err.h -diff --git a/uadk_benchmark/include/openssl/pkcs7.h b/uadk_tool/include/openssl/pkcs7.h -similarity index 100% -rename from uadk_benchmark/include/openssl/pkcs7.h -rename to uadk_tool/include/openssl/pkcs7.h -diff --git a/uadk_benchmark/include/openssl/pkcs7err.h b/uadk_tool/include/openssl/pkcs7err.h -similarity index 100% -rename from uadk_benchmark/include/openssl/pkcs7err.h -rename to uadk_tool/include/openssl/pkcs7err.h -diff --git a/uadk_benchmark/include/openssl/rand.h b/uadk_tool/include/openssl/rand.h -similarity index 100% -rename from uadk_benchmark/include/openssl/rand.h -rename to uadk_tool/include/openssl/rand.h -diff --git a/uadk_benchmark/include/openssl/rand_drbg.h b/uadk_tool/include/openssl/rand_drbg.h -similarity index 100% -rename from uadk_benchmark/include/openssl/rand_drbg.h -rename to uadk_tool/include/openssl/rand_drbg.h -diff --git a/uadk_benchmark/include/openssl/randerr.h b/uadk_tool/include/openssl/randerr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/randerr.h -rename to uadk_tool/include/openssl/randerr.h -diff --git a/uadk_benchmark/include/openssl/rc2.h b/uadk_tool/include/openssl/rc2.h -similarity index 100% -rename from uadk_benchmark/include/openssl/rc2.h -rename to uadk_tool/include/openssl/rc2.h -diff --git a/uadk_benchmark/include/openssl/rc4.h b/uadk_tool/include/openssl/rc4.h -similarity index 100% -rename from uadk_benchmark/include/openssl/rc4.h -rename to uadk_tool/include/openssl/rc4.h -diff --git a/uadk_benchmark/include/openssl/rc5.h b/uadk_tool/include/openssl/rc5.h -similarity index 100% -rename from uadk_benchmark/include/openssl/rc5.h -rename to uadk_tool/include/openssl/rc5.h -diff --git a/uadk_benchmark/include/openssl/ripemd.h b/uadk_tool/include/openssl/ripemd.h -similarity index 100% -rename from uadk_benchmark/include/openssl/ripemd.h -rename to uadk_tool/include/openssl/ripemd.h -diff --git a/uadk_benchmark/include/openssl/rsa.h b/uadk_tool/include/openssl/rsa.h -similarity index 100% -rename from uadk_benchmark/include/openssl/rsa.h -rename to uadk_tool/include/openssl/rsa.h -diff --git a/uadk_benchmark/include/openssl/rsaerr.h b/uadk_tool/include/openssl/rsaerr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/rsaerr.h -rename to uadk_tool/include/openssl/rsaerr.h -diff --git a/uadk_benchmark/include/openssl/safestack.h b/uadk_tool/include/openssl/safestack.h -similarity index 100% -rename from uadk_benchmark/include/openssl/safestack.h -rename to uadk_tool/include/openssl/safestack.h -diff --git a/uadk_benchmark/include/openssl/seed.h b/uadk_tool/include/openssl/seed.h -similarity index 100% -rename from uadk_benchmark/include/openssl/seed.h -rename to uadk_tool/include/openssl/seed.h -diff --git a/uadk_benchmark/include/openssl/sha.h b/uadk_tool/include/openssl/sha.h -similarity index 100% -rename from uadk_benchmark/include/openssl/sha.h -rename to uadk_tool/include/openssl/sha.h -diff --git a/uadk_benchmark/include/openssl/srp.h b/uadk_tool/include/openssl/srp.h -similarity index 100% -rename from uadk_benchmark/include/openssl/srp.h -rename to uadk_tool/include/openssl/srp.h -diff --git a/uadk_benchmark/include/openssl/srtp.h b/uadk_tool/include/openssl/srtp.h -similarity index 100% -rename from uadk_benchmark/include/openssl/srtp.h -rename to uadk_tool/include/openssl/srtp.h -diff --git a/uadk_benchmark/include/openssl/ssl.h b/uadk_tool/include/openssl/ssl.h -similarity index 100% -rename from uadk_benchmark/include/openssl/ssl.h -rename to uadk_tool/include/openssl/ssl.h -diff --git a/uadk_benchmark/include/openssl/ssl2.h b/uadk_tool/include/openssl/ssl2.h -similarity index 100% -rename from uadk_benchmark/include/openssl/ssl2.h -rename to uadk_tool/include/openssl/ssl2.h -diff --git a/uadk_benchmark/include/openssl/ssl3.h b/uadk_tool/include/openssl/ssl3.h -similarity index 100% -rename from uadk_benchmark/include/openssl/ssl3.h -rename to uadk_tool/include/openssl/ssl3.h -diff --git a/uadk_benchmark/include/openssl/sslerr.h b/uadk_tool/include/openssl/sslerr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/sslerr.h -rename to uadk_tool/include/openssl/sslerr.h -diff --git a/uadk_benchmark/include/openssl/stack.h b/uadk_tool/include/openssl/stack.h -similarity index 100% -rename from uadk_benchmark/include/openssl/stack.h -rename to uadk_tool/include/openssl/stack.h -diff --git a/uadk_benchmark/include/openssl/store.h b/uadk_tool/include/openssl/store.h -similarity index 100% -rename from uadk_benchmark/include/openssl/store.h -rename to uadk_tool/include/openssl/store.h -diff --git a/uadk_benchmark/include/openssl/storeerr.h b/uadk_tool/include/openssl/storeerr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/storeerr.h -rename to uadk_tool/include/openssl/storeerr.h -diff --git a/uadk_benchmark/include/openssl/symhacks.h b/uadk_tool/include/openssl/symhacks.h -similarity index 100% -rename from uadk_benchmark/include/openssl/symhacks.h -rename to uadk_tool/include/openssl/symhacks.h -diff --git a/uadk_benchmark/include/openssl/tls1.h b/uadk_tool/include/openssl/tls1.h -similarity index 100% -rename from uadk_benchmark/include/openssl/tls1.h -rename to uadk_tool/include/openssl/tls1.h -diff --git a/uadk_benchmark/include/openssl/ts.h b/uadk_tool/include/openssl/ts.h -similarity index 100% -rename from uadk_benchmark/include/openssl/ts.h -rename to uadk_tool/include/openssl/ts.h -diff --git a/uadk_benchmark/include/openssl/tserr.h b/uadk_tool/include/openssl/tserr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/tserr.h -rename to uadk_tool/include/openssl/tserr.h -diff --git a/uadk_benchmark/include/openssl/txt_db.h b/uadk_tool/include/openssl/txt_db.h -similarity index 100% -rename from uadk_benchmark/include/openssl/txt_db.h -rename to uadk_tool/include/openssl/txt_db.h -diff --git a/uadk_benchmark/include/openssl/ui.h b/uadk_tool/include/openssl/ui.h -similarity index 100% -rename from uadk_benchmark/include/openssl/ui.h -rename to uadk_tool/include/openssl/ui.h -diff --git a/uadk_benchmark/include/openssl/uierr.h b/uadk_tool/include/openssl/uierr.h -similarity index 100% -rename from uadk_benchmark/include/openssl/uierr.h -rename to uadk_tool/include/openssl/uierr.h -diff --git a/uadk_benchmark/include/openssl/whrlpool.h b/uadk_tool/include/openssl/whrlpool.h -similarity index 100% -rename from uadk_benchmark/include/openssl/whrlpool.h -rename to uadk_tool/include/openssl/whrlpool.h -diff --git a/uadk_benchmark/include/openssl/x509.h b/uadk_tool/include/openssl/x509.h -similarity index 100% -rename from uadk_benchmark/include/openssl/x509.h -rename to uadk_tool/include/openssl/x509.h -diff --git a/uadk_benchmark/include/openssl/x509_vfy.h b/uadk_tool/include/openssl/x509_vfy.h -similarity index 100% -rename from uadk_benchmark/include/openssl/x509_vfy.h -rename to uadk_tool/include/openssl/x509_vfy.h -diff --git a/uadk_benchmark/include/openssl/x509err.h b/uadk_tool/include/openssl/x509err.h -similarity index 100% -rename from uadk_benchmark/include/openssl/x509err.h -rename to uadk_tool/include/openssl/x509err.h -diff --git a/uadk_benchmark/include/openssl/x509v3.h b/uadk_tool/include/openssl/x509v3.h -similarity index 100% -rename from uadk_benchmark/include/openssl/x509v3.h -rename to uadk_tool/include/openssl/x509v3.h -diff --git a/uadk_benchmark/include/openssl/x509v3err.h b/uadk_tool/include/openssl/x509v3err.h -similarity index 100% -rename from uadk_benchmark/include/openssl/x509v3err.h -rename to uadk_tool/include/openssl/x509v3err.h -diff --git a/uadk_benchmark/sec_soft_benchmark.c b/uadk_tool/sec_soft_benchmark.c -similarity index 100% -rename from uadk_benchmark/sec_soft_benchmark.c -rename to uadk_tool/sec_soft_benchmark.c -diff --git a/uadk_benchmark/sec_soft_benchmark.h b/uadk_tool/sec_soft_benchmark.h -similarity index 100% -rename from uadk_benchmark/sec_soft_benchmark.h -rename to uadk_tool/sec_soft_benchmark.h -diff --git a/uadk_benchmark/sec_uadk_benchmark.c b/uadk_tool/sec_uadk_benchmark.c -similarity index 100% -rename from uadk_benchmark/sec_uadk_benchmark.c -rename to uadk_tool/sec_uadk_benchmark.c -diff --git a/uadk_benchmark/sec_uadk_benchmark.h b/uadk_tool/sec_uadk_benchmark.h -similarity index 100% -rename from uadk_benchmark/sec_uadk_benchmark.h -rename to uadk_tool/sec_uadk_benchmark.h -diff --git a/uadk_benchmark/sec_wd_benchmark.c b/uadk_tool/sec_wd_benchmark.c -similarity index 100% -rename from uadk_benchmark/sec_wd_benchmark.c -rename to uadk_tool/sec_wd_benchmark.c -diff --git a/uadk_benchmark/sec_wd_benchmark.h b/uadk_tool/sec_wd_benchmark.h -similarity index 100% -rename from uadk_benchmark/sec_wd_benchmark.h -rename to uadk_tool/sec_wd_benchmark.h -diff --git a/uadk_benchmark/uadk_benchmark.c b/uadk_tool/uadk_benchmark.c -similarity index 91% -rename from uadk_benchmark/uadk_benchmark.c -rename to uadk_tool/uadk_benchmark.c -index cc63c26..5773b2c 100644 ---- a/uadk_benchmark/uadk_benchmark.c -+++ b/uadk_tool/uadk_benchmark.c -@@ -448,7 +448,7 @@ static void dump_param(struct acc_option *option) - ACC_TST_PRT(" [--engine]: %s\n", option->engine); - } - --static int acc_benchmark_run(struct acc_option *option) -+int acc_benchmark_run(struct acc_option *option) - { - int nr_children = 0; - pid_t *pids, pid; -@@ -510,7 +510,7 @@ static int acc_benchmark_run(struct acc_option *option) - return ret; - } - --static int acc_default_case(struct acc_option *option) -+int acc_default_case(struct acc_option *option) - { - ACC_TST_PRT("Test sec Cipher parameter default, alg: aes-128-cbc, set_times:3," - "set_pktlen:1024 bytes, sync mode, one process, one thread.\n"); -@@ -532,12 +532,12 @@ static int acc_default_case(struct acc_option *option) - static void print_help(void) - { - ACC_TST_PRT("NAME\n"); -- ACC_TST_PRT(" uadk_benchmark: test UADK acc performance,etc\n"); -+ ACC_TST_PRT(" uadk_tool benchmark: test UADK acc performance,etc\n"); - ACC_TST_PRT("USAGE\n"); -- ACC_TST_PRT(" uadk_benchmark [--alg aes-128-cbc] [--alg rsa-2048]\n"); -- ACC_TST_PRT(" uadk_benchmark [--mode] [--pktlen] [--keylen] [--seconds]\n"); -- ACC_TST_PRT(" uadk_benchmark [--multi] [--sync] [--async] [--help]\n"); -- ACC_TST_PRT(" numactl --cpubind=0 --membind=0,1 ./uadk_benchmark xxxx\n"); -+ ACC_TST_PRT(" uadk_tool benchmark [--alg aes-128-cbc] [--alg rsa-2048]\n"); -+ ACC_TST_PRT(" uadk_tool benchmark [--mode] [--pktlen] [--keylen] [--seconds]\n"); -+ ACC_TST_PRT(" uadk_tool benchmark [--multi] [--sync] [--async] [--help]\n"); -+ ACC_TST_PRT(" numactl --cpubind=0 --membind=0,1 ./uadk_tool benchmark xxxx\n"); - ACC_TST_PRT(" specify numa nodes for cpu and memory\n"); - ACC_TST_PRT("DESCRIPTION\n"); - ACC_TST_PRT(" [--alg aes-128-cbc ]:\n"); -@@ -560,29 +560,29 @@ static void print_help(void) - ACC_TST_PRT(" set the test openssl engine\n"); - ACC_TST_PRT(" [--help] = usage\n"); - ACC_TST_PRT("Example\n"); -- ACC_TST_PRT(" ./uadk_benchmark --alg aes-128-cbc --mode sva --optype 0 --sync\n"); -+ ACC_TST_PRT(" ./uadk_tool benchmark --alg aes-128-cbc --mode sva --opt 0 --sync\n"); - ACC_TST_PRT(" --pktlen 1024 --seconds 1 --multi 1 --thread 1 --ctxnum 4\n"); - ACC_TST_PRT("UPDATE:2021-7-28\n"); - } - --static void acc_cmd_parse(int argc, char *argv[], struct acc_option *option) -+void benchmark_cmd_parse(int argc, char *argv[], struct acc_option *option) - { - int option_index = 0; - int c; - - static struct option long_options[] = { -- {"alg", required_argument, 0, 1}, -- {"mode", required_argument, 0, 2}, -- {"opt", required_argument, 0, 3}, -- {"sync", no_argument, 0,4}, -- {"async", no_argument, 0,5}, -- {"pktlen", required_argument, 0, 6}, -- {"seconds", required_argument, 0, 7}, -- {"thread", required_argument, 0, 8}, -- {"multi", required_argument, 0, 9}, -- {"ctxnum", required_argument, 0, 10}, -- {"engine", required_argument, 0,11}, -- {"help", no_argument, 0, 12}, -+ {"alg", required_argument, 0, 2}, -+ {"mode", required_argument, 0, 3}, -+ {"opt", required_argument, 0, 4}, -+ {"sync", no_argument, 0, 5}, -+ {"async", no_argument, 0, 6}, -+ {"pktlen", required_argument, 0, 7}, -+ {"seconds", required_argument, 0, 8}, -+ {"thread", required_argument, 0, 9}, -+ {"multi", required_argument, 0, 10}, -+ {"ctxnum", required_argument, 0, 11}, -+ {"engine", required_argument, 0, 12}, -+ {"help", no_argument, 0, 13}, - {0, 0, 0, 0} - }; - -@@ -593,41 +593,41 @@ static void acc_cmd_parse(int argc, char *argv[], struct acc_option *option) - - // ACC_TST_PRT("index:%d , optarg name:%s\n", c, optarg); - switch (c) { -- case 1: -+ case 2: - option->algtype = get_alg_type(optarg); - strcpy(option->algname, optarg); - break; -- case 2: -+ case 3: - option->modetype = get_mode_type(optarg); - break; -- case 3: -+ case 4: - option->optype = strtol(optarg, NULL, 0); - break; -- case 4: -+ case 5: - option->syncmode = SYNC_MODE; - break; -- case 5: -+ case 6: - option->syncmode = ASYNC_MODE; - break; -- case 6: -+ case 7: - option->pktlen = strtol(optarg, NULL, 0); - break; -- case 7: -+ case 8: - option->times = strtol(optarg, NULL, 0); - break; -- case 8: -+ case 9: - option->threads = strtol(optarg, NULL, 0); - break; -- case 9: -+ case 10: - option->multis = strtol(optarg, NULL, 0); - break; -- case 10: -+ case 11: - option->ctxnums = strtol(optarg, NULL, 0); - break; -- case 11: -+ case 12: - strcpy(option->engine, optarg); - break; -- case 12: -+ case 13: - print_help(); - break; - default: -@@ -638,7 +638,7 @@ static void acc_cmd_parse(int argc, char *argv[], struct acc_option *option) - } - } - --static int acc_option_convert(struct acc_option *option) -+int acc_option_convert(struct acc_option *option) - { - if (option->algtype >= ALG_MAX) - goto param_err; -@@ -697,21 +697,3 @@ param_err: - ACC_TST_PRT("input parameter error, please input --help\n"); - return -EINVAL; - } -- --int main(int argc, char *argv[]) --{ -- struct acc_option option = {0}; -- int ret = 0; -- -- ACC_TST_PRT("start UADK benchmark test.\n"); -- -- if (!argv[1]) -- return acc_default_case(&option); -- -- acc_cmd_parse(argc, argv, &option); -- ret = acc_option_convert(&option); -- if (ret) -- return ret; -- -- return acc_benchmark_run(&option); --} -diff --git a/uadk_benchmark/uadk_benchmark.h b/uadk_tool/uadk_benchmark.h -similarity index 93% -rename from uadk_benchmark/uadk_benchmark.h -rename to uadk_tool/uadk_benchmark.h -index 9049e50..7ce0426 100644 ---- a/uadk_benchmark/uadk_benchmark.h -+++ b/uadk_tool/uadk_benchmark.h -@@ -170,4 +170,9 @@ extern void add_recv_data(u32 cnt); - extern void add_send_complete(void); - extern u32 get_recv_time(void); - -+void benchmark_cmd_parse(int argc, char *argv[], struct acc_option *option); -+int acc_default_case(struct acc_option *option); -+int acc_option_convert(struct acc_option *option); -+int acc_benchmark_run(struct acc_option *option); -+ - #endif /* UADK_BENCHMARK_H */ -diff --git a/uadk_tool/uadk_dfx.c b/uadk_tool/uadk_dfx.c -new file mode 100644 -index 0000000..96c4919 ---- /dev/null -+++ b/uadk_tool/uadk_dfx.c -@@ -0,0 +1,79 @@ -+/* SPDX-License-Identifier: Apache-2.0 */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "uadk_dfx.h" -+ -+#define print_date() printf("built on: %s %s\n", __DATE__, __TIME__) -+ -+static void print_version(void) -+{ -+ printf("%s\n", UADK_VERSION_TEXT); -+ printf("%s\n", UADK_VERSION_TAG); -+} -+ -+static void print_exe_path(void) -+{ -+ char dir[PATH_MAX] = {0}; -+ int n; -+ -+ n = readlink("/proc/self/exe", dir, PATH_MAX); -+ if (n < 0 || n >= PATH_MAX) -+ printf("uadk tool failed to get the exe path.\n"); -+ -+ printf("exe path: %s\n", dir); -+} -+ -+void print_dfx_help(void) -+{ -+ printf("NAME\n"); -+ printf(" uadk_tool --dfx : uadk library dfx function, etc\n"); -+ printf("USAGE\n"); -+ printf(" uadk_tool --dfx [--version] = Show library version\n"); -+ printf(" uadk_tool --dfx [--date] = Show build date\n"); -+ printf(" uadk_tool --dfx [--dir] = Show library dir\n"); -+ printf(" uadk_tool --dfx [--help] = usage\n"); -+} -+ -+void dfx_cmd_parse(int argc, char *argv[]) -+{ -+ int option_index = 0; -+ int c; -+ -+ static struct option long_options[] = { -+ {"version", no_argument, 0, 2}, -+ {"date", no_argument, 0, 3}, -+ {"dir", no_argument, 0, 4}, -+ {"help", no_argument, 0, 5}, -+ {0, 0, 0, 0} -+ }; -+ -+ while (1) { -+ c = getopt_long(argc, argv, "", long_options, &option_index); -+ if (c == -1) -+ break; -+ -+ switch (c) { -+ case 2: -+ print_version(); -+ break; -+ case 3: -+ print_date(); -+ break; -+ case 4: -+ print_exe_path(); -+ break; -+ case 5: -+ print_dfx_help(); -+ break; -+ default: -+ printf("bad input parameter, exit\n"); -+ exit(-1); -+ } -+ } -+} -diff --git a/uadk_tool/uadk_dfx.h b/uadk_tool/uadk_dfx.h -new file mode 100644 -index 0000000..5f5d9e7 ---- /dev/null -+++ b/uadk_tool/uadk_dfx.h -@@ -0,0 +1,10 @@ -+/* SPDX-License-Identifier: Apache-2.0 */ -+#ifndef UADK_DFX_H -+#define UADK_DFX_H -+ -+#define UADK_VERSION_TEXT "UADK 2.3.22, Released Dec 20th, 2021" -+#define UADK_VERSION_TAG "4b9c69d" -+ -+void print_dfx_help(void); -+void dfx_cmd_parse(int argc, char *argv[]); -+#endif -diff --git a/uadk_tool/uadk_tool.c b/uadk_tool/uadk_tool.c -new file mode 100644 -index 0000000..88beeba ---- /dev/null -+++ b/uadk_tool/uadk_tool.c -@@ -0,0 +1,44 @@ -+/* SPDX-License-Identifier: Apache-2.0 */ -+ -+#include -+#include -+#include -+#include -+#include -+#include "uadk_dfx.h" -+#include "uadk_benchmark.h" -+ -+static void print_tool_help(void) -+{ -+ printf("NAME\n"); -+ printf("uadk_tool dfx : Show some information for library.\n"); -+ printf("uadk_tool benchmark : Test UADK acc performance.\n"); -+} -+ -+int main(int argc, char **argv) -+{ -+ struct acc_option option = {0}; -+ int ret; -+ -+ if (argc > 1) { -+ if (!strcmp("dfx", argv[1])) { -+ dfx_cmd_parse(argc, argv); -+ } else if (!strcmp("benchmark", argv[1])) { -+ printf("start UADK benchmark test.\n"); -+ if (!argv[2]) -+ acc_default_case(&option); -+ -+ benchmark_cmd_parse(argc, argv, &option); -+ ret = acc_option_convert(&option); -+ if (ret) -+ return ret; -+ (void)acc_benchmark_run(&option); -+ } else { -+ print_tool_help(); -+ } -+ } else { -+ print_tool_help(); -+ } -+ -+ return 0; -+} --- -2.31.1 - diff --git a/0009-digest-some-optimizations-for-digest-stream-mode.patch b/0009-digest-some-optimizations-for-digest-stream-mode.patch deleted file mode 100644 index 56e82b5..0000000 --- a/0009-digest-some-optimizations-for-digest-stream-mode.patch +++ /dev/null @@ -1,63 +0,0 @@ -From 0d65963667c4795a28701e5a212422ebcff27c74 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Thu, 23 Dec 2021 15:40:15 +0800 -Subject: [PATCH 10/28] digest: some optimizations for digest stream mode - -1. add some comments for session state. -2. The stream status is set only when the last msg message is - successfully received. - -Signed-off-by: Kai Ye ---- - wd_digest.c | 14 +++++++++----- - 1 file changed, 9 insertions(+), 5 deletions(-) - -diff --git a/wd_digest.c b/wd_digest.c -index 1962f09..bbb258f 100644 ---- a/wd_digest.c -+++ b/wd_digest.c -@@ -21,6 +21,7 @@ - - #define POLL_SIZE 100000 - #define POLL_TIME 1000 -+#define STREAM_MODE_STATE 1 - - static int g_digest_mac_len[WD_DIGEST_TYPE_MAX] = { - WD_DIGEST_SM3_LEN, WD_DIGEST_MD5_LEN, WD_DIGEST_SHA1_LEN, -@@ -46,8 +47,11 @@ struct wd_digest_sess { - unsigned char key[MAX_HMAC_KEY_SIZE]; - __u32 key_bytes; - void *sched_key; -- /* Notify the BD state */ -- int state; -+ /* -+ * Notify the BD state, 1 is final BD or middle BD, -+ * 0 is normal mode or first BD, one session only supports one stream. -+ */ -+ int state; - /* Total of data for stream mode */ - __u64 long_data_len; - }; -@@ -294,7 +298,7 @@ static void fill_request_msg(struct wd_digest_msg *msg, - msg->has_next = req->has_next; - sess->long_data_len += req->in_bytes; - msg->long_data_len = sess->long_data_len; -- /* To store the stream bd state */ -+ /* To store the stream bd state, iv_bytes also means bd state */ - msg->iv_bytes = sess->state; - if (req->has_next == 0) { - sess->long_data_len = 0; -@@ -332,8 +336,8 @@ static int send_recv_sync(struct wd_ctx_internal *ctx, struct wd_digest_sess *ds - goto out; - } - } -- if (msg->has_next) -- dsess->state = msg->out_bytes; -+ if (msg->has_next && msg->result == WD_SUCCESS) -+ dsess->state = STREAM_MODE_STATE; - } while (ret < 0); - - out: --- -2.31.1 - diff --git a/0010-uadk-fix-error-of-wd_get_avail_ctx-return-value.patch b/0010-uadk-fix-error-of-wd_get_avail_ctx-return-value.patch deleted file mode 100644 index 8f45a6e..0000000 --- a/0010-uadk-fix-error-of-wd_get_avail_ctx-return-value.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 17bc4f46411541e725d30ec76693982765a96114 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Mon, 27 Dec 2021 09:52:00 +0800 -Subject: [PATCH 12/28] uadk: fix error of wd_get_avail_ctx return value - -When wd_get_avail_ctx return negative value, -wd should not use this device. - -Signed-off-by: Wenkai Lin ---- - wd.c | 3 ++- - wd_util.c | 2 +- - 2 files changed, 3 insertions(+), 2 deletions(-) - -diff --git a/wd.c b/wd.c -index 838efa7..2bb2fdd 100644 ---- a/wd.c -+++ b/wd.c -@@ -675,7 +675,8 @@ struct uacce_dev *wd_get_accel_dev(const char *alg_name) - while (list) { - tmp = numa_distance(node, list->dev->numa_id); - ctx_num = wd_get_avail_ctx(list->dev); -- if ((dis > tmp && ctx_num) || (dis == tmp && ctx_num > max)) { -+ if ((dis > tmp && ctx_num > 0) || -+ (dis == tmp && ctx_num > max)) { - dev = list->dev; - dis = tmp; - max = ctx_num; -diff --git a/wd_util.c b/wd_util.c -index c973eff..3c1fd26 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -846,7 +846,7 @@ static handle_t request_ctx_on_numa(struct wd_env_config_per_numa *config) - for (i = 0; i < config->dev_num; i++) { - dev = config->dev + i; - ctx_num = wd_get_avail_ctx(dev); -- if (!ctx_num) -+ if (ctx_num <= 0) - continue; - - h_ctx = wd_request_ctx(dev); --- -2.31.1 - diff --git a/0011-uadk-fix-comment-content.patch b/0011-uadk-fix-comment-content.patch deleted file mode 100644 index 460f431..0000000 --- a/0011-uadk-fix-comment-content.patch +++ /dev/null @@ -1,85 +0,0 @@ -From 6a83adca797b8917907d56097f72b3755acf74fa Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Mon, 27 Dec 2021 09:51:59 +0800 -Subject: [PATCH 13/28] uadk: fix comment content - -There must be 1 space between the block comment character -and the comment content. - -Signed-off-by: Wenkai Lin ---- - v1/drv/hisi_qm_udrv.c | 2 +- - v1/wd_cipher.h | 2 +- - v1/wd_dh.h | 2 +- - wd_comp.c | 2 +- - wd_util.c | 2 +- - 5 files changed, 5 insertions(+), 5 deletions(-) - -diff --git a/v1/drv/hisi_qm_udrv.c b/v1/drv/hisi_qm_udrv.c -index 02aaf81..63f346b 100644 ---- a/v1/drv/hisi_qm_udrv.c -+++ b/v1/drv/hisi_qm_udrv.c -@@ -77,7 +77,7 @@ static int qm_hw_sgl_sge_init(struct wd_sgl *sgl, struct hisi_sgl *hisi_sgl, - return WD_SUCCESS; - } - --/* 'num' starts from 1*/ -+/* 'num' starts from 1 */ - void qm_hw_sgl_sge_uninit(struct wd_sgl *sgl, struct hisi_sgl *hisi_sgl, - int num, struct wd_mm_br *br, __u32 buf_sz) - { -diff --git a/v1/wd_cipher.h b/v1/wd_cipher.h -index 2ab0e1d..7059f53 100644 ---- a/v1/wd_cipher.h -+++ b/v1/wd_cipher.h -@@ -92,7 +92,7 @@ struct wcrypto_cipher_op_data { - /* Cipher message format of Warpdrive */ - struct wcrypto_cipher_msg { - __u8 alg_type:4; /* Denoted by enum wcrypto_type */ -- __u8 alg:4; /* Denoted by enum wcrypto_cipher_alg*/ -+ __u8 alg:4; /* Denoted by enum wcrypto_cipher_alg */ - __u8 op_type:4; /* Denoted by enum wcrypto_cipher_op_type */ - __u8 mode:4; /* Denoted by enum wcrypto_cipher_mode */ - __u8 data_fmt; /* Data format, denoted by enum wcrypto_buff_type */ -diff --git a/v1/wd_dh.h b/v1/wd_dh.h -index 6364966..e411830 100644 ---- a/v1/wd_dh.h -+++ b/v1/wd_dh.h -@@ -64,7 +64,7 @@ struct wcrypto_dh_msg { - __u8 result; /* Data format, denoted by WD error code */ - __u16 key_bytes; /* Key size */ - __u8 *x_p; /* This is Xa and p data in order. Should be DMA buffer */ -- __u8 *g; /* This is PV also at phase 2. Should be DMA buffer*/ -+ __u8 *g; /* This is PV also at phase 2. Should be DMA buffer */ - __u8 *out; /* Result address, should be DMA buffer */ - __u16 xbytes; /* parameter Xa size */ - __u16 pbytes; /* parameter p size */ -diff --git a/wd_comp.c b/wd_comp.c -index 6f0cf9d..e34d590 100644 ---- a/wd_comp.c -+++ b/wd_comp.c -@@ -584,7 +584,7 @@ static int append_store_block(struct wd_comp_sess *sess, - memcpy(req->dst, store_block, blocksize); - req->dst_len = blocksize; - checksum = (__u32) cpu_to_be32(checksum); -- /*if zlib, ADLER32*/ -+ /* if zlib, ADLER32 */ - memcpy(req->dst + blocksize, &checksum, sizeof(checksum)); - req->dst_len += sizeof(checksum); - } else if (sess->alg_type == WD_GZIP) { -diff --git a/wd_util.c b/wd_util.c -index 3c1fd26..3170f3c 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -34,7 +34,7 @@ static const char *comp_ctx_type[2][2] = { - {"async-comp:", "async-decomp:"} - }; - --/* define two ctx mode here for cipher and other alg*/ -+/* define two ctx mode here for cipher and other alg */ - static const char *ctx_type[2][1] = { {"sync:"}, {"async:"} }; - - struct async_task { --- -2.31.1 - diff --git a/0012-uadk-max-numa-number-should-not-be-fixed.patch b/0012-uadk-max-numa-number-should-not-be-fixed.patch deleted file mode 100644 index bea5b12..0000000 --- a/0012-uadk-max-numa-number-should-not-be-fixed.patch +++ /dev/null @@ -1,424 +0,0 @@ -From ca3131392a8cb3209599dc6ca4c377460346b36a Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Mon, 27 Dec 2021 09:52:01 +0800 -Subject: [PATCH 14/28] uadk: max numa number should not be fixed - -numa_num_configured_nodes() returns the number -of memory nodes in the system, so use it as max -numa number is good. -when function is called in io path, use static array -as much as possible, so use a numa number macro. - -Signed-off-by: Wenkai Lin ---- - include/wd_sched.h | 5 +- - include/wd_util.h | 6 +- - test/hisi_sec_test/test_hisi_sec.c | 5 +- - uadk_tool/sec_uadk_benchmark.c | 13 ++-- - wd_sched.c | 39 +++++++---- - wd_util.c | 106 ++++++++++++++++++----------- - 6 files changed, 109 insertions(+), 65 deletions(-) - -diff --git a/include/wd_sched.h b/include/wd_sched.h -index a008d57..78125f4 100644 ---- a/include/wd_sched.h -+++ b/include/wd_sched.h -@@ -8,7 +8,6 @@ - #define SCHED_SAMPLE_h - #include "wd_alg_common.h" - --#define MAX_NUMA_NUM 4 - #define INVALID_POS 0xFFFFFFFF - - /* The global policy type */ -@@ -48,8 +47,8 @@ int wd_sched_rr_instance(const struct wd_sched *sched, - * @func: The ctx poll function of user underlying operating. - * - */ --struct wd_sched *wd_sched_rr_alloc(__u8 sched_type, __u8 type_num, __u8 numa_num, -- user_poll_func func); -+struct wd_sched *wd_sched_rr_alloc(__u8 sched_type, __u8 type_num, -+ __u16 numa_num, user_poll_func func); - - /** - * wd_sched_rr_release - Release schedule memory. -diff --git a/include/wd_util.h b/include/wd_util.h -index 643309c..81f4ba8 100644 ---- a/include/wd_util.h -+++ b/include/wd_util.h -@@ -59,12 +59,9 @@ struct wd_env_config_per_numa { - }; - - struct wd_env_config { -- unsigned long numa_num; - struct wd_env_config_per_numa *config_per_numa; - /* Let's make it as a gobal config, not per numa */ - bool enable_internal_poll; -- __u8 disable_env; -- __u8 op_type_num; - int (*alg_poll_ctx)(__u32, __u32, __u32 *); - void (*alg_uninit)(void); - -@@ -74,6 +71,9 @@ struct wd_env_config { - struct wd_ctx_config *ctx_config; - const struct wd_config_variable *table; - __u32 table_size; -+ __u16 numa_num; -+ __u8 disable_env; -+ __u8 op_type_num; - }; - - struct wd_config_variable { -diff --git a/test/hisi_sec_test/test_hisi_sec.c b/test/hisi_sec_test/test_hisi_sec.c -index e1521f6..dda291d 100644 ---- a/test/hisi_sec_test/test_hisi_sec.c -+++ b/test/hisi_sec_test/test_hisi_sec.c -@@ -10,6 +10,7 @@ - #include - #include - #include -+#include - - #include "test_hisi_sec.h" - #include "wd_cipher.h" -@@ -493,7 +494,9 @@ static int init_ctx_config(int type, int mode) - if (list->dev->numa_id < 0) - list->dev->numa_id = 0; - -- g_sched = wd_sched_rr_alloc(SCHED_POLICY_RR, 1, MAX_NUMA_NUM, wd_cipher_poll_ctx); -+ g_sched = wd_sched_rr_alloc(SCHED_POLICY_RR, 1, -+ numa_max_node() + 1, -+ wd_cipher_poll_ctx); - if (!g_sched) { - printf("Fail to alloc sched!\n"); - goto out; -diff --git a/uadk_tool/sec_uadk_benchmark.c b/uadk_tool/sec_uadk_benchmark.c -index 21738ed..40ba227 100644 ---- a/uadk_tool/sec_uadk_benchmark.c -+++ b/uadk_tool/sec_uadk_benchmark.c -@@ -1,5 +1,6 @@ - /* SPDX-License-Identifier: Apache-2.0 */ - -+#include - #include "uadk_benchmark.h" - - #include "sec_uadk_benchmark.h" -@@ -347,8 +348,12 @@ static int sec_uadk_param_parse(thread_data *tddata, struct acc_option *options) - static int init_ctx_config(char *alg, int subtype, int mode) - { - struct uacce_dev_list *list; -+ int i, max_node; - int ret = 0; -- int i; -+ -+ max_node = numa_max_node() + 1; -+ if (max_node <= 0) -+ return -EINVAL; - - list = wd_get_accel_list(alg); - if (!list) { -@@ -369,13 +374,13 @@ static int init_ctx_config(char *alg, int subtype, int mode) - - switch(subtype) { - case CIPHER_TYPE: -- g_sched = wd_sched_rr_alloc(SCHED_POLICY_RR, 1, MAX_NUMA_NUM, wd_cipher_poll_ctx); -+ g_sched = wd_sched_rr_alloc(SCHED_POLICY_RR, 1, max_node, wd_cipher_poll_ctx); - break; - case AEAD_TYPE: -- g_sched = wd_sched_rr_alloc(SCHED_POLICY_RR, 1, MAX_NUMA_NUM, wd_aead_poll_ctx); -+ g_sched = wd_sched_rr_alloc(SCHED_POLICY_RR, 1, max_node, wd_aead_poll_ctx); - break; - case DIGEST_TYPE: -- g_sched = wd_sched_rr_alloc(SCHED_POLICY_RR, 1, MAX_NUMA_NUM, wd_digest_poll_ctx); -+ g_sched = wd_sched_rr_alloc(SCHED_POLICY_RR, 1, max_node, wd_digest_poll_ctx); - break; - default: - SEC_TST_PRT("Fail to parse alg subtype!\n"); -diff --git a/wd_sched.c b/wd_sched.c -index 8ca309c..b310077 100644 ---- a/wd_sched.c -+++ b/wd_sched.c -@@ -6,6 +6,7 @@ - - #include - #include -+#include - #include "wd_sched.h" - - #define MAX_POLL_TIMES 1000 -@@ -37,6 +38,8 @@ struct sched_key { - * @begin: the start pos in ctxs of config. - * @end: the end pos in ctxx of config. - * @last: the last one which be distributed. -+ * @valid: the region used flag. -+ * @lock: lock the currentscheduling region. - */ - struct sched_ctx_region { - __u32 begin; -@@ -64,14 +67,13 @@ struct wd_sched_info { - * @policy: define the policy of the scheduler. - * @numa_num: the max numa numbers of the scheduler. - * @type_num: the max operation types of the scheduler. -- * @numa_id: current task's numa id - * @poll_func: the task's poll operation function. - * @sched_info: the context of the scheduler - */ - struct wd_sched_ctx { - __u32 policy; - __u32 type_num; -- __u8 numa_num; -+ __u16 numa_num; - user_poll_func poll_func; - struct wd_sched_info sched_info[0]; - }; -@@ -200,11 +202,11 @@ static int session_sched_poll_policy(handle_t sched_ctx, - { - struct wd_sched_ctx *ctx = (struct wd_sched_ctx *)sched_ctx; - struct wd_sched_info *sched_info; -- int numa[MAX_NUMA_NUM]; -+ __u16 numa[NUMA_NUM_NODES]; - __u32 loop_time = 0; - __u32 last_count = 0; -- __u8 tail = 0; -- __u8 i; -+ __u16 tail = 0; -+ __u16 i; - int ret; - - if (!sched_ctx || !count || !ctx) { -@@ -212,6 +214,11 @@ static int session_sched_poll_policy(handle_t sched_ctx, - return -EINVAL; - } - -+ if (ctx->numa_num > NUMA_NUM_NODES) { -+ WD_ERR("ERROR: %s ctx numa num is invalid!\n", __FUNCTION__); -+ return -EINVAL; -+ } -+ - sched_info = ctx->sched_info; - for (i = 0; i < ctx->numa_num; i++) - if (sched_info[i].valid) -@@ -412,13 +419,23 @@ out: - return; - } - --struct wd_sched *wd_sched_rr_alloc(__u8 sched_type, __u8 type_num, __u8 numa_num, -- user_poll_func func) -+struct wd_sched *wd_sched_rr_alloc(__u8 sched_type, __u8 type_num, -+ __u16 numa_num, user_poll_func func) - { - struct wd_sched_info *sched_info; - struct wd_sched_ctx *sched_ctx; - struct wd_sched *sched; -- int i, j; -+ int i, j, max_node; -+ -+ max_node = numa_max_node() + 1; -+ if (max_node <= 0) -+ return NULL; -+ -+ if (!numa_num || numa_num > max_node) { -+ WD_ERR("Error: %s numa number = %u!\n", __FUNCTION__, -+ numa_num); -+ return NULL; -+ } - - if (sched_type >= SCHED_POLICY_BUTT || !type_num) { - WD_ERR("Error: %s sched_type = %u or type_num = %u is invalid!\n", -@@ -426,12 +443,6 @@ struct wd_sched *wd_sched_rr_alloc(__u8 sched_type, __u8 type_num, __u8 numa_num - return NULL; - } - -- if (!numa_num) { -- WD_ERR("Warning: %s set numa number as %d!\n", __FUNCTION__, -- MAX_NUMA_NUM); -- numa_num = MAX_NUMA_NUM; -- } -- - sched = calloc(1, sizeof(struct wd_sched)); - if (!sched) { - WD_ERR("Error: %s wd_sched alloc error!\n", __FUNCTION__); -diff --git a/wd_util.c b/wd_util.c -index 3170f3c..3a1def5 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -357,26 +357,28 @@ static void wd_free_numa(struct wd_env_config *config) - * @numa_dev_num: number of devices of the same type (like sec2) on each numa. - * @numa_num: number of numa node that has this type of device. - */ --static void wd_get_dev_numa(struct uacce_dev_list *head, -- int *numa_dev_num, __u8 *numa_num, __u8 size) -+static __u16 wd_get_dev_numa(struct uacce_dev_list *head, -+ int *numa_dev_num, __u16 size) - { - struct uacce_dev_list *list = head; -+ __u16 numa_num = 0; - - while (list) { - if (list->dev->numa_id < 0) { - list->dev->numa_id = 0; - } else if (list->dev->numa_id >= size) { - WD_ERR("numa id is wrong(%d)\n", list->dev->numa_id); -- *numa_num = 0; -- return; -+ return 0; - } - - if (!numa_dev_num[list->dev->numa_id]) -- (*numa_num)++; -+ numa_num++; - - numa_dev_num[list->dev->numa_id]++; - list = list->next; - } -+ -+ return numa_num; - } - - static void wd_set_numa_dev(struct uacce_dev_list *head, -@@ -400,39 +402,18 @@ static void wd_set_numa_dev(struct uacce_dev_list *head, - } - } - --static int wd_alloc_numa(struct wd_env_config *config, -- const struct wd_alg_ops *ops) -+static int wd_set_config_numa(struct wd_env_config *config, -+ int *numa_dev_num, int max_node) - { - struct wd_env_config_per_numa *config_numa; -- struct uacce_dev_list *head; -- int numa_dev_num[MAX_NUMA_NUM] = {0}; -- __u8 numa_num = 0; -- int i, ret; -- -- /* get uacce_dev */ -- head = wd_get_accel_list(ops->alg_name); -- if (!head) { -- WD_ERR("no device to support %s\n", ops->alg_name); -- return -WD_ENODEV; -- } -- -- /* get numa num and device num of each numa from uacce_dev list */ -- wd_get_dev_numa(head, numa_dev_num, &numa_num, MAX_NUMA_NUM); -- if (numa_num == 0 || numa_num > MAX_NUMA_NUM) { -- WD_ERR("numa num err(%u)!\n", numa_num); -- wd_free_list_accels(head); -- return -WD_ENODEV; -- } -+ int i; - -- config->numa_num = numa_num; -- config->config_per_numa = calloc(numa_num, sizeof(*config_numa)); -- if (!config->config_per_numa) { -- ret = -WD_ENOMEM; -- goto free_list; -- } -+ config->config_per_numa = calloc(config->numa_num, sizeof(*config_numa)); -+ if (!config->config_per_numa) -+ return -WD_ENOMEM; - - config_numa = config->config_per_numa; -- for (i = 0; i < MAX_NUMA_NUM; i++) { -+ for (i = 0; i < max_node; i++) { - if (!numa_dev_num[i]) - continue; - -@@ -440,24 +421,65 @@ static int wd_alloc_numa(struct wd_env_config *config, - config_numa->dev = calloc(numa_dev_num[i], - sizeof(struct uacce_dev)); - if (!config_numa->dev) { -- ret = -WD_ENOMEM; -- goto free_mem; -+ /* free config_per_numa and all uacce dev */ -+ wd_free_numa(config); -+ return -WD_ENOMEM; - } - - config_numa->dev_num = 0; - config_numa++; - } - -+ return 0; -+} -+ -+static int wd_alloc_numa(struct wd_env_config *config, -+ const struct wd_alg_ops *ops) -+{ -+ struct uacce_dev_list *head; -+ int *numa_dev_num; -+ int ret, max_node; -+ -+ max_node = numa_max_node() + 1; -+ if (max_node <= 0) -+ return -WD_EINVAL; -+ -+ numa_dev_num = calloc(max_node, sizeof(int)); -+ if (!numa_dev_num) -+ return -WD_ENOMEM; -+ -+ /* get uacce_dev */ -+ head = wd_get_accel_list(ops->alg_name); -+ if (!head) { -+ WD_ERR("no device to support %s\n", ops->alg_name); -+ ret = -WD_ENODEV; -+ goto free_numa_dev_num; -+ } -+ -+ /* get numa num and device num of each numa from uacce_dev list */ -+ config->numa_num = wd_get_dev_numa(head, numa_dev_num, max_node); -+ if (config->numa_num == 0 || config->numa_num > max_node) { -+ WD_ERR("numa num err(%u)!\n", config->numa_num); -+ ret = -WD_ENODEV; -+ goto free_list; -+ } -+ -+ /* alloc and init config_per_numa and all uacce dev */ -+ ret = wd_set_config_numa(config, numa_dev_num, max_node); -+ if (ret) -+ goto free_list; -+ - /* set device and device num for config numa from uacce_dev list */ - wd_set_numa_dev(head, config); - wd_free_list_accels(head); -+ free(numa_dev_num); - - return 0; - --free_mem: -- wd_free_numa(config); - free_list: - wd_free_list_accels(head); -+free_numa_dev_num: -+ free(numa_dev_num); - return ret; - } - -@@ -981,18 +1003,22 @@ static int wd_sched_fill_table(struct wd_env_config_per_numa *config_numa, - static int wd_init_sched_config(struct wd_env_config *config) - { - struct wd_env_config_per_numa *config_numa; -+ int i, j, ret, max_node, type_num; - struct wd_sched *sched; -- int type_num = config->op_type_num; -- int i, j, ret; - void *func = NULL; - -+ max_node = numa_max_node() + 1; -+ if (max_node <= 0) -+ return -WD_EINVAL; -+ - if (!config->enable_internal_poll) - func = config->alg_poll_ctx; - - config->internal_sched = false; -+ type_num = config->op_type_num; - if (!config->sched) { - config->sched = wd_sched_rr_alloc(SCHED_POLICY_RR, type_num, -- MAX_NUMA_NUM, func); -+ max_node, func); - if (!config->sched) - return -WD_ENOMEM; - --- -2.31.1 - diff --git a/0013-uadk-mempool-remove-MISC_DVE_UACCE_CTRL.patch b/0013-uadk-mempool-remove-MISC_DVE_UACCE_CTRL.patch deleted file mode 100644 index 5cf6aab..0000000 --- a/0013-uadk-mempool-remove-MISC_DVE_UACCE_CTRL.patch +++ /dev/null @@ -1,27 +0,0 @@ -From cf1b23feddeba22869d35d5f1fa4b4675f9b8984 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 30 Dec 2021 12:07:26 +0800 -Subject: [PATCH 15/28] uadk: mempool: remove MISC_DVE_UACCE_CTRL - -MISC_DVE_UACCE_CTRL is no longer used, clean it. - -Signed-off-by: Wenkai Lin ---- - wd_mempool.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/wd_mempool.c b/wd_mempool.c -index 2462560..bbf5edb 100644 ---- a/wd_mempool.c -+++ b/wd_mempool.c -@@ -18,7 +18,6 @@ - - #define SYSFS_NODE_PATH "/sys/devices/system/node/node" - #define MAX_HP_STR_SIZE 64 --#define MISC_DVE_UACCE_CTRL "/dev/uacce_ctrl" - #define HUGETLB_FLAG_ENCODE_SHIFT 26 - - #define BITS_PER_LONG ((unsigned int)sizeof(unsigned long) * 8) --- -2.31.1 - diff --git a/0014-uadk-mempool-check-stats-null-pointer.patch b/0014-uadk-mempool-check-stats-null-pointer.patch deleted file mode 100644 index a35ac30..0000000 --- a/0014-uadk-mempool-check-stats-null-pointer.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 80fd67d79a66c45171890460ed8a8cc8bc83bb7a Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 30 Dec 2021 12:07:28 +0800 -Subject: [PATCH 16/28] uadk: mempool: check stats null pointer - -If user input's stats is null pointer, it will cause -a segment fault, fix it. - -Signed-off-by: Wenkai Lin ---- - wd_mempool.c | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/wd_mempool.c b/wd_mempool.c -index bbf5edb..b6e1088 100644 ---- a/wd_mempool.c -+++ b/wd_mempool.c -@@ -958,6 +958,11 @@ void wd_mempool_stats(handle_t mempool, struct wd_mempool_stats *stats) - return; - } - -+ if (!stats) { -+ WD_ERR("wd_mempool: mempool stats is NULL\n"); -+ return; -+ } -+ - wd_spinlock(&mp->lock); - - stats->page_type = mp->page_type; --- -2.31.1 - diff --git a/0015-uadk-fix-wd_get_config_numa-info.patch b/0015-uadk-fix-wd_get_config_numa-info.patch deleted file mode 100644 index 3111bba..0000000 --- a/0015-uadk-fix-wd_get_config_numa-info.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 19add2ea6da8525bafb8fb2747965cbb55dbea75 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 30 Dec 2021 12:07:29 +0800 -Subject: [PATCH 17/28] uadk: fix wd_get_config_numa info - -wd_get_config_numa is used to get config numa -by node id, not set a numa dev. - -Signed-off-by: Wenkai Lin ---- - wd_util.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/wd_util.c b/wd_util.c -index 3a1def5..faaf821 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -391,7 +391,7 @@ static void wd_set_numa_dev(struct uacce_dev_list *head, - while (list) { - config_numa = wd_get_config_numa(config, list->dev->numa_id); - if (!config_numa) { -- WD_ERR("set numa dev err!\n"); -+ WD_ERR("%s got wrong numa node!\n", __func__); - break; - } - --- -2.31.1 - diff --git a/0016-uadk-fix-static-check-warning.patch b/0016-uadk-fix-static-check-warning.patch deleted file mode 100644 index d0b71de..0000000 --- a/0016-uadk-fix-static-check-warning.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 0feee4ccc2b3d0f60d84d39310fc1f85a3d28d63 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 30 Dec 2021 12:07:30 +0800 -Subject: [PATCH 18/28] uadk: fix static check warning - -1.set null pointer after free. -2.define const pointer. - -Signed-off-by: Wenkai Lin ---- - wd_sched.c | 4 +++- - wd_util.c | 2 +- - 2 files changed, 4 insertions(+), 2 deletions(-) - -diff --git a/wd_sched.c b/wd_sched.c -index b310077..3330a4d 100644 ---- a/wd_sched.c -+++ b/wd_sched.c -@@ -406,8 +406,10 @@ void wd_sched_rr_release(struct wd_sched *sched) - sched_info = sched_ctx->sched_info; - for (i = 0; i < sched_ctx->numa_num; i++) { - for (j = 0; j < SCHED_MODE_BUTT; j++) { -- if (sched_info[i].ctx_region[j]) -+ if (sched_info[i].ctx_region[j]) { - free(sched_info[i].ctx_region[j]); -+ sched_info[i].ctx_region[j] = NULL; -+ } - } - } - -diff --git a/wd_util.c b/wd_util.c -index faaf821..62f9359 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -403,7 +403,7 @@ static void wd_set_numa_dev(struct uacce_dev_list *head, - } - - static int wd_set_config_numa(struct wd_env_config *config, -- int *numa_dev_num, int max_node) -+ const int *numa_dev_num, int max_node) - { - struct wd_env_config_per_numa *config_numa; - int i; --- -2.31.1 - diff --git a/0017-uadk-fix-numa-array-use-too-much-stack-space.patch b/0017-uadk-fix-numa-array-use-too-much-stack-space.patch deleted file mode 100644 index 9694970..0000000 --- a/0017-uadk-fix-numa-array-use-too-much-stack-space.patch +++ /dev/null @@ -1,69 +0,0 @@ -From 4a15745d3544eae2c41419d5fb64802e2a16a9f5 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 30 Dec 2021 12:07:31 +0800 -Subject: [PATCH 19/28] uadk: fix numa array use too much stack space - -numa array will take 32768 bytes, too big for -a process, replace it by check numa invalid status. - -Signed-off-by: Wenkai Lin ---- - wd_sched.c | 19 ++++++++++++------- - 1 file changed, 12 insertions(+), 7 deletions(-) - -diff --git a/wd_sched.c b/wd_sched.c -index 3330a4d..f97c15f 100644 ---- a/wd_sched.c -+++ b/wd_sched.c -@@ -202,10 +202,8 @@ static int session_sched_poll_policy(handle_t sched_ctx, - { - struct wd_sched_ctx *ctx = (struct wd_sched_ctx *)sched_ctx; - struct wd_sched_info *sched_info; -- __u16 numa[NUMA_NUM_NODES]; - __u32 loop_time = 0; - __u32 last_count = 0; -- __u16 tail = 0; - __u16 i; - int ret; - -@@ -220,9 +218,6 @@ static int session_sched_poll_policy(handle_t sched_ctx, - } - - sched_info = ctx->sched_info; -- for (i = 0; i < ctx->numa_num; i++) -- if (sched_info[i].valid) -- numa[tail++]= i; - - /* - * Try different numa's ctx if we can't receive any -@@ -231,15 +226,25 @@ static int session_sched_poll_policy(handle_t sched_ctx, - */ - while (loop_time < MAX_POLL_TIMES) { - loop_time++; -- for (i = 0; i < tail;) { -+ for (i = 0; i < ctx->numa_num;) { -+ /* If current numa is not valid, find next. */ -+ if (!sched_info[i].valid) { -+ i++; -+ continue; -+ } -+ - last_count = *count; -- ret = session_poll_policy_rr(ctx, numa[i], expect, count); -+ ret = session_poll_policy_rr(ctx, i, expect, count); - if (ret) - return ret; - - if (expect == *count) - return 0; - -+ /* -+ * If no package is received, find next numa, -+ * otherwise, keep receiving packets at this node. -+ */ - if (last_count == *count) - i++; - } --- -2.31.1 - diff --git a/0018-uadk-fix-get_dev_info.patch b/0018-uadk-fix-get_dev_info.patch deleted file mode 100644 index 2492230..0000000 --- a/0018-uadk-fix-get_dev_info.patch +++ /dev/null @@ -1,86 +0,0 @@ -From 34b4dcc70a808c286378a9b6aeb72d5ba88493ef Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 30 Dec 2021 12:07:32 +0800 -Subject: [PATCH 20/28] uadk: fix get_dev_info - -Fix for get_int_attr and get_str_attr -return value is not checked in get_dev_info. - -Signed-off-by: Wenkai Lin ---- - wd.c | 43 +++++++++++++++++++++++++++++++++---------- - 1 file changed, 33 insertions(+), 10 deletions(-) - -diff --git a/wd.c b/wd.c -index 2bb2fdd..25386d7 100644 ---- a/wd.c -+++ b/wd.c -@@ -137,23 +137,43 @@ static int get_dev_info(struct uacce_dev *dev) - int value = 0; - int ret; - -- get_int_attr(dev, "flags", &dev->flags); -- get_str_attr(dev, "api", dev->api, WD_NAME_SIZE); -- - /* hardware err isolate flag */ - ret = access_attr(dev->dev_root, "isolate", F_OK); - if (!ret) { -- get_int_attr(dev, "isolate", &value); -- if (value == 1) -+ ret = get_int_attr(dev, "isolate", &value); -+ if (ret < 0) -+ return ret; -+ else if (value == 1) - return -ENODEV; - } - -- get_str_attr(dev, "algorithms", dev->algs, MAX_ATTR_STR_SIZE); -- get_int_attr(dev, "region_mmio_size", &value); -+ ret = get_int_attr(dev, "flags", &dev->flags); -+ if (ret < 0) -+ return ret; -+ -+ ret = get_int_attr(dev, "region_mmio_size", &value); -+ if (ret < 0) -+ return ret; -+ - dev->qfrs_offs[UACCE_QFRT_MMIO] = value; -- get_int_attr(dev, "region_dus_size", &value); -+ -+ ret = get_int_attr(dev, "region_dus_size", &value); -+ if (ret < 0) -+ return ret; -+ - dev->qfrs_offs[UACCE_QFRT_DUS] = value; -- get_int_attr(dev, "device/numa_node", &dev->numa_id); -+ -+ ret = get_int_attr(dev, "device/numa_node", &dev->numa_id); -+ if (ret < 0) -+ return ret; -+ -+ ret = get_str_attr(dev, "api", dev->api, WD_NAME_SIZE); -+ if (ret < 0) -+ return ret; -+ -+ ret = get_str_attr(dev, "algorithms", dev->algs, MAX_ATTR_STR_SIZE); -+ if (ret < 0) -+ return ret; - - return 0; - } -@@ -195,8 +215,11 @@ static struct uacce_dev *read_uacce_sysfs(const char *dev_name) - goto out_dir; - - ret = get_dev_info(dev); -- if (ret) -+ if (ret) { -+ WD_ERR("failed to get dev info: ret = %d!\n", ret); - goto out_dir; -+ } -+ - break; - } - if (!dev_dir) --- -2.31.1 - diff --git a/0019-uadk-fix-pthread_spin_init.patch b/0019-uadk-fix-pthread_spin_init.patch deleted file mode 100644 index 423d541..0000000 --- a/0019-uadk-fix-pthread_spin_init.patch +++ /dev/null @@ -1,92 +0,0 @@ -From 913a84cbdce651aea50a6e12117ee93ccbbdbf1c Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 30 Dec 2021 12:07:33 +0800 -Subject: [PATCH 21/28] uadk: fix pthread_spin_init - -pthread_spin_init() may fail with errors, -check return value for it. - -Signed-off-by: Wenkai Lin ---- - drv/hisi_qm_udrv.c | 16 ++++++++++++---- - wd_util.c | 9 +++++++-- - 2 files changed, 19 insertions(+), 6 deletions(-) - -diff --git a/drv/hisi_qm_udrv.c b/drv/hisi_qm_udrv.c -index 8282c51..845fa46 100644 ---- a/drv/hisi_qm_udrv.c -+++ b/drv/hisi_qm_udrv.c -@@ -298,7 +298,7 @@ static int hisi_qm_setup_info(struct hisi_qp *qp, struct hisi_qm_priv *config) - ret = hisi_qm_get_qfrs_offs(qp->h_ctx, q_info); - if (ret) { - WD_ERR("get dev qfrs offset fail.\n"); -- return ret; -+ goto err_out; - } - - ret = hisi_qm_setup_db(qp->h_ctx, q_info); -@@ -323,7 +323,11 @@ static int hisi_qm_setup_info(struct hisi_qp *qp, struct hisi_qm_priv *config) - q_info->region_size[UACCE_QFRT_DUS] - sizeof(uint32_t); - q_info->ds_rx_base = q_info->ds_tx_base - sizeof(uint32_t); - -- pthread_spin_init(&q_info->lock, PTHREAD_PROCESS_SHARED); -+ ret = pthread_spin_init(&q_info->lock, PTHREAD_PROCESS_SHARED); -+ if (ret) { -+ WD_ERR("init qinfo lock fail\n"); -+ goto err_out; -+ } - - return 0; - -@@ -560,7 +564,7 @@ static struct hisi_sgl *hisi_qm_align_sgl(const void *sgl, __u32 sge_num) - handle_t hisi_qm_create_sglpool(__u32 sgl_num, __u32 sge_num) - { - struct hisi_sgl_pool *sgl_pool; -- int i; -+ int i, ret; - - if (!sgl_num || !sge_num || sge_num > HISI_SGE_NUM_IN_SGL) { - WD_ERR("create sgl_pool failed, sgl_num=%u, sge_num=%u\n", -@@ -601,7 +605,11 @@ handle_t hisi_qm_create_sglpool(__u32 sgl_num, __u32 sge_num) - sgl_pool->sge_num = sge_num; - sgl_pool->depth = sgl_num; - sgl_pool->top = sgl_num; -- pthread_spin_init(&sgl_pool->lock, PTHREAD_PROCESS_SHARED); -+ ret = pthread_spin_init(&sgl_pool->lock, PTHREAD_PROCESS_SHARED); -+ if (ret) { -+ WD_ERR("init sgl pool lock failed.\n"); -+ goto err_out; -+ } - - return (handle_t)sgl_pool; - -diff --git a/wd_util.c b/wd_util.c -index 62f9359..83c77c4 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -68,7 +68,7 @@ int wd_init_ctx_config(struct wd_ctx_config_internal *in, - struct wd_ctx_config *cfg) - { - struct wd_ctx_internal *ctxs; -- int i; -+ int i, ret; - - if (!cfg->ctx_num) { - WD_ERR("invalid parameters, ctx_num is 0!\n"); -@@ -93,7 +93,12 @@ int wd_init_ctx_config(struct wd_ctx_config_internal *in, - } - - clone_ctx_to_internal(cfg->ctxs + i, ctxs + i); -- pthread_spin_init(&ctxs[i].lock, PTHREAD_PROCESS_SHARED); -+ ret = pthread_spin_init(&ctxs[i].lock, PTHREAD_PROCESS_SHARED); -+ if (ret) { -+ WD_ERR("init ctxs lock failed!\n"); -+ free(ctxs); -+ return ret; -+ } - } - - in->ctxs = ctxs; --- -2.31.1 - diff --git a/0020-uadk-env-optimize-find_async_queue.patch b/0020-uadk-env-optimize-find_async_queue.patch deleted file mode 100644 index 86b1f07..0000000 --- a/0020-uadk-env-optimize-find_async_queue.patch +++ /dev/null @@ -1,69 +0,0 @@ -From 1c037d1a257714802890f83aaa970fc140786915 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 30 Dec 2021 12:07:34 +0800 -Subject: [PATCH 22/28] uadk: env: optimize find_async_queue - -No need to find ctx idx from begin to end, -if it is in ctx range, calculate its offset -from begin ctx. -If offset not set, find_async_queue should -return NULL. - -Signed-off-by: Wenkai Lin ---- - wd_util.c | 29 ++++++++++++++--------------- - 1 file changed, 14 insertions(+), 15 deletions(-) - -diff --git a/wd_util.c b/wd_util.c -index 83c77c4..ee1c084 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -1061,7 +1061,9 @@ static struct async_task_queue *find_async_queue(struct wd_env_config *config, - struct wd_env_config_per_numa *config_numa; - struct wd_ctx_range **ctx_table; - struct async_task_queue *head; -- int i, j, n = -1, num = 0; -+ int offset = -1; -+ int num = 0; -+ int i; - - FOREACH_NUMA(i, config, config_numa) { - num += config_numa->sync_ctx_num + config_numa->async_ctx_num; -@@ -1074,23 +1076,20 @@ static struct async_task_queue *find_async_queue(struct wd_env_config *config, - - ctx_table = config_numa->ctx_table; - for (i = 0; i < config_numa->op_type_num; i++) { -- for (j = ctx_table[CTX_MODE_ASYNC][i].begin; -- j <= ctx_table[CTX_MODE_ASYNC][i].end; -- j++) { -- if (j == idx) { -- n = j - ctx_table[CTX_MODE_ASYNC][i].begin; -- if (n >= config_numa->async_poll_num) -- n = n % config_numa->async_poll_num; -- break; -- } -+ if (idx <= ctx_table[CTX_MODE_ASYNC][i].end && -+ idx >= ctx_table[CTX_MODE_ASYNC][i].begin) { -+ offset = idx - ctx_table[CTX_MODE_ASYNC][i].begin; -+ if (offset >= config_numa->async_poll_num) -+ offset = offset % config_numa->async_poll_num; - } - } -+ -+ if (offset < 0) -+ return NULL; -+ - head = (struct async_task_queue *)config_numa->async_task_queue_array; -- if (n >= 0) { -- head += n; -- return head; -- } -- return head; -+ -+ return head + offset; - } - - /* fix me: all return value here, and no config input */ --- -2.31.1 - diff --git a/0021-uadk-env-optimize-some-function.patch b/0021-uadk-env-optimize-some-function.patch deleted file mode 100644 index b419512..0000000 --- a/0021-uadk-env-optimize-some-function.patch +++ /dev/null @@ -1,175 +0,0 @@ -From a98e9a6092ae5af499353a739f30506bee7db73f Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 30 Dec 2021 12:15:29 +0800 -Subject: [PATCH 23/28] uadk: env: optimize some function - -1.find_async_queue add some abnormal branch judgment -2.wd_init_async_polling_thread_per_numa use queue_head - to save a task queue head. - -Signed-off-by: Wenkai Lin ---- - wd_util.c | 71 ++++++++++++++++++++++++++++++++----------------------- - 1 file changed, 41 insertions(+), 30 deletions(-) - -diff --git a/wd_util.c b/wd_util.c -index ee1c084..49e1d66 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -1061,7 +1061,7 @@ static struct async_task_queue *find_async_queue(struct wd_env_config *config, - struct wd_env_config_per_numa *config_numa; - struct wd_ctx_range **ctx_table; - struct async_task_queue *head; -- int offset = -1; -+ unsigned long offset; - int num = 0; - int i; - -@@ -1071,8 +1071,15 @@ static struct async_task_queue *find_async_queue(struct wd_env_config *config, - break; - } - -- if (i == config->numa_num) -+ if (i == config->numa_num) { -+ WD_ERR("failed to find a proper numa node!\n"); -+ return NULL; -+ } -+ -+ if (!config_numa->async_poll_num) { -+ WD_ERR("invalid parameter, async_poll_num of numa is zero!\n"); - return NULL; -+ } - - ctx_table = config_numa->ctx_table; - for (i = 0; i < config_numa->op_type_num; i++) { -@@ -1081,11 +1088,15 @@ static struct async_task_queue *find_async_queue(struct wd_env_config *config, - offset = idx - ctx_table[CTX_MODE_ASYNC][i].begin; - if (offset >= config_numa->async_poll_num) - offset = offset % config_numa->async_poll_num; -+ -+ break; - } - } - -- if (offset < 0) -+ if (i == config_numa->op_type_num) { -+ WD_ERR("failed to find async queue for ctx: idx %u!\n", idx); - return NULL; -+ } - - head = (struct async_task_queue *)config_numa->async_task_queue_array; - -@@ -1193,18 +1204,18 @@ static int wd_init_one_task_queue(struct async_task_queue *task_queue, - void *alg_poll_ctx) - - { -- struct async_task *head; -+ struct async_task *task_head; - pthread_t thread_id; - pthread_attr_t attr; - int depth, ret; - - task_queue->depth = depth = WD_ASYNC_DEF_QUEUE_DEPTH; - -- head = calloc(task_queue->depth, sizeof(*head)); -- if (!head) -+ task_head = calloc(task_queue->depth, sizeof(struct async_task)); -+ if (!task_head) - return -WD_ENOMEM; - -- task_queue->head = head; -+ task_queue->head = task_head; - task_queue->left_task = depth; - task_queue->alg_poll_ctx = alg_poll_ctx; - -@@ -1245,7 +1256,7 @@ err_uninit_full_sem: - err_uninit_empty_sem: - sem_destroy(&task_queue->empty_sem); - err_free_head: -- free(head); -+ free(task_head); - ret = -errno; - return ret; - } -@@ -1272,45 +1283,45 @@ static void wd_uninit_one_task_queue(struct async_task_queue *task_queue) - static int wd_init_async_polling_thread_per_numa(struct wd_env_config *config, - struct wd_env_config_per_numa *config_numa) - { -- struct async_task_queue *task_queue, *head; -- int i, j, n, ret; -+ struct async_task_queue *task_queue, *queue_head; -+ int i, j, poll_thread_num, ret; - - if (!config_numa->async_ctx_num) - return 0; - -- if (config_numa->async_poll_num <= 0) { -- WD_ERR("Invalid async poll number (%ld) is set.\n", -+ if (!config_numa->async_poll_num) { -+ WD_ERR("invalid async poll num (%lu) is set.\n", - config_numa->async_poll_num); -- WD_ERR("Change to default value: %d\n", WD_ASYNC_DEF_POLL_NUM); -+ WD_ERR("change to default value: %d\n", WD_ASYNC_DEF_POLL_NUM); - config_numa->async_poll_num = WD_ASYNC_DEF_POLL_NUM; - } - -+ poll_thread_num = config_numa->async_poll_num; -+ if (poll_thread_num > config_numa->async_ctx_num) { -+ poll_thread_num = config_numa->async_ctx_num; -+ WD_ERR("downgrade poll thread num from %lu to %lu.\n", -+ config_numa->async_poll_num, -+ config_numa->async_ctx_num); -+ } -+ - /* make max task queues as the number of async ctxs */ -- task_queue = calloc(config_numa->async_ctx_num, sizeof(*head)); -- if (!task_queue) -+ queue_head = calloc(config_numa->async_ctx_num, sizeof(*queue_head)); -+ if (!queue_head) - return -WD_ENOMEM; -- head = task_queue; -- config_numa->async_task_queue_array = (void *)head; - -- if (config_numa->async_poll_num > config_numa->async_ctx_num) { -- n = config_numa->async_ctx_num; -- WD_ERR("Can't create more async polling threads than the " -- "number of ctx number. Downgrade it from %ld to %ld.\n", -- config_numa->async_poll_num, -- config_numa->async_ctx_num); -- } else -- n = config_numa->async_poll_num; -- for (i = 0; i < n; task_queue++, i++) { -+ task_queue = queue_head; -+ for (i = 0; i < poll_thread_num; task_queue++, i++) { - ret = wd_init_one_task_queue(task_queue, config->alg_poll_ctx); - if (ret) { -- task_queue = head; - for (j = 0; j < i; task_queue++, j++) - wd_uninit_one_task_queue(task_queue); -- free(head); -+ free(queue_head); - return ret; - } - } - -+ config_numa->async_task_queue_array = (void *)queue_head; -+ - return 0; - } - -@@ -1322,10 +1333,10 @@ static void wd_uninit_async_polling_thread_per_numa(struct wd_env_config *cfg, - - head = config_numa->async_task_queue_array; - task_queue = head; -+ n = config_numa->async_poll_num; - if (config_numa->async_poll_num > config_numa->async_ctx_num) - n = config_numa->async_ctx_num; -- else -- n = config_numa->async_poll_num; -+ - for (i = 0; i < n; task_queue++, i++) - wd_uninit_one_task_queue(task_queue); - free(head); --- -2.31.1 - diff --git a/0022-uadk-v1-delete-unused-parameter.patch b/0022-uadk-v1-delete-unused-parameter.patch deleted file mode 100644 index bc2ad5a..0000000 --- a/0022-uadk-v1-delete-unused-parameter.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 09db34533df0920fe0102e85ab573038ad69bf2d Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 30 Dec 2021 20:34:50 +0800 -Subject: [PATCH 24/28] uadk: v1: delete unused parameter - -capa is not used in copy_if_better. - -Signed-off-by: Wenkai Lin ---- - v1/wd.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/v1/wd.c b/v1/wd.c -index 6568243..26f6692 100644 ---- a/v1/wd.c -+++ b/v1/wd.c -@@ -349,7 +349,7 @@ static int get_dev_info(struct dev_info *dinfo, const char *alg) - } - - static bool copy_if_better(struct dev_info *old, struct dev_info *new, -- struct wd_capa *capa, unsigned int node_mask) -+ unsigned int node_mask) - { - bool find_node = false; - -@@ -437,7 +437,7 @@ static int find_available_dev(struct dev_info *dinfop, - ret = get_dev_info(&dinfo, capa->alg); - if (!ret) { - cnt++; -- if (copy_if_better(dinfop, &dinfo, capa, node_mask)) { -+ if (copy_if_better(dinfop, &dinfo, node_mask)) { - find_node = true; - break; - } --- -2.31.1 - diff --git a/0023-uadk-env-fix-wd_add_task_to_async_queue-return-value.patch b/0023-uadk-env-fix-wd_add_task_to_async_queue-return-value.patch deleted file mode 100644 index e20ea7d..0000000 --- a/0023-uadk-env-fix-wd_add_task_to_async_queue-return-value.patch +++ /dev/null @@ -1,212 +0,0 @@ -From d827ac994867b2dd06d5723d62c6c618f0c5c77b Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 30 Dec 2021 20:34:51 +0800 -Subject: [PATCH 25/28] uadk: env: fix wd_add_task_to_async_queue return value - -wd_add_task_to_async_queue may fail with error code, -add return value check after call it. - -Signed-off-by: Wenkai Lin ---- - wd_aead.c | 10 ++++++++-- - wd_cipher.c | 10 ++++++++-- - wd_comp.c | 4 +++- - wd_dh.c | 6 ++++-- - wd_digest.c | 11 ++++++++--- - wd_ecc.c | 6 ++++-- - wd_rsa.c | 6 ++++-- - wd_util.c | 20 +++++++++++++------- - 8 files changed, 52 insertions(+), 21 deletions(-) - -diff --git a/wd_aead.c b/wd_aead.c -index f93f791..ebad440 100644 ---- a/wd_aead.c -+++ b/wd_aead.c -@@ -596,11 +596,17 @@ int wd_do_aead_async(handle_t h_sess, struct wd_aead_req *req) - if (ret != -WD_EBUSY) - WD_ERR("failed to send BD, hw is err!\n"); - -- wd_put_msg_to_pool(&wd_aead_setting.pool, idx, msg->tag); -+ goto fail_with_msg; - } - -- wd_add_task_to_async_queue(&wd_aead_env_config, idx); -+ ret = wd_add_task_to_async_queue(&wd_aead_env_config, idx); -+ if (ret) -+ goto fail_with_msg; -+ -+ return 0; - -+fail_with_msg: -+ wd_put_msg_to_pool(&wd_aead_setting.pool, idx, msg->tag); - return ret; - } - -diff --git a/wd_cipher.c b/wd_cipher.c -index 9977765..9c1f98c 100644 ---- a/wd_cipher.c -+++ b/wd_cipher.c -@@ -515,11 +515,17 @@ int wd_do_cipher_async(handle_t h_sess, struct wd_cipher_req *req) - if (ret != -WD_EBUSY) - WD_ERR("wd cipher async send err!\n"); - -- wd_put_msg_to_pool(&wd_cipher_setting.pool, idx, msg->tag); -+ goto fail_with_msg; - } - -- wd_add_task_to_async_queue(&wd_cipher_env_config, idx); -+ ret = wd_add_task_to_async_queue(&wd_cipher_env_config, idx); -+ if (ret) -+ goto fail_with_msg; -+ -+ return 0; - -+fail_with_msg: -+ wd_put_msg_to_pool(&wd_cipher_setting.pool, idx, msg->tag); - return ret; - } - -diff --git a/wd_comp.c b/wd_comp.c -index e34d590..fc355a9 100644 ---- a/wd_comp.c -+++ b/wd_comp.c -@@ -724,7 +724,9 @@ int wd_do_comp_async(handle_t h_sess, struct wd_comp_req *req) - - pthread_spin_unlock(&ctx->lock); - -- wd_add_task_to_async_queue(&wd_comp_env_config, idx); -+ ret = wd_add_task_to_async_queue(&wd_comp_env_config, idx); -+ if (ret) -+ wd_put_msg_to_pool(&wd_comp_setting.pool, idx, msg->tag); - - return ret; - } -diff --git a/wd_dh.c b/wd_dh.c -index 177ffad..7b849ac 100644 ---- a/wd_dh.c -+++ b/wd_dh.c -@@ -341,9 +341,11 @@ int wd_do_dh_async(handle_t sess, struct wd_dh_req *req) - } - pthread_spin_unlock(&ctx->lock); - -- wd_add_task_to_async_queue(&wd_dh_env_config, idx); -+ ret = wd_add_task_to_async_queue(&wd_dh_env_config, idx); -+ if (ret) -+ goto fail_with_msg; - -- return ret; -+ return 0; - - fail_with_msg: - wd_put_msg_to_pool(&wd_dh_setting.pool, idx, mid); -diff --git a/wd_digest.c b/wd_digest.c -index bbb258f..2b3661d 100644 ---- a/wd_digest.c -+++ b/wd_digest.c -@@ -420,13 +420,18 @@ int wd_do_digest_async(handle_t h_sess, struct wd_digest_req *req) - if (ret != -WD_EBUSY) - WD_ERR("failed to send BD, hw is err!\n"); - -- wd_put_msg_to_pool(&wd_digest_setting.pool, idx, msg->tag); -- return ret; -+ goto fail_with_msg; - } - -- wd_add_task_to_async_queue(&wd_digest_env_config, idx); -+ ret = wd_add_task_to_async_queue(&wd_digest_env_config, idx); -+ if (ret) -+ goto fail_with_msg; - - return 0; -+ -+fail_with_msg: -+ wd_put_msg_to_pool(&wd_digest_setting.pool, idx, msg->tag); -+ return ret; - } - - int wd_digest_poll_ctx(__u32 idx, __u32 expt, __u32 *count) -diff --git a/wd_ecc.c b/wd_ecc.c -index 8b625e4..e37fb39 100644 ---- a/wd_ecc.c -+++ b/wd_ecc.c -@@ -2187,9 +2187,11 @@ int wd_do_ecc_async(handle_t sess, struct wd_ecc_req *req) - } - pthread_spin_unlock(&ctx->lock); - -- wd_add_task_to_async_queue(&wd_ecc_env_config, idx); -+ ret = wd_add_task_to_async_queue(&wd_ecc_env_config, idx); -+ if (ret) -+ goto fail_with_msg; - -- return ret; -+ return 0; - - fail_with_msg: - wd_put_msg_to_pool(&wd_ecc_setting.pool, idx, mid); -diff --git a/wd_rsa.c b/wd_rsa.c -index 2831111..b6cc0d1 100644 ---- a/wd_rsa.c -+++ b/wd_rsa.c -@@ -397,9 +397,11 @@ int wd_do_rsa_async(handle_t sess, struct wd_rsa_req *req) - if (ret) - goto fail_with_msg; - -- wd_add_task_to_async_queue(&wd_rsa_env_config, idx); -+ ret = wd_add_task_to_async_queue(&wd_rsa_env_config, idx); -+ if (ret) -+ goto fail_with_msg; - -- return ret; -+ return 0; - - fail_with_msg: - wd_put_msg_to_pool(&wd_rsa_setting.pool, idx, mid); -diff --git a/wd_util.c b/wd_util.c -index 49e1d66..e04747b 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -1108,17 +1108,20 @@ int wd_add_task_to_async_queue(struct wd_env_config *config, __u32 idx) - { - struct async_task_queue *task_queue; - struct async_task *head, *task; -- int prod; -+ int prod, ret; - - if (!config->enable_internal_poll) - return 0; - - task_queue = find_async_queue(config, idx); - if (!task_queue) -- return 0; -+ return -WD_EINVAL; - -- if (sem_wait(&task_queue->empty_sem)) -- return 0; -+ ret = sem_wait(&task_queue->empty_sem); -+ if (ret) { -+ WD_ERR("failed to wait empty_sem!\n"); -+ return ret; -+ } - - pthread_mutex_lock(&task_queue->lock); - -@@ -1135,10 +1138,13 @@ int wd_add_task_to_async_queue(struct wd_env_config *config, __u32 idx) - - pthread_mutex_unlock(&task_queue->lock); - -- if (sem_post(&task_queue->full_sem)) -- return 0; -+ ret = sem_post(&task_queue->full_sem); -+ if (ret) { -+ WD_ERR("failed to post full_sem!\n"); -+ return ret; -+ } - -- return 1; -+ return 0; - } - - static void *async_poll_process_func(void *args) --- -2.31.1 - diff --git a/0024-uadk-sched-fix-memory-leak.patch b/0024-uadk-sched-fix-memory-leak.patch deleted file mode 100644 index 4e714a1..0000000 --- a/0024-uadk-sched-fix-memory-leak.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 3ccff1938ec43efa1a4bb3f367d1985e35b91c0e Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 30 Dec 2021 20:34:52 +0800 -Subject: [PATCH 26/28] uadk: sched: fix memory leak - -sched_ctx and sched must be associated to -release the memory of sched_ctx - -Signed-off-by: Wenkai Lin ---- - wd_sched.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/wd_sched.c b/wd_sched.c -index f97c15f..a85fd95 100644 ---- a/wd_sched.c -+++ b/wd_sched.c -@@ -463,6 +463,7 @@ struct wd_sched *wd_sched_rr_alloc(__u8 sched_type, __u8 type_num, - goto err_out; - } - -+ sched->h_sched_ctx = (handle_t)sched_ctx; - sched_info = sched_ctx->sched_info; - - for (i = 0; i < numa_num; i++) { -@@ -482,7 +483,6 @@ struct wd_sched *wd_sched_rr_alloc(__u8 sched_type, __u8 type_num, - sched->sched_init = sched_table[sched_type].sched_init; - sched->pick_next_ctx = sched_table[sched_type].pick_next_ctx; - sched->poll_policy = sched_table[sched_type].poll_policy; -- sched->h_sched_ctx = (handle_t)sched_ctx; - - return sched; - --- -2.31.1 - diff --git a/0025-hisi-sec-bugfix-for-out_bytes-checking.patch b/0025-hisi-sec-bugfix-for-out_bytes-checking.patch deleted file mode 100644 index 2543279..0000000 --- a/0025-hisi-sec-bugfix-for-out_bytes-checking.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 5927f19669247d738dfd4a687b5f134a2d289784 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Wed, 29 Dec 2021 17:14:11 +0800 -Subject: [PATCH 27/28] hisi-sec: bugfix for out_bytes checking - -1. Add out_bytes checking for digest alg. and modify some log -information. -2. Optimize the in_bytes length checking. - -Signed-off-by: Kai Ye ---- - drv/hisi_sec.c | 11 ++++++++--- - 1 file changed, 8 insertions(+), 3 deletions(-) - -diff --git a/drv/hisi_sec.c b/drv/hisi_sec.c -index 603bdda..d31a1b9 100644 ---- a/drv/hisi_sec.c -+++ b/drv/hisi_sec.c -@@ -1279,9 +1279,9 @@ static void parse_digest_bd2(struct hisi_sec_sqe *sqe, struct wd_digest_msg *rec - - static int digest_long_bd_check(struct wd_digest_msg *msg) - { -- if (msg->alg >= WD_DIGEST_SHA512 && msg->in_bytes % SHA512_ALIGN_SZ) -+ if (msg->alg >= WD_DIGEST_SHA512 && msg->in_bytes & (SHA512_ALIGN_SZ - 1)) - return -WD_EINVAL; -- else if (msg->in_bytes % SHA1_ALIGN_SZ) -+ else if (msg->in_bytes & (SHA1_ALIGN_SZ - 1)) - return -WD_EINVAL; - - return 0; -@@ -1298,7 +1298,12 @@ static int digest_len_check(struct wd_digest_msg *msg, enum sec_bd_type type) - } - - if (unlikely(msg->in_bytes > MAX_INPUT_DATA_LEN)) { -- WD_ERR("input data length is too long, size:%u!\n", msg->in_bytes); -+ WD_ERR("digest input length is too long, size:%u!\n", msg->in_bytes); -+ return -WD_EINVAL; -+ } -+ -+ if (unlikely(msg->out_bytes & WORD_ALIGNMENT_MASK)) { -+ WD_ERR("digest out length is error, size:%u!\n", msg->out_bytes); - return -WD_EINVAL; - } - --- -2.31.1 - diff --git a/0026-uadk-tools-modify-NO-SVA-test-scenario.patch b/0026-uadk-tools-modify-NO-SVA-test-scenario.patch deleted file mode 100644 index 43237b7..0000000 --- a/0026-uadk-tools-modify-NO-SVA-test-scenario.patch +++ /dev/null @@ -1,421 +0,0 @@ -From 0ec02e23cfc86ea664905a11b28635cab12ee29a Mon Sep 17 00:00:00 2001 -From: Liulongfang -Date: Wed, 5 Jan 2022 14:46:54 +0800 -Subject: [PATCH 29/53] uadk/tools: modify NO-SVA test scenario - -In the No-SVA scenario, the user's business data needs to be copied -from the user memory to the block memory allocated by the user mode -through the copy method. -After the business execution is completed, it needs to be copied back. -The test tool should truly reflect the copy operation process. - -Signed-off-by: Liulongfang ---- - uadk_tool/Makefile.am | 2 +- - uadk_tool/sec_wd_benchmark.c | 122 +++++++++++++++++++++++++++++------ - uadk_tool/uadk_benchmark.c | 2 +- - 3 files changed, 103 insertions(+), 23 deletions(-) - -diff --git a/uadk_tool/Makefile.am b/uadk_tool/Makefile.am -index 36536a2..f79a6e3 100644 ---- a/uadk_tool/Makefile.am -+++ b/uadk_tool/Makefile.am -@@ -16,7 +16,7 @@ uadk_tool_LDADD=$(libwd_la_OBJECTS) \ - ../.libs/libhisi_sec.a \ - ../.libs/libhisi_hpre.a \ - ../.libs/libhisi_zip.a \ -- include/libcrypto.a -ldl -lnuma -+ $(top_srcdir)/uadk_tool/include/libcrypto.a -ldl -lnuma - else - uadk_tool_LDADD=-L../.libs -l:libwd.so.2 -l:libwd_crypto.so.2 \ - -L$(top_srcdir)/uadk_tool/include -l:libcrypto.so.1.1 -lnuma -diff --git a/uadk_tool/sec_wd_benchmark.c b/uadk_tool/sec_wd_benchmark.c -index c650e9a..dffd3a7 100644 ---- a/uadk_tool/sec_wd_benchmark.c -+++ b/uadk_tool/sec_wd_benchmark.c -@@ -36,6 +36,7 @@ struct thread_queue_res { - - struct wcrypto_async_tag { - void *ctx; -+ char *out_buf; - int thread_id; - int cnt; - }; -@@ -54,17 +55,34 @@ static unsigned int g_pktlen; - - static void *cipher_async_cb(void *message, void *cipher_tag) - { -+ struct wcrypto_async_tag *async_tag = (struct wcrypto_async_tag *)cipher_tag; -+ struct wcrypto_cipher_msg *req = (struct wcrypto_cipher_msg *)message; -+ -+ // no-sva data copy from uadk to user -+ memcpy(async_tag->out_buf, req->out, g_pktlen); -+ - return NULL; - } - --static void *aead_async_cb(void *message, void *cipher_tag) -+static void *aead_async_cb(void *message, void *aead_tag) - { -+ struct wcrypto_async_tag *async_tag = (struct wcrypto_async_tag *)aead_tag; -+ struct wcrypto_aead_msg *req = (struct wcrypto_aead_msg *)message; -+ -+ // no-sva data copy from uadk to user -+ memcpy(async_tag->out_buf, req->out, g_pktlen); -+ - return NULL; - } - - static void *digest_async_cb(void *message, void *digest_tag) - { -- // struct WCRYPTO_req *req = (struct WCRYPTO_req *)data; -+ struct wcrypto_async_tag *async_tag = (struct wcrypto_async_tag *)digest_tag; -+ struct wcrypto_digest_msg *req = (struct wcrypto_digest_msg *)message; -+ -+ // no-sva data copy from uadk to user -+ memcpy(async_tag->out_buf, req->out, 16); -+ - return NULL; - } - -@@ -563,6 +581,8 @@ static void *sec_wd_async_run(void *arg) - struct wcrypto_async_tag *tag = NULL; - char priv_key[MAX_IVK_LENTH]; - struct thread_bd_res *bd_res; -+ char *src_data_buf = NULL; -+ char *out_data_buf = NULL; - struct wd_queue *queue; - void *ctx = NULL; - void **res_in; -@@ -584,13 +604,27 @@ static void *sec_wd_async_run(void *arg) - res_out = bd_res->out; - res_iv = bd_res->iv; - -+ /* create user data buffer */ -+ src_data_buf = malloc(g_pktlen * sizeof(char)); -+ if (!src_data_buf) -+ return NULL; -+ -+ get_rand_data(src_data_buf, g_pktlen); -+ out_data_buf = malloc(g_pktlen * sizeof(char)); -+ if (!out_data_buf) { -+ free(src_data_buf); -+ return NULL; -+ } -+ - memset(priv_key, DEF_IVK_DATA, MAX_IVK_LENTH); - tag = malloc(sizeof(struct wcrypto_async_tag)); // set the user tag - if (!tag) { - SEC_TST_PRT("wcrypto async alloc tag fail!\n"); -+ free(src_data_buf); -+ free(out_data_buf); - return NULL; - } -- tag->thread_id = pdata->td_id; -+ tag->out_buf = out_data_buf; - - switch(pdata->subtype) { - case CIPHER_TYPE: -@@ -607,7 +641,7 @@ static void *sec_wd_async_run(void *arg) - ctx = wcrypto_create_cipher_ctx(queue, &cipher_setup); - if (!ctx) { - SEC_TST_PRT("wd create cipher ctx fail!\n"); -- return NULL; -+ goto async_err; - } - tag->ctx = ctx; - -@@ -615,7 +649,7 @@ static void *sec_wd_async_run(void *arg) - if (ret) { - SEC_TST_PRT("wd cipher set key fail!\n"); - wcrypto_del_cipher_ctx(ctx); -- return NULL; -+ goto async_err; - } - - if (queue->capa.priv.direction == 0) -@@ -637,6 +671,9 @@ static void *sec_wd_async_run(void *arg) - if (get_run_state() == 0) - break; - -+ // no-sva data copy to uadk -+ memcpy(copdata.in, src_data_buf, g_pktlen); -+ - ret = wcrypto_do_cipher(ctx, &copdata, (void *)tag); - if (ret == -WD_EBUSY) { - usleep(SEND_USLEEP * try_cnt); -@@ -672,7 +709,7 @@ static void *sec_wd_async_run(void *arg) - ctx = wcrypto_create_aead_ctx(queue, &aead_setup); - if (!ctx) { - SEC_TST_PRT("wd create aead ctx fail!\n"); -- return NULL; -+ goto async_err; - } - tag->ctx = ctx; - -@@ -680,7 +717,7 @@ static void *sec_wd_async_run(void *arg) - if (ret) { - SEC_TST_PRT("wd aead set key fail!\n"); - wcrypto_del_aead_ctx(ctx); -- return NULL; -+ goto async_err; - } - - authsize = 16; //set defaut size -@@ -688,7 +725,7 @@ static void *sec_wd_async_run(void *arg) - if (ret) { - SEC_TST_PRT("set authsize fail!\n"); - wcrypto_del_aead_ctx(ctx); -- return NULL; -+ goto async_err; - } - - if (queue->capa.priv.direction == 0) { -@@ -715,6 +752,9 @@ static void *sec_wd_async_run(void *arg) - if (get_run_state() == 0) - break; - -+ // no-sva data copy to uadk -+ memcpy(aopdata.in, src_data_buf, g_pktlen); -+ - ret = wcrypto_do_aead(ctx, &aopdata, (void *)tag); - if (ret == -WD_EBUSY) { - usleep(SEND_USLEEP * try_cnt); -@@ -750,7 +790,7 @@ static void *sec_wd_async_run(void *arg) - ctx = wcrypto_create_digest_ctx(queue, &digest_setup); - if (!ctx) { - SEC_TST_PRT("wd create digest ctx fail!\n"); -- return NULL; -+ goto async_err; - } - tag->ctx = ctx; - -@@ -760,7 +800,7 @@ static void *sec_wd_async_run(void *arg) - if (ret) { - SEC_TST_PRT("wd digest set key fail!\n"); - wcrypto_del_digest_ctx(ctx); -- return NULL; -+ goto async_err; - } - } - -@@ -777,6 +817,9 @@ static void *sec_wd_async_run(void *arg) - if (get_run_state() == 0) - break; - -+ // no-sva data copy to uadk -+ memcpy(dopdata.in, src_data_buf, g_pktlen); -+ - ret = wcrypto_do_digest(ctx, &dopdata, (void *)tag); - if (ret == -WD_EBUSY) { - usleep(SEND_USLEEP * try_cnt); -@@ -802,7 +845,7 @@ static void *sec_wd_async_run(void *arg) - add_send_complete(); - - while (1) { -- if (get_recv_time() > 0) // wait Async mode finish recv -+ if (get_recv_time() == g_thread_num) // wait Async mode finish recv - break; - usleep(SEND_USLEEP); - } -@@ -819,6 +862,10 @@ static void *sec_wd_async_run(void *arg) - break; - } - -+async_err: -+ free(tag); -+ free(src_data_buf); -+ free(out_data_buf); - return NULL; - } - -@@ -834,6 +881,8 @@ static void *sec_wd_sync_run(void *arg) - char priv_key[MAX_IVK_LENTH]; - struct thread_bd_res *bd_res; - struct wd_queue *queue; -+ char *src_data_buf = NULL; -+ char *out_data_buf = NULL; - void *ctx = NULL; - void *tag = NULL; - void **res_in; -@@ -855,6 +904,18 @@ static void *sec_wd_sync_run(void *arg) - res_out = bd_res->out; - res_iv = bd_res->iv; - -+ /* create user data buffer */ -+ src_data_buf = malloc(g_pktlen * sizeof(char)); -+ if (!src_data_buf) -+ return NULL; -+ -+ get_rand_data(src_data_buf, g_pktlen); -+ out_data_buf = malloc(g_pktlen * sizeof(char)); -+ if (!out_data_buf) { -+ free(src_data_buf); -+ return NULL; -+ } -+ - memset(priv_key, DEF_IVK_DATA, MAX_IVK_LENTH); - - switch(pdata->subtype) { -@@ -871,14 +932,14 @@ static void *sec_wd_sync_run(void *arg) - ctx = wcrypto_create_cipher_ctx(queue, &cipher_setup); - if (!ctx) { - SEC_TST_PRT("wd create cipher ctx fail!\n"); -- return NULL; -+ goto sync_err; - } - - ret = wcrypto_set_cipher_key(ctx, (__u8*)priv_key, (__u16)pdata->keysize); - if (ret) { - SEC_TST_PRT("wd cipher set key fail!\n"); - wcrypto_del_cipher_ctx(ctx); -- return NULL; -+ goto sync_err; - } - - if (queue->capa.priv.direction == 0) -@@ -899,6 +960,9 @@ static void *sec_wd_sync_run(void *arg) - if (get_run_state() == 0) - break; - -+ // no-sva data copy to uadk -+ memcpy(copdata.in, src_data_buf, g_pktlen); -+ - ret = wcrypto_do_cipher(ctx, &copdata, tag); - if (ret == -WD_EBUSY) { - usleep(SEND_USLEEP * try_cnt); -@@ -916,6 +980,9 @@ static void *sec_wd_sync_run(void *arg) - copdata.in = res_in[i]; - copdata.out = res_out[i]; - copdata.iv = res_iv[i]; -+ -+ // no-sva data copy from uadk to user -+ memcpy(out_data_buf, copdata.out, g_pktlen); - } - wcrypto_del_cipher_ctx(ctx); - -@@ -933,14 +1000,14 @@ static void *sec_wd_sync_run(void *arg) - ctx = wcrypto_create_aead_ctx(queue, &aead_setup); - if (!ctx) { - SEC_TST_PRT("wd create aead ctx fail!\n"); -- return NULL; -+ goto sync_err; - } - - ret = wcrypto_set_aead_ckey(ctx, (__u8*)priv_key, (__u16)pdata->keysize); - if (ret) { - SEC_TST_PRT("wd aead set key fail!\n"); - wcrypto_del_aead_ctx(ctx); -- return NULL; -+ goto sync_err; - } - - authsize = 16; //set defaut size -@@ -948,7 +1015,7 @@ static void *sec_wd_sync_run(void *arg) - if (ret) { - SEC_TST_PRT("set authsize fail!\n"); - wcrypto_del_aead_ctx(ctx); -- return NULL; -+ goto sync_err; - } - - if (queue->capa.priv.direction == 0) { -@@ -974,6 +1041,9 @@ static void *sec_wd_sync_run(void *arg) - if (get_run_state() == 0) - break; - -+ // no-sva data copy to uadk -+ memcpy(aopdata.in, src_data_buf, g_pktlen); -+ - ret = wcrypto_do_aead(ctx, &aopdata, tag); - if (ret == -WD_EBUSY) { - usleep(SEND_USLEEP * try_cnt); -@@ -991,6 +1061,9 @@ static void *sec_wd_sync_run(void *arg) - aopdata.in = res_in[i]; - aopdata.out = res_out[i]; - aopdata.iv = res_iv[i]; -+ -+ // no-sva data copy from uadk to user -+ memcpy(out_data_buf, aopdata.out, g_pktlen); - } - wcrypto_del_aead_ctx(ctx); - -@@ -1008,7 +1081,7 @@ static void *sec_wd_sync_run(void *arg) - ctx = wcrypto_create_digest_ctx(queue, &digest_setup); - if (!ctx) { - SEC_TST_PRT("wd create digest ctx fail!\n"); -- return NULL; -+ goto sync_err; - } - - if (digest_setup.mode == WCRYPTO_DIGEST_HMAC) { -@@ -1017,7 +1090,7 @@ static void *sec_wd_sync_run(void *arg) - if (ret) { - SEC_TST_PRT("wd digest set key fail!\n"); - wcrypto_del_digest_ctx(ctx); -- return NULL; -+ goto sync_err; - } - } - -@@ -1033,6 +1106,9 @@ static void *sec_wd_sync_run(void *arg) - if (get_run_state() == 0) - break; - -+ // no-sva data copy to uadk -+ memcpy(dopdata.in, src_data_buf, g_pktlen); -+ - ret = wcrypto_do_digest(ctx, &dopdata, (void *)tag); - if (ret == -WD_EBUSY) { - usleep(SEND_USLEEP * try_cnt); -@@ -1048,7 +1124,10 @@ static void *sec_wd_sync_run(void *arg) - try_cnt = 0; - i = count % MAX_BLOCK_NM; - dopdata.in = res_in[i]; -- dopdata.out = res_out[i]; -+ dopdata.out = res_out[i]; -+ -+ // no-sva data copy from uadk to user -+ memcpy(out_data_buf, dopdata.out, 16); - } - wcrypto_del_digest_ctx(ctx); - break; -@@ -1056,6 +1135,9 @@ static void *sec_wd_sync_run(void *arg) - - add_recv_data(count); - -+sync_err: -+ free(src_data_buf); -+ free(out_data_buf); - return NULL; - } - -@@ -1097,7 +1179,6 @@ int sec_wd_sync_threads(struct acc_option *options) - - sync_error: - return ret; -- - } - - int sec_wd_async_threads(struct acc_option *options) -@@ -1185,4 +1266,3 @@ int sec_wd_benchmark(struct acc_option *options) - - return 0; - } -- -diff --git a/uadk_tool/uadk_benchmark.c b/uadk_tool/uadk_benchmark.c -index 5773b2c..8067ed7 100644 ---- a/uadk_tool/uadk_benchmark.c -+++ b/uadk_tool/uadk_benchmark.c -@@ -551,7 +551,7 @@ static void print_help(void) - ACC_TST_PRT(" [--seconds]:\n"); - ACC_TST_PRT(" set the test times\n"); - ACC_TST_PRT(" [--multi]:\n"); -- ACC_TST_PRT(" set the number of threads\n"); -+ ACC_TST_PRT(" set the number of process\n"); - ACC_TST_PRT(" [--thread]:\n"); - ACC_TST_PRT(" set the number of threads\n"); - ACC_TST_PRT(" [--ctxnum]:\n"); --- -2.25.1 - diff --git a/0027-wd-fix-wd_parse_async_poll_num.patch b/0027-wd-fix-wd_parse_async_poll_num.patch deleted file mode 100644 index 41c924a..0000000 --- a/0027-wd-fix-wd_parse_async_poll_num.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 4478ede7a98cc9f84b30bb5766007b2acbec1a2f Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Tue, 4 Jan 2022 12:20:32 +0800 -Subject: [PATCH 30/53] wd: fix wd_parse_async_poll_num - -skip parse poll number if inner poll is not enabled. - -Signed-off-by: Wenkai Lin ---- - wd_util.c | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/wd_util.c b/wd_util.c -index e04747b..58463e9 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -759,6 +759,11 @@ int wd_parse_async_poll_num(struct wd_env_config *config, const char *s) - char *left, *section, *start; - int node, poll_num, ret; - -+ if (!config->enable_internal_poll) { -+ WD_ERR("internal poll not enabled, skip parse poll number!\n"); -+ return 0; -+ } -+ - start = strdup(s); - if (!start) - return -ENOMEM; --- -2.25.1 - diff --git a/0028-uadk-optimize-wd_init_async_polling_thread_per_numa.patch b/0028-uadk-optimize-wd_init_async_polling_thread_per_numa.patch deleted file mode 100644 index 5afbf56..0000000 --- a/0028-uadk-optimize-wd_init_async_polling_thread_per_numa.patch +++ /dev/null @@ -1,81 +0,0 @@ -From 8094e7a2344cf558eb056e7afc153299a3642f39 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Tue, 4 Jan 2022 12:20:28 +0800 -Subject: [PATCH 31/53] uadk: optimize wd_init_async_polling_thread_per_numa - -use fmin to get poll thread num. - -Signed-off-by: Wenkai Lin ---- - wd_util.c | 23 +++++++++-------------- - 1 file changed, 9 insertions(+), 14 deletions(-) - -diff --git a/wd_util.c b/wd_util.c -index 58463e9..fd132aa 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -10,6 +10,7 @@ - #include - #include - #include -+#include - #include "wd_alg_common.h" - #include "wd_util.h" - #include "wd_sched.h" -@@ -1295,7 +1296,8 @@ static int wd_init_async_polling_thread_per_numa(struct wd_env_config *config, - struct wd_env_config_per_numa *config_numa) - { - struct async_task_queue *task_queue, *queue_head; -- int i, j, poll_thread_num, ret; -+ int i, j, ret; -+ double num; - - if (!config_numa->async_ctx_num) - return 0; -@@ -1307,13 +1309,7 @@ static int wd_init_async_polling_thread_per_numa(struct wd_env_config *config, - config_numa->async_poll_num = WD_ASYNC_DEF_POLL_NUM; - } - -- poll_thread_num = config_numa->async_poll_num; -- if (poll_thread_num > config_numa->async_ctx_num) { -- poll_thread_num = config_numa->async_ctx_num; -- WD_ERR("downgrade poll thread num from %lu to %lu.\n", -- config_numa->async_poll_num, -- config_numa->async_ctx_num); -- } -+ num = fmin(config_numa->async_poll_num, config_numa->async_ctx_num); - - /* make max task queues as the number of async ctxs */ - queue_head = calloc(config_numa->async_ctx_num, sizeof(*queue_head)); -@@ -1321,7 +1317,7 @@ static int wd_init_async_polling_thread_per_numa(struct wd_env_config *config, - return -WD_ENOMEM; - - task_queue = queue_head; -- for (i = 0; i < poll_thread_num; task_queue++, i++) { -+ for (i = 0; i < num; task_queue++, i++) { - ret = wd_init_one_task_queue(task_queue, config->alg_poll_ctx); - if (ret) { - for (j = 0; j < i; task_queue++, j++) -@@ -1340,15 +1336,14 @@ static void wd_uninit_async_polling_thread_per_numa(struct wd_env_config *cfg, - struct wd_env_config_per_numa *config_numa) - { - struct async_task_queue *task_queue, *head; -- int i, n; -+ double num; -+ int i; - - head = config_numa->async_task_queue_array; - task_queue = head; -- n = config_numa->async_poll_num; -- if (config_numa->async_poll_num > config_numa->async_ctx_num) -- n = config_numa->async_ctx_num; -+ num = fmin(config_numa->async_poll_num, config_numa->async_ctx_num); - -- for (i = 0; i < n; task_queue++, i++) -+ for (i = 0; i < num; task_queue++, i++) - wd_uninit_one_task_queue(task_queue); - free(head); - config_numa->async_task_queue_array = NULL; --- -2.25.1 - diff --git a/0029-uadk-env-fix-wd_add_task_to_async_queue.patch b/0029-uadk-env-fix-wd_add_task_to_async_queue.patch deleted file mode 100644 index 494e97a..0000000 --- a/0029-uadk-env-fix-wd_add_task_to_async_queue.patch +++ /dev/null @@ -1,113 +0,0 @@ -From a3b74902cadf6dd671a093c6747a5bd624d09cc4 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Tue, 4 Jan 2022 12:20:29 +0800 -Subject: [PATCH 32/53] uadk: env: fix wd_add_task_to_async_queue - -clear global information if an add task error occurred. - -Signed-off-by: Wenkai Lin ---- - wd_util.c | 38 ++++++++++++++++++++++++-------------- - 1 file changed, 24 insertions(+), 14 deletions(-) - -diff --git a/wd_util.c b/wd_util.c -index fd132aa..676f475 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -45,7 +45,9 @@ struct async_task { - struct async_task_queue { - struct async_task *head; - int depth; -+ /* the producer offset of task queue */ - int prod; -+ /* the consumer offset of task queue */ - int cons; - int cur_task; - int left_task; -@@ -1113,8 +1115,8 @@ static struct async_task_queue *find_async_queue(struct wd_env_config *config, - int wd_add_task_to_async_queue(struct wd_env_config *config, __u32 idx) - { - struct async_task_queue *task_queue; -- struct async_task *head, *task; -- int prod, ret; -+ struct async_task *task; -+ int curr_prod, ret; - - if (!config->enable_internal_poll) - return 0; -@@ -1131,14 +1133,13 @@ int wd_add_task_to_async_queue(struct wd_env_config *config, __u32 idx) - - pthread_mutex_lock(&task_queue->lock); - -- prod = task_queue->prod; -- head = task_queue->head; -- task = head + prod; -- /* fix me */ -+ /* get an available async task and fill ctx idx */ -+ curr_prod = task_queue->prod; -+ task = task_queue->head + curr_prod; - task->idx = idx; - -- prod = (prod + 1) % task_queue->depth; -- task_queue->prod = prod; -+ /* update global information of task queue */ -+ task_queue->prod = (curr_prod + 1) % task_queue->depth; - task_queue->cur_task++; - task_queue->left_task--; - -@@ -1147,10 +1148,19 @@ int wd_add_task_to_async_queue(struct wd_env_config *config, __u32 idx) - ret = sem_post(&task_queue->full_sem); - if (ret) { - WD_ERR("failed to post full_sem!\n"); -- return ret; -+ goto err_out; - } - - return 0; -+ -+err_out: -+ pthread_mutex_lock(&task_queue->lock); -+ task_queue->left_task++; -+ task_queue->cur_task--; -+ task_queue->prod = curr_prod; -+ pthread_mutex_unlock(&task_queue->lock); -+ -+ return ret; - } - - static void *async_poll_process_func(void *args) -@@ -1216,18 +1226,18 @@ static int wd_init_one_task_queue(struct async_task_queue *task_queue, - void *alg_poll_ctx) - - { -- struct async_task *task_head; -+ struct async_task *head; - pthread_t thread_id; - pthread_attr_t attr; - int depth, ret; - - task_queue->depth = depth = WD_ASYNC_DEF_QUEUE_DEPTH; - -- task_head = calloc(task_queue->depth, sizeof(struct async_task)); -- if (!task_head) -+ head = calloc(task_queue->depth, sizeof(*head)); -+ if (!head) - return -WD_ENOMEM; - -- task_queue->head = task_head; -+ task_queue->head = head; - task_queue->left_task = depth; - task_queue->alg_poll_ctx = alg_poll_ctx; - -@@ -1268,7 +1278,7 @@ err_uninit_full_sem: - err_uninit_empty_sem: - sem_destroy(&task_queue->empty_sem); - err_free_head: -- free(task_head); -+ free(head); - ret = -errno; - return ret; - } --- -2.25.1 - diff --git a/0030-uadk-optimize-find_async_queue.patch b/0030-uadk-optimize-find_async_queue.patch deleted file mode 100644 index 4e3ffe2..0000000 --- a/0030-uadk-optimize-find_async_queue.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 72f58fe17adc3396a5c6826c5acf9a235b02b635 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Tue, 4 Jan 2022 12:20:30 +0800 -Subject: [PATCH 33/53] uadk: optimize find_async_queue - -No need to determine offset size before modulo. - -Signed-off-by: Wenkai Lin ---- - wd_util.c | 8 +++----- - 1 file changed, 3 insertions(+), 5 deletions(-) - -diff --git a/wd_util.c b/wd_util.c -index 676f475..9e96114 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -1069,7 +1069,7 @@ static struct async_task_queue *find_async_queue(struct wd_env_config *config, - struct wd_env_config_per_numa *config_numa; - struct wd_ctx_range **ctx_table; - struct async_task_queue *head; -- unsigned long offset; -+ unsigned long offset = 0; - int num = 0; - int i; - -@@ -1093,10 +1093,8 @@ static struct async_task_queue *find_async_queue(struct wd_env_config *config, - for (i = 0; i < config_numa->op_type_num; i++) { - if (idx <= ctx_table[CTX_MODE_ASYNC][i].end && - idx >= ctx_table[CTX_MODE_ASYNC][i].begin) { -- offset = idx - ctx_table[CTX_MODE_ASYNC][i].begin; -- if (offset >= config_numa->async_poll_num) -- offset = offset % config_numa->async_poll_num; -- -+ offset = (idx - ctx_table[CTX_MODE_ASYNC][i].begin) % -+ config_numa->async_poll_num; - break; - } - } --- -2.25.1 - diff --git a/0031-uadk-fix-check_after_sink.patch b/0031-uadk-fix-check_after_sink.patch deleted file mode 100644 index f89b863..0000000 --- a/0031-uadk-fix-check_after_sink.patch +++ /dev/null @@ -1,41 +0,0 @@ -From e2b9b8fbf8ee1f8e9775b473de7ee464f32aed50 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Tue, 4 Jan 2022 12:20:27 +0800 -Subject: [PATCH 34/53] uadk: fix check_after_sink - -No need to check last ret, it cause check_after_sink. - -Signed-off-by: Wenkai Lin ---- - wd.c | 8 ++------ - 1 file changed, 2 insertions(+), 6 deletions(-) - -diff --git a/wd.c b/wd.c -index 25386d7..238ce8a 100644 ---- a/wd.c -+++ b/wd.c -@@ -171,11 +171,7 @@ static int get_dev_info(struct uacce_dev *dev) - if (ret < 0) - return ret; - -- ret = get_str_attr(dev, "algorithms", dev->algs, MAX_ATTR_STR_SIZE); -- if (ret < 0) -- return ret; -- -- return 0; -+ return get_str_attr(dev, "algorithms", dev->algs, MAX_ATTR_STR_SIZE); - } - - static struct uacce_dev *read_uacce_sysfs(const char *dev_name) -@@ -215,7 +211,7 @@ static struct uacce_dev *read_uacce_sysfs(const char *dev_name) - goto out_dir; - - ret = get_dev_info(dev); -- if (ret) { -+ if (ret < 0) { - WD_ERR("failed to get dev info: ret = %d!\n", ret); - goto out_dir; - } --- -2.25.1 - diff --git a/0032-uadk-fix-wd_request_ctx.patch b/0032-uadk-fix-wd_request_ctx.patch deleted file mode 100644 index 7394a12..0000000 --- a/0032-uadk-fix-wd_request_ctx.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 6ede569a63ce4f4ead3865b96c5dfff4e9b2fcaf Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Tue, 4 Jan 2022 16:48:01 +0800 -Subject: [PATCH 35/53] uadk: fix wd_request_ctx - -wd_get_accel_name and strncpy should use relative path. - -Signed-off-by: Wenkai Lin ---- - wd.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/wd.c b/wd.c -index 238ce8a..746fa02 100644 ---- a/wd.c -+++ b/wd.c -@@ -328,11 +328,11 @@ handle_t wd_request_ctx(struct uacce_dev *dev) - if (!ctx) - return 0; - -- ctx->dev_name = wd_get_accel_name(char_dev_path, 0); -+ ctx->dev_name = wd_get_accel_name(dev->char_dev_path, 0); - if (!ctx->dev_name) - goto free_ctx; - -- ctx->drv_name = wd_get_accel_name(char_dev_path, 1); -+ ctx->drv_name = wd_get_accel_name(dev->char_dev_path, 1); - if (!ctx->drv_name) - goto free_dev_name; - -@@ -342,7 +342,7 @@ handle_t wd_request_ctx(struct uacce_dev *dev) - - wd_ctx_init_qfrs_offs(ctx); - -- strncpy(ctx->dev_path, char_dev_path, MAX_DEV_NAME_LEN); -+ strncpy(ctx->dev_path, dev->char_dev_path, MAX_DEV_NAME_LEN); - ctx->dev_path[MAX_DEV_NAME_LEN - 1] = '\0'; - - ctx->fd = open(char_dev_path, O_RDWR | O_CLOEXEC); --- -2.25.1 - diff --git a/0033-uadk-fix-sched-params-begin-issue.patch b/0033-uadk-fix-sched-params-begin-issue.patch deleted file mode 100644 index d38a679..0000000 --- a/0033-uadk-fix-sched-params-begin-issue.patch +++ /dev/null @@ -1,77 +0,0 @@ -From cca176ed2ab3a34e5eb73cc70247c0f2dd02bdac Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Tue, 4 Jan 2022 21:26:09 +0800 -Subject: [PATCH 36/53] uadk: fix sched params begin issue - -begin field of sched params need to be smaller than end, -otherwise begin ctx is used all the time. So add a check -to prevent invalid user input. - -Signed-off-by: Wenkai Lin ---- - wd_sched.c | 17 +++++++++++------ - 1 file changed, 11 insertions(+), 6 deletions(-) - -diff --git a/wd_sched.c b/wd_sched.c -index a85fd95..aeaf11b 100644 ---- a/wd_sched.c -+++ b/wd_sched.c -@@ -93,7 +93,7 @@ static __u32 sched_get_next_pos_rr(struct sched_ctx_region *region, - - if (pos < region->end) - region->last++; -- else if (pos >= region->end) -+ else - region->last = region->begin; - - pthread_mutex_unlock(®ion->lock); -@@ -209,12 +209,12 @@ static int session_sched_poll_policy(handle_t sched_ctx, - - if (!sched_ctx || !count || !ctx) { - WD_ERR("ERROR: %s the para is NULL!\n", __FUNCTION__); -- return -EINVAL; -+ return -WD_EINVAL; - } - - if (ctx->numa_num > NUMA_NUM_NODES) { - WD_ERR("ERROR: %s ctx numa num is invalid!\n", __FUNCTION__); -- return -EINVAL; -+ return -WD_EINVAL; - } - - sched_info = ctx->sched_info; -@@ -359,7 +359,12 @@ int wd_sched_rr_instance(const struct wd_sched *sched, - if (!sched || !sched->h_sched_ctx || !param) { - WD_ERR("ERROR: %s para err: sched of h_sched_ctx is NULL!\n", - __FUNCTION__); -- return -EINVAL; -+ return -WD_EINVAL; -+ } -+ -+ if (param->begin > param->end) { -+ WD_ERR("ERROR: sched_params's begin is larger than end!\n"); -+ return -WD_EINVAL; - } - - numa_id = param->numa_id; -@@ -372,7 +377,7 @@ int wd_sched_rr_instance(const struct wd_sched *sched, - (type >= sched_ctx->type_num)) { - WD_ERR("ERROR: %s para err: numa_id=%d, mode=%u, type=%u!\n", - __FUNCTION__, numa_id, mode, type); -- return -EINVAL; -+ return -WD_EINVAL; - } - - sched_info = sched_ctx->sched_info; -@@ -380,7 +385,7 @@ int wd_sched_rr_instance(const struct wd_sched *sched, - if (!sched_info[numa_id].ctx_region[mode]) { - WD_ERR("ERROR: %s para err: ctx_region:numa_id=%d, mode=%u is NULL!\n", - __FUNCTION__, numa_id, mode); -- return -EINVAL; -+ return -WD_EINVAL; - } - - sched_info[numa_id].ctx_region[mode][type].begin = param->begin; --- -2.25.1 - diff --git a/0034-uadk-optimize-wd_request_ctx.patch b/0034-uadk-optimize-wd_request_ctx.patch deleted file mode 100644 index 31d19cd..0000000 --- a/0034-uadk-optimize-wd_request_ctx.patch +++ /dev/null @@ -1,88 +0,0 @@ -From d25bfc4577d47cbf5254b565876b4ca943580881 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 6 Jan 2022 21:25:48 +0800 -Subject: [PATCH 37/53] uadk: optimize wd_request_ctx - -open fd first is more reasonable since it often goes wrong. - -Signed-off-by: Wenkai Lin ---- - wd.c | 26 ++++++++++++-------------- - 1 file changed, 12 insertions(+), 14 deletions(-) - -diff --git a/wd.c b/wd.c -index 746fa02..787d74b 100644 ---- a/wd.c -+++ b/wd.c -@@ -300,11 +300,6 @@ static struct uacce_dev *clone_uacce_dev(struct uacce_dev *dev) - return new; - } - --static void free_uacce_dev(struct uacce_dev *dev) --{ -- free(dev); --} -- - static void wd_ctx_init_qfrs_offs(struct wd_ctx_h *ctx) - { - memcpy(&ctx->qfrs_offs, &ctx->dev->qfrs_offs, -@@ -316,6 +311,7 @@ handle_t wd_request_ctx(struct uacce_dev *dev) - struct wd_ctx_h *ctx; - char char_dev_path[PATH_MAX]; - char *ptrRet = NULL; -+ int fd; - - if (!dev || !strlen(dev->dev_root)) - return 0; -@@ -324,9 +320,15 @@ handle_t wd_request_ctx(struct uacce_dev *dev) - if (ptrRet == NULL) - return 0; - -+ fd = open(char_dev_path, O_RDWR | O_CLOEXEC); -+ if (fd < 0) { -+ WD_ERR("failed to open %s!(err = %d)\n", char_dev_path, -errno); -+ return 0; -+ } -+ - ctx = calloc(1, sizeof(struct wd_ctx_h)); - if (!ctx) -- return 0; -+ goto close_fd; - - ctx->dev_name = wd_get_accel_name(dev->char_dev_path, 0); - if (!ctx->dev_name) -@@ -340,27 +342,23 @@ handle_t wd_request_ctx(struct uacce_dev *dev) - if (!ctx->dev) - goto free_drv_name; - -+ ctx->fd = fd; -+ - wd_ctx_init_qfrs_offs(ctx); - - strncpy(ctx->dev_path, dev->char_dev_path, MAX_DEV_NAME_LEN); - ctx->dev_path[MAX_DEV_NAME_LEN - 1] = '\0'; - -- ctx->fd = open(char_dev_path, O_RDWR | O_CLOEXEC); -- if (ctx->fd < 0) { -- WD_ERR("failed to open %s (%d).\n", char_dev_path, -errno); -- goto free_dev; -- } -- - return (handle_t)ctx; - --free_dev: -- free_uacce_dev(ctx->dev); - free_drv_name: - free(ctx->drv_name); - free_dev_name: - free(ctx->dev_name); - free_ctx: - free(ctx); -+close_fd: -+ close(fd); - return 0; - } - --- -2.25.1 - diff --git a/0035-uadk-env-bugfix-for-wd_init_resource.patch b/0035-uadk-env-bugfix-for-wd_init_resource.patch deleted file mode 100644 index 4903345..0000000 --- a/0035-uadk-env-bugfix-for-wd_init_resource.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 556bf83c694c85c124b90428cb7622cc7babd411 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Mon, 10 Jan 2022 18:52:02 +0800 -Subject: [PATCH 38/53] uadk: env: bugfix for wd_init_resource - -If sched is internal alloc, free it and set to NULL. -Otherwise do not free sched resource from user input. - -Signed-off-by: Wenkai Lin ---- - wd_util.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/wd_util.c b/wd_util.c -index 9e96114..2e0e062 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -1412,7 +1412,10 @@ static int wd_init_resource(struct wd_env_config *config, - err_uninit_alg: - ops->alg_uninit(); - err_uninit_sched: -- wd_uninit_sched_config(config->sched); -+ if (config->internal_sched) { -+ wd_uninit_sched_config(config->sched); -+ config->sched = NULL; -+ } - err_uninit_ctx: - wd_free_ctx(config->ctx_config); - return ret; --- -2.25.1 - diff --git a/0036-uadk-env-fix-wd-ctx-num-init.patch b/0036-uadk-env-fix-wd-ctx-num-init.patch deleted file mode 100644 index 1e93010..0000000 --- a/0036-uadk-env-fix-wd-ctx-num-init.patch +++ /dev/null @@ -1,256 +0,0 @@ -From 388f0f7959acc5130c43b7a7d4a43603724a20a5 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Mon, 10 Jan 2022 18:52:03 +0800 -Subject: [PATCH 39/53] uadk: env: fix wd ctx num init - -No need to set environment variables for ctx num init, -because environment variables need to parse after set, -add wd_parse_ctx_attr to set environment config directly. - -Signed-off-by: Wenkai Lin ---- - include/wd_util.h | 1 - - wd_util.c | 152 +++++++++++++--------------------------------- - 2 files changed, 43 insertions(+), 110 deletions(-) - -diff --git a/include/wd_util.h b/include/wd_util.h -index 81f4ba8..de2cd44 100644 ---- a/include/wd_util.h -+++ b/include/wd_util.h -@@ -72,7 +72,6 @@ struct wd_env_config { - const struct wd_config_variable *table; - __u32 table_size; - __u16 numa_num; -- __u8 disable_env; - __u8 op_type_num; - }; - -diff --git a/wd_util.c b/wd_util.c -index 2e0e062..ad108bf 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -474,8 +474,10 @@ static int wd_alloc_numa(struct wd_env_config *config, - - /* alloc and init config_per_numa and all uacce dev */ - ret = wd_set_config_numa(config, numa_dev_num, max_node); -- if (ret) -+ if (ret) { -+ WD_ERR("failed to set numa config, ret = %d!\n", ret); - goto free_list; -+ } - - /* set device and device num for config numa from uacce_dev list */ - wd_set_numa_dev(head, config); -@@ -801,11 +803,8 @@ static int wd_parse_env(struct wd_env_config *config) - - for (i = 0; i < config->table_size; i++) { - var = config->table + i; -- if (config->disable_env) -- var_s = var->def_val; -- else -- var_s = secure_getenv(var->name); - -+ var_s = secure_getenv(var->name); - if (!var_s || !strlen(var_s)) { - var_s = var->def_val; - WD_ERR("no %s environment variable! Use default: %s\n", -@@ -839,6 +838,40 @@ static void wd_free_env(struct wd_env_config *config) - } - } - -+static int wd_parse_ctx_attr(struct wd_env_config *env_config, -+ struct wd_ctx_attr *attr) -+{ -+ struct wd_env_config_per_numa *config_numa; -+ int ret; -+ -+ config_numa = wd_get_config_numa(env_config, attr->node); -+ if (!config_numa) { -+ WD_ERR("%s got wrong numa node!\n", __func__); -+ return -WD_EINVAL; -+ } -+ -+ config_numa->op_type_num = env_config->op_type_num; -+ ret = wd_alloc_ctx_table(config_numa); -+ if (ret) -+ return ret; -+ -+ config_numa->ctx_table[attr->mode][attr->type].size = attr->num; -+ wd_fill_ctx_table(env_config); -+ -+ /* Use default sched and disable internal poll */ -+ env_config->sched = NULL; -+ env_config->enable_internal_poll = 0; -+ config_numa->async_poll_num = 0; -+ -+ return 0; -+} -+ -+static int wd_init_env_config(struct wd_env_config *config, -+ struct wd_ctx_attr *attr) -+{ -+ return attr ? wd_parse_ctx_attr(config, attr) : wd_parse_env(config); -+} -+ - static __u8 get_ctx_mode(struct wd_env_config_per_numa *config, int idx) - { - struct wd_ctx_range **ctx_table = config->ctx_table; -@@ -869,6 +902,7 @@ static int get_op_type(struct wd_env_config_per_numa *config, - return i; - } - -+ WD_ERR("failed to get op type!\n"); - return -WD_EINVAL; - } - -@@ -1030,6 +1064,7 @@ static int wd_init_sched_config(struct wd_env_config *config) - config->internal_sched = false; - type_num = config->op_type_num; - if (!config->sched) { -+ WD_ERR("no sched is specified, alloc a default sched!\n"); - config->sched = wd_sched_rr_alloc(SCHED_POLICY_RR, type_num, - max_node, func); - if (!config->sched) -@@ -1430,100 +1465,6 @@ static void wd_uninit_resource(struct wd_env_config *config) - wd_free_ctx(config->ctx_config); - } - --static void *wd_alloc_table(const struct wd_config_variable *table, -- __u32 table_size) --{ -- struct wd_config_variable *alg_table; -- int i, j; -- -- alg_table = malloc(table_size * sizeof(struct wd_config_variable)); -- if (!alg_table) -- return NULL; -- -- memcpy(alg_table, table, -- table_size * sizeof(struct wd_config_variable)); -- for (i = 0; i < table_size - 1; i++) { -- alg_table[i].def_val = malloc(MAX_STR_LEN); -- if (!alg_table[i].def_val) { -- WD_ERR("%s malloc fail\n", __func__); -- goto free_mem; -- } -- } -- -- return alg_table; -- --free_mem: -- for (j = 0; j < i; j++) -- free(alg_table[j].def_val); -- -- free(alg_table); -- return NULL; --} -- --static int wd_alg_table_init(const struct wd_config_variable *table, -- __u32 table_size, -- struct wd_ctx_attr *attr, -- struct wd_env_config *env_config) --{ -- struct wd_config_variable *var_tbl; -- const char *type_tbl; -- int ret; -- -- if (!attr) { -- env_config->disable_env = 0; -- env_config->table = table; -- return 0; -- } -- -- env_config->disable_env = 1; -- -- var_tbl = wd_alloc_table(table, table_size); -- if (!var_tbl) -- return -WD_ENOMEM; -- -- env_config->table = var_tbl; -- -- /** -- * Below def_val's memory is allocated from wd_alloc_table, -- * the length of memory allocated to def_val is MAX_STR_LEN. -- * -- * We use mode and type as index of a string two-dimensional -- * array to init def_val. -- */ -- if (env_config->op_type_num == 1) -- type_tbl = ctx_type[attr->mode][attr->type]; -- else -- type_tbl = comp_ctx_type[attr->mode][attr->type]; -- -- ret = snprintf(var_tbl[0].def_val, MAX_STR_LEN, "%s%u%c%u", -- type_tbl, attr->num, '@', attr->node); -- if (ret < 0) -- return -errno; -- -- return 0; --} -- --static void wd_alg_table_uninit(struct wd_env_config *config) --{ -- struct wd_config_variable *table; -- int i; -- -- if (!config->disable_env) -- return; -- -- table = (struct wd_config_variable *)config->table; -- if (!table) -- return; -- -- for (i = 0; i < config->table_size - 1; i++) { -- free(table[i].def_val); -- table[i].def_val = NULL; -- } -- -- free(table); -- table = NULL; --} -- - int wd_alg_env_init(struct wd_env_config *env_config, - const struct wd_config_variable *table, - const struct wd_alg_ops *ops, -@@ -1534,18 +1475,14 @@ int wd_alg_env_init(struct wd_env_config *env_config, - - env_config->op_type_num = ops->op_type_num; - env_config->alg_poll_ctx = ops->alg_poll_ctx; -+ env_config->table = table; - env_config->table_size = table_size; - -- ret = wd_alg_table_init(table, table_size, -- ctx_attr, env_config); -- if (ret) -- return ret; -- - ret = wd_alloc_numa(env_config, ops); - if (ret) -- goto table_uninit; -+ return ret; - -- ret = wd_parse_env(env_config); -+ ret = wd_init_env_config(env_config, ctx_attr); - if (ret) - goto free_numa; - -@@ -1562,8 +1499,6 @@ free_env: - wd_free_env(env_config); - free_numa: - wd_free_numa(env_config); --table_uninit: -- wd_alg_table_uninit(env_config); - return ret; - } - -@@ -1576,7 +1511,6 @@ void wd_alg_env_uninit(struct wd_env_config *env_config) - wd_uninit_resource(env_config); - wd_free_env(env_config); - wd_free_numa(env_config); -- wd_alg_table_uninit(env_config); - } - - int wd_alg_get_env_param(struct wd_env_config *env_config, --- -2.25.1 - diff --git a/0037-uadk-modify-for-free-and-return.patch b/0037-uadk-modify-for-free-and-return.patch deleted file mode 100644 index 5ef0735..0000000 --- a/0037-uadk-modify-for-free-and-return.patch +++ /dev/null @@ -1,39 +0,0 @@ -From f4cd396150be285aa614f4272a51cd3dacf99096 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Mon, 10 Jan 2022 20:01:41 +0800 -Subject: [PATCH 40/53] uadk: modify for free and return - -After free local variable, no need to set NULL. -If return value is not associated with other -functions, no need to set value, return directly. - -Signed-off-by: JunchongPan ---- - wd_util.c | 4 +--- - 1 file changed, 1 insertion(+), 3 deletions(-) - -diff --git a/wd_util.c b/wd_util.c -index ad108bf..c2c109c 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -599,7 +599,6 @@ free_mem: - } - - free(ctx_table); -- ctx_table = NULL; - return ret; - } - -@@ -652,8 +651,7 @@ static int wd_parse_section(struct wd_env_config *config, char *section) - config_numa = wd_get_config_numa(config, node); - if (!config_numa) { - WD_ERR("%s got wrong numa node: %s!\n", __func__, section); -- ret = -WD_EINVAL; -- return ret; -+ return -WD_EINVAL; - } - - config_numa->op_type_num = config->op_type_num; --- -2.25.1 - diff --git a/0038-uadk-include-fix-uadk-compatibility.patch b/0038-uadk-include-fix-uadk-compatibility.patch deleted file mode 100644 index 20f046d..0000000 --- a/0038-uadk-include-fix-uadk-compatibility.patch +++ /dev/null @@ -1,516 +0,0 @@ -From b8c3d3c5f1b3db3b89ed975bb51c7546676f2bd1 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Mon, 10 Jan 2022 18:52:04 +0800 -Subject: [PATCH 41/53] uadk: include: fix uadk compatibility - -Fix that C++ program can't call the uadk interface. - -Signed-off-by: Wenkai Lin ---- - include/drv/wd_aead_drv.h | 9 +++++++++ - include/drv/wd_cipher_drv.h | 9 +++++++++ - include/drv/wd_comp_drv.h | 8 ++++++++ - include/drv/wd_dh_drv.h | 8 ++++++++ - include/drv/wd_digest_drv.h | 9 +++++++++ - include/drv/wd_ecc_drv.h | 8 ++++++++ - include/drv/wd_rsa_drv.h | 8 ++++++++ - include/hisi_qm_udrv.h | 8 ++++++++ - include/uacce.h | 9 +++++++++ - include/wd.h | 8 ++++++++ - include/wd_aead.h | 8 ++++++++ - include/wd_alg_common.h | 8 ++++++++ - include/wd_cipher.h | 8 ++++++++ - include/wd_common.h | 8 ++++++++ - include/wd_comp.h | 8 ++++++++ - include/wd_dh.h | 8 ++++++++ - include/wd_digest.h | 8 ++++++++ - include/wd_rsa.h | 8 ++++++++ - include/wd_sched.h | 8 ++++++++ - include/wd_util.h | 8 ++++++++ - 20 files changed, 164 insertions(+) - -diff --git a/include/drv/wd_aead_drv.h b/include/drv/wd_aead_drv.h -index d2016f0..78a5673 100644 ---- a/include/drv/wd_aead_drv.h -+++ b/include/drv/wd_aead_drv.h -@@ -7,6 +7,10 @@ - #include "include/wd_alg_common.h" - #include "include/wd_aead.h" - -+#ifdef __cplusplus -+extern "C" { -+#endif -+ - struct wd_aead_msg { - struct wd_aead_req req; - /* Request identifier */ -@@ -87,4 +91,9 @@ static void __attribute__((constructor)) set_aead_driver(void) \ - wd_aead_set_driver(&drv); \ - } - #endif -+ -+#ifdef __cplusplus -+} -+#endif -+ - #endif /* __WD_AEAD_DRV_H */ -diff --git a/include/drv/wd_cipher_drv.h b/include/drv/wd_cipher_drv.h -index d6798c0..e649869 100644 ---- a/include/drv/wd_cipher_drv.h -+++ b/include/drv/wd_cipher_drv.h -@@ -7,6 +7,10 @@ - #include "../wd_cipher.h" - #include "../wd_alg_common.h" - -+#ifdef __cplusplus -+extern "C" { -+#endif -+ - /* fixme wd_cipher_msg */ - struct wd_cipher_msg { - struct wd_cipher_req req; -@@ -72,4 +76,9 @@ static void __attribute__((constructor)) set_driver(void) \ - wd_cipher_set_driver(&drv); \ - } - #endif -+ -+#ifdef __cplusplus -+} -+#endif -+ - #endif /* __WD_CIPHER_DRV_H */ -diff --git a/include/drv/wd_comp_drv.h b/include/drv/wd_comp_drv.h -index b4dc722..8146a50 100644 ---- a/include/drv/wd_comp_drv.h -+++ b/include/drv/wd_comp_drv.h -@@ -7,6 +7,10 @@ - #include - #include "../wd_comp.h" - -+#ifdef __cplusplus -+extern "C" { -+#endif -+ - enum wd_comp_strm_pos { - WD_COMP_STREAM_NEW, - WD_COMP_STREAM_OLD, -@@ -79,4 +83,8 @@ static void __attribute__((constructor)) set_driver(void) \ - } - #endif - -+#ifdef __cplusplus -+} -+#endif -+ - #endif /* __WD_COMP_DRV_H */ -diff --git a/include/drv/wd_dh_drv.h b/include/drv/wd_dh_drv.h -index 08212b1..5d436d1 100644 ---- a/include/drv/wd_dh_drv.h -+++ b/include/drv/wd_dh_drv.h -@@ -6,6 +6,10 @@ - - #include "../wd_dh.h" - -+#ifdef __cplusplus -+extern "C" { -+#endif -+ - /* DH message format */ - struct wd_dh_msg { - struct wd_dh_req req; -@@ -45,4 +49,8 @@ static void __attribute__((constructor)) set_driver_dh(void) \ - } - #endif - -+#ifdef __cplusplus -+} -+#endif -+ - #endif /* __WD_DH_DRV_H */ -diff --git a/include/drv/wd_digest_drv.h b/include/drv/wd_digest_drv.h -index ac3b028..fdde772 100644 ---- a/include/drv/wd_digest_drv.h -+++ b/include/drv/wd_digest_drv.h -@@ -6,6 +6,10 @@ - #include "include/wd_digest.h" - #include "include/wd_alg_common.h" - -+#ifdef __cplusplus -+extern "C" { -+#endif -+ - /* fixme wd_digest_msg */ - struct wd_digest_msg { - struct wd_digest_req req; -@@ -75,4 +79,9 @@ static void __attribute__((constructor)) set_drivers(void) \ - wd_digest_set_driver(&drv); \ - } - #endif -+ -+#ifdef __cplusplus -+} -+#endif -+ - #endif /* __WD_DIGEST_DRV_H */ -diff --git a/include/drv/wd_ecc_drv.h b/include/drv/wd_ecc_drv.h -index 9f4575f..7e0d27e 100644 ---- a/include/drv/wd_ecc_drv.h -+++ b/include/drv/wd_ecc_drv.h -@@ -7,6 +7,10 @@ - #include "../wd_ecc.h" - #include "../wd_alg_common.h" - -+#ifdef __cplusplus -+extern "C" { -+#endif -+ - /* ECC */ - #define ECDH_IN_PARAM_NUM 2 - #define ECDH_OUT_PARAM_NUM 2 -@@ -198,4 +202,8 @@ static void __attribute__((constructor)) set_driver_ecc(void) \ - } - #endif - -+#ifdef __cplusplus -+} -+#endif -+ - #endif /* __WD_ECC_DRV_H */ -diff --git a/include/drv/wd_rsa_drv.h b/include/drv/wd_rsa_drv.h -index 3c4b144..948625f 100644 ---- a/include/drv/wd_rsa_drv.h -+++ b/include/drv/wd_rsa_drv.h -@@ -5,6 +5,10 @@ - - #include "../wd_rsa.h" - -+#ifdef __cplusplus -+extern "C" { -+#endif -+ - struct wd_rsa_kg_in { - __u8 *e; - __u8 *p; -@@ -70,4 +74,8 @@ static void __attribute__((constructor)) set_driver_rsa(void) \ - } - #endif - -+#ifdef __cplusplus -+} -+#endif -+ - #endif /* __WD_RSA_DRV_H */ -diff --git a/include/hisi_qm_udrv.h b/include/hisi_qm_udrv.h -index 11ee4ad..707d0e3 100644 ---- a/include/hisi_qm_udrv.h -+++ b/include/hisi_qm_udrv.h -@@ -12,6 +12,10 @@ - #include "wd.h" - #include "wd_alg_common.h" - -+#ifdef __cplusplus -+extern "C" { -+#endif -+ - #define WD_CAPA_PRIV_DATA_SIZE 64 - - #define QM_L32BITS_MASK 0xffffffff -@@ -180,4 +184,8 @@ __u32 hisi_qm_get_list_size(struct wd_datalist *start_node, - - void hisi_qm_enable_interrupt(handle_t ctx, __u8 enable); - -+#ifdef __cplusplus -+} -+#endif -+ - #endif -diff --git a/include/uacce.h b/include/uacce.h -index 7c69df8..07e36fe 100644 ---- a/include/uacce.h -+++ b/include/uacce.h -@@ -10,6 +10,10 @@ - #include - #include - -+#ifdef __cplusplus -+extern "C" { -+#endif -+ - #define UACCE_CMD_START _IO('W', 0) - #define UACCE_CMD_PUT_Q _IO('W', 1) - #define UACCE_CMD_GET_SS_DMA _IOR('W', 100, unsigned long) -@@ -33,4 +37,9 @@ enum uacce_qfrt { - UACCE_QFRT_DUS = 1, /* device user share */ - UACCE_QFRT_MAX, - }; -+ -+#ifdef __cplusplus -+} -+#endif -+ - #endif -diff --git a/include/wd.h b/include/wd.h -index ac564d8..273cbb8 100644 ---- a/include/wd.h -+++ b/include/wd.h -@@ -14,6 +14,10 @@ - #include - #include "uacce.h" - -+#ifdef __cplusplus -+extern "C" { -+#endif -+ - #define PATH_STR_SIZE 256 - #define MAX_ATTR_STR_SIZE 384 - #define WD_NAME_SIZE 64 -@@ -483,4 +487,8 @@ void wd_mempool_stats(handle_t mempool, struct wd_mempool_stats *stats); - */ - void wd_blockpool_stats(handle_t blkpool, struct wd_blockpool_stats *stats); - -+#ifdef __cplusplus -+} -+#endif -+ - #endif -diff --git a/include/wd_aead.h b/include/wd_aead.h -index 6377008..f169812 100644 ---- a/include/wd_aead.h -+++ b/include/wd_aead.h -@@ -14,6 +14,10 @@ - #include "wd_digest.h" - #include "wd.h" - -+#ifdef __cplusplus -+extern "C" { -+#endif -+ - /** - * wd_aead_op_type - Algorithm type of option - */ -@@ -214,4 +218,8 @@ void wd_aead_ctx_num_uninit(void); - int wd_aead_get_env_param(__u32 node, __u32 type, __u32 mode, - __u32 *num, __u8 *is_enable); - -+#ifdef __cplusplus -+} -+#endif -+ - #endif /* __WD_AEAD_H */ -diff --git a/include/wd_alg_common.h b/include/wd_alg_common.h -index 01a12ca..94336f0 100644 ---- a/include/wd_alg_common.h -+++ b/include/wd_alg_common.h -@@ -12,6 +12,10 @@ - #include "wd.h" - #include "wd_common.h" - -+#ifdef __cplusplus -+extern "C" { -+#endif -+ - /* Required compiler attributes */ - #define likely(x) __builtin_expect(!!(x), 1) - #define unlikely(x) __builtin_expect(!!(x), 0) -@@ -103,4 +107,8 @@ struct wd_datalist { - struct wd_datalist *next; - }; - -+#ifdef __cplusplus -+} -+#endif -+ - #endif -diff --git a/include/wd_cipher.h b/include/wd_cipher.h -index 8c73396..660d7e8 100644 ---- a/include/wd_cipher.h -+++ b/include/wd_cipher.h -@@ -11,6 +11,10 @@ - #include "wd.h" - #include "wd_alg_common.h" - -+#ifdef __cplusplus -+extern "C" { -+#endif -+ - #define AES_KEYSIZE_128 16 - #define AES_KEYSIZE_192 24 - #define AES_KEYSIZE_256 32 -@@ -185,4 +189,8 @@ void wd_cipher_ctx_num_uninit(void); - int wd_cipher_get_env_param(__u32 node, __u32 type, __u32 mode, - __u32 *num, __u8 *is_enable); - -+#ifdef __cplusplus -+} -+#endif -+ - #endif /* __WD_CIPHER_H */ -diff --git a/include/wd_common.h b/include/wd_common.h -index 61919d5..91dd066 100644 ---- a/include/wd_common.h -+++ b/include/wd_common.h -@@ -7,9 +7,17 @@ - #ifndef __WD_COMMON_H - #define __WD_COMMON_H - -+#ifdef __cplusplus -+extern "C" { -+#endif -+ - enum wd_buff_type { - WD_FLAT_BUF, - WD_SGL_BUF, - }; - -+#ifdef __cplusplus -+} -+#endif -+ - #endif /* __WD_COMMON_H */ -diff --git a/include/wd_comp.h b/include/wd_comp.h -index b6225df..460cfa7 100644 ---- a/include/wd_comp.h -+++ b/include/wd_comp.h -@@ -12,6 +12,10 @@ - #include "wd.h" - #include "wd_alg_common.h" - -+#ifdef __cplusplus -+extern "C" { -+#endif -+ - enum wd_comp_alg_type { - WD_DEFLATE, - WD_ZLIB, -@@ -217,4 +221,8 @@ void wd_comp_ctx_num_uninit(void); - int wd_comp_get_env_param(__u32 node, __u32 type, __u32 mode, - __u32 *num, __u8 *is_enable); - -+#ifdef __cplusplus -+} -+#endif -+ - #endif /* __WD_COMP_H */ -diff --git a/include/wd_dh.h b/include/wd_dh.h -index c0bce85..f342722 100644 ---- a/include/wd_dh.h -+++ b/include/wd_dh.h -@@ -12,6 +12,10 @@ - #include "wd.h" - #include "wd_alg_common.h" - -+#ifdef __cplusplus -+extern "C" { -+#endif -+ - #define BYTE_BITS 8 - #define BYTE_BITS_SHIFT 3 - #define GET_NEGATIVE(val) (0 - (val)) -@@ -69,4 +73,8 @@ void wd_dh_ctx_num_uninit(void); - int wd_dh_get_env_param(__u32 node, __u32 type, __u32 mode, - __u32 *num, __u8 *is_enable); - -+#ifdef __cplusplus -+} -+#endif -+ - #endif /* __WD_DH_H */ -diff --git a/include/wd_digest.h b/include/wd_digest.h -index 8e8e236..7e93a80 100644 ---- a/include/wd_digest.h -+++ b/include/wd_digest.h -@@ -11,6 +11,10 @@ - #include "wd_alg_common.h" - #include "wd.h" - -+#ifdef __cplusplus -+extern "C" { -+#endif -+ - #define MAX_HMAC_KEY_SIZE 128U - - /** -@@ -209,4 +213,8 @@ void wd_digest_ctx_num_uninit(void); - int wd_digest_get_env_param(__u32 node, __u32 type, __u32 mode, - __u32 *num, __u8 *is_enable); - -+#ifdef __cplusplus -+} -+#endif -+ - #endif /* __WD_DIGEST_H */ -diff --git a/include/wd_rsa.h b/include/wd_rsa.h -index 044819b..081bc2a 100644 ---- a/include/wd_rsa.h -+++ b/include/wd_rsa.h -@@ -12,6 +12,10 @@ - #include "wd.h" - #include "wd_alg_common.h" - -+#ifdef __cplusplus -+extern "C" { -+#endif -+ - #define BYTE_BITS 8 - #define BYTE_BITS_SHIFT 3 - #define CRT_PARAMS_SZ(key_size) ((5 * (key_size)) >> 1) -@@ -216,4 +220,8 @@ void wd_rsa_ctx_num_uninit(void); - int wd_rsa_get_env_param(__u32 node, __u32 type, __u32 mode, - __u32 *num, __u8 *is_enable); - -+#ifdef __cplusplus -+} -+#endif -+ - #endif /* __WD_RSA_H */ -diff --git a/include/wd_sched.h b/include/wd_sched.h -index 78125f4..2ae6103 100644 ---- a/include/wd_sched.h -+++ b/include/wd_sched.h -@@ -8,6 +8,10 @@ - #define SCHED_SAMPLE_h - #include "wd_alg_common.h" - -+#ifdef __cplusplus -+extern "C" { -+#endif -+ - #define INVALID_POS 0xFFFFFFFF - - /* The global policy type */ -@@ -56,4 +60,8 @@ struct wd_sched *wd_sched_rr_alloc(__u8 sched_type, __u8 type_num, - */ - void wd_sched_rr_release(struct wd_sched *sched); - -+#ifdef __cplusplus -+} -+#endif -+ - #endif -diff --git a/include/wd_util.h b/include/wd_util.h -index de2cd44..ef95907 100644 ---- a/include/wd_util.h -+++ b/include/wd_util.h -@@ -10,6 +10,10 @@ - #include - #include "wd_alg_common.h" - -+#ifdef __cplusplus -+extern "C" { -+#endif -+ - #define FOREACH_NUMA(i, config, config_numa) \ - for (i = 0, config_numa = config->config_per_numa; \ - i < config->numa_num; config_numa++, i++) -@@ -309,4 +313,8 @@ int wd_set_ctx_attr(struct wd_ctx_attr *ctx_attr, - */ - int wd_check_ctx(struct wd_ctx_config_internal *config, __u8 mode, __u32 idx); - -+#ifdef __cplusplus -+} -+#endif -+ - #endif /* __WD_UTIL_H */ --- -2.25.1 - diff --git a/0039-uadk-fix-for-resources-are-repeatedly-released.patch b/0039-uadk-fix-for-resources-are-repeatedly-released.patch deleted file mode 100644 index 8b4a1d2..0000000 --- a/0039-uadk-fix-for-resources-are-repeatedly-released.patch +++ /dev/null @@ -1,50 +0,0 @@ -From bb09e342c186f111600e763ca7a5bfb8713df6f7 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Wed, 12 Jan 2022 09:44:57 +0800 -Subject: [PATCH 42/53] uadk: fix for resources are repeatedly released - -Segment fault occur when environment resources -are repeatedly released, so add pointer check -for wd_free_ctx and wd_free_env and clear dirty -global Variables. - -Signed-off-by: Wenkai Lin ---- - wd_util.c | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/wd_util.c b/wd_util.c -index c2c109c..6cae768 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -825,6 +825,9 @@ static void wd_free_env(struct wd_env_config *config) - struct wd_env_config_per_numa *config_numa; - int i, j; - -+ if (!config->config_per_numa) -+ return; -+ - FOREACH_NUMA(i, config, config_numa) { - if (!config_numa->ctx_table) - continue; -@@ -1010,6 +1013,9 @@ err_free_ctx_config: - - static void wd_free_ctx(struct wd_ctx_config *ctx_config) - { -+ if (!ctx_config) -+ return; -+ - wd_put_wd_ctx(ctx_config, ctx_config->ctx_num); - free(ctx_config->ctxs); - free(ctx_config); -@@ -1451,6 +1457,7 @@ err_uninit_sched: - } - err_uninit_ctx: - wd_free_ctx(config->ctx_config); -+ config->ctx_config = NULL; - return ret; - } - --- -2.25.1 - diff --git a/0040-aead-modify-the-aead-s-request-api.patch b/0040-aead-modify-the-aead-s-request-api.patch deleted file mode 100644 index ac0ab86..0000000 --- a/0040-aead-modify-the-aead-s-request-api.patch +++ /dev/null @@ -1,785 +0,0 @@ -From c421a68ee4f70675235443f9cc968f264c7a39a6 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Thu, 13 Jan 2022 10:37:10 +0800 -Subject: [PATCH 43/53] aead: modify the aead's request api - -1. Add the parameter of mac address for Openssl engine. Previous - plan not adapted to the Openssl engine, it caused the low performance. - So after modification, user should allocated the mac memory and set - the mac length as doing task. -2. Deleted a parameter in api. the out_buffer_bytes is a redundant - code. - -Signed-off-by: Kai Ye ---- - drv/hisi_sec.c | 72 ++---------------- - include/wd_aead.h | 6 +- - test/hisi_sec_test/test_hisi_sec.c | 116 ++++++++++++++++++++++------- - uadk_tool/sec_uadk_benchmark.c | 33 ++++---- - wd_aead.c | 46 ++++++++---- - 5 files changed, 152 insertions(+), 121 deletions(-) - -diff --git a/drv/hisi_sec.c b/drv/hisi_sec.c -index d31a1b9..f5db7eb 100644 ---- a/drv/hisi_sec.c -+++ b/drv/hisi_sec.c -@@ -73,8 +73,8 @@ - /* The max BD data length is 16M-512B */ - #define MAX_INPUT_DATA_LEN 0xFFFE00 - #define MAX_CCM_AAD_LEN 65279 --#define SHA1_ALIGN_SZ 64 --#define SHA512_ALIGN_SZ 128 -+#define SHA1_ALIGN_SZ 64U -+#define SHA512_ALIGN_SZ 128U - - #define AUTHPAD_OFFSET 2 - #define AUTHTYPE_OFFSET 6 -@@ -1739,48 +1739,12 @@ static void set_aead_auth_iv(struct wd_aead_msg *msg) - } - } - --static void fill_aead_mac_addr_pbuff(struct wd_aead_msg *msg, __u64 *mac_addr) --{ -- __u64 addr = 0; -- -- if (msg->op_type == WD_CIPHER_DECRYPTION_DIGEST) -- addr = (__u64)(uintptr_t)msg->in + msg->in_bytes + msg->assoc_bytes; -- -- /* AEAD output MAC addr use out addr */ -- if (msg->op_type == WD_CIPHER_ENCRYPTION_DIGEST) -- addr = (__u64)(uintptr_t)msg->out + msg->out_bytes - msg->auth_bytes; -- -- *mac_addr = addr; --} -- --static void fill_aead_mac_addr_sgl(struct wd_aead_msg *msg, __u64 *mac_addr) --{ -- msg->mac = calloc(1, msg->auth_bytes); -- if (!msg->mac) { -- WD_ERR("failed to alloc mac memory!\n"); -- return; -- } -- -- if (msg->op_type == WD_CIPHER_DECRYPTION_DIGEST) -- hisi_qm_sgl_copy(msg->mac, msg->in, -- msg->in_bytes + msg->assoc_bytes, -- msg->auth_bytes, COPY_SGL_TO_PBUFF); -- -- *mac_addr = (__u64)(uintptr_t)msg->mac; --} -- - static void fill_aead_bd2_addr(struct wd_aead_msg *msg, - struct hisi_sec_sqe *sqe) - { - sqe->type2.data_src_addr = (__u64)(uintptr_t)msg->in; - sqe->type2.data_dst_addr = (__u64)(uintptr_t)msg->out; -- -- /* AEAD input MAC addr use in addr */ -- if (msg->data_fmt == WD_FLAT_BUF) -- fill_aead_mac_addr_pbuff(msg, &sqe->type2.mac_addr); -- else -- fill_aead_mac_addr_sgl(msg, &sqe->type2.mac_addr); -- -+ sqe->type2.mac_addr = (__u64)(uintptr_t)msg->mac; - sqe->type2.c_key_addr = (__u64)(uintptr_t)msg->ckey; - sqe->type2.a_key_addr = (__u64)(uintptr_t)msg->akey; - sqe->type2.c_ivin_addr = (__u64)(uintptr_t)msg->iv; -@@ -1939,7 +1903,7 @@ static void parse_aead_bd2(struct hisi_sec_sqe *sqe, - if (recv_msg->auth_bytes == 0) - recv_msg->auth_bytes = sqe->type2.icvw_kmode & - SEC_AUTH_LEN_MASK; -- recv_msg->out_bytes = sqe->type2.clen_ivhlen + recv_msg->auth_bytes + -+ recv_msg->out_bytes = sqe->type2.clen_ivhlen + - sqe->type2.cipher_src_offset; - - #ifdef DEBUG -@@ -1961,15 +1925,9 @@ int hisi_sec_aead_recv(handle_t ctx, struct wd_aead_msg *recv_msg) - - parse_aead_bd2(&sqe, recv_msg); - -- if (recv_msg->data_fmt == WD_SGL_BUF) { -- if (sqe.type_auth_cipher & (SEC_CIPHER_ENC << SEC_CIPHER_OFFSET)) -- hisi_qm_sgl_copy(recv_msg->mac, recv_msg->out, -- recv_msg->out_bytes - recv_msg->auth_bytes, -- recv_msg->auth_bytes, COPY_PBUFF_TO_SGL); -- -+ if (recv_msg->data_fmt == WD_SGL_BUF) - hisi_sec_put_sgl(h_qp, recv_msg->alg_type, recv_msg->in, - recv_msg->out); -- } - - return 0; - } -@@ -2089,18 +2047,10 @@ static int fill_aead_bd3_mode(struct wd_aead_msg *msg, - static void fill_aead_bd3_addr(struct wd_aead_msg *msg, - struct hisi_sec_sqe3 *sqe) - { -- __u64 mac_addr; -- - sqe->data_src_addr = (__u64)(uintptr_t)msg->in; - sqe->data_dst_addr = (__u64)(uintptr_t)msg->out; - -- /* AEAD input MAC addr use in and out addr */ -- if (msg->data_fmt == WD_FLAT_BUF) -- fill_aead_mac_addr_pbuff(msg, &mac_addr); -- else -- fill_aead_mac_addr_sgl(msg, &mac_addr); -- -- sqe->mac_addr = mac_addr; -+ sqe->mac_addr = (__u64)(uintptr_t)msg->mac; - sqe->c_key_addr = (__u64)(uintptr_t)msg->ckey; - sqe->a_key_addr = (__u64)(uintptr_t)msg->akey; - sqe->no_scene.c_ivin_addr = (__u64)(uintptr_t)msg->iv; -@@ -2237,7 +2187,7 @@ static void parse_aead_bd3(struct hisi_sec_sqe3 *sqe, - if (recv_msg->auth_bytes == 0) - recv_msg->auth_bytes = (sqe->c_icv_key >> SEC_MAC_OFFSET_V3) & - SEC_MAC_LEN_MASK; -- recv_msg->out_bytes = sqe->c_len_ivin + recv_msg->auth_bytes + -+ recv_msg->out_bytes = sqe->c_len_ivin + - sqe->cipher_src_offset; - - #ifdef DEBUG -@@ -2259,15 +2209,9 @@ int hisi_sec_aead_recv_v3(handle_t ctx, struct wd_aead_msg *recv_msg) - - parse_aead_bd3(&sqe, recv_msg); - -- if (recv_msg->data_fmt == WD_SGL_BUF) { -- if (sqe.c_icv_key & SEC_CIPHER_ENC) -- hisi_qm_sgl_copy(recv_msg->mac, recv_msg->out, -- recv_msg->out_bytes - recv_msg->auth_bytes, -- recv_msg->auth_bytes, COPY_PBUFF_TO_SGL); -- -+ if (recv_msg->data_fmt == WD_SGL_BUF) - hisi_sec_put_sgl(h_qp, recv_msg->alg_type, - recv_msg->in, recv_msg->out); -- } - - return 0; - } -diff --git a/include/wd_aead.h b/include/wd_aead.h -index f169812..a632cd8 100644 ---- a/include/wd_aead.h -+++ b/include/wd_aead.h -@@ -52,11 +52,12 @@ typedef void *wd_alg_aead_cb_t(struct wd_aead_req *req, void *cb_param); - * @ op_type: denoted by enum wd_aead_op_type - * @ src: input data pointer - * @ dst: output data pointer -+ * @ mac: mac data pointer - * @ iv: input iv pointer - * @ in_bytes: input data length - * @ out_bytes: output data length -- * @ out_buf_bytes: output data buffer length - * @ iv_bytes: input iv length -+ * @ mac_bytes: mac data buffer length - * @ assoc_bytes: input associated data length - * @ state: operation result, denoted by WD error code - * @ cb: callback function pointer -@@ -72,11 +73,12 @@ struct wd_aead_req { - struct wd_datalist *list_dst; - void *dst; - }; -+ void *mac; - void *iv; - __u32 in_bytes; - __u32 out_bytes; -- __u32 out_buf_bytes; - __u16 iv_bytes; -+ __u16 mac_bytes; - __u16 assoc_bytes; - __u16 state; - __u8 data_fmt; -diff --git a/test/hisi_sec_test/test_hisi_sec.c b/test/hisi_sec_test/test_hisi_sec.c -index dda291d..6f27cd1 100644 ---- a/test/hisi_sec_test/test_hisi_sec.c -+++ b/test/hisi_sec_test/test_hisi_sec.c -@@ -279,6 +279,7 @@ static void dump_mem(int sgl, unsigned char *buf, size_t len) - if ((i + 1) % 8 == 0) - SEC_TST_PRT("\n"); - } -+ SEC_TST_PRT("\n"); - } - } - -@@ -2523,6 +2524,7 @@ static int sec_aead_sync_once(void) - unsigned long Perf = 0; - float speed, time_used; - unsigned long cnt = g_times; -+ __u16 mac_bytes; - __u16 auth_size; - __u16 in_size; - __u16 iv_len; -@@ -2553,8 +2555,7 @@ static int sec_aead_sync_once(void) - - /* should set key */ - dump_mem(WD_FLAT_BUF, (void *)tv->key, tv->klen); -- if (setup.cmode == WD_CIPHER_CCM || -- setup.cmode == WD_CIPHER_GCM) { -+ if (setup.cmode == WD_CIPHER_CCM || setup.cmode == WD_CIPHER_GCM) { - ret = wd_aead_set_ckey(h_sess, (const __u8*)tv->key, tv->klen); - if (ret) { - SEC_TST_PRT("aead sess set key failed!\n"); -@@ -2576,6 +2577,7 @@ static int sec_aead_sync_once(void) - } - - auth_size = (__u16)(tv->clen - tv->plen); -+ mac_bytes = auth_size; - ret = wd_aead_set_authsize(h_sess, auth_size); - if (ret) { - SEC_TST_PRT("set auth size fail, authsize: %u\n", auth_size); -@@ -2596,6 +2598,18 @@ static int sec_aead_sync_once(void) - } - SEC_TST_PRT("aead get max auth size: %u\n", ret); - -+ if (setup.cmode == WD_CIPHER_CCM || setup.cmode == WD_CIPHER_GCM) -+ mac_bytes = 16; -+ -+ req.mac = malloc(mac_bytes); -+ if (!req.mac) { -+ SEC_TST_PRT("req iv mem malloc failed!\n"); -+ ret = -ENOMEM; -+ goto out_key; -+ } -+ memset(req.mac, 0, mac_bytes); -+ req.mac_bytes = mac_bytes; -+ - if (g_direction == 0) - req.op_type = WD_CIPHER_ENCRYPTION_DIGEST; - else -@@ -2609,7 +2623,7 @@ static int sec_aead_sync_once(void) - } - if (in_size > BUFF_SIZE) { - SEC_TST_PRT("alloc in buffer block size too small!\n"); -- goto out_key; -+ goto out_mac; - } - unit_sz = cal_unit_sz(in_size, g_sgl_num); - void *src = create_buf(WD_FLAT_BUF, in_size, unit_sz); -@@ -2627,10 +2641,14 @@ static int sec_aead_sync_once(void) - req.in_bytes = tv->plen; - } else { - memcpy(src, tv->assoc, tv->alen); -- memcpy((src + req.assoc_bytes), tv->ctext, tv->clen); -+ memcpy(src + req.assoc_bytes, tv->ctext, tv->clen - auth_size); - req.in_bytes = tv->clen - auth_size; -+ memcpy(req.mac, tv->ctext + tv->clen - auth_size, auth_size); - } - -+ SEC_TST_PRT("mac addr src is:\n"); -+ dump_mem(0, req.mac, auth_size); -+ - req.src = create_buf(g_data_fmt, in_size, unit_sz); - if (!req.src) { - ret = -ENOMEM; -@@ -2643,21 +2661,19 @@ static int sec_aead_sync_once(void) - dump_mem(g_data_fmt, req.src, tv->alen + req.in_bytes); - - if (g_direction == 0) { -- req.out_bytes = req.assoc_bytes + tv->clen; -+ req.out_bytes = req.assoc_bytes + tv->clen - auth_size; - } else { - req.out_bytes = req.assoc_bytes + tv->plen; - } - -- req.out_buf_bytes = req.out_bytes + auth_size; - // alloc out buffer memory -- unit_sz = cal_unit_sz(req.out_buf_bytes, g_sgl_num); -- req.dst = create_buf(g_data_fmt, req.out_buf_bytes, unit_sz); -+ unit_sz = cal_unit_sz(req.out_bytes, g_sgl_num); -+ req.dst = create_buf(g_data_fmt, req.out_bytes, unit_sz); - if (!req.dst) { - ret = -ENOMEM; - goto out_dst; - } - -- // set iv - req.iv = malloc(AES_BLOCK_SIZE); - if (!req.iv) { - SEC_TST_PRT("req iv mem malloc failed!\n"); -@@ -2688,7 +2704,10 @@ static int sec_aead_sync_once(void) - SEC_TST_PRT("Pro-%d, thread_id-%d, speed:%0.3f ops, Perf: %ld KB/s\n", getpid(), - (int)syscall(__NR_gettid), speed, Perf); - -+ SEC_TST_PRT("aead dump out addr is:\n"); - dump_mem(g_data_fmt, req.dst, req.out_bytes); -+ SEC_TST_PRT("aead dump mac addr is:\n"); -+ dump_mem(0, req.mac, auth_size); - - free(req.iv); - out_iv: -@@ -2696,6 +2715,8 @@ out_iv: - out_dst: - free_buf(g_data_fmt, req.src); - out_src: -+out_mac: -+ free(req.mac); - out_key: - wd_aead_free_sess(h_sess); - out: -@@ -2827,6 +2848,7 @@ static int sec_aead_async_once(void) - static pthread_t send_td; - static pthread_t poll_td; - thread_data_d td_data; -+ __u16 mac_bytes; - __u16 auth_size; - __u16 in_size; - __u16 iv_len; -@@ -2857,8 +2879,7 @@ static int sec_aead_async_once(void) - - /* should set key */ - dump_mem(WD_FLAT_BUF, (void *)tv->key, tv->klen); -- if (setup.cmode == WD_CIPHER_CCM || -- setup.cmode == WD_CIPHER_GCM) { -+ if (setup.cmode == WD_CIPHER_CCM || setup.cmode == WD_CIPHER_GCM) { - ret = wd_aead_set_ckey(h_sess, (const __u8*)tv->key, tv->klen); - if (ret) { - SEC_TST_PRT("aead sess set key failed!\n"); -@@ -2880,6 +2901,7 @@ static int sec_aead_async_once(void) - } - - auth_size = (__u16)(tv->clen - tv->plen); -+ mac_bytes = auth_size; - ret = wd_aead_set_authsize(h_sess, auth_size); - if (ret) { - SEC_TST_PRT("set auth size fail, authsize: %u\n", auth_size); -@@ -2898,6 +2920,17 @@ static int sec_aead_async_once(void) - goto out_key; - } - SEC_TST_PRT("aead get max auth size: %u\n", ret); -+ if (setup.cmode == WD_CIPHER_CCM || setup.cmode == WD_CIPHER_GCM) -+ mac_bytes = 16; -+ -+ req.mac = malloc(mac_bytes); -+ if (!req.mac) { -+ SEC_TST_PRT("req iv mem malloc failed!\n"); -+ ret = -ENOMEM; -+ goto out_key; -+ } -+ memset(req.mac, 0, mac_bytes); -+ req.mac_bytes = mac_bytes; - - if (g_direction == 0) - req.op_type = WD_CIPHER_ENCRYPTION_DIGEST; -@@ -2908,7 +2941,7 @@ static int sec_aead_async_once(void) - in_size = tv->alen + tv->plen + auth_size; - if (in_size > BUFF_SIZE) { - SEC_TST_PRT("alloc in buffer block size too small!\n"); -- goto out_key; -+ goto out_mac; - } - req.assoc_bytes = tv->alen; - unit_sz = cal_unit_sz(BUFF_SIZE, g_sgl_num); -@@ -2931,15 +2964,15 @@ static int sec_aead_async_once(void) - req.in_bytes = tv->plen; - } else { - memcpy(src, tv->assoc, tv->alen); -- memcpy((src + tv->alen), tv->ctext, tv->clen); -+ memcpy(src + tv->alen, tv->ctext, tv->clen - auth_size); - req.in_bytes = tv->clen - auth_size; -+ memcpy(req.mac, tv->ctext + tv->clen - auth_size, auth_size); - } - -- - copy_mem(g_data_fmt, req.src, WD_FLAT_BUF, src, - (size_t)(req.in_bytes + tv->alen)); - free(src); -- SEC_TST_PRT("aead req src in--------->: %u\n", tv->alen + req.in_bytes); -+ SEC_TST_PRT("aead req alen---->: %u. in_bytes--->:%u\n", tv->alen, req.in_bytes); - dump_mem(g_data_fmt, req.src, tv->alen + req.in_bytes); - - // alloc out buffer memory -@@ -2949,7 +2982,6 @@ static int sec_aead_async_once(void) - goto out_dst; - } - -- req.out_buf_bytes = BUFF_SIZE; - if (g_direction == 0) - req.out_bytes = tv->alen + tv->clen; - else -@@ -3010,6 +3042,8 @@ out_iv: - out_dst: - free_buf(g_data_fmt, req.src); - out_src: -+out_mac: -+ free(req.mac); - out_key: - wd_aead_free_sess(h_sess); - out: -@@ -3026,6 +3060,7 @@ static int sec_aead_sync_multi(void) - struct wd_aead_req req; - static pthread_t sendtd[64]; - thread_data_d td_data; -+ __u16 mac_bytes; - __u16 auth_size; - __u16 in_size; - __u16 iv_len; -@@ -3056,8 +3091,7 @@ static int sec_aead_sync_multi(void) - - /* should set key */ - dump_mem(WD_FLAT_BUF, (void *)tv->key, tv->klen); -- if (setup.cmode == WD_CIPHER_CCM || -- setup.cmode == WD_CIPHER_GCM) { -+ if (setup.cmode == WD_CIPHER_CCM || setup.cmode == WD_CIPHER_GCM) { - ret = wd_aead_set_ckey(h_sess, (const __u8*)tv->key, tv->klen); - if (ret) { - SEC_TST_PRT("aead sess set key failed!\n"); -@@ -3079,6 +3113,7 @@ static int sec_aead_sync_multi(void) - } - - auth_size = (__u16)(tv->clen - tv->plen); -+ mac_bytes = auth_size; - ret = wd_aead_set_authsize(h_sess, auth_size); - if (ret) { - SEC_TST_PRT("set auth size fail, authsize: %u\n", auth_size); -@@ -3098,6 +3133,18 @@ static int sec_aead_sync_multi(void) - } - SEC_TST_PRT("aead get max auth size: %u\n", ret); - -+ if (setup.cmode == WD_CIPHER_CCM || setup.cmode == WD_CIPHER_GCM) -+ mac_bytes = 16; -+ -+ req.mac = malloc(mac_bytes); -+ if (!req.mac) { -+ SEC_TST_PRT("req iv mem malloc failed!\n"); -+ ret = -ENOMEM; -+ goto out_key; -+ } -+ memset(req.mac, 0, mac_bytes); -+ req.mac_bytes = mac_bytes; -+ - if (g_direction == 0) - req.op_type = WD_CIPHER_ENCRYPTION_DIGEST; - else -@@ -3108,7 +3155,7 @@ static int sec_aead_sync_multi(void) - in_size = tv->alen + tv->plen + auth_size; - if (in_size > BUFF_SIZE) { - SEC_TST_PRT("alloc in buffer block size too small!\n"); -- goto out_key; -+ goto out_mac; - } - unit_sz = cal_unit_sz(BUFF_SIZE, g_sgl_num); - void *src = create_buf(WD_FLAT_BUF, BUFF_SIZE, unit_sz); -@@ -3123,8 +3170,9 @@ static int sec_aead_sync_multi(void) - req.in_bytes = tv->plen; - } else { - memcpy(src, tv->assoc, tv->alen); -- memcpy((src + tv->alen), tv->ctext, tv->clen); -+ memcpy(src + tv->alen, tv->ctext, tv->clen - auth_size); - req.in_bytes = tv->clen - auth_size; -+ memcpy(req.mac, tv->ctext + tv->clen - auth_size, auth_size); - } - - req.src = create_buf(g_data_fmt, in_size, unit_sz); -@@ -3137,7 +3185,7 @@ static int sec_aead_sync_multi(void) - (size_t)(req.in_bytes + tv->alen)); - free(src); - -- SEC_TST_PRT("aead req src in--------->: %u\n", tv->alen + req.in_bytes); -+ SEC_TST_PRT("aead req src in>: alen:%u, input len:%d\n", tv->alen, req.in_bytes); - dump_mem(g_data_fmt, req.src, tv->alen + req.in_bytes); - - // alloc out buffer memory -@@ -3147,7 +3195,6 @@ static int sec_aead_sync_multi(void) - goto out_dst; - } - -- req.out_buf_bytes = BUFF_SIZE; - if (g_direction == 0) - req.out_bytes = tv->alen + tv->clen; - else -@@ -3175,6 +3222,7 @@ static int sec_aead_sync_multi(void) - td_data.recv_num = g_times; - td_data.sum_perf = 0; - -+ printf("%s, req->in_bytes:%d\n", __func__, req.in_bytes); - for (i = 0; i < g_thread_num; i++) { - ret = pthread_create(&sendtd[i], NULL, aead_sync_send_thread, &td_data); - if (ret) { -@@ -3200,6 +3248,8 @@ out_iv: - out_dst: - free_buf(g_data_fmt, req.src); - out_src: -+out_mac: -+ free(req.mac); - out_key: - wd_aead_free_sess(h_sess); - out: -@@ -3217,6 +3267,7 @@ static int sec_aead_async_multi(void) - static pthread_t send_td[64]; - static pthread_t poll_td; - thread_data_d td_data; -+ __u16 mac_bytes; - __u16 auth_size; - __u16 in_size; - __u16 iv_len; -@@ -3247,8 +3298,7 @@ static int sec_aead_async_multi(void) - - /* should set key */ - dump_mem(WD_FLAT_BUF, (void *)tv->key, tv->klen); -- if (setup.cmode == WD_CIPHER_CCM || -- setup.cmode == WD_CIPHER_GCM) { -+ if (setup.cmode == WD_CIPHER_CCM || setup.cmode == WD_CIPHER_GCM) { - ret = wd_aead_set_ckey(h_sess, (const __u8*)tv->key, tv->klen); - if (ret) { - SEC_TST_PRT("aead sess set key failed!\n"); -@@ -3270,6 +3320,7 @@ static int sec_aead_async_multi(void) - } - - auth_size = (__u16)(tv->clen - tv->plen); -+ mac_bytes = auth_size; - ret = wd_aead_set_authsize(h_sess, auth_size); - if (ret) { - SEC_TST_PRT("set auth size fail, authsize: %u\n", auth_size); -@@ -3289,6 +3340,15 @@ static int sec_aead_async_multi(void) - } - SEC_TST_PRT("aead get max auth size: %u\n", ret); - -+ if (setup.cmode == WD_CIPHER_CCM || setup.cmode == WD_CIPHER_GCM) -+ mac_bytes = 16; -+ -+ req.mac = malloc(mac_bytes); -+ if (req.mac == NULL) -+ goto out; -+ memset(req.mac, 0, mac_bytes); -+ req.mac_bytes = mac_bytes; -+ - if (g_direction == 0) - req.op_type = WD_CIPHER_ENCRYPTION_DIGEST; - else -@@ -3321,8 +3381,9 @@ static int sec_aead_async_multi(void) - req.in_bytes = tv->plen; - } else { - memcpy(src, tv->assoc, tv->alen); -- memcpy((src + tv->alen), tv->ctext, tv->clen); -+ memcpy(src + tv->alen, tv->ctext, tv->clen - auth_size); - req.in_bytes = tv->clen - auth_size; -+ memcpy(req.mac, tv->ctext + (tv->clen - auth_size), auth_size); - } - - copy_mem(g_data_fmt, req.src, WD_FLAT_BUF, src, -@@ -3338,9 +3399,8 @@ static int sec_aead_async_multi(void) - ret = -1; - goto out; - } -- req.out_buf_bytes = BUFF_SIZE; - if (g_direction == 0) -- req.out_bytes = tv->alen + tv->clen; -+ req.out_bytes = tv->alen + tv->clen - auth_size; - else - req.out_bytes = tv->alen + tv->plen; - -@@ -3396,6 +3456,8 @@ static int sec_aead_async_multi(void) - - dump_mem(g_data_fmt, req.dst, req.out_bytes); - out: -+ if (req.mac) -+ free(req.mac); - if (req.src) - free_buf(g_data_fmt, req.src); - if (req.dst) -diff --git a/uadk_tool/sec_uadk_benchmark.c b/uadk_tool/sec_uadk_benchmark.c -index 40ba227..d68ac25 100644 ---- a/uadk_tool/sec_uadk_benchmark.c -+++ b/uadk_tool/sec_uadk_benchmark.c -@@ -24,6 +24,7 @@ struct thread_pool { - struct bd_pool *pool; - u8 *iv; - u8 *key; -+ u8 *mac; - } g_uadk_pool; - - typedef struct uadk_thread_res { -@@ -475,6 +476,7 @@ int init_uadk_bd_pool(void) - - g_uadk_pool.iv = malloc(g_thread_num * MAX_IVK_LENTH * sizeof(char)); - g_uadk_pool.key = malloc(g_thread_num * MAX_IVK_LENTH * sizeof(char)); -+ g_uadk_pool.mac = malloc(g_thread_num * MAX_IVK_LENTH * sizeof(char)); - - g_uadk_pool.pool = malloc(g_thread_num * sizeof(struct bd_pool)); - if (!g_uadk_pool.pool) { -@@ -611,9 +613,10 @@ static void *sec_uadk_async_run(void *arg) - struct wd_aead_req areq; - struct wd_digest_req dreq; - struct bd_pool *uadk_pool; -- u8 *priv_iv, *priv_key; -+ u8 *priv_iv, *priv_key, *priv_mac; - int try_cnt = 0; - handle_t h_sess; -+ u32 auth_size = 16; - u32 count = 0; - int ret, i = 0; - -@@ -623,6 +626,7 @@ static void *sec_uadk_async_run(void *arg) - uadk_pool = &g_uadk_pool.pool[pdata->td_id]; - priv_iv = &g_uadk_pool.iv[pdata->td_id]; - priv_key = &g_uadk_pool.key[pdata->td_id]; -+ priv_mac = &g_uadk_pool.mac[pdata->td_id]; - - memset(priv_iv, DEF_IVK_DATA, MAX_IVK_LENTH); - memset(priv_key, DEF_IVK_DATA, MAX_IVK_LENTH); -@@ -687,7 +691,7 @@ static void *sec_uadk_async_run(void *arg) - wd_aead_free_sess(h_sess); - return NULL; - } -- ret = wd_aead_set_authsize(h_sess, 16); -+ ret = wd_aead_set_authsize(h_sess, auth_size); - if (ret) { - SEC_TST_PRT("set auth size fail, authsize: 16\n"); - wd_aead_free_sess(h_sess); -@@ -696,16 +700,15 @@ static void *sec_uadk_async_run(void *arg) - - areq.op_type = pdata->optype; - areq.iv = priv_iv; // aead IV need update with param -+ areq.mac = priv_mac; - areq.iv_bytes = pdata->ivsize; -+ areq.mac_bytes = auth_size; - areq.assoc_bytes = 16; - areq.in_bytes = g_pktlen; -- if (areq.op_type) {// decrypto -+ if (areq.op_type)// decrypto - areq.out_bytes = g_pktlen + 16; // aadsize = 16; -- areq.out_buf_bytes = areq.out_bytes + 16; // authsize = 16 -- } else { -+ else - areq.out_bytes = g_pktlen + 32; // aadsize + authsize = 32; -- areq.out_buf_bytes = areq.out_bytes + 32; -- } - - areq.data_fmt = 0; - areq.state = 0; -@@ -795,8 +798,9 @@ static void *sec_uadk_sync_run(void *arg) - struct wd_aead_req areq; - struct wd_digest_req dreq; - struct bd_pool *uadk_pool; -- u8 *priv_iv, *priv_key; -+ u8 *priv_iv, *priv_key, *priv_mac; - handle_t h_sess; -+ u32 auth_size = 16; - u32 count = 0; - int ret, i = 0; - -@@ -806,6 +810,7 @@ static void *sec_uadk_sync_run(void *arg) - uadk_pool = &g_uadk_pool.pool[pdata->td_id]; - priv_iv = &g_uadk_pool.iv[pdata->td_id]; - priv_key = &g_uadk_pool.key[pdata->td_id]; -+ priv_mac = &g_uadk_pool.mac[pdata->td_id]; - - memset(priv_iv, DEF_IVK_DATA, MAX_IVK_LENTH); - memset(priv_key, DEF_IVK_DATA, MAX_IVK_LENTH); -@@ -860,7 +865,7 @@ static void *sec_uadk_sync_run(void *arg) - wd_aead_free_sess(h_sess); - return NULL; - } -- ret = wd_aead_set_authsize(h_sess, 16); -+ ret = wd_aead_set_authsize(h_sess, auth_size); - if (ret) { - SEC_TST_PRT("set auth size fail, authsize: 16\n"); - wd_aead_free_sess(h_sess); -@@ -869,16 +874,16 @@ static void *sec_uadk_sync_run(void *arg) - - areq.op_type = pdata->optype; - areq.iv = priv_iv; // aead IV need update with param -+ areq.mac = priv_mac; -+ areq.mac_bytes = 16; - areq.iv_bytes = pdata->ivsize; - areq.assoc_bytes = 16; - areq.in_bytes = g_pktlen; -- if (areq.op_type) {// decrypto -+ areq.mac_bytes = auth_size; -+ if (areq.op_type)// decrypto - areq.out_bytes = g_pktlen + 16; // aadsize = 16; -- areq.out_buf_bytes = areq.out_bytes + 16; // authsize = 16 -- } else { -+ else - areq.out_bytes = g_pktlen + 32; // aadsize + authsize = 32; -- areq.out_buf_bytes = areq.out_bytes + 32; -- } - - areq.data_fmt = 0; - areq.state = 0; -diff --git a/wd_aead.c b/wd_aead.c -index ebad440..670bb33 100644 ---- a/wd_aead.c -+++ b/wd_aead.c -@@ -305,6 +305,33 @@ void wd_aead_free_sess(handle_t h_sess) - free(sess); - } - -+static int aead_mac_param_check(struct wd_aead_sess *sess, -+ struct wd_aead_req *req) -+{ -+ int ret = 0; -+ -+ switch (sess->cmode) { -+ case WD_CIPHER_CBC: -+ if (req->mac_bytes < g_aead_mac_len[sess->dalg]) { -+ WD_ERR("failed to check cbc-hmac mac buffer length!\n"); -+ ret = -WD_EINVAL; -+ } -+ break; -+ case WD_CIPHER_CCM: -+ case WD_CIPHER_GCM: -+ if (req->mac_bytes < WD_AEAD_CCM_GCM_MAX) { -+ WD_ERR("failed to check CCM or GCM mac buffer length!\n"); -+ ret = -WD_EINVAL; -+ } -+ break; -+ default: -+ ret = -WD_EINVAL; -+ WD_ERR("set the aead cmode is error!\n"); -+ } -+ -+ return ret; -+} -+ - static int aead_param_check(struct wd_aead_sess *sess, - struct wd_aead_req *req) - { -@@ -328,33 +355,23 @@ static int aead_param_check(struct wd_aead_sess *sess, - } - - if (unlikely(req->iv_bytes != get_iv_block_size(sess->cmode))) { -- WD_ERR("failed to check aead IV length!\n"); -+ WD_ERR("failed to check aead IV length, size:%u\n", req->iv_bytes); - return -WD_EINVAL; - } - -- if (unlikely(req->out_buf_bytes < req->out_bytes)) { -- WD_ERR("failed to check aead out buffer length!\n"); -- return -WD_EINVAL; -- } -- -- if (unlikely(req->op_type == WD_CIPHER_ENCRYPTION_DIGEST && -- req->out_buf_bytes < (req->out_bytes + sess->auth_bytes))) { -- WD_ERR("failed to check aead type or mac length!\n"); -+ ret = aead_mac_param_check(sess, req); -+ if (unlikely(ret)) - return -WD_EINVAL; -- } - - if (req->data_fmt == WD_SGL_BUF) { - len = req->in_bytes + req->assoc_bytes; -- if (req->op_type == WD_CIPHER_DECRYPTION_DIGEST) -- len += sess->auth_bytes; -- - ret = wd_check_datalist(req->list_src, len); - if (unlikely(ret)) { - WD_ERR("failed to check the src datalist!\n"); - return -WD_EINVAL; - } - -- ret = wd_check_datalist(req->list_dst, req->out_buf_bytes); -+ ret = wd_check_datalist(req->list_dst, req->out_bytes); - if (unlikely(ret)) { - WD_ERR("failed to check the dst datalist!\n"); - return -WD_EINVAL; -@@ -480,6 +497,7 @@ static void fill_request_msg(struct wd_aead_msg *msg, struct wd_aead_req *req, - msg->iv = req->iv; - msg->iv_bytes = req->iv_bytes; - msg->assoc_bytes = req->assoc_bytes; -+ msg->mac = req->mac; - msg->auth_bytes = sess->auth_bytes; - msg->data_fmt = req->data_fmt; - } --- -2.25.1 - diff --git a/0041-cipher-add-semi-weak-keys-checking.patch b/0041-cipher-add-semi-weak-keys-checking.patch deleted file mode 100644 index d6d2b00..0000000 --- a/0041-cipher-add-semi-weak-keys-checking.patch +++ /dev/null @@ -1,80 +0,0 @@ -From e191549317c08e340b9406bf2958868b1f119df2 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Thu, 13 Jan 2022 16:33:37 +0800 -Subject: [PATCH 44/53] cipher: add semi-weak keys checking - -Add semi-weak keys checking based on OpenSSL. it will improve the -security of the system. - -Signed-off-by: Kai Ye ---- - wd_cipher.c | 30 +++++++++++++++++++++++------- - 1 file changed, 23 insertions(+), 7 deletions(-) - -diff --git a/wd_cipher.c b/wd_cipher.c -index 9c1f98c..85f7e65 100644 ---- a/wd_cipher.c -+++ b/wd_cipher.c -@@ -19,15 +19,31 @@ - #define DES3_3KEY_SIZE (3 * DES_KEY_SIZE) - - #define WD_POOL_MAX_ENTRIES 1024 --#define DES_WEAK_KEY_NUM 4 -+#define DES_WEAK_KEY_NUM 16 - #define MAX_RETRY_COUNTS 200000000 - - #define POLL_SIZE 100000 - #define POLL_TIME 1000 - --static __u64 des_weak_key[DES_WEAK_KEY_NUM] = { -- 0x0101010101010101, 0xFEFEFEFEFEFEFEFE, -- 0xE0E0E0E0F1F1F1F1, 0x1F1F1F1F0E0E0E0E -+static const unsigned char des_weak_keys[DES_WEAK_KEY_NUM][DES_KEY_SIZE] = { -+ /* weak keys */ -+ {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, -+ {0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE}, -+ {0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E}, -+ {0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1}, -+ /* semi-weak keys */ -+ {0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE}, -+ {0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01}, -+ {0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1}, -+ {0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E}, -+ {0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1}, -+ {0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01}, -+ {0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE}, -+ {0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E}, -+ {0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E}, -+ {0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01}, -+ {0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE}, -+ {0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1} - }; - - struct wd_cipher_setting { -@@ -81,12 +97,12 @@ void wd_cipher_set_driver(struct wd_cipher_driver *drv) - wd_cipher_setting.driver = drv; - } - --static bool is_des_weak_key(const __u64 *key) -+static bool is_des_weak_key(const __u8 *key) - { - int i; - - for (i = 0; i < DES_WEAK_KEY_NUM; i++) { -- if (*key == des_weak_key[i]) -+ if (memcmp(des_weak_keys[i], key, DES_KEY_SIZE) == 0) - return true; - } - -@@ -173,7 +189,7 @@ int wd_cipher_set_key(handle_t h_sess, const __u8 *key, __u32 key_len) - WD_ERR("cipher set key input key length err!\n"); - return -WD_EINVAL; - } -- if (sess->alg == WD_CIPHER_DES && is_des_weak_key((__u64 *)key)) { -+ if (sess->alg == WD_CIPHER_DES && is_des_weak_key(key)) { - WD_ERR("input des key is weak key!\n"); - return -WD_EINVAL; - } --- -2.25.1 - diff --git a/0042-uadk-ioctl-return-result-should-be-printed.patch b/0042-uadk-ioctl-return-result-should-be-printed.patch deleted file mode 100644 index bf64a06..0000000 --- a/0042-uadk-ioctl-return-result-should-be-printed.patch +++ /dev/null @@ -1,41 +0,0 @@ -From ef361818b1a67a6540ea4b0d2538090eea56863e Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sat, 15 Jan 2022 16:53:58 +0800 -Subject: [PATCH 45/53] uadk: ioctl return result should be printed - -ioctl return result may be discarded, -it is useful to debug kernel error, -so it should be printed directly. - -Signed-off-by: Wenkai Lin ---- - wd.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/wd.c b/wd.c -index 787d74b..6bbf677 100644 ---- a/wd.c -+++ b/wd.c -@@ -386,7 +386,8 @@ int wd_ctx_start(handle_t h_ctx) - - ret = wd_ctx_set_io_cmd(h_ctx, UACCE_CMD_START, NULL); - if (ret) -- WD_ERR("Fail to start on %s (%d).\n", ctx->dev_path, -errno); -+ WD_ERR("Fail to start on %s (%d), ret = %d!\n", -+ ctx->dev_path, -errno, ret); - - return ret; - } -@@ -401,7 +402,8 @@ int wd_release_ctx_force(handle_t h_ctx) - - ret = wd_ctx_set_io_cmd(h_ctx, UACCE_CMD_PUT_Q, NULL); - if (ret) -- WD_ERR("Fail to stop on %s (%d).\n", ctx->dev_path, -errno); -+ WD_ERR("Fail to stop on %s (%d), ret = %d!\n", -+ ctx->dev_path, -errno, ret); - - return ret; - } --- -2.25.1 - diff --git a/0043-uadk-fix-environment-uninit-repeatly-error.patch b/0043-uadk-fix-environment-uninit-repeatly-error.patch deleted file mode 100644 index bb95519..0000000 --- a/0043-uadk-fix-environment-uninit-repeatly-error.patch +++ /dev/null @@ -1,412 +0,0 @@ -From 282d7d06d0585d117ab62263ab3722950e9693f0 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sat, 15 Jan 2022 16:53:59 +0800 -Subject: [PATCH 46/53] uadk: fix environment uninit repeatly error - -use wd_uninit_env_config to restore wd_init_env_config do, -move setting gloab environment config to wd_init_env_config. -function should not be set to NULL, because it may used to -uninit resource. - -Signed-off-by: Wenkai Lin ---- - include/wd_util.h | 7 ++-- - wd_aead.c | 4 +-- - wd_cipher.c | 4 +-- - wd_comp.c | 4 +-- - wd_dh.c | 4 +-- - wd_digest.c | 4 +-- - wd_ecc.c | 4 +-- - wd_rsa.c | 4 +-- - wd_util.c | 88 ++++++++++++++++++++++++++++++----------------- - 9 files changed, 74 insertions(+), 49 deletions(-) - -diff --git a/include/wd_util.h b/include/wd_util.h -index ef95907..2d3c1e4 100644 ---- a/include/wd_util.h -+++ b/include/wd_util.h -@@ -66,8 +66,6 @@ struct wd_env_config { - struct wd_env_config_per_numa *config_per_numa; - /* Let's make it as a gobal config, not per numa */ - bool enable_internal_poll; -- int (*alg_poll_ctx)(__u32, __u32, __u32 *); -- void (*alg_uninit)(void); - - /* resource config */ - struct wd_sched *sched; -@@ -263,8 +261,11 @@ int wd_alg_env_init(struct wd_env_config *config, - * wd_alg_env_uninit() - uninit specific wd algorithm environment configuration. - * @config: Pointer of wd_env_config which is used to store environment - * variable information. -+ * @ops: Define functions which will be used by specific wd algorithm -+ * environment init. - */ --void wd_alg_env_uninit(struct wd_env_config *env_config); -+void wd_alg_env_uninit(struct wd_env_config *env_config, -+ const struct wd_alg_ops *ops); - - /* - * wd_add_task_to_async_queue() - Add an async request to its related async -diff --git a/wd_aead.c b/wd_aead.c -index 670bb33..32d06ec 100644 ---- a/wd_aead.c -+++ b/wd_aead.c -@@ -716,7 +716,7 @@ int wd_aead_env_init(struct wd_sched *sched) - - void wd_aead_env_uninit(void) - { -- return wd_alg_env_uninit(&wd_aead_env_config); -+ return wd_alg_env_uninit(&wd_aead_env_config, &wd_aead_ops); - } - - int wd_aead_ctx_num_init(__u32 node, __u32 type, __u32 num, __u8 mode) -@@ -734,7 +734,7 @@ int wd_aead_ctx_num_init(__u32 node, __u32 type, __u32 num, __u8 mode) - - void wd_aead_ctx_num_uninit(void) - { -- return wd_alg_env_uninit(&wd_aead_env_config); -+ return wd_alg_env_uninit(&wd_aead_env_config, &wd_aead_ops); - } - - int wd_aead_get_env_param(__u32 node, __u32 type, __u32 mode, -diff --git a/wd_cipher.c b/wd_cipher.c -index 85f7e65..5be3123 100644 ---- a/wd_cipher.c -+++ b/wd_cipher.c -@@ -634,7 +634,7 @@ int wd_cipher_env_init(struct wd_sched *sched) - - void wd_cipher_env_uninit(void) - { -- return wd_alg_env_uninit(&wd_cipher_env_config); -+ return wd_alg_env_uninit(&wd_cipher_env_config, &wd_cipher_ops); - } - - int wd_cipher_ctx_num_init(__u32 node, __u32 type, __u32 num, __u8 mode) -@@ -652,7 +652,7 @@ int wd_cipher_ctx_num_init(__u32 node, __u32 type, __u32 num, __u8 mode) - - void wd_cipher_ctx_num_uninit(void) - { -- return wd_alg_env_uninit(&wd_cipher_env_config); -+ return wd_alg_env_uninit(&wd_cipher_env_config, &wd_cipher_ops); - } - - int wd_cipher_get_env_param(__u32 node, __u32 type, __u32 mode, -diff --git a/wd_comp.c b/wd_comp.c -index fc355a9..7868551 100644 ---- a/wd_comp.c -+++ b/wd_comp.c -@@ -775,7 +775,7 @@ int wd_comp_env_init(struct wd_sched *sched) - - void wd_comp_env_uninit(void) - { -- return wd_alg_env_uninit(&wd_comp_env_config); -+ return wd_alg_env_uninit(&wd_comp_env_config, &wd_comp_ops); - } - - int wd_comp_ctx_num_init(__u32 node, __u32 type, __u32 num, __u8 mode) -@@ -798,7 +798,7 @@ int wd_comp_ctx_num_init(__u32 node, __u32 type, __u32 num, __u8 mode) - - void wd_comp_ctx_num_uninit(void) - { -- return wd_alg_env_uninit(&wd_comp_env_config); -+ return wd_alg_env_uninit(&wd_comp_env_config, &wd_comp_ops); - } - - int wd_comp_get_env_param(__u32 node, __u32 type, __u32 mode, -diff --git a/wd_dh.c b/wd_dh.c -index 7b849ac..1784099 100644 ---- a/wd_dh.c -+++ b/wd_dh.c -@@ -564,7 +564,7 @@ int wd_dh_env_init(struct wd_sched *sched) - - void wd_dh_env_uninit(void) - { -- return wd_alg_env_uninit(&wd_dh_env_config); -+ return wd_alg_env_uninit(&wd_dh_env_config, &wd_dh_ops); - } - - int wd_dh_ctx_num_init(__u32 node, __u32 type, __u32 num, __u8 mode) -@@ -582,7 +582,7 @@ int wd_dh_ctx_num_init(__u32 node, __u32 type, __u32 num, __u8 mode) - - void wd_dh_ctx_num_uninit(void) - { -- return wd_alg_env_uninit(&wd_dh_env_config); -+ return wd_alg_env_uninit(&wd_dh_env_config, &wd_dh_ops); - } - - int wd_dh_get_env_param(__u32 node, __u32 type, __u32 mode, -diff --git a/wd_digest.c b/wd_digest.c -index 2b3661d..525d6a9 100644 ---- a/wd_digest.c -+++ b/wd_digest.c -@@ -525,7 +525,7 @@ int wd_digest_env_init(struct wd_sched *sched) - - void wd_digest_env_uninit(void) - { -- return wd_alg_env_uninit(&wd_digest_env_config); -+ return wd_alg_env_uninit(&wd_digest_env_config, &wd_digest_ops); - } - - int wd_digest_ctx_num_init(__u32 node, __u32 type, __u32 num, __u8 mode) -@@ -543,7 +543,7 @@ int wd_digest_ctx_num_init(__u32 node, __u32 type, __u32 num, __u8 mode) - - void wd_digest_ctx_num_uninit(void) - { -- return wd_alg_env_uninit(&wd_digest_env_config); -+ return wd_alg_env_uninit(&wd_digest_env_config, &wd_digest_ops); - } - - int wd_digest_get_env_param(__u32 node, __u32 type, __u32 mode, -diff --git a/wd_ecc.c b/wd_ecc.c -index e37fb39..e324473 100644 ---- a/wd_ecc.c -+++ b/wd_ecc.c -@@ -2286,7 +2286,7 @@ int wd_ecc_env_init(struct wd_sched *sched) - - void wd_ecc_env_uninit(void) - { -- return wd_alg_env_uninit(&wd_ecc_env_config); -+ return wd_alg_env_uninit(&wd_ecc_env_config, &wd_ecc_ops); - } - - int wd_ecc_ctx_num_init(__u32 node, __u32 type, __u32 num, __u8 mode) -@@ -2304,7 +2304,7 @@ int wd_ecc_ctx_num_init(__u32 node, __u32 type, __u32 num, __u8 mode) - - void wd_ecc_ctx_num_uninit(void) - { -- return wd_alg_env_uninit(&wd_ecc_env_config); -+ return wd_alg_env_uninit(&wd_ecc_env_config, &wd_ecc_ops); - } - - int wd_ecc_get_env_param(__u32 node, __u32 type, __u32 mode, -diff --git a/wd_rsa.c b/wd_rsa.c -index b6cc0d1..1f911b4 100644 ---- a/wd_rsa.c -+++ b/wd_rsa.c -@@ -1160,7 +1160,7 @@ int wd_rsa_env_init(struct wd_sched *sched) - - void wd_rsa_env_uninit(void) - { -- return wd_alg_env_uninit(&wd_rsa_env_config); -+ return wd_alg_env_uninit(&wd_rsa_env_config, &wd_rsa_ops); - } - - int wd_rsa_ctx_num_init(__u32 node, __u32 type, __u32 num, __u8 mode) -@@ -1178,7 +1178,7 @@ int wd_rsa_ctx_num_init(__u32 node, __u32 type, __u32 num, __u8 mode) - - void wd_rsa_ctx_num_uninit(void) - { -- return wd_alg_env_uninit(&wd_rsa_env_config); -+ return wd_alg_env_uninit(&wd_rsa_env_config, &wd_rsa_ops); - } - - int wd_rsa_get_env_param(__u32 node, __u32 type, __u32 mode, -diff --git a/wd_util.c b/wd_util.c -index 6cae768..38599c2 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -868,11 +868,27 @@ static int wd_parse_ctx_attr(struct wd_env_config *env_config, - } - - static int wd_init_env_config(struct wd_env_config *config, -- struct wd_ctx_attr *attr) -+ struct wd_ctx_attr *attr, -+ const struct wd_alg_ops *ops, -+ const struct wd_config_variable *table, -+ __u32 table_size) - { -+ config->op_type_num = ops->op_type_num; -+ config->table_size = table_size; -+ config->table = table; -+ - return attr ? wd_parse_ctx_attr(config, attr) : wd_parse_env(config); - } - -+static void wd_uninit_env_config(struct wd_env_config *config) -+{ -+ config->op_type_num = 0; -+ config->table_size = 0; -+ config->table = NULL; -+ -+ wd_free_env(config); -+} -+ - static __u8 get_ctx_mode(struct wd_env_config_per_numa *config, int idx) - { - struct wd_ctx_range **ctx_table = config->ctx_table; -@@ -1051,7 +1067,8 @@ static int wd_sched_fill_table(struct wd_env_config_per_numa *config_numa, - return 0; - } - --static int wd_init_sched_config(struct wd_env_config *config) -+static int wd_init_sched_config(struct wd_env_config *config, -+ void *alg_poll_ctx) - { - struct wd_env_config_per_numa *config_numa; - int i, j, ret, max_node, type_num; -@@ -1063,7 +1080,7 @@ static int wd_init_sched_config(struct wd_env_config *config) - return -WD_EINVAL; - - if (!config->enable_internal_poll) -- func = config->alg_poll_ctx; -+ func = alg_poll_ctx; - - config->internal_sched = false; - type_num = config->op_type_num; -@@ -1340,7 +1357,8 @@ static void wd_uninit_one_task_queue(struct async_task_queue *task_queue) - } - - static int wd_init_async_polling_thread_per_numa(struct wd_env_config *config, -- struct wd_env_config_per_numa *config_numa) -+ struct wd_env_config_per_numa *config_numa, -+ void *alg_poll_ctx) - { - struct async_task_queue *task_queue, *queue_head; - int i, j, ret; -@@ -1365,7 +1383,7 @@ static int wd_init_async_polling_thread_per_numa(struct wd_env_config *config, - - task_queue = queue_head; - for (i = 0; i < num; task_queue++, i++) { -- ret = wd_init_one_task_queue(task_queue, config->alg_poll_ctx); -+ ret = wd_init_one_task_queue(task_queue, alg_poll_ctx); - if (ret) { - for (j = 0; j < i; task_queue++, j++) - wd_uninit_one_task_queue(task_queue); -@@ -1386,6 +1404,9 @@ static void wd_uninit_async_polling_thread_per_numa(struct wd_env_config *cfg, - double num; - int i; - -+ if (!config_numa || !config_numa->async_task_queue_array) -+ return; -+ - head = config_numa->async_task_queue_array; - task_queue = head; - num = fmin(config_numa->async_poll_num, config_numa->async_ctx_num); -@@ -1396,7 +1417,8 @@ static void wd_uninit_async_polling_thread_per_numa(struct wd_env_config *cfg, - config_numa->async_task_queue_array = NULL; - } - --static int wd_init_async_polling_thread(struct wd_env_config *config) -+static int wd_init_async_polling_thread(struct wd_env_config *config, -+ void *alg_poll_ctx) - { - struct wd_env_config_per_numa *config_numa; - int i, ret; -@@ -1405,12 +1427,19 @@ static int wd_init_async_polling_thread(struct wd_env_config *config) - return 0; - - FOREACH_NUMA(i, config, config_numa) { -- ret = wd_init_async_polling_thread_per_numa(config, config_numa); -+ ret = wd_init_async_polling_thread_per_numa(config, config_numa, -+ alg_poll_ctx); - if (ret) -- return ret; -+ goto out; - } - - return 0; -+ -+out: -+ FOREACH_NUMA(i, config, config_numa) -+ wd_uninit_async_polling_thread_per_numa(config, config_numa); -+ -+ return ret; - } - - static void wd_uninit_async_polling_thread(struct wd_env_config *config) -@@ -1434,7 +1463,7 @@ static int wd_init_resource(struct wd_env_config *config, - if (ret) - return ret; - -- ret = wd_init_sched_config(config); -+ ret = wd_init_sched_config(config, ops->alg_poll_ctx); - if (ret) - goto err_uninit_ctx; - -@@ -1442,7 +1471,7 @@ static int wd_init_resource(struct wd_env_config *config, - if (ret) - goto err_uninit_sched; - -- ret = wd_init_async_polling_thread(config); -+ ret = wd_init_async_polling_thread(config, ops->alg_poll_ctx); - if (ret) - goto err_uninit_alg; - -@@ -1461,13 +1490,19 @@ err_uninit_ctx: - return ret; - } - --static void wd_uninit_resource(struct wd_env_config *config) -+static void wd_uninit_resource(struct wd_env_config *config, -+ const struct wd_alg_ops *ops) - { - wd_uninit_async_polling_thread(config); -- config->alg_uninit(); -- if (config->internal_sched) -+ ops->alg_uninit(); -+ -+ if (config->internal_sched) { - wd_uninit_sched_config(config->sched); -+ config->sched = NULL; -+ } -+ - wd_free_ctx(config->ctx_config); -+ config->ctx_config = NULL; - } - - int wd_alg_env_init(struct wd_env_config *env_config, -@@ -1478,43 +1513,32 @@ int wd_alg_env_init(struct wd_env_config *env_config, - { - int ret; - -- env_config->op_type_num = ops->op_type_num; -- env_config->alg_poll_ctx = ops->alg_poll_ctx; -- env_config->table = table; -- env_config->table_size = table_size; -- - ret = wd_alloc_numa(env_config, ops); - if (ret) - return ret; - -- ret = wd_init_env_config(env_config, ctx_attr); -+ ret = wd_init_env_config(env_config, ctx_attr, ops, table, table_size); - if (ret) - goto free_numa; - - ret = wd_init_resource(env_config, ops); - if (ret) -- goto free_env; -- -- /* Use alg_uninit as a sign of initialization complete */ -- env_config->alg_uninit = ops->alg_uninit; -+ goto uninit_env_config; - - return 0; - --free_env: -- wd_free_env(env_config); -+uninit_env_config: -+ wd_uninit_env_config(env_config); - free_numa: - wd_free_numa(env_config); - return ret; - } - --void wd_alg_env_uninit(struct wd_env_config *env_config) -+void wd_alg_env_uninit(struct wd_env_config *env_config, -+ const struct wd_alg_ops *ops) - { -- /* Check whether the initialization is complete */ -- if (!env_config->alg_uninit) -- return; -- -- wd_uninit_resource(env_config); -- wd_free_env(env_config); -+ wd_uninit_resource(env_config, ops); -+ wd_uninit_env_config(env_config); - wd_free_numa(env_config); - } - --- -2.25.1 - diff --git a/0044-uadk-fix-wd_free_ctx-and-wd_uninit_sched_config.patch b/0044-uadk-fix-wd_free_ctx-and-wd_uninit_sched_config.patch deleted file mode 100644 index bda682b..0000000 --- a/0044-uadk-fix-wd_free_ctx-and-wd_uninit_sched_config.patch +++ /dev/null @@ -1,140 +0,0 @@ -From e4a3312ea000abb796d513c59a8ae10dd9ef605b Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sat, 15 Jan 2022 16:54:00 +0800 -Subject: [PATCH 47/53] uadk: fix wd_free_ctx and wd_uninit_sched_config - -wd_free_ctx and wd_uninit_sched_config not use struct wd_env_config -as an input parameter, they need to clear wd_env_config member outside, -so optimize it to set null within the function. - -Signed-off-by: Wenkai Lin ---- - wd_util.c | 51 ++++++++++++++++++++++++--------------------------- - 1 file changed, 24 insertions(+), 27 deletions(-) - -diff --git a/wd_util.c b/wd_util.c -index 38599c2..8ad2bd0 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -1027,14 +1027,18 @@ err_free_ctx_config: - return ret; - } - --static void wd_free_ctx(struct wd_ctx_config *ctx_config) -+static void wd_free_ctx(struct wd_env_config *config) - { -- if (!ctx_config) -+ struct wd_ctx_config *ctx_config; -+ -+ if (!config->ctx_config) - return; - -+ ctx_config = config->ctx_config; - wd_put_wd_ctx(ctx_config, ctx_config->ctx_num); - free(ctx_config->ctxs); - free(ctx_config); -+ config->ctx_config = NULL; - } - - static int wd_sched_fill_table(struct wd_env_config_per_numa *config_numa, -@@ -1067,14 +1071,23 @@ static int wd_sched_fill_table(struct wd_env_config_per_numa *config_numa, - return 0; - } - -+static void wd_uninit_sched_config(struct wd_env_config *config) -+{ -+ if (!config->sched || !config->internal_sched) -+ return; -+ -+ wd_sched_rr_release(config->sched); -+ config->sched = NULL; -+} -+ - static int wd_init_sched_config(struct wd_env_config *config, - void *alg_poll_ctx) - { - struct wd_env_config_per_numa *config_numa; - int i, j, ret, max_node, type_num; -- struct wd_sched *sched; - void *func = NULL; - -+ type_num = config->op_type_num; - max_node = numa_max_node() + 1; - if (max_node <= 0) - return -WD_EINVAL; -@@ -1083,7 +1096,6 @@ static int wd_init_sched_config(struct wd_env_config *config, - func = alg_poll_ctx; - - config->internal_sched = false; -- type_num = config->op_type_num; - if (!config->sched) { - WD_ERR("no sched is specified, alloc a default sched!\n"); - config->sched = wd_sched_rr_alloc(SCHED_POLICY_RR, type_num, -@@ -1094,13 +1106,12 @@ static int wd_init_sched_config(struct wd_env_config *config, - config->internal_sched = true; - } - -- sched = config->sched; -- sched->name = "SCHED_RR"; -+ config->sched->name = "SCHED_RR"; - - FOREACH_NUMA(i, config, config_numa) { - for (j = 0; j < CTX_MODE_MAX; j++) { - ret = wd_sched_fill_table(config_numa, -- sched, j, -+ config->sched, j, - type_num); - if (ret) - goto err_release_sched; -@@ -1110,13 +1121,9 @@ static int wd_init_sched_config(struct wd_env_config *config, - return 0; - - err_release_sched: -- wd_sched_rr_release(sched); -- return ret; --} -+ wd_uninit_sched_config(config); - --static void wd_uninit_sched_config(struct wd_sched *sched_config) --{ -- return wd_sched_rr_release(sched_config); -+ return ret; - } - - static struct async_task_queue *find_async_queue(struct wd_env_config *config, -@@ -1480,13 +1487,9 @@ static int wd_init_resource(struct wd_env_config *config, - err_uninit_alg: - ops->alg_uninit(); - err_uninit_sched: -- if (config->internal_sched) { -- wd_uninit_sched_config(config->sched); -- config->sched = NULL; -- } -+ wd_uninit_sched_config(config); - err_uninit_ctx: -- wd_free_ctx(config->ctx_config); -- config->ctx_config = NULL; -+ wd_free_ctx(config); - return ret; - } - -@@ -1495,14 +1498,8 @@ static void wd_uninit_resource(struct wd_env_config *config, - { - wd_uninit_async_polling_thread(config); - ops->alg_uninit(); -- -- if (config->internal_sched) { -- wd_uninit_sched_config(config->sched); -- config->sched = NULL; -- } -- -- wd_free_ctx(config->ctx_config); -- config->ctx_config = NULL; -+ wd_uninit_sched_config(config); -+ wd_free_ctx(config); - } - - int wd_alg_env_init(struct wd_env_config *env_config, --- -2.25.1 - diff --git a/0045-uadk-env-fix-free-ctx-table-memory-leak.patch b/0045-uadk-env-fix-free-ctx-table-memory-leak.patch deleted file mode 100644 index e83abf8..0000000 --- a/0045-uadk-env-fix-free-ctx-table-memory-leak.patch +++ /dev/null @@ -1,206 +0,0 @@ -From 8ad7bf917ea2940042e707cf37187d2623004bbc Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sat, 15 Jan 2022 16:54:01 +0800 -Subject: [PATCH 48/53] uadk: env: fix free ctx table memory leak - -Add wd_free_ctx_table to free ctx table of all numa and -wd_free_ctx_table_per_numa to free single numa's ctx table. - -Signed-off-by: Wenkai Lin ---- - include/wd_util.h | 2 +- - wd_util.c | 79 +++++++++++++++++++++++------------------------ - 2 files changed, 40 insertions(+), 41 deletions(-) - -diff --git a/include/wd_util.h b/include/wd_util.h -index 2d3c1e4..c07ecce 100644 ---- a/include/wd_util.h -+++ b/include/wd_util.h -@@ -16,7 +16,7 @@ extern "C" { - - #define FOREACH_NUMA(i, config, config_numa) \ - for (i = 0, config_numa = config->config_per_numa; \ -- i < config->numa_num; config_numa++, i++) -+ config_numa && i < config->numa_num; config_numa++, i++) - - struct wd_async_msg_pool { - struct msg_pool *pools; -diff --git a/wd_util.c b/wd_util.c -index 8ad2bd0..7fa688d 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -351,9 +351,6 @@ static void wd_free_numa(struct wd_env_config *config) - struct wd_env_config_per_numa *config_numa; - int i; - -- if (!config->config_per_numa) -- return; -- - FOREACH_NUMA(i, config, config_numa) - free(config_numa->dev); - -@@ -566,12 +563,12 @@ out: - return -WD_EINVAL; - } - --static int wd_alloc_ctx_table(struct wd_env_config_per_numa *config_numa) -+static int wd_alloc_ctx_table_per_numa(struct wd_env_config_per_numa *config) - { - struct wd_ctx_range **ctx_table; - int i, j, ret; - -- if (config_numa->ctx_table) -+ if (config->ctx_table) - return 0; - - ctx_table = calloc(1, sizeof(struct wd_ctx_range *) * CTX_MODE_MAX); -@@ -581,27 +578,48 @@ static int wd_alloc_ctx_table(struct wd_env_config_per_numa *config_numa) - for (i = 0; i < CTX_MODE_MAX; i++) { - ctx_table[i] = calloc(1, - sizeof(struct wd_ctx_range) * -- config_numa->op_type_num); -+ config->op_type_num); - if (!ctx_table[i]) { - ret = -WD_ENOMEM; - goto free_mem; - } - } - -- config_numa->ctx_table = ctx_table; -+ config->ctx_table = ctx_table; - - return 0; - - free_mem: -- for (j = 0; j < i; j++) { -+ for (j = 0; j < i; j++) - free(ctx_table[j]); -- ctx_table[j] = NULL; -- } - - free(ctx_table); - return ret; - } - -+static void wd_free_ctx_table_per_numa(struct wd_env_config_per_numa *config) -+{ -+ int i; -+ -+ if (!config->ctx_table) -+ return; -+ -+ for (i = 0; i < CTX_MODE_MAX; i++) -+ free(config->ctx_table[i]); -+ -+ free(config->ctx_table); -+ config->ctx_table = NULL; -+} -+ -+static void wd_free_ctx_table(struct wd_env_config *config) -+{ -+ struct wd_env_config_per_numa *config_numa; -+ int i; -+ -+ FOREACH_NUMA(i, config, config_numa) -+ wd_free_ctx_table_per_numa(config_numa); -+} -+ - static int get_and_fill_ctx_num(struct wd_env_config_per_numa *config_numa, - const char *p, int ctx_num) - { -@@ -655,15 +673,18 @@ static int wd_parse_section(struct wd_env_config *config, char *section) - } - - config_numa->op_type_num = config->op_type_num; -- ret = wd_alloc_ctx_table(config_numa); -+ ret = wd_alloc_ctx_table_per_numa(config_numa); - if (ret) - return ret; - - ret = get_and_fill_ctx_num(config_numa, section, ctx_num); -- if (ret) -+ if (ret) { - WD_ERR("%s got wrong ctx type: %s!\n", __func__, section); -+ wd_free_ctx_table_per_numa(config_numa); -+ return ret; -+ } - -- return ret; -+ return 0; - } - - static int get_start_ctx_index(struct wd_env_config *config, -@@ -722,9 +743,8 @@ static void wd_fill_ctx_table(struct wd_env_config *config) - - static int parse_ctx_num(struct wd_env_config *config, const char *s) - { -- struct wd_env_config_per_numa *config_numa; - char *left, *section, *start; -- int i, ret; -+ int ret; - - start = strdup(s); - if (!start) -@@ -744,9 +764,7 @@ static int parse_ctx_num(struct wd_env_config *config, const char *s) - return 0; - - err_free_ctx_table: -- FOREACH_NUMA(i, config, config_numa) -- free(config_numa->ctx_table); -- -+ wd_free_ctx_table(config); - free(start); - return ret; - } -@@ -820,25 +838,6 @@ static int wd_parse_env(struct wd_env_config *config) - return 0; - } - --static void wd_free_env(struct wd_env_config *config) --{ -- struct wd_env_config_per_numa *config_numa; -- int i, j; -- -- if (!config->config_per_numa) -- return; -- -- FOREACH_NUMA(i, config, config_numa) { -- if (!config_numa->ctx_table) -- continue; -- -- for (j = 0; j < CTX_MODE_MAX; j++) -- free(config_numa->ctx_table[j]); -- -- free(config_numa->ctx_table); -- } --} -- - static int wd_parse_ctx_attr(struct wd_env_config *env_config, - struct wd_ctx_attr *attr) - { -@@ -852,7 +851,7 @@ static int wd_parse_ctx_attr(struct wd_env_config *env_config, - } - - config_numa->op_type_num = env_config->op_type_num; -- ret = wd_alloc_ctx_table(config_numa); -+ ret = wd_alloc_ctx_table_per_numa(config_numa); - if (ret) - return ret; - -@@ -882,11 +881,11 @@ static int wd_init_env_config(struct wd_env_config *config, - - static void wd_uninit_env_config(struct wd_env_config *config) - { -+ wd_free_ctx_table(config); -+ - config->op_type_num = 0; - config->table_size = 0; - config->table = NULL; -- -- wd_free_env(config); - } - - static __u8 get_ctx_mode(struct wd_env_config_per_numa *config, int idx) --- -2.25.1 - diff --git a/0046-uadk-remove-uadk_benchmark-binary-and-header-file.patch b/0046-uadk-remove-uadk_benchmark-binary-and-header-file.patch deleted file mode 100644 index 2909e64..0000000 --- a/0046-uadk-remove-uadk_benchmark-binary-and-header-file.patch +++ /dev/null @@ -1,32869 +0,0 @@ -From b77869c86aa88e3d32260a0cd8563a24c07071fe Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Mon, 21 Feb 2022 03:11:35 +0000 -Subject: [PATCH 50/53] uadk: remove uadk_benchmark binary and header file - -Binary files and openssl header files should not -be added to uadk, so remove it. - -Signed-off-by: Wenkai Lin ---- - uadk_tool/Makefile.am | 22 +- - uadk_tool/include/openssl/aes.h | 92 - - uadk_tool/include/openssl/asn1.h | 886 ---- - uadk_tool/include/openssl/asn1_mac.h | 10 - - uadk_tool/include/openssl/asn1err.h | 256 -- - uadk_tool/include/openssl/asn1t.h | 945 ---- - uadk_tool/include/openssl/async.h | 76 - - uadk_tool/include/openssl/asyncerr.h | 42 - - uadk_tool/include/openssl/bio.h | 801 ---- - uadk_tool/include/openssl/bioerr.h | 124 - - uadk_tool/include/openssl/blowfish.h | 61 - - uadk_tool/include/openssl/bn.h | 539 --- - uadk_tool/include/openssl/bnerr.h | 100 - - uadk_tool/include/openssl/buffer.h | 58 - - uadk_tool/include/openssl/buffererr.h | 34 - - uadk_tool/include/openssl/camellia.h | 83 - - uadk_tool/include/openssl/cast.h | 53 - - uadk_tool/include/openssl/cmac.h | 41 - - uadk_tool/include/openssl/cms.h | 339 -- - uadk_tool/include/openssl/cmserr.h | 202 - - uadk_tool/include/openssl/comp.h | 53 - - uadk_tool/include/openssl/comperr.h | 44 - - uadk_tool/include/openssl/conf.h | 168 - - uadk_tool/include/openssl/conf_api.h | 40 - - uadk_tool/include/openssl/conferr.h | 76 - - uadk_tool/include/openssl/crypto.h | 445 -- - uadk_tool/include/openssl/cryptoerr.h | 57 - - uadk_tool/include/openssl/ct.h | 474 --- - uadk_tool/include/openssl/cterr.h | 80 - - uadk_tool/include/openssl/des.h | 174 - - uadk_tool/include/openssl/dh.h | 340 -- - uadk_tool/include/openssl/dherr.h | 88 - - uadk_tool/include/openssl/dsa.h | 244 -- - uadk_tool/include/openssl/dsaerr.h | 72 - - uadk_tool/include/openssl/dtls1.h | 55 - - uadk_tool/include/openssl/e_os2.h | 301 -- - uadk_tool/include/openssl/ebcdic.h | 33 - - uadk_tool/include/openssl/ec.h | 1484 ------- - uadk_tool/include/openssl/ecdh.h | 10 - - uadk_tool/include/openssl/ecdsa.h | 10 - - uadk_tool/include/openssl/ecerr.h | 276 -- - uadk_tool/include/openssl/engine.h | 751 ---- - uadk_tool/include/openssl/engineerr.h | 111 - - uadk_tool/include/openssl/err.h | 274 -- - uadk_tool/include/openssl/evp.h | 1666 -------- - uadk_tool/include/openssl/evperr.h | 204 - - uadk_tool/include/openssl/hmac.h | 51 - - uadk_tool/include/openssl/idea.h | 64 - - uadk_tool/include/openssl/kdf.h | 97 - - uadk_tool/include/openssl/kdferr.h | 55 - - uadk_tool/include/openssl/lhash.h | 241 -- - uadk_tool/include/openssl/md2.h | 44 - - uadk_tool/include/openssl/md4.h | 51 - - uadk_tool/include/openssl/md5.h | 50 - - uadk_tool/include/openssl/mdc2.h | 42 - - uadk_tool/include/openssl/modes.h | 208 - - uadk_tool/include/openssl/obj_mac.h | 5198 ----------------------- - uadk_tool/include/openssl/objects.h | 175 - - uadk_tool/include/openssl/objectserr.h | 42 - - uadk_tool/include/openssl/ocsp.h | 352 -- - uadk_tool/include/openssl/ocsperr.h | 78 - - uadk_tool/include/openssl/opensslconf.h | 197 - - uadk_tool/include/openssl/opensslv.h | 101 - - uadk_tool/include/openssl/ossl_typ.h | 197 - - uadk_tool/include/openssl/pem.h | 378 -- - uadk_tool/include/openssl/pem2.h | 13 - - uadk_tool/include/openssl/pemerr.h | 105 - - uadk_tool/include/openssl/pkcs12.h | 223 - - uadk_tool/include/openssl/pkcs12err.h | 81 - - uadk_tool/include/openssl/pkcs7.h | 319 -- - uadk_tool/include/openssl/pkcs7err.h | 103 - - uadk_tool/include/openssl/rand.h | 77 - - uadk_tool/include/openssl/rand_drbg.h | 130 - - uadk_tool/include/openssl/randerr.h | 94 - - uadk_tool/include/openssl/rc2.h | 51 - - uadk_tool/include/openssl/rc4.h | 36 - - uadk_tool/include/openssl/rc5.h | 63 - - uadk_tool/include/openssl/ripemd.h | 47 - - uadk_tool/include/openssl/rsa.h | 513 --- - uadk_tool/include/openssl/rsaerr.h | 167 - - uadk_tool/include/openssl/safestack.h | 207 - - uadk_tool/include/openssl/seed.h | 96 - - uadk_tool/include/openssl/sha.h | 119 - - uadk_tool/include/openssl/srp.h | 135 - - uadk_tool/include/openssl/srtp.h | 50 - - uadk_tool/include/openssl/ssl.h | 2438 ----------- - uadk_tool/include/openssl/ssl2.h | 24 - - uadk_tool/include/openssl/ssl3.h | 342 -- - uadk_tool/include/openssl/sslerr.h | 776 ---- - uadk_tool/include/openssl/stack.h | 83 - - uadk_tool/include/openssl/store.h | 266 -- - uadk_tool/include/openssl/storeerr.h | 91 - - uadk_tool/include/openssl/symhacks.h | 37 - - uadk_tool/include/openssl/tls1.h | 1237 ------ - uadk_tool/include/openssl/ts.h | 559 --- - uadk_tool/include/openssl/tserr.h | 132 - - uadk_tool/include/openssl/txt_db.h | 57 - - uadk_tool/include/openssl/ui.h | 368 -- - uadk_tool/include/openssl/uierr.h | 65 - - uadk_tool/include/openssl/whrlpool.h | 48 - - uadk_tool/include/openssl/x509.h | 1050 ----- - uadk_tool/include/openssl/x509_vfy.h | 632 --- - uadk_tool/include/openssl/x509err.h | 129 - - uadk_tool/include/openssl/x509v3.h | 938 ---- - uadk_tool/include/openssl/x509v3err.h | 164 - - uadk_tool/uadk_benchmark.c | 2 + - 106 files changed, 20 insertions(+), 31962 deletions(-) - delete mode 100644 uadk_tool/include/openssl/aes.h - delete mode 100644 uadk_tool/include/openssl/asn1.h - delete mode 100644 uadk_tool/include/openssl/asn1_mac.h - delete mode 100644 uadk_tool/include/openssl/asn1err.h - delete mode 100644 uadk_tool/include/openssl/asn1t.h - delete mode 100644 uadk_tool/include/openssl/async.h - delete mode 100644 uadk_tool/include/openssl/asyncerr.h - delete mode 100644 uadk_tool/include/openssl/bio.h - delete mode 100644 uadk_tool/include/openssl/bioerr.h - delete mode 100644 uadk_tool/include/openssl/blowfish.h - delete mode 100644 uadk_tool/include/openssl/bn.h - delete mode 100644 uadk_tool/include/openssl/bnerr.h - delete mode 100644 uadk_tool/include/openssl/buffer.h - delete mode 100644 uadk_tool/include/openssl/buffererr.h - delete mode 100644 uadk_tool/include/openssl/camellia.h - delete mode 100644 uadk_tool/include/openssl/cast.h - delete mode 100644 uadk_tool/include/openssl/cmac.h - delete mode 100644 uadk_tool/include/openssl/cms.h - delete mode 100644 uadk_tool/include/openssl/cmserr.h - delete mode 100644 uadk_tool/include/openssl/comp.h - delete mode 100644 uadk_tool/include/openssl/comperr.h - delete mode 100644 uadk_tool/include/openssl/conf.h - delete mode 100644 uadk_tool/include/openssl/conf_api.h - delete mode 100644 uadk_tool/include/openssl/conferr.h - delete mode 100644 uadk_tool/include/openssl/crypto.h - delete mode 100644 uadk_tool/include/openssl/cryptoerr.h - delete mode 100644 uadk_tool/include/openssl/ct.h - delete mode 100644 uadk_tool/include/openssl/cterr.h - delete mode 100644 uadk_tool/include/openssl/des.h - delete mode 100644 uadk_tool/include/openssl/dh.h - delete mode 100644 uadk_tool/include/openssl/dherr.h - delete mode 100644 uadk_tool/include/openssl/dsa.h - delete mode 100644 uadk_tool/include/openssl/dsaerr.h - delete mode 100644 uadk_tool/include/openssl/dtls1.h - delete mode 100644 uadk_tool/include/openssl/e_os2.h - delete mode 100644 uadk_tool/include/openssl/ebcdic.h - delete mode 100644 uadk_tool/include/openssl/ec.h - delete mode 100644 uadk_tool/include/openssl/ecdh.h - delete mode 100644 uadk_tool/include/openssl/ecdsa.h - delete mode 100644 uadk_tool/include/openssl/ecerr.h - delete mode 100644 uadk_tool/include/openssl/engine.h - delete mode 100644 uadk_tool/include/openssl/engineerr.h - delete mode 100644 uadk_tool/include/openssl/err.h - delete mode 100644 uadk_tool/include/openssl/evp.h - delete mode 100644 uadk_tool/include/openssl/evperr.h - delete mode 100644 uadk_tool/include/openssl/hmac.h - delete mode 100644 uadk_tool/include/openssl/idea.h - delete mode 100644 uadk_tool/include/openssl/kdf.h - delete mode 100644 uadk_tool/include/openssl/kdferr.h - delete mode 100644 uadk_tool/include/openssl/lhash.h - delete mode 100644 uadk_tool/include/openssl/md2.h - delete mode 100644 uadk_tool/include/openssl/md4.h - delete mode 100644 uadk_tool/include/openssl/md5.h - delete mode 100644 uadk_tool/include/openssl/mdc2.h - delete mode 100644 uadk_tool/include/openssl/modes.h - delete mode 100644 uadk_tool/include/openssl/obj_mac.h - delete mode 100644 uadk_tool/include/openssl/objects.h - delete mode 100644 uadk_tool/include/openssl/objectserr.h - delete mode 100644 uadk_tool/include/openssl/ocsp.h - delete mode 100644 uadk_tool/include/openssl/ocsperr.h - delete mode 100644 uadk_tool/include/openssl/opensslconf.h - delete mode 100644 uadk_tool/include/openssl/opensslv.h - delete mode 100644 uadk_tool/include/openssl/ossl_typ.h - delete mode 100644 uadk_tool/include/openssl/pem.h - delete mode 100644 uadk_tool/include/openssl/pem2.h - delete mode 100644 uadk_tool/include/openssl/pemerr.h - delete mode 100644 uadk_tool/include/openssl/pkcs12.h - delete mode 100644 uadk_tool/include/openssl/pkcs12err.h - delete mode 100644 uadk_tool/include/openssl/pkcs7.h - delete mode 100644 uadk_tool/include/openssl/pkcs7err.h - delete mode 100644 uadk_tool/include/openssl/rand.h - delete mode 100644 uadk_tool/include/openssl/rand_drbg.h - delete mode 100644 uadk_tool/include/openssl/randerr.h - delete mode 100644 uadk_tool/include/openssl/rc2.h - delete mode 100644 uadk_tool/include/openssl/rc4.h - delete mode 100644 uadk_tool/include/openssl/rc5.h - delete mode 100644 uadk_tool/include/openssl/ripemd.h - delete mode 100644 uadk_tool/include/openssl/rsa.h - delete mode 100644 uadk_tool/include/openssl/rsaerr.h - delete mode 100644 uadk_tool/include/openssl/safestack.h - delete mode 100644 uadk_tool/include/openssl/seed.h - delete mode 100644 uadk_tool/include/openssl/sha.h - delete mode 100644 uadk_tool/include/openssl/srp.h - delete mode 100644 uadk_tool/include/openssl/srtp.h - delete mode 100644 uadk_tool/include/openssl/ssl.h - delete mode 100644 uadk_tool/include/openssl/ssl2.h - delete mode 100644 uadk_tool/include/openssl/ssl3.h - delete mode 100644 uadk_tool/include/openssl/sslerr.h - delete mode 100644 uadk_tool/include/openssl/stack.h - delete mode 100644 uadk_tool/include/openssl/store.h - delete mode 100644 uadk_tool/include/openssl/storeerr.h - delete mode 100644 uadk_tool/include/openssl/symhacks.h - delete mode 100644 uadk_tool/include/openssl/tls1.h - delete mode 100644 uadk_tool/include/openssl/ts.h - delete mode 100644 uadk_tool/include/openssl/tserr.h - delete mode 100644 uadk_tool/include/openssl/txt_db.h - delete mode 100644 uadk_tool/include/openssl/ui.h - delete mode 100644 uadk_tool/include/openssl/uierr.h - delete mode 100644 uadk_tool/include/openssl/whrlpool.h - delete mode 100644 uadk_tool/include/openssl/x509.h - delete mode 100644 uadk_tool/include/openssl/x509_vfy.h - delete mode 100644 uadk_tool/include/openssl/x509err.h - delete mode 100644 uadk_tool/include/openssl/x509v3.h - delete mode 100644 uadk_tool/include/openssl/x509v3err.h - -diff --git a/uadk_tool/Makefile.am b/uadk_tool/Makefile.am -index f79a6e3..da5b229 100644 ---- a/uadk_tool/Makefile.am -+++ b/uadk_tool/Makefile.am -@@ -1,13 +1,13 @@ - ACLOCAL_AMFLAGS = -I m4 -I./include - AM_CFLAGS=-Wall -fno-strict-aliasing -I$(top_srcdir) -I$(top_srcdir)/include \ -- -I$(top_srcdir)/uadk_tool/include -pthread -+ -pthread - - #AUTOMAKE_OPTIONS = subdir-objects - - bin_PROGRAMS=uadk_tool - - uadk_tool_SOURCES=uadk_tool.c uadk_dfx.c uadk_benchmark.c \ -- sec_uadk_benchmark.c sec_wd_benchmark.c sec_soft_benchmark.c -+ sec_uadk_benchmark.c sec_wd_benchmark.c - - if WD_STATIC_DRV - AM_CFLAGS+=-Bstatic -@@ -16,9 +16,23 @@ uadk_tool_LDADD=$(libwd_la_OBJECTS) \ - ../.libs/libhisi_sec.a \ - ../.libs/libhisi_hpre.a \ - ../.libs/libhisi_zip.a \ -- $(top_srcdir)/uadk_tool/include/libcrypto.a -ldl -lnuma -+ -ldl -lnuma - else - uadk_tool_LDADD=-L../.libs -l:libwd.so.2 -l:libwd_crypto.so.2 \ -- -L$(top_srcdir)/uadk_tool/include -l:libcrypto.so.1.1 -lnuma -+ -lnuma - endif -+ - uadk_tool_LDFLAGS=-Wl,-rpath,'/usr/local/lib' -+ -+if WITH_OPENSSL_DIR -+AM_CFLAGS+= -DWITH_OPENSSL_DIR -I$(with_openssl_dir)/include -+ -+uadk_tool_SOURCES+=sec_soft_benchmark.c -+ -+if WD_STATIC_DRV -+uadk_tool_LDADD+= $(with_openssl_dir)/libcrypto.a -+else -+uadk_tool_LDADD+= $(with_openssl_dir)/libcrypto.so.1.1 -+endif -+ -+endif -diff --git a/uadk_tool/include/openssl/aes.h b/uadk_tool/include/openssl/aes.h -deleted file mode 100644 -index 245c552..0000000 ---- a/uadk_tool/include/openssl/aes.h -+++ /dev/null -@@ -1,92 +0,0 @@ --/* -- * Copyright 2002-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_AES_H --# define HEADER_AES_H -- --# include -- --# include --# ifdef __cplusplus --extern "C" { --# endif -- --# define AES_ENCRYPT 1 --# define AES_DECRYPT 0 -- --/* -- * Because array size can't be a const in C, the following two are macros. -- * Both sizes are in bytes. -- */ --# define AES_MAXNR 14 --# define AES_BLOCK_SIZE 16 -- --/* This should be a hidden type, but EVP requires that the size be known */ --struct aes_key_st { --# ifdef AES_LONG -- unsigned long rd_key[4 * (AES_MAXNR + 1)]; --# else -- unsigned int rd_key[4 * (AES_MAXNR + 1)]; --# endif -- int rounds; --}; --typedef struct aes_key_st AES_KEY; -- --const char *AES_options(void); -- --int AES_set_encrypt_key(const unsigned char *userKey, const int bits, -- AES_KEY *key); --int AES_set_decrypt_key(const unsigned char *userKey, const int bits, -- AES_KEY *key); -- --void AES_encrypt(const unsigned char *in, unsigned char *out, -- const AES_KEY *key); --void AES_decrypt(const unsigned char *in, unsigned char *out, -- const AES_KEY *key); -- --void AES_ecb_encrypt(const unsigned char *in, unsigned char *out, -- const AES_KEY *key, const int enc); --void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, -- size_t length, const AES_KEY *key, -- unsigned char *ivec, const int enc); --void AES_cfb128_encrypt(const unsigned char *in, unsigned char *out, -- size_t length, const AES_KEY *key, -- unsigned char *ivec, int *num, const int enc); --void AES_cfb1_encrypt(const unsigned char *in, unsigned char *out, -- size_t length, const AES_KEY *key, -- unsigned char *ivec, int *num, const int enc); --void AES_cfb8_encrypt(const unsigned char *in, unsigned char *out, -- size_t length, const AES_KEY *key, -- unsigned char *ivec, int *num, const int enc); --void AES_ofb128_encrypt(const unsigned char *in, unsigned char *out, -- size_t length, const AES_KEY *key, -- unsigned char *ivec, int *num); --/* NB: the IV is _two_ blocks long */ --void AES_ige_encrypt(const unsigned char *in, unsigned char *out, -- size_t length, const AES_KEY *key, -- unsigned char *ivec, const int enc); --/* NB: the IV is _four_ blocks long */ --void AES_bi_ige_encrypt(const unsigned char *in, unsigned char *out, -- size_t length, const AES_KEY *key, -- const AES_KEY *key2, const unsigned char *ivec, -- const int enc); -- --int AES_wrap_key(AES_KEY *key, const unsigned char *iv, -- unsigned char *out, -- const unsigned char *in, unsigned int inlen); --int AES_unwrap_key(AES_KEY *key, const unsigned char *iv, -- unsigned char *out, -- const unsigned char *in, unsigned int inlen); -- -- --# ifdef __cplusplus --} --# endif -- --#endif -diff --git a/uadk_tool/include/openssl/asn1.h b/uadk_tool/include/openssl/asn1.h -deleted file mode 100644 -index 9522eec..0000000 ---- a/uadk_tool/include/openssl/asn1.h -+++ /dev/null -@@ -1,886 +0,0 @@ --/* -- * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_ASN1_H --# define HEADER_ASN1_H -- --# include --# include --# include --# include --# include --# include --# include -- --# include --# if OPENSSL_API_COMPAT < 0x10100000L --# include --# endif -- --# ifdef OPENSSL_BUILD_SHLIBCRYPTO --# undef OPENSSL_EXTERN --# define OPENSSL_EXTERN OPENSSL_EXPORT --# endif -- --#ifdef __cplusplus --extern "C" { --#endif -- --# define V_ASN1_UNIVERSAL 0x00 --# define V_ASN1_APPLICATION 0x40 --# define V_ASN1_CONTEXT_SPECIFIC 0x80 --# define V_ASN1_PRIVATE 0xc0 -- --# define V_ASN1_CONSTRUCTED 0x20 --# define V_ASN1_PRIMITIVE_TAG 0x1f --# define V_ASN1_PRIMATIVE_TAG /*compat*/ V_ASN1_PRIMITIVE_TAG -- --# define V_ASN1_APP_CHOOSE -2/* let the recipient choose */ --# define V_ASN1_OTHER -3/* used in ASN1_TYPE */ --# define V_ASN1_ANY -4/* used in ASN1 template code */ -- --# define V_ASN1_UNDEF -1 --/* ASN.1 tag values */ --# define V_ASN1_EOC 0 --# define V_ASN1_BOOLEAN 1 /**/ --# define V_ASN1_INTEGER 2 --# define V_ASN1_BIT_STRING 3 --# define V_ASN1_OCTET_STRING 4 --# define V_ASN1_NULL 5 --# define V_ASN1_OBJECT 6 --# define V_ASN1_OBJECT_DESCRIPTOR 7 --# define V_ASN1_EXTERNAL 8 --# define V_ASN1_REAL 9 --# define V_ASN1_ENUMERATED 10 --# define V_ASN1_UTF8STRING 12 --# define V_ASN1_SEQUENCE 16 --# define V_ASN1_SET 17 --# define V_ASN1_NUMERICSTRING 18 /**/ --# define V_ASN1_PRINTABLESTRING 19 --# define V_ASN1_T61STRING 20 --# define V_ASN1_TELETEXSTRING 20/* alias */ --# define V_ASN1_VIDEOTEXSTRING 21 /**/ --# define V_ASN1_IA5STRING 22 --# define V_ASN1_UTCTIME 23 --# define V_ASN1_GENERALIZEDTIME 24 /**/ --# define V_ASN1_GRAPHICSTRING 25 /**/ --# define V_ASN1_ISO64STRING 26 /**/ --# define V_ASN1_VISIBLESTRING 26/* alias */ --# define V_ASN1_GENERALSTRING 27 /**/ --# define V_ASN1_UNIVERSALSTRING 28 /**/ --# define V_ASN1_BMPSTRING 30 -- --/* -- * NB the constants below are used internally by ASN1_INTEGER -- * and ASN1_ENUMERATED to indicate the sign. They are *not* on -- * the wire tag values. -- */ -- --# define V_ASN1_NEG 0x100 --# define V_ASN1_NEG_INTEGER (2 | V_ASN1_NEG) --# define V_ASN1_NEG_ENUMERATED (10 | V_ASN1_NEG) -- --/* For use with d2i_ASN1_type_bytes() */ --# define B_ASN1_NUMERICSTRING 0x0001 --# define B_ASN1_PRINTABLESTRING 0x0002 --# define B_ASN1_T61STRING 0x0004 --# define B_ASN1_TELETEXSTRING 0x0004 --# define B_ASN1_VIDEOTEXSTRING 0x0008 --# define B_ASN1_IA5STRING 0x0010 --# define B_ASN1_GRAPHICSTRING 0x0020 --# define B_ASN1_ISO64STRING 0x0040 --# define B_ASN1_VISIBLESTRING 0x0040 --# define B_ASN1_GENERALSTRING 0x0080 --# define B_ASN1_UNIVERSALSTRING 0x0100 --# define B_ASN1_OCTET_STRING 0x0200 --# define B_ASN1_BIT_STRING 0x0400 --# define B_ASN1_BMPSTRING 0x0800 --# define B_ASN1_UNKNOWN 0x1000 --# define B_ASN1_UTF8STRING 0x2000 --# define B_ASN1_UTCTIME 0x4000 --# define B_ASN1_GENERALIZEDTIME 0x8000 --# define B_ASN1_SEQUENCE 0x10000 --/* For use with ASN1_mbstring_copy() */ --# define MBSTRING_FLAG 0x1000 --# define MBSTRING_UTF8 (MBSTRING_FLAG) --# define MBSTRING_ASC (MBSTRING_FLAG|1) --# define MBSTRING_BMP (MBSTRING_FLAG|2) --# define MBSTRING_UNIV (MBSTRING_FLAG|4) --# define SMIME_OLDMIME 0x400 --# define SMIME_CRLFEOL 0x800 --# define SMIME_STREAM 0x1000 -- struct X509_algor_st; --DEFINE_STACK_OF(X509_ALGOR) -- --# define ASN1_STRING_FLAG_BITS_LEFT 0x08/* Set if 0x07 has bits left value */ --/* -- * This indicates that the ASN1_STRING is not a real value but just a place -- * holder for the location where indefinite length constructed data should be -- * inserted in the memory buffer -- */ --# define ASN1_STRING_FLAG_NDEF 0x010 -- --/* -- * This flag is used by the CMS code to indicate that a string is not -- * complete and is a place holder for content when it had all been accessed. -- * The flag will be reset when content has been written to it. -- */ -- --# define ASN1_STRING_FLAG_CONT 0x020 --/* -- * This flag is used by ASN1 code to indicate an ASN1_STRING is an MSTRING -- * type. -- */ --# define ASN1_STRING_FLAG_MSTRING 0x040 --/* String is embedded and only content should be freed */ --# define ASN1_STRING_FLAG_EMBED 0x080 --/* String should be parsed in RFC 5280's time format */ --# define ASN1_STRING_FLAG_X509_TIME 0x100 --/* This is the base type that holds just about everything :-) */ --struct asn1_string_st { -- int length; -- int type; -- unsigned char *data; -- /* -- * The value of the following field depends on the type being held. It -- * is mostly being used for BIT_STRING so if the input data has a -- * non-zero 'unused bits' value, it will be handled correctly -- */ -- long flags; --}; -- --/* -- * ASN1_ENCODING structure: this is used to save the received encoding of an -- * ASN1 type. This is useful to get round problems with invalid encodings -- * which can break signatures. -- */ -- --typedef struct ASN1_ENCODING_st { -- unsigned char *enc; /* DER encoding */ -- long len; /* Length of encoding */ -- int modified; /* set to 1 if 'enc' is invalid */ --} ASN1_ENCODING; -- --/* Used with ASN1 LONG type: if a long is set to this it is omitted */ --# define ASN1_LONG_UNDEF 0x7fffffffL -- --# define STABLE_FLAGS_MALLOC 0x01 --/* -- * A zero passed to ASN1_STRING_TABLE_new_add for the flags is interpreted -- * as "don't change" and STABLE_FLAGS_MALLOC is always set. By setting -- * STABLE_FLAGS_MALLOC only we can clear the existing value. Use the alias -- * STABLE_FLAGS_CLEAR to reflect this. -- */ --# define STABLE_FLAGS_CLEAR STABLE_FLAGS_MALLOC --# define STABLE_NO_MASK 0x02 --# define DIRSTRING_TYPE \ -- (B_ASN1_PRINTABLESTRING|B_ASN1_T61STRING|B_ASN1_BMPSTRING|B_ASN1_UTF8STRING) --# define PKCS9STRING_TYPE (DIRSTRING_TYPE|B_ASN1_IA5STRING) -- --typedef struct asn1_string_table_st { -- int nid; -- long minsize; -- long maxsize; -- unsigned long mask; -- unsigned long flags; --} ASN1_STRING_TABLE; -- --DEFINE_STACK_OF(ASN1_STRING_TABLE) -- --/* size limits: this stuff is taken straight from RFC2459 */ -- --# define ub_name 32768 --# define ub_common_name 64 --# define ub_locality_name 128 --# define ub_state_name 128 --# define ub_organization_name 64 --# define ub_organization_unit_name 64 --# define ub_title 64 --# define ub_email_address 128 -- --/* -- * Declarations for template structures: for full definitions see asn1t.h -- */ --typedef struct ASN1_TEMPLATE_st ASN1_TEMPLATE; --typedef struct ASN1_TLC_st ASN1_TLC; --/* This is just an opaque pointer */ --typedef struct ASN1_VALUE_st ASN1_VALUE; -- --/* Declare ASN1 functions: the implement macro in in asn1t.h */ -- --# define DECLARE_ASN1_FUNCTIONS(type) DECLARE_ASN1_FUNCTIONS_name(type, type) -- --# define DECLARE_ASN1_ALLOC_FUNCTIONS(type) \ -- DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, type) -- --# define DECLARE_ASN1_FUNCTIONS_name(type, name) \ -- DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ -- DECLARE_ASN1_ENCODE_FUNCTIONS(type, name, name) -- --# define DECLARE_ASN1_FUNCTIONS_fname(type, itname, name) \ -- DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ -- DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) -- --# define DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) \ -- type *d2i_##name(type **a, const unsigned char **in, long len); \ -- int i2d_##name(type *a, unsigned char **out); \ -- DECLARE_ASN1_ITEM(itname) -- --# define DECLARE_ASN1_ENCODE_FUNCTIONS_const(type, name) \ -- type *d2i_##name(type **a, const unsigned char **in, long len); \ -- int i2d_##name(const type *a, unsigned char **out); \ -- DECLARE_ASN1_ITEM(name) -- --# define DECLARE_ASN1_NDEF_FUNCTION(name) \ -- int i2d_##name##_NDEF(name *a, unsigned char **out); -- --# define DECLARE_ASN1_FUNCTIONS_const(name) \ -- DECLARE_ASN1_ALLOC_FUNCTIONS(name) \ -- DECLARE_ASN1_ENCODE_FUNCTIONS_const(name, name) -- --# define DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ -- type *name##_new(void); \ -- void name##_free(type *a); -- --# define DECLARE_ASN1_PRINT_FUNCTION(stname) \ -- DECLARE_ASN1_PRINT_FUNCTION_fname(stname, stname) -- --# define DECLARE_ASN1_PRINT_FUNCTION_fname(stname, fname) \ -- int fname##_print_ctx(BIO *out, stname *x, int indent, \ -- const ASN1_PCTX *pctx); -- --# define D2I_OF(type) type *(*)(type **,const unsigned char **,long) --# define I2D_OF(type) int (*)(type *,unsigned char **) --# define I2D_OF_const(type) int (*)(const type *,unsigned char **) -- --# define CHECKED_D2I_OF(type, d2i) \ -- ((d2i_of_void*) (1 ? d2i : ((D2I_OF(type))0))) --# define CHECKED_I2D_OF(type, i2d) \ -- ((i2d_of_void*) (1 ? i2d : ((I2D_OF(type))0))) --# define CHECKED_NEW_OF(type, xnew) \ -- ((void *(*)(void)) (1 ? xnew : ((type *(*)(void))0))) --# define CHECKED_PTR_OF(type, p) \ -- ((void*) (1 ? p : (type*)0)) --# define CHECKED_PPTR_OF(type, p) \ -- ((void**) (1 ? p : (type**)0)) -- --# define TYPEDEF_D2I_OF(type) typedef type *d2i_of_##type(type **,const unsigned char **,long) --# define TYPEDEF_I2D_OF(type) typedef int i2d_of_##type(type *,unsigned char **) --# define TYPEDEF_D2I2D_OF(type) TYPEDEF_D2I_OF(type); TYPEDEF_I2D_OF(type) -- --TYPEDEF_D2I2D_OF(void); -- --/*- -- * The following macros and typedefs allow an ASN1_ITEM -- * to be embedded in a structure and referenced. Since -- * the ASN1_ITEM pointers need to be globally accessible -- * (possibly from shared libraries) they may exist in -- * different forms. On platforms that support it the -- * ASN1_ITEM structure itself will be globally exported. -- * Other platforms will export a function that returns -- * an ASN1_ITEM pointer. -- * -- * To handle both cases transparently the macros below -- * should be used instead of hard coding an ASN1_ITEM -- * pointer in a structure. -- * -- * The structure will look like this: -- * -- * typedef struct SOMETHING_st { -- * ... -- * ASN1_ITEM_EXP *iptr; -- * ... -- * } SOMETHING; -- * -- * It would be initialised as e.g.: -- * -- * SOMETHING somevar = {...,ASN1_ITEM_ref(X509),...}; -- * -- * and the actual pointer extracted with: -- * -- * const ASN1_ITEM *it = ASN1_ITEM_ptr(somevar.iptr); -- * -- * Finally an ASN1_ITEM pointer can be extracted from an -- * appropriate reference with: ASN1_ITEM_rptr(X509). This -- * would be used when a function takes an ASN1_ITEM * argument. -- * -- */ -- --# ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION -- --/* ASN1_ITEM pointer exported type */ --typedef const ASN1_ITEM ASN1_ITEM_EXP; -- --/* Macro to obtain ASN1_ITEM pointer from exported type */ --# define ASN1_ITEM_ptr(iptr) (iptr) -- --/* Macro to include ASN1_ITEM pointer from base type */ --# define ASN1_ITEM_ref(iptr) (&(iptr##_it)) -- --# define ASN1_ITEM_rptr(ref) (&(ref##_it)) -- --# define DECLARE_ASN1_ITEM(name) \ -- OPENSSL_EXTERN const ASN1_ITEM name##_it; -- --# else -- --/* -- * Platforms that can't easily handle shared global variables are declared as -- * functions returning ASN1_ITEM pointers. -- */ -- --/* ASN1_ITEM pointer exported type */ --typedef const ASN1_ITEM *ASN1_ITEM_EXP (void); -- --/* Macro to obtain ASN1_ITEM pointer from exported type */ --# define ASN1_ITEM_ptr(iptr) (iptr()) -- --/* Macro to include ASN1_ITEM pointer from base type */ --# define ASN1_ITEM_ref(iptr) (iptr##_it) -- --# define ASN1_ITEM_rptr(ref) (ref##_it()) -- --# define DECLARE_ASN1_ITEM(name) \ -- const ASN1_ITEM * name##_it(void); -- --# endif -- --/* Parameters used by ASN1_STRING_print_ex() */ -- --/* -- * These determine which characters to escape: RFC2253 special characters, -- * control characters and MSB set characters -- */ -- --# define ASN1_STRFLGS_ESC_2253 1 --# define ASN1_STRFLGS_ESC_CTRL 2 --# define ASN1_STRFLGS_ESC_MSB 4 -- --/* -- * This flag determines how we do escaping: normally RC2253 backslash only, -- * set this to use backslash and quote. -- */ -- --# define ASN1_STRFLGS_ESC_QUOTE 8 -- --/* These three flags are internal use only. */ -- --/* Character is a valid PrintableString character */ --# define CHARTYPE_PRINTABLESTRING 0x10 --/* Character needs escaping if it is the first character */ --# define CHARTYPE_FIRST_ESC_2253 0x20 --/* Character needs escaping if it is the last character */ --# define CHARTYPE_LAST_ESC_2253 0x40 -- --/* -- * NB the internal flags are safely reused below by flags handled at the top -- * level. -- */ -- --/* -- * If this is set we convert all character strings to UTF8 first -- */ -- --# define ASN1_STRFLGS_UTF8_CONVERT 0x10 -- --/* -- * If this is set we don't attempt to interpret content: just assume all -- * strings are 1 byte per character. This will produce some pretty odd -- * looking output! -- */ -- --# define ASN1_STRFLGS_IGNORE_TYPE 0x20 -- --/* If this is set we include the string type in the output */ --# define ASN1_STRFLGS_SHOW_TYPE 0x40 -- --/* -- * This determines which strings to display and which to 'dump' (hex dump of -- * content octets or DER encoding). We can only dump non character strings or -- * everything. If we don't dump 'unknown' they are interpreted as character -- * strings with 1 octet per character and are subject to the usual escaping -- * options. -- */ -- --# define ASN1_STRFLGS_DUMP_ALL 0x80 --# define ASN1_STRFLGS_DUMP_UNKNOWN 0x100 -- --/* -- * These determine what 'dumping' does, we can dump the content octets or the -- * DER encoding: both use the RFC2253 #XXXXX notation. -- */ -- --# define ASN1_STRFLGS_DUMP_DER 0x200 -- --/* -- * This flag specifies that RC2254 escaping shall be performed. -- */ --#define ASN1_STRFLGS_ESC_2254 0x400 -- --/* -- * All the string flags consistent with RFC2253, escaping control characters -- * isn't essential in RFC2253 but it is advisable anyway. -- */ -- --# define ASN1_STRFLGS_RFC2253 (ASN1_STRFLGS_ESC_2253 | \ -- ASN1_STRFLGS_ESC_CTRL | \ -- ASN1_STRFLGS_ESC_MSB | \ -- ASN1_STRFLGS_UTF8_CONVERT | \ -- ASN1_STRFLGS_DUMP_UNKNOWN | \ -- ASN1_STRFLGS_DUMP_DER) -- --DEFINE_STACK_OF(ASN1_INTEGER) -- --DEFINE_STACK_OF(ASN1_GENERALSTRING) -- --DEFINE_STACK_OF(ASN1_UTF8STRING) -- --typedef struct asn1_type_st { -- int type; -- union { -- char *ptr; -- ASN1_BOOLEAN boolean; -- ASN1_STRING *asn1_string; -- ASN1_OBJECT *object; -- ASN1_INTEGER *integer; -- ASN1_ENUMERATED *enumerated; -- ASN1_BIT_STRING *bit_string; -- ASN1_OCTET_STRING *octet_string; -- ASN1_PRINTABLESTRING *printablestring; -- ASN1_T61STRING *t61string; -- ASN1_IA5STRING *ia5string; -- ASN1_GENERALSTRING *generalstring; -- ASN1_BMPSTRING *bmpstring; -- ASN1_UNIVERSALSTRING *universalstring; -- ASN1_UTCTIME *utctime; -- ASN1_GENERALIZEDTIME *generalizedtime; -- ASN1_VISIBLESTRING *visiblestring; -- ASN1_UTF8STRING *utf8string; -- /* -- * set and sequence are left complete and still contain the set or -- * sequence bytes -- */ -- ASN1_STRING *set; -- ASN1_STRING *sequence; -- ASN1_VALUE *asn1_value; -- } value; --} ASN1_TYPE; -- --DEFINE_STACK_OF(ASN1_TYPE) -- --typedef STACK_OF(ASN1_TYPE) ASN1_SEQUENCE_ANY; -- --DECLARE_ASN1_ENCODE_FUNCTIONS_const(ASN1_SEQUENCE_ANY, ASN1_SEQUENCE_ANY) --DECLARE_ASN1_ENCODE_FUNCTIONS_const(ASN1_SEQUENCE_ANY, ASN1_SET_ANY) -- --/* This is used to contain a list of bit names */ --typedef struct BIT_STRING_BITNAME_st { -- int bitnum; -- const char *lname; -- const char *sname; --} BIT_STRING_BITNAME; -- --# define B_ASN1_TIME \ -- B_ASN1_UTCTIME | \ -- B_ASN1_GENERALIZEDTIME -- --# define B_ASN1_PRINTABLE \ -- B_ASN1_NUMERICSTRING| \ -- B_ASN1_PRINTABLESTRING| \ -- B_ASN1_T61STRING| \ -- B_ASN1_IA5STRING| \ -- B_ASN1_BIT_STRING| \ -- B_ASN1_UNIVERSALSTRING|\ -- B_ASN1_BMPSTRING|\ -- B_ASN1_UTF8STRING|\ -- B_ASN1_SEQUENCE|\ -- B_ASN1_UNKNOWN -- --# define B_ASN1_DIRECTORYSTRING \ -- B_ASN1_PRINTABLESTRING| \ -- B_ASN1_TELETEXSTRING|\ -- B_ASN1_BMPSTRING|\ -- B_ASN1_UNIVERSALSTRING|\ -- B_ASN1_UTF8STRING -- --# define B_ASN1_DISPLAYTEXT \ -- B_ASN1_IA5STRING| \ -- B_ASN1_VISIBLESTRING| \ -- B_ASN1_BMPSTRING|\ -- B_ASN1_UTF8STRING -- --DECLARE_ASN1_FUNCTIONS_fname(ASN1_TYPE, ASN1_ANY, ASN1_TYPE) -- --int ASN1_TYPE_get(const ASN1_TYPE *a); --void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value); --int ASN1_TYPE_set1(ASN1_TYPE *a, int type, const void *value); --int ASN1_TYPE_cmp(const ASN1_TYPE *a, const ASN1_TYPE *b); -- --ASN1_TYPE *ASN1_TYPE_pack_sequence(const ASN1_ITEM *it, void *s, ASN1_TYPE **t); --void *ASN1_TYPE_unpack_sequence(const ASN1_ITEM *it, const ASN1_TYPE *t); -- --ASN1_OBJECT *ASN1_OBJECT_new(void); --void ASN1_OBJECT_free(ASN1_OBJECT *a); --int i2d_ASN1_OBJECT(const ASN1_OBJECT *a, unsigned char **pp); --ASN1_OBJECT *d2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, -- long length); -- --DECLARE_ASN1_ITEM(ASN1_OBJECT) -- --DEFINE_STACK_OF(ASN1_OBJECT) -- --ASN1_STRING *ASN1_STRING_new(void); --void ASN1_STRING_free(ASN1_STRING *a); --void ASN1_STRING_clear_free(ASN1_STRING *a); --int ASN1_STRING_copy(ASN1_STRING *dst, const ASN1_STRING *str); --ASN1_STRING *ASN1_STRING_dup(const ASN1_STRING *a); --ASN1_STRING *ASN1_STRING_type_new(int type); --int ASN1_STRING_cmp(const ASN1_STRING *a, const ASN1_STRING *b); -- /* -- * Since this is used to store all sorts of things, via macros, for now, -- * make its data void * -- */ --int ASN1_STRING_set(ASN1_STRING *str, const void *data, int len); --void ASN1_STRING_set0(ASN1_STRING *str, void *data, int len); --int ASN1_STRING_length(const ASN1_STRING *x); --void ASN1_STRING_length_set(ASN1_STRING *x, int n); --int ASN1_STRING_type(const ASN1_STRING *x); --DEPRECATEDIN_1_1_0(unsigned char *ASN1_STRING_data(ASN1_STRING *x)) --const unsigned char *ASN1_STRING_get0_data(const ASN1_STRING *x); -- --DECLARE_ASN1_FUNCTIONS(ASN1_BIT_STRING) --int ASN1_BIT_STRING_set(ASN1_BIT_STRING *a, unsigned char *d, int length); --int ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *a, int n, int value); --int ASN1_BIT_STRING_get_bit(const ASN1_BIT_STRING *a, int n); --int ASN1_BIT_STRING_check(const ASN1_BIT_STRING *a, -- const unsigned char *flags, int flags_len); -- --int ASN1_BIT_STRING_name_print(BIO *out, ASN1_BIT_STRING *bs, -- BIT_STRING_BITNAME *tbl, int indent); --int ASN1_BIT_STRING_num_asc(const char *name, BIT_STRING_BITNAME *tbl); --int ASN1_BIT_STRING_set_asc(ASN1_BIT_STRING *bs, const char *name, int value, -- BIT_STRING_BITNAME *tbl); -- --DECLARE_ASN1_FUNCTIONS(ASN1_INTEGER) --ASN1_INTEGER *d2i_ASN1_UINTEGER(ASN1_INTEGER **a, const unsigned char **pp, -- long length); --ASN1_INTEGER *ASN1_INTEGER_dup(const ASN1_INTEGER *x); --int ASN1_INTEGER_cmp(const ASN1_INTEGER *x, const ASN1_INTEGER *y); -- --DECLARE_ASN1_FUNCTIONS(ASN1_ENUMERATED) -- --int ASN1_UTCTIME_check(const ASN1_UTCTIME *a); --ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t); --ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, -- int offset_day, long offset_sec); --int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str); --int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t); -- --int ASN1_GENERALIZEDTIME_check(const ASN1_GENERALIZEDTIME *a); --ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_set(ASN1_GENERALIZEDTIME *s, -- time_t t); --ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, -- time_t t, int offset_day, -- long offset_sec); --int ASN1_GENERALIZEDTIME_set_string(ASN1_GENERALIZEDTIME *s, const char *str); -- --int ASN1_TIME_diff(int *pday, int *psec, -- const ASN1_TIME *from, const ASN1_TIME *to); -- --DECLARE_ASN1_FUNCTIONS(ASN1_OCTET_STRING) --ASN1_OCTET_STRING *ASN1_OCTET_STRING_dup(const ASN1_OCTET_STRING *a); --int ASN1_OCTET_STRING_cmp(const ASN1_OCTET_STRING *a, -- const ASN1_OCTET_STRING *b); --int ASN1_OCTET_STRING_set(ASN1_OCTET_STRING *str, const unsigned char *data, -- int len); -- --DECLARE_ASN1_FUNCTIONS(ASN1_VISIBLESTRING) --DECLARE_ASN1_FUNCTIONS(ASN1_UNIVERSALSTRING) --DECLARE_ASN1_FUNCTIONS(ASN1_UTF8STRING) --DECLARE_ASN1_FUNCTIONS(ASN1_NULL) --DECLARE_ASN1_FUNCTIONS(ASN1_BMPSTRING) -- --int UTF8_getc(const unsigned char *str, int len, unsigned long *val); --int UTF8_putc(unsigned char *str, int len, unsigned long value); -- --DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, ASN1_PRINTABLE) -- --DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, DIRECTORYSTRING) --DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, DISPLAYTEXT) --DECLARE_ASN1_FUNCTIONS(ASN1_PRINTABLESTRING) --DECLARE_ASN1_FUNCTIONS(ASN1_T61STRING) --DECLARE_ASN1_FUNCTIONS(ASN1_IA5STRING) --DECLARE_ASN1_FUNCTIONS(ASN1_GENERALSTRING) --DECLARE_ASN1_FUNCTIONS(ASN1_UTCTIME) --DECLARE_ASN1_FUNCTIONS(ASN1_GENERALIZEDTIME) --DECLARE_ASN1_FUNCTIONS(ASN1_TIME) -- --DECLARE_ASN1_ITEM(ASN1_OCTET_STRING_NDEF) -- --ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s, time_t t); --ASN1_TIME *ASN1_TIME_adj(ASN1_TIME *s, time_t t, -- int offset_day, long offset_sec); --int ASN1_TIME_check(const ASN1_TIME *t); --ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(const ASN1_TIME *t, -- ASN1_GENERALIZEDTIME **out); --int ASN1_TIME_set_string(ASN1_TIME *s, const char *str); --int ASN1_TIME_set_string_X509(ASN1_TIME *s, const char *str); --int ASN1_TIME_to_tm(const ASN1_TIME *s, struct tm *tm); --int ASN1_TIME_normalize(ASN1_TIME *s); --int ASN1_TIME_cmp_time_t(const ASN1_TIME *s, time_t t); --int ASN1_TIME_compare(const ASN1_TIME *a, const ASN1_TIME *b); -- --int i2a_ASN1_INTEGER(BIO *bp, const ASN1_INTEGER *a); --int a2i_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *bs, char *buf, int size); --int i2a_ASN1_ENUMERATED(BIO *bp, const ASN1_ENUMERATED *a); --int a2i_ASN1_ENUMERATED(BIO *bp, ASN1_ENUMERATED *bs, char *buf, int size); --int i2a_ASN1_OBJECT(BIO *bp, const ASN1_OBJECT *a); --int a2i_ASN1_STRING(BIO *bp, ASN1_STRING *bs, char *buf, int size); --int i2a_ASN1_STRING(BIO *bp, const ASN1_STRING *a, int type); --int i2t_ASN1_OBJECT(char *buf, int buf_len, const ASN1_OBJECT *a); -- --int a2d_ASN1_OBJECT(unsigned char *out, int olen, const char *buf, int num); --ASN1_OBJECT *ASN1_OBJECT_create(int nid, unsigned char *data, int len, -- const char *sn, const char *ln); -- --int ASN1_INTEGER_get_int64(int64_t *pr, const ASN1_INTEGER *a); --int ASN1_INTEGER_set_int64(ASN1_INTEGER *a, int64_t r); --int ASN1_INTEGER_get_uint64(uint64_t *pr, const ASN1_INTEGER *a); --int ASN1_INTEGER_set_uint64(ASN1_INTEGER *a, uint64_t r); -- --int ASN1_INTEGER_set(ASN1_INTEGER *a, long v); --long ASN1_INTEGER_get(const ASN1_INTEGER *a); --ASN1_INTEGER *BN_to_ASN1_INTEGER(const BIGNUM *bn, ASN1_INTEGER *ai); --BIGNUM *ASN1_INTEGER_to_BN(const ASN1_INTEGER *ai, BIGNUM *bn); -- --int ASN1_ENUMERATED_get_int64(int64_t *pr, const ASN1_ENUMERATED *a); --int ASN1_ENUMERATED_set_int64(ASN1_ENUMERATED *a, int64_t r); -- -- --int ASN1_ENUMERATED_set(ASN1_ENUMERATED *a, long v); --long ASN1_ENUMERATED_get(const ASN1_ENUMERATED *a); --ASN1_ENUMERATED *BN_to_ASN1_ENUMERATED(const BIGNUM *bn, ASN1_ENUMERATED *ai); --BIGNUM *ASN1_ENUMERATED_to_BN(const ASN1_ENUMERATED *ai, BIGNUM *bn); -- --/* General */ --/* given a string, return the correct type, max is the maximum length */ --int ASN1_PRINTABLE_type(const unsigned char *s, int max); -- --unsigned long ASN1_tag2bit(int tag); -- --/* SPECIALS */ --int ASN1_get_object(const unsigned char **pp, long *plength, int *ptag, -- int *pclass, long omax); --int ASN1_check_infinite_end(unsigned char **p, long len); --int ASN1_const_check_infinite_end(const unsigned char **p, long len); --void ASN1_put_object(unsigned char **pp, int constructed, int length, -- int tag, int xclass); --int ASN1_put_eoc(unsigned char **pp); --int ASN1_object_size(int constructed, int length, int tag); -- --/* Used to implement other functions */ --void *ASN1_dup(i2d_of_void *i2d, d2i_of_void *d2i, void *x); -- --# define ASN1_dup_of(type,i2d,d2i,x) \ -- ((type*)ASN1_dup(CHECKED_I2D_OF(type, i2d), \ -- CHECKED_D2I_OF(type, d2i), \ -- CHECKED_PTR_OF(type, x))) -- --# define ASN1_dup_of_const(type,i2d,d2i,x) \ -- ((type*)ASN1_dup(CHECKED_I2D_OF(const type, i2d), \ -- CHECKED_D2I_OF(type, d2i), \ -- CHECKED_PTR_OF(const type, x))) -- --void *ASN1_item_dup(const ASN1_ITEM *it, void *x); -- --/* ASN1 alloc/free macros for when a type is only used internally */ -- --# define M_ASN1_new_of(type) (type *)ASN1_item_new(ASN1_ITEM_rptr(type)) --# define M_ASN1_free_of(x, type) \ -- ASN1_item_free(CHECKED_PTR_OF(type, x), ASN1_ITEM_rptr(type)) -- --# ifndef OPENSSL_NO_STDIO --void *ASN1_d2i_fp(void *(*xnew) (void), d2i_of_void *d2i, FILE *in, void **x); -- --# define ASN1_d2i_fp_of(type,xnew,d2i,in,x) \ -- ((type*)ASN1_d2i_fp(CHECKED_NEW_OF(type, xnew), \ -- CHECKED_D2I_OF(type, d2i), \ -- in, \ -- CHECKED_PPTR_OF(type, x))) -- --void *ASN1_item_d2i_fp(const ASN1_ITEM *it, FILE *in, void *x); --int ASN1_i2d_fp(i2d_of_void *i2d, FILE *out, void *x); -- --# define ASN1_i2d_fp_of(type,i2d,out,x) \ -- (ASN1_i2d_fp(CHECKED_I2D_OF(type, i2d), \ -- out, \ -- CHECKED_PTR_OF(type, x))) -- --# define ASN1_i2d_fp_of_const(type,i2d,out,x) \ -- (ASN1_i2d_fp(CHECKED_I2D_OF(const type, i2d), \ -- out, \ -- CHECKED_PTR_OF(const type, x))) -- --int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, void *x); --int ASN1_STRING_print_ex_fp(FILE *fp, const ASN1_STRING *str, unsigned long flags); --# endif -- --int ASN1_STRING_to_UTF8(unsigned char **out, const ASN1_STRING *in); -- --void *ASN1_d2i_bio(void *(*xnew) (void), d2i_of_void *d2i, BIO *in, void **x); -- --# define ASN1_d2i_bio_of(type,xnew,d2i,in,x) \ -- ((type*)ASN1_d2i_bio( CHECKED_NEW_OF(type, xnew), \ -- CHECKED_D2I_OF(type, d2i), \ -- in, \ -- CHECKED_PPTR_OF(type, x))) -- --void *ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *x); --int ASN1_i2d_bio(i2d_of_void *i2d, BIO *out, unsigned char *x); -- --# define ASN1_i2d_bio_of(type,i2d,out,x) \ -- (ASN1_i2d_bio(CHECKED_I2D_OF(type, i2d), \ -- out, \ -- CHECKED_PTR_OF(type, x))) -- --# define ASN1_i2d_bio_of_const(type,i2d,out,x) \ -- (ASN1_i2d_bio(CHECKED_I2D_OF(const type, i2d), \ -- out, \ -- CHECKED_PTR_OF(const type, x))) -- --int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, void *x); --int ASN1_UTCTIME_print(BIO *fp, const ASN1_UTCTIME *a); --int ASN1_GENERALIZEDTIME_print(BIO *fp, const ASN1_GENERALIZEDTIME *a); --int ASN1_TIME_print(BIO *fp, const ASN1_TIME *a); --int ASN1_STRING_print(BIO *bp, const ASN1_STRING *v); --int ASN1_STRING_print_ex(BIO *out, const ASN1_STRING *str, unsigned long flags); --int ASN1_buf_print(BIO *bp, const unsigned char *buf, size_t buflen, int off); --int ASN1_bn_print(BIO *bp, const char *number, const BIGNUM *num, -- unsigned char *buf, int off); --int ASN1_parse(BIO *bp, const unsigned char *pp, long len, int indent); --int ASN1_parse_dump(BIO *bp, const unsigned char *pp, long len, int indent, -- int dump); --const char *ASN1_tag2str(int tag); -- --/* Used to load and write Netscape format cert */ -- --int ASN1_UNIVERSALSTRING_to_string(ASN1_UNIVERSALSTRING *s); -- --int ASN1_TYPE_set_octetstring(ASN1_TYPE *a, unsigned char *data, int len); --int ASN1_TYPE_get_octetstring(const ASN1_TYPE *a, unsigned char *data, int max_len); --int ASN1_TYPE_set_int_octetstring(ASN1_TYPE *a, long num, -- unsigned char *data, int len); --int ASN1_TYPE_get_int_octetstring(const ASN1_TYPE *a, long *num, -- unsigned char *data, int max_len); -- --void *ASN1_item_unpack(const ASN1_STRING *oct, const ASN1_ITEM *it); -- --ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, -- ASN1_OCTET_STRING **oct); -- --void ASN1_STRING_set_default_mask(unsigned long mask); --int ASN1_STRING_set_default_mask_asc(const char *p); --unsigned long ASN1_STRING_get_default_mask(void); --int ASN1_mbstring_copy(ASN1_STRING **out, const unsigned char *in, int len, -- int inform, unsigned long mask); --int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len, -- int inform, unsigned long mask, -- long minsize, long maxsize); -- --ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out, -- const unsigned char *in, int inlen, -- int inform, int nid); --ASN1_STRING_TABLE *ASN1_STRING_TABLE_get(int nid); --int ASN1_STRING_TABLE_add(int, long, long, unsigned long, unsigned long); --void ASN1_STRING_TABLE_cleanup(void); -- --/* ASN1 template functions */ -- --/* Old API compatible functions */ --ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it); --void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it); --ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **val, const unsigned char **in, -- long len, const ASN1_ITEM *it); --int ASN1_item_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it); --int ASN1_item_ndef_i2d(ASN1_VALUE *val, unsigned char **out, -- const ASN1_ITEM *it); -- --void ASN1_add_oid_module(void); --void ASN1_add_stable_module(void); -- --ASN1_TYPE *ASN1_generate_nconf(const char *str, CONF *nconf); --ASN1_TYPE *ASN1_generate_v3(const char *str, X509V3_CTX *cnf); --int ASN1_str2mask(const char *str, unsigned long *pmask); -- --/* ASN1 Print flags */ -- --/* Indicate missing OPTIONAL fields */ --# define ASN1_PCTX_FLAGS_SHOW_ABSENT 0x001 --/* Mark start and end of SEQUENCE */ --# define ASN1_PCTX_FLAGS_SHOW_SEQUENCE 0x002 --/* Mark start and end of SEQUENCE/SET OF */ --# define ASN1_PCTX_FLAGS_SHOW_SSOF 0x004 --/* Show the ASN1 type of primitives */ --# define ASN1_PCTX_FLAGS_SHOW_TYPE 0x008 --/* Don't show ASN1 type of ANY */ --# define ASN1_PCTX_FLAGS_NO_ANY_TYPE 0x010 --/* Don't show ASN1 type of MSTRINGs */ --# define ASN1_PCTX_FLAGS_NO_MSTRING_TYPE 0x020 --/* Don't show field names in SEQUENCE */ --# define ASN1_PCTX_FLAGS_NO_FIELD_NAME 0x040 --/* Show structure names of each SEQUENCE field */ --# define ASN1_PCTX_FLAGS_SHOW_FIELD_STRUCT_NAME 0x080 --/* Don't show structure name even at top level */ --# define ASN1_PCTX_FLAGS_NO_STRUCT_NAME 0x100 -- --int ASN1_item_print(BIO *out, ASN1_VALUE *ifld, int indent, -- const ASN1_ITEM *it, const ASN1_PCTX *pctx); --ASN1_PCTX *ASN1_PCTX_new(void); --void ASN1_PCTX_free(ASN1_PCTX *p); --unsigned long ASN1_PCTX_get_flags(const ASN1_PCTX *p); --void ASN1_PCTX_set_flags(ASN1_PCTX *p, unsigned long flags); --unsigned long ASN1_PCTX_get_nm_flags(const ASN1_PCTX *p); --void ASN1_PCTX_set_nm_flags(ASN1_PCTX *p, unsigned long flags); --unsigned long ASN1_PCTX_get_cert_flags(const ASN1_PCTX *p); --void ASN1_PCTX_set_cert_flags(ASN1_PCTX *p, unsigned long flags); --unsigned long ASN1_PCTX_get_oid_flags(const ASN1_PCTX *p); --void ASN1_PCTX_set_oid_flags(ASN1_PCTX *p, unsigned long flags); --unsigned long ASN1_PCTX_get_str_flags(const ASN1_PCTX *p); --void ASN1_PCTX_set_str_flags(ASN1_PCTX *p, unsigned long flags); -- --ASN1_SCTX *ASN1_SCTX_new(int (*scan_cb) (ASN1_SCTX *ctx)); --void ASN1_SCTX_free(ASN1_SCTX *p); --const ASN1_ITEM *ASN1_SCTX_get_item(ASN1_SCTX *p); --const ASN1_TEMPLATE *ASN1_SCTX_get_template(ASN1_SCTX *p); --unsigned long ASN1_SCTX_get_flags(ASN1_SCTX *p); --void ASN1_SCTX_set_app_data(ASN1_SCTX *p, void *data); --void *ASN1_SCTX_get_app_data(ASN1_SCTX *p); -- --const BIO_METHOD *BIO_f_asn1(void); -- --BIO *BIO_new_NDEF(BIO *out, ASN1_VALUE *val, const ASN1_ITEM *it); -- --int i2d_ASN1_bio_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, -- const ASN1_ITEM *it); --int PEM_write_bio_ASN1_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, -- const char *hdr, const ASN1_ITEM *it); --int SMIME_write_ASN1(BIO *bio, ASN1_VALUE *val, BIO *data, int flags, -- int ctype_nid, int econt_nid, -- STACK_OF(X509_ALGOR) *mdalgs, const ASN1_ITEM *it); --ASN1_VALUE *SMIME_read_ASN1(BIO *bio, BIO **bcont, const ASN1_ITEM *it); --int SMIME_crlf_copy(BIO *in, BIO *out, int flags); --int SMIME_text(BIO *in, BIO *out); -- --const ASN1_ITEM *ASN1_ITEM_lookup(const char *name); --const ASN1_ITEM *ASN1_ITEM_get(size_t i); -- --# ifdef __cplusplus --} --# endif --#endif -diff --git a/uadk_tool/include/openssl/asn1_mac.h b/uadk_tool/include/openssl/asn1_mac.h -deleted file mode 100644 -index 7ac1782..0000000 ---- a/uadk_tool/include/openssl/asn1_mac.h -+++ /dev/null -@@ -1,10 +0,0 @@ --/* -- * Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#error "This file is obsolete; please update your software." -diff --git a/uadk_tool/include/openssl/asn1err.h b/uadk_tool/include/openssl/asn1err.h -deleted file mode 100644 -index e1ad1fe..0000000 ---- a/uadk_tool/include/openssl/asn1err.h -+++ /dev/null -@@ -1,256 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_ASN1ERR_H --# define HEADER_ASN1ERR_H -- --# include -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_ASN1_strings(void); -- --/* -- * ASN1 function codes. -- */ --# define ASN1_F_A2D_ASN1_OBJECT 100 --# define ASN1_F_A2I_ASN1_INTEGER 102 --# define ASN1_F_A2I_ASN1_STRING 103 --# define ASN1_F_APPEND_EXP 176 --# define ASN1_F_ASN1_BIO_INIT 113 --# define ASN1_F_ASN1_BIT_STRING_SET_BIT 183 --# define ASN1_F_ASN1_CB 177 --# define ASN1_F_ASN1_CHECK_TLEN 104 --# define ASN1_F_ASN1_COLLECT 106 --# define ASN1_F_ASN1_D2I_EX_PRIMITIVE 108 --# define ASN1_F_ASN1_D2I_FP 109 --# define ASN1_F_ASN1_D2I_READ_BIO 107 --# define ASN1_F_ASN1_DIGEST 184 --# define ASN1_F_ASN1_DO_ADB 110 --# define ASN1_F_ASN1_DO_LOCK 233 --# define ASN1_F_ASN1_DUP 111 --# define ASN1_F_ASN1_ENC_SAVE 115 --# define ASN1_F_ASN1_EX_C2I 204 --# define ASN1_F_ASN1_FIND_END 190 --# define ASN1_F_ASN1_GENERALIZEDTIME_ADJ 216 --# define ASN1_F_ASN1_GENERATE_V3 178 --# define ASN1_F_ASN1_GET_INT64 224 --# define ASN1_F_ASN1_GET_OBJECT 114 --# define ASN1_F_ASN1_GET_UINT64 225 --# define ASN1_F_ASN1_I2D_BIO 116 --# define ASN1_F_ASN1_I2D_FP 117 --# define ASN1_F_ASN1_ITEM_D2I_FP 206 --# define ASN1_F_ASN1_ITEM_DUP 191 --# define ASN1_F_ASN1_ITEM_EMBED_D2I 120 --# define ASN1_F_ASN1_ITEM_EMBED_NEW 121 --# define ASN1_F_ASN1_ITEM_EX_I2D 144 --# define ASN1_F_ASN1_ITEM_FLAGS_I2D 118 --# define ASN1_F_ASN1_ITEM_I2D_BIO 192 --# define ASN1_F_ASN1_ITEM_I2D_FP 193 --# define ASN1_F_ASN1_ITEM_PACK 198 --# define ASN1_F_ASN1_ITEM_SIGN 195 --# define ASN1_F_ASN1_ITEM_SIGN_CTX 220 --# define ASN1_F_ASN1_ITEM_UNPACK 199 --# define ASN1_F_ASN1_ITEM_VERIFY 197 --# define ASN1_F_ASN1_MBSTRING_NCOPY 122 --# define ASN1_F_ASN1_OBJECT_NEW 123 --# define ASN1_F_ASN1_OUTPUT_DATA 214 --# define ASN1_F_ASN1_PCTX_NEW 205 --# define ASN1_F_ASN1_PRIMITIVE_NEW 119 --# define ASN1_F_ASN1_SCTX_NEW 221 --# define ASN1_F_ASN1_SIGN 128 --# define ASN1_F_ASN1_STR2TYPE 179 --# define ASN1_F_ASN1_STRING_GET_INT64 227 --# define ASN1_F_ASN1_STRING_GET_UINT64 230 --# define ASN1_F_ASN1_STRING_SET 186 --# define ASN1_F_ASN1_STRING_TABLE_ADD 129 --# define ASN1_F_ASN1_STRING_TO_BN 228 --# define ASN1_F_ASN1_STRING_TYPE_NEW 130 --# define ASN1_F_ASN1_TEMPLATE_EX_D2I 132 --# define ASN1_F_ASN1_TEMPLATE_NEW 133 --# define ASN1_F_ASN1_TEMPLATE_NOEXP_D2I 131 --# define ASN1_F_ASN1_TIME_ADJ 217 --# define ASN1_F_ASN1_TYPE_GET_INT_OCTETSTRING 134 --# define ASN1_F_ASN1_TYPE_GET_OCTETSTRING 135 --# define ASN1_F_ASN1_UTCTIME_ADJ 218 --# define ASN1_F_ASN1_VERIFY 137 --# define ASN1_F_B64_READ_ASN1 209 --# define ASN1_F_B64_WRITE_ASN1 210 --# define ASN1_F_BIO_NEW_NDEF 208 --# define ASN1_F_BITSTR_CB 180 --# define ASN1_F_BN_TO_ASN1_STRING 229 --# define ASN1_F_C2I_ASN1_BIT_STRING 189 --# define ASN1_F_C2I_ASN1_INTEGER 194 --# define ASN1_F_C2I_ASN1_OBJECT 196 --# define ASN1_F_C2I_IBUF 226 --# define ASN1_F_C2I_UINT64_INT 101 --# define ASN1_F_COLLECT_DATA 140 --# define ASN1_F_D2I_ASN1_OBJECT 147 --# define ASN1_F_D2I_ASN1_UINTEGER 150 --# define ASN1_F_D2I_AUTOPRIVATEKEY 207 --# define ASN1_F_D2I_PRIVATEKEY 154 --# define ASN1_F_D2I_PUBLICKEY 155 --# define ASN1_F_DO_BUF 142 --# define ASN1_F_DO_CREATE 124 --# define ASN1_F_DO_DUMP 125 --# define ASN1_F_DO_TCREATE 222 --# define ASN1_F_I2A_ASN1_OBJECT 126 --# define ASN1_F_I2D_ASN1_BIO_STREAM 211 --# define ASN1_F_I2D_ASN1_OBJECT 143 --# define ASN1_F_I2D_DSA_PUBKEY 161 --# define ASN1_F_I2D_EC_PUBKEY 181 --# define ASN1_F_I2D_PRIVATEKEY 163 --# define ASN1_F_I2D_PUBLICKEY 164 --# define ASN1_F_I2D_RSA_PUBKEY 165 --# define ASN1_F_LONG_C2I 166 --# define ASN1_F_NDEF_PREFIX 127 --# define ASN1_F_NDEF_SUFFIX 136 --# define ASN1_F_OID_MODULE_INIT 174 --# define ASN1_F_PARSE_TAGGING 182 --# define ASN1_F_PKCS5_PBE2_SET_IV 167 --# define ASN1_F_PKCS5_PBE2_SET_SCRYPT 231 --# define ASN1_F_PKCS5_PBE_SET 202 --# define ASN1_F_PKCS5_PBE_SET0_ALGOR 215 --# define ASN1_F_PKCS5_PBKDF2_SET 219 --# define ASN1_F_PKCS5_SCRYPT_SET 232 --# define ASN1_F_SMIME_READ_ASN1 212 --# define ASN1_F_SMIME_TEXT 213 --# define ASN1_F_STABLE_GET 138 --# define ASN1_F_STBL_MODULE_INIT 223 --# define ASN1_F_UINT32_C2I 105 --# define ASN1_F_UINT32_NEW 139 --# define ASN1_F_UINT64_C2I 112 --# define ASN1_F_UINT64_NEW 141 --# define ASN1_F_X509_CRL_ADD0_REVOKED 169 --# define ASN1_F_X509_INFO_NEW 170 --# define ASN1_F_X509_NAME_ENCODE 203 --# define ASN1_F_X509_NAME_EX_D2I 158 --# define ASN1_F_X509_NAME_EX_NEW 171 --# define ASN1_F_X509_PKEY_NEW 173 -- --/* -- * ASN1 reason codes. -- */ --# define ASN1_R_ADDING_OBJECT 171 --# define ASN1_R_ASN1_PARSE_ERROR 203 --# define ASN1_R_ASN1_SIG_PARSE_ERROR 204 --# define ASN1_R_AUX_ERROR 100 --# define ASN1_R_BAD_OBJECT_HEADER 102 --# define ASN1_R_BAD_TEMPLATE 230 --# define ASN1_R_BMPSTRING_IS_WRONG_LENGTH 214 --# define ASN1_R_BN_LIB 105 --# define ASN1_R_BOOLEAN_IS_WRONG_LENGTH 106 --# define ASN1_R_BUFFER_TOO_SMALL 107 --# define ASN1_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER 108 --# define ASN1_R_CONTEXT_NOT_INITIALISED 217 --# define ASN1_R_DATA_IS_WRONG 109 --# define ASN1_R_DECODE_ERROR 110 --# define ASN1_R_DEPTH_EXCEEDED 174 --# define ASN1_R_DIGEST_AND_KEY_TYPE_NOT_SUPPORTED 198 --# define ASN1_R_ENCODE_ERROR 112 --# define ASN1_R_ERROR_GETTING_TIME 173 --# define ASN1_R_ERROR_LOADING_SECTION 172 --# define ASN1_R_ERROR_SETTING_CIPHER_PARAMS 114 --# define ASN1_R_EXPECTING_AN_INTEGER 115 --# define ASN1_R_EXPECTING_AN_OBJECT 116 --# define ASN1_R_EXPLICIT_LENGTH_MISMATCH 119 --# define ASN1_R_EXPLICIT_TAG_NOT_CONSTRUCTED 120 --# define ASN1_R_FIELD_MISSING 121 --# define ASN1_R_FIRST_NUM_TOO_LARGE 122 --# define ASN1_R_HEADER_TOO_LONG 123 --# define ASN1_R_ILLEGAL_BITSTRING_FORMAT 175 --# define ASN1_R_ILLEGAL_BOOLEAN 176 --# define ASN1_R_ILLEGAL_CHARACTERS 124 --# define ASN1_R_ILLEGAL_FORMAT 177 --# define ASN1_R_ILLEGAL_HEX 178 --# define ASN1_R_ILLEGAL_IMPLICIT_TAG 179 --# define ASN1_R_ILLEGAL_INTEGER 180 --# define ASN1_R_ILLEGAL_NEGATIVE_VALUE 226 --# define ASN1_R_ILLEGAL_NESTED_TAGGING 181 --# define ASN1_R_ILLEGAL_NULL 125 --# define ASN1_R_ILLEGAL_NULL_VALUE 182 --# define ASN1_R_ILLEGAL_OBJECT 183 --# define ASN1_R_ILLEGAL_OPTIONAL_ANY 126 --# define ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE 170 --# define ASN1_R_ILLEGAL_PADDING 221 --# define ASN1_R_ILLEGAL_TAGGED_ANY 127 --# define ASN1_R_ILLEGAL_TIME_VALUE 184 --# define ASN1_R_ILLEGAL_ZERO_CONTENT 222 --# define ASN1_R_INTEGER_NOT_ASCII_FORMAT 185 --# define ASN1_R_INTEGER_TOO_LARGE_FOR_LONG 128 --# define ASN1_R_INVALID_BIT_STRING_BITS_LEFT 220 --# define ASN1_R_INVALID_BMPSTRING_LENGTH 129 --# define ASN1_R_INVALID_DIGIT 130 --# define ASN1_R_INVALID_MIME_TYPE 205 --# define ASN1_R_INVALID_MODIFIER 186 --# define ASN1_R_INVALID_NUMBER 187 --# define ASN1_R_INVALID_OBJECT_ENCODING 216 --# define ASN1_R_INVALID_SCRYPT_PARAMETERS 227 --# define ASN1_R_INVALID_SEPARATOR 131 --# define ASN1_R_INVALID_STRING_TABLE_VALUE 218 --# define ASN1_R_INVALID_UNIVERSALSTRING_LENGTH 133 --# define ASN1_R_INVALID_UTF8STRING 134 --# define ASN1_R_INVALID_VALUE 219 --# define ASN1_R_LIST_ERROR 188 --# define ASN1_R_MIME_NO_CONTENT_TYPE 206 --# define ASN1_R_MIME_PARSE_ERROR 207 --# define ASN1_R_MIME_SIG_PARSE_ERROR 208 --# define ASN1_R_MISSING_EOC 137 --# define ASN1_R_MISSING_SECOND_NUMBER 138 --# define ASN1_R_MISSING_VALUE 189 --# define ASN1_R_MSTRING_NOT_UNIVERSAL 139 --# define ASN1_R_MSTRING_WRONG_TAG 140 --# define ASN1_R_NESTED_ASN1_STRING 197 --# define ASN1_R_NESTED_TOO_DEEP 201 --# define ASN1_R_NON_HEX_CHARACTERS 141 --# define ASN1_R_NOT_ASCII_FORMAT 190 --# define ASN1_R_NOT_ENOUGH_DATA 142 --# define ASN1_R_NO_CONTENT_TYPE 209 --# define ASN1_R_NO_MATCHING_CHOICE_TYPE 143 --# define ASN1_R_NO_MULTIPART_BODY_FAILURE 210 --# define ASN1_R_NO_MULTIPART_BOUNDARY 211 --# define ASN1_R_NO_SIG_CONTENT_TYPE 212 --# define ASN1_R_NULL_IS_WRONG_LENGTH 144 --# define ASN1_R_OBJECT_NOT_ASCII_FORMAT 191 --# define ASN1_R_ODD_NUMBER_OF_CHARS 145 --# define ASN1_R_SECOND_NUMBER_TOO_LARGE 147 --# define ASN1_R_SEQUENCE_LENGTH_MISMATCH 148 --# define ASN1_R_SEQUENCE_NOT_CONSTRUCTED 149 --# define ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG 192 --# define ASN1_R_SHORT_LINE 150 --# define ASN1_R_SIG_INVALID_MIME_TYPE 213 --# define ASN1_R_STREAMING_NOT_SUPPORTED 202 --# define ASN1_R_STRING_TOO_LONG 151 --# define ASN1_R_STRING_TOO_SHORT 152 --# define ASN1_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 154 --# define ASN1_R_TIME_NOT_ASCII_FORMAT 193 --# define ASN1_R_TOO_LARGE 223 --# define ASN1_R_TOO_LONG 155 --# define ASN1_R_TOO_SMALL 224 --# define ASN1_R_TYPE_NOT_CONSTRUCTED 156 --# define ASN1_R_TYPE_NOT_PRIMITIVE 195 --# define ASN1_R_UNEXPECTED_EOC 159 --# define ASN1_R_UNIVERSALSTRING_IS_WRONG_LENGTH 215 --# define ASN1_R_UNKNOWN_FORMAT 160 --# define ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM 161 --# define ASN1_R_UNKNOWN_OBJECT_TYPE 162 --# define ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE 163 --# define ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM 199 --# define ASN1_R_UNKNOWN_TAG 194 --# define ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE 164 --# define ASN1_R_UNSUPPORTED_CIPHER 228 --# define ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE 167 --# define ASN1_R_UNSUPPORTED_TYPE 196 --# define ASN1_R_WRONG_INTEGER_TYPE 225 --# define ASN1_R_WRONG_PUBLIC_KEY_TYPE 200 --# define ASN1_R_WRONG_TAG 168 -- --#endif -diff --git a/uadk_tool/include/openssl/asn1t.h b/uadk_tool/include/openssl/asn1t.h -deleted file mode 100644 -index a450ba0..0000000 ---- a/uadk_tool/include/openssl/asn1t.h -+++ /dev/null -@@ -1,945 +0,0 @@ --/* -- * Copyright 2000-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_ASN1T_H --# define HEADER_ASN1T_H -- --# include --# include --# include -- --# ifdef OPENSSL_BUILD_SHLIBCRYPTO --# undef OPENSSL_EXTERN --# define OPENSSL_EXTERN OPENSSL_EXPORT --# endif -- --/* ASN1 template defines, structures and functions */ -- --#ifdef __cplusplus --extern "C" { --#endif -- --# ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION -- --/* Macro to obtain ASN1_ADB pointer from a type (only used internally) */ --# define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr)) -- --/* Macros for start and end of ASN1_ITEM definition */ -- --# define ASN1_ITEM_start(itname) \ -- const ASN1_ITEM itname##_it = { -- --# define static_ASN1_ITEM_start(itname) \ -- static const ASN1_ITEM itname##_it = { -- --# define ASN1_ITEM_end(itname) \ -- }; -- --# else -- --/* Macro to obtain ASN1_ADB pointer from a type (only used internally) */ --# define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)((iptr)())) -- --/* Macros for start and end of ASN1_ITEM definition */ -- --# define ASN1_ITEM_start(itname) \ -- const ASN1_ITEM * itname##_it(void) \ -- { \ -- static const ASN1_ITEM local_it = { -- --# define static_ASN1_ITEM_start(itname) \ -- static ASN1_ITEM_start(itname) -- --# define ASN1_ITEM_end(itname) \ -- }; \ -- return &local_it; \ -- } -- --# endif -- --/* Macros to aid ASN1 template writing */ -- --# define ASN1_ITEM_TEMPLATE(tname) \ -- static const ASN1_TEMPLATE tname##_item_tt -- --# define ASN1_ITEM_TEMPLATE_END(tname) \ -- ;\ -- ASN1_ITEM_start(tname) \ -- ASN1_ITYPE_PRIMITIVE,\ -- -1,\ -- &tname##_item_tt,\ -- 0,\ -- NULL,\ -- 0,\ -- #tname \ -- ASN1_ITEM_end(tname) --# define static_ASN1_ITEM_TEMPLATE_END(tname) \ -- ;\ -- static_ASN1_ITEM_start(tname) \ -- ASN1_ITYPE_PRIMITIVE,\ -- -1,\ -- &tname##_item_tt,\ -- 0,\ -- NULL,\ -- 0,\ -- #tname \ -- ASN1_ITEM_end(tname) -- --/* This is a ASN1 type which just embeds a template */ -- --/*- -- * This pair helps declare a SEQUENCE. We can do: -- * -- * ASN1_SEQUENCE(stname) = { -- * ... SEQUENCE components ... -- * } ASN1_SEQUENCE_END(stname) -- * -- * This will produce an ASN1_ITEM called stname_it -- * for a structure called stname. -- * -- * If you want the same structure but a different -- * name then use: -- * -- * ASN1_SEQUENCE(itname) = { -- * ... SEQUENCE components ... -- * } ASN1_SEQUENCE_END_name(stname, itname) -- * -- * This will create an item called itname_it using -- * a structure called stname. -- */ -- --# define ASN1_SEQUENCE(tname) \ -- static const ASN1_TEMPLATE tname##_seq_tt[] -- --# define ASN1_SEQUENCE_END(stname) ASN1_SEQUENCE_END_name(stname, stname) -- --# define static_ASN1_SEQUENCE_END(stname) static_ASN1_SEQUENCE_END_name(stname, stname) -- --# define ASN1_SEQUENCE_END_name(stname, tname) \ -- ;\ -- ASN1_ITEM_start(tname) \ -- ASN1_ITYPE_SEQUENCE,\ -- V_ASN1_SEQUENCE,\ -- tname##_seq_tt,\ -- sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ -- NULL,\ -- sizeof(stname),\ -- #tname \ -- ASN1_ITEM_end(tname) -- --# define static_ASN1_SEQUENCE_END_name(stname, tname) \ -- ;\ -- static_ASN1_ITEM_start(tname) \ -- ASN1_ITYPE_SEQUENCE,\ -- V_ASN1_SEQUENCE,\ -- tname##_seq_tt,\ -- sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ -- NULL,\ -- sizeof(stname),\ -- #stname \ -- ASN1_ITEM_end(tname) -- --# define ASN1_NDEF_SEQUENCE(tname) \ -- ASN1_SEQUENCE(tname) -- --# define ASN1_NDEF_SEQUENCE_cb(tname, cb) \ -- ASN1_SEQUENCE_cb(tname, cb) -- --# define ASN1_SEQUENCE_cb(tname, cb) \ -- static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \ -- ASN1_SEQUENCE(tname) -- --# define ASN1_BROKEN_SEQUENCE(tname) \ -- static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_BROKEN, 0, 0, 0, 0}; \ -- ASN1_SEQUENCE(tname) -- --# define ASN1_SEQUENCE_ref(tname, cb) \ -- static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_REFCOUNT, offsetof(tname, references), offsetof(tname, lock), cb, 0}; \ -- ASN1_SEQUENCE(tname) -- --# define ASN1_SEQUENCE_enc(tname, enc, cb) \ -- static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_ENCODING, 0, 0, cb, offsetof(tname, enc)}; \ -- ASN1_SEQUENCE(tname) -- --# define ASN1_NDEF_SEQUENCE_END(tname) \ -- ;\ -- ASN1_ITEM_start(tname) \ -- ASN1_ITYPE_NDEF_SEQUENCE,\ -- V_ASN1_SEQUENCE,\ -- tname##_seq_tt,\ -- sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ -- NULL,\ -- sizeof(tname),\ -- #tname \ -- ASN1_ITEM_end(tname) --# define static_ASN1_NDEF_SEQUENCE_END(tname) \ -- ;\ -- static_ASN1_ITEM_start(tname) \ -- ASN1_ITYPE_NDEF_SEQUENCE,\ -- V_ASN1_SEQUENCE,\ -- tname##_seq_tt,\ -- sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ -- NULL,\ -- sizeof(tname),\ -- #tname \ -- ASN1_ITEM_end(tname) -- --# define ASN1_BROKEN_SEQUENCE_END(stname) ASN1_SEQUENCE_END_ref(stname, stname) --# define static_ASN1_BROKEN_SEQUENCE_END(stname) \ -- static_ASN1_SEQUENCE_END_ref(stname, stname) -- --# define ASN1_SEQUENCE_END_enc(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) -- --# define ASN1_SEQUENCE_END_cb(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) --# define static_ASN1_SEQUENCE_END_cb(stname, tname) static_ASN1_SEQUENCE_END_ref(stname, tname) -- --# define ASN1_SEQUENCE_END_ref(stname, tname) \ -- ;\ -- ASN1_ITEM_start(tname) \ -- ASN1_ITYPE_SEQUENCE,\ -- V_ASN1_SEQUENCE,\ -- tname##_seq_tt,\ -- sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ -- &tname##_aux,\ -- sizeof(stname),\ -- #tname \ -- ASN1_ITEM_end(tname) --# define static_ASN1_SEQUENCE_END_ref(stname, tname) \ -- ;\ -- static_ASN1_ITEM_start(tname) \ -- ASN1_ITYPE_SEQUENCE,\ -- V_ASN1_SEQUENCE,\ -- tname##_seq_tt,\ -- sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ -- &tname##_aux,\ -- sizeof(stname),\ -- #stname \ -- ASN1_ITEM_end(tname) -- --# define ASN1_NDEF_SEQUENCE_END_cb(stname, tname) \ -- ;\ -- ASN1_ITEM_start(tname) \ -- ASN1_ITYPE_NDEF_SEQUENCE,\ -- V_ASN1_SEQUENCE,\ -- tname##_seq_tt,\ -- sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ -- &tname##_aux,\ -- sizeof(stname),\ -- #stname \ -- ASN1_ITEM_end(tname) -- --/*- -- * This pair helps declare a CHOICE type. We can do: -- * -- * ASN1_CHOICE(chname) = { -- * ... CHOICE options ... -- * ASN1_CHOICE_END(chname) -- * -- * This will produce an ASN1_ITEM called chname_it -- * for a structure called chname. The structure -- * definition must look like this: -- * typedef struct { -- * int type; -- * union { -- * ASN1_SOMETHING *opt1; -- * ASN1_SOMEOTHER *opt2; -- * } value; -- * } chname; -- * -- * the name of the selector must be 'type'. -- * to use an alternative selector name use the -- * ASN1_CHOICE_END_selector() version. -- */ -- --# define ASN1_CHOICE(tname) \ -- static const ASN1_TEMPLATE tname##_ch_tt[] -- --# define ASN1_CHOICE_cb(tname, cb) \ -- static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \ -- ASN1_CHOICE(tname) -- --# define ASN1_CHOICE_END(stname) ASN1_CHOICE_END_name(stname, stname) -- --# define static_ASN1_CHOICE_END(stname) static_ASN1_CHOICE_END_name(stname, stname) -- --# define ASN1_CHOICE_END_name(stname, tname) ASN1_CHOICE_END_selector(stname, tname, type) -- --# define static_ASN1_CHOICE_END_name(stname, tname) static_ASN1_CHOICE_END_selector(stname, tname, type) -- --# define ASN1_CHOICE_END_selector(stname, tname, selname) \ -- ;\ -- ASN1_ITEM_start(tname) \ -- ASN1_ITYPE_CHOICE,\ -- offsetof(stname,selname) ,\ -- tname##_ch_tt,\ -- sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ -- NULL,\ -- sizeof(stname),\ -- #stname \ -- ASN1_ITEM_end(tname) -- --# define static_ASN1_CHOICE_END_selector(stname, tname, selname) \ -- ;\ -- static_ASN1_ITEM_start(tname) \ -- ASN1_ITYPE_CHOICE,\ -- offsetof(stname,selname) ,\ -- tname##_ch_tt,\ -- sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ -- NULL,\ -- sizeof(stname),\ -- #stname \ -- ASN1_ITEM_end(tname) -- --# define ASN1_CHOICE_END_cb(stname, tname, selname) \ -- ;\ -- ASN1_ITEM_start(tname) \ -- ASN1_ITYPE_CHOICE,\ -- offsetof(stname,selname) ,\ -- tname##_ch_tt,\ -- sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ -- &tname##_aux,\ -- sizeof(stname),\ -- #stname \ -- ASN1_ITEM_end(tname) -- --/* This helps with the template wrapper form of ASN1_ITEM */ -- --# define ASN1_EX_TEMPLATE_TYPE(flags, tag, name, type) { \ -- (flags), (tag), 0,\ -- #name, ASN1_ITEM_ref(type) } -- --/* These help with SEQUENCE or CHOICE components */ -- --/* used to declare other types */ -- --# define ASN1_EX_TYPE(flags, tag, stname, field, type) { \ -- (flags), (tag), offsetof(stname, field),\ -- #field, ASN1_ITEM_ref(type) } -- --/* implicit and explicit helper macros */ -- --# define ASN1_IMP_EX(stname, field, type, tag, ex) \ -- ASN1_EX_TYPE(ASN1_TFLG_IMPLICIT | (ex), tag, stname, field, type) -- --# define ASN1_EXP_EX(stname, field, type, tag, ex) \ -- ASN1_EX_TYPE(ASN1_TFLG_EXPLICIT | (ex), tag, stname, field, type) -- --/* Any defined by macros: the field used is in the table itself */ -- --# ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION --# define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) } --# define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) } --# else --# define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, tblname##_adb } --# define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, tblname##_adb } --# endif --/* Plain simple type */ --# define ASN1_SIMPLE(stname, field, type) ASN1_EX_TYPE(0,0, stname, field, type) --/* Embedded simple type */ --# define ASN1_EMBED(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_EMBED,0, stname, field, type) -- --/* OPTIONAL simple type */ --# define ASN1_OPT(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL, 0, stname, field, type) --# define ASN1_OPT_EMBED(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL|ASN1_TFLG_EMBED, 0, stname, field, type) -- --/* IMPLICIT tagged simple type */ --# define ASN1_IMP(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, 0) --# define ASN1_IMP_EMBED(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_EMBED) -- --/* IMPLICIT tagged OPTIONAL simple type */ --# define ASN1_IMP_OPT(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) --# define ASN1_IMP_OPT_EMBED(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_EMBED) -- --/* Same as above but EXPLICIT */ -- --# define ASN1_EXP(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, 0) --# define ASN1_EXP_EMBED(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_EMBED) --# define ASN1_EXP_OPT(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) --# define ASN1_EXP_OPT_EMBED(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_EMBED) -- --/* SEQUENCE OF type */ --# define ASN1_SEQUENCE_OF(stname, field, type) \ -- ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, stname, field, type) -- --/* OPTIONAL SEQUENCE OF */ --# define ASN1_SEQUENCE_OF_OPT(stname, field, type) \ -- ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type) -- --/* Same as above but for SET OF */ -- --# define ASN1_SET_OF(stname, field, type) \ -- ASN1_EX_TYPE(ASN1_TFLG_SET_OF, 0, stname, field, type) -- --# define ASN1_SET_OF_OPT(stname, field, type) \ -- ASN1_EX_TYPE(ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type) -- --/* Finally compound types of SEQUENCE, SET, IMPLICIT, EXPLICIT and OPTIONAL */ -- --# define ASN1_IMP_SET_OF(stname, field, type, tag) \ -- ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) -- --# define ASN1_EXP_SET_OF(stname, field, type, tag) \ -- ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) -- --# define ASN1_IMP_SET_OF_OPT(stname, field, type, tag) \ -- ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL) -- --# define ASN1_EXP_SET_OF_OPT(stname, field, type, tag) \ -- ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL) -- --# define ASN1_IMP_SEQUENCE_OF(stname, field, type, tag) \ -- ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) -- --# define ASN1_IMP_SEQUENCE_OF_OPT(stname, field, type, tag) \ -- ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL) -- --# define ASN1_EXP_SEQUENCE_OF(stname, field, type, tag) \ -- ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) -- --# define ASN1_EXP_SEQUENCE_OF_OPT(stname, field, type, tag) \ -- ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL) -- --/* EXPLICIT using indefinite length constructed form */ --# define ASN1_NDEF_EXP(stname, field, type, tag) \ -- ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_NDEF) -- --/* EXPLICIT OPTIONAL using indefinite length constructed form */ --# define ASN1_NDEF_EXP_OPT(stname, field, type, tag) \ -- ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_NDEF) -- --/* Macros for the ASN1_ADB structure */ -- --# define ASN1_ADB(name) \ -- static const ASN1_ADB_TABLE name##_adbtbl[] -- --# ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION -- --# define ASN1_ADB_END(name, flags, field, adb_cb, def, none) \ -- ;\ -- static const ASN1_ADB name##_adb = {\ -- flags,\ -- offsetof(name, field),\ -- adb_cb,\ -- name##_adbtbl,\ -- sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\ -- def,\ -- none\ -- } -- --# else -- --# define ASN1_ADB_END(name, flags, field, adb_cb, def, none) \ -- ;\ -- static const ASN1_ITEM *name##_adb(void) \ -- { \ -- static const ASN1_ADB internal_adb = \ -- {\ -- flags,\ -- offsetof(name, field),\ -- adb_cb,\ -- name##_adbtbl,\ -- sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\ -- def,\ -- none\ -- }; \ -- return (const ASN1_ITEM *) &internal_adb; \ -- } \ -- void dummy_function(void) -- --# endif -- --# define ADB_ENTRY(val, template) {val, template} -- --# define ASN1_ADB_TEMPLATE(name) \ -- static const ASN1_TEMPLATE name##_tt -- --/* -- * This is the ASN1 template structure that defines a wrapper round the -- * actual type. It determines the actual position of the field in the value -- * structure, various flags such as OPTIONAL and the field name. -- */ -- --struct ASN1_TEMPLATE_st { -- unsigned long flags; /* Various flags */ -- long tag; /* tag, not used if no tagging */ -- unsigned long offset; /* Offset of this field in structure */ -- const char *field_name; /* Field name */ -- ASN1_ITEM_EXP *item; /* Relevant ASN1_ITEM or ASN1_ADB */ --}; -- --/* Macro to extract ASN1_ITEM and ASN1_ADB pointer from ASN1_TEMPLATE */ -- --# define ASN1_TEMPLATE_item(t) (t->item_ptr) --# define ASN1_TEMPLATE_adb(t) (t->item_ptr) -- --typedef struct ASN1_ADB_TABLE_st ASN1_ADB_TABLE; --typedef struct ASN1_ADB_st ASN1_ADB; -- --struct ASN1_ADB_st { -- unsigned long flags; /* Various flags */ -- unsigned long offset; /* Offset of selector field */ -- int (*adb_cb)(long *psel); /* Application callback */ -- const ASN1_ADB_TABLE *tbl; /* Table of possible types */ -- long tblcount; /* Number of entries in tbl */ -- const ASN1_TEMPLATE *default_tt; /* Type to use if no match */ -- const ASN1_TEMPLATE *null_tt; /* Type to use if selector is NULL */ --}; -- --struct ASN1_ADB_TABLE_st { -- long value; /* NID for an object or value for an int */ -- const ASN1_TEMPLATE tt; /* item for this value */ --}; -- --/* template flags */ -- --/* Field is optional */ --# define ASN1_TFLG_OPTIONAL (0x1) -- --/* Field is a SET OF */ --# define ASN1_TFLG_SET_OF (0x1 << 1) -- --/* Field is a SEQUENCE OF */ --# define ASN1_TFLG_SEQUENCE_OF (0x2 << 1) -- --/* -- * Special case: this refers to a SET OF that will be sorted into DER order -- * when encoded *and* the corresponding STACK will be modified to match the -- * new order. -- */ --# define ASN1_TFLG_SET_ORDER (0x3 << 1) -- --/* Mask for SET OF or SEQUENCE OF */ --# define ASN1_TFLG_SK_MASK (0x3 << 1) -- --/* -- * These flags mean the tag should be taken from the tag field. If EXPLICIT -- * then the underlying type is used for the inner tag. -- */ -- --/* IMPLICIT tagging */ --# define ASN1_TFLG_IMPTAG (0x1 << 3) -- --/* EXPLICIT tagging, inner tag from underlying type */ --# define ASN1_TFLG_EXPTAG (0x2 << 3) -- --# define ASN1_TFLG_TAG_MASK (0x3 << 3) -- --/* context specific IMPLICIT */ --# define ASN1_TFLG_IMPLICIT (ASN1_TFLG_IMPTAG|ASN1_TFLG_CONTEXT) -- --/* context specific EXPLICIT */ --# define ASN1_TFLG_EXPLICIT (ASN1_TFLG_EXPTAG|ASN1_TFLG_CONTEXT) -- --/* -- * If tagging is in force these determine the type of tag to use. Otherwise -- * the tag is determined by the underlying type. These values reflect the -- * actual octet format. -- */ -- --/* Universal tag */ --# define ASN1_TFLG_UNIVERSAL (0x0<<6) --/* Application tag */ --# define ASN1_TFLG_APPLICATION (0x1<<6) --/* Context specific tag */ --# define ASN1_TFLG_CONTEXT (0x2<<6) --/* Private tag */ --# define ASN1_TFLG_PRIVATE (0x3<<6) -- --# define ASN1_TFLG_TAG_CLASS (0x3<<6) -- --/* -- * These are for ANY DEFINED BY type. In this case the 'item' field points to -- * an ASN1_ADB structure which contains a table of values to decode the -- * relevant type -- */ -- --# define ASN1_TFLG_ADB_MASK (0x3<<8) -- --# define ASN1_TFLG_ADB_OID (0x1<<8) -- --# define ASN1_TFLG_ADB_INT (0x1<<9) -- --/* -- * This flag when present in a SEQUENCE OF, SET OF or EXPLICIT causes -- * indefinite length constructed encoding to be used if required. -- */ -- --# define ASN1_TFLG_NDEF (0x1<<11) -- --/* Field is embedded and not a pointer */ --# define ASN1_TFLG_EMBED (0x1 << 12) -- --/* This is the actual ASN1 item itself */ -- --struct ASN1_ITEM_st { -- char itype; /* The item type, primitive, SEQUENCE, CHOICE -- * or extern */ -- long utype; /* underlying type */ -- const ASN1_TEMPLATE *templates; /* If SEQUENCE or CHOICE this contains -- * the contents */ -- long tcount; /* Number of templates if SEQUENCE or CHOICE */ -- const void *funcs; /* functions that handle this type */ -- long size; /* Structure size (usually) */ -- const char *sname; /* Structure name */ --}; -- --/*- -- * These are values for the itype field and -- * determine how the type is interpreted. -- * -- * For PRIMITIVE types the underlying type -- * determines the behaviour if items is NULL. -- * -- * Otherwise templates must contain a single -- * template and the type is treated in the -- * same way as the type specified in the template. -- * -- * For SEQUENCE types the templates field points -- * to the members, the size field is the -- * structure size. -- * -- * For CHOICE types the templates field points -- * to each possible member (typically a union) -- * and the 'size' field is the offset of the -- * selector. -- * -- * The 'funcs' field is used for application -- * specific functions. -- * -- * The EXTERN type uses a new style d2i/i2d. -- * The new style should be used where possible -- * because it avoids things like the d2i IMPLICIT -- * hack. -- * -- * MSTRING is a multiple string type, it is used -- * for a CHOICE of character strings where the -- * actual strings all occupy an ASN1_STRING -- * structure. In this case the 'utype' field -- * has a special meaning, it is used as a mask -- * of acceptable types using the B_ASN1 constants. -- * -- * NDEF_SEQUENCE is the same as SEQUENCE except -- * that it will use indefinite length constructed -- * encoding if requested. -- * -- */ -- --# define ASN1_ITYPE_PRIMITIVE 0x0 -- --# define ASN1_ITYPE_SEQUENCE 0x1 -- --# define ASN1_ITYPE_CHOICE 0x2 -- --# define ASN1_ITYPE_EXTERN 0x4 -- --# define ASN1_ITYPE_MSTRING 0x5 -- --# define ASN1_ITYPE_NDEF_SEQUENCE 0x6 -- --/* -- * Cache for ASN1 tag and length, so we don't keep re-reading it for things -- * like CHOICE -- */ -- --struct ASN1_TLC_st { -- char valid; /* Values below are valid */ -- int ret; /* return value */ -- long plen; /* length */ -- int ptag; /* class value */ -- int pclass; /* class value */ -- int hdrlen; /* header length */ --}; -- --/* Typedefs for ASN1 function pointers */ --typedef int ASN1_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, -- const ASN1_ITEM *it, int tag, int aclass, char opt, -- ASN1_TLC *ctx); -- --typedef int ASN1_ex_i2d(ASN1_VALUE **pval, unsigned char **out, -- const ASN1_ITEM *it, int tag, int aclass); --typedef int ASN1_ex_new_func(ASN1_VALUE **pval, const ASN1_ITEM *it); --typedef void ASN1_ex_free_func(ASN1_VALUE **pval, const ASN1_ITEM *it); -- --typedef int ASN1_ex_print_func(BIO *out, ASN1_VALUE **pval, -- int indent, const char *fname, -- const ASN1_PCTX *pctx); -- --typedef int ASN1_primitive_i2c(ASN1_VALUE **pval, unsigned char *cont, -- int *putype, const ASN1_ITEM *it); --typedef int ASN1_primitive_c2i(ASN1_VALUE **pval, const unsigned char *cont, -- int len, int utype, char *free_cont, -- const ASN1_ITEM *it); --typedef int ASN1_primitive_print(BIO *out, ASN1_VALUE **pval, -- const ASN1_ITEM *it, int indent, -- const ASN1_PCTX *pctx); -- --typedef struct ASN1_EXTERN_FUNCS_st { -- void *app_data; -- ASN1_ex_new_func *asn1_ex_new; -- ASN1_ex_free_func *asn1_ex_free; -- ASN1_ex_free_func *asn1_ex_clear; -- ASN1_ex_d2i *asn1_ex_d2i; -- ASN1_ex_i2d *asn1_ex_i2d; -- ASN1_ex_print_func *asn1_ex_print; --} ASN1_EXTERN_FUNCS; -- --typedef struct ASN1_PRIMITIVE_FUNCS_st { -- void *app_data; -- unsigned long flags; -- ASN1_ex_new_func *prim_new; -- ASN1_ex_free_func *prim_free; -- ASN1_ex_free_func *prim_clear; -- ASN1_primitive_c2i *prim_c2i; -- ASN1_primitive_i2c *prim_i2c; -- ASN1_primitive_print *prim_print; --} ASN1_PRIMITIVE_FUNCS; -- --/* -- * This is the ASN1_AUX structure: it handles various miscellaneous -- * requirements. For example the use of reference counts and an informational -- * callback. The "informational callback" is called at various points during -- * the ASN1 encoding and decoding. It can be used to provide minor -- * customisation of the structures used. This is most useful where the -- * supplied routines *almost* do the right thing but need some extra help at -- * a few points. If the callback returns zero then it is assumed a fatal -- * error has occurred and the main operation should be abandoned. If major -- * changes in the default behaviour are required then an external type is -- * more appropriate. -- */ -- --typedef int ASN1_aux_cb(int operation, ASN1_VALUE **in, const ASN1_ITEM *it, -- void *exarg); -- --typedef struct ASN1_AUX_st { -- void *app_data; -- int flags; -- int ref_offset; /* Offset of reference value */ -- int ref_lock; /* Lock type to use */ -- ASN1_aux_cb *asn1_cb; -- int enc_offset; /* Offset of ASN1_ENCODING structure */ --} ASN1_AUX; -- --/* For print related callbacks exarg points to this structure */ --typedef struct ASN1_PRINT_ARG_st { -- BIO *out; -- int indent; -- const ASN1_PCTX *pctx; --} ASN1_PRINT_ARG; -- --/* For streaming related callbacks exarg points to this structure */ --typedef struct ASN1_STREAM_ARG_st { -- /* BIO to stream through */ -- BIO *out; -- /* BIO with filters appended */ -- BIO *ndef_bio; -- /* Streaming I/O boundary */ -- unsigned char **boundary; --} ASN1_STREAM_ARG; -- --/* Flags in ASN1_AUX */ -- --/* Use a reference count */ --# define ASN1_AFLG_REFCOUNT 1 --/* Save the encoding of structure (useful for signatures) */ --# define ASN1_AFLG_ENCODING 2 --/* The Sequence length is invalid */ --# define ASN1_AFLG_BROKEN 4 -- --/* operation values for asn1_cb */ -- --# define ASN1_OP_NEW_PRE 0 --# define ASN1_OP_NEW_POST 1 --# define ASN1_OP_FREE_PRE 2 --# define ASN1_OP_FREE_POST 3 --# define ASN1_OP_D2I_PRE 4 --# define ASN1_OP_D2I_POST 5 --# define ASN1_OP_I2D_PRE 6 --# define ASN1_OP_I2D_POST 7 --# define ASN1_OP_PRINT_PRE 8 --# define ASN1_OP_PRINT_POST 9 --# define ASN1_OP_STREAM_PRE 10 --# define ASN1_OP_STREAM_POST 11 --# define ASN1_OP_DETACHED_PRE 12 --# define ASN1_OP_DETACHED_POST 13 -- --/* Macro to implement a primitive type */ --# define IMPLEMENT_ASN1_TYPE(stname) IMPLEMENT_ASN1_TYPE_ex(stname, stname, 0) --# define IMPLEMENT_ASN1_TYPE_ex(itname, vname, ex) \ -- ASN1_ITEM_start(itname) \ -- ASN1_ITYPE_PRIMITIVE, V_##vname, NULL, 0, NULL, ex, #itname \ -- ASN1_ITEM_end(itname) -- --/* Macro to implement a multi string type */ --# define IMPLEMENT_ASN1_MSTRING(itname, mask) \ -- ASN1_ITEM_start(itname) \ -- ASN1_ITYPE_MSTRING, mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname \ -- ASN1_ITEM_end(itname) -- --# define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \ -- ASN1_ITEM_start(sname) \ -- ASN1_ITYPE_EXTERN, \ -- tag, \ -- NULL, \ -- 0, \ -- &fptrs, \ -- 0, \ -- #sname \ -- ASN1_ITEM_end(sname) -- --/* Macro to implement standard functions in terms of ASN1_ITEM structures */ -- --# define IMPLEMENT_ASN1_FUNCTIONS(stname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, stname, stname) -- --# define IMPLEMENT_ASN1_FUNCTIONS_name(stname, itname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, itname) -- --# define IMPLEMENT_ASN1_FUNCTIONS_ENCODE_name(stname, itname) \ -- IMPLEMENT_ASN1_FUNCTIONS_ENCODE_fname(stname, itname, itname) -- --# define IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(stname) \ -- IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(static, stname, stname, stname) -- --# define IMPLEMENT_ASN1_ALLOC_FUNCTIONS(stname) \ -- IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, stname, stname) -- --# define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(pre, stname, itname, fname) \ -- pre stname *fname##_new(void) \ -- { \ -- return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ -- } \ -- pre void fname##_free(stname *a) \ -- { \ -- ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ -- } -- --# define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) \ -- stname *fname##_new(void) \ -- { \ -- return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ -- } \ -- void fname##_free(stname *a) \ -- { \ -- ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ -- } -- --# define IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, fname) \ -- IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ -- IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) -- --# define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ -- stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ -- { \ -- return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\ -- } \ -- int i2d_##fname(stname *a, unsigned char **out) \ -- { \ -- return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\ -- } -- --# define IMPLEMENT_ASN1_NDEF_FUNCTION(stname) \ -- int i2d_##stname##_NDEF(stname *a, unsigned char **out) \ -- { \ -- return ASN1_item_ndef_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(stname));\ -- } -- --# define IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(stname) \ -- static stname *d2i_##stname(stname **a, \ -- const unsigned char **in, long len) \ -- { \ -- return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, \ -- ASN1_ITEM_rptr(stname)); \ -- } \ -- static int i2d_##stname(stname *a, unsigned char **out) \ -- { \ -- return ASN1_item_i2d((ASN1_VALUE *)a, out, \ -- ASN1_ITEM_rptr(stname)); \ -- } -- --/* -- * This includes evil casts to remove const: they will go away when full ASN1 -- * constification is done. -- */ --# define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ -- stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ -- { \ -- return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\ -- } \ -- int i2d_##fname(const stname *a, unsigned char **out) \ -- { \ -- return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\ -- } -- --# define IMPLEMENT_ASN1_DUP_FUNCTION(stname) \ -- stname * stname##_dup(stname *x) \ -- { \ -- return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); \ -- } -- --# define IMPLEMENT_ASN1_PRINT_FUNCTION(stname) \ -- IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, stname, stname) -- --# define IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, itname, fname) \ -- int fname##_print_ctx(BIO *out, stname *x, int indent, \ -- const ASN1_PCTX *pctx) \ -- { \ -- return ASN1_item_print(out, (ASN1_VALUE *)x, indent, \ -- ASN1_ITEM_rptr(itname), pctx); \ -- } -- --# define IMPLEMENT_ASN1_FUNCTIONS_const(name) \ -- IMPLEMENT_ASN1_FUNCTIONS_const_fname(name, name, name) -- --# define IMPLEMENT_ASN1_FUNCTIONS_const_fname(stname, itname, fname) \ -- IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ -- IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) -- --/* external definitions for primitive types */ -- --DECLARE_ASN1_ITEM(ASN1_BOOLEAN) --DECLARE_ASN1_ITEM(ASN1_TBOOLEAN) --DECLARE_ASN1_ITEM(ASN1_FBOOLEAN) --DECLARE_ASN1_ITEM(ASN1_SEQUENCE) --DECLARE_ASN1_ITEM(CBIGNUM) --DECLARE_ASN1_ITEM(BIGNUM) --DECLARE_ASN1_ITEM(INT32) --DECLARE_ASN1_ITEM(ZINT32) --DECLARE_ASN1_ITEM(UINT32) --DECLARE_ASN1_ITEM(ZUINT32) --DECLARE_ASN1_ITEM(INT64) --DECLARE_ASN1_ITEM(ZINT64) --DECLARE_ASN1_ITEM(UINT64) --DECLARE_ASN1_ITEM(ZUINT64) -- --# if OPENSSL_API_COMPAT < 0x10200000L --/* -- * LONG and ZLONG are strongly discouraged for use as stored data, as the -- * underlying C type (long) differs in size depending on the architecture. -- * They are designed with 32-bit longs in mind. -- */ --DECLARE_ASN1_ITEM(LONG) --DECLARE_ASN1_ITEM(ZLONG) --# endif -- --DEFINE_STACK_OF(ASN1_VALUE) -- --/* Functions used internally by the ASN1 code */ -- --int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it); --void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it); -- --int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, -- const ASN1_ITEM *it, int tag, int aclass, char opt, -- ASN1_TLC *ctx); -- --int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out, -- const ASN1_ITEM *it, int tag, int aclass); -- --#ifdef __cplusplus --} --#endif --#endif -diff --git a/uadk_tool/include/openssl/async.h b/uadk_tool/include/openssl/async.h -deleted file mode 100644 -index 7052b89..0000000 ---- a/uadk_tool/include/openssl/async.h -+++ /dev/null -@@ -1,76 +0,0 @@ --/* -- * Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#include -- --#ifndef HEADER_ASYNC_H --# define HEADER_ASYNC_H -- --#if defined(_WIN32) --# if defined(BASETYPES) || defined(_WINDEF_H) --/* application has to include to use this */ --#define OSSL_ASYNC_FD HANDLE --#define OSSL_BAD_ASYNC_FD INVALID_HANDLE_VALUE --# endif --#else --#define OSSL_ASYNC_FD int --#define OSSL_BAD_ASYNC_FD -1 --#endif --# include -- -- --# ifdef __cplusplus --extern "C" { --# endif -- --typedef struct async_job_st ASYNC_JOB; --typedef struct async_wait_ctx_st ASYNC_WAIT_CTX; -- --#define ASYNC_ERR 0 --#define ASYNC_NO_JOBS 1 --#define ASYNC_PAUSE 2 --#define ASYNC_FINISH 3 -- --int ASYNC_init_thread(size_t max_size, size_t init_size); --void ASYNC_cleanup_thread(void); -- --#ifdef OSSL_ASYNC_FD --ASYNC_WAIT_CTX *ASYNC_WAIT_CTX_new(void); --void ASYNC_WAIT_CTX_free(ASYNC_WAIT_CTX *ctx); --int ASYNC_WAIT_CTX_set_wait_fd(ASYNC_WAIT_CTX *ctx, const void *key, -- OSSL_ASYNC_FD fd, -- void *custom_data, -- void (*cleanup)(ASYNC_WAIT_CTX *, const void *, -- OSSL_ASYNC_FD, void *)); --int ASYNC_WAIT_CTX_get_fd(ASYNC_WAIT_CTX *ctx, const void *key, -- OSSL_ASYNC_FD *fd, void **custom_data); --int ASYNC_WAIT_CTX_get_all_fds(ASYNC_WAIT_CTX *ctx, OSSL_ASYNC_FD *fd, -- size_t *numfds); --int ASYNC_WAIT_CTX_get_changed_fds(ASYNC_WAIT_CTX *ctx, OSSL_ASYNC_FD *addfd, -- size_t *numaddfds, OSSL_ASYNC_FD *delfd, -- size_t *numdelfds); --int ASYNC_WAIT_CTX_clear_fd(ASYNC_WAIT_CTX *ctx, const void *key); --#endif -- --int ASYNC_is_capable(void); -- --int ASYNC_start_job(ASYNC_JOB **job, ASYNC_WAIT_CTX *ctx, int *ret, -- int (*func)(void *), void *args, size_t size); --int ASYNC_pause_job(void); -- --ASYNC_JOB *ASYNC_get_current_job(void); --ASYNC_WAIT_CTX *ASYNC_get_wait_ctx(ASYNC_JOB *job); --void ASYNC_block_pause(void); --void ASYNC_unblock_pause(void); -- -- --# ifdef __cplusplus --} --# endif --#endif -diff --git a/uadk_tool/include/openssl/asyncerr.h b/uadk_tool/include/openssl/asyncerr.h -deleted file mode 100644 -index 91afbbb..0000000 ---- a/uadk_tool/include/openssl/asyncerr.h -+++ /dev/null -@@ -1,42 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_ASYNCERR_H --# define HEADER_ASYNCERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_ASYNC_strings(void); -- --/* -- * ASYNC function codes. -- */ --# define ASYNC_F_ASYNC_CTX_NEW 100 --# define ASYNC_F_ASYNC_INIT_THREAD 101 --# define ASYNC_F_ASYNC_JOB_NEW 102 --# define ASYNC_F_ASYNC_PAUSE_JOB 103 --# define ASYNC_F_ASYNC_START_FUNC 104 --# define ASYNC_F_ASYNC_START_JOB 105 --# define ASYNC_F_ASYNC_WAIT_CTX_SET_WAIT_FD 106 -- --/* -- * ASYNC reason codes. -- */ --# define ASYNC_R_FAILED_TO_SET_POOL 101 --# define ASYNC_R_FAILED_TO_SWAP_CONTEXT 102 --# define ASYNC_R_INIT_FAILED 105 --# define ASYNC_R_INVALID_POOL_SIZE 103 -- --#endif -diff --git a/uadk_tool/include/openssl/bio.h b/uadk_tool/include/openssl/bio.h -deleted file mode 100644 -index ae559a5..0000000 ---- a/uadk_tool/include/openssl/bio.h -+++ /dev/null -@@ -1,801 +0,0 @@ --/* -- * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_BIO_H --# define HEADER_BIO_H -- --# include -- --# ifndef OPENSSL_NO_STDIO --# include --# endif --# include -- --# include --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --/* There are the classes of BIOs */ --# define BIO_TYPE_DESCRIPTOR 0x0100 /* socket, fd, connect or accept */ --# define BIO_TYPE_FILTER 0x0200 --# define BIO_TYPE_SOURCE_SINK 0x0400 -- --/* These are the 'types' of BIOs */ --# define BIO_TYPE_NONE 0 --# define BIO_TYPE_MEM ( 1|BIO_TYPE_SOURCE_SINK) --# define BIO_TYPE_FILE ( 2|BIO_TYPE_SOURCE_SINK) -- --# define BIO_TYPE_FD ( 4|BIO_TYPE_SOURCE_SINK|BIO_TYPE_DESCRIPTOR) --# define BIO_TYPE_SOCKET ( 5|BIO_TYPE_SOURCE_SINK|BIO_TYPE_DESCRIPTOR) --# define BIO_TYPE_NULL ( 6|BIO_TYPE_SOURCE_SINK) --# define BIO_TYPE_SSL ( 7|BIO_TYPE_FILTER) --# define BIO_TYPE_MD ( 8|BIO_TYPE_FILTER) --# define BIO_TYPE_BUFFER ( 9|BIO_TYPE_FILTER) --# define BIO_TYPE_CIPHER (10|BIO_TYPE_FILTER) --# define BIO_TYPE_BASE64 (11|BIO_TYPE_FILTER) --# define BIO_TYPE_CONNECT (12|BIO_TYPE_SOURCE_SINK|BIO_TYPE_DESCRIPTOR) --# define BIO_TYPE_ACCEPT (13|BIO_TYPE_SOURCE_SINK|BIO_TYPE_DESCRIPTOR) -- --# define BIO_TYPE_NBIO_TEST (16|BIO_TYPE_FILTER)/* server proxy BIO */ --# define BIO_TYPE_NULL_FILTER (17|BIO_TYPE_FILTER) --# define BIO_TYPE_BIO (19|BIO_TYPE_SOURCE_SINK)/* half a BIO pair */ --# define BIO_TYPE_LINEBUFFER (20|BIO_TYPE_FILTER) --# define BIO_TYPE_DGRAM (21|BIO_TYPE_SOURCE_SINK|BIO_TYPE_DESCRIPTOR) --# define BIO_TYPE_ASN1 (22|BIO_TYPE_FILTER) --# define BIO_TYPE_COMP (23|BIO_TYPE_FILTER) --# ifndef OPENSSL_NO_SCTP --# define BIO_TYPE_DGRAM_SCTP (24|BIO_TYPE_SOURCE_SINK|BIO_TYPE_DESCRIPTOR) --# endif -- --#define BIO_TYPE_START 128 -- --/* -- * BIO_FILENAME_READ|BIO_CLOSE to open or close on free. -- * BIO_set_fp(in,stdin,BIO_NOCLOSE); -- */ --# define BIO_NOCLOSE 0x00 --# define BIO_CLOSE 0x01 -- --/* -- * These are used in the following macros and are passed to BIO_ctrl() -- */ --# define BIO_CTRL_RESET 1/* opt - rewind/zero etc */ --# define BIO_CTRL_EOF 2/* opt - are we at the eof */ --# define BIO_CTRL_INFO 3/* opt - extra tit-bits */ --# define BIO_CTRL_SET 4/* man - set the 'IO' type */ --# define BIO_CTRL_GET 5/* man - get the 'IO' type */ --# define BIO_CTRL_PUSH 6/* opt - internal, used to signify change */ --# define BIO_CTRL_POP 7/* opt - internal, used to signify change */ --# define BIO_CTRL_GET_CLOSE 8/* man - set the 'close' on free */ --# define BIO_CTRL_SET_CLOSE 9/* man - set the 'close' on free */ --# define BIO_CTRL_PENDING 10/* opt - is their more data buffered */ --# define BIO_CTRL_FLUSH 11/* opt - 'flush' buffered output */ --# define BIO_CTRL_DUP 12/* man - extra stuff for 'duped' BIO */ --# define BIO_CTRL_WPENDING 13/* opt - number of bytes still to write */ --# define BIO_CTRL_SET_CALLBACK 14/* opt - set callback function */ --# define BIO_CTRL_GET_CALLBACK 15/* opt - set callback function */ -- --# define BIO_CTRL_PEEK 29/* BIO_f_buffer special */ --# define BIO_CTRL_SET_FILENAME 30/* BIO_s_file special */ -- --/* dgram BIO stuff */ --# define BIO_CTRL_DGRAM_CONNECT 31/* BIO dgram special */ --# define BIO_CTRL_DGRAM_SET_CONNECTED 32/* allow for an externally connected -- * socket to be passed in */ --# define BIO_CTRL_DGRAM_SET_RECV_TIMEOUT 33/* setsockopt, essentially */ --# define BIO_CTRL_DGRAM_GET_RECV_TIMEOUT 34/* getsockopt, essentially */ --# define BIO_CTRL_DGRAM_SET_SEND_TIMEOUT 35/* setsockopt, essentially */ --# define BIO_CTRL_DGRAM_GET_SEND_TIMEOUT 36/* getsockopt, essentially */ -- --# define BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP 37/* flag whether the last */ --# define BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP 38/* I/O operation tiemd out */ -- --/* #ifdef IP_MTU_DISCOVER */ --# define BIO_CTRL_DGRAM_MTU_DISCOVER 39/* set DF bit on egress packets */ --/* #endif */ -- --# define BIO_CTRL_DGRAM_QUERY_MTU 40/* as kernel for current MTU */ --# define BIO_CTRL_DGRAM_GET_FALLBACK_MTU 47 --# define BIO_CTRL_DGRAM_GET_MTU 41/* get cached value for MTU */ --# define BIO_CTRL_DGRAM_SET_MTU 42/* set cached value for MTU. -- * want to use this if asking -- * the kernel fails */ -- --# define BIO_CTRL_DGRAM_MTU_EXCEEDED 43/* check whether the MTU was -- * exceed in the previous write -- * operation */ -- --# define BIO_CTRL_DGRAM_GET_PEER 46 --# define BIO_CTRL_DGRAM_SET_PEER 44/* Destination for the data */ -- --# define BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT 45/* Next DTLS handshake timeout -- * to adjust socket timeouts */ --# define BIO_CTRL_DGRAM_SET_DONT_FRAG 48 -- --# define BIO_CTRL_DGRAM_GET_MTU_OVERHEAD 49 -- --/* Deliberately outside of OPENSSL_NO_SCTP - used in bss_dgram.c */ --# define BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE 50 --# ifndef OPENSSL_NO_SCTP --/* SCTP stuff */ --# define BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY 51 --# define BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY 52 --# define BIO_CTRL_DGRAM_SCTP_AUTH_CCS_RCVD 53 --# define BIO_CTRL_DGRAM_SCTP_GET_SNDINFO 60 --# define BIO_CTRL_DGRAM_SCTP_SET_SNDINFO 61 --# define BIO_CTRL_DGRAM_SCTP_GET_RCVINFO 62 --# define BIO_CTRL_DGRAM_SCTP_SET_RCVINFO 63 --# define BIO_CTRL_DGRAM_SCTP_GET_PRINFO 64 --# define BIO_CTRL_DGRAM_SCTP_SET_PRINFO 65 --# define BIO_CTRL_DGRAM_SCTP_SAVE_SHUTDOWN 70 --# endif -- --# define BIO_CTRL_DGRAM_SET_PEEK_MODE 71 -- --/* modifiers */ --# define BIO_FP_READ 0x02 --# define BIO_FP_WRITE 0x04 --# define BIO_FP_APPEND 0x08 --# define BIO_FP_TEXT 0x10 -- --# define BIO_FLAGS_READ 0x01 --# define BIO_FLAGS_WRITE 0x02 --# define BIO_FLAGS_IO_SPECIAL 0x04 --# define BIO_FLAGS_RWS (BIO_FLAGS_READ|BIO_FLAGS_WRITE|BIO_FLAGS_IO_SPECIAL) --# define BIO_FLAGS_SHOULD_RETRY 0x08 --# ifndef BIO_FLAGS_UPLINK --/* -- * "UPLINK" flag denotes file descriptors provided by application. It -- * defaults to 0, as most platforms don't require UPLINK interface. -- */ --# define BIO_FLAGS_UPLINK 0 --# endif -- --# define BIO_FLAGS_BASE64_NO_NL 0x100 -- --/* -- * This is used with memory BIOs: -- * BIO_FLAGS_MEM_RDONLY means we shouldn't free up or change the data in any way; -- * BIO_FLAGS_NONCLEAR_RST means we shouldn't clear data on reset. -- */ --# define BIO_FLAGS_MEM_RDONLY 0x200 --# define BIO_FLAGS_NONCLEAR_RST 0x400 --# define BIO_FLAGS_IN_EOF 0x800 -- --typedef union bio_addr_st BIO_ADDR; --typedef struct bio_addrinfo_st BIO_ADDRINFO; -- --int BIO_get_new_index(void); --void BIO_set_flags(BIO *b, int flags); --int BIO_test_flags(const BIO *b, int flags); --void BIO_clear_flags(BIO *b, int flags); -- --# define BIO_get_flags(b) BIO_test_flags(b, ~(0x0)) --# define BIO_set_retry_special(b) \ -- BIO_set_flags(b, (BIO_FLAGS_IO_SPECIAL|BIO_FLAGS_SHOULD_RETRY)) --# define BIO_set_retry_read(b) \ -- BIO_set_flags(b, (BIO_FLAGS_READ|BIO_FLAGS_SHOULD_RETRY)) --# define BIO_set_retry_write(b) \ -- BIO_set_flags(b, (BIO_FLAGS_WRITE|BIO_FLAGS_SHOULD_RETRY)) -- --/* These are normally used internally in BIOs */ --# define BIO_clear_retry_flags(b) \ -- BIO_clear_flags(b, (BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY)) --# define BIO_get_retry_flags(b) \ -- BIO_test_flags(b, (BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY)) -- --/* These should be used by the application to tell why we should retry */ --# define BIO_should_read(a) BIO_test_flags(a, BIO_FLAGS_READ) --# define BIO_should_write(a) BIO_test_flags(a, BIO_FLAGS_WRITE) --# define BIO_should_io_special(a) BIO_test_flags(a, BIO_FLAGS_IO_SPECIAL) --# define BIO_retry_type(a) BIO_test_flags(a, BIO_FLAGS_RWS) --# define BIO_should_retry(a) BIO_test_flags(a, BIO_FLAGS_SHOULD_RETRY) -- --/* -- * The next three are used in conjunction with the BIO_should_io_special() -- * condition. After this returns true, BIO *BIO_get_retry_BIO(BIO *bio, int -- * *reason); will walk the BIO stack and return the 'reason' for the special -- * and the offending BIO. Given a BIO, BIO_get_retry_reason(bio) will return -- * the code. -- */ --/* -- * Returned from the SSL bio when the certificate retrieval code had an error -- */ --# define BIO_RR_SSL_X509_LOOKUP 0x01 --/* Returned from the connect BIO when a connect would have blocked */ --# define BIO_RR_CONNECT 0x02 --/* Returned from the accept BIO when an accept would have blocked */ --# define BIO_RR_ACCEPT 0x03 -- --/* These are passed by the BIO callback */ --# define BIO_CB_FREE 0x01 --# define BIO_CB_READ 0x02 --# define BIO_CB_WRITE 0x03 --# define BIO_CB_PUTS 0x04 --# define BIO_CB_GETS 0x05 --# define BIO_CB_CTRL 0x06 -- --/* -- * The callback is called before and after the underling operation, The -- * BIO_CB_RETURN flag indicates if it is after the call -- */ --# define BIO_CB_RETURN 0x80 --# define BIO_CB_return(a) ((a)|BIO_CB_RETURN) --# define BIO_cb_pre(a) (!((a)&BIO_CB_RETURN)) --# define BIO_cb_post(a) ((a)&BIO_CB_RETURN) -- --typedef long (*BIO_callback_fn)(BIO *b, int oper, const char *argp, int argi, -- long argl, long ret); --typedef long (*BIO_callback_fn_ex)(BIO *b, int oper, const char *argp, -- size_t len, int argi, -- long argl, int ret, size_t *processed); --BIO_callback_fn BIO_get_callback(const BIO *b); --void BIO_set_callback(BIO *b, BIO_callback_fn callback); -- --BIO_callback_fn_ex BIO_get_callback_ex(const BIO *b); --void BIO_set_callback_ex(BIO *b, BIO_callback_fn_ex callback); -- --char *BIO_get_callback_arg(const BIO *b); --void BIO_set_callback_arg(BIO *b, char *arg); -- --typedef struct bio_method_st BIO_METHOD; -- --const char *BIO_method_name(const BIO *b); --int BIO_method_type(const BIO *b); -- --typedef int BIO_info_cb(BIO *, int, int); --typedef BIO_info_cb bio_info_cb; /* backward compatibility */ -- --DEFINE_STACK_OF(BIO) -- --/* Prefix and suffix callback in ASN1 BIO */ --typedef int asn1_ps_func (BIO *b, unsigned char **pbuf, int *plen, -- void *parg); -- --# ifndef OPENSSL_NO_SCTP --/* SCTP parameter structs */ --struct bio_dgram_sctp_sndinfo { -- uint16_t snd_sid; -- uint16_t snd_flags; -- uint32_t snd_ppid; -- uint32_t snd_context; --}; -- --struct bio_dgram_sctp_rcvinfo { -- uint16_t rcv_sid; -- uint16_t rcv_ssn; -- uint16_t rcv_flags; -- uint32_t rcv_ppid; -- uint32_t rcv_tsn; -- uint32_t rcv_cumtsn; -- uint32_t rcv_context; --}; -- --struct bio_dgram_sctp_prinfo { -- uint16_t pr_policy; -- uint32_t pr_value; --}; --# endif -- --/* -- * #define BIO_CONN_get_param_hostname BIO_ctrl -- */ -- --# define BIO_C_SET_CONNECT 100 --# define BIO_C_DO_STATE_MACHINE 101 --# define BIO_C_SET_NBIO 102 --/* # define BIO_C_SET_PROXY_PARAM 103 */ --# define BIO_C_SET_FD 104 --# define BIO_C_GET_FD 105 --# define BIO_C_SET_FILE_PTR 106 --# define BIO_C_GET_FILE_PTR 107 --# define BIO_C_SET_FILENAME 108 --# define BIO_C_SET_SSL 109 --# define BIO_C_GET_SSL 110 --# define BIO_C_SET_MD 111 --# define BIO_C_GET_MD 112 --# define BIO_C_GET_CIPHER_STATUS 113 --# define BIO_C_SET_BUF_MEM 114 --# define BIO_C_GET_BUF_MEM_PTR 115 --# define BIO_C_GET_BUFF_NUM_LINES 116 --# define BIO_C_SET_BUFF_SIZE 117 --# define BIO_C_SET_ACCEPT 118 --# define BIO_C_SSL_MODE 119 --# define BIO_C_GET_MD_CTX 120 --/* # define BIO_C_GET_PROXY_PARAM 121 */ --# define BIO_C_SET_BUFF_READ_DATA 122/* data to read first */ --# define BIO_C_GET_CONNECT 123 --# define BIO_C_GET_ACCEPT 124 --# define BIO_C_SET_SSL_RENEGOTIATE_BYTES 125 --# define BIO_C_GET_SSL_NUM_RENEGOTIATES 126 --# define BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT 127 --# define BIO_C_FILE_SEEK 128 --# define BIO_C_GET_CIPHER_CTX 129 --# define BIO_C_SET_BUF_MEM_EOF_RETURN 130/* return end of input -- * value */ --# define BIO_C_SET_BIND_MODE 131 --# define BIO_C_GET_BIND_MODE 132 --# define BIO_C_FILE_TELL 133 --# define BIO_C_GET_SOCKS 134 --# define BIO_C_SET_SOCKS 135 -- --# define BIO_C_SET_WRITE_BUF_SIZE 136/* for BIO_s_bio */ --# define BIO_C_GET_WRITE_BUF_SIZE 137 --# define BIO_C_MAKE_BIO_PAIR 138 --# define BIO_C_DESTROY_BIO_PAIR 139 --# define BIO_C_GET_WRITE_GUARANTEE 140 --# define BIO_C_GET_READ_REQUEST 141 --# define BIO_C_SHUTDOWN_WR 142 --# define BIO_C_NREAD0 143 --# define BIO_C_NREAD 144 --# define BIO_C_NWRITE0 145 --# define BIO_C_NWRITE 146 --# define BIO_C_RESET_READ_REQUEST 147 --# define BIO_C_SET_MD_CTX 148 -- --# define BIO_C_SET_PREFIX 149 --# define BIO_C_GET_PREFIX 150 --# define BIO_C_SET_SUFFIX 151 --# define BIO_C_GET_SUFFIX 152 -- --# define BIO_C_SET_EX_ARG 153 --# define BIO_C_GET_EX_ARG 154 -- --# define BIO_C_SET_CONNECT_MODE 155 -- --# define BIO_set_app_data(s,arg) BIO_set_ex_data(s,0,arg) --# define BIO_get_app_data(s) BIO_get_ex_data(s,0) -- --# define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) -- --# ifndef OPENSSL_NO_SOCK --/* IP families we support, for BIO_s_connect() and BIO_s_accept() */ --/* Note: the underlying operating system may not support some of them */ --# define BIO_FAMILY_IPV4 4 --# define BIO_FAMILY_IPV6 6 --# define BIO_FAMILY_IPANY 256 -- --/* BIO_s_connect() */ --# define BIO_set_conn_hostname(b,name) BIO_ctrl(b,BIO_C_SET_CONNECT,0, \ -- (char *)(name)) --# define BIO_set_conn_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,1, \ -- (char *)(port)) --# define BIO_set_conn_address(b,addr) BIO_ctrl(b,BIO_C_SET_CONNECT,2, \ -- (char *)(addr)) --# define BIO_set_conn_ip_family(b,f) BIO_int_ctrl(b,BIO_C_SET_CONNECT,3,f) --# define BIO_get_conn_hostname(b) ((const char *)BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,0)) --# define BIO_get_conn_port(b) ((const char *)BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,1)) --# define BIO_get_conn_address(b) ((const BIO_ADDR *)BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,2)) --# define BIO_get_conn_ip_family(b) BIO_ctrl(b,BIO_C_GET_CONNECT,3,NULL) --# define BIO_set_conn_mode(b,n) BIO_ctrl(b,BIO_C_SET_CONNECT_MODE,(n),NULL) -- --/* BIO_s_accept() */ --# define BIO_set_accept_name(b,name) BIO_ctrl(b,BIO_C_SET_ACCEPT,0, \ -- (char *)(name)) --# define BIO_set_accept_port(b,port) BIO_ctrl(b,BIO_C_SET_ACCEPT,1, \ -- (char *)(port)) --# define BIO_get_accept_name(b) ((const char *)BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,0)) --# define BIO_get_accept_port(b) ((const char *)BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,1)) --# define BIO_get_peer_name(b) ((const char *)BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,2)) --# define BIO_get_peer_port(b) ((const char *)BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,3)) --/* #define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) */ --# define BIO_set_nbio_accept(b,n) BIO_ctrl(b,BIO_C_SET_ACCEPT,2,(n)?(void *)"a":NULL) --# define BIO_set_accept_bios(b,bio) BIO_ctrl(b,BIO_C_SET_ACCEPT,3, \ -- (char *)(bio)) --# define BIO_set_accept_ip_family(b,f) BIO_int_ctrl(b,BIO_C_SET_ACCEPT,4,f) --# define BIO_get_accept_ip_family(b) BIO_ctrl(b,BIO_C_GET_ACCEPT,4,NULL) -- --/* Aliases kept for backward compatibility */ --# define BIO_BIND_NORMAL 0 --# define BIO_BIND_REUSEADDR BIO_SOCK_REUSEADDR --# define BIO_BIND_REUSEADDR_IF_UNUSED BIO_SOCK_REUSEADDR --# define BIO_set_bind_mode(b,mode) BIO_ctrl(b,BIO_C_SET_BIND_MODE,mode,NULL) --# define BIO_get_bind_mode(b) BIO_ctrl(b,BIO_C_GET_BIND_MODE,0,NULL) -- --/* BIO_s_accept() and BIO_s_connect() */ --# define BIO_do_connect(b) BIO_do_handshake(b) --# define BIO_do_accept(b) BIO_do_handshake(b) --# endif /* OPENSSL_NO_SOCK */ -- --# define BIO_do_handshake(b) BIO_ctrl(b,BIO_C_DO_STATE_MACHINE,0,NULL) -- --/* BIO_s_datagram(), BIO_s_fd(), BIO_s_socket(), BIO_s_accept() and BIO_s_connect() */ --# define BIO_set_fd(b,fd,c) BIO_int_ctrl(b,BIO_C_SET_FD,c,fd) --# define BIO_get_fd(b,c) BIO_ctrl(b,BIO_C_GET_FD,0,(char *)(c)) -- --/* BIO_s_file() */ --# define BIO_set_fp(b,fp,c) BIO_ctrl(b,BIO_C_SET_FILE_PTR,c,(char *)(fp)) --# define BIO_get_fp(b,fpp) BIO_ctrl(b,BIO_C_GET_FILE_PTR,0,(char *)(fpp)) -- --/* BIO_s_fd() and BIO_s_file() */ --# define BIO_seek(b,ofs) (int)BIO_ctrl(b,BIO_C_FILE_SEEK,ofs,NULL) --# define BIO_tell(b) (int)BIO_ctrl(b,BIO_C_FILE_TELL,0,NULL) -- --/* -- * name is cast to lose const, but might be better to route through a -- * function so we can do it safely -- */ --# ifdef CONST_STRICT --/* -- * If you are wondering why this isn't defined, its because CONST_STRICT is -- * purely a compile-time kludge to allow const to be checked. -- */ --int BIO_read_filename(BIO *b, const char *name); --# else --# define BIO_read_filename(b,name) (int)BIO_ctrl(b,BIO_C_SET_FILENAME, \ -- BIO_CLOSE|BIO_FP_READ,(char *)(name)) --# endif --# define BIO_write_filename(b,name) (int)BIO_ctrl(b,BIO_C_SET_FILENAME, \ -- BIO_CLOSE|BIO_FP_WRITE,name) --# define BIO_append_filename(b,name) (int)BIO_ctrl(b,BIO_C_SET_FILENAME, \ -- BIO_CLOSE|BIO_FP_APPEND,name) --# define BIO_rw_filename(b,name) (int)BIO_ctrl(b,BIO_C_SET_FILENAME, \ -- BIO_CLOSE|BIO_FP_READ|BIO_FP_WRITE,name) -- --/* -- * WARNING WARNING, this ups the reference count on the read bio of the SSL -- * structure. This is because the ssl read BIO is now pointed to by the -- * next_bio field in the bio. So when you free the BIO, make sure you are -- * doing a BIO_free_all() to catch the underlying BIO. -- */ --# define BIO_set_ssl(b,ssl,c) BIO_ctrl(b,BIO_C_SET_SSL,c,(char *)(ssl)) --# define BIO_get_ssl(b,sslp) BIO_ctrl(b,BIO_C_GET_SSL,0,(char *)(sslp)) --# define BIO_set_ssl_mode(b,client) BIO_ctrl(b,BIO_C_SSL_MODE,client,NULL) --# define BIO_set_ssl_renegotiate_bytes(b,num) \ -- BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_BYTES,num,NULL) --# define BIO_get_num_renegotiates(b) \ -- BIO_ctrl(b,BIO_C_GET_SSL_NUM_RENEGOTIATES,0,NULL) --# define BIO_set_ssl_renegotiate_timeout(b,seconds) \ -- BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT,seconds,NULL) -- --/* defined in evp.h */ --/* #define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,1,(char *)(md)) */ -- --# define BIO_get_mem_data(b,pp) BIO_ctrl(b,BIO_CTRL_INFO,0,(char *)(pp)) --# define BIO_set_mem_buf(b,bm,c) BIO_ctrl(b,BIO_C_SET_BUF_MEM,c,(char *)(bm)) --# define BIO_get_mem_ptr(b,pp) BIO_ctrl(b,BIO_C_GET_BUF_MEM_PTR,0, \ -- (char *)(pp)) --# define BIO_set_mem_eof_return(b,v) \ -- BIO_ctrl(b,BIO_C_SET_BUF_MEM_EOF_RETURN,v,NULL) -- --/* For the BIO_f_buffer() type */ --# define BIO_get_buffer_num_lines(b) BIO_ctrl(b,BIO_C_GET_BUFF_NUM_LINES,0,NULL) --# define BIO_set_buffer_size(b,size) BIO_ctrl(b,BIO_C_SET_BUFF_SIZE,size,NULL) --# define BIO_set_read_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,0) --# define BIO_set_write_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,1) --# define BIO_set_buffer_read_data(b,buf,num) BIO_ctrl(b,BIO_C_SET_BUFF_READ_DATA,num,buf) -- --/* Don't use the next one unless you know what you are doing :-) */ --# define BIO_dup_state(b,ret) BIO_ctrl(b,BIO_CTRL_DUP,0,(char *)(ret)) -- --# define BIO_reset(b) (int)BIO_ctrl(b,BIO_CTRL_RESET,0,NULL) --# define BIO_eof(b) (int)BIO_ctrl(b,BIO_CTRL_EOF,0,NULL) --# define BIO_set_close(b,c) (int)BIO_ctrl(b,BIO_CTRL_SET_CLOSE,(c),NULL) --# define BIO_get_close(b) (int)BIO_ctrl(b,BIO_CTRL_GET_CLOSE,0,NULL) --# define BIO_pending(b) (int)BIO_ctrl(b,BIO_CTRL_PENDING,0,NULL) --# define BIO_wpending(b) (int)BIO_ctrl(b,BIO_CTRL_WPENDING,0,NULL) --/* ...pending macros have inappropriate return type */ --size_t BIO_ctrl_pending(BIO *b); --size_t BIO_ctrl_wpending(BIO *b); --# define BIO_flush(b) (int)BIO_ctrl(b,BIO_CTRL_FLUSH,0,NULL) --# define BIO_get_info_callback(b,cbp) (int)BIO_ctrl(b,BIO_CTRL_GET_CALLBACK,0, \ -- cbp) --# define BIO_set_info_callback(b,cb) (int)BIO_callback_ctrl(b,BIO_CTRL_SET_CALLBACK,cb) -- --/* For the BIO_f_buffer() type */ --# define BIO_buffer_get_num_lines(b) BIO_ctrl(b,BIO_CTRL_GET,0,NULL) --# define BIO_buffer_peek(b,s,l) BIO_ctrl(b,BIO_CTRL_PEEK,(l),(s)) -- --/* For BIO_s_bio() */ --# define BIO_set_write_buf_size(b,size) (int)BIO_ctrl(b,BIO_C_SET_WRITE_BUF_SIZE,size,NULL) --# define BIO_get_write_buf_size(b,size) (size_t)BIO_ctrl(b,BIO_C_GET_WRITE_BUF_SIZE,size,NULL) --# define BIO_make_bio_pair(b1,b2) (int)BIO_ctrl(b1,BIO_C_MAKE_BIO_PAIR,0,b2) --# define BIO_destroy_bio_pair(b) (int)BIO_ctrl(b,BIO_C_DESTROY_BIO_PAIR,0,NULL) --# define BIO_shutdown_wr(b) (int)BIO_ctrl(b, BIO_C_SHUTDOWN_WR, 0, NULL) --/* macros with inappropriate type -- but ...pending macros use int too: */ --# define BIO_get_write_guarantee(b) (int)BIO_ctrl(b,BIO_C_GET_WRITE_GUARANTEE,0,NULL) --# define BIO_get_read_request(b) (int)BIO_ctrl(b,BIO_C_GET_READ_REQUEST,0,NULL) --size_t BIO_ctrl_get_write_guarantee(BIO *b); --size_t BIO_ctrl_get_read_request(BIO *b); --int BIO_ctrl_reset_read_request(BIO *b); -- --/* ctrl macros for dgram */ --# define BIO_ctrl_dgram_connect(b,peer) \ -- (int)BIO_ctrl(b,BIO_CTRL_DGRAM_CONNECT,0, (char *)(peer)) --# define BIO_ctrl_set_connected(b,peer) \ -- (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_CONNECTED, 0, (char *)(peer)) --# define BIO_dgram_recv_timedout(b) \ -- (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP, 0, NULL) --# define BIO_dgram_send_timedout(b) \ -- (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP, 0, NULL) --# define BIO_dgram_get_peer(b,peer) \ -- (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_PEER, 0, (char *)(peer)) --# define BIO_dgram_set_peer(b,peer) \ -- (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, (char *)(peer)) --# define BIO_dgram_get_mtu_overhead(b) \ -- (unsigned int)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_MTU_OVERHEAD, 0, NULL) -- --#define BIO_get_ex_new_index(l, p, newf, dupf, freef) \ -- CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_BIO, l, p, newf, dupf, freef) --int BIO_set_ex_data(BIO *bio, int idx, void *data); --void *BIO_get_ex_data(BIO *bio, int idx); --uint64_t BIO_number_read(BIO *bio); --uint64_t BIO_number_written(BIO *bio); -- --/* For BIO_f_asn1() */ --int BIO_asn1_set_prefix(BIO *b, asn1_ps_func *prefix, -- asn1_ps_func *prefix_free); --int BIO_asn1_get_prefix(BIO *b, asn1_ps_func **pprefix, -- asn1_ps_func **pprefix_free); --int BIO_asn1_set_suffix(BIO *b, asn1_ps_func *suffix, -- asn1_ps_func *suffix_free); --int BIO_asn1_get_suffix(BIO *b, asn1_ps_func **psuffix, -- asn1_ps_func **psuffix_free); -- --const BIO_METHOD *BIO_s_file(void); --BIO *BIO_new_file(const char *filename, const char *mode); --# ifndef OPENSSL_NO_STDIO --BIO *BIO_new_fp(FILE *stream, int close_flag); --# endif --BIO *BIO_new(const BIO_METHOD *type); --int BIO_free(BIO *a); --void BIO_set_data(BIO *a, void *ptr); --void *BIO_get_data(BIO *a); --void BIO_set_init(BIO *a, int init); --int BIO_get_init(BIO *a); --void BIO_set_shutdown(BIO *a, int shut); --int BIO_get_shutdown(BIO *a); --void BIO_vfree(BIO *a); --int BIO_up_ref(BIO *a); --int BIO_read(BIO *b, void *data, int dlen); --int BIO_read_ex(BIO *b, void *data, size_t dlen, size_t *readbytes); --int BIO_gets(BIO *bp, char *buf, int size); --int BIO_write(BIO *b, const void *data, int dlen); --int BIO_write_ex(BIO *b, const void *data, size_t dlen, size_t *written); --int BIO_puts(BIO *bp, const char *buf); --int BIO_indent(BIO *b, int indent, int max); --long BIO_ctrl(BIO *bp, int cmd, long larg, void *parg); --long BIO_callback_ctrl(BIO *b, int cmd, BIO_info_cb *fp); --void *BIO_ptr_ctrl(BIO *bp, int cmd, long larg); --long BIO_int_ctrl(BIO *bp, int cmd, long larg, int iarg); --BIO *BIO_push(BIO *b, BIO *append); --BIO *BIO_pop(BIO *b); --void BIO_free_all(BIO *a); --BIO *BIO_find_type(BIO *b, int bio_type); --BIO *BIO_next(BIO *b); --void BIO_set_next(BIO *b, BIO *next); --BIO *BIO_get_retry_BIO(BIO *bio, int *reason); --int BIO_get_retry_reason(BIO *bio); --void BIO_set_retry_reason(BIO *bio, int reason); --BIO *BIO_dup_chain(BIO *in); -- --int BIO_nread0(BIO *bio, char **buf); --int BIO_nread(BIO *bio, char **buf, int num); --int BIO_nwrite0(BIO *bio, char **buf); --int BIO_nwrite(BIO *bio, char **buf, int num); -- --long BIO_debug_callback(BIO *bio, int cmd, const char *argp, int argi, -- long argl, long ret); -- --const BIO_METHOD *BIO_s_mem(void); --const BIO_METHOD *BIO_s_secmem(void); --BIO *BIO_new_mem_buf(const void *buf, int len); --# ifndef OPENSSL_NO_SOCK --const BIO_METHOD *BIO_s_socket(void); --const BIO_METHOD *BIO_s_connect(void); --const BIO_METHOD *BIO_s_accept(void); --# endif --const BIO_METHOD *BIO_s_fd(void); --const BIO_METHOD *BIO_s_log(void); --const BIO_METHOD *BIO_s_bio(void); --const BIO_METHOD *BIO_s_null(void); --const BIO_METHOD *BIO_f_null(void); --const BIO_METHOD *BIO_f_buffer(void); --const BIO_METHOD *BIO_f_linebuffer(void); --const BIO_METHOD *BIO_f_nbio_test(void); --# ifndef OPENSSL_NO_DGRAM --const BIO_METHOD *BIO_s_datagram(void); --int BIO_dgram_non_fatal_error(int error); --BIO *BIO_new_dgram(int fd, int close_flag); --# ifndef OPENSSL_NO_SCTP --const BIO_METHOD *BIO_s_datagram_sctp(void); --BIO *BIO_new_dgram_sctp(int fd, int close_flag); --int BIO_dgram_is_sctp(BIO *bio); --int BIO_dgram_sctp_notification_cb(BIO *b, -- void (*handle_notifications) (BIO *bio, -- void *context, -- void *buf), -- void *context); --int BIO_dgram_sctp_wait_for_dry(BIO *b); --int BIO_dgram_sctp_msg_waiting(BIO *b); --# endif --# endif -- --# ifndef OPENSSL_NO_SOCK --int BIO_sock_should_retry(int i); --int BIO_sock_non_fatal_error(int error); --# endif -- --int BIO_fd_should_retry(int i); --int BIO_fd_non_fatal_error(int error); --int BIO_dump_cb(int (*cb) (const void *data, size_t len, void *u), -- void *u, const char *s, int len); --int BIO_dump_indent_cb(int (*cb) (const void *data, size_t len, void *u), -- void *u, const char *s, int len, int indent); --int BIO_dump(BIO *b, const char *bytes, int len); --int BIO_dump_indent(BIO *b, const char *bytes, int len, int indent); --# ifndef OPENSSL_NO_STDIO --int BIO_dump_fp(FILE *fp, const char *s, int len); --int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent); --# endif --int BIO_hex_string(BIO *out, int indent, int width, unsigned char *data, -- int datalen); -- --# ifndef OPENSSL_NO_SOCK --BIO_ADDR *BIO_ADDR_new(void); --int BIO_ADDR_rawmake(BIO_ADDR *ap, int family, -- const void *where, size_t wherelen, unsigned short port); --void BIO_ADDR_free(BIO_ADDR *); --void BIO_ADDR_clear(BIO_ADDR *ap); --int BIO_ADDR_family(const BIO_ADDR *ap); --int BIO_ADDR_rawaddress(const BIO_ADDR *ap, void *p, size_t *l); --unsigned short BIO_ADDR_rawport(const BIO_ADDR *ap); --char *BIO_ADDR_hostname_string(const BIO_ADDR *ap, int numeric); --char *BIO_ADDR_service_string(const BIO_ADDR *ap, int numeric); --char *BIO_ADDR_path_string(const BIO_ADDR *ap); -- --const BIO_ADDRINFO *BIO_ADDRINFO_next(const BIO_ADDRINFO *bai); --int BIO_ADDRINFO_family(const BIO_ADDRINFO *bai); --int BIO_ADDRINFO_socktype(const BIO_ADDRINFO *bai); --int BIO_ADDRINFO_protocol(const BIO_ADDRINFO *bai); --const BIO_ADDR *BIO_ADDRINFO_address(const BIO_ADDRINFO *bai); --void BIO_ADDRINFO_free(BIO_ADDRINFO *bai); -- --enum BIO_hostserv_priorities { -- BIO_PARSE_PRIO_HOST, BIO_PARSE_PRIO_SERV --}; --int BIO_parse_hostserv(const char *hostserv, char **host, char **service, -- enum BIO_hostserv_priorities hostserv_prio); --enum BIO_lookup_type { -- BIO_LOOKUP_CLIENT, BIO_LOOKUP_SERVER --}; --int BIO_lookup(const char *host, const char *service, -- enum BIO_lookup_type lookup_type, -- int family, int socktype, BIO_ADDRINFO **res); --int BIO_lookup_ex(const char *host, const char *service, -- int lookup_type, int family, int socktype, int protocol, -- BIO_ADDRINFO **res); --int BIO_sock_error(int sock); --int BIO_socket_ioctl(int fd, long type, void *arg); --int BIO_socket_nbio(int fd, int mode); --int BIO_sock_init(void); --# if OPENSSL_API_COMPAT < 0x10100000L --# define BIO_sock_cleanup() while(0) continue --# endif --int BIO_set_tcp_ndelay(int sock, int turn_on); -- --DEPRECATEDIN_1_1_0(struct hostent *BIO_gethostbyname(const char *name)) --DEPRECATEDIN_1_1_0(int BIO_get_port(const char *str, unsigned short *port_ptr)) --DEPRECATEDIN_1_1_0(int BIO_get_host_ip(const char *str, unsigned char *ip)) --DEPRECATEDIN_1_1_0(int BIO_get_accept_socket(char *host_port, int mode)) --DEPRECATEDIN_1_1_0(int BIO_accept(int sock, char **ip_port)) -- --union BIO_sock_info_u { -- BIO_ADDR *addr; --}; --enum BIO_sock_info_type { -- BIO_SOCK_INFO_ADDRESS --}; --int BIO_sock_info(int sock, -- enum BIO_sock_info_type type, union BIO_sock_info_u *info); -- --# define BIO_SOCK_REUSEADDR 0x01 --# define BIO_SOCK_V6_ONLY 0x02 --# define BIO_SOCK_KEEPALIVE 0x04 --# define BIO_SOCK_NONBLOCK 0x08 --# define BIO_SOCK_NODELAY 0x10 -- --int BIO_socket(int domain, int socktype, int protocol, int options); --int BIO_connect(int sock, const BIO_ADDR *addr, int options); --int BIO_bind(int sock, const BIO_ADDR *addr, int options); --int BIO_listen(int sock, const BIO_ADDR *addr, int options); --int BIO_accept_ex(int accept_sock, BIO_ADDR *addr, int options); --int BIO_closesocket(int sock); -- --BIO *BIO_new_socket(int sock, int close_flag); --BIO *BIO_new_connect(const char *host_port); --BIO *BIO_new_accept(const char *host_port); --# endif /* OPENSSL_NO_SOCK*/ -- --BIO *BIO_new_fd(int fd, int close_flag); -- --int BIO_new_bio_pair(BIO **bio1, size_t writebuf1, -- BIO **bio2, size_t writebuf2); --/* -- * If successful, returns 1 and in *bio1, *bio2 two BIO pair endpoints. -- * Otherwise returns 0 and sets *bio1 and *bio2 to NULL. Size 0 uses default -- * value. -- */ -- --void BIO_copy_next_retry(BIO *b); -- --/* -- * long BIO_ghbn_ctrl(int cmd,int iarg,char *parg); -- */ -- --# define ossl_bio__attr__(x) --# if defined(__GNUC__) && defined(__STDC_VERSION__) \ -- && !defined(__APPLE__) -- /* -- * Because we support the 'z' modifier, which made its appearance in C99, -- * we can't use __attribute__ with pre C99 dialects. -- */ --# if __STDC_VERSION__ >= 199901L --# undef ossl_bio__attr__ --# define ossl_bio__attr__ __attribute__ --# if __GNUC__*10 + __GNUC_MINOR__ >= 44 --# define ossl_bio__printf__ __gnu_printf__ --# else --# define ossl_bio__printf__ __printf__ --# endif --# endif --# endif --int BIO_printf(BIO *bio, const char *format, ...) --ossl_bio__attr__((__format__(ossl_bio__printf__, 2, 3))); --int BIO_vprintf(BIO *bio, const char *format, va_list args) --ossl_bio__attr__((__format__(ossl_bio__printf__, 2, 0))); --int BIO_snprintf(char *buf, size_t n, const char *format, ...) --ossl_bio__attr__((__format__(ossl_bio__printf__, 3, 4))); --int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) --ossl_bio__attr__((__format__(ossl_bio__printf__, 3, 0))); --# undef ossl_bio__attr__ --# undef ossl_bio__printf__ -- -- --BIO_METHOD *BIO_meth_new(int type, const char *name); --void BIO_meth_free(BIO_METHOD *biom); --int (*BIO_meth_get_write(const BIO_METHOD *biom)) (BIO *, const char *, int); --int (*BIO_meth_get_write_ex(const BIO_METHOD *biom)) (BIO *, const char *, size_t, -- size_t *); --int BIO_meth_set_write(BIO_METHOD *biom, -- int (*write) (BIO *, const char *, int)); --int BIO_meth_set_write_ex(BIO_METHOD *biom, -- int (*bwrite) (BIO *, const char *, size_t, size_t *)); --int (*BIO_meth_get_read(const BIO_METHOD *biom)) (BIO *, char *, int); --int (*BIO_meth_get_read_ex(const BIO_METHOD *biom)) (BIO *, char *, size_t, size_t *); --int BIO_meth_set_read(BIO_METHOD *biom, -- int (*read) (BIO *, char *, int)); --int BIO_meth_set_read_ex(BIO_METHOD *biom, -- int (*bread) (BIO *, char *, size_t, size_t *)); --int (*BIO_meth_get_puts(const BIO_METHOD *biom)) (BIO *, const char *); --int BIO_meth_set_puts(BIO_METHOD *biom, -- int (*puts) (BIO *, const char *)); --int (*BIO_meth_get_gets(const BIO_METHOD *biom)) (BIO *, char *, int); --int BIO_meth_set_gets(BIO_METHOD *biom, -- int (*gets) (BIO *, char *, int)); --long (*BIO_meth_get_ctrl(const BIO_METHOD *biom)) (BIO *, int, long, void *); --int BIO_meth_set_ctrl(BIO_METHOD *biom, -- long (*ctrl) (BIO *, int, long, void *)); --int (*BIO_meth_get_create(const BIO_METHOD *bion)) (BIO *); --int BIO_meth_set_create(BIO_METHOD *biom, int (*create) (BIO *)); --int (*BIO_meth_get_destroy(const BIO_METHOD *biom)) (BIO *); --int BIO_meth_set_destroy(BIO_METHOD *biom, int (*destroy) (BIO *)); --long (*BIO_meth_get_callback_ctrl(const BIO_METHOD *biom)) -- (BIO *, int, BIO_info_cb *); --int BIO_meth_set_callback_ctrl(BIO_METHOD *biom, -- long (*callback_ctrl) (BIO *, int, -- BIO_info_cb *)); -- --# ifdef __cplusplus --} --# endif --#endif -diff --git a/uadk_tool/include/openssl/bioerr.h b/uadk_tool/include/openssl/bioerr.h -deleted file mode 100644 -index 46e2c96..0000000 ---- a/uadk_tool/include/openssl/bioerr.h -+++ /dev/null -@@ -1,124 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_BIOERR_H --# define HEADER_BIOERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_BIO_strings(void); -- --/* -- * BIO function codes. -- */ --# define BIO_F_ACPT_STATE 100 --# define BIO_F_ADDRINFO_WRAP 148 --# define BIO_F_ADDR_STRINGS 134 --# define BIO_F_BIO_ACCEPT 101 --# define BIO_F_BIO_ACCEPT_EX 137 --# define BIO_F_BIO_ACCEPT_NEW 152 --# define BIO_F_BIO_ADDR_NEW 144 --# define BIO_F_BIO_BIND 147 --# define BIO_F_BIO_CALLBACK_CTRL 131 --# define BIO_F_BIO_CONNECT 138 --# define BIO_F_BIO_CONNECT_NEW 153 --# define BIO_F_BIO_CTRL 103 --# define BIO_F_BIO_GETS 104 --# define BIO_F_BIO_GET_HOST_IP 106 --# define BIO_F_BIO_GET_NEW_INDEX 102 --# define BIO_F_BIO_GET_PORT 107 --# define BIO_F_BIO_LISTEN 139 --# define BIO_F_BIO_LOOKUP 135 --# define BIO_F_BIO_LOOKUP_EX 143 --# define BIO_F_BIO_MAKE_PAIR 121 --# define BIO_F_BIO_METH_NEW 146 --# define BIO_F_BIO_NEW 108 --# define BIO_F_BIO_NEW_DGRAM_SCTP 145 --# define BIO_F_BIO_NEW_FILE 109 --# define BIO_F_BIO_NEW_MEM_BUF 126 --# define BIO_F_BIO_NREAD 123 --# define BIO_F_BIO_NREAD0 124 --# define BIO_F_BIO_NWRITE 125 --# define BIO_F_BIO_NWRITE0 122 --# define BIO_F_BIO_PARSE_HOSTSERV 136 --# define BIO_F_BIO_PUTS 110 --# define BIO_F_BIO_READ 111 --# define BIO_F_BIO_READ_EX 105 --# define BIO_F_BIO_READ_INTERN 120 --# define BIO_F_BIO_SOCKET 140 --# define BIO_F_BIO_SOCKET_NBIO 142 --# define BIO_F_BIO_SOCK_INFO 141 --# define BIO_F_BIO_SOCK_INIT 112 --# define BIO_F_BIO_WRITE 113 --# define BIO_F_BIO_WRITE_EX 119 --# define BIO_F_BIO_WRITE_INTERN 128 --# define BIO_F_BUFFER_CTRL 114 --# define BIO_F_CONN_CTRL 127 --# define BIO_F_CONN_STATE 115 --# define BIO_F_DGRAM_SCTP_NEW 149 --# define BIO_F_DGRAM_SCTP_READ 132 --# define BIO_F_DGRAM_SCTP_WRITE 133 --# define BIO_F_DOAPR_OUTCH 150 --# define BIO_F_FILE_CTRL 116 --# define BIO_F_FILE_READ 130 --# define BIO_F_LINEBUFFER_CTRL 129 --# define BIO_F_LINEBUFFER_NEW 151 --# define BIO_F_MEM_WRITE 117 --# define BIO_F_NBIOF_NEW 154 --# define BIO_F_SLG_WRITE 155 --# define BIO_F_SSL_NEW 118 -- --/* -- * BIO reason codes. -- */ --# define BIO_R_ACCEPT_ERROR 100 --# define BIO_R_ADDRINFO_ADDR_IS_NOT_AF_INET 141 --# define BIO_R_AMBIGUOUS_HOST_OR_SERVICE 129 --# define BIO_R_BAD_FOPEN_MODE 101 --# define BIO_R_BROKEN_PIPE 124 --# define BIO_R_CONNECT_ERROR 103 --# define BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET 107 --# define BIO_R_GETSOCKNAME_ERROR 132 --# define BIO_R_GETSOCKNAME_TRUNCATED_ADDRESS 133 --# define BIO_R_GETTING_SOCKTYPE 134 --# define BIO_R_INVALID_ARGUMENT 125 --# define BIO_R_INVALID_SOCKET 135 --# define BIO_R_IN_USE 123 --# define BIO_R_LENGTH_TOO_LONG 102 --# define BIO_R_LISTEN_V6_ONLY 136 --# define BIO_R_LOOKUP_RETURNED_NOTHING 142 --# define BIO_R_MALFORMED_HOST_OR_SERVICE 130 --# define BIO_R_NBIO_CONNECT_ERROR 110 --# define BIO_R_NO_ACCEPT_ADDR_OR_SERVICE_SPECIFIED 143 --# define BIO_R_NO_HOSTNAME_OR_SERVICE_SPECIFIED 144 --# define BIO_R_NO_PORT_DEFINED 113 --# define BIO_R_NO_SUCH_FILE 128 --# define BIO_R_NULL_PARAMETER 115 --# define BIO_R_UNABLE_TO_BIND_SOCKET 117 --# define BIO_R_UNABLE_TO_CREATE_SOCKET 118 --# define BIO_R_UNABLE_TO_KEEPALIVE 137 --# define BIO_R_UNABLE_TO_LISTEN_SOCKET 119 --# define BIO_R_UNABLE_TO_NODELAY 138 --# define BIO_R_UNABLE_TO_REUSEADDR 139 --# define BIO_R_UNAVAILABLE_IP_FAMILY 145 --# define BIO_R_UNINITIALIZED 120 --# define BIO_R_UNKNOWN_INFO_TYPE 140 --# define BIO_R_UNSUPPORTED_IP_FAMILY 146 --# define BIO_R_UNSUPPORTED_METHOD 121 --# define BIO_R_UNSUPPORTED_PROTOCOL_FAMILY 131 --# define BIO_R_WRITE_TO_READ_ONLY_BIO 126 --# define BIO_R_WSASTARTUP 122 -- --#endif -diff --git a/uadk_tool/include/openssl/blowfish.h b/uadk_tool/include/openssl/blowfish.h -deleted file mode 100644 -index cd3e460..0000000 ---- a/uadk_tool/include/openssl/blowfish.h -+++ /dev/null -@@ -1,61 +0,0 @@ --/* -- * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_BLOWFISH_H --# define HEADER_BLOWFISH_H -- --# include -- --# ifndef OPENSSL_NO_BF --# include --# ifdef __cplusplus --extern "C" { --# endif -- --# define BF_ENCRYPT 1 --# define BF_DECRYPT 0 -- --/*- -- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -- * ! BF_LONG has to be at least 32 bits wide. ! -- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -- */ --# define BF_LONG unsigned int -- --# define BF_ROUNDS 16 --# define BF_BLOCK 8 -- --typedef struct bf_key_st { -- BF_LONG P[BF_ROUNDS + 2]; -- BF_LONG S[4 * 256]; --} BF_KEY; -- --void BF_set_key(BF_KEY *key, int len, const unsigned char *data); -- --void BF_encrypt(BF_LONG *data, const BF_KEY *key); --void BF_decrypt(BF_LONG *data, const BF_KEY *key); -- --void BF_ecb_encrypt(const unsigned char *in, unsigned char *out, -- const BF_KEY *key, int enc); --void BF_cbc_encrypt(const unsigned char *in, unsigned char *out, long length, -- const BF_KEY *schedule, unsigned char *ivec, int enc); --void BF_cfb64_encrypt(const unsigned char *in, unsigned char *out, -- long length, const BF_KEY *schedule, -- unsigned char *ivec, int *num, int enc); --void BF_ofb64_encrypt(const unsigned char *in, unsigned char *out, -- long length, const BF_KEY *schedule, -- unsigned char *ivec, int *num); --const char *BF_options(void); -- --# ifdef __cplusplus --} --# endif --# endif -- --#endif -diff --git a/uadk_tool/include/openssl/bn.h b/uadk_tool/include/openssl/bn.h -deleted file mode 100644 -index d877660..0000000 ---- a/uadk_tool/include/openssl/bn.h -+++ /dev/null -@@ -1,539 +0,0 @@ --/* -- * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. -- * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_BN_H --# define HEADER_BN_H -- --# include --# ifndef OPENSSL_NO_STDIO --# include --# endif --# include --# include --# include --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --/* -- * 64-bit processor with LP64 ABI -- */ --# ifdef SIXTY_FOUR_BIT_LONG --# define BN_ULONG unsigned long --# define BN_BYTES 8 --# endif -- --/* -- * 64-bit processor other than LP64 ABI -- */ --# ifdef SIXTY_FOUR_BIT --# define BN_ULONG unsigned long long --# define BN_BYTES 8 --# endif -- --# ifdef THIRTY_TWO_BIT --# define BN_ULONG unsigned int --# define BN_BYTES 4 --# endif -- --# define BN_BITS2 (BN_BYTES * 8) --# define BN_BITS (BN_BITS2 * 2) --# define BN_TBIT ((BN_ULONG)1 << (BN_BITS2 - 1)) -- --# define BN_FLG_MALLOCED 0x01 --# define BN_FLG_STATIC_DATA 0x02 -- --/* -- * avoid leaking exponent information through timing, -- * BN_mod_exp_mont() will call BN_mod_exp_mont_consttime, -- * BN_div() will call BN_div_no_branch, -- * BN_mod_inverse() will call bn_mod_inverse_no_branch. -- */ --# define BN_FLG_CONSTTIME 0x04 --# define BN_FLG_SECURE 0x08 -- --# if OPENSSL_API_COMPAT < 0x00908000L --/* deprecated name for the flag */ --# define BN_FLG_EXP_CONSTTIME BN_FLG_CONSTTIME --# define BN_FLG_FREE 0x8000 /* used for debugging */ --# endif -- --void BN_set_flags(BIGNUM *b, int n); --int BN_get_flags(const BIGNUM *b, int n); -- --/* Values for |top| in BN_rand() */ --#define BN_RAND_TOP_ANY -1 --#define BN_RAND_TOP_ONE 0 --#define BN_RAND_TOP_TWO 1 -- --/* Values for |bottom| in BN_rand() */ --#define BN_RAND_BOTTOM_ANY 0 --#define BN_RAND_BOTTOM_ODD 1 -- --/* -- * get a clone of a BIGNUM with changed flags, for *temporary* use only (the -- * two BIGNUMs cannot be used in parallel!). Also only for *read only* use. The -- * value |dest| should be a newly allocated BIGNUM obtained via BN_new() that -- * has not been otherwise initialised or used. -- */ --void BN_with_flags(BIGNUM *dest, const BIGNUM *b, int flags); -- --/* Wrapper function to make using BN_GENCB easier */ --int BN_GENCB_call(BN_GENCB *cb, int a, int b); -- --BN_GENCB *BN_GENCB_new(void); --void BN_GENCB_free(BN_GENCB *cb); -- --/* Populate a BN_GENCB structure with an "old"-style callback */ --void BN_GENCB_set_old(BN_GENCB *gencb, void (*callback) (int, int, void *), -- void *cb_arg); -- --/* Populate a BN_GENCB structure with a "new"-style callback */ --void BN_GENCB_set(BN_GENCB *gencb, int (*callback) (int, int, BN_GENCB *), -- void *cb_arg); -- --void *BN_GENCB_get_arg(BN_GENCB *cb); -- --# define BN_prime_checks 0 /* default: select number of iterations based -- * on the size of the number */ -- --/* -- * BN_prime_checks_for_size() returns the number of Miller-Rabin iterations -- * that will be done for checking that a random number is probably prime. The -- * error rate for accepting a composite number as prime depends on the size of -- * the prime |b|. The error rates used are for calculating an RSA key with 2 primes, -- * and so the level is what you would expect for a key of double the size of the -- * prime. -- * -- * This table is generated using the algorithm of FIPS PUB 186-4 -- * Digital Signature Standard (DSS), section F.1, page 117. -- * (https://dx.doi.org/10.6028/NIST.FIPS.186-4) -- * -- * The following magma script was used to generate the output: -- * securitybits:=125; -- * k:=1024; -- * for t:=1 to 65 do -- * for M:=3 to Floor(2*Sqrt(k-1)-1) do -- * S:=0; -- * // Sum over m -- * for m:=3 to M do -- * s:=0; -- * // Sum over j -- * for j:=2 to m do -- * s+:=(RealField(32)!2)^-(j+(k-1)/j); -- * end for; -- * S+:=2^(m-(m-1)*t)*s; -- * end for; -- * A:=2^(k-2-M*t); -- * B:=8*(Pi(RealField(32))^2-6)/3*2^(k-2)*S; -- * pkt:=2.00743*Log(2)*k*2^-k*(A+B); -- * seclevel:=Floor(-Log(2,pkt)); -- * if seclevel ge securitybits then -- * printf "k: %5o, security: %o bits (t: %o, M: %o)\n",k,seclevel,t,M; -- * break; -- * end if; -- * end for; -- * if seclevel ge securitybits then break; end if; -- * end for; -- * -- * It can be run online at: -- * http://magma.maths.usyd.edu.au/calc -- * -- * And will output: -- * k: 1024, security: 129 bits (t: 6, M: 23) -- * -- * k is the number of bits of the prime, securitybits is the level we want to -- * reach. -- * -- * prime length | RSA key size | # MR tests | security level -- * -------------+--------------|------------+--------------- -- * (b) >= 6394 | >= 12788 | 3 | 256 bit -- * (b) >= 3747 | >= 7494 | 3 | 192 bit -- * (b) >= 1345 | >= 2690 | 4 | 128 bit -- * (b) >= 1080 | >= 2160 | 5 | 128 bit -- * (b) >= 852 | >= 1704 | 5 | 112 bit -- * (b) >= 476 | >= 952 | 5 | 80 bit -- * (b) >= 400 | >= 800 | 6 | 80 bit -- * (b) >= 347 | >= 694 | 7 | 80 bit -- * (b) >= 308 | >= 616 | 8 | 80 bit -- * (b) >= 55 | >= 110 | 27 | 64 bit -- * (b) >= 6 | >= 12 | 34 | 64 bit -- */ -- --# define BN_prime_checks_for_size(b) ((b) >= 3747 ? 3 : \ -- (b) >= 1345 ? 4 : \ -- (b) >= 476 ? 5 : \ -- (b) >= 400 ? 6 : \ -- (b) >= 347 ? 7 : \ -- (b) >= 308 ? 8 : \ -- (b) >= 55 ? 27 : \ -- /* b >= 6 */ 34) -- --# define BN_num_bytes(a) ((BN_num_bits(a)+7)/8) -- --int BN_abs_is_word(const BIGNUM *a, const BN_ULONG w); --int BN_is_zero(const BIGNUM *a); --int BN_is_one(const BIGNUM *a); --int BN_is_word(const BIGNUM *a, const BN_ULONG w); --int BN_is_odd(const BIGNUM *a); -- --# define BN_one(a) (BN_set_word((a),1)) -- --void BN_zero_ex(BIGNUM *a); -- --# if OPENSSL_API_COMPAT >= 0x00908000L --# define BN_zero(a) BN_zero_ex(a) --# else --# define BN_zero(a) (BN_set_word((a),0)) --# endif -- --const BIGNUM *BN_value_one(void); --char *BN_options(void); --BN_CTX *BN_CTX_new(void); --BN_CTX *BN_CTX_secure_new(void); --void BN_CTX_free(BN_CTX *c); --void BN_CTX_start(BN_CTX *ctx); --BIGNUM *BN_CTX_get(BN_CTX *ctx); --void BN_CTX_end(BN_CTX *ctx); --int BN_rand(BIGNUM *rnd, int bits, int top, int bottom); --int BN_priv_rand(BIGNUM *rnd, int bits, int top, int bottom); --int BN_rand_range(BIGNUM *rnd, const BIGNUM *range); --int BN_priv_rand_range(BIGNUM *rnd, const BIGNUM *range); --int BN_pseudo_rand(BIGNUM *rnd, int bits, int top, int bottom); --int BN_pseudo_rand_range(BIGNUM *rnd, const BIGNUM *range); --int BN_num_bits(const BIGNUM *a); --int BN_num_bits_word(BN_ULONG l); --int BN_security_bits(int L, int N); --BIGNUM *BN_new(void); --BIGNUM *BN_secure_new(void); --void BN_clear_free(BIGNUM *a); --BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b); --void BN_swap(BIGNUM *a, BIGNUM *b); --BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret); --int BN_bn2bin(const BIGNUM *a, unsigned char *to); --int BN_bn2binpad(const BIGNUM *a, unsigned char *to, int tolen); --BIGNUM *BN_lebin2bn(const unsigned char *s, int len, BIGNUM *ret); --int BN_bn2lebinpad(const BIGNUM *a, unsigned char *to, int tolen); --BIGNUM *BN_mpi2bn(const unsigned char *s, int len, BIGNUM *ret); --int BN_bn2mpi(const BIGNUM *a, unsigned char *to); --int BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); --int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); --int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); --int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); --int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); --int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx); --/** BN_set_negative sets sign of a BIGNUM -- * \param b pointer to the BIGNUM object -- * \param n 0 if the BIGNUM b should be positive and a value != 0 otherwise -- */ --void BN_set_negative(BIGNUM *b, int n); --/** BN_is_negative returns 1 if the BIGNUM is negative -- * \param b pointer to the BIGNUM object -- * \return 1 if a < 0 and 0 otherwise -- */ --int BN_is_negative(const BIGNUM *b); -- --int BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, const BIGNUM *d, -- BN_CTX *ctx); --# define BN_mod(rem,m,d,ctx) BN_div(NULL,(rem),(m),(d),(ctx)) --int BN_nnmod(BIGNUM *r, const BIGNUM *m, const BIGNUM *d, BN_CTX *ctx); --int BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, -- BN_CTX *ctx); --int BN_mod_add_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, -- const BIGNUM *m); --int BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, -- BN_CTX *ctx); --int BN_mod_sub_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, -- const BIGNUM *m); --int BN_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, -- BN_CTX *ctx); --int BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); --int BN_mod_lshift1(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); --int BN_mod_lshift1_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *m); --int BN_mod_lshift(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m, -- BN_CTX *ctx); --int BN_mod_lshift_quick(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m); -- --BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w); --BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w); --int BN_mul_word(BIGNUM *a, BN_ULONG w); --int BN_add_word(BIGNUM *a, BN_ULONG w); --int BN_sub_word(BIGNUM *a, BN_ULONG w); --int BN_set_word(BIGNUM *a, BN_ULONG w); --BN_ULONG BN_get_word(const BIGNUM *a); -- --int BN_cmp(const BIGNUM *a, const BIGNUM *b); --void BN_free(BIGNUM *a); --int BN_is_bit_set(const BIGNUM *a, int n); --int BN_lshift(BIGNUM *r, const BIGNUM *a, int n); --int BN_lshift1(BIGNUM *r, const BIGNUM *a); --int BN_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); -- --int BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, -- const BIGNUM *m, BN_CTX *ctx); --int BN_mod_exp_mont(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, -- const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); --int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, -- const BIGNUM *m, BN_CTX *ctx, -- BN_MONT_CTX *in_mont); --int BN_mod_exp_mont_word(BIGNUM *r, BN_ULONG a, const BIGNUM *p, -- const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); --int BN_mod_exp2_mont(BIGNUM *r, const BIGNUM *a1, const BIGNUM *p1, -- const BIGNUM *a2, const BIGNUM *p2, const BIGNUM *m, -- BN_CTX *ctx, BN_MONT_CTX *m_ctx); --int BN_mod_exp_simple(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, -- const BIGNUM *m, BN_CTX *ctx); -- --int BN_mask_bits(BIGNUM *a, int n); --# ifndef OPENSSL_NO_STDIO --int BN_print_fp(FILE *fp, const BIGNUM *a); --# endif --int BN_print(BIO *bio, const BIGNUM *a); --int BN_reciprocal(BIGNUM *r, const BIGNUM *m, int len, BN_CTX *ctx); --int BN_rshift(BIGNUM *r, const BIGNUM *a, int n); --int BN_rshift1(BIGNUM *r, const BIGNUM *a); --void BN_clear(BIGNUM *a); --BIGNUM *BN_dup(const BIGNUM *a); --int BN_ucmp(const BIGNUM *a, const BIGNUM *b); --int BN_set_bit(BIGNUM *a, int n); --int BN_clear_bit(BIGNUM *a, int n); --char *BN_bn2hex(const BIGNUM *a); --char *BN_bn2dec(const BIGNUM *a); --int BN_hex2bn(BIGNUM **a, const char *str); --int BN_dec2bn(BIGNUM **a, const char *str); --int BN_asc2bn(BIGNUM **a, const char *str); --int BN_gcd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); --int BN_kronecker(const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); /* returns -- * -2 for -- * error */ --BIGNUM *BN_mod_inverse(BIGNUM *ret, -- const BIGNUM *a, const BIGNUM *n, BN_CTX *ctx); --BIGNUM *BN_mod_sqrt(BIGNUM *ret, -- const BIGNUM *a, const BIGNUM *n, BN_CTX *ctx); -- --void BN_consttime_swap(BN_ULONG swap, BIGNUM *a, BIGNUM *b, int nwords); -- --/* Deprecated versions */ --DEPRECATEDIN_0_9_8(BIGNUM *BN_generate_prime(BIGNUM *ret, int bits, int safe, -- const BIGNUM *add, -- const BIGNUM *rem, -- void (*callback) (int, int, -- void *), -- void *cb_arg)) --DEPRECATEDIN_0_9_8(int -- BN_is_prime(const BIGNUM *p, int nchecks, -- void (*callback) (int, int, void *), -- BN_CTX *ctx, void *cb_arg)) --DEPRECATEDIN_0_9_8(int -- BN_is_prime_fasttest(const BIGNUM *p, int nchecks, -- void (*callback) (int, int, void *), -- BN_CTX *ctx, void *cb_arg, -- int do_trial_division)) -- --/* Newer versions */ --int BN_generate_prime_ex(BIGNUM *ret, int bits, int safe, const BIGNUM *add, -- const BIGNUM *rem, BN_GENCB *cb); --int BN_is_prime_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, BN_GENCB *cb); --int BN_is_prime_fasttest_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, -- int do_trial_division, BN_GENCB *cb); -- --int BN_X931_generate_Xpq(BIGNUM *Xp, BIGNUM *Xq, int nbits, BN_CTX *ctx); -- --int BN_X931_derive_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, -- const BIGNUM *Xp, const BIGNUM *Xp1, -- const BIGNUM *Xp2, const BIGNUM *e, BN_CTX *ctx, -- BN_GENCB *cb); --int BN_X931_generate_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, BIGNUM *Xp1, -- BIGNUM *Xp2, const BIGNUM *Xp, const BIGNUM *e, -- BN_CTX *ctx, BN_GENCB *cb); -- --BN_MONT_CTX *BN_MONT_CTX_new(void); --int BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, -- BN_MONT_CTX *mont, BN_CTX *ctx); --int BN_to_montgomery(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont, -- BN_CTX *ctx); --int BN_from_montgomery(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont, -- BN_CTX *ctx); --void BN_MONT_CTX_free(BN_MONT_CTX *mont); --int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod, BN_CTX *ctx); --BN_MONT_CTX *BN_MONT_CTX_copy(BN_MONT_CTX *to, BN_MONT_CTX *from); --BN_MONT_CTX *BN_MONT_CTX_set_locked(BN_MONT_CTX **pmont, CRYPTO_RWLOCK *lock, -- const BIGNUM *mod, BN_CTX *ctx); -- --/* BN_BLINDING flags */ --# define BN_BLINDING_NO_UPDATE 0x00000001 --# define BN_BLINDING_NO_RECREATE 0x00000002 -- --BN_BLINDING *BN_BLINDING_new(const BIGNUM *A, const BIGNUM *Ai, BIGNUM *mod); --void BN_BLINDING_free(BN_BLINDING *b); --int BN_BLINDING_update(BN_BLINDING *b, BN_CTX *ctx); --int BN_BLINDING_convert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx); --int BN_BLINDING_invert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx); --int BN_BLINDING_convert_ex(BIGNUM *n, BIGNUM *r, BN_BLINDING *b, BN_CTX *); --int BN_BLINDING_invert_ex(BIGNUM *n, const BIGNUM *r, BN_BLINDING *b, -- BN_CTX *); -- --int BN_BLINDING_is_current_thread(BN_BLINDING *b); --void BN_BLINDING_set_current_thread(BN_BLINDING *b); --int BN_BLINDING_lock(BN_BLINDING *b); --int BN_BLINDING_unlock(BN_BLINDING *b); -- --unsigned long BN_BLINDING_get_flags(const BN_BLINDING *); --void BN_BLINDING_set_flags(BN_BLINDING *, unsigned long); --BN_BLINDING *BN_BLINDING_create_param(BN_BLINDING *b, -- const BIGNUM *e, BIGNUM *m, BN_CTX *ctx, -- int (*bn_mod_exp) (BIGNUM *r, -- const BIGNUM *a, -- const BIGNUM *p, -- const BIGNUM *m, -- BN_CTX *ctx, -- BN_MONT_CTX *m_ctx), -- BN_MONT_CTX *m_ctx); -- --DEPRECATEDIN_0_9_8(void BN_set_params(int mul, int high, int low, int mont)) --DEPRECATEDIN_0_9_8(int BN_get_params(int which)) /* 0, mul, 1 high, 2 low, 3 -- * mont */ -- --BN_RECP_CTX *BN_RECP_CTX_new(void); --void BN_RECP_CTX_free(BN_RECP_CTX *recp); --int BN_RECP_CTX_set(BN_RECP_CTX *recp, const BIGNUM *rdiv, BN_CTX *ctx); --int BN_mod_mul_reciprocal(BIGNUM *r, const BIGNUM *x, const BIGNUM *y, -- BN_RECP_CTX *recp, BN_CTX *ctx); --int BN_mod_exp_recp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, -- const BIGNUM *m, BN_CTX *ctx); --int BN_div_recp(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, -- BN_RECP_CTX *recp, BN_CTX *ctx); -- --# ifndef OPENSSL_NO_EC2M -- --/* -- * Functions for arithmetic over binary polynomials represented by BIGNUMs. -- * The BIGNUM::neg property of BIGNUMs representing binary polynomials is -- * ignored. Note that input arguments are not const so that their bit arrays -- * can be expanded to the appropriate size if needed. -- */ -- --/* -- * r = a + b -- */ --int BN_GF2m_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); --# define BN_GF2m_sub(r, a, b) BN_GF2m_add(r, a, b) --/* -- * r=a mod p -- */ --int BN_GF2m_mod(BIGNUM *r, const BIGNUM *a, const BIGNUM *p); --/* r = (a * b) mod p */ --int BN_GF2m_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, -- const BIGNUM *p, BN_CTX *ctx); --/* r = (a * a) mod p */ --int BN_GF2m_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); --/* r = (1 / b) mod p */ --int BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM *b, const BIGNUM *p, BN_CTX *ctx); --/* r = (a / b) mod p */ --int BN_GF2m_mod_div(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, -- const BIGNUM *p, BN_CTX *ctx); --/* r = (a ^ b) mod p */ --int BN_GF2m_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, -- const BIGNUM *p, BN_CTX *ctx); --/* r = sqrt(a) mod p */ --int BN_GF2m_mod_sqrt(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, -- BN_CTX *ctx); --/* r^2 + r = a mod p */ --int BN_GF2m_mod_solve_quad(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, -- BN_CTX *ctx); --# define BN_GF2m_cmp(a, b) BN_ucmp((a), (b)) --/*- -- * Some functions allow for representation of the irreducible polynomials -- * as an unsigned int[], say p. The irreducible f(t) is then of the form: -- * t^p[0] + t^p[1] + ... + t^p[k] -- * where m = p[0] > p[1] > ... > p[k] = 0. -- */ --/* r = a mod p */ --int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const int p[]); --/* r = (a * b) mod p */ --int BN_GF2m_mod_mul_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, -- const int p[], BN_CTX *ctx); --/* r = (a * a) mod p */ --int BN_GF2m_mod_sqr_arr(BIGNUM *r, const BIGNUM *a, const int p[], -- BN_CTX *ctx); --/* r = (1 / b) mod p */ --int BN_GF2m_mod_inv_arr(BIGNUM *r, const BIGNUM *b, const int p[], -- BN_CTX *ctx); --/* r = (a / b) mod p */ --int BN_GF2m_mod_div_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, -- const int p[], BN_CTX *ctx); --/* r = (a ^ b) mod p */ --int BN_GF2m_mod_exp_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, -- const int p[], BN_CTX *ctx); --/* r = sqrt(a) mod p */ --int BN_GF2m_mod_sqrt_arr(BIGNUM *r, const BIGNUM *a, -- const int p[], BN_CTX *ctx); --/* r^2 + r = a mod p */ --int BN_GF2m_mod_solve_quad_arr(BIGNUM *r, const BIGNUM *a, -- const int p[], BN_CTX *ctx); --int BN_GF2m_poly2arr(const BIGNUM *a, int p[], int max); --int BN_GF2m_arr2poly(const int p[], BIGNUM *a); -- --# endif -- --/* -- * faster mod functions for the 'NIST primes' 0 <= a < p^2 -- */ --int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); --int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); --int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); --int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); --int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); -- --const BIGNUM *BN_get0_nist_prime_192(void); --const BIGNUM *BN_get0_nist_prime_224(void); --const BIGNUM *BN_get0_nist_prime_256(void); --const BIGNUM *BN_get0_nist_prime_384(void); --const BIGNUM *BN_get0_nist_prime_521(void); -- --int (*BN_nist_mod_func(const BIGNUM *p)) (BIGNUM *r, const BIGNUM *a, -- const BIGNUM *field, BN_CTX *ctx); -- --int BN_generate_dsa_nonce(BIGNUM *out, const BIGNUM *range, -- const BIGNUM *priv, const unsigned char *message, -- size_t message_len, BN_CTX *ctx); -- --/* Primes from RFC 2409 */ --BIGNUM *BN_get_rfc2409_prime_768(BIGNUM *bn); --BIGNUM *BN_get_rfc2409_prime_1024(BIGNUM *bn); -- --/* Primes from RFC 3526 */ --BIGNUM *BN_get_rfc3526_prime_1536(BIGNUM *bn); --BIGNUM *BN_get_rfc3526_prime_2048(BIGNUM *bn); --BIGNUM *BN_get_rfc3526_prime_3072(BIGNUM *bn); --BIGNUM *BN_get_rfc3526_prime_4096(BIGNUM *bn); --BIGNUM *BN_get_rfc3526_prime_6144(BIGNUM *bn); --BIGNUM *BN_get_rfc3526_prime_8192(BIGNUM *bn); -- --# if OPENSSL_API_COMPAT < 0x10100000L --# define get_rfc2409_prime_768 BN_get_rfc2409_prime_768 --# define get_rfc2409_prime_1024 BN_get_rfc2409_prime_1024 --# define get_rfc3526_prime_1536 BN_get_rfc3526_prime_1536 --# define get_rfc3526_prime_2048 BN_get_rfc3526_prime_2048 --# define get_rfc3526_prime_3072 BN_get_rfc3526_prime_3072 --# define get_rfc3526_prime_4096 BN_get_rfc3526_prime_4096 --# define get_rfc3526_prime_6144 BN_get_rfc3526_prime_6144 --# define get_rfc3526_prime_8192 BN_get_rfc3526_prime_8192 --# endif -- --int BN_bntest_rand(BIGNUM *rnd, int bits, int top, int bottom); -- -- --# ifdef __cplusplus --} --# endif --#endif -diff --git a/uadk_tool/include/openssl/bnerr.h b/uadk_tool/include/openssl/bnerr.h -deleted file mode 100644 -index 9f3c7cf..0000000 ---- a/uadk_tool/include/openssl/bnerr.h -+++ /dev/null -@@ -1,100 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_BNERR_H --# define HEADER_BNERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_BN_strings(void); -- --/* -- * BN function codes. -- */ --# define BN_F_BNRAND 127 --# define BN_F_BNRAND_RANGE 138 --# define BN_F_BN_BLINDING_CONVERT_EX 100 --# define BN_F_BN_BLINDING_CREATE_PARAM 128 --# define BN_F_BN_BLINDING_INVERT_EX 101 --# define BN_F_BN_BLINDING_NEW 102 --# define BN_F_BN_BLINDING_UPDATE 103 --# define BN_F_BN_BN2DEC 104 --# define BN_F_BN_BN2HEX 105 --# define BN_F_BN_COMPUTE_WNAF 142 --# define BN_F_BN_CTX_GET 116 --# define BN_F_BN_CTX_NEW 106 --# define BN_F_BN_CTX_START 129 --# define BN_F_BN_DIV 107 --# define BN_F_BN_DIV_RECP 130 --# define BN_F_BN_EXP 123 --# define BN_F_BN_EXPAND_INTERNAL 120 --# define BN_F_BN_GENCB_NEW 143 --# define BN_F_BN_GENERATE_DSA_NONCE 140 --# define BN_F_BN_GENERATE_PRIME_EX 141 --# define BN_F_BN_GF2M_MOD 131 --# define BN_F_BN_GF2M_MOD_EXP 132 --# define BN_F_BN_GF2M_MOD_MUL 133 --# define BN_F_BN_GF2M_MOD_SOLVE_QUAD 134 --# define BN_F_BN_GF2M_MOD_SOLVE_QUAD_ARR 135 --# define BN_F_BN_GF2M_MOD_SQR 136 --# define BN_F_BN_GF2M_MOD_SQRT 137 --# define BN_F_BN_LSHIFT 145 --# define BN_F_BN_MOD_EXP2_MONT 118 --# define BN_F_BN_MOD_EXP_MONT 109 --# define BN_F_BN_MOD_EXP_MONT_CONSTTIME 124 --# define BN_F_BN_MOD_EXP_MONT_WORD 117 --# define BN_F_BN_MOD_EXP_RECP 125 --# define BN_F_BN_MOD_EXP_SIMPLE 126 --# define BN_F_BN_MOD_INVERSE 110 --# define BN_F_BN_MOD_INVERSE_NO_BRANCH 139 --# define BN_F_BN_MOD_LSHIFT_QUICK 119 --# define BN_F_BN_MOD_SQRT 121 --# define BN_F_BN_MONT_CTX_NEW 149 --# define BN_F_BN_MPI2BN 112 --# define BN_F_BN_NEW 113 --# define BN_F_BN_POOL_GET 147 --# define BN_F_BN_RAND 114 --# define BN_F_BN_RAND_RANGE 122 --# define BN_F_BN_RECP_CTX_NEW 150 --# define BN_F_BN_RSHIFT 146 --# define BN_F_BN_SET_WORDS 144 --# define BN_F_BN_STACK_PUSH 148 --# define BN_F_BN_USUB 115 -- --/* -- * BN reason codes. -- */ --# define BN_R_ARG2_LT_ARG3 100 --# define BN_R_BAD_RECIPROCAL 101 --# define BN_R_BIGNUM_TOO_LONG 114 --# define BN_R_BITS_TOO_SMALL 118 --# define BN_R_CALLED_WITH_EVEN_MODULUS 102 --# define BN_R_DIV_BY_ZERO 103 --# define BN_R_ENCODING_ERROR 104 --# define BN_R_EXPAND_ON_STATIC_BIGNUM_DATA 105 --# define BN_R_INPUT_NOT_REDUCED 110 --# define BN_R_INVALID_LENGTH 106 --# define BN_R_INVALID_RANGE 115 --# define BN_R_INVALID_SHIFT 119 --# define BN_R_NOT_A_SQUARE 111 --# define BN_R_NOT_INITIALIZED 107 --# define BN_R_NO_INVERSE 108 --# define BN_R_NO_SOLUTION 116 --# define BN_R_PRIVATE_KEY_TOO_LARGE 117 --# define BN_R_P_IS_NOT_PRIME 112 --# define BN_R_TOO_MANY_ITERATIONS 113 --# define BN_R_TOO_MANY_TEMPORARY_VARIABLES 109 -- --#endif -diff --git a/uadk_tool/include/openssl/buffer.h b/uadk_tool/include/openssl/buffer.h -deleted file mode 100644 -index d276576..0000000 ---- a/uadk_tool/include/openssl/buffer.h -+++ /dev/null -@@ -1,58 +0,0 @@ --/* -- * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_BUFFER_H --# define HEADER_BUFFER_H -- --# include --# ifndef HEADER_CRYPTO_H --# include --# endif --# include -- -- --#ifdef __cplusplus --extern "C" { --#endif -- --# include --# include -- --/* -- * These names are outdated as of OpenSSL 1.1; a future release -- * will move them to be deprecated. -- */ --# define BUF_strdup(s) OPENSSL_strdup(s) --# define BUF_strndup(s, size) OPENSSL_strndup(s, size) --# define BUF_memdup(data, size) OPENSSL_memdup(data, size) --# define BUF_strlcpy(dst, src, size) OPENSSL_strlcpy(dst, src, size) --# define BUF_strlcat(dst, src, size) OPENSSL_strlcat(dst, src, size) --# define BUF_strnlen(str, maxlen) OPENSSL_strnlen(str, maxlen) -- --struct buf_mem_st { -- size_t length; /* current number of bytes */ -- char *data; -- size_t max; /* size of buffer */ -- unsigned long flags; --}; -- --# define BUF_MEM_FLAG_SECURE 0x01 -- --BUF_MEM *BUF_MEM_new(void); --BUF_MEM *BUF_MEM_new_ex(unsigned long flags); --void BUF_MEM_free(BUF_MEM *a); --size_t BUF_MEM_grow(BUF_MEM *str, size_t len); --size_t BUF_MEM_grow_clean(BUF_MEM *str, size_t len); --void BUF_reverse(unsigned char *out, const unsigned char *in, size_t siz); -- -- --# ifdef __cplusplus --} --# endif --#endif -diff --git a/uadk_tool/include/openssl/buffererr.h b/uadk_tool/include/openssl/buffererr.h -deleted file mode 100644 -index 04f6ff7..0000000 ---- a/uadk_tool/include/openssl/buffererr.h -+++ /dev/null -@@ -1,34 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_BUFERR_H --# define HEADER_BUFERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_BUF_strings(void); -- --/* -- * BUF function codes. -- */ --# define BUF_F_BUF_MEM_GROW 100 --# define BUF_F_BUF_MEM_GROW_CLEAN 105 --# define BUF_F_BUF_MEM_NEW 101 -- --/* -- * BUF reason codes. -- */ -- --#endif -diff --git a/uadk_tool/include/openssl/camellia.h b/uadk_tool/include/openssl/camellia.h -deleted file mode 100644 -index 151f3c1..0000000 ---- a/uadk_tool/include/openssl/camellia.h -+++ /dev/null -@@ -1,83 +0,0 @@ --/* -- * Copyright 2006-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_CAMELLIA_H --# define HEADER_CAMELLIA_H -- --# include -- --# ifndef OPENSSL_NO_CAMELLIA --# include --#ifdef __cplusplus --extern "C" { --#endif -- --# define CAMELLIA_ENCRYPT 1 --# define CAMELLIA_DECRYPT 0 -- --/* -- * Because array size can't be a const in C, the following two are macros. -- * Both sizes are in bytes. -- */ -- --/* This should be a hidden type, but EVP requires that the size be known */ -- --# define CAMELLIA_BLOCK_SIZE 16 --# define CAMELLIA_TABLE_BYTE_LEN 272 --# define CAMELLIA_TABLE_WORD_LEN (CAMELLIA_TABLE_BYTE_LEN / 4) -- --typedef unsigned int KEY_TABLE_TYPE[CAMELLIA_TABLE_WORD_LEN]; /* to match -- * with WORD */ -- --struct camellia_key_st { -- union { -- double d; /* ensures 64-bit align */ -- KEY_TABLE_TYPE rd_key; -- } u; -- int grand_rounds; --}; --typedef struct camellia_key_st CAMELLIA_KEY; -- --int Camellia_set_key(const unsigned char *userKey, const int bits, -- CAMELLIA_KEY *key); -- --void Camellia_encrypt(const unsigned char *in, unsigned char *out, -- const CAMELLIA_KEY *key); --void Camellia_decrypt(const unsigned char *in, unsigned char *out, -- const CAMELLIA_KEY *key); -- --void Camellia_ecb_encrypt(const unsigned char *in, unsigned char *out, -- const CAMELLIA_KEY *key, const int enc); --void Camellia_cbc_encrypt(const unsigned char *in, unsigned char *out, -- size_t length, const CAMELLIA_KEY *key, -- unsigned char *ivec, const int enc); --void Camellia_cfb128_encrypt(const unsigned char *in, unsigned char *out, -- size_t length, const CAMELLIA_KEY *key, -- unsigned char *ivec, int *num, const int enc); --void Camellia_cfb1_encrypt(const unsigned char *in, unsigned char *out, -- size_t length, const CAMELLIA_KEY *key, -- unsigned char *ivec, int *num, const int enc); --void Camellia_cfb8_encrypt(const unsigned char *in, unsigned char *out, -- size_t length, const CAMELLIA_KEY *key, -- unsigned char *ivec, int *num, const int enc); --void Camellia_ofb128_encrypt(const unsigned char *in, unsigned char *out, -- size_t length, const CAMELLIA_KEY *key, -- unsigned char *ivec, int *num); --void Camellia_ctr128_encrypt(const unsigned char *in, unsigned char *out, -- size_t length, const CAMELLIA_KEY *key, -- unsigned char ivec[CAMELLIA_BLOCK_SIZE], -- unsigned char ecount_buf[CAMELLIA_BLOCK_SIZE], -- unsigned int *num); -- --# ifdef __cplusplus --} --# endif --# endif -- --#endif -diff --git a/uadk_tool/include/openssl/cast.h b/uadk_tool/include/openssl/cast.h -deleted file mode 100644 -index 2cc89ae..0000000 ---- a/uadk_tool/include/openssl/cast.h -+++ /dev/null -@@ -1,53 +0,0 @@ --/* -- * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_CAST_H --# define HEADER_CAST_H -- --# include -- --# ifndef OPENSSL_NO_CAST --# ifdef __cplusplus --extern "C" { --# endif -- --# define CAST_ENCRYPT 1 --# define CAST_DECRYPT 0 -- --# define CAST_LONG unsigned int -- --# define CAST_BLOCK 8 --# define CAST_KEY_LENGTH 16 -- --typedef struct cast_key_st { -- CAST_LONG data[32]; -- int short_key; /* Use reduced rounds for short key */ --} CAST_KEY; -- --void CAST_set_key(CAST_KEY *key, int len, const unsigned char *data); --void CAST_ecb_encrypt(const unsigned char *in, unsigned char *out, -- const CAST_KEY *key, int enc); --void CAST_encrypt(CAST_LONG *data, const CAST_KEY *key); --void CAST_decrypt(CAST_LONG *data, const CAST_KEY *key); --void CAST_cbc_encrypt(const unsigned char *in, unsigned char *out, -- long length, const CAST_KEY *ks, unsigned char *iv, -- int enc); --void CAST_cfb64_encrypt(const unsigned char *in, unsigned char *out, -- long length, const CAST_KEY *schedule, -- unsigned char *ivec, int *num, int enc); --void CAST_ofb64_encrypt(const unsigned char *in, unsigned char *out, -- long length, const CAST_KEY *schedule, -- unsigned char *ivec, int *num); -- --# ifdef __cplusplus --} --# endif --# endif -- --#endif -diff --git a/uadk_tool/include/openssl/cmac.h b/uadk_tool/include/openssl/cmac.h -deleted file mode 100644 -index 3535a9a..0000000 ---- a/uadk_tool/include/openssl/cmac.h -+++ /dev/null -@@ -1,41 +0,0 @@ --/* -- * Copyright 2010-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_CMAC_H --# define HEADER_CMAC_H -- --# ifndef OPENSSL_NO_CMAC -- --#ifdef __cplusplus --extern "C" { --#endif -- --# include -- --/* Opaque */ --typedef struct CMAC_CTX_st CMAC_CTX; -- --CMAC_CTX *CMAC_CTX_new(void); --void CMAC_CTX_cleanup(CMAC_CTX *ctx); --void CMAC_CTX_free(CMAC_CTX *ctx); --EVP_CIPHER_CTX *CMAC_CTX_get0_cipher_ctx(CMAC_CTX *ctx); --int CMAC_CTX_copy(CMAC_CTX *out, const CMAC_CTX *in); -- --int CMAC_Init(CMAC_CTX *ctx, const void *key, size_t keylen, -- const EVP_CIPHER *cipher, ENGINE *impl); --int CMAC_Update(CMAC_CTX *ctx, const void *data, size_t dlen); --int CMAC_Final(CMAC_CTX *ctx, unsigned char *out, size_t *poutlen); --int CMAC_resume(CMAC_CTX *ctx); -- --#ifdef __cplusplus --} --#endif -- --# endif --#endif -diff --git a/uadk_tool/include/openssl/cms.h b/uadk_tool/include/openssl/cms.h -deleted file mode 100644 -index c762796..0000000 ---- a/uadk_tool/include/openssl/cms.h -+++ /dev/null -@@ -1,339 +0,0 @@ --/* -- * Copyright 2008-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_CMS_H --# define HEADER_CMS_H -- --# include -- --# ifndef OPENSSL_NO_CMS --# include --# include --# include --# ifdef __cplusplus --extern "C" { --# endif -- --typedef struct CMS_ContentInfo_st CMS_ContentInfo; --typedef struct CMS_SignerInfo_st CMS_SignerInfo; --typedef struct CMS_CertificateChoices CMS_CertificateChoices; --typedef struct CMS_RevocationInfoChoice_st CMS_RevocationInfoChoice; --typedef struct CMS_RecipientInfo_st CMS_RecipientInfo; --typedef struct CMS_ReceiptRequest_st CMS_ReceiptRequest; --typedef struct CMS_Receipt_st CMS_Receipt; --typedef struct CMS_RecipientEncryptedKey_st CMS_RecipientEncryptedKey; --typedef struct CMS_OtherKeyAttribute_st CMS_OtherKeyAttribute; -- --DEFINE_STACK_OF(CMS_SignerInfo) --DEFINE_STACK_OF(CMS_RecipientEncryptedKey) --DEFINE_STACK_OF(CMS_RecipientInfo) --DEFINE_STACK_OF(CMS_RevocationInfoChoice) --DECLARE_ASN1_FUNCTIONS(CMS_ContentInfo) --DECLARE_ASN1_FUNCTIONS(CMS_ReceiptRequest) --DECLARE_ASN1_PRINT_FUNCTION(CMS_ContentInfo) -- --# define CMS_SIGNERINFO_ISSUER_SERIAL 0 --# define CMS_SIGNERINFO_KEYIDENTIFIER 1 -- --# define CMS_RECIPINFO_NONE -1 --# define CMS_RECIPINFO_TRANS 0 --# define CMS_RECIPINFO_AGREE 1 --# define CMS_RECIPINFO_KEK 2 --# define CMS_RECIPINFO_PASS 3 --# define CMS_RECIPINFO_OTHER 4 -- --/* S/MIME related flags */ -- --# define CMS_TEXT 0x1 --# define CMS_NOCERTS 0x2 --# define CMS_NO_CONTENT_VERIFY 0x4 --# define CMS_NO_ATTR_VERIFY 0x8 --# define CMS_NOSIGS \ -- (CMS_NO_CONTENT_VERIFY|CMS_NO_ATTR_VERIFY) --# define CMS_NOINTERN 0x10 --# define CMS_NO_SIGNER_CERT_VERIFY 0x20 --# define CMS_NOVERIFY 0x20 --# define CMS_DETACHED 0x40 --# define CMS_BINARY 0x80 --# define CMS_NOATTR 0x100 --# define CMS_NOSMIMECAP 0x200 --# define CMS_NOOLDMIMETYPE 0x400 --# define CMS_CRLFEOL 0x800 --# define CMS_STREAM 0x1000 --# define CMS_NOCRL 0x2000 --# define CMS_PARTIAL 0x4000 --# define CMS_REUSE_DIGEST 0x8000 --# define CMS_USE_KEYID 0x10000 --# define CMS_DEBUG_DECRYPT 0x20000 --# define CMS_KEY_PARAM 0x40000 --# define CMS_ASCIICRLF 0x80000 -- --const ASN1_OBJECT *CMS_get0_type(const CMS_ContentInfo *cms); -- --BIO *CMS_dataInit(CMS_ContentInfo *cms, BIO *icont); --int CMS_dataFinal(CMS_ContentInfo *cms, BIO *bio); -- --ASN1_OCTET_STRING **CMS_get0_content(CMS_ContentInfo *cms); --int CMS_is_detached(CMS_ContentInfo *cms); --int CMS_set_detached(CMS_ContentInfo *cms, int detached); -- --# ifdef HEADER_PEM_H --DECLARE_PEM_rw_const(CMS, CMS_ContentInfo) --# endif --int CMS_stream(unsigned char ***boundary, CMS_ContentInfo *cms); --CMS_ContentInfo *d2i_CMS_bio(BIO *bp, CMS_ContentInfo **cms); --int i2d_CMS_bio(BIO *bp, CMS_ContentInfo *cms); -- --BIO *BIO_new_CMS(BIO *out, CMS_ContentInfo *cms); --int i2d_CMS_bio_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, int flags); --int PEM_write_bio_CMS_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, -- int flags); --CMS_ContentInfo *SMIME_read_CMS(BIO *bio, BIO **bcont); --int SMIME_write_CMS(BIO *bio, CMS_ContentInfo *cms, BIO *data, int flags); -- --int CMS_final(CMS_ContentInfo *cms, BIO *data, BIO *dcont, -- unsigned int flags); -- --CMS_ContentInfo *CMS_sign(X509 *signcert, EVP_PKEY *pkey, -- STACK_OF(X509) *certs, BIO *data, -- unsigned int flags); -- --CMS_ContentInfo *CMS_sign_receipt(CMS_SignerInfo *si, -- X509 *signcert, EVP_PKEY *pkey, -- STACK_OF(X509) *certs, unsigned int flags); -- --int CMS_data(CMS_ContentInfo *cms, BIO *out, unsigned int flags); --CMS_ContentInfo *CMS_data_create(BIO *in, unsigned int flags); -- --int CMS_digest_verify(CMS_ContentInfo *cms, BIO *dcont, BIO *out, -- unsigned int flags); --CMS_ContentInfo *CMS_digest_create(BIO *in, const EVP_MD *md, -- unsigned int flags); -- --int CMS_EncryptedData_decrypt(CMS_ContentInfo *cms, -- const unsigned char *key, size_t keylen, -- BIO *dcont, BIO *out, unsigned int flags); -- --CMS_ContentInfo *CMS_EncryptedData_encrypt(BIO *in, const EVP_CIPHER *cipher, -- const unsigned char *key, -- size_t keylen, unsigned int flags); -- --int CMS_EncryptedData_set1_key(CMS_ContentInfo *cms, const EVP_CIPHER *ciph, -- const unsigned char *key, size_t keylen); -- --int CMS_verify(CMS_ContentInfo *cms, STACK_OF(X509) *certs, -- X509_STORE *store, BIO *dcont, BIO *out, unsigned int flags); -- --int CMS_verify_receipt(CMS_ContentInfo *rcms, CMS_ContentInfo *ocms, -- STACK_OF(X509) *certs, -- X509_STORE *store, unsigned int flags); -- --STACK_OF(X509) *CMS_get0_signers(CMS_ContentInfo *cms); -- --CMS_ContentInfo *CMS_encrypt(STACK_OF(X509) *certs, BIO *in, -- const EVP_CIPHER *cipher, unsigned int flags); -- --int CMS_decrypt(CMS_ContentInfo *cms, EVP_PKEY *pkey, X509 *cert, -- BIO *dcont, BIO *out, unsigned int flags); -- --int CMS_decrypt_set1_pkey(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert); --int CMS_decrypt_set1_key(CMS_ContentInfo *cms, -- unsigned char *key, size_t keylen, -- const unsigned char *id, size_t idlen); --int CMS_decrypt_set1_password(CMS_ContentInfo *cms, -- unsigned char *pass, ossl_ssize_t passlen); -- --STACK_OF(CMS_RecipientInfo) *CMS_get0_RecipientInfos(CMS_ContentInfo *cms); --int CMS_RecipientInfo_type(CMS_RecipientInfo *ri); --EVP_PKEY_CTX *CMS_RecipientInfo_get0_pkey_ctx(CMS_RecipientInfo *ri); --CMS_ContentInfo *CMS_EnvelopedData_create(const EVP_CIPHER *cipher); --CMS_RecipientInfo *CMS_add1_recipient_cert(CMS_ContentInfo *cms, -- X509 *recip, unsigned int flags); --int CMS_RecipientInfo_set0_pkey(CMS_RecipientInfo *ri, EVP_PKEY *pkey); --int CMS_RecipientInfo_ktri_cert_cmp(CMS_RecipientInfo *ri, X509 *cert); --int CMS_RecipientInfo_ktri_get0_algs(CMS_RecipientInfo *ri, -- EVP_PKEY **pk, X509 **recip, -- X509_ALGOR **palg); --int CMS_RecipientInfo_ktri_get0_signer_id(CMS_RecipientInfo *ri, -- ASN1_OCTET_STRING **keyid, -- X509_NAME **issuer, -- ASN1_INTEGER **sno); -- --CMS_RecipientInfo *CMS_add0_recipient_key(CMS_ContentInfo *cms, int nid, -- unsigned char *key, size_t keylen, -- unsigned char *id, size_t idlen, -- ASN1_GENERALIZEDTIME *date, -- ASN1_OBJECT *otherTypeId, -- ASN1_TYPE *otherType); -- --int CMS_RecipientInfo_kekri_get0_id(CMS_RecipientInfo *ri, -- X509_ALGOR **palg, -- ASN1_OCTET_STRING **pid, -- ASN1_GENERALIZEDTIME **pdate, -- ASN1_OBJECT **potherid, -- ASN1_TYPE **pothertype); -- --int CMS_RecipientInfo_set0_key(CMS_RecipientInfo *ri, -- unsigned char *key, size_t keylen); -- --int CMS_RecipientInfo_kekri_id_cmp(CMS_RecipientInfo *ri, -- const unsigned char *id, size_t idlen); -- --int CMS_RecipientInfo_set0_password(CMS_RecipientInfo *ri, -- unsigned char *pass, -- ossl_ssize_t passlen); -- --CMS_RecipientInfo *CMS_add0_recipient_password(CMS_ContentInfo *cms, -- int iter, int wrap_nid, -- int pbe_nid, -- unsigned char *pass, -- ossl_ssize_t passlen, -- const EVP_CIPHER *kekciph); -- --int CMS_RecipientInfo_decrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri); --int CMS_RecipientInfo_encrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri); -- --int CMS_uncompress(CMS_ContentInfo *cms, BIO *dcont, BIO *out, -- unsigned int flags); --CMS_ContentInfo *CMS_compress(BIO *in, int comp_nid, unsigned int flags); -- --int CMS_set1_eContentType(CMS_ContentInfo *cms, const ASN1_OBJECT *oid); --const ASN1_OBJECT *CMS_get0_eContentType(CMS_ContentInfo *cms); -- --CMS_CertificateChoices *CMS_add0_CertificateChoices(CMS_ContentInfo *cms); --int CMS_add0_cert(CMS_ContentInfo *cms, X509 *cert); --int CMS_add1_cert(CMS_ContentInfo *cms, X509 *cert); --STACK_OF(X509) *CMS_get1_certs(CMS_ContentInfo *cms); -- --CMS_RevocationInfoChoice *CMS_add0_RevocationInfoChoice(CMS_ContentInfo *cms); --int CMS_add0_crl(CMS_ContentInfo *cms, X509_CRL *crl); --int CMS_add1_crl(CMS_ContentInfo *cms, X509_CRL *crl); --STACK_OF(X509_CRL) *CMS_get1_crls(CMS_ContentInfo *cms); -- --int CMS_SignedData_init(CMS_ContentInfo *cms); --CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms, -- X509 *signer, EVP_PKEY *pk, const EVP_MD *md, -- unsigned int flags); --EVP_PKEY_CTX *CMS_SignerInfo_get0_pkey_ctx(CMS_SignerInfo *si); --EVP_MD_CTX *CMS_SignerInfo_get0_md_ctx(CMS_SignerInfo *si); --STACK_OF(CMS_SignerInfo) *CMS_get0_SignerInfos(CMS_ContentInfo *cms); -- --void CMS_SignerInfo_set1_signer_cert(CMS_SignerInfo *si, X509 *signer); --int CMS_SignerInfo_get0_signer_id(CMS_SignerInfo *si, -- ASN1_OCTET_STRING **keyid, -- X509_NAME **issuer, ASN1_INTEGER **sno); --int CMS_SignerInfo_cert_cmp(CMS_SignerInfo *si, X509 *cert); --int CMS_set1_signers_certs(CMS_ContentInfo *cms, STACK_OF(X509) *certs, -- unsigned int flags); --void CMS_SignerInfo_get0_algs(CMS_SignerInfo *si, EVP_PKEY **pk, -- X509 **signer, X509_ALGOR **pdig, -- X509_ALGOR **psig); --ASN1_OCTET_STRING *CMS_SignerInfo_get0_signature(CMS_SignerInfo *si); --int CMS_SignerInfo_sign(CMS_SignerInfo *si); --int CMS_SignerInfo_verify(CMS_SignerInfo *si); --int CMS_SignerInfo_verify_content(CMS_SignerInfo *si, BIO *chain); -- --int CMS_add_smimecap(CMS_SignerInfo *si, STACK_OF(X509_ALGOR) *algs); --int CMS_add_simple_smimecap(STACK_OF(X509_ALGOR) **algs, -- int algnid, int keysize); --int CMS_add_standard_smimecap(STACK_OF(X509_ALGOR) **smcap); -- --int CMS_signed_get_attr_count(const CMS_SignerInfo *si); --int CMS_signed_get_attr_by_NID(const CMS_SignerInfo *si, int nid, -- int lastpos); --int CMS_signed_get_attr_by_OBJ(const CMS_SignerInfo *si, const ASN1_OBJECT *obj, -- int lastpos); --X509_ATTRIBUTE *CMS_signed_get_attr(const CMS_SignerInfo *si, int loc); --X509_ATTRIBUTE *CMS_signed_delete_attr(CMS_SignerInfo *si, int loc); --int CMS_signed_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr); --int CMS_signed_add1_attr_by_OBJ(CMS_SignerInfo *si, -- const ASN1_OBJECT *obj, int type, -- const void *bytes, int len); --int CMS_signed_add1_attr_by_NID(CMS_SignerInfo *si, -- int nid, int type, -- const void *bytes, int len); --int CMS_signed_add1_attr_by_txt(CMS_SignerInfo *si, -- const char *attrname, int type, -- const void *bytes, int len); --void *CMS_signed_get0_data_by_OBJ(CMS_SignerInfo *si, const ASN1_OBJECT *oid, -- int lastpos, int type); -- --int CMS_unsigned_get_attr_count(const CMS_SignerInfo *si); --int CMS_unsigned_get_attr_by_NID(const CMS_SignerInfo *si, int nid, -- int lastpos); --int CMS_unsigned_get_attr_by_OBJ(const CMS_SignerInfo *si, -- const ASN1_OBJECT *obj, int lastpos); --X509_ATTRIBUTE *CMS_unsigned_get_attr(const CMS_SignerInfo *si, int loc); --X509_ATTRIBUTE *CMS_unsigned_delete_attr(CMS_SignerInfo *si, int loc); --int CMS_unsigned_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr); --int CMS_unsigned_add1_attr_by_OBJ(CMS_SignerInfo *si, -- const ASN1_OBJECT *obj, int type, -- const void *bytes, int len); --int CMS_unsigned_add1_attr_by_NID(CMS_SignerInfo *si, -- int nid, int type, -- const void *bytes, int len); --int CMS_unsigned_add1_attr_by_txt(CMS_SignerInfo *si, -- const char *attrname, int type, -- const void *bytes, int len); --void *CMS_unsigned_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid, -- int lastpos, int type); -- --int CMS_get1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest **prr); --CMS_ReceiptRequest *CMS_ReceiptRequest_create0(unsigned char *id, int idlen, -- int allorfirst, -- STACK_OF(GENERAL_NAMES) -- *receiptList, STACK_OF(GENERAL_NAMES) -- *receiptsTo); --int CMS_add1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest *rr); --void CMS_ReceiptRequest_get0_values(CMS_ReceiptRequest *rr, -- ASN1_STRING **pcid, -- int *pallorfirst, -- STACK_OF(GENERAL_NAMES) **plist, -- STACK_OF(GENERAL_NAMES) **prto); --int CMS_RecipientInfo_kari_get0_alg(CMS_RecipientInfo *ri, -- X509_ALGOR **palg, -- ASN1_OCTET_STRING **pukm); --STACK_OF(CMS_RecipientEncryptedKey) --*CMS_RecipientInfo_kari_get0_reks(CMS_RecipientInfo *ri); -- --int CMS_RecipientInfo_kari_get0_orig_id(CMS_RecipientInfo *ri, -- X509_ALGOR **pubalg, -- ASN1_BIT_STRING **pubkey, -- ASN1_OCTET_STRING **keyid, -- X509_NAME **issuer, -- ASN1_INTEGER **sno); -- --int CMS_RecipientInfo_kari_orig_id_cmp(CMS_RecipientInfo *ri, X509 *cert); -- --int CMS_RecipientEncryptedKey_get0_id(CMS_RecipientEncryptedKey *rek, -- ASN1_OCTET_STRING **keyid, -- ASN1_GENERALIZEDTIME **tm, -- CMS_OtherKeyAttribute **other, -- X509_NAME **issuer, ASN1_INTEGER **sno); --int CMS_RecipientEncryptedKey_cert_cmp(CMS_RecipientEncryptedKey *rek, -- X509 *cert); --int CMS_RecipientInfo_kari_set0_pkey(CMS_RecipientInfo *ri, EVP_PKEY *pk); --EVP_CIPHER_CTX *CMS_RecipientInfo_kari_get0_ctx(CMS_RecipientInfo *ri); --int CMS_RecipientInfo_kari_decrypt(CMS_ContentInfo *cms, -- CMS_RecipientInfo *ri, -- CMS_RecipientEncryptedKey *rek); -- --int CMS_SharedInfo_encode(unsigned char **pder, X509_ALGOR *kekalg, -- ASN1_OCTET_STRING *ukm, int keylen); -- --/* Backward compatibility for spelling errors. */ --# define CMS_R_UNKNOWN_DIGEST_ALGORITM CMS_R_UNKNOWN_DIGEST_ALGORITHM --# define CMS_R_UNSUPPORTED_RECPIENTINFO_TYPE \ -- CMS_R_UNSUPPORTED_RECIPIENTINFO_TYPE -- --# ifdef __cplusplus --} --# endif --# endif --#endif -diff --git a/uadk_tool/include/openssl/cmserr.h b/uadk_tool/include/openssl/cmserr.h -deleted file mode 100644 -index 7dbc13d..0000000 ---- a/uadk_tool/include/openssl/cmserr.h -+++ /dev/null -@@ -1,202 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_CMSERR_H --# define HEADER_CMSERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# include -- --# ifndef OPENSSL_NO_CMS -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_CMS_strings(void); -- --/* -- * CMS function codes. -- */ --# define CMS_F_CHECK_CONTENT 99 --# define CMS_F_CMS_ADD0_CERT 164 --# define CMS_F_CMS_ADD0_RECIPIENT_KEY 100 --# define CMS_F_CMS_ADD0_RECIPIENT_PASSWORD 165 --# define CMS_F_CMS_ADD1_RECEIPTREQUEST 158 --# define CMS_F_CMS_ADD1_RECIPIENT_CERT 101 --# define CMS_F_CMS_ADD1_SIGNER 102 --# define CMS_F_CMS_ADD1_SIGNINGTIME 103 --# define CMS_F_CMS_COMPRESS 104 --# define CMS_F_CMS_COMPRESSEDDATA_CREATE 105 --# define CMS_F_CMS_COMPRESSEDDATA_INIT_BIO 106 --# define CMS_F_CMS_COPY_CONTENT 107 --# define CMS_F_CMS_COPY_MESSAGEDIGEST 108 --# define CMS_F_CMS_DATA 109 --# define CMS_F_CMS_DATAFINAL 110 --# define CMS_F_CMS_DATAINIT 111 --# define CMS_F_CMS_DECRYPT 112 --# define CMS_F_CMS_DECRYPT_SET1_KEY 113 --# define CMS_F_CMS_DECRYPT_SET1_PASSWORD 166 --# define CMS_F_CMS_DECRYPT_SET1_PKEY 114 --# define CMS_F_CMS_DIGESTALGORITHM_FIND_CTX 115 --# define CMS_F_CMS_DIGESTALGORITHM_INIT_BIO 116 --# define CMS_F_CMS_DIGESTEDDATA_DO_FINAL 117 --# define CMS_F_CMS_DIGEST_VERIFY 118 --# define CMS_F_CMS_ENCODE_RECEIPT 161 --# define CMS_F_CMS_ENCRYPT 119 --# define CMS_F_CMS_ENCRYPTEDCONTENT_INIT 179 --# define CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO 120 --# define CMS_F_CMS_ENCRYPTEDDATA_DECRYPT 121 --# define CMS_F_CMS_ENCRYPTEDDATA_ENCRYPT 122 --# define CMS_F_CMS_ENCRYPTEDDATA_SET1_KEY 123 --# define CMS_F_CMS_ENVELOPEDDATA_CREATE 124 --# define CMS_F_CMS_ENVELOPEDDATA_INIT_BIO 125 --# define CMS_F_CMS_ENVELOPED_DATA_INIT 126 --# define CMS_F_CMS_ENV_ASN1_CTRL 171 --# define CMS_F_CMS_FINAL 127 --# define CMS_F_CMS_GET0_CERTIFICATE_CHOICES 128 --# define CMS_F_CMS_GET0_CONTENT 129 --# define CMS_F_CMS_GET0_ECONTENT_TYPE 130 --# define CMS_F_CMS_GET0_ENVELOPED 131 --# define CMS_F_CMS_GET0_REVOCATION_CHOICES 132 --# define CMS_F_CMS_GET0_SIGNED 133 --# define CMS_F_CMS_MSGSIGDIGEST_ADD1 162 --# define CMS_F_CMS_RECEIPTREQUEST_CREATE0 159 --# define CMS_F_CMS_RECEIPT_VERIFY 160 --# define CMS_F_CMS_RECIPIENTINFO_DECRYPT 134 --# define CMS_F_CMS_RECIPIENTINFO_ENCRYPT 169 --# define CMS_F_CMS_RECIPIENTINFO_KARI_ENCRYPT 178 --# define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_ALG 175 --# define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_ORIG_ID 173 --# define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_REKS 172 --# define CMS_F_CMS_RECIPIENTINFO_KARI_ORIG_ID_CMP 174 --# define CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT 135 --# define CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT 136 --# define CMS_F_CMS_RECIPIENTINFO_KEKRI_GET0_ID 137 --# define CMS_F_CMS_RECIPIENTINFO_KEKRI_ID_CMP 138 --# define CMS_F_CMS_RECIPIENTINFO_KTRI_CERT_CMP 139 --# define CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT 140 --# define CMS_F_CMS_RECIPIENTINFO_KTRI_ENCRYPT 141 --# define CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_ALGS 142 --# define CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_SIGNER_ID 143 --# define CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT 167 --# define CMS_F_CMS_RECIPIENTINFO_SET0_KEY 144 --# define CMS_F_CMS_RECIPIENTINFO_SET0_PASSWORD 168 --# define CMS_F_CMS_RECIPIENTINFO_SET0_PKEY 145 --# define CMS_F_CMS_SD_ASN1_CTRL 170 --# define CMS_F_CMS_SET1_IAS 176 --# define CMS_F_CMS_SET1_KEYID 177 --# define CMS_F_CMS_SET1_SIGNERIDENTIFIER 146 --# define CMS_F_CMS_SET_DETACHED 147 --# define CMS_F_CMS_SIGN 148 --# define CMS_F_CMS_SIGNED_DATA_INIT 149 --# define CMS_F_CMS_SIGNERINFO_CONTENT_SIGN 150 --# define CMS_F_CMS_SIGNERINFO_SIGN 151 --# define CMS_F_CMS_SIGNERINFO_VERIFY 152 --# define CMS_F_CMS_SIGNERINFO_VERIFY_CERT 153 --# define CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT 154 --# define CMS_F_CMS_SIGN_RECEIPT 163 --# define CMS_F_CMS_SI_CHECK_ATTRIBUTES 183 --# define CMS_F_CMS_STREAM 155 --# define CMS_F_CMS_UNCOMPRESS 156 --# define CMS_F_CMS_VERIFY 157 --# define CMS_F_KEK_UNWRAP_KEY 180 -- --/* -- * CMS reason codes. -- */ --# define CMS_R_ADD_SIGNER_ERROR 99 --# define CMS_R_ATTRIBUTE_ERROR 161 --# define CMS_R_CERTIFICATE_ALREADY_PRESENT 175 --# define CMS_R_CERTIFICATE_HAS_NO_KEYID 160 --# define CMS_R_CERTIFICATE_VERIFY_ERROR 100 --# define CMS_R_CIPHER_INITIALISATION_ERROR 101 --# define CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR 102 --# define CMS_R_CMS_DATAFINAL_ERROR 103 --# define CMS_R_CMS_LIB 104 --# define CMS_R_CONTENTIDENTIFIER_MISMATCH 170 --# define CMS_R_CONTENT_NOT_FOUND 105 --# define CMS_R_CONTENT_TYPE_MISMATCH 171 --# define CMS_R_CONTENT_TYPE_NOT_COMPRESSED_DATA 106 --# define CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA 107 --# define CMS_R_CONTENT_TYPE_NOT_SIGNED_DATA 108 --# define CMS_R_CONTENT_VERIFY_ERROR 109 --# define CMS_R_CTRL_ERROR 110 --# define CMS_R_CTRL_FAILURE 111 --# define CMS_R_DECRYPT_ERROR 112 --# define CMS_R_ERROR_GETTING_PUBLIC_KEY 113 --# define CMS_R_ERROR_READING_MESSAGEDIGEST_ATTRIBUTE 114 --# define CMS_R_ERROR_SETTING_KEY 115 --# define CMS_R_ERROR_SETTING_RECIPIENTINFO 116 --# define CMS_R_INVALID_ENCRYPTED_KEY_LENGTH 117 --# define CMS_R_INVALID_KEY_ENCRYPTION_PARAMETER 176 --# define CMS_R_INVALID_KEY_LENGTH 118 --# define CMS_R_MD_BIO_INIT_ERROR 119 --# define CMS_R_MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH 120 --# define CMS_R_MESSAGEDIGEST_WRONG_LENGTH 121 --# define CMS_R_MSGSIGDIGEST_ERROR 172 --# define CMS_R_MSGSIGDIGEST_VERIFICATION_FAILURE 162 --# define CMS_R_MSGSIGDIGEST_WRONG_LENGTH 163 --# define CMS_R_NEED_ONE_SIGNER 164 --# define CMS_R_NOT_A_SIGNED_RECEIPT 165 --# define CMS_R_NOT_ENCRYPTED_DATA 122 --# define CMS_R_NOT_KEK 123 --# define CMS_R_NOT_KEY_AGREEMENT 181 --# define CMS_R_NOT_KEY_TRANSPORT 124 --# define CMS_R_NOT_PWRI 177 --# define CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE 125 --# define CMS_R_NO_CIPHER 126 --# define CMS_R_NO_CONTENT 127 --# define CMS_R_NO_CONTENT_TYPE 173 --# define CMS_R_NO_DEFAULT_DIGEST 128 --# define CMS_R_NO_DIGEST_SET 129 --# define CMS_R_NO_KEY 130 --# define CMS_R_NO_KEY_OR_CERT 174 --# define CMS_R_NO_MATCHING_DIGEST 131 --# define CMS_R_NO_MATCHING_RECIPIENT 132 --# define CMS_R_NO_MATCHING_SIGNATURE 166 --# define CMS_R_NO_MSGSIGDIGEST 167 --# define CMS_R_NO_PASSWORD 178 --# define CMS_R_NO_PRIVATE_KEY 133 --# define CMS_R_NO_PUBLIC_KEY 134 --# define CMS_R_NO_RECEIPT_REQUEST 168 --# define CMS_R_NO_SIGNERS 135 --# define CMS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 136 --# define CMS_R_RECEIPT_DECODE_ERROR 169 --# define CMS_R_RECIPIENT_ERROR 137 --# define CMS_R_SIGNER_CERTIFICATE_NOT_FOUND 138 --# define CMS_R_SIGNFINAL_ERROR 139 --# define CMS_R_SMIME_TEXT_ERROR 140 --# define CMS_R_STORE_INIT_ERROR 141 --# define CMS_R_TYPE_NOT_COMPRESSED_DATA 142 --# define CMS_R_TYPE_NOT_DATA 143 --# define CMS_R_TYPE_NOT_DIGESTED_DATA 144 --# define CMS_R_TYPE_NOT_ENCRYPTED_DATA 145 --# define CMS_R_TYPE_NOT_ENVELOPED_DATA 146 --# define CMS_R_UNABLE_TO_FINALIZE_CONTEXT 147 --# define CMS_R_UNKNOWN_CIPHER 148 --# define CMS_R_UNKNOWN_DIGEST_ALGORITHM 149 --# define CMS_R_UNKNOWN_ID 150 --# define CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM 151 --# define CMS_R_UNSUPPORTED_CONTENT_TYPE 152 --# define CMS_R_UNSUPPORTED_KEK_ALGORITHM 153 --# define CMS_R_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM 179 --# define CMS_R_UNSUPPORTED_RECIPIENTINFO_TYPE 155 --# define CMS_R_UNSUPPORTED_RECIPIENT_TYPE 154 --# define CMS_R_UNSUPPORTED_TYPE 156 --# define CMS_R_UNWRAP_ERROR 157 --# define CMS_R_UNWRAP_FAILURE 180 --# define CMS_R_VERIFICATION_FAILURE 158 --# define CMS_R_WRAP_ERROR 159 -- --# endif --#endif -diff --git a/uadk_tool/include/openssl/comp.h b/uadk_tool/include/openssl/comp.h -deleted file mode 100644 -index d814d3c..0000000 ---- a/uadk_tool/include/openssl/comp.h -+++ /dev/null -@@ -1,53 +0,0 @@ --/* -- * Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_COMP_H --# define HEADER_COMP_H -- --# include -- --# ifndef OPENSSL_NO_COMP --# include --# include --# ifdef __cplusplus --extern "C" { --# endif -- -- -- --COMP_CTX *COMP_CTX_new(COMP_METHOD *meth); --const COMP_METHOD *COMP_CTX_get_method(const COMP_CTX *ctx); --int COMP_CTX_get_type(const COMP_CTX* comp); --int COMP_get_type(const COMP_METHOD *meth); --const char *COMP_get_name(const COMP_METHOD *meth); --void COMP_CTX_free(COMP_CTX *ctx); -- --int COMP_compress_block(COMP_CTX *ctx, unsigned char *out, int olen, -- unsigned char *in, int ilen); --int COMP_expand_block(COMP_CTX *ctx, unsigned char *out, int olen, -- unsigned char *in, int ilen); -- --COMP_METHOD *COMP_zlib(void); -- --#if OPENSSL_API_COMPAT < 0x10100000L --#define COMP_zlib_cleanup() while(0) continue --#endif -- --# ifdef HEADER_BIO_H --# ifdef ZLIB --const BIO_METHOD *BIO_f_zlib(void); --# endif --# endif -- -- --# ifdef __cplusplus --} --# endif --# endif --#endif -diff --git a/uadk_tool/include/openssl/comperr.h b/uadk_tool/include/openssl/comperr.h -deleted file mode 100644 -index 90231e9..0000000 ---- a/uadk_tool/include/openssl/comperr.h -+++ /dev/null -@@ -1,44 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_COMPERR_H --# define HEADER_COMPERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# include -- --# ifndef OPENSSL_NO_COMP -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_COMP_strings(void); -- --/* -- * COMP function codes. -- */ --# define COMP_F_BIO_ZLIB_FLUSH 99 --# define COMP_F_BIO_ZLIB_NEW 100 --# define COMP_F_BIO_ZLIB_READ 101 --# define COMP_F_BIO_ZLIB_WRITE 102 --# define COMP_F_COMP_CTX_NEW 103 -- --/* -- * COMP reason codes. -- */ --# define COMP_R_ZLIB_DEFLATE_ERROR 99 --# define COMP_R_ZLIB_INFLATE_ERROR 100 --# define COMP_R_ZLIB_NOT_SUPPORTED 101 -- --# endif --#endif -diff --git a/uadk_tool/include/openssl/conf.h b/uadk_tool/include/openssl/conf.h -deleted file mode 100644 -index 7336cd2..0000000 ---- a/uadk_tool/include/openssl/conf.h -+++ /dev/null -@@ -1,168 +0,0 @@ --/* -- * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_CONF_H --# define HEADER_CONF_H -- --# include --# include --# include --# include --# include --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --typedef struct { -- char *section; -- char *name; -- char *value; --} CONF_VALUE; -- --DEFINE_STACK_OF(CONF_VALUE) --DEFINE_LHASH_OF(CONF_VALUE); -- --struct conf_st; --struct conf_method_st; --typedef struct conf_method_st CONF_METHOD; -- --struct conf_method_st { -- const char *name; -- CONF *(*create) (CONF_METHOD *meth); -- int (*init) (CONF *conf); -- int (*destroy) (CONF *conf); -- int (*destroy_data) (CONF *conf); -- int (*load_bio) (CONF *conf, BIO *bp, long *eline); -- int (*dump) (const CONF *conf, BIO *bp); -- int (*is_number) (const CONF *conf, char c); -- int (*to_int) (const CONF *conf, char c); -- int (*load) (CONF *conf, const char *name, long *eline); --}; -- --/* Module definitions */ -- --typedef struct conf_imodule_st CONF_IMODULE; --typedef struct conf_module_st CONF_MODULE; -- --DEFINE_STACK_OF(CONF_MODULE) --DEFINE_STACK_OF(CONF_IMODULE) -- --/* DSO module function typedefs */ --typedef int conf_init_func (CONF_IMODULE *md, const CONF *cnf); --typedef void conf_finish_func (CONF_IMODULE *md); -- --# define CONF_MFLAGS_IGNORE_ERRORS 0x1 --# define CONF_MFLAGS_IGNORE_RETURN_CODES 0x2 --# define CONF_MFLAGS_SILENT 0x4 --# define CONF_MFLAGS_NO_DSO 0x8 --# define CONF_MFLAGS_IGNORE_MISSING_FILE 0x10 --# define CONF_MFLAGS_DEFAULT_SECTION 0x20 -- --int CONF_set_default_method(CONF_METHOD *meth); --void CONF_set_nconf(CONF *conf, LHASH_OF(CONF_VALUE) *hash); --LHASH_OF(CONF_VALUE) *CONF_load(LHASH_OF(CONF_VALUE) *conf, const char *file, -- long *eline); --# ifndef OPENSSL_NO_STDIO --LHASH_OF(CONF_VALUE) *CONF_load_fp(LHASH_OF(CONF_VALUE) *conf, FILE *fp, -- long *eline); --# endif --LHASH_OF(CONF_VALUE) *CONF_load_bio(LHASH_OF(CONF_VALUE) *conf, BIO *bp, -- long *eline); --STACK_OF(CONF_VALUE) *CONF_get_section(LHASH_OF(CONF_VALUE) *conf, -- const char *section); --char *CONF_get_string(LHASH_OF(CONF_VALUE) *conf, const char *group, -- const char *name); --long CONF_get_number(LHASH_OF(CONF_VALUE) *conf, const char *group, -- const char *name); --void CONF_free(LHASH_OF(CONF_VALUE) *conf); --#ifndef OPENSSL_NO_STDIO --int CONF_dump_fp(LHASH_OF(CONF_VALUE) *conf, FILE *out); --#endif --int CONF_dump_bio(LHASH_OF(CONF_VALUE) *conf, BIO *out); -- --DEPRECATEDIN_1_1_0(void OPENSSL_config(const char *config_name)) -- --#if OPENSSL_API_COMPAT < 0x10100000L --# define OPENSSL_no_config() \ -- OPENSSL_init_crypto(OPENSSL_INIT_NO_LOAD_CONFIG, NULL) --#endif -- --/* -- * New conf code. The semantics are different from the functions above. If -- * that wasn't the case, the above functions would have been replaced -- */ -- --struct conf_st { -- CONF_METHOD *meth; -- void *meth_data; -- LHASH_OF(CONF_VALUE) *data; --}; -- --CONF *NCONF_new(CONF_METHOD *meth); --CONF_METHOD *NCONF_default(void); --CONF_METHOD *NCONF_WIN32(void); --void NCONF_free(CONF *conf); --void NCONF_free_data(CONF *conf); -- --int NCONF_load(CONF *conf, const char *file, long *eline); --# ifndef OPENSSL_NO_STDIO --int NCONF_load_fp(CONF *conf, FILE *fp, long *eline); --# endif --int NCONF_load_bio(CONF *conf, BIO *bp, long *eline); --STACK_OF(CONF_VALUE) *NCONF_get_section(const CONF *conf, -- const char *section); --char *NCONF_get_string(const CONF *conf, const char *group, const char *name); --int NCONF_get_number_e(const CONF *conf, const char *group, const char *name, -- long *result); --#ifndef OPENSSL_NO_STDIO --int NCONF_dump_fp(const CONF *conf, FILE *out); --#endif --int NCONF_dump_bio(const CONF *conf, BIO *out); -- --#define NCONF_get_number(c,g,n,r) NCONF_get_number_e(c,g,n,r) -- --/* Module functions */ -- --int CONF_modules_load(const CONF *cnf, const char *appname, -- unsigned long flags); --int CONF_modules_load_file(const char *filename, const char *appname, -- unsigned long flags); --void CONF_modules_unload(int all); --void CONF_modules_finish(void); --#if OPENSSL_API_COMPAT < 0x10100000L --# define CONF_modules_free() while(0) continue --#endif --int CONF_module_add(const char *name, conf_init_func *ifunc, -- conf_finish_func *ffunc); -- --const char *CONF_imodule_get_name(const CONF_IMODULE *md); --const char *CONF_imodule_get_value(const CONF_IMODULE *md); --void *CONF_imodule_get_usr_data(const CONF_IMODULE *md); --void CONF_imodule_set_usr_data(CONF_IMODULE *md, void *usr_data); --CONF_MODULE *CONF_imodule_get_module(const CONF_IMODULE *md); --unsigned long CONF_imodule_get_flags(const CONF_IMODULE *md); --void CONF_imodule_set_flags(CONF_IMODULE *md, unsigned long flags); --void *CONF_module_get_usr_data(CONF_MODULE *pmod); --void CONF_module_set_usr_data(CONF_MODULE *pmod, void *usr_data); -- --char *CONF_get1_default_config_file(void); -- --int CONF_parse_list(const char *list, int sep, int nospc, -- int (*list_cb) (const char *elem, int len, void *usr), -- void *arg); -- --void OPENSSL_load_builtin_modules(void); -- -- --# ifdef __cplusplus --} --# endif --#endif -diff --git a/uadk_tool/include/openssl/conf_api.h b/uadk_tool/include/openssl/conf_api.h -deleted file mode 100644 -index a0275ad..0000000 ---- a/uadk_tool/include/openssl/conf_api.h -+++ /dev/null -@@ -1,40 +0,0 @@ --/* -- * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_CONF_API_H --# define HEADER_CONF_API_H -- --# include --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --/* Up until OpenSSL 0.9.5a, this was new_section */ --CONF_VALUE *_CONF_new_section(CONF *conf, const char *section); --/* Up until OpenSSL 0.9.5a, this was get_section */ --CONF_VALUE *_CONF_get_section(const CONF *conf, const char *section); --/* Up until OpenSSL 0.9.5a, this was CONF_get_section */ --STACK_OF(CONF_VALUE) *_CONF_get_section_values(const CONF *conf, -- const char *section); -- --int _CONF_add_string(CONF *conf, CONF_VALUE *section, CONF_VALUE *value); --char *_CONF_get_string(const CONF *conf, const char *section, -- const char *name); --long _CONF_get_number(const CONF *conf, const char *section, -- const char *name); -- --int _CONF_new_data(CONF *conf); --void _CONF_free_data(CONF *conf); -- --#ifdef __cplusplus --} --#endif --#endif -diff --git a/uadk_tool/include/openssl/conferr.h b/uadk_tool/include/openssl/conferr.h -deleted file mode 100644 -index 32b9229..0000000 ---- a/uadk_tool/include/openssl/conferr.h -+++ /dev/null -@@ -1,76 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_CONFERR_H --# define HEADER_CONFERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_CONF_strings(void); -- --/* -- * CONF function codes. -- */ --# define CONF_F_CONF_DUMP_FP 104 --# define CONF_F_CONF_LOAD 100 --# define CONF_F_CONF_LOAD_FP 103 --# define CONF_F_CONF_PARSE_LIST 119 --# define CONF_F_DEF_LOAD 120 --# define CONF_F_DEF_LOAD_BIO 121 --# define CONF_F_GET_NEXT_FILE 107 --# define CONF_F_MODULE_ADD 122 --# define CONF_F_MODULE_INIT 115 --# define CONF_F_MODULE_LOAD_DSO 117 --# define CONF_F_MODULE_RUN 118 --# define CONF_F_NCONF_DUMP_BIO 105 --# define CONF_F_NCONF_DUMP_FP 106 --# define CONF_F_NCONF_GET_NUMBER_E 112 --# define CONF_F_NCONF_GET_SECTION 108 --# define CONF_F_NCONF_GET_STRING 109 --# define CONF_F_NCONF_LOAD 113 --# define CONF_F_NCONF_LOAD_BIO 110 --# define CONF_F_NCONF_LOAD_FP 114 --# define CONF_F_NCONF_NEW 111 --# define CONF_F_PROCESS_INCLUDE 116 --# define CONF_F_SSL_MODULE_INIT 123 --# define CONF_F_STR_COPY 101 -- --/* -- * CONF reason codes. -- */ --# define CONF_R_ERROR_LOADING_DSO 110 --# define CONF_R_LIST_CANNOT_BE_NULL 115 --# define CONF_R_MISSING_CLOSE_SQUARE_BRACKET 100 --# define CONF_R_MISSING_EQUAL_SIGN 101 --# define CONF_R_MISSING_INIT_FUNCTION 112 --# define CONF_R_MODULE_INITIALIZATION_ERROR 109 --# define CONF_R_NO_CLOSE_BRACE 102 --# define CONF_R_NO_CONF 105 --# define CONF_R_NO_CONF_OR_ENVIRONMENT_VARIABLE 106 --# define CONF_R_NO_SECTION 107 --# define CONF_R_NO_SUCH_FILE 114 --# define CONF_R_NO_VALUE 108 --# define CONF_R_NUMBER_TOO_LARGE 121 --# define CONF_R_RECURSIVE_DIRECTORY_INCLUDE 111 --# define CONF_R_SSL_COMMAND_SECTION_EMPTY 117 --# define CONF_R_SSL_COMMAND_SECTION_NOT_FOUND 118 --# define CONF_R_SSL_SECTION_EMPTY 119 --# define CONF_R_SSL_SECTION_NOT_FOUND 120 --# define CONF_R_UNABLE_TO_CREATE_NEW_SECTION 103 --# define CONF_R_UNKNOWN_MODULE_NAME 113 --# define CONF_R_VARIABLE_EXPANSION_TOO_LONG 116 --# define CONF_R_VARIABLE_HAS_NO_VALUE 104 -- --#endif -diff --git a/uadk_tool/include/openssl/crypto.h b/uadk_tool/include/openssl/crypto.h -deleted file mode 100644 -index 7d0b526..0000000 ---- a/uadk_tool/include/openssl/crypto.h -+++ /dev/null -@@ -1,445 +0,0 @@ --/* -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_CRYPTO_H --# define HEADER_CRYPTO_H -- --# include --# include -- --# include -- --# ifndef OPENSSL_NO_STDIO --# include --# endif -- --# include --# include --# include --# include --# include -- --# ifdef CHARSET_EBCDIC --# include --# endif -- --/* -- * Resolve problems on some operating systems with symbol names that clash -- * one way or another -- */ --# include -- --# if OPENSSL_API_COMPAT < 0x10100000L --# include --# endif -- --#ifdef __cplusplus --extern "C" { --#endif -- --# if OPENSSL_API_COMPAT < 0x10100000L --# define SSLeay OpenSSL_version_num --# define SSLeay_version OpenSSL_version --# define SSLEAY_VERSION_NUMBER OPENSSL_VERSION_NUMBER --# define SSLEAY_VERSION OPENSSL_VERSION --# define SSLEAY_CFLAGS OPENSSL_CFLAGS --# define SSLEAY_BUILT_ON OPENSSL_BUILT_ON --# define SSLEAY_PLATFORM OPENSSL_PLATFORM --# define SSLEAY_DIR OPENSSL_DIR -- --/* -- * Old type for allocating dynamic locks. No longer used. Use the new thread -- * API instead. -- */ --typedef struct { -- int dummy; --} CRYPTO_dynlock; -- --# endif /* OPENSSL_API_COMPAT */ -- --typedef void CRYPTO_RWLOCK; -- --CRYPTO_RWLOCK *CRYPTO_THREAD_lock_new(void); --int CRYPTO_THREAD_read_lock(CRYPTO_RWLOCK *lock); --int CRYPTO_THREAD_write_lock(CRYPTO_RWLOCK *lock); --int CRYPTO_THREAD_unlock(CRYPTO_RWLOCK *lock); --void CRYPTO_THREAD_lock_free(CRYPTO_RWLOCK *lock); -- --int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock); -- --/* -- * The following can be used to detect memory leaks in the library. If -- * used, it turns on malloc checking -- */ --# define CRYPTO_MEM_CHECK_OFF 0x0 /* Control only */ --# define CRYPTO_MEM_CHECK_ON 0x1 /* Control and mode bit */ --# define CRYPTO_MEM_CHECK_ENABLE 0x2 /* Control and mode bit */ --# define CRYPTO_MEM_CHECK_DISABLE 0x3 /* Control only */ -- --struct crypto_ex_data_st { -- STACK_OF(void) *sk; --}; --DEFINE_STACK_OF(void) -- --/* -- * Per class, we have a STACK of function pointers. -- */ --# define CRYPTO_EX_INDEX_SSL 0 --# define CRYPTO_EX_INDEX_SSL_CTX 1 --# define CRYPTO_EX_INDEX_SSL_SESSION 2 --# define CRYPTO_EX_INDEX_X509 3 --# define CRYPTO_EX_INDEX_X509_STORE 4 --# define CRYPTO_EX_INDEX_X509_STORE_CTX 5 --# define CRYPTO_EX_INDEX_DH 6 --# define CRYPTO_EX_INDEX_DSA 7 --# define CRYPTO_EX_INDEX_EC_KEY 8 --# define CRYPTO_EX_INDEX_RSA 9 --# define CRYPTO_EX_INDEX_ENGINE 10 --# define CRYPTO_EX_INDEX_UI 11 --# define CRYPTO_EX_INDEX_BIO 12 --# define CRYPTO_EX_INDEX_APP 13 --# define CRYPTO_EX_INDEX_UI_METHOD 14 --# define CRYPTO_EX_INDEX_DRBG 15 --# define CRYPTO_EX_INDEX__COUNT 16 -- --/* No longer needed, so this is a no-op */ --#define OPENSSL_malloc_init() while(0) continue -- --int CRYPTO_mem_ctrl(int mode); -- --# define OPENSSL_malloc(num) \ -- CRYPTO_malloc(num, OPENSSL_FILE, OPENSSL_LINE) --# define OPENSSL_zalloc(num) \ -- CRYPTO_zalloc(num, OPENSSL_FILE, OPENSSL_LINE) --# define OPENSSL_realloc(addr, num) \ -- CRYPTO_realloc(addr, num, OPENSSL_FILE, OPENSSL_LINE) --# define OPENSSL_clear_realloc(addr, old_num, num) \ -- CRYPTO_clear_realloc(addr, old_num, num, OPENSSL_FILE, OPENSSL_LINE) --# define OPENSSL_clear_free(addr, num) \ -- CRYPTO_clear_free(addr, num, OPENSSL_FILE, OPENSSL_LINE) --# define OPENSSL_free(addr) \ -- CRYPTO_free(addr, OPENSSL_FILE, OPENSSL_LINE) --# define OPENSSL_memdup(str, s) \ -- CRYPTO_memdup((str), s, OPENSSL_FILE, OPENSSL_LINE) --# define OPENSSL_strdup(str) \ -- CRYPTO_strdup(str, OPENSSL_FILE, OPENSSL_LINE) --# define OPENSSL_strndup(str, n) \ -- CRYPTO_strndup(str, n, OPENSSL_FILE, OPENSSL_LINE) --# define OPENSSL_secure_malloc(num) \ -- CRYPTO_secure_malloc(num, OPENSSL_FILE, OPENSSL_LINE) --# define OPENSSL_secure_zalloc(num) \ -- CRYPTO_secure_zalloc(num, OPENSSL_FILE, OPENSSL_LINE) --# define OPENSSL_secure_free(addr) \ -- CRYPTO_secure_free(addr, OPENSSL_FILE, OPENSSL_LINE) --# define OPENSSL_secure_clear_free(addr, num) \ -- CRYPTO_secure_clear_free(addr, num, OPENSSL_FILE, OPENSSL_LINE) --# define OPENSSL_secure_actual_size(ptr) \ -- CRYPTO_secure_actual_size(ptr) -- --size_t OPENSSL_strlcpy(char *dst, const char *src, size_t siz); --size_t OPENSSL_strlcat(char *dst, const char *src, size_t siz); --size_t OPENSSL_strnlen(const char *str, size_t maxlen); --char *OPENSSL_buf2hexstr(const unsigned char *buffer, long len); --unsigned char *OPENSSL_hexstr2buf(const char *str, long *len); --int OPENSSL_hexchar2int(unsigned char c); -- --# define OPENSSL_MALLOC_MAX_NELEMS(type) (((1U<<(sizeof(int)*8-1))-1)/sizeof(type)) -- --unsigned long OpenSSL_version_num(void); --const char *OpenSSL_version(int type); --# define OPENSSL_VERSION 0 --# define OPENSSL_CFLAGS 1 --# define OPENSSL_BUILT_ON 2 --# define OPENSSL_PLATFORM 3 --# define OPENSSL_DIR 4 --# define OPENSSL_ENGINES_DIR 5 -- --int OPENSSL_issetugid(void); -- --typedef void CRYPTO_EX_new (void *parent, void *ptr, CRYPTO_EX_DATA *ad, -- int idx, long argl, void *argp); --typedef void CRYPTO_EX_free (void *parent, void *ptr, CRYPTO_EX_DATA *ad, -- int idx, long argl, void *argp); --typedef int CRYPTO_EX_dup (CRYPTO_EX_DATA *to, const CRYPTO_EX_DATA *from, -- void *from_d, int idx, long argl, void *argp); --__owur int CRYPTO_get_ex_new_index(int class_index, long argl, void *argp, -- CRYPTO_EX_new *new_func, CRYPTO_EX_dup *dup_func, -- CRYPTO_EX_free *free_func); --/* No longer use an index. */ --int CRYPTO_free_ex_index(int class_index, int idx); -- --/* -- * Initialise/duplicate/free CRYPTO_EX_DATA variables corresponding to a -- * given class (invokes whatever per-class callbacks are applicable) -- */ --int CRYPTO_new_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); --int CRYPTO_dup_ex_data(int class_index, CRYPTO_EX_DATA *to, -- const CRYPTO_EX_DATA *from); -- --void CRYPTO_free_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); -- --/* -- * Get/set data in a CRYPTO_EX_DATA variable corresponding to a particular -- * index (relative to the class type involved) -- */ --int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int idx, void *val); --void *CRYPTO_get_ex_data(const CRYPTO_EX_DATA *ad, int idx); -- --# if OPENSSL_API_COMPAT < 0x10100000L --/* -- * This function cleans up all "ex_data" state. It mustn't be called under -- * potential race-conditions. -- */ --# define CRYPTO_cleanup_all_ex_data() while(0) continue -- --/* -- * The old locking functions have been removed completely without compatibility -- * macros. This is because the old functions either could not properly report -- * errors, or the returned error values were not clearly documented. -- * Replacing the locking functions with no-ops would cause race condition -- * issues in the affected applications. It is far better for them to fail at -- * compile time. -- * On the other hand, the locking callbacks are no longer used. Consequently, -- * the callback management functions can be safely replaced with no-op macros. -- */ --# define CRYPTO_num_locks() (1) --# define CRYPTO_set_locking_callback(func) --# define CRYPTO_get_locking_callback() (NULL) --# define CRYPTO_set_add_lock_callback(func) --# define CRYPTO_get_add_lock_callback() (NULL) -- --/* -- * These defines where used in combination with the old locking callbacks, -- * they are not called anymore, but old code that's not called might still -- * use them. -- */ --# define CRYPTO_LOCK 1 --# define CRYPTO_UNLOCK 2 --# define CRYPTO_READ 4 --# define CRYPTO_WRITE 8 -- --/* This structure is no longer used */ --typedef struct crypto_threadid_st { -- int dummy; --} CRYPTO_THREADID; --/* Only use CRYPTO_THREADID_set_[numeric|pointer]() within callbacks */ --# define CRYPTO_THREADID_set_numeric(id, val) --# define CRYPTO_THREADID_set_pointer(id, ptr) --# define CRYPTO_THREADID_set_callback(threadid_func) (0) --# define CRYPTO_THREADID_get_callback() (NULL) --# define CRYPTO_THREADID_current(id) --# define CRYPTO_THREADID_cmp(a, b) (-1) --# define CRYPTO_THREADID_cpy(dest, src) --# define CRYPTO_THREADID_hash(id) (0UL) -- --# if OPENSSL_API_COMPAT < 0x10000000L --# define CRYPTO_set_id_callback(func) --# define CRYPTO_get_id_callback() (NULL) --# define CRYPTO_thread_id() (0UL) --# endif /* OPENSSL_API_COMPAT < 0x10000000L */ -- --# define CRYPTO_set_dynlock_create_callback(dyn_create_function) --# define CRYPTO_set_dynlock_lock_callback(dyn_lock_function) --# define CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function) --# define CRYPTO_get_dynlock_create_callback() (NULL) --# define CRYPTO_get_dynlock_lock_callback() (NULL) --# define CRYPTO_get_dynlock_destroy_callback() (NULL) --# endif /* OPENSSL_API_COMPAT < 0x10100000L */ -- --int CRYPTO_set_mem_functions( -- void *(*m) (size_t, const char *, int), -- void *(*r) (void *, size_t, const char *, int), -- void (*f) (void *, const char *, int)); --int CRYPTO_set_mem_debug(int flag); --void CRYPTO_get_mem_functions( -- void *(**m) (size_t, const char *, int), -- void *(**r) (void *, size_t, const char *, int), -- void (**f) (void *, const char *, int)); -- --void *CRYPTO_malloc(size_t num, const char *file, int line); --void *CRYPTO_zalloc(size_t num, const char *file, int line); --void *CRYPTO_memdup(const void *str, size_t siz, const char *file, int line); --char *CRYPTO_strdup(const char *str, const char *file, int line); --char *CRYPTO_strndup(const char *str, size_t s, const char *file, int line); --void CRYPTO_free(void *ptr, const char *file, int line); --void CRYPTO_clear_free(void *ptr, size_t num, const char *file, int line); --void *CRYPTO_realloc(void *addr, size_t num, const char *file, int line); --void *CRYPTO_clear_realloc(void *addr, size_t old_num, size_t num, -- const char *file, int line); -- --int CRYPTO_secure_malloc_init(size_t sz, int minsize); --int CRYPTO_secure_malloc_done(void); --void *CRYPTO_secure_malloc(size_t num, const char *file, int line); --void *CRYPTO_secure_zalloc(size_t num, const char *file, int line); --void CRYPTO_secure_free(void *ptr, const char *file, int line); --void CRYPTO_secure_clear_free(void *ptr, size_t num, -- const char *file, int line); --int CRYPTO_secure_allocated(const void *ptr); --int CRYPTO_secure_malloc_initialized(void); --size_t CRYPTO_secure_actual_size(void *ptr); --size_t CRYPTO_secure_used(void); -- --void OPENSSL_cleanse(void *ptr, size_t len); -- --# ifndef OPENSSL_NO_CRYPTO_MDEBUG --# define OPENSSL_mem_debug_push(info) \ -- CRYPTO_mem_debug_push(info, OPENSSL_FILE, OPENSSL_LINE) --# define OPENSSL_mem_debug_pop() \ -- CRYPTO_mem_debug_pop() --int CRYPTO_mem_debug_push(const char *info, const char *file, int line); --int CRYPTO_mem_debug_pop(void); --void CRYPTO_get_alloc_counts(int *mcount, int *rcount, int *fcount); -- --/*- -- * Debugging functions (enabled by CRYPTO_set_mem_debug(1)) -- * The flag argument has the following significance: -- * 0: called before the actual memory allocation has taken place -- * 1: called after the actual memory allocation has taken place -- */ --void CRYPTO_mem_debug_malloc(void *addr, size_t num, int flag, -- const char *file, int line); --void CRYPTO_mem_debug_realloc(void *addr1, void *addr2, size_t num, int flag, -- const char *file, int line); --void CRYPTO_mem_debug_free(void *addr, int flag, -- const char *file, int line); -- --int CRYPTO_mem_leaks_cb(int (*cb) (const char *str, size_t len, void *u), -- void *u); --# ifndef OPENSSL_NO_STDIO --int CRYPTO_mem_leaks_fp(FILE *); --# endif --int CRYPTO_mem_leaks(BIO *bio); --# endif -- --/* die if we have to */ --ossl_noreturn void OPENSSL_die(const char *assertion, const char *file, int line); --# if OPENSSL_API_COMPAT < 0x10100000L --# define OpenSSLDie(f,l,a) OPENSSL_die((a),(f),(l)) --# endif --# define OPENSSL_assert(e) \ -- (void)((e) ? 0 : (OPENSSL_die("assertion failed: " #e, OPENSSL_FILE, OPENSSL_LINE), 1)) -- --int OPENSSL_isservice(void); -- --int FIPS_mode(void); --int FIPS_mode_set(int r); -- --void OPENSSL_init(void); --# ifdef OPENSSL_SYS_UNIX --void OPENSSL_fork_prepare(void); --void OPENSSL_fork_parent(void); --void OPENSSL_fork_child(void); --# endif -- --struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result); --int OPENSSL_gmtime_adj(struct tm *tm, int offset_day, long offset_sec); --int OPENSSL_gmtime_diff(int *pday, int *psec, -- const struct tm *from, const struct tm *to); -- --/* -- * CRYPTO_memcmp returns zero iff the |len| bytes at |a| and |b| are equal. -- * It takes an amount of time dependent on |len|, but independent of the -- * contents of |a| and |b|. Unlike memcmp, it cannot be used to put elements -- * into a defined order as the return value when a != b is undefined, other -- * than to be non-zero. -- */ --int CRYPTO_memcmp(const void * in_a, const void * in_b, size_t len); -- --/* Standard initialisation options */ --# define OPENSSL_INIT_NO_LOAD_CRYPTO_STRINGS 0x00000001L --# define OPENSSL_INIT_LOAD_CRYPTO_STRINGS 0x00000002L --# define OPENSSL_INIT_ADD_ALL_CIPHERS 0x00000004L --# define OPENSSL_INIT_ADD_ALL_DIGESTS 0x00000008L --# define OPENSSL_INIT_NO_ADD_ALL_CIPHERS 0x00000010L --# define OPENSSL_INIT_NO_ADD_ALL_DIGESTS 0x00000020L --# define OPENSSL_INIT_LOAD_CONFIG 0x00000040L --# define OPENSSL_INIT_NO_LOAD_CONFIG 0x00000080L --# define OPENSSL_INIT_ASYNC 0x00000100L --# define OPENSSL_INIT_ENGINE_RDRAND 0x00000200L --# define OPENSSL_INIT_ENGINE_DYNAMIC 0x00000400L --# define OPENSSL_INIT_ENGINE_OPENSSL 0x00000800L --# define OPENSSL_INIT_ENGINE_CRYPTODEV 0x00001000L --# define OPENSSL_INIT_ENGINE_CAPI 0x00002000L --# define OPENSSL_INIT_ENGINE_PADLOCK 0x00004000L --# define OPENSSL_INIT_ENGINE_AFALG 0x00008000L --/* OPENSSL_INIT_ZLIB 0x00010000L */ --# define OPENSSL_INIT_ATFORK 0x00020000L --/* OPENSSL_INIT_BASE_ONLY 0x00040000L */ --# define OPENSSL_INIT_NO_ATEXIT 0x00080000L --/* OPENSSL_INIT flag range 0xfff00000 reserved for OPENSSL_init_ssl() */ --/* Max OPENSSL_INIT flag value is 0x80000000 */ -- --/* openssl and dasync not counted as builtin */ --# define OPENSSL_INIT_ENGINE_ALL_BUILTIN \ -- (OPENSSL_INIT_ENGINE_RDRAND | OPENSSL_INIT_ENGINE_DYNAMIC \ -- | OPENSSL_INIT_ENGINE_CRYPTODEV | OPENSSL_INIT_ENGINE_CAPI | \ -- OPENSSL_INIT_ENGINE_PADLOCK) -- -- --/* Library initialisation functions */ --void OPENSSL_cleanup(void); --int OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings); --int OPENSSL_atexit(void (*handler)(void)); --void OPENSSL_thread_stop(void); -- --/* Low-level control of initialization */ --OPENSSL_INIT_SETTINGS *OPENSSL_INIT_new(void); --# ifndef OPENSSL_NO_STDIO --int OPENSSL_INIT_set_config_filename(OPENSSL_INIT_SETTINGS *settings, -- const char *config_filename); --void OPENSSL_INIT_set_config_file_flags(OPENSSL_INIT_SETTINGS *settings, -- unsigned long flags); --int OPENSSL_INIT_set_config_appname(OPENSSL_INIT_SETTINGS *settings, -- const char *config_appname); --# endif --void OPENSSL_INIT_free(OPENSSL_INIT_SETTINGS *settings); -- --# if defined(OPENSSL_THREADS) && !defined(CRYPTO_TDEBUG) --# if defined(_WIN32) --# if defined(BASETYPES) || defined(_WINDEF_H) --/* application has to include in order to use this */ --typedef DWORD CRYPTO_THREAD_LOCAL; --typedef DWORD CRYPTO_THREAD_ID; -- --typedef LONG CRYPTO_ONCE; --# define CRYPTO_ONCE_STATIC_INIT 0 --# endif --# else --# include --typedef pthread_once_t CRYPTO_ONCE; --typedef pthread_key_t CRYPTO_THREAD_LOCAL; --typedef pthread_t CRYPTO_THREAD_ID; -- --# define CRYPTO_ONCE_STATIC_INIT PTHREAD_ONCE_INIT --# endif --# endif -- --# if !defined(CRYPTO_ONCE_STATIC_INIT) --typedef unsigned int CRYPTO_ONCE; --typedef unsigned int CRYPTO_THREAD_LOCAL; --typedef unsigned int CRYPTO_THREAD_ID; --# define CRYPTO_ONCE_STATIC_INIT 0 --# endif -- --int CRYPTO_THREAD_run_once(CRYPTO_ONCE *once, void (*init)(void)); -- --int CRYPTO_THREAD_init_local(CRYPTO_THREAD_LOCAL *key, void (*cleanup)(void *)); --void *CRYPTO_THREAD_get_local(CRYPTO_THREAD_LOCAL *key); --int CRYPTO_THREAD_set_local(CRYPTO_THREAD_LOCAL *key, void *val); --int CRYPTO_THREAD_cleanup_local(CRYPTO_THREAD_LOCAL *key); -- --CRYPTO_THREAD_ID CRYPTO_THREAD_get_current_id(void); --int CRYPTO_THREAD_compare_id(CRYPTO_THREAD_ID a, CRYPTO_THREAD_ID b); -- -- --# ifdef __cplusplus --} --# endif --#endif -diff --git a/uadk_tool/include/openssl/cryptoerr.h b/uadk_tool/include/openssl/cryptoerr.h -deleted file mode 100644 -index 3db5a4e..0000000 ---- a/uadk_tool/include/openssl/cryptoerr.h -+++ /dev/null -@@ -1,57 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_CRYPTOERR_H --# define HEADER_CRYPTOERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_CRYPTO_strings(void); -- --/* -- * CRYPTO function codes. -- */ --# define CRYPTO_F_CMAC_CTX_NEW 120 --# define CRYPTO_F_CRYPTO_DUP_EX_DATA 110 --# define CRYPTO_F_CRYPTO_FREE_EX_DATA 111 --# define CRYPTO_F_CRYPTO_GET_EX_NEW_INDEX 100 --# define CRYPTO_F_CRYPTO_MEMDUP 115 --# define CRYPTO_F_CRYPTO_NEW_EX_DATA 112 --# define CRYPTO_F_CRYPTO_OCB128_COPY_CTX 121 --# define CRYPTO_F_CRYPTO_OCB128_INIT 122 --# define CRYPTO_F_CRYPTO_SET_EX_DATA 102 --# define CRYPTO_F_FIPS_MODE_SET 109 --# define CRYPTO_F_GET_AND_LOCK 113 --# define CRYPTO_F_OPENSSL_ATEXIT 114 --# define CRYPTO_F_OPENSSL_BUF2HEXSTR 117 --# define CRYPTO_F_OPENSSL_FOPEN 119 --# define CRYPTO_F_OPENSSL_HEXSTR2BUF 118 --# define CRYPTO_F_OPENSSL_INIT_CRYPTO 116 --# define CRYPTO_F_OPENSSL_LH_NEW 126 --# define CRYPTO_F_OPENSSL_SK_DEEP_COPY 127 --# define CRYPTO_F_OPENSSL_SK_DUP 128 --# define CRYPTO_F_PKEY_HMAC_INIT 123 --# define CRYPTO_F_PKEY_POLY1305_INIT 124 --# define CRYPTO_F_PKEY_SIPHASH_INIT 125 --# define CRYPTO_F_SK_RESERVE 129 -- --/* -- * CRYPTO reason codes. -- */ --# define CRYPTO_R_FIPS_MODE_NOT_SUPPORTED 101 --# define CRYPTO_R_ILLEGAL_HEX_DIGIT 102 --# define CRYPTO_R_ODD_NUMBER_OF_DIGITS 103 -- --#endif -diff --git a/uadk_tool/include/openssl/ct.h b/uadk_tool/include/openssl/ct.h -deleted file mode 100644 -index ebdba34..0000000 ---- a/uadk_tool/include/openssl/ct.h -+++ /dev/null -@@ -1,474 +0,0 @@ --/* -- * Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_CT_H --# define HEADER_CT_H -- --# include -- --# ifndef OPENSSL_NO_CT --# include --# include --# include --# include --# ifdef __cplusplus --extern "C" { --# endif -- -- --/* Minimum RSA key size, from RFC6962 */ --# define SCT_MIN_RSA_BITS 2048 -- --/* All hashes are SHA256 in v1 of Certificate Transparency */ --# define CT_V1_HASHLEN SHA256_DIGEST_LENGTH -- --typedef enum { -- CT_LOG_ENTRY_TYPE_NOT_SET = -1, -- CT_LOG_ENTRY_TYPE_X509 = 0, -- CT_LOG_ENTRY_TYPE_PRECERT = 1 --} ct_log_entry_type_t; -- --typedef enum { -- SCT_VERSION_NOT_SET = -1, -- SCT_VERSION_V1 = 0 --} sct_version_t; -- --typedef enum { -- SCT_SOURCE_UNKNOWN, -- SCT_SOURCE_TLS_EXTENSION, -- SCT_SOURCE_X509V3_EXTENSION, -- SCT_SOURCE_OCSP_STAPLED_RESPONSE --} sct_source_t; -- --typedef enum { -- SCT_VALIDATION_STATUS_NOT_SET, -- SCT_VALIDATION_STATUS_UNKNOWN_LOG, -- SCT_VALIDATION_STATUS_VALID, -- SCT_VALIDATION_STATUS_INVALID, -- SCT_VALIDATION_STATUS_UNVERIFIED, -- SCT_VALIDATION_STATUS_UNKNOWN_VERSION --} sct_validation_status_t; -- --DEFINE_STACK_OF(SCT) --DEFINE_STACK_OF(CTLOG) -- --/****************************************** -- * CT policy evaluation context functions * -- ******************************************/ -- --/* -- * Creates a new, empty policy evaluation context. -- * The caller is responsible for calling CT_POLICY_EVAL_CTX_free when finished -- * with the CT_POLICY_EVAL_CTX. -- */ --CT_POLICY_EVAL_CTX *CT_POLICY_EVAL_CTX_new(void); -- --/* Deletes a policy evaluation context and anything it owns. */ --void CT_POLICY_EVAL_CTX_free(CT_POLICY_EVAL_CTX *ctx); -- --/* Gets the peer certificate that the SCTs are for */ --X509* CT_POLICY_EVAL_CTX_get0_cert(const CT_POLICY_EVAL_CTX *ctx); -- --/* -- * Sets the certificate associated with the received SCTs. -- * Increments the reference count of cert. -- * Returns 1 on success, 0 otherwise. -- */ --int CT_POLICY_EVAL_CTX_set1_cert(CT_POLICY_EVAL_CTX *ctx, X509 *cert); -- --/* Gets the issuer of the aforementioned certificate */ --X509* CT_POLICY_EVAL_CTX_get0_issuer(const CT_POLICY_EVAL_CTX *ctx); -- --/* -- * Sets the issuer of the certificate associated with the received SCTs. -- * Increments the reference count of issuer. -- * Returns 1 on success, 0 otherwise. -- */ --int CT_POLICY_EVAL_CTX_set1_issuer(CT_POLICY_EVAL_CTX *ctx, X509 *issuer); -- --/* Gets the CT logs that are trusted sources of SCTs */ --const CTLOG_STORE *CT_POLICY_EVAL_CTX_get0_log_store(const CT_POLICY_EVAL_CTX *ctx); -- --/* Sets the log store that is in use. It must outlive the CT_POLICY_EVAL_CTX. */ --void CT_POLICY_EVAL_CTX_set_shared_CTLOG_STORE(CT_POLICY_EVAL_CTX *ctx, -- CTLOG_STORE *log_store); -- --/* -- * Gets the time, in milliseconds since the Unix epoch, that will be used as the -- * current time when checking whether an SCT was issued in the future. -- * Such SCTs will fail validation, as required by RFC6962. -- */ --uint64_t CT_POLICY_EVAL_CTX_get_time(const CT_POLICY_EVAL_CTX *ctx); -- --/* -- * Sets the time to evaluate SCTs against, in milliseconds since the Unix epoch. -- * If an SCT's timestamp is after this time, it will be interpreted as having -- * been issued in the future. RFC6962 states that "TLS clients MUST reject SCTs -- * whose timestamp is in the future", so an SCT will not validate in this case. -- */ --void CT_POLICY_EVAL_CTX_set_time(CT_POLICY_EVAL_CTX *ctx, uint64_t time_in_ms); -- --/***************** -- * SCT functions * -- *****************/ -- --/* -- * Creates a new, blank SCT. -- * The caller is responsible for calling SCT_free when finished with the SCT. -- */ --SCT *SCT_new(void); -- --/* -- * Creates a new SCT from some base64-encoded strings. -- * The caller is responsible for calling SCT_free when finished with the SCT. -- */ --SCT *SCT_new_from_base64(unsigned char version, -- const char *logid_base64, -- ct_log_entry_type_t entry_type, -- uint64_t timestamp, -- const char *extensions_base64, -- const char *signature_base64); -- --/* -- * Frees the SCT and the underlying data structures. -- */ --void SCT_free(SCT *sct); -- --/* -- * Free a stack of SCTs, and the underlying SCTs themselves. -- * Intended to be compatible with X509V3_EXT_FREE. -- */ --void SCT_LIST_free(STACK_OF(SCT) *a); -- --/* -- * Returns the version of the SCT. -- */ --sct_version_t SCT_get_version(const SCT *sct); -- --/* -- * Set the version of an SCT. -- * Returns 1 on success, 0 if the version is unrecognized. -- */ --__owur int SCT_set_version(SCT *sct, sct_version_t version); -- --/* -- * Returns the log entry type of the SCT. -- */ --ct_log_entry_type_t SCT_get_log_entry_type(const SCT *sct); -- --/* -- * Set the log entry type of an SCT. -- * Returns 1 on success, 0 otherwise. -- */ --__owur int SCT_set_log_entry_type(SCT *sct, ct_log_entry_type_t entry_type); -- --/* -- * Gets the ID of the log that an SCT came from. -- * Ownership of the log ID remains with the SCT. -- * Returns the length of the log ID. -- */ --size_t SCT_get0_log_id(const SCT *sct, unsigned char **log_id); -- --/* -- * Set the log ID of an SCT to point directly to the *log_id specified. -- * The SCT takes ownership of the specified pointer. -- * Returns 1 on success, 0 otherwise. -- */ --__owur int SCT_set0_log_id(SCT *sct, unsigned char *log_id, size_t log_id_len); -- --/* -- * Set the log ID of an SCT. -- * This makes a copy of the log_id. -- * Returns 1 on success, 0 otherwise. -- */ --__owur int SCT_set1_log_id(SCT *sct, const unsigned char *log_id, -- size_t log_id_len); -- --/* -- * Returns the timestamp for the SCT (epoch time in milliseconds). -- */ --uint64_t SCT_get_timestamp(const SCT *sct); -- --/* -- * Set the timestamp of an SCT (epoch time in milliseconds). -- */ --void SCT_set_timestamp(SCT *sct, uint64_t timestamp); -- --/* -- * Return the NID for the signature used by the SCT. -- * For CT v1, this will be either NID_sha256WithRSAEncryption or -- * NID_ecdsa_with_SHA256 (or NID_undef if incorrect/unset). -- */ --int SCT_get_signature_nid(const SCT *sct); -- --/* -- * Set the signature type of an SCT -- * For CT v1, this should be either NID_sha256WithRSAEncryption or -- * NID_ecdsa_with_SHA256. -- * Returns 1 on success, 0 otherwise. -- */ --__owur int SCT_set_signature_nid(SCT *sct, int nid); -- --/* -- * Set *ext to point to the extension data for the SCT. ext must not be NULL. -- * The SCT retains ownership of this pointer. -- * Returns length of the data pointed to. -- */ --size_t SCT_get0_extensions(const SCT *sct, unsigned char **ext); -- --/* -- * Set the extensions of an SCT to point directly to the *ext specified. -- * The SCT takes ownership of the specified pointer. -- */ --void SCT_set0_extensions(SCT *sct, unsigned char *ext, size_t ext_len); -- --/* -- * Set the extensions of an SCT. -- * This takes a copy of the ext. -- * Returns 1 on success, 0 otherwise. -- */ --__owur int SCT_set1_extensions(SCT *sct, const unsigned char *ext, -- size_t ext_len); -- --/* -- * Set *sig to point to the signature for the SCT. sig must not be NULL. -- * The SCT retains ownership of this pointer. -- * Returns length of the data pointed to. -- */ --size_t SCT_get0_signature(const SCT *sct, unsigned char **sig); -- --/* -- * Set the signature of an SCT to point directly to the *sig specified. -- * The SCT takes ownership of the specified pointer. -- */ --void SCT_set0_signature(SCT *sct, unsigned char *sig, size_t sig_len); -- --/* -- * Set the signature of an SCT to be a copy of the *sig specified. -- * Returns 1 on success, 0 otherwise. -- */ --__owur int SCT_set1_signature(SCT *sct, const unsigned char *sig, -- size_t sig_len); -- --/* -- * The origin of this SCT, e.g. TLS extension, OCSP response, etc. -- */ --sct_source_t SCT_get_source(const SCT *sct); -- --/* -- * Set the origin of this SCT, e.g. TLS extension, OCSP response, etc. -- * Returns 1 on success, 0 otherwise. -- */ --__owur int SCT_set_source(SCT *sct, sct_source_t source); -- --/* -- * Returns a text string describing the validation status of |sct|. -- */ --const char *SCT_validation_status_string(const SCT *sct); -- --/* -- * Pretty-prints an |sct| to |out|. -- * It will be indented by the number of spaces specified by |indent|. -- * If |logs| is not NULL, it will be used to lookup the CT log that the SCT came -- * from, so that the log name can be printed. -- */ --void SCT_print(const SCT *sct, BIO *out, int indent, const CTLOG_STORE *logs); -- --/* -- * Pretty-prints an |sct_list| to |out|. -- * It will be indented by the number of spaces specified by |indent|. -- * SCTs will be delimited by |separator|. -- * If |logs| is not NULL, it will be used to lookup the CT log that each SCT -- * came from, so that the log names can be printed. -- */ --void SCT_LIST_print(const STACK_OF(SCT) *sct_list, BIO *out, int indent, -- const char *separator, const CTLOG_STORE *logs); -- --/* -- * Gets the last result of validating this SCT. -- * If it has not been validated yet, returns SCT_VALIDATION_STATUS_NOT_SET. -- */ --sct_validation_status_t SCT_get_validation_status(const SCT *sct); -- --/* -- * Validates the given SCT with the provided context. -- * Sets the "validation_status" field of the SCT. -- * Returns 1 if the SCT is valid and the signature verifies. -- * Returns 0 if the SCT is invalid or could not be verified. -- * Returns -1 if an error occurs. -- */ --__owur int SCT_validate(SCT *sct, const CT_POLICY_EVAL_CTX *ctx); -- --/* -- * Validates the given list of SCTs with the provided context. -- * Sets the "validation_status" field of each SCT. -- * Returns 1 if there are no invalid SCTs and all signatures verify. -- * Returns 0 if at least one SCT is invalid or could not be verified. -- * Returns a negative integer if an error occurs. -- */ --__owur int SCT_LIST_validate(const STACK_OF(SCT) *scts, -- CT_POLICY_EVAL_CTX *ctx); -- -- --/********************************* -- * SCT parsing and serialisation * -- *********************************/ -- --/* -- * Serialize (to TLS format) a stack of SCTs and return the length. -- * "a" must not be NULL. -- * If "pp" is NULL, just return the length of what would have been serialized. -- * If "pp" is not NULL and "*pp" is null, function will allocate a new pointer -- * for data that caller is responsible for freeing (only if function returns -- * successfully). -- * If "pp" is NULL and "*pp" is not NULL, caller is responsible for ensuring -- * that "*pp" is large enough to accept all of the serialized data. -- * Returns < 0 on error, >= 0 indicating bytes written (or would have been) -- * on success. -- */ --__owur int i2o_SCT_LIST(const STACK_OF(SCT) *a, unsigned char **pp); -- --/* -- * Convert TLS format SCT list to a stack of SCTs. -- * If "a" or "*a" is NULL, a new stack will be created that the caller is -- * responsible for freeing (by calling SCT_LIST_free). -- * "**pp" and "*pp" must not be NULL. -- * Upon success, "*pp" will point to after the last bytes read, and a stack -- * will be returned. -- * Upon failure, a NULL pointer will be returned, and the position of "*pp" is -- * not defined. -- */ --STACK_OF(SCT) *o2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp, -- size_t len); -- --/* -- * Serialize (to DER format) a stack of SCTs and return the length. -- * "a" must not be NULL. -- * If "pp" is NULL, just returns the length of what would have been serialized. -- * If "pp" is not NULL and "*pp" is null, function will allocate a new pointer -- * for data that caller is responsible for freeing (only if function returns -- * successfully). -- * If "pp" is NULL and "*pp" is not NULL, caller is responsible for ensuring -- * that "*pp" is large enough to accept all of the serialized data. -- * Returns < 0 on error, >= 0 indicating bytes written (or would have been) -- * on success. -- */ --__owur int i2d_SCT_LIST(const STACK_OF(SCT) *a, unsigned char **pp); -- --/* -- * Parses an SCT list in DER format and returns it. -- * If "a" or "*a" is NULL, a new stack will be created that the caller is -- * responsible for freeing (by calling SCT_LIST_free). -- * "**pp" and "*pp" must not be NULL. -- * Upon success, "*pp" will point to after the last bytes read, and a stack -- * will be returned. -- * Upon failure, a NULL pointer will be returned, and the position of "*pp" is -- * not defined. -- */ --STACK_OF(SCT) *d2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp, -- long len); -- --/* -- * Serialize (to TLS format) an |sct| and write it to |out|. -- * If |out| is null, no SCT will be output but the length will still be returned. -- * If |out| points to a null pointer, a string will be allocated to hold the -- * TLS-format SCT. It is the responsibility of the caller to free it. -- * If |out| points to an allocated string, the TLS-format SCT will be written -- * to it. -- * The length of the SCT in TLS format will be returned. -- */ --__owur int i2o_SCT(const SCT *sct, unsigned char **out); -- --/* -- * Parses an SCT in TLS format and returns it. -- * If |psct| is not null, it will end up pointing to the parsed SCT. If it -- * already points to a non-null pointer, the pointer will be free'd. -- * |in| should be a pointer to a string containing the TLS-format SCT. -- * |in| will be advanced to the end of the SCT if parsing succeeds. -- * |len| should be the length of the SCT in |in|. -- * Returns NULL if an error occurs. -- * If the SCT is an unsupported version, only the SCT's 'sct' and 'sct_len' -- * fields will be populated (with |in| and |len| respectively). -- */ --SCT *o2i_SCT(SCT **psct, const unsigned char **in, size_t len); -- --/******************** -- * CT log functions * -- ********************/ -- --/* -- * Creates a new CT log instance with the given |public_key| and |name|. -- * Takes ownership of |public_key| but copies |name|. -- * Returns NULL if malloc fails or if |public_key| cannot be converted to DER. -- * Should be deleted by the caller using CTLOG_free when no longer needed. -- */ --CTLOG *CTLOG_new(EVP_PKEY *public_key, const char *name); -- --/* -- * Creates a new CTLOG instance with the base64-encoded SubjectPublicKeyInfo DER -- * in |pkey_base64|. The |name| is a string to help users identify this log. -- * Returns 1 on success, 0 on failure. -- * Should be deleted by the caller using CTLOG_free when no longer needed. -- */ --int CTLOG_new_from_base64(CTLOG ** ct_log, -- const char *pkey_base64, const char *name); -- --/* -- * Deletes a CT log instance and its fields. -- */ --void CTLOG_free(CTLOG *log); -- --/* Gets the name of the CT log */ --const char *CTLOG_get0_name(const CTLOG *log); --/* Gets the ID of the CT log */ --void CTLOG_get0_log_id(const CTLOG *log, const uint8_t **log_id, -- size_t *log_id_len); --/* Gets the public key of the CT log */ --EVP_PKEY *CTLOG_get0_public_key(const CTLOG *log); -- --/************************** -- * CT log store functions * -- **************************/ -- --/* -- * Creates a new CT log store. -- * Should be deleted by the caller using CTLOG_STORE_free when no longer needed. -- */ --CTLOG_STORE *CTLOG_STORE_new(void); -- --/* -- * Deletes a CT log store and all of the CT log instances held within. -- */ --void CTLOG_STORE_free(CTLOG_STORE *store); -- --/* -- * Finds a CT log in the store based on its log ID. -- * Returns the CT log, or NULL if no match is found. -- */ --const CTLOG *CTLOG_STORE_get0_log_by_id(const CTLOG_STORE *store, -- const uint8_t *log_id, -- size_t log_id_len); -- --/* -- * Loads a CT log list into a |store| from a |file|. -- * Returns 1 if loading is successful, or 0 otherwise. -- */ --__owur int CTLOG_STORE_load_file(CTLOG_STORE *store, const char *file); -- --/* -- * Loads the default CT log list into a |store|. -- * Returns 1 if loading is successful, or 0 otherwise. -- */ --__owur int CTLOG_STORE_load_default_file(CTLOG_STORE *store); -- --# ifdef __cplusplus --} --# endif --# endif --#endif -diff --git a/uadk_tool/include/openssl/cterr.h b/uadk_tool/include/openssl/cterr.h -deleted file mode 100644 -index feb7bc5..0000000 ---- a/uadk_tool/include/openssl/cterr.h -+++ /dev/null -@@ -1,80 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_CTERR_H --# define HEADER_CTERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# include -- --# ifndef OPENSSL_NO_CT -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_CT_strings(void); -- --/* -- * CT function codes. -- */ --# define CT_F_CTLOG_NEW 117 --# define CT_F_CTLOG_NEW_FROM_BASE64 118 --# define CT_F_CTLOG_NEW_FROM_CONF 119 --# define CT_F_CTLOG_STORE_LOAD_CTX_NEW 122 --# define CT_F_CTLOG_STORE_LOAD_FILE 123 --# define CT_F_CTLOG_STORE_LOAD_LOG 130 --# define CT_F_CTLOG_STORE_NEW 131 --# define CT_F_CT_BASE64_DECODE 124 --# define CT_F_CT_POLICY_EVAL_CTX_NEW 133 --# define CT_F_CT_V1_LOG_ID_FROM_PKEY 125 --# define CT_F_I2O_SCT 107 --# define CT_F_I2O_SCT_LIST 108 --# define CT_F_I2O_SCT_SIGNATURE 109 --# define CT_F_O2I_SCT 110 --# define CT_F_O2I_SCT_LIST 111 --# define CT_F_O2I_SCT_SIGNATURE 112 --# define CT_F_SCT_CTX_NEW 126 --# define CT_F_SCT_CTX_VERIFY 128 --# define CT_F_SCT_NEW 100 --# define CT_F_SCT_NEW_FROM_BASE64 127 --# define CT_F_SCT_SET0_LOG_ID 101 --# define CT_F_SCT_SET1_EXTENSIONS 114 --# define CT_F_SCT_SET1_LOG_ID 115 --# define CT_F_SCT_SET1_SIGNATURE 116 --# define CT_F_SCT_SET_LOG_ENTRY_TYPE 102 --# define CT_F_SCT_SET_SIGNATURE_NID 103 --# define CT_F_SCT_SET_VERSION 104 -- --/* -- * CT reason codes. -- */ --# define CT_R_BASE64_DECODE_ERROR 108 --# define CT_R_INVALID_LOG_ID_LENGTH 100 --# define CT_R_LOG_CONF_INVALID 109 --# define CT_R_LOG_CONF_INVALID_KEY 110 --# define CT_R_LOG_CONF_MISSING_DESCRIPTION 111 --# define CT_R_LOG_CONF_MISSING_KEY 112 --# define CT_R_LOG_KEY_INVALID 113 --# define CT_R_SCT_FUTURE_TIMESTAMP 116 --# define CT_R_SCT_INVALID 104 --# define CT_R_SCT_INVALID_SIGNATURE 107 --# define CT_R_SCT_LIST_INVALID 105 --# define CT_R_SCT_LOG_ID_MISMATCH 114 --# define CT_R_SCT_NOT_SET 106 --# define CT_R_SCT_UNSUPPORTED_VERSION 115 --# define CT_R_UNRECOGNIZED_SIGNATURE_NID 101 --# define CT_R_UNSUPPORTED_ENTRY_TYPE 102 --# define CT_R_UNSUPPORTED_VERSION 103 -- --# endif --#endif -diff --git a/uadk_tool/include/openssl/des.h b/uadk_tool/include/openssl/des.h -deleted file mode 100644 -index be4abbd..0000000 ---- a/uadk_tool/include/openssl/des.h -+++ /dev/null -@@ -1,174 +0,0 @@ --/* -- * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_DES_H --# define HEADER_DES_H -- --# include -- --# ifndef OPENSSL_NO_DES --# ifdef __cplusplus --extern "C" { --# endif --# include -- --typedef unsigned int DES_LONG; -- --# ifdef OPENSSL_BUILD_SHLIBCRYPTO --# undef OPENSSL_EXTERN --# define OPENSSL_EXTERN OPENSSL_EXPORT --# endif -- --typedef unsigned char DES_cblock[8]; --typedef /* const */ unsigned char const_DES_cblock[8]; --/* -- * With "const", gcc 2.8.1 on Solaris thinks that DES_cblock * and -- * const_DES_cblock * are incompatible pointer types. -- */ -- --typedef struct DES_ks { -- union { -- DES_cblock cblock; -- /* -- * make sure things are correct size on machines with 8 byte longs -- */ -- DES_LONG deslong[2]; -- } ks[16]; --} DES_key_schedule; -- --# define DES_KEY_SZ (sizeof(DES_cblock)) --# define DES_SCHEDULE_SZ (sizeof(DES_key_schedule)) -- --# define DES_ENCRYPT 1 --# define DES_DECRYPT 0 -- --# define DES_CBC_MODE 0 --# define DES_PCBC_MODE 1 -- --# define DES_ecb2_encrypt(i,o,k1,k2,e) \ -- DES_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) -- --# define DES_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ -- DES_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) -- --# define DES_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ -- DES_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) -- --# define DES_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ -- DES_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) -- --OPENSSL_DECLARE_GLOBAL(int, DES_check_key); /* defaults to false */ --# define DES_check_key OPENSSL_GLOBAL_REF(DES_check_key) -- --const char *DES_options(void); --void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output, -- DES_key_schedule *ks1, DES_key_schedule *ks2, -- DES_key_schedule *ks3, int enc); --DES_LONG DES_cbc_cksum(const unsigned char *input, DES_cblock *output, -- long length, DES_key_schedule *schedule, -- const_DES_cblock *ivec); --/* DES_cbc_encrypt does not update the IV! Use DES_ncbc_encrypt instead. */ --void DES_cbc_encrypt(const unsigned char *input, unsigned char *output, -- long length, DES_key_schedule *schedule, -- DES_cblock *ivec, int enc); --void DES_ncbc_encrypt(const unsigned char *input, unsigned char *output, -- long length, DES_key_schedule *schedule, -- DES_cblock *ivec, int enc); --void DES_xcbc_encrypt(const unsigned char *input, unsigned char *output, -- long length, DES_key_schedule *schedule, -- DES_cblock *ivec, const_DES_cblock *inw, -- const_DES_cblock *outw, int enc); --void DES_cfb_encrypt(const unsigned char *in, unsigned char *out, int numbits, -- long length, DES_key_schedule *schedule, -- DES_cblock *ivec, int enc); --void DES_ecb_encrypt(const_DES_cblock *input, DES_cblock *output, -- DES_key_schedule *ks, int enc); -- --/* -- * This is the DES encryption function that gets called by just about every -- * other DES routine in the library. You should not use this function except -- * to implement 'modes' of DES. I say this because the functions that call -- * this routine do the conversion from 'char *' to long, and this needs to be -- * done to make sure 'non-aligned' memory access do not occur. The -- * characters are loaded 'little endian'. Data is a pointer to 2 unsigned -- * long's and ks is the DES_key_schedule to use. enc, is non zero specifies -- * encryption, zero if decryption. -- */ --void DES_encrypt1(DES_LONG *data, DES_key_schedule *ks, int enc); -- --/* -- * This functions is the same as DES_encrypt1() except that the DES initial -- * permutation (IP) and final permutation (FP) have been left out. As for -- * DES_encrypt1(), you should not use this function. It is used by the -- * routines in the library that implement triple DES. IP() DES_encrypt2() -- * DES_encrypt2() DES_encrypt2() FP() is the same as DES_encrypt1() -- * DES_encrypt1() DES_encrypt1() except faster :-). -- */ --void DES_encrypt2(DES_LONG *data, DES_key_schedule *ks, int enc); -- --void DES_encrypt3(DES_LONG *data, DES_key_schedule *ks1, -- DES_key_schedule *ks2, DES_key_schedule *ks3); --void DES_decrypt3(DES_LONG *data, DES_key_schedule *ks1, -- DES_key_schedule *ks2, DES_key_schedule *ks3); --void DES_ede3_cbc_encrypt(const unsigned char *input, unsigned char *output, -- long length, -- DES_key_schedule *ks1, DES_key_schedule *ks2, -- DES_key_schedule *ks3, DES_cblock *ivec, int enc); --void DES_ede3_cfb64_encrypt(const unsigned char *in, unsigned char *out, -- long length, DES_key_schedule *ks1, -- DES_key_schedule *ks2, DES_key_schedule *ks3, -- DES_cblock *ivec, int *num, int enc); --void DES_ede3_cfb_encrypt(const unsigned char *in, unsigned char *out, -- int numbits, long length, DES_key_schedule *ks1, -- DES_key_schedule *ks2, DES_key_schedule *ks3, -- DES_cblock *ivec, int enc); --void DES_ede3_ofb64_encrypt(const unsigned char *in, unsigned char *out, -- long length, DES_key_schedule *ks1, -- DES_key_schedule *ks2, DES_key_schedule *ks3, -- DES_cblock *ivec, int *num); --char *DES_fcrypt(const char *buf, const char *salt, char *ret); --char *DES_crypt(const char *buf, const char *salt); --void DES_ofb_encrypt(const unsigned char *in, unsigned char *out, int numbits, -- long length, DES_key_schedule *schedule, -- DES_cblock *ivec); --void DES_pcbc_encrypt(const unsigned char *input, unsigned char *output, -- long length, DES_key_schedule *schedule, -- DES_cblock *ivec, int enc); --DES_LONG DES_quad_cksum(const unsigned char *input, DES_cblock output[], -- long length, int out_count, DES_cblock *seed); --int DES_random_key(DES_cblock *ret); --void DES_set_odd_parity(DES_cblock *key); --int DES_check_key_parity(const_DES_cblock *key); --int DES_is_weak_key(const_DES_cblock *key); --/* -- * DES_set_key (= set_key = DES_key_sched = key_sched) calls -- * DES_set_key_checked if global variable DES_check_key is set, -- * DES_set_key_unchecked otherwise. -- */ --int DES_set_key(const_DES_cblock *key, DES_key_schedule *schedule); --int DES_key_sched(const_DES_cblock *key, DES_key_schedule *schedule); --int DES_set_key_checked(const_DES_cblock *key, DES_key_schedule *schedule); --void DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule); --void DES_string_to_key(const char *str, DES_cblock *key); --void DES_string_to_2keys(const char *str, DES_cblock *key1, DES_cblock *key2); --void DES_cfb64_encrypt(const unsigned char *in, unsigned char *out, -- long length, DES_key_schedule *schedule, -- DES_cblock *ivec, int *num, int enc); --void DES_ofb64_encrypt(const unsigned char *in, unsigned char *out, -- long length, DES_key_schedule *schedule, -- DES_cblock *ivec, int *num); -- --# define DES_fixup_key_parity DES_set_odd_parity -- --# ifdef __cplusplus --} --# endif --# endif -- --#endif -diff --git a/uadk_tool/include/openssl/dh.h b/uadk_tool/include/openssl/dh.h -deleted file mode 100644 -index 3527540..0000000 ---- a/uadk_tool/include/openssl/dh.h -+++ /dev/null -@@ -1,340 +0,0 @@ --/* -- * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_DH_H --# define HEADER_DH_H -- --# include -- --# ifndef OPENSSL_NO_DH --# include --# include --# include --# include --# if OPENSSL_API_COMPAT < 0x10100000L --# include --# endif --# include -- --# ifdef __cplusplus --extern "C" { --# endif -- --# ifndef OPENSSL_DH_MAX_MODULUS_BITS --# define OPENSSL_DH_MAX_MODULUS_BITS 10000 --# endif -- --# define OPENSSL_DH_FIPS_MIN_MODULUS_BITS 1024 -- --# define DH_FLAG_CACHE_MONT_P 0x01 -- --# if OPENSSL_API_COMPAT < 0x10100000L --/* -- * Does nothing. Previously this switched off constant time behaviour. -- */ --# define DH_FLAG_NO_EXP_CONSTTIME 0x00 --# endif -- --/* -- * If this flag is set the DH method is FIPS compliant and can be used in -- * FIPS mode. This is set in the validated module method. If an application -- * sets this flag in its own methods it is its responsibility to ensure the -- * result is compliant. -- */ -- --# define DH_FLAG_FIPS_METHOD 0x0400 -- --/* -- * If this flag is set the operations normally disabled in FIPS mode are -- * permitted it is then the applications responsibility to ensure that the -- * usage is compliant. -- */ -- --# define DH_FLAG_NON_FIPS_ALLOW 0x0400 -- --/* Already defined in ossl_typ.h */ --/* typedef struct dh_st DH; */ --/* typedef struct dh_method DH_METHOD; */ -- --DECLARE_ASN1_ITEM(DHparams) -- --# define DH_GENERATOR_2 2 --/* #define DH_GENERATOR_3 3 */ --# define DH_GENERATOR_5 5 -- --/* DH_check error codes */ --# define DH_CHECK_P_NOT_PRIME 0x01 --# define DH_CHECK_P_NOT_SAFE_PRIME 0x02 --# define DH_UNABLE_TO_CHECK_GENERATOR 0x04 --# define DH_NOT_SUITABLE_GENERATOR 0x08 --# define DH_CHECK_Q_NOT_PRIME 0x10 --# define DH_CHECK_INVALID_Q_VALUE 0x20 --# define DH_CHECK_INVALID_J_VALUE 0x40 -- --/* DH_check_pub_key error codes */ --# define DH_CHECK_PUBKEY_TOO_SMALL 0x01 --# define DH_CHECK_PUBKEY_TOO_LARGE 0x02 --# define DH_CHECK_PUBKEY_INVALID 0x04 -- --/* -- * primes p where (p-1)/2 is prime too are called "safe"; we define this for -- * backward compatibility: -- */ --# define DH_CHECK_P_NOT_STRONG_PRIME DH_CHECK_P_NOT_SAFE_PRIME -- --# define d2i_DHparams_fp(fp,x) \ -- (DH *)ASN1_d2i_fp((char *(*)())DH_new, \ -- (char *(*)())d2i_DHparams, \ -- (fp), \ -- (unsigned char **)(x)) --# define i2d_DHparams_fp(fp,x) \ -- ASN1_i2d_fp(i2d_DHparams,(fp), (unsigned char *)(x)) --# define d2i_DHparams_bio(bp,x) \ -- ASN1_d2i_bio_of(DH, DH_new, d2i_DHparams, bp, x) --# define i2d_DHparams_bio(bp,x) \ -- ASN1_i2d_bio_of_const(DH,i2d_DHparams,bp,x) -- --# define d2i_DHxparams_fp(fp,x) \ -- (DH *)ASN1_d2i_fp((char *(*)())DH_new, \ -- (char *(*)())d2i_DHxparams, \ -- (fp), \ -- (unsigned char **)(x)) --# define i2d_DHxparams_fp(fp,x) \ -- ASN1_i2d_fp(i2d_DHxparams,(fp), (unsigned char *)(x)) --# define d2i_DHxparams_bio(bp,x) \ -- ASN1_d2i_bio_of(DH, DH_new, d2i_DHxparams, bp, x) --# define i2d_DHxparams_bio(bp,x) \ -- ASN1_i2d_bio_of_const(DH, i2d_DHxparams, bp, x) -- --DH *DHparams_dup(DH *); -- --const DH_METHOD *DH_OpenSSL(void); -- --void DH_set_default_method(const DH_METHOD *meth); --const DH_METHOD *DH_get_default_method(void); --int DH_set_method(DH *dh, const DH_METHOD *meth); --DH *DH_new_method(ENGINE *engine); -- --DH *DH_new(void); --void DH_free(DH *dh); --int DH_up_ref(DH *dh); --int DH_bits(const DH *dh); --int DH_size(const DH *dh); --int DH_security_bits(const DH *dh); --#define DH_get_ex_new_index(l, p, newf, dupf, freef) \ -- CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_DH, l, p, newf, dupf, freef) --int DH_set_ex_data(DH *d, int idx, void *arg); --void *DH_get_ex_data(DH *d, int idx); -- --/* Deprecated version */ --DEPRECATEDIN_0_9_8(DH *DH_generate_parameters(int prime_len, int generator, -- void (*callback) (int, int, -- void *), -- void *cb_arg)) -- --/* New version */ --int DH_generate_parameters_ex(DH *dh, int prime_len, int generator, -- BN_GENCB *cb); -- --int DH_check_params_ex(const DH *dh); --int DH_check_ex(const DH *dh); --int DH_check_pub_key_ex(const DH *dh, const BIGNUM *pub_key); --int DH_check_params(const DH *dh, int *ret); --int DH_check(const DH *dh, int *codes); --int DH_check_pub_key(const DH *dh, const BIGNUM *pub_key, int *codes); --int DH_generate_key(DH *dh); --int DH_compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh); --int DH_compute_key_padded(unsigned char *key, const BIGNUM *pub_key, DH *dh); --DH *d2i_DHparams(DH **a, const unsigned char **pp, long length); --int i2d_DHparams(const DH *a, unsigned char **pp); --DH *d2i_DHxparams(DH **a, const unsigned char **pp, long length); --int i2d_DHxparams(const DH *a, unsigned char **pp); --# ifndef OPENSSL_NO_STDIO --int DHparams_print_fp(FILE *fp, const DH *x); --# endif --int DHparams_print(BIO *bp, const DH *x); -- --/* RFC 5114 parameters */ --DH *DH_get_1024_160(void); --DH *DH_get_2048_224(void); --DH *DH_get_2048_256(void); -- --/* Named parameters, currently RFC7919 */ --DH *DH_new_by_nid(int nid); --int DH_get_nid(const DH *dh); -- --# ifndef OPENSSL_NO_CMS --/* RFC2631 KDF */ --int DH_KDF_X9_42(unsigned char *out, size_t outlen, -- const unsigned char *Z, size_t Zlen, -- ASN1_OBJECT *key_oid, -- const unsigned char *ukm, size_t ukmlen, const EVP_MD *md); --# endif -- --void DH_get0_pqg(const DH *dh, -- const BIGNUM **p, const BIGNUM **q, const BIGNUM **g); --int DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g); --void DH_get0_key(const DH *dh, -- const BIGNUM **pub_key, const BIGNUM **priv_key); --int DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key); --const BIGNUM *DH_get0_p(const DH *dh); --const BIGNUM *DH_get0_q(const DH *dh); --const BIGNUM *DH_get0_g(const DH *dh); --const BIGNUM *DH_get0_priv_key(const DH *dh); --const BIGNUM *DH_get0_pub_key(const DH *dh); --void DH_clear_flags(DH *dh, int flags); --int DH_test_flags(const DH *dh, int flags); --void DH_set_flags(DH *dh, int flags); --ENGINE *DH_get0_engine(DH *d); --long DH_get_length(const DH *dh); --int DH_set_length(DH *dh, long length); -- --DH_METHOD *DH_meth_new(const char *name, int flags); --void DH_meth_free(DH_METHOD *dhm); --DH_METHOD *DH_meth_dup(const DH_METHOD *dhm); --const char *DH_meth_get0_name(const DH_METHOD *dhm); --int DH_meth_set1_name(DH_METHOD *dhm, const char *name); --int DH_meth_get_flags(const DH_METHOD *dhm); --int DH_meth_set_flags(DH_METHOD *dhm, int flags); --void *DH_meth_get0_app_data(const DH_METHOD *dhm); --int DH_meth_set0_app_data(DH_METHOD *dhm, void *app_data); --int (*DH_meth_get_generate_key(const DH_METHOD *dhm)) (DH *); --int DH_meth_set_generate_key(DH_METHOD *dhm, int (*generate_key) (DH *)); --int (*DH_meth_get_compute_key(const DH_METHOD *dhm)) -- (unsigned char *key, const BIGNUM *pub_key, DH *dh); --int DH_meth_set_compute_key(DH_METHOD *dhm, -- int (*compute_key) (unsigned char *key, const BIGNUM *pub_key, DH *dh)); --int (*DH_meth_get_bn_mod_exp(const DH_METHOD *dhm)) -- (const DH *, BIGNUM *, const BIGNUM *, const BIGNUM *, const BIGNUM *, -- BN_CTX *, BN_MONT_CTX *); --int DH_meth_set_bn_mod_exp(DH_METHOD *dhm, -- int (*bn_mod_exp) (const DH *, BIGNUM *, const BIGNUM *, const BIGNUM *, -- const BIGNUM *, BN_CTX *, BN_MONT_CTX *)); --int (*DH_meth_get_init(const DH_METHOD *dhm))(DH *); --int DH_meth_set_init(DH_METHOD *dhm, int (*init)(DH *)); --int (*DH_meth_get_finish(const DH_METHOD *dhm)) (DH *); --int DH_meth_set_finish(DH_METHOD *dhm, int (*finish) (DH *)); --int (*DH_meth_get_generate_params(const DH_METHOD *dhm)) -- (DH *, int, int, BN_GENCB *); --int DH_meth_set_generate_params(DH_METHOD *dhm, -- int (*generate_params) (DH *, int, int, BN_GENCB *)); -- -- --# define EVP_PKEY_CTX_set_dh_paramgen_prime_len(ctx, len) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ -- EVP_PKEY_CTRL_DH_PARAMGEN_PRIME_LEN, len, NULL) -- --# define EVP_PKEY_CTX_set_dh_paramgen_subprime_len(ctx, len) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ -- EVP_PKEY_CTRL_DH_PARAMGEN_SUBPRIME_LEN, len, NULL) -- --# define EVP_PKEY_CTX_set_dh_paramgen_type(ctx, typ) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ -- EVP_PKEY_CTRL_DH_PARAMGEN_TYPE, typ, NULL) -- --# define EVP_PKEY_CTX_set_dh_paramgen_generator(ctx, gen) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ -- EVP_PKEY_CTRL_DH_PARAMGEN_GENERATOR, gen, NULL) -- --# define EVP_PKEY_CTX_set_dh_rfc5114(ctx, gen) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_PARAMGEN, \ -- EVP_PKEY_CTRL_DH_RFC5114, gen, NULL) -- --# define EVP_PKEY_CTX_set_dhx_rfc5114(ctx, gen) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_PARAMGEN, \ -- EVP_PKEY_CTRL_DH_RFC5114, gen, NULL) -- --# define EVP_PKEY_CTX_set_dh_nid(ctx, nid) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, \ -- EVP_PKEY_OP_PARAMGEN | EVP_PKEY_OP_KEYGEN, \ -- EVP_PKEY_CTRL_DH_NID, nid, NULL) -- --# define EVP_PKEY_CTX_set_dh_pad(ctx, pad) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_DH_PAD, pad, NULL) -- --# define EVP_PKEY_CTX_set_dh_kdf_type(ctx, kdf) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ -- EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_DH_KDF_TYPE, kdf, NULL) -- --# define EVP_PKEY_CTX_get_dh_kdf_type(ctx) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ -- EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_DH_KDF_TYPE, -2, NULL) -- --# define EVP_PKEY_CTX_set0_dh_kdf_oid(ctx, oid) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ -- EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_DH_KDF_OID, 0, (void *)(oid)) -- --# define EVP_PKEY_CTX_get0_dh_kdf_oid(ctx, poid) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ -- EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_GET_DH_KDF_OID, 0, (void *)(poid)) -- --# define EVP_PKEY_CTX_set_dh_kdf_md(ctx, md) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ -- EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_DH_KDF_MD, 0, (void *)(md)) -- --# define EVP_PKEY_CTX_get_dh_kdf_md(ctx, pmd) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ -- EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_GET_DH_KDF_MD, 0, (void *)(pmd)) -- --# define EVP_PKEY_CTX_set_dh_kdf_outlen(ctx, len) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ -- EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_DH_KDF_OUTLEN, len, NULL) -- --# define EVP_PKEY_CTX_get_dh_kdf_outlen(ctx, plen) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ -- EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_GET_DH_KDF_OUTLEN, 0, (void *)(plen)) -- --# define EVP_PKEY_CTX_set0_dh_kdf_ukm(ctx, p, plen) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ -- EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_DH_KDF_UKM, plen, (void *)(p)) -- --# define EVP_PKEY_CTX_get0_dh_kdf_ukm(ctx, p) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, \ -- EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_GET_DH_KDF_UKM, 0, (void *)(p)) -- --# define EVP_PKEY_CTRL_DH_PARAMGEN_PRIME_LEN (EVP_PKEY_ALG_CTRL + 1) --# define EVP_PKEY_CTRL_DH_PARAMGEN_GENERATOR (EVP_PKEY_ALG_CTRL + 2) --# define EVP_PKEY_CTRL_DH_RFC5114 (EVP_PKEY_ALG_CTRL + 3) --# define EVP_PKEY_CTRL_DH_PARAMGEN_SUBPRIME_LEN (EVP_PKEY_ALG_CTRL + 4) --# define EVP_PKEY_CTRL_DH_PARAMGEN_TYPE (EVP_PKEY_ALG_CTRL + 5) --# define EVP_PKEY_CTRL_DH_KDF_TYPE (EVP_PKEY_ALG_CTRL + 6) --# define EVP_PKEY_CTRL_DH_KDF_MD (EVP_PKEY_ALG_CTRL + 7) --# define EVP_PKEY_CTRL_GET_DH_KDF_MD (EVP_PKEY_ALG_CTRL + 8) --# define EVP_PKEY_CTRL_DH_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 9) --# define EVP_PKEY_CTRL_GET_DH_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 10) --# define EVP_PKEY_CTRL_DH_KDF_UKM (EVP_PKEY_ALG_CTRL + 11) --# define EVP_PKEY_CTRL_GET_DH_KDF_UKM (EVP_PKEY_ALG_CTRL + 12) --# define EVP_PKEY_CTRL_DH_KDF_OID (EVP_PKEY_ALG_CTRL + 13) --# define EVP_PKEY_CTRL_GET_DH_KDF_OID (EVP_PKEY_ALG_CTRL + 14) --# define EVP_PKEY_CTRL_DH_NID (EVP_PKEY_ALG_CTRL + 15) --# define EVP_PKEY_CTRL_DH_PAD (EVP_PKEY_ALG_CTRL + 16) -- --/* KDF types */ --# define EVP_PKEY_DH_KDF_NONE 1 --# ifndef OPENSSL_NO_CMS --# define EVP_PKEY_DH_KDF_X9_42 2 --# endif -- -- --# ifdef __cplusplus --} --# endif --# endif --#endif -diff --git a/uadk_tool/include/openssl/dherr.h b/uadk_tool/include/openssl/dherr.h -deleted file mode 100644 -index 916b3be..0000000 ---- a/uadk_tool/include/openssl/dherr.h -+++ /dev/null -@@ -1,88 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_DHERR_H --# define HEADER_DHERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# include -- --# ifndef OPENSSL_NO_DH -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_DH_strings(void); -- --/* -- * DH function codes. -- */ --# define DH_F_COMPUTE_KEY 102 --# define DH_F_DHPARAMS_PRINT_FP 101 --# define DH_F_DH_BUILTIN_GENPARAMS 106 --# define DH_F_DH_CHECK_EX 121 --# define DH_F_DH_CHECK_PARAMS_EX 122 --# define DH_F_DH_CHECK_PUB_KEY_EX 123 --# define DH_F_DH_CMS_DECRYPT 114 --# define DH_F_DH_CMS_SET_PEERKEY 115 --# define DH_F_DH_CMS_SET_SHARED_INFO 116 --# define DH_F_DH_METH_DUP 117 --# define DH_F_DH_METH_NEW 118 --# define DH_F_DH_METH_SET1_NAME 119 --# define DH_F_DH_NEW_BY_NID 104 --# define DH_F_DH_NEW_METHOD 105 --# define DH_F_DH_PARAM_DECODE 107 --# define DH_F_DH_PKEY_PUBLIC_CHECK 124 --# define DH_F_DH_PRIV_DECODE 110 --# define DH_F_DH_PRIV_ENCODE 111 --# define DH_F_DH_PUB_DECODE 108 --# define DH_F_DH_PUB_ENCODE 109 --# define DH_F_DO_DH_PRINT 100 --# define DH_F_GENERATE_KEY 103 --# define DH_F_PKEY_DH_CTRL_STR 120 --# define DH_F_PKEY_DH_DERIVE 112 --# define DH_F_PKEY_DH_INIT 125 --# define DH_F_PKEY_DH_KEYGEN 113 -- --/* -- * DH reason codes. -- */ --# define DH_R_BAD_GENERATOR 101 --# define DH_R_BN_DECODE_ERROR 109 --# define DH_R_BN_ERROR 106 --# define DH_R_CHECK_INVALID_J_VALUE 115 --# define DH_R_CHECK_INVALID_Q_VALUE 116 --# define DH_R_CHECK_PUBKEY_INVALID 122 --# define DH_R_CHECK_PUBKEY_TOO_LARGE 123 --# define DH_R_CHECK_PUBKEY_TOO_SMALL 124 --# define DH_R_CHECK_P_NOT_PRIME 117 --# define DH_R_CHECK_P_NOT_SAFE_PRIME 118 --# define DH_R_CHECK_Q_NOT_PRIME 119 --# define DH_R_DECODE_ERROR 104 --# define DH_R_INVALID_PARAMETER_NAME 110 --# define DH_R_INVALID_PARAMETER_NID 114 --# define DH_R_INVALID_PUBKEY 102 --# define DH_R_KDF_PARAMETER_ERROR 112 --# define DH_R_KEYS_NOT_SET 108 --# define DH_R_MISSING_PUBKEY 125 --# define DH_R_MODULUS_TOO_LARGE 103 --# define DH_R_NOT_SUITABLE_GENERATOR 120 --# define DH_R_NO_PARAMETERS_SET 107 --# define DH_R_NO_PRIVATE_VALUE 100 --# define DH_R_PARAMETER_ENCODING_ERROR 105 --# define DH_R_PEER_KEY_ERROR 111 --# define DH_R_SHARED_INFO_ERROR 113 --# define DH_R_UNABLE_TO_CHECK_GENERATOR 121 -- --# endif --#endif -diff --git a/uadk_tool/include/openssl/dsa.h b/uadk_tool/include/openssl/dsa.h -deleted file mode 100644 -index 6d8a18a..0000000 ---- a/uadk_tool/include/openssl/dsa.h -+++ /dev/null -@@ -1,244 +0,0 @@ --/* -- * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_DSA_H --# define HEADER_DSA_H -- --# include -- --# ifndef OPENSSL_NO_DSA --# ifdef __cplusplus --extern "C" { --# endif --# include --# include --# include --# include --# include --# if OPENSSL_API_COMPAT < 0x10100000L --# include --# endif --# include -- --# ifndef OPENSSL_DSA_MAX_MODULUS_BITS --# define OPENSSL_DSA_MAX_MODULUS_BITS 10000 --# endif -- --# define OPENSSL_DSA_FIPS_MIN_MODULUS_BITS 1024 -- --# define DSA_FLAG_CACHE_MONT_P 0x01 --# if OPENSSL_API_COMPAT < 0x10100000L --/* -- * Does nothing. Previously this switched off constant time behaviour. -- */ --# define DSA_FLAG_NO_EXP_CONSTTIME 0x00 --# endif -- --/* -- * If this flag is set the DSA method is FIPS compliant and can be used in -- * FIPS mode. This is set in the validated module method. If an application -- * sets this flag in its own methods it is its responsibility to ensure the -- * result is compliant. -- */ -- --# define DSA_FLAG_FIPS_METHOD 0x0400 -- --/* -- * If this flag is set the operations normally disabled in FIPS mode are -- * permitted it is then the applications responsibility to ensure that the -- * usage is compliant. -- */ -- --# define DSA_FLAG_NON_FIPS_ALLOW 0x0400 --# define DSA_FLAG_FIPS_CHECKED 0x0800 -- --/* Already defined in ossl_typ.h */ --/* typedef struct dsa_st DSA; */ --/* typedef struct dsa_method DSA_METHOD; */ -- --typedef struct DSA_SIG_st DSA_SIG; -- --# define d2i_DSAparams_fp(fp,x) (DSA *)ASN1_d2i_fp((char *(*)())DSA_new, \ -- (char *(*)())d2i_DSAparams,(fp),(unsigned char **)(x)) --# define i2d_DSAparams_fp(fp,x) ASN1_i2d_fp(i2d_DSAparams,(fp), \ -- (unsigned char *)(x)) --# define d2i_DSAparams_bio(bp,x) ASN1_d2i_bio_of(DSA,DSA_new,d2i_DSAparams,bp,x) --# define i2d_DSAparams_bio(bp,x) ASN1_i2d_bio_of_const(DSA,i2d_DSAparams,bp,x) -- --DSA *DSAparams_dup(DSA *x); --DSA_SIG *DSA_SIG_new(void); --void DSA_SIG_free(DSA_SIG *a); --int i2d_DSA_SIG(const DSA_SIG *a, unsigned char **pp); --DSA_SIG *d2i_DSA_SIG(DSA_SIG **v, const unsigned char **pp, long length); --void DSA_SIG_get0(const DSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps); --int DSA_SIG_set0(DSA_SIG *sig, BIGNUM *r, BIGNUM *s); -- --DSA_SIG *DSA_do_sign(const unsigned char *dgst, int dlen, DSA *dsa); --int DSA_do_verify(const unsigned char *dgst, int dgst_len, -- DSA_SIG *sig, DSA *dsa); -- --const DSA_METHOD *DSA_OpenSSL(void); -- --void DSA_set_default_method(const DSA_METHOD *); --const DSA_METHOD *DSA_get_default_method(void); --int DSA_set_method(DSA *dsa, const DSA_METHOD *); --const DSA_METHOD *DSA_get_method(DSA *d); -- --DSA *DSA_new(void); --DSA *DSA_new_method(ENGINE *engine); --void DSA_free(DSA *r); --/* "up" the DSA object's reference count */ --int DSA_up_ref(DSA *r); --int DSA_size(const DSA *); --int DSA_bits(const DSA *d); --int DSA_security_bits(const DSA *d); -- /* next 4 return -1 on error */ --DEPRECATEDIN_1_2_0(int DSA_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, BIGNUM **rp)) --int DSA_sign(int type, const unsigned char *dgst, int dlen, -- unsigned char *sig, unsigned int *siglen, DSA *dsa); --int DSA_verify(int type, const unsigned char *dgst, int dgst_len, -- const unsigned char *sigbuf, int siglen, DSA *dsa); --#define DSA_get_ex_new_index(l, p, newf, dupf, freef) \ -- CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_DSA, l, p, newf, dupf, freef) --int DSA_set_ex_data(DSA *d, int idx, void *arg); --void *DSA_get_ex_data(DSA *d, int idx); -- --DSA *d2i_DSAPublicKey(DSA **a, const unsigned char **pp, long length); --DSA *d2i_DSAPrivateKey(DSA **a, const unsigned char **pp, long length); --DSA *d2i_DSAparams(DSA **a, const unsigned char **pp, long length); -- --/* Deprecated version */ --DEPRECATEDIN_0_9_8(DSA *DSA_generate_parameters(int bits, -- unsigned char *seed, -- int seed_len, -- int *counter_ret, -- unsigned long *h_ret, void -- (*callback) (int, int, -- void *), -- void *cb_arg)) -- --/* New version */ --int DSA_generate_parameters_ex(DSA *dsa, int bits, -- const unsigned char *seed, int seed_len, -- int *counter_ret, unsigned long *h_ret, -- BN_GENCB *cb); -- --int DSA_generate_key(DSA *a); --int i2d_DSAPublicKey(const DSA *a, unsigned char **pp); --int i2d_DSAPrivateKey(const DSA *a, unsigned char **pp); --int i2d_DSAparams(const DSA *a, unsigned char **pp); -- --int DSAparams_print(BIO *bp, const DSA *x); --int DSA_print(BIO *bp, const DSA *x, int off); --# ifndef OPENSSL_NO_STDIO --int DSAparams_print_fp(FILE *fp, const DSA *x); --int DSA_print_fp(FILE *bp, const DSA *x, int off); --# endif -- --# define DSS_prime_checks 64 --/* -- * Primality test according to FIPS PUB 186-4, Appendix C.3. Since we only -- * have one value here we set the number of checks to 64 which is the 128 bit -- * security level that is the highest level and valid for creating a 3072 bit -- * DSA key. -- */ --# define DSA_is_prime(n, callback, cb_arg) \ -- BN_is_prime(n, DSS_prime_checks, callback, NULL, cb_arg) -- --# ifndef OPENSSL_NO_DH --/* -- * Convert DSA structure (key or just parameters) into DH structure (be -- * careful to avoid small subgroup attacks when using this!) -- */ --DH *DSA_dup_DH(const DSA *r); --# endif -- --# define EVP_PKEY_CTX_set_dsa_paramgen_bits(ctx, nbits) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DSA, EVP_PKEY_OP_PARAMGEN, \ -- EVP_PKEY_CTRL_DSA_PARAMGEN_BITS, nbits, NULL) --# define EVP_PKEY_CTX_set_dsa_paramgen_q_bits(ctx, qbits) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DSA, EVP_PKEY_OP_PARAMGEN, \ -- EVP_PKEY_CTRL_DSA_PARAMGEN_Q_BITS, qbits, NULL) --# define EVP_PKEY_CTX_set_dsa_paramgen_md(ctx, md) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DSA, EVP_PKEY_OP_PARAMGEN, \ -- EVP_PKEY_CTRL_DSA_PARAMGEN_MD, 0, (void *)(md)) -- --# define EVP_PKEY_CTRL_DSA_PARAMGEN_BITS (EVP_PKEY_ALG_CTRL + 1) --# define EVP_PKEY_CTRL_DSA_PARAMGEN_Q_BITS (EVP_PKEY_ALG_CTRL + 2) --# define EVP_PKEY_CTRL_DSA_PARAMGEN_MD (EVP_PKEY_ALG_CTRL + 3) -- --void DSA_get0_pqg(const DSA *d, -- const BIGNUM **p, const BIGNUM **q, const BIGNUM **g); --int DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g); --void DSA_get0_key(const DSA *d, -- const BIGNUM **pub_key, const BIGNUM **priv_key); --int DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key); --const BIGNUM *DSA_get0_p(const DSA *d); --const BIGNUM *DSA_get0_q(const DSA *d); --const BIGNUM *DSA_get0_g(const DSA *d); --const BIGNUM *DSA_get0_pub_key(const DSA *d); --const BIGNUM *DSA_get0_priv_key(const DSA *d); --void DSA_clear_flags(DSA *d, int flags); --int DSA_test_flags(const DSA *d, int flags); --void DSA_set_flags(DSA *d, int flags); --ENGINE *DSA_get0_engine(DSA *d); -- --DSA_METHOD *DSA_meth_new(const char *name, int flags); --void DSA_meth_free(DSA_METHOD *dsam); --DSA_METHOD *DSA_meth_dup(const DSA_METHOD *dsam); --const char *DSA_meth_get0_name(const DSA_METHOD *dsam); --int DSA_meth_set1_name(DSA_METHOD *dsam, const char *name); --int DSA_meth_get_flags(const DSA_METHOD *dsam); --int DSA_meth_set_flags(DSA_METHOD *dsam, int flags); --void *DSA_meth_get0_app_data(const DSA_METHOD *dsam); --int DSA_meth_set0_app_data(DSA_METHOD *dsam, void *app_data); --DSA_SIG *(*DSA_meth_get_sign(const DSA_METHOD *dsam)) -- (const unsigned char *, int, DSA *); --int DSA_meth_set_sign(DSA_METHOD *dsam, -- DSA_SIG *(*sign) (const unsigned char *, int, DSA *)); --int (*DSA_meth_get_sign_setup(const DSA_METHOD *dsam)) -- (DSA *, BN_CTX *, BIGNUM **, BIGNUM **); --int DSA_meth_set_sign_setup(DSA_METHOD *dsam, -- int (*sign_setup) (DSA *, BN_CTX *, BIGNUM **, BIGNUM **)); --int (*DSA_meth_get_verify(const DSA_METHOD *dsam)) -- (const unsigned char *, int, DSA_SIG *, DSA *); --int DSA_meth_set_verify(DSA_METHOD *dsam, -- int (*verify) (const unsigned char *, int, DSA_SIG *, DSA *)); --int (*DSA_meth_get_mod_exp(const DSA_METHOD *dsam)) -- (DSA *, BIGNUM *, const BIGNUM *, const BIGNUM *, const BIGNUM *, -- const BIGNUM *, const BIGNUM *, BN_CTX *, BN_MONT_CTX *); --int DSA_meth_set_mod_exp(DSA_METHOD *dsam, -- int (*mod_exp) (DSA *, BIGNUM *, const BIGNUM *, const BIGNUM *, -- const BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *, -- BN_MONT_CTX *)); --int (*DSA_meth_get_bn_mod_exp(const DSA_METHOD *dsam)) -- (DSA *, BIGNUM *, const BIGNUM *, const BIGNUM *, const BIGNUM *, -- BN_CTX *, BN_MONT_CTX *); --int DSA_meth_set_bn_mod_exp(DSA_METHOD *dsam, -- int (*bn_mod_exp) (DSA *, BIGNUM *, const BIGNUM *, const BIGNUM *, -- const BIGNUM *, BN_CTX *, BN_MONT_CTX *)); --int (*DSA_meth_get_init(const DSA_METHOD *dsam))(DSA *); --int DSA_meth_set_init(DSA_METHOD *dsam, int (*init)(DSA *)); --int (*DSA_meth_get_finish(const DSA_METHOD *dsam)) (DSA *); --int DSA_meth_set_finish(DSA_METHOD *dsam, int (*finish) (DSA *)); --int (*DSA_meth_get_paramgen(const DSA_METHOD *dsam)) -- (DSA *, int, const unsigned char *, int, int *, unsigned long *, -- BN_GENCB *); --int DSA_meth_set_paramgen(DSA_METHOD *dsam, -- int (*paramgen) (DSA *, int, const unsigned char *, int, int *, -- unsigned long *, BN_GENCB *)); --int (*DSA_meth_get_keygen(const DSA_METHOD *dsam)) (DSA *); --int DSA_meth_set_keygen(DSA_METHOD *dsam, int (*keygen) (DSA *)); -- -- --# ifdef __cplusplus --} --# endif --# endif --#endif -diff --git a/uadk_tool/include/openssl/dsaerr.h b/uadk_tool/include/openssl/dsaerr.h -deleted file mode 100644 -index 495a1ac..0000000 ---- a/uadk_tool/include/openssl/dsaerr.h -+++ /dev/null -@@ -1,72 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_DSAERR_H --# define HEADER_DSAERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# include -- --# ifndef OPENSSL_NO_DSA -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_DSA_strings(void); -- --/* -- * DSA function codes. -- */ --# define DSA_F_DSAPARAMS_PRINT 100 --# define DSA_F_DSAPARAMS_PRINT_FP 101 --# define DSA_F_DSA_BUILTIN_PARAMGEN 125 --# define DSA_F_DSA_BUILTIN_PARAMGEN2 126 --# define DSA_F_DSA_DO_SIGN 112 --# define DSA_F_DSA_DO_VERIFY 113 --# define DSA_F_DSA_METH_DUP 127 --# define DSA_F_DSA_METH_NEW 128 --# define DSA_F_DSA_METH_SET1_NAME 129 --# define DSA_F_DSA_NEW_METHOD 103 --# define DSA_F_DSA_PARAM_DECODE 119 --# define DSA_F_DSA_PRINT_FP 105 --# define DSA_F_DSA_PRIV_DECODE 115 --# define DSA_F_DSA_PRIV_ENCODE 116 --# define DSA_F_DSA_PUB_DECODE 117 --# define DSA_F_DSA_PUB_ENCODE 118 --# define DSA_F_DSA_SIGN 106 --# define DSA_F_DSA_SIGN_SETUP 107 --# define DSA_F_DSA_SIG_NEW 102 --# define DSA_F_OLD_DSA_PRIV_DECODE 122 --# define DSA_F_PKEY_DSA_CTRL 120 --# define DSA_F_PKEY_DSA_CTRL_STR 104 --# define DSA_F_PKEY_DSA_KEYGEN 121 -- --/* -- * DSA reason codes. -- */ --# define DSA_R_BAD_Q_VALUE 102 --# define DSA_R_BN_DECODE_ERROR 108 --# define DSA_R_BN_ERROR 109 --# define DSA_R_DECODE_ERROR 104 --# define DSA_R_INVALID_DIGEST_TYPE 106 --# define DSA_R_INVALID_PARAMETERS 112 --# define DSA_R_MISSING_PARAMETERS 101 --# define DSA_R_MISSING_PRIVATE_KEY 111 --# define DSA_R_MODULUS_TOO_LARGE 103 --# define DSA_R_NO_PARAMETERS_SET 107 --# define DSA_R_PARAMETER_ENCODING_ERROR 105 --# define DSA_R_Q_NOT_PRIME 113 --# define DSA_R_SEED_LEN_SMALL 110 -- --# endif --#endif -diff --git a/uadk_tool/include/openssl/dtls1.h b/uadk_tool/include/openssl/dtls1.h -deleted file mode 100644 -index d55ca9c..0000000 ---- a/uadk_tool/include/openssl/dtls1.h -+++ /dev/null -@@ -1,55 +0,0 @@ --/* -- * Copyright 2005-2018 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_DTLS1_H --# define HEADER_DTLS1_H -- --#ifdef __cplusplus --extern "C" { --#endif -- --# define DTLS1_VERSION 0xFEFF --# define DTLS1_2_VERSION 0xFEFD --# define DTLS_MIN_VERSION DTLS1_VERSION --# define DTLS_MAX_VERSION DTLS1_2_VERSION --# define DTLS1_VERSION_MAJOR 0xFE -- --# define DTLS1_BAD_VER 0x0100 -- --/* Special value for method supporting multiple versions */ --# define DTLS_ANY_VERSION 0x1FFFF -- --/* lengths of messages */ --/* -- * Actually the max cookie length in DTLS is 255. But we can't change this now -- * due to compatibility concerns. -- */ --# define DTLS1_COOKIE_LENGTH 256 -- --# define DTLS1_RT_HEADER_LENGTH 13 -- --# define DTLS1_HM_HEADER_LENGTH 12 -- --# define DTLS1_HM_BAD_FRAGMENT -2 --# define DTLS1_HM_FRAGMENT_RETRY -3 -- --# define DTLS1_CCS_HEADER_LENGTH 1 -- --# define DTLS1_AL_HEADER_LENGTH 2 -- --/* Timeout multipliers */ --# define DTLS1_TMO_READ_COUNT 2 --# define DTLS1_TMO_WRITE_COUNT 2 -- --# define DTLS1_TMO_ALERT_COUNT 12 -- --#ifdef __cplusplus --} --#endif --#endif -diff --git a/uadk_tool/include/openssl/e_os2.h b/uadk_tool/include/openssl/e_os2.h -deleted file mode 100644 -index 5c88e51..0000000 ---- a/uadk_tool/include/openssl/e_os2.h -+++ /dev/null -@@ -1,301 +0,0 @@ --/* -- * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_E_OS2_H --# define HEADER_E_OS2_H -- --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --/****************************************************************************** -- * Detect operating systems. This probably needs completing. -- * The result is that at least one OPENSSL_SYS_os macro should be defined. -- * However, if none is defined, Unix is assumed. -- **/ -- --# define OPENSSL_SYS_UNIX -- --/* --------------------- Microsoft operating systems ---------------------- */ -- --/* -- * Note that MSDOS actually denotes 32-bit environments running on top of -- * MS-DOS, such as DJGPP one. -- */ --# if defined(OPENSSL_SYS_MSDOS) --# undef OPENSSL_SYS_UNIX --# endif -- --/* -- * For 32 bit environment, there seems to be the CygWin environment and then -- * all the others that try to do the same thing Microsoft does... -- */ --/* -- * UEFI lives here because it might be built with a Microsoft toolchain and -- * we need to avoid the false positive match on Windows. -- */ --# if defined(OPENSSL_SYS_UEFI) --# undef OPENSSL_SYS_UNIX --# elif defined(OPENSSL_SYS_UWIN) --# undef OPENSSL_SYS_UNIX --# define OPENSSL_SYS_WIN32_UWIN --# else --# if defined(__CYGWIN__) || defined(OPENSSL_SYS_CYGWIN) --# define OPENSSL_SYS_WIN32_CYGWIN --# else --# if defined(_WIN32) || defined(OPENSSL_SYS_WIN32) --# undef OPENSSL_SYS_UNIX --# if !defined(OPENSSL_SYS_WIN32) --# define OPENSSL_SYS_WIN32 --# endif --# endif --# if defined(_WIN64) || defined(OPENSSL_SYS_WIN64) --# undef OPENSSL_SYS_UNIX --# if !defined(OPENSSL_SYS_WIN64) --# define OPENSSL_SYS_WIN64 --# endif --# endif --# if defined(OPENSSL_SYS_WINNT) --# undef OPENSSL_SYS_UNIX --# endif --# if defined(OPENSSL_SYS_WINCE) --# undef OPENSSL_SYS_UNIX --# endif --# endif --# endif -- --/* Anything that tries to look like Microsoft is "Windows" */ --# if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WIN64) || defined(OPENSSL_SYS_WINNT) || defined(OPENSSL_SYS_WINCE) --# undef OPENSSL_SYS_UNIX --# define OPENSSL_SYS_WINDOWS --# ifndef OPENSSL_SYS_MSDOS --# define OPENSSL_SYS_MSDOS --# endif --# endif -- --/* -- * DLL settings. This part is a bit tough, because it's up to the -- * application implementor how he or she will link the application, so it -- * requires some macro to be used. -- */ --# ifdef OPENSSL_SYS_WINDOWS --# ifndef OPENSSL_OPT_WINDLL --# if defined(_WINDLL) /* This is used when building OpenSSL to -- * indicate that DLL linkage should be used */ --# define OPENSSL_OPT_WINDLL --# endif --# endif --# endif -- --/* ------------------------------- OpenVMS -------------------------------- */ --# if defined(__VMS) || defined(VMS) || defined(OPENSSL_SYS_VMS) --# if !defined(OPENSSL_SYS_VMS) --# undef OPENSSL_SYS_UNIX --# endif --# define OPENSSL_SYS_VMS --# if defined(__DECC) --# define OPENSSL_SYS_VMS_DECC --# elif defined(__DECCXX) --# define OPENSSL_SYS_VMS_DECC --# define OPENSSL_SYS_VMS_DECCXX --# else --# define OPENSSL_SYS_VMS_NODECC --# endif --# endif -- --/* -------------------------------- Unix ---------------------------------- */ --# ifdef OPENSSL_SYS_UNIX --# if defined(linux) || defined(__linux__) && !defined(OPENSSL_SYS_LINUX) --# define OPENSSL_SYS_LINUX --# endif --# if defined(_AIX) && !defined(OPENSSL_SYS_AIX) --# define OPENSSL_SYS_AIX --# endif --# endif -- --/* -------------------------------- VOS ----------------------------------- */ --# if defined(__VOS__) && !defined(OPENSSL_SYS_VOS) --# define OPENSSL_SYS_VOS --# ifdef __HPPA__ --# define OPENSSL_SYS_VOS_HPPA --# endif --# ifdef __IA32__ --# define OPENSSL_SYS_VOS_IA32 --# endif --# endif -- --/** -- * That's it for OS-specific stuff -- *****************************************************************************/ -- --/* Specials for I/O an exit */ --# ifdef OPENSSL_SYS_MSDOS --# define OPENSSL_UNISTD_IO --# define OPENSSL_DECLARE_EXIT extern void exit(int); --# else --# define OPENSSL_UNISTD_IO OPENSSL_UNISTD --# define OPENSSL_DECLARE_EXIT /* declared in unistd.h */ --# endif -- --/*- -- * OPENSSL_EXTERN is normally used to declare a symbol with possible extra -- * attributes to handle its presence in a shared library. -- * OPENSSL_EXPORT is used to define a symbol with extra possible attributes -- * to make it visible in a shared library. -- * Care needs to be taken when a header file is used both to declare and -- * define symbols. Basically, for any library that exports some global -- * variables, the following code must be present in the header file that -- * declares them, before OPENSSL_EXTERN is used: -- * -- * #ifdef SOME_BUILD_FLAG_MACRO -- * # undef OPENSSL_EXTERN -- * # define OPENSSL_EXTERN OPENSSL_EXPORT -- * #endif -- * -- * The default is to have OPENSSL_EXPORT and OPENSSL_EXTERN -- * have some generally sensible values. -- */ -- --# if defined(OPENSSL_SYS_WINDOWS) && defined(OPENSSL_OPT_WINDLL) --# define OPENSSL_EXPORT extern __declspec(dllexport) --# define OPENSSL_EXTERN extern __declspec(dllimport) --# else --# define OPENSSL_EXPORT extern --# define OPENSSL_EXTERN extern --# endif -- --/*- -- * Macros to allow global variables to be reached through function calls when -- * required (if a shared library version requires it, for example. -- * The way it's done allows definitions like this: -- * -- * // in foobar.c -- * OPENSSL_IMPLEMENT_GLOBAL(int,foobar,0) -- * // in foobar.h -- * OPENSSL_DECLARE_GLOBAL(int,foobar); -- * #define foobar OPENSSL_GLOBAL_REF(foobar) -- */ --# ifdef OPENSSL_EXPORT_VAR_AS_FUNCTION --# define OPENSSL_IMPLEMENT_GLOBAL(type,name,value) \ -- type *_shadow_##name(void) \ -- { static type _hide_##name=value; return &_hide_##name; } --# define OPENSSL_DECLARE_GLOBAL(type,name) type *_shadow_##name(void) --# define OPENSSL_GLOBAL_REF(name) (*(_shadow_##name())) --# else --# define OPENSSL_IMPLEMENT_GLOBAL(type,name,value) type _shadow_##name=value; --# define OPENSSL_DECLARE_GLOBAL(type,name) OPENSSL_EXPORT type _shadow_##name --# define OPENSSL_GLOBAL_REF(name) _shadow_##name --# endif -- --# ifdef _WIN32 --# ifdef _WIN64 --# define ossl_ssize_t __int64 --# define OSSL_SSIZE_MAX _I64_MAX --# else --# define ossl_ssize_t int --# define OSSL_SSIZE_MAX INT_MAX --# endif --# endif -- --# if defined(OPENSSL_SYS_UEFI) && !defined(ossl_ssize_t) --# define ossl_ssize_t INTN --# define OSSL_SSIZE_MAX MAX_INTN --# endif -- --# ifndef ossl_ssize_t --# define ossl_ssize_t ssize_t --# if defined(SSIZE_MAX) --# define OSSL_SSIZE_MAX SSIZE_MAX --# elif defined(_POSIX_SSIZE_MAX) --# define OSSL_SSIZE_MAX _POSIX_SSIZE_MAX --# else --# define OSSL_SSIZE_MAX ((ssize_t)(SIZE_MAX>>1)) --# endif --# endif -- --# ifdef DEBUG_UNUSED --# define __owur __attribute__((__warn_unused_result__)) --# else --# define __owur --# endif -- --/* Standard integer types */ --# if defined(OPENSSL_SYS_UEFI) --typedef INT8 int8_t; --typedef UINT8 uint8_t; --typedef INT16 int16_t; --typedef UINT16 uint16_t; --typedef INT32 int32_t; --typedef UINT32 uint32_t; --typedef INT64 int64_t; --typedef UINT64 uint64_t; --# elif (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \ -- defined(__osf__) || defined(__sgi) || defined(__hpux) || \ -- defined(OPENSSL_SYS_VMS) || defined (__OpenBSD__) --# include --# elif defined(_MSC_VER) && _MSC_VER<1600 --/* -- * minimally required typdefs for systems not supporting inttypes.h or -- * stdint.h: currently just older VC++ -- */ --typedef signed char int8_t; --typedef unsigned char uint8_t; --typedef short int16_t; --typedef unsigned short uint16_t; --typedef int int32_t; --typedef unsigned int uint32_t; --typedef __int64 int64_t; --typedef unsigned __int64 uint64_t; --# else --# include --# endif -- --/* ossl_inline: portable inline definition usable in public headers */ --# if !defined(inline) && !defined(__cplusplus) --# if defined(__STDC_VERSION__) && __STDC_VERSION__>=199901L -- /* just use inline */ --# define ossl_inline inline --# elif defined(__GNUC__) && __GNUC__>=2 --# define ossl_inline __inline__ --# elif defined(_MSC_VER) -- /* -- * Visual Studio: inline is available in C++ only, however -- * __inline is available for C, see -- * http://msdn.microsoft.com/en-us/library/z8y1yy88.aspx -- */ --# define ossl_inline __inline --# else --# define ossl_inline --# endif --# else --# define ossl_inline inline --# endif -- --# if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && \ -- !defined(__cplusplus) --# define ossl_noreturn _Noreturn --# elif defined(__GNUC__) && __GNUC__ >= 2 --# define ossl_noreturn __attribute__((noreturn)) --# else --# define ossl_noreturn --# endif -- --/* ossl_unused: portable unused attribute for use in public headers */ --# if defined(__GNUC__) --# define ossl_unused __attribute__((unused)) --# else --# define ossl_unused --# endif -- --#ifdef __cplusplus --} --#endif --#endif -diff --git a/uadk_tool/include/openssl/ebcdic.h b/uadk_tool/include/openssl/ebcdic.h -deleted file mode 100644 -index aa01285..0000000 ---- a/uadk_tool/include/openssl/ebcdic.h -+++ /dev/null -@@ -1,33 +0,0 @@ --/* -- * Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_EBCDIC_H --# define HEADER_EBCDIC_H -- --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --/* Avoid name clashes with other applications */ --# define os_toascii _openssl_os_toascii --# define os_toebcdic _openssl_os_toebcdic --# define ebcdic2ascii _openssl_ebcdic2ascii --# define ascii2ebcdic _openssl_ascii2ebcdic -- --extern const unsigned char os_toascii[256]; --extern const unsigned char os_toebcdic[256]; --void *ebcdic2ascii(void *dest, const void *srce, size_t count); --void *ascii2ebcdic(void *dest, const void *srce, size_t count); -- --#ifdef __cplusplus --} --#endif --#endif -diff --git a/uadk_tool/include/openssl/ec.h b/uadk_tool/include/openssl/ec.h -deleted file mode 100644 -index a9f77b2..0000000 ---- a/uadk_tool/include/openssl/ec.h -+++ /dev/null -@@ -1,1484 +0,0 @@ --/* -- * Copyright 2002-2020 The OpenSSL Project Authors. All Rights Reserved. -- * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_EC_H --# define HEADER_EC_H -- --# include -- --# ifndef OPENSSL_NO_EC --# include --# include --# if OPENSSL_API_COMPAT < 0x10100000L --# include --# endif --# include --# ifdef __cplusplus --extern "C" { --# endif -- --# ifndef OPENSSL_ECC_MAX_FIELD_BITS --# define OPENSSL_ECC_MAX_FIELD_BITS 661 --# endif -- --/** Enum for the point conversion form as defined in X9.62 (ECDSA) -- * for the encoding of a elliptic curve point (x,y) */ --typedef enum { -- /** the point is encoded as z||x, where the octet z specifies -- * which solution of the quadratic equation y is */ -- POINT_CONVERSION_COMPRESSED = 2, -- /** the point is encoded as z||x||y, where z is the octet 0x04 */ -- POINT_CONVERSION_UNCOMPRESSED = 4, -- /** the point is encoded as z||x||y, where the octet z specifies -- * which solution of the quadratic equation y is */ -- POINT_CONVERSION_HYBRID = 6 --} point_conversion_form_t; -- --typedef struct ec_method_st EC_METHOD; --typedef struct ec_group_st EC_GROUP; --typedef struct ec_point_st EC_POINT; --typedef struct ecpk_parameters_st ECPKPARAMETERS; --typedef struct ec_parameters_st ECPARAMETERS; -- --/********************************************************************/ --/* EC_METHODs for curves over GF(p) */ --/********************************************************************/ -- --/** Returns the basic GFp ec methods which provides the basis for the -- * optimized methods. -- * \return EC_METHOD object -- */ --const EC_METHOD *EC_GFp_simple_method(void); -- --/** Returns GFp methods using montgomery multiplication. -- * \return EC_METHOD object -- */ --const EC_METHOD *EC_GFp_mont_method(void); -- --/** Returns GFp methods using optimized methods for NIST recommended curves -- * \return EC_METHOD object -- */ --const EC_METHOD *EC_GFp_nist_method(void); -- --# ifndef OPENSSL_NO_EC_NISTP_64_GCC_128 --/** Returns 64-bit optimized methods for nistp224 -- * \return EC_METHOD object -- */ --const EC_METHOD *EC_GFp_nistp224_method(void); -- --/** Returns 64-bit optimized methods for nistp256 -- * \return EC_METHOD object -- */ --const EC_METHOD *EC_GFp_nistp256_method(void); -- --/** Returns 64-bit optimized methods for nistp521 -- * \return EC_METHOD object -- */ --const EC_METHOD *EC_GFp_nistp521_method(void); --# endif -- --# ifndef OPENSSL_NO_EC2M --/********************************************************************/ --/* EC_METHOD for curves over GF(2^m) */ --/********************************************************************/ -- --/** Returns the basic GF2m ec method -- * \return EC_METHOD object -- */ --const EC_METHOD *EC_GF2m_simple_method(void); -- --# endif -- --/********************************************************************/ --/* EC_GROUP functions */ --/********************************************************************/ -- --/** Creates a new EC_GROUP object -- * \param meth EC_METHOD to use -- * \return newly created EC_GROUP object or NULL in case of an error. -- */ --EC_GROUP *EC_GROUP_new(const EC_METHOD *meth); -- --/** Frees a EC_GROUP object -- * \param group EC_GROUP object to be freed. -- */ --void EC_GROUP_free(EC_GROUP *group); -- --/** Clears and frees a EC_GROUP object -- * \param group EC_GROUP object to be cleared and freed. -- */ --void EC_GROUP_clear_free(EC_GROUP *group); -- --/** Copies EC_GROUP objects. Note: both EC_GROUPs must use the same EC_METHOD. -- * \param dst destination EC_GROUP object -- * \param src source EC_GROUP object -- * \return 1 on success and 0 if an error occurred. -- */ --int EC_GROUP_copy(EC_GROUP *dst, const EC_GROUP *src); -- --/** Creates a new EC_GROUP object and copies the copies the content -- * form src to the newly created EC_KEY object -- * \param src source EC_GROUP object -- * \return newly created EC_GROUP object or NULL in case of an error. -- */ --EC_GROUP *EC_GROUP_dup(const EC_GROUP *src); -- --/** Returns the EC_METHOD of the EC_GROUP object. -- * \param group EC_GROUP object -- * \return EC_METHOD used in this EC_GROUP object. -- */ --const EC_METHOD *EC_GROUP_method_of(const EC_GROUP *group); -- --/** Returns the field type of the EC_METHOD. -- * \param meth EC_METHOD object -- * \return NID of the underlying field type OID. -- */ --int EC_METHOD_get_field_type(const EC_METHOD *meth); -- --/** Sets the generator and its order/cofactor of a EC_GROUP object. -- * \param group EC_GROUP object -- * \param generator EC_POINT object with the generator. -- * \param order the order of the group generated by the generator. -- * \param cofactor the index of the sub-group generated by the generator -- * in the group of all points on the elliptic curve. -- * \return 1 on success and 0 if an error occurred -- */ --int EC_GROUP_set_generator(EC_GROUP *group, const EC_POINT *generator, -- const BIGNUM *order, const BIGNUM *cofactor); -- --/** Returns the generator of a EC_GROUP object. -- * \param group EC_GROUP object -- * \return the currently used generator (possibly NULL). -- */ --const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group); -- --/** Returns the montgomery data for order(Generator) -- * \param group EC_GROUP object -- * \return the currently used montgomery data (possibly NULL). --*/ --BN_MONT_CTX *EC_GROUP_get_mont_data(const EC_GROUP *group); -- --/** Gets the order of a EC_GROUP -- * \param group EC_GROUP object -- * \param order BIGNUM to which the order is copied -- * \param ctx unused -- * \return 1 on success and 0 if an error occurred -- */ --int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx); -- --/** Gets the order of an EC_GROUP -- * \param group EC_GROUP object -- * \return the group order -- */ --const BIGNUM *EC_GROUP_get0_order(const EC_GROUP *group); -- --/** Gets the number of bits of the order of an EC_GROUP -- * \param group EC_GROUP object -- * \return number of bits of group order. -- */ --int EC_GROUP_order_bits(const EC_GROUP *group); -- --/** Gets the cofactor of a EC_GROUP -- * \param group EC_GROUP object -- * \param cofactor BIGNUM to which the cofactor is copied -- * \param ctx unused -- * \return 1 on success and 0 if an error occurred -- */ --int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor, -- BN_CTX *ctx); -- --/** Gets the cofactor of an EC_GROUP -- * \param group EC_GROUP object -- * \return the group cofactor -- */ --const BIGNUM *EC_GROUP_get0_cofactor(const EC_GROUP *group); -- --/** Sets the name of a EC_GROUP object -- * \param group EC_GROUP object -- * \param nid NID of the curve name OID -- */ --void EC_GROUP_set_curve_name(EC_GROUP *group, int nid); -- --/** Returns the curve name of a EC_GROUP object -- * \param group EC_GROUP object -- * \return NID of the curve name OID or 0 if not set. -- */ --int EC_GROUP_get_curve_name(const EC_GROUP *group); -- --void EC_GROUP_set_asn1_flag(EC_GROUP *group, int flag); --int EC_GROUP_get_asn1_flag(const EC_GROUP *group); -- --void EC_GROUP_set_point_conversion_form(EC_GROUP *group, -- point_conversion_form_t form); --point_conversion_form_t EC_GROUP_get_point_conversion_form(const EC_GROUP *); -- --unsigned char *EC_GROUP_get0_seed(const EC_GROUP *x); --size_t EC_GROUP_get_seed_len(const EC_GROUP *); --size_t EC_GROUP_set_seed(EC_GROUP *, const unsigned char *, size_t len); -- --/** Sets the parameters of a ec curve defined by y^2 = x^3 + a*x + b (for GFp) -- * or y^2 + x*y = x^3 + a*x^2 + b (for GF2m) -- * \param group EC_GROUP object -- * \param p BIGNUM with the prime number (GFp) or the polynomial -- * defining the underlying field (GF2m) -- * \param a BIGNUM with parameter a of the equation -- * \param b BIGNUM with parameter b of the equation -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --int EC_GROUP_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, -- const BIGNUM *b, BN_CTX *ctx); -- --/** Gets the parameters of the ec curve defined by y^2 = x^3 + a*x + b (for GFp) -- * or y^2 + x*y = x^3 + a*x^2 + b (for GF2m) -- * \param group EC_GROUP object -- * \param p BIGNUM with the prime number (GFp) or the polynomial -- * defining the underlying field (GF2m) -- * \param a BIGNUM for parameter a of the equation -- * \param b BIGNUM for parameter b of the equation -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --int EC_GROUP_get_curve(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, -- BN_CTX *ctx); -- --/** Sets the parameters of an ec curve. Synonym for EC_GROUP_set_curve -- * \param group EC_GROUP object -- * \param p BIGNUM with the prime number (GFp) or the polynomial -- * defining the underlying field (GF2m) -- * \param a BIGNUM with parameter a of the equation -- * \param b BIGNUM with parameter b of the equation -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --DEPRECATEDIN_1_2_0(int EC_GROUP_set_curve_GFp(EC_GROUP *group, const BIGNUM *p, -- const BIGNUM *a, const BIGNUM *b, -- BN_CTX *ctx)) -- --/** Gets the parameters of an ec curve. Synonym for EC_GROUP_get_curve -- * \param group EC_GROUP object -- * \param p BIGNUM with the prime number (GFp) or the polynomial -- * defining the underlying field (GF2m) -- * \param a BIGNUM for parameter a of the equation -- * \param b BIGNUM for parameter b of the equation -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --DEPRECATEDIN_1_2_0(int EC_GROUP_get_curve_GFp(const EC_GROUP *group, BIGNUM *p, -- BIGNUM *a, BIGNUM *b, -- BN_CTX *ctx)) -- --# ifndef OPENSSL_NO_EC2M --/** Sets the parameter of an ec curve. Synonym for EC_GROUP_set_curve -- * \param group EC_GROUP object -- * \param p BIGNUM with the prime number (GFp) or the polynomial -- * defining the underlying field (GF2m) -- * \param a BIGNUM with parameter a of the equation -- * \param b BIGNUM with parameter b of the equation -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --DEPRECATEDIN_1_2_0(int EC_GROUP_set_curve_GF2m(EC_GROUP *group, const BIGNUM *p, -- const BIGNUM *a, const BIGNUM *b, -- BN_CTX *ctx)) -- --/** Gets the parameters of an ec curve. Synonym for EC_GROUP_get_curve -- * \param group EC_GROUP object -- * \param p BIGNUM with the prime number (GFp) or the polynomial -- * defining the underlying field (GF2m) -- * \param a BIGNUM for parameter a of the equation -- * \param b BIGNUM for parameter b of the equation -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --DEPRECATEDIN_1_2_0(int EC_GROUP_get_curve_GF2m(const EC_GROUP *group, BIGNUM *p, -- BIGNUM *a, BIGNUM *b, -- BN_CTX *ctx)) --# endif --/** Returns the number of bits needed to represent a field element -- * \param group EC_GROUP object -- * \return number of bits needed to represent a field element -- */ --int EC_GROUP_get_degree(const EC_GROUP *group); -- --/** Checks whether the parameter in the EC_GROUP define a valid ec group -- * \param group EC_GROUP object -- * \param ctx BN_CTX object (optional) -- * \return 1 if group is a valid ec group and 0 otherwise -- */ --int EC_GROUP_check(const EC_GROUP *group, BN_CTX *ctx); -- --/** Checks whether the discriminant of the elliptic curve is zero or not -- * \param group EC_GROUP object -- * \param ctx BN_CTX object (optional) -- * \return 1 if the discriminant is not zero and 0 otherwise -- */ --int EC_GROUP_check_discriminant(const EC_GROUP *group, BN_CTX *ctx); -- --/** Compares two EC_GROUP objects -- * \param a first EC_GROUP object -- * \param b second EC_GROUP object -- * \param ctx BN_CTX object (optional) -- * \return 0 if the groups are equal, 1 if not, or -1 on error -- */ --int EC_GROUP_cmp(const EC_GROUP *a, const EC_GROUP *b, BN_CTX *ctx); -- --/* -- * EC_GROUP_new_GF*() calls EC_GROUP_new() and EC_GROUP_set_GF*() after -- * choosing an appropriate EC_METHOD -- */ -- --/** Creates a new EC_GROUP object with the specified parameters defined -- * over GFp (defined by the equation y^2 = x^3 + a*x + b) -- * \param p BIGNUM with the prime number -- * \param a BIGNUM with the parameter a of the equation -- * \param b BIGNUM with the parameter b of the equation -- * \param ctx BN_CTX object (optional) -- * \return newly created EC_GROUP object with the specified parameters -- */ --EC_GROUP *EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a, -- const BIGNUM *b, BN_CTX *ctx); --# ifndef OPENSSL_NO_EC2M --/** Creates a new EC_GROUP object with the specified parameters defined -- * over GF2m (defined by the equation y^2 + x*y = x^3 + a*x^2 + b) -- * \param p BIGNUM with the polynomial defining the underlying field -- * \param a BIGNUM with the parameter a of the equation -- * \param b BIGNUM with the parameter b of the equation -- * \param ctx BN_CTX object (optional) -- * \return newly created EC_GROUP object with the specified parameters -- */ --EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, -- const BIGNUM *b, BN_CTX *ctx); --# endif -- --/** Creates a EC_GROUP object with a curve specified by a NID -- * \param nid NID of the OID of the curve name -- * \return newly created EC_GROUP object with specified curve or NULL -- * if an error occurred -- */ --EC_GROUP *EC_GROUP_new_by_curve_name(int nid); -- --/** Creates a new EC_GROUP object from an ECPARAMETERS object -- * \param params pointer to the ECPARAMETERS object -- * \return newly created EC_GROUP object with specified curve or NULL -- * if an error occurred -- */ --EC_GROUP *EC_GROUP_new_from_ecparameters(const ECPARAMETERS *params); -- --/** Creates an ECPARAMETERS object for the given EC_GROUP object. -- * \param group pointer to the EC_GROUP object -- * \param params pointer to an existing ECPARAMETERS object or NULL -- * \return pointer to the new ECPARAMETERS object or NULL -- * if an error occurred. -- */ --ECPARAMETERS *EC_GROUP_get_ecparameters(const EC_GROUP *group, -- ECPARAMETERS *params); -- --/** Creates a new EC_GROUP object from an ECPKPARAMETERS object -- * \param params pointer to an existing ECPKPARAMETERS object, or NULL -- * \return newly created EC_GROUP object with specified curve, or NULL -- * if an error occurred -- */ --EC_GROUP *EC_GROUP_new_from_ecpkparameters(const ECPKPARAMETERS *params); -- --/** Creates an ECPKPARAMETERS object for the given EC_GROUP object. -- * \param group pointer to the EC_GROUP object -- * \param params pointer to an existing ECPKPARAMETERS object or NULL -- * \return pointer to the new ECPKPARAMETERS object or NULL -- * if an error occurred. -- */ --ECPKPARAMETERS *EC_GROUP_get_ecpkparameters(const EC_GROUP *group, -- ECPKPARAMETERS *params); -- --/********************************************************************/ --/* handling of internal curves */ --/********************************************************************/ -- --typedef struct { -- int nid; -- const char *comment; --} EC_builtin_curve; -- --/* -- * EC_builtin_curves(EC_builtin_curve *r, size_t size) returns number of all -- * available curves or zero if a error occurred. In case r is not zero, -- * nitems EC_builtin_curve structures are filled with the data of the first -- * nitems internal groups -- */ --size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems); -- --const char *EC_curve_nid2nist(int nid); --int EC_curve_nist2nid(const char *name); -- --/********************************************************************/ --/* EC_POINT functions */ --/********************************************************************/ -- --/** Creates a new EC_POINT object for the specified EC_GROUP -- * \param group EC_GROUP the underlying EC_GROUP object -- * \return newly created EC_POINT object or NULL if an error occurred -- */ --EC_POINT *EC_POINT_new(const EC_GROUP *group); -- --/** Frees a EC_POINT object -- * \param point EC_POINT object to be freed -- */ --void EC_POINT_free(EC_POINT *point); -- --/** Clears and frees a EC_POINT object -- * \param point EC_POINT object to be cleared and freed -- */ --void EC_POINT_clear_free(EC_POINT *point); -- --/** Copies EC_POINT object -- * \param dst destination EC_POINT object -- * \param src source EC_POINT object -- * \return 1 on success and 0 if an error occurred -- */ --int EC_POINT_copy(EC_POINT *dst, const EC_POINT *src); -- --/** Creates a new EC_POINT object and copies the content of the supplied -- * EC_POINT -- * \param src source EC_POINT object -- * \param group underlying the EC_GROUP object -- * \return newly created EC_POINT object or NULL if an error occurred -- */ --EC_POINT *EC_POINT_dup(const EC_POINT *src, const EC_GROUP *group); -- --/** Returns the EC_METHOD used in EC_POINT object -- * \param point EC_POINT object -- * \return the EC_METHOD used -- */ --const EC_METHOD *EC_POINT_method_of(const EC_POINT *point); -- --/** Sets a point to infinity (neutral element) -- * \param group underlying EC_GROUP object -- * \param point EC_POINT to set to infinity -- * \return 1 on success and 0 if an error occurred -- */ --int EC_POINT_set_to_infinity(const EC_GROUP *group, EC_POINT *point); -- --/** Sets the jacobian projective coordinates of a EC_POINT over GFp -- * \param group underlying EC_GROUP object -- * \param p EC_POINT object -- * \param x BIGNUM with the x-coordinate -- * \param y BIGNUM with the y-coordinate -- * \param z BIGNUM with the z-coordinate -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --int EC_POINT_set_Jprojective_coordinates_GFp(const EC_GROUP *group, -- EC_POINT *p, const BIGNUM *x, -- const BIGNUM *y, const BIGNUM *z, -- BN_CTX *ctx); -- --/** Gets the jacobian projective coordinates of a EC_POINT over GFp -- * \param group underlying EC_GROUP object -- * \param p EC_POINT object -- * \param x BIGNUM for the x-coordinate -- * \param y BIGNUM for the y-coordinate -- * \param z BIGNUM for the z-coordinate -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --int EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *group, -- const EC_POINT *p, BIGNUM *x, -- BIGNUM *y, BIGNUM *z, -- BN_CTX *ctx); -- --/** Sets the affine coordinates of an EC_POINT -- * \param group underlying EC_GROUP object -- * \param p EC_POINT object -- * \param x BIGNUM with the x-coordinate -- * \param y BIGNUM with the y-coordinate -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --int EC_POINT_set_affine_coordinates(const EC_GROUP *group, EC_POINT *p, -- const BIGNUM *x, const BIGNUM *y, -- BN_CTX *ctx); -- --/** Gets the affine coordinates of an EC_POINT. -- * \param group underlying EC_GROUP object -- * \param p EC_POINT object -- * \param x BIGNUM for the x-coordinate -- * \param y BIGNUM for the y-coordinate -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --int EC_POINT_get_affine_coordinates(const EC_GROUP *group, const EC_POINT *p, -- BIGNUM *x, BIGNUM *y, BN_CTX *ctx); -- --/** Sets the affine coordinates of an EC_POINT. A synonym of -- * EC_POINT_set_affine_coordinates -- * \param group underlying EC_GROUP object -- * \param p EC_POINT object -- * \param x BIGNUM with the x-coordinate -- * \param y BIGNUM with the y-coordinate -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --DEPRECATEDIN_1_2_0(int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *group, -- EC_POINT *p, -- const BIGNUM *x, -- const BIGNUM *y, -- BN_CTX *ctx)) -- --/** Gets the affine coordinates of an EC_POINT. A synonym of -- * EC_POINT_get_affine_coordinates -- * \param group underlying EC_GROUP object -- * \param p EC_POINT object -- * \param x BIGNUM for the x-coordinate -- * \param y BIGNUM for the y-coordinate -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --DEPRECATEDIN_1_2_0(int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group, -- const EC_POINT *p, -- BIGNUM *x, -- BIGNUM *y, -- BN_CTX *ctx)) -- --/** Sets the x9.62 compressed coordinates of a EC_POINT -- * \param group underlying EC_GROUP object -- * \param p EC_POINT object -- * \param x BIGNUM with x-coordinate -- * \param y_bit integer with the y-Bit (either 0 or 1) -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --int EC_POINT_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *p, -- const BIGNUM *x, int y_bit, -- BN_CTX *ctx); -- --/** Sets the x9.62 compressed coordinates of a EC_POINT. A synonym of -- * EC_POINT_set_compressed_coordinates -- * \param group underlying EC_GROUP object -- * \param p EC_POINT object -- * \param x BIGNUM with x-coordinate -- * \param y_bit integer with the y-Bit (either 0 or 1) -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --DEPRECATEDIN_1_2_0(int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, -- EC_POINT *p, -- const BIGNUM *x, -- int y_bit, -- BN_CTX *ctx)) --# ifndef OPENSSL_NO_EC2M --/** Sets the affine coordinates of an EC_POINT. A synonym of -- * EC_POINT_set_affine_coordinates -- * \param group underlying EC_GROUP object -- * \param p EC_POINT object -- * \param x BIGNUM with the x-coordinate -- * \param y BIGNUM with the y-coordinate -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --DEPRECATEDIN_1_2_0(int EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *group, -- EC_POINT *p, -- const BIGNUM *x, -- const BIGNUM *y, -- BN_CTX *ctx)) -- --/** Gets the affine coordinates of an EC_POINT. A synonym of -- * EC_POINT_get_affine_coordinates -- * \param group underlying EC_GROUP object -- * \param p EC_POINT object -- * \param x BIGNUM for the x-coordinate -- * \param y BIGNUM for the y-coordinate -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --DEPRECATEDIN_1_2_0(int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *group, -- const EC_POINT *p, -- BIGNUM *x, -- BIGNUM *y, -- BN_CTX *ctx)) -- --/** Sets the x9.62 compressed coordinates of a EC_POINT. A synonym of -- * EC_POINT_set_compressed_coordinates -- * \param group underlying EC_GROUP object -- * \param p EC_POINT object -- * \param x BIGNUM with x-coordinate -- * \param y_bit integer with the y-Bit (either 0 or 1) -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --DEPRECATEDIN_1_2_0(int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *group, -- EC_POINT *p, -- const BIGNUM *x, -- int y_bit, -- BN_CTX *ctx)) --# endif --/** Encodes a EC_POINT object to a octet string -- * \param group underlying EC_GROUP object -- * \param p EC_POINT object -- * \param form point conversion form -- * \param buf memory buffer for the result. If NULL the function returns -- * required buffer size. -- * \param len length of the memory buffer -- * \param ctx BN_CTX object (optional) -- * \return the length of the encoded octet string or 0 if an error occurred -- */ --size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *p, -- point_conversion_form_t form, -- unsigned char *buf, size_t len, BN_CTX *ctx); -- --/** Decodes a EC_POINT from a octet string -- * \param group underlying EC_GROUP object -- * \param p EC_POINT object -- * \param buf memory buffer with the encoded ec point -- * \param len length of the encoded ec point -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --int EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *p, -- const unsigned char *buf, size_t len, BN_CTX *ctx); -- --/** Encodes an EC_POINT object to an allocated octet string -- * \param group underlying EC_GROUP object -- * \param point EC_POINT object -- * \param form point conversion form -- * \param pbuf returns pointer to allocated buffer -- * \param ctx BN_CTX object (optional) -- * \return the length of the encoded octet string or 0 if an error occurred -- */ --size_t EC_POINT_point2buf(const EC_GROUP *group, const EC_POINT *point, -- point_conversion_form_t form, -- unsigned char **pbuf, BN_CTX *ctx); -- --/* other interfaces to point2oct/oct2point: */ --BIGNUM *EC_POINT_point2bn(const EC_GROUP *, const EC_POINT *, -- point_conversion_form_t form, BIGNUM *, BN_CTX *); --EC_POINT *EC_POINT_bn2point(const EC_GROUP *, const BIGNUM *, -- EC_POINT *, BN_CTX *); --char *EC_POINT_point2hex(const EC_GROUP *, const EC_POINT *, -- point_conversion_form_t form, BN_CTX *); --EC_POINT *EC_POINT_hex2point(const EC_GROUP *, const char *, -- EC_POINT *, BN_CTX *); -- --/********************************************************************/ --/* functions for doing EC_POINT arithmetic */ --/********************************************************************/ -- --/** Computes the sum of two EC_POINT -- * \param group underlying EC_GROUP object -- * \param r EC_POINT object for the result (r = a + b) -- * \param a EC_POINT object with the first summand -- * \param b EC_POINT object with the second summand -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --int EC_POINT_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, -- const EC_POINT *b, BN_CTX *ctx); -- --/** Computes the double of a EC_POINT -- * \param group underlying EC_GROUP object -- * \param r EC_POINT object for the result (r = 2 * a) -- * \param a EC_POINT object -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --int EC_POINT_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, -- BN_CTX *ctx); -- --/** Computes the inverse of a EC_POINT -- * \param group underlying EC_GROUP object -- * \param a EC_POINT object to be inverted (it's used for the result as well) -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --int EC_POINT_invert(const EC_GROUP *group, EC_POINT *a, BN_CTX *ctx); -- --/** Checks whether the point is the neutral element of the group -- * \param group the underlying EC_GROUP object -- * \param p EC_POINT object -- * \return 1 if the point is the neutral element and 0 otherwise -- */ --int EC_POINT_is_at_infinity(const EC_GROUP *group, const EC_POINT *p); -- --/** Checks whether the point is on the curve -- * \param group underlying EC_GROUP object -- * \param point EC_POINT object to check -- * \param ctx BN_CTX object (optional) -- * \return 1 if the point is on the curve, 0 if not, or -1 on error -- */ --int EC_POINT_is_on_curve(const EC_GROUP *group, const EC_POINT *point, -- BN_CTX *ctx); -- --/** Compares two EC_POINTs -- * \param group underlying EC_GROUP object -- * \param a first EC_POINT object -- * \param b second EC_POINT object -- * \param ctx BN_CTX object (optional) -- * \return 1 if the points are not equal, 0 if they are, or -1 on error -- */ --int EC_POINT_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, -- BN_CTX *ctx); -- --int EC_POINT_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx); --int EC_POINTs_make_affine(const EC_GROUP *group, size_t num, -- EC_POINT *points[], BN_CTX *ctx); -- --/** Computes r = generator * n + sum_{i=0}^{num-1} p[i] * m[i] -- * \param group underlying EC_GROUP object -- * \param r EC_POINT object for the result -- * \param n BIGNUM with the multiplier for the group generator (optional) -- * \param num number further summands -- * \param p array of size num of EC_POINT objects -- * \param m array of size num of BIGNUM objects -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --int EC_POINTs_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n, -- size_t num, const EC_POINT *p[], const BIGNUM *m[], -- BN_CTX *ctx); -- --/** Computes r = generator * n + q * m -- * \param group underlying EC_GROUP object -- * \param r EC_POINT object for the result -- * \param n BIGNUM with the multiplier for the group generator (optional) -- * \param q EC_POINT object with the first factor of the second summand -- * \param m BIGNUM with the second factor of the second summand -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --int EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n, -- const EC_POINT *q, const BIGNUM *m, BN_CTX *ctx); -- --/** Stores multiples of generator for faster point multiplication -- * \param group EC_GROUP object -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ --int EC_GROUP_precompute_mult(EC_GROUP *group, BN_CTX *ctx); -- --/** Reports whether a precomputation has been done -- * \param group EC_GROUP object -- * \return 1 if a pre-computation has been done and 0 otherwise -- */ --int EC_GROUP_have_precompute_mult(const EC_GROUP *group); -- --/********************************************************************/ --/* ASN1 stuff */ --/********************************************************************/ -- --DECLARE_ASN1_ITEM(ECPKPARAMETERS) --DECLARE_ASN1_ALLOC_FUNCTIONS(ECPKPARAMETERS) --DECLARE_ASN1_ITEM(ECPARAMETERS) --DECLARE_ASN1_ALLOC_FUNCTIONS(ECPARAMETERS) -- --/* -- * EC_GROUP_get_basis_type() returns the NID of the basis type used to -- * represent the field elements -- */ --int EC_GROUP_get_basis_type(const EC_GROUP *); --# ifndef OPENSSL_NO_EC2M --int EC_GROUP_get_trinomial_basis(const EC_GROUP *, unsigned int *k); --int EC_GROUP_get_pentanomial_basis(const EC_GROUP *, unsigned int *k1, -- unsigned int *k2, unsigned int *k3); --# endif -- --# define OPENSSL_EC_EXPLICIT_CURVE 0x000 --# define OPENSSL_EC_NAMED_CURVE 0x001 -- --EC_GROUP *d2i_ECPKParameters(EC_GROUP **, const unsigned char **in, long len); --int i2d_ECPKParameters(const EC_GROUP *, unsigned char **out); -- --# define d2i_ECPKParameters_bio(bp,x) \ -- ASN1_d2i_bio_of(EC_GROUP, NULL, d2i_ECPKParameters, bp, x) --# define i2d_ECPKParameters_bio(bp,x) \ -- ASN1_i2d_bio_of_const(EC_GROUP, i2d_ECPKParameters, bp, x) --# define d2i_ECPKParameters_fp(fp,x) \ -- (EC_GROUP *)ASN1_d2i_fp(NULL, (d2i_of_void *)d2i_ECPKParameters, (fp), \ -- (void **)(x)) --# define i2d_ECPKParameters_fp(fp,x) \ -- ASN1_i2d_fp((i2d_of_void *)i2d_ECPKParameters, (fp), (void *)(x)) -- --int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off); --# ifndef OPENSSL_NO_STDIO --int ECPKParameters_print_fp(FILE *fp, const EC_GROUP *x, int off); --# endif -- --/********************************************************************/ --/* EC_KEY functions */ --/********************************************************************/ -- --/* some values for the encoding_flag */ --# define EC_PKEY_NO_PARAMETERS 0x001 --# define EC_PKEY_NO_PUBKEY 0x002 -- --/* some values for the flags field */ --# define EC_FLAG_NON_FIPS_ALLOW 0x1 --# define EC_FLAG_FIPS_CHECKED 0x2 --# define EC_FLAG_COFACTOR_ECDH 0x1000 -- --/** Creates a new EC_KEY object. -- * \return EC_KEY object or NULL if an error occurred. -- */ --EC_KEY *EC_KEY_new(void); -- --int EC_KEY_get_flags(const EC_KEY *key); -- --void EC_KEY_set_flags(EC_KEY *key, int flags); -- --void EC_KEY_clear_flags(EC_KEY *key, int flags); -- --int EC_KEY_decoded_from_explicit_params(const EC_KEY *key); -- --/** Creates a new EC_KEY object using a named curve as underlying -- * EC_GROUP object. -- * \param nid NID of the named curve. -- * \return EC_KEY object or NULL if an error occurred. -- */ --EC_KEY *EC_KEY_new_by_curve_name(int nid); -- --/** Frees a EC_KEY object. -- * \param key EC_KEY object to be freed. -- */ --void EC_KEY_free(EC_KEY *key); -- --/** Copies a EC_KEY object. -- * \param dst destination EC_KEY object -- * \param src src EC_KEY object -- * \return dst or NULL if an error occurred. -- */ --EC_KEY *EC_KEY_copy(EC_KEY *dst, const EC_KEY *src); -- --/** Creates a new EC_KEY object and copies the content from src to it. -- * \param src the source EC_KEY object -- * \return newly created EC_KEY object or NULL if an error occurred. -- */ --EC_KEY *EC_KEY_dup(const EC_KEY *src); -- --/** Increases the internal reference count of a EC_KEY object. -- * \param key EC_KEY object -- * \return 1 on success and 0 if an error occurred. -- */ --int EC_KEY_up_ref(EC_KEY *key); -- --/** Returns the ENGINE object of a EC_KEY object -- * \param eckey EC_KEY object -- * \return the ENGINE object (possibly NULL). -- */ --ENGINE *EC_KEY_get0_engine(const EC_KEY *eckey); -- --/** Returns the EC_GROUP object of a EC_KEY object -- * \param key EC_KEY object -- * \return the EC_GROUP object (possibly NULL). -- */ --const EC_GROUP *EC_KEY_get0_group(const EC_KEY *key); -- --/** Sets the EC_GROUP of a EC_KEY object. -- * \param key EC_KEY object -- * \param group EC_GROUP to use in the EC_KEY object (note: the EC_KEY -- * object will use an own copy of the EC_GROUP). -- * \return 1 on success and 0 if an error occurred. -- */ --int EC_KEY_set_group(EC_KEY *key, const EC_GROUP *group); -- --/** Returns the private key of a EC_KEY object. -- * \param key EC_KEY object -- * \return a BIGNUM with the private key (possibly NULL). -- */ --const BIGNUM *EC_KEY_get0_private_key(const EC_KEY *key); -- --/** Sets the private key of a EC_KEY object. -- * \param key EC_KEY object -- * \param prv BIGNUM with the private key (note: the EC_KEY object -- * will use an own copy of the BIGNUM). -- * \return 1 on success and 0 if an error occurred. -- */ --int EC_KEY_set_private_key(EC_KEY *key, const BIGNUM *prv); -- --/** Returns the public key of a EC_KEY object. -- * \param key the EC_KEY object -- * \return a EC_POINT object with the public key (possibly NULL) -- */ --const EC_POINT *EC_KEY_get0_public_key(const EC_KEY *key); -- --/** Sets the public key of a EC_KEY object. -- * \param key EC_KEY object -- * \param pub EC_POINT object with the public key (note: the EC_KEY object -- * will use an own copy of the EC_POINT object). -- * \return 1 on success and 0 if an error occurred. -- */ --int EC_KEY_set_public_key(EC_KEY *key, const EC_POINT *pub); -- --unsigned EC_KEY_get_enc_flags(const EC_KEY *key); --void EC_KEY_set_enc_flags(EC_KEY *eckey, unsigned int flags); --point_conversion_form_t EC_KEY_get_conv_form(const EC_KEY *key); --void EC_KEY_set_conv_form(EC_KEY *eckey, point_conversion_form_t cform); -- --#define EC_KEY_get_ex_new_index(l, p, newf, dupf, freef) \ -- CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_EC_KEY, l, p, newf, dupf, freef) --int EC_KEY_set_ex_data(EC_KEY *key, int idx, void *arg); --void *EC_KEY_get_ex_data(const EC_KEY *key, int idx); -- --/* wrapper functions for the underlying EC_GROUP object */ --void EC_KEY_set_asn1_flag(EC_KEY *eckey, int asn1_flag); -- --/** Creates a table of pre-computed multiples of the generator to -- * accelerate further EC_KEY operations. -- * \param key EC_KEY object -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred. -- */ --int EC_KEY_precompute_mult(EC_KEY *key, BN_CTX *ctx); -- --/** Creates a new ec private (and optional a new public) key. -- * \param key EC_KEY object -- * \return 1 on success and 0 if an error occurred. -- */ --int EC_KEY_generate_key(EC_KEY *key); -- --/** Verifies that a private and/or public key is valid. -- * \param key the EC_KEY object -- * \return 1 on success and 0 otherwise. -- */ --int EC_KEY_check_key(const EC_KEY *key); -- --/** Indicates if an EC_KEY can be used for signing. -- * \param eckey the EC_KEY object -- * \return 1 if can can sign and 0 otherwise. -- */ --int EC_KEY_can_sign(const EC_KEY *eckey); -- --/** Sets a public key from affine coordinates performing -- * necessary NIST PKV tests. -- * \param key the EC_KEY object -- * \param x public key x coordinate -- * \param y public key y coordinate -- * \return 1 on success and 0 otherwise. -- */ --int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, BIGNUM *x, -- BIGNUM *y); -- --/** Encodes an EC_KEY public key to an allocated octet string -- * \param key key to encode -- * \param form point conversion form -- * \param pbuf returns pointer to allocated buffer -- * \param ctx BN_CTX object (optional) -- * \return the length of the encoded octet string or 0 if an error occurred -- */ --size_t EC_KEY_key2buf(const EC_KEY *key, point_conversion_form_t form, -- unsigned char **pbuf, BN_CTX *ctx); -- --/** Decodes a EC_KEY public key from a octet string -- * \param key key to decode -- * \param buf memory buffer with the encoded ec point -- * \param len length of the encoded ec point -- * \param ctx BN_CTX object (optional) -- * \return 1 on success and 0 if an error occurred -- */ -- --int EC_KEY_oct2key(EC_KEY *key, const unsigned char *buf, size_t len, -- BN_CTX *ctx); -- --/** Decodes an EC_KEY private key from an octet string -- * \param key key to decode -- * \param buf memory buffer with the encoded private key -- * \param len length of the encoded key -- * \return 1 on success and 0 if an error occurred -- */ -- --int EC_KEY_oct2priv(EC_KEY *key, const unsigned char *buf, size_t len); -- --/** Encodes a EC_KEY private key to an octet string -- * \param key key to encode -- * \param buf memory buffer for the result. If NULL the function returns -- * required buffer size. -- * \param len length of the memory buffer -- * \return the length of the encoded octet string or 0 if an error occurred -- */ -- --size_t EC_KEY_priv2oct(const EC_KEY *key, unsigned char *buf, size_t len); -- --/** Encodes an EC_KEY private key to an allocated octet string -- * \param eckey key to encode -- * \param pbuf returns pointer to allocated buffer -- * \return the length of the encoded octet string or 0 if an error occurred -- */ --size_t EC_KEY_priv2buf(const EC_KEY *eckey, unsigned char **pbuf); -- --/********************************************************************/ --/* de- and encoding functions for SEC1 ECPrivateKey */ --/********************************************************************/ -- --/** Decodes a private key from a memory buffer. -- * \param key a pointer to a EC_KEY object which should be used (or NULL) -- * \param in pointer to memory with the DER encoded private key -- * \param len length of the DER encoded private key -- * \return the decoded private key or NULL if an error occurred. -- */ --EC_KEY *d2i_ECPrivateKey(EC_KEY **key, const unsigned char **in, long len); -- --/** Encodes a private key object and stores the result in a buffer. -- * \param key the EC_KEY object to encode -- * \param out the buffer for the result (if NULL the function returns number -- * of bytes needed). -- * \return 1 on success and 0 if an error occurred. -- */ --int i2d_ECPrivateKey(EC_KEY *key, unsigned char **out); -- --/********************************************************************/ --/* de- and encoding functions for EC parameters */ --/********************************************************************/ -- --/** Decodes ec parameter from a memory buffer. -- * \param key a pointer to a EC_KEY object which should be used (or NULL) -- * \param in pointer to memory with the DER encoded ec parameters -- * \param len length of the DER encoded ec parameters -- * \return a EC_KEY object with the decoded parameters or NULL if an error -- * occurred. -- */ --EC_KEY *d2i_ECParameters(EC_KEY **key, const unsigned char **in, long len); -- --/** Encodes ec parameter and stores the result in a buffer. -- * \param key the EC_KEY object with ec parameters to encode -- * \param out the buffer for the result (if NULL the function returns number -- * of bytes needed). -- * \return 1 on success and 0 if an error occurred. -- */ --int i2d_ECParameters(EC_KEY *key, unsigned char **out); -- --/********************************************************************/ --/* de- and encoding functions for EC public key */ --/* (octet string, not DER -- hence 'o2i' and 'i2o') */ --/********************************************************************/ -- --/** Decodes a ec public key from a octet string. -- * \param key a pointer to a EC_KEY object which should be used -- * \param in memory buffer with the encoded public key -- * \param len length of the encoded public key -- * \return EC_KEY object with decoded public key or NULL if an error -- * occurred. -- */ --EC_KEY *o2i_ECPublicKey(EC_KEY **key, const unsigned char **in, long len); -- --/** Encodes a ec public key in an octet string. -- * \param key the EC_KEY object with the public key -- * \param out the buffer for the result (if NULL the function returns number -- * of bytes needed). -- * \return 1 on success and 0 if an error occurred -- */ --int i2o_ECPublicKey(const EC_KEY *key, unsigned char **out); -- --/** Prints out the ec parameters on human readable form. -- * \param bp BIO object to which the information is printed -- * \param key EC_KEY object -- * \return 1 on success and 0 if an error occurred -- */ --int ECParameters_print(BIO *bp, const EC_KEY *key); -- --/** Prints out the contents of a EC_KEY object -- * \param bp BIO object to which the information is printed -- * \param key EC_KEY object -- * \param off line offset -- * \return 1 on success and 0 if an error occurred -- */ --int EC_KEY_print(BIO *bp, const EC_KEY *key, int off); -- --# ifndef OPENSSL_NO_STDIO --/** Prints out the ec parameters on human readable form. -- * \param fp file descriptor to which the information is printed -- * \param key EC_KEY object -- * \return 1 on success and 0 if an error occurred -- */ --int ECParameters_print_fp(FILE *fp, const EC_KEY *key); -- --/** Prints out the contents of a EC_KEY object -- * \param fp file descriptor to which the information is printed -- * \param key EC_KEY object -- * \param off line offset -- * \return 1 on success and 0 if an error occurred -- */ --int EC_KEY_print_fp(FILE *fp, const EC_KEY *key, int off); -- --# endif -- --const EC_KEY_METHOD *EC_KEY_OpenSSL(void); --const EC_KEY_METHOD *EC_KEY_get_default_method(void); --void EC_KEY_set_default_method(const EC_KEY_METHOD *meth); --const EC_KEY_METHOD *EC_KEY_get_method(const EC_KEY *key); --int EC_KEY_set_method(EC_KEY *key, const EC_KEY_METHOD *meth); --EC_KEY *EC_KEY_new_method(ENGINE *engine); -- --/** The old name for ecdh_KDF_X9_63 -- * The ECDH KDF specification has been mistakingly attributed to ANSI X9.62, -- * it is actually specified in ANSI X9.63. -- * This identifier is retained for backwards compatibility -- */ --int ECDH_KDF_X9_62(unsigned char *out, size_t outlen, -- const unsigned char *Z, size_t Zlen, -- const unsigned char *sinfo, size_t sinfolen, -- const EVP_MD *md); -- --int ECDH_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, -- const EC_KEY *ecdh, -- void *(*KDF) (const void *in, size_t inlen, -- void *out, size_t *outlen)); -- --typedef struct ECDSA_SIG_st ECDSA_SIG; -- --/** Allocates and initialize a ECDSA_SIG structure -- * \return pointer to a ECDSA_SIG structure or NULL if an error occurred -- */ --ECDSA_SIG *ECDSA_SIG_new(void); -- --/** frees a ECDSA_SIG structure -- * \param sig pointer to the ECDSA_SIG structure -- */ --void ECDSA_SIG_free(ECDSA_SIG *sig); -- --/** DER encode content of ECDSA_SIG object (note: this function modifies *pp -- * (*pp += length of the DER encoded signature)). -- * \param sig pointer to the ECDSA_SIG object -- * \param pp pointer to a unsigned char pointer for the output or NULL -- * \return the length of the DER encoded ECDSA_SIG object or a negative value -- * on error -- */ --int i2d_ECDSA_SIG(const ECDSA_SIG *sig, unsigned char **pp); -- --/** Decodes a DER encoded ECDSA signature (note: this function changes *pp -- * (*pp += len)). -- * \param sig pointer to ECDSA_SIG pointer (may be NULL) -- * \param pp memory buffer with the DER encoded signature -- * \param len length of the buffer -- * \return pointer to the decoded ECDSA_SIG structure (or NULL) -- */ --ECDSA_SIG *d2i_ECDSA_SIG(ECDSA_SIG **sig, const unsigned char **pp, long len); -- --/** Accessor for r and s fields of ECDSA_SIG -- * \param sig pointer to ECDSA_SIG structure -- * \param pr pointer to BIGNUM pointer for r (may be NULL) -- * \param ps pointer to BIGNUM pointer for s (may be NULL) -- */ --void ECDSA_SIG_get0(const ECDSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps); -- --/** Accessor for r field of ECDSA_SIG -- * \param sig pointer to ECDSA_SIG structure -- */ --const BIGNUM *ECDSA_SIG_get0_r(const ECDSA_SIG *sig); -- --/** Accessor for s field of ECDSA_SIG -- * \param sig pointer to ECDSA_SIG structure -- */ --const BIGNUM *ECDSA_SIG_get0_s(const ECDSA_SIG *sig); -- --/** Setter for r and s fields of ECDSA_SIG -- * \param sig pointer to ECDSA_SIG structure -- * \param r pointer to BIGNUM for r (may be NULL) -- * \param s pointer to BIGNUM for s (may be NULL) -- */ --int ECDSA_SIG_set0(ECDSA_SIG *sig, BIGNUM *r, BIGNUM *s); -- --/** Computes the ECDSA signature of the given hash value using -- * the supplied private key and returns the created signature. -- * \param dgst pointer to the hash value -- * \param dgst_len length of the hash value -- * \param eckey EC_KEY object containing a private EC key -- * \return pointer to a ECDSA_SIG structure or NULL if an error occurred -- */ --ECDSA_SIG *ECDSA_do_sign(const unsigned char *dgst, int dgst_len, -- EC_KEY *eckey); -- --/** Computes ECDSA signature of a given hash value using the supplied -- * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). -- * \param dgst pointer to the hash value to sign -- * \param dgstlen length of the hash value -- * \param kinv BIGNUM with a pre-computed inverse k (optional) -- * \param rp BIGNUM with a pre-computed rp value (optional), -- * see ECDSA_sign_setup -- * \param eckey EC_KEY object containing a private EC key -- * \return pointer to a ECDSA_SIG structure or NULL if an error occurred -- */ --ECDSA_SIG *ECDSA_do_sign_ex(const unsigned char *dgst, int dgstlen, -- const BIGNUM *kinv, const BIGNUM *rp, -- EC_KEY *eckey); -- --/** Verifies that the supplied signature is a valid ECDSA -- * signature of the supplied hash value using the supplied public key. -- * \param dgst pointer to the hash value -- * \param dgst_len length of the hash value -- * \param sig ECDSA_SIG structure -- * \param eckey EC_KEY object containing a public EC key -- * \return 1 if the signature is valid, 0 if the signature is invalid -- * and -1 on error -- */ --int ECDSA_do_verify(const unsigned char *dgst, int dgst_len, -- const ECDSA_SIG *sig, EC_KEY *eckey); -- --/** Precompute parts of the signing operation -- * \param eckey EC_KEY object containing a private EC key -- * \param ctx BN_CTX object (optional) -- * \param kinv BIGNUM pointer for the inverse of k -- * \param rp BIGNUM pointer for x coordinate of k * generator -- * \return 1 on success and 0 otherwise -- */ --int ECDSA_sign_setup(EC_KEY *eckey, BN_CTX *ctx, BIGNUM **kinv, BIGNUM **rp); -- --/** Computes ECDSA signature of a given hash value using the supplied -- * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). -- * \param type this parameter is ignored -- * \param dgst pointer to the hash value to sign -- * \param dgstlen length of the hash value -- * \param sig memory for the DER encoded created signature -- * \param siglen pointer to the length of the returned signature -- * \param eckey EC_KEY object containing a private EC key -- * \return 1 on success and 0 otherwise -- */ --int ECDSA_sign(int type, const unsigned char *dgst, int dgstlen, -- unsigned char *sig, unsigned int *siglen, EC_KEY *eckey); -- --/** Computes ECDSA signature of a given hash value using the supplied -- * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). -- * \param type this parameter is ignored -- * \param dgst pointer to the hash value to sign -- * \param dgstlen length of the hash value -- * \param sig buffer to hold the DER encoded signature -- * \param siglen pointer to the length of the returned signature -- * \param kinv BIGNUM with a pre-computed inverse k (optional) -- * \param rp BIGNUM with a pre-computed rp value (optional), -- * see ECDSA_sign_setup -- * \param eckey EC_KEY object containing a private EC key -- * \return 1 on success and 0 otherwise -- */ --int ECDSA_sign_ex(int type, const unsigned char *dgst, int dgstlen, -- unsigned char *sig, unsigned int *siglen, -- const BIGNUM *kinv, const BIGNUM *rp, EC_KEY *eckey); -- --/** Verifies that the given signature is valid ECDSA signature -- * of the supplied hash value using the specified public key. -- * \param type this parameter is ignored -- * \param dgst pointer to the hash value -- * \param dgstlen length of the hash value -- * \param sig pointer to the DER encoded signature -- * \param siglen length of the DER encoded signature -- * \param eckey EC_KEY object containing a public EC key -- * \return 1 if the signature is valid, 0 if the signature is invalid -- * and -1 on error -- */ --int ECDSA_verify(int type, const unsigned char *dgst, int dgstlen, -- const unsigned char *sig, int siglen, EC_KEY *eckey); -- --/** Returns the maximum length of the DER encoded signature -- * \param eckey EC_KEY object -- * \return numbers of bytes required for the DER encoded signature -- */ --int ECDSA_size(const EC_KEY *eckey); -- --/********************************************************************/ --/* EC_KEY_METHOD constructors, destructors, writers and accessors */ --/********************************************************************/ -- --EC_KEY_METHOD *EC_KEY_METHOD_new(const EC_KEY_METHOD *meth); --void EC_KEY_METHOD_free(EC_KEY_METHOD *meth); --void EC_KEY_METHOD_set_init(EC_KEY_METHOD *meth, -- int (*init)(EC_KEY *key), -- void (*finish)(EC_KEY *key), -- int (*copy)(EC_KEY *dest, const EC_KEY *src), -- int (*set_group)(EC_KEY *key, const EC_GROUP *grp), -- int (*set_private)(EC_KEY *key, -- const BIGNUM *priv_key), -- int (*set_public)(EC_KEY *key, -- const EC_POINT *pub_key)); -- --void EC_KEY_METHOD_set_keygen(EC_KEY_METHOD *meth, -- int (*keygen)(EC_KEY *key)); -- --void EC_KEY_METHOD_set_compute_key(EC_KEY_METHOD *meth, -- int (*ckey)(unsigned char **psec, -- size_t *pseclen, -- const EC_POINT *pub_key, -- const EC_KEY *ecdh)); -- --void EC_KEY_METHOD_set_sign(EC_KEY_METHOD *meth, -- int (*sign)(int type, const unsigned char *dgst, -- int dlen, unsigned char *sig, -- unsigned int *siglen, -- const BIGNUM *kinv, const BIGNUM *r, -- EC_KEY *eckey), -- int (*sign_setup)(EC_KEY *eckey, BN_CTX *ctx_in, -- BIGNUM **kinvp, BIGNUM **rp), -- ECDSA_SIG *(*sign_sig)(const unsigned char *dgst, -- int dgst_len, -- const BIGNUM *in_kinv, -- const BIGNUM *in_r, -- EC_KEY *eckey)); -- --void EC_KEY_METHOD_set_verify(EC_KEY_METHOD *meth, -- int (*verify)(int type, const unsigned -- char *dgst, int dgst_len, -- const unsigned char *sigbuf, -- int sig_len, EC_KEY *eckey), -- int (*verify_sig)(const unsigned char *dgst, -- int dgst_len, -- const ECDSA_SIG *sig, -- EC_KEY *eckey)); -- --void EC_KEY_METHOD_get_init(const EC_KEY_METHOD *meth, -- int (**pinit)(EC_KEY *key), -- void (**pfinish)(EC_KEY *key), -- int (**pcopy)(EC_KEY *dest, const EC_KEY *src), -- int (**pset_group)(EC_KEY *key, -- const EC_GROUP *grp), -- int (**pset_private)(EC_KEY *key, -- const BIGNUM *priv_key), -- int (**pset_public)(EC_KEY *key, -- const EC_POINT *pub_key)); -- --void EC_KEY_METHOD_get_keygen(const EC_KEY_METHOD *meth, -- int (**pkeygen)(EC_KEY *key)); -- --void EC_KEY_METHOD_get_compute_key(const EC_KEY_METHOD *meth, -- int (**pck)(unsigned char **psec, -- size_t *pseclen, -- const EC_POINT *pub_key, -- const EC_KEY *ecdh)); -- --void EC_KEY_METHOD_get_sign(const EC_KEY_METHOD *meth, -- int (**psign)(int type, const unsigned char *dgst, -- int dlen, unsigned char *sig, -- unsigned int *siglen, -- const BIGNUM *kinv, const BIGNUM *r, -- EC_KEY *eckey), -- int (**psign_setup)(EC_KEY *eckey, BN_CTX *ctx_in, -- BIGNUM **kinvp, BIGNUM **rp), -- ECDSA_SIG *(**psign_sig)(const unsigned char *dgst, -- int dgst_len, -- const BIGNUM *in_kinv, -- const BIGNUM *in_r, -- EC_KEY *eckey)); -- --void EC_KEY_METHOD_get_verify(const EC_KEY_METHOD *meth, -- int (**pverify)(int type, const unsigned -- char *dgst, int dgst_len, -- const unsigned char *sigbuf, -- int sig_len, EC_KEY *eckey), -- int (**pverify_sig)(const unsigned char *dgst, -- int dgst_len, -- const ECDSA_SIG *sig, -- EC_KEY *eckey)); -- --# define ECParameters_dup(x) ASN1_dup_of(EC_KEY,i2d_ECParameters,d2i_ECParameters,x) -- --# ifndef __cplusplus --# if defined(__SUNPRO_C) --# if __SUNPRO_C >= 0x520 --# pragma error_messages (default,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE) --# endif --# endif --# endif -- --# define EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, nid) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ -- EVP_PKEY_OP_PARAMGEN|EVP_PKEY_OP_KEYGEN, \ -- EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID, nid, NULL) -- --# define EVP_PKEY_CTX_set_ec_param_enc(ctx, flag) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ -- EVP_PKEY_OP_PARAMGEN|EVP_PKEY_OP_KEYGEN, \ -- EVP_PKEY_CTRL_EC_PARAM_ENC, flag, NULL) -- --# define EVP_PKEY_CTX_set_ecdh_cofactor_mode(ctx, flag) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ -- EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_EC_ECDH_COFACTOR, flag, NULL) -- --# define EVP_PKEY_CTX_get_ecdh_cofactor_mode(ctx) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ -- EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_EC_ECDH_COFACTOR, -2, NULL) -- --# define EVP_PKEY_CTX_set_ecdh_kdf_type(ctx, kdf) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ -- EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_EC_KDF_TYPE, kdf, NULL) -- --# define EVP_PKEY_CTX_get_ecdh_kdf_type(ctx) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ -- EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_EC_KDF_TYPE, -2, NULL) -- --# define EVP_PKEY_CTX_set_ecdh_kdf_md(ctx, md) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ -- EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_EC_KDF_MD, 0, (void *)(md)) -- --# define EVP_PKEY_CTX_get_ecdh_kdf_md(ctx, pmd) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ -- EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_GET_EC_KDF_MD, 0, (void *)(pmd)) -- --# define EVP_PKEY_CTX_set_ecdh_kdf_outlen(ctx, len) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ -- EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_EC_KDF_OUTLEN, len, NULL) -- --# define EVP_PKEY_CTX_get_ecdh_kdf_outlen(ctx, plen) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ -- EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_GET_EC_KDF_OUTLEN, 0, \ -- (void *)(plen)) -- --# define EVP_PKEY_CTX_set0_ecdh_kdf_ukm(ctx, p, plen) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ -- EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_EC_KDF_UKM, plen, (void *)(p)) -- --# define EVP_PKEY_CTX_get0_ecdh_kdf_ukm(ctx, p) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, \ -- EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_GET_EC_KDF_UKM, 0, (void *)(p)) -- --/* SM2 will skip the operation check so no need to pass operation here */ --# define EVP_PKEY_CTX_set1_id(ctx, id, id_len) \ -- EVP_PKEY_CTX_ctrl(ctx, -1, -1, \ -- EVP_PKEY_CTRL_SET1_ID, (int)id_len, (void*)(id)) -- --# define EVP_PKEY_CTX_get1_id(ctx, id) \ -- EVP_PKEY_CTX_ctrl(ctx, -1, -1, \ -- EVP_PKEY_CTRL_GET1_ID, 0, (void*)(id)) -- --# define EVP_PKEY_CTX_get1_id_len(ctx, id_len) \ -- EVP_PKEY_CTX_ctrl(ctx, -1, -1, \ -- EVP_PKEY_CTRL_GET1_ID_LEN, 0, (void*)(id_len)) -- --# define EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID (EVP_PKEY_ALG_CTRL + 1) --# define EVP_PKEY_CTRL_EC_PARAM_ENC (EVP_PKEY_ALG_CTRL + 2) --# define EVP_PKEY_CTRL_EC_ECDH_COFACTOR (EVP_PKEY_ALG_CTRL + 3) --# define EVP_PKEY_CTRL_EC_KDF_TYPE (EVP_PKEY_ALG_CTRL + 4) --# define EVP_PKEY_CTRL_EC_KDF_MD (EVP_PKEY_ALG_CTRL + 5) --# define EVP_PKEY_CTRL_GET_EC_KDF_MD (EVP_PKEY_ALG_CTRL + 6) --# define EVP_PKEY_CTRL_EC_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 7) --# define EVP_PKEY_CTRL_GET_EC_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 8) --# define EVP_PKEY_CTRL_EC_KDF_UKM (EVP_PKEY_ALG_CTRL + 9) --# define EVP_PKEY_CTRL_GET_EC_KDF_UKM (EVP_PKEY_ALG_CTRL + 10) --# define EVP_PKEY_CTRL_SET1_ID (EVP_PKEY_ALG_CTRL + 11) --# define EVP_PKEY_CTRL_GET1_ID (EVP_PKEY_ALG_CTRL + 12) --# define EVP_PKEY_CTRL_GET1_ID_LEN (EVP_PKEY_ALG_CTRL + 13) --/* KDF types */ --# define EVP_PKEY_ECDH_KDF_NONE 1 --# define EVP_PKEY_ECDH_KDF_X9_63 2 --/** The old name for EVP_PKEY_ECDH_KDF_X9_63 -- * The ECDH KDF specification has been mistakingly attributed to ANSI X9.62, -- * it is actually specified in ANSI X9.63. -- * This identifier is retained for backwards compatibility -- */ --# define EVP_PKEY_ECDH_KDF_X9_62 EVP_PKEY_ECDH_KDF_X9_63 -- -- --# ifdef __cplusplus --} --# endif --# endif --#endif -diff --git a/uadk_tool/include/openssl/ecdh.h b/uadk_tool/include/openssl/ecdh.h -deleted file mode 100644 -index 681f3d5..0000000 ---- a/uadk_tool/include/openssl/ecdh.h -+++ /dev/null -@@ -1,10 +0,0 @@ --/* -- * Copyright 2002-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#include -diff --git a/uadk_tool/include/openssl/ecdsa.h b/uadk_tool/include/openssl/ecdsa.h -deleted file mode 100644 -index 681f3d5..0000000 ---- a/uadk_tool/include/openssl/ecdsa.h -+++ /dev/null -@@ -1,10 +0,0 @@ --/* -- * Copyright 2002-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#include -diff --git a/uadk_tool/include/openssl/ecerr.h b/uadk_tool/include/openssl/ecerr.h -deleted file mode 100644 -index 5173811..0000000 ---- a/uadk_tool/include/openssl/ecerr.h -+++ /dev/null -@@ -1,276 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_ECERR_H --# define HEADER_ECERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# include -- --# ifndef OPENSSL_NO_EC -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_EC_strings(void); -- --/* -- * EC function codes. -- */ --# define EC_F_BN_TO_FELEM 224 --# define EC_F_D2I_ECPARAMETERS 144 --# define EC_F_D2I_ECPKPARAMETERS 145 --# define EC_F_D2I_ECPRIVATEKEY 146 --# define EC_F_DO_EC_KEY_PRINT 221 --# define EC_F_ECDH_CMS_DECRYPT 238 --# define EC_F_ECDH_CMS_SET_SHARED_INFO 239 --# define EC_F_ECDH_COMPUTE_KEY 246 --# define EC_F_ECDH_SIMPLE_COMPUTE_KEY 257 --# define EC_F_ECDSA_DO_SIGN_EX 251 --# define EC_F_ECDSA_DO_VERIFY 252 --# define EC_F_ECDSA_SIGN_EX 254 --# define EC_F_ECDSA_SIGN_SETUP 248 --# define EC_F_ECDSA_SIG_NEW 265 --# define EC_F_ECDSA_VERIFY 253 --# define EC_F_ECD_ITEM_VERIFY 270 --# define EC_F_ECKEY_PARAM2TYPE 223 --# define EC_F_ECKEY_PARAM_DECODE 212 --# define EC_F_ECKEY_PRIV_DECODE 213 --# define EC_F_ECKEY_PRIV_ENCODE 214 --# define EC_F_ECKEY_PUB_DECODE 215 --# define EC_F_ECKEY_PUB_ENCODE 216 --# define EC_F_ECKEY_TYPE2PARAM 220 --# define EC_F_ECPARAMETERS_PRINT 147 --# define EC_F_ECPARAMETERS_PRINT_FP 148 --# define EC_F_ECPKPARAMETERS_PRINT 149 --# define EC_F_ECPKPARAMETERS_PRINT_FP 150 --# define EC_F_ECP_NISTZ256_GET_AFFINE 240 --# define EC_F_ECP_NISTZ256_INV_MOD_ORD 275 --# define EC_F_ECP_NISTZ256_MULT_PRECOMPUTE 243 --# define EC_F_ECP_NISTZ256_POINTS_MUL 241 --# define EC_F_ECP_NISTZ256_PRE_COMP_NEW 244 --# define EC_F_ECP_NISTZ256_WINDOWED_MUL 242 --# define EC_F_ECX_KEY_OP 266 --# define EC_F_ECX_PRIV_ENCODE 267 --# define EC_F_ECX_PUB_ENCODE 268 --# define EC_F_EC_ASN1_GROUP2CURVE 153 --# define EC_F_EC_ASN1_GROUP2FIELDID 154 --# define EC_F_EC_GF2M_MONTGOMERY_POINT_MULTIPLY 208 --# define EC_F_EC_GF2M_SIMPLE_FIELD_INV 296 --# define EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT 159 --# define EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE 195 --# define EC_F_EC_GF2M_SIMPLE_LADDER_POST 285 --# define EC_F_EC_GF2M_SIMPLE_LADDER_PRE 288 --# define EC_F_EC_GF2M_SIMPLE_OCT2POINT 160 --# define EC_F_EC_GF2M_SIMPLE_POINT2OCT 161 --# define EC_F_EC_GF2M_SIMPLE_POINTS_MUL 289 --# define EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES 162 --# define EC_F_EC_GF2M_SIMPLE_POINT_SET_AFFINE_COORDINATES 163 --# define EC_F_EC_GF2M_SIMPLE_SET_COMPRESSED_COORDINATES 164 --# define EC_F_EC_GFP_MONT_FIELD_DECODE 133 --# define EC_F_EC_GFP_MONT_FIELD_ENCODE 134 --# define EC_F_EC_GFP_MONT_FIELD_INV 297 --# define EC_F_EC_GFP_MONT_FIELD_MUL 131 --# define EC_F_EC_GFP_MONT_FIELD_SET_TO_ONE 209 --# define EC_F_EC_GFP_MONT_FIELD_SQR 132 --# define EC_F_EC_GFP_MONT_GROUP_SET_CURVE 189 --# define EC_F_EC_GFP_NISTP224_GROUP_SET_CURVE 225 --# define EC_F_EC_GFP_NISTP224_POINTS_MUL 228 --# define EC_F_EC_GFP_NISTP224_POINT_GET_AFFINE_COORDINATES 226 --# define EC_F_EC_GFP_NISTP256_GROUP_SET_CURVE 230 --# define EC_F_EC_GFP_NISTP256_POINTS_MUL 231 --# define EC_F_EC_GFP_NISTP256_POINT_GET_AFFINE_COORDINATES 232 --# define EC_F_EC_GFP_NISTP521_GROUP_SET_CURVE 233 --# define EC_F_EC_GFP_NISTP521_POINTS_MUL 234 --# define EC_F_EC_GFP_NISTP521_POINT_GET_AFFINE_COORDINATES 235 --# define EC_F_EC_GFP_NIST_FIELD_MUL 200 --# define EC_F_EC_GFP_NIST_FIELD_SQR 201 --# define EC_F_EC_GFP_NIST_GROUP_SET_CURVE 202 --# define EC_F_EC_GFP_SIMPLE_BLIND_COORDINATES 287 --# define EC_F_EC_GFP_SIMPLE_FIELD_INV 298 --# define EC_F_EC_GFP_SIMPLE_GROUP_CHECK_DISCRIMINANT 165 --# define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE 166 --# define EC_F_EC_GFP_SIMPLE_MAKE_AFFINE 102 --# define EC_F_EC_GFP_SIMPLE_OCT2POINT 103 --# define EC_F_EC_GFP_SIMPLE_POINT2OCT 104 --# define EC_F_EC_GFP_SIMPLE_POINTS_MAKE_AFFINE 137 --# define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES 167 --# define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES 168 --# define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES 169 --# define EC_F_EC_GROUP_CHECK 170 --# define EC_F_EC_GROUP_CHECK_DISCRIMINANT 171 --# define EC_F_EC_GROUP_COPY 106 --# define EC_F_EC_GROUP_GET_CURVE 291 --# define EC_F_EC_GROUP_GET_CURVE_GF2M 172 --# define EC_F_EC_GROUP_GET_CURVE_GFP 130 --# define EC_F_EC_GROUP_GET_DEGREE 173 --# define EC_F_EC_GROUP_GET_ECPARAMETERS 261 --# define EC_F_EC_GROUP_GET_ECPKPARAMETERS 262 --# define EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS 193 --# define EC_F_EC_GROUP_GET_TRINOMIAL_BASIS 194 --# define EC_F_EC_GROUP_NEW 108 --# define EC_F_EC_GROUP_NEW_BY_CURVE_NAME 174 --# define EC_F_EC_GROUP_NEW_FROM_DATA 175 --# define EC_F_EC_GROUP_NEW_FROM_ECPARAMETERS 263 --# define EC_F_EC_GROUP_NEW_FROM_ECPKPARAMETERS 264 --# define EC_F_EC_GROUP_SET_CURVE 292 --# define EC_F_EC_GROUP_SET_CURVE_GF2M 176 --# define EC_F_EC_GROUP_SET_CURVE_GFP 109 --# define EC_F_EC_GROUP_SET_GENERATOR 111 --# define EC_F_EC_GROUP_SET_SEED 286 --# define EC_F_EC_KEY_CHECK_KEY 177 --# define EC_F_EC_KEY_COPY 178 --# define EC_F_EC_KEY_GENERATE_KEY 179 --# define EC_F_EC_KEY_NEW 182 --# define EC_F_EC_KEY_NEW_METHOD 245 --# define EC_F_EC_KEY_OCT2PRIV 255 --# define EC_F_EC_KEY_PRINT 180 --# define EC_F_EC_KEY_PRINT_FP 181 --# define EC_F_EC_KEY_PRIV2BUF 279 --# define EC_F_EC_KEY_PRIV2OCT 256 --# define EC_F_EC_KEY_SET_PUBLIC_KEY_AFFINE_COORDINATES 229 --# define EC_F_EC_KEY_SIMPLE_CHECK_KEY 258 --# define EC_F_EC_KEY_SIMPLE_OCT2PRIV 259 --# define EC_F_EC_KEY_SIMPLE_PRIV2OCT 260 --# define EC_F_EC_PKEY_CHECK 273 --# define EC_F_EC_PKEY_PARAM_CHECK 274 --# define EC_F_EC_POINTS_MAKE_AFFINE 136 --# define EC_F_EC_POINTS_MUL 290 --# define EC_F_EC_POINT_ADD 112 --# define EC_F_EC_POINT_BN2POINT 280 --# define EC_F_EC_POINT_CMP 113 --# define EC_F_EC_POINT_COPY 114 --# define EC_F_EC_POINT_DBL 115 --# define EC_F_EC_POINT_GET_AFFINE_COORDINATES 293 --# define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2M 183 --# define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP 116 --# define EC_F_EC_POINT_GET_JPROJECTIVE_COORDINATES_GFP 117 --# define EC_F_EC_POINT_INVERT 210 --# define EC_F_EC_POINT_IS_AT_INFINITY 118 --# define EC_F_EC_POINT_IS_ON_CURVE 119 --# define EC_F_EC_POINT_MAKE_AFFINE 120 --# define EC_F_EC_POINT_NEW 121 --# define EC_F_EC_POINT_OCT2POINT 122 --# define EC_F_EC_POINT_POINT2BUF 281 --# define EC_F_EC_POINT_POINT2OCT 123 --# define EC_F_EC_POINT_SET_AFFINE_COORDINATES 294 --# define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M 185 --# define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP 124 --# define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES 295 --# define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M 186 --# define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP 125 --# define EC_F_EC_POINT_SET_JPROJECTIVE_COORDINATES_GFP 126 --# define EC_F_EC_POINT_SET_TO_INFINITY 127 --# define EC_F_EC_PRE_COMP_NEW 196 --# define EC_F_EC_SCALAR_MUL_LADDER 284 --# define EC_F_EC_WNAF_MUL 187 --# define EC_F_EC_WNAF_PRECOMPUTE_MULT 188 --# define EC_F_I2D_ECPARAMETERS 190 --# define EC_F_I2D_ECPKPARAMETERS 191 --# define EC_F_I2D_ECPRIVATEKEY 192 --# define EC_F_I2O_ECPUBLICKEY 151 --# define EC_F_NISTP224_PRE_COMP_NEW 227 --# define EC_F_NISTP256_PRE_COMP_NEW 236 --# define EC_F_NISTP521_PRE_COMP_NEW 237 --# define EC_F_O2I_ECPUBLICKEY 152 --# define EC_F_OLD_EC_PRIV_DECODE 222 --# define EC_F_OSSL_ECDH_COMPUTE_KEY 247 --# define EC_F_OSSL_ECDSA_SIGN_SIG 249 --# define EC_F_OSSL_ECDSA_VERIFY_SIG 250 --# define EC_F_PKEY_ECD_CTRL 271 --# define EC_F_PKEY_ECD_DIGESTSIGN 272 --# define EC_F_PKEY_ECD_DIGESTSIGN25519 276 --# define EC_F_PKEY_ECD_DIGESTSIGN448 277 --# define EC_F_PKEY_ECX_DERIVE 269 --# define EC_F_PKEY_EC_CTRL 197 --# define EC_F_PKEY_EC_CTRL_STR 198 --# define EC_F_PKEY_EC_DERIVE 217 --# define EC_F_PKEY_EC_INIT 282 --# define EC_F_PKEY_EC_KDF_DERIVE 283 --# define EC_F_PKEY_EC_KEYGEN 199 --# define EC_F_PKEY_EC_PARAMGEN 219 --# define EC_F_PKEY_EC_SIGN 218 --# define EC_F_VALIDATE_ECX_DERIVE 278 -- --/* -- * EC reason codes. -- */ --# define EC_R_ASN1_ERROR 115 --# define EC_R_BAD_SIGNATURE 156 --# define EC_R_BIGNUM_OUT_OF_RANGE 144 --# define EC_R_BUFFER_TOO_SMALL 100 --# define EC_R_CANNOT_INVERT 165 --# define EC_R_COORDINATES_OUT_OF_RANGE 146 --# define EC_R_CURVE_DOES_NOT_SUPPORT_ECDH 160 --# define EC_R_CURVE_DOES_NOT_SUPPORT_SIGNING 159 --# define EC_R_D2I_ECPKPARAMETERS_FAILURE 117 --# define EC_R_DECODE_ERROR 142 --# define EC_R_DISCRIMINANT_IS_ZERO 118 --# define EC_R_EC_GROUP_NEW_BY_NAME_FAILURE 119 --# define EC_R_FIELD_TOO_LARGE 143 --# define EC_R_GF2M_NOT_SUPPORTED 147 --# define EC_R_GROUP2PKPARAMETERS_FAILURE 120 --# define EC_R_I2D_ECPKPARAMETERS_FAILURE 121 --# define EC_R_INCOMPATIBLE_OBJECTS 101 --# define EC_R_INVALID_ARGUMENT 112 --# define EC_R_INVALID_COMPRESSED_POINT 110 --# define EC_R_INVALID_COMPRESSION_BIT 109 --# define EC_R_INVALID_CURVE 141 --# define EC_R_INVALID_DIGEST 151 --# define EC_R_INVALID_DIGEST_TYPE 138 --# define EC_R_INVALID_ENCODING 102 --# define EC_R_INVALID_FIELD 103 --# define EC_R_INVALID_FORM 104 --# define EC_R_INVALID_GROUP_ORDER 122 --# define EC_R_INVALID_KEY 116 --# define EC_R_INVALID_OUTPUT_LENGTH 161 --# define EC_R_INVALID_PEER_KEY 133 --# define EC_R_INVALID_PENTANOMIAL_BASIS 132 --# define EC_R_INVALID_PRIVATE_KEY 123 --# define EC_R_INVALID_TRINOMIAL_BASIS 137 --# define EC_R_KDF_PARAMETER_ERROR 148 --# define EC_R_KEYS_NOT_SET 140 --# define EC_R_LADDER_POST_FAILURE 136 --# define EC_R_LADDER_PRE_FAILURE 153 --# define EC_R_LADDER_STEP_FAILURE 162 --# define EC_R_MISSING_OID 167 --# define EC_R_MISSING_PARAMETERS 124 --# define EC_R_MISSING_PRIVATE_KEY 125 --# define EC_R_NEED_NEW_SETUP_VALUES 157 --# define EC_R_NOT_A_NIST_PRIME 135 --# define EC_R_NOT_IMPLEMENTED 126 --# define EC_R_NOT_INITIALIZED 111 --# define EC_R_NO_PARAMETERS_SET 139 --# define EC_R_NO_PRIVATE_VALUE 154 --# define EC_R_OPERATION_NOT_SUPPORTED 152 --# define EC_R_PASSED_NULL_PARAMETER 134 --# define EC_R_PEER_KEY_ERROR 149 --# define EC_R_PKPARAMETERS2GROUP_FAILURE 127 --# define EC_R_POINT_ARITHMETIC_FAILURE 155 --# define EC_R_POINT_AT_INFINITY 106 --# define EC_R_POINT_COORDINATES_BLIND_FAILURE 163 --# define EC_R_POINT_IS_NOT_ON_CURVE 107 --# define EC_R_RANDOM_NUMBER_GENERATION_FAILED 158 --# define EC_R_SHARED_INFO_ERROR 150 --# define EC_R_SLOT_FULL 108 --# define EC_R_UNDEFINED_GENERATOR 113 --# define EC_R_UNDEFINED_ORDER 128 --# define EC_R_UNKNOWN_COFACTOR 164 --# define EC_R_UNKNOWN_GROUP 129 --# define EC_R_UNKNOWN_ORDER 114 --# define EC_R_UNSUPPORTED_FIELD 131 --# define EC_R_WRONG_CURVE_PARAMETERS 145 --# define EC_R_WRONG_ORDER 130 -- --# endif --#endif -diff --git a/uadk_tool/include/openssl/engine.h b/uadk_tool/include/openssl/engine.h -deleted file mode 100644 -index 0780f0f..0000000 ---- a/uadk_tool/include/openssl/engine.h -+++ /dev/null -@@ -1,751 +0,0 @@ --/* -- * Copyright 2000-2018 The OpenSSL Project Authors. All Rights Reserved. -- * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_ENGINE_H --# define HEADER_ENGINE_H -- --# include -- --# ifndef OPENSSL_NO_ENGINE --# if OPENSSL_API_COMPAT < 0x10100000L --# include --# include --# include --# include --# include --# include --# include --# include --# endif --# include --# include --# include --# include --# ifdef __cplusplus --extern "C" { --# endif -- --/* -- * These flags are used to control combinations of algorithm (methods) by -- * bitwise "OR"ing. -- */ --# define ENGINE_METHOD_RSA (unsigned int)0x0001 --# define ENGINE_METHOD_DSA (unsigned int)0x0002 --# define ENGINE_METHOD_DH (unsigned int)0x0004 --# define ENGINE_METHOD_RAND (unsigned int)0x0008 --# define ENGINE_METHOD_CIPHERS (unsigned int)0x0040 --# define ENGINE_METHOD_DIGESTS (unsigned int)0x0080 --# define ENGINE_METHOD_PKEY_METHS (unsigned int)0x0200 --# define ENGINE_METHOD_PKEY_ASN1_METHS (unsigned int)0x0400 --# define ENGINE_METHOD_EC (unsigned int)0x0800 --/* Obvious all-or-nothing cases. */ --# define ENGINE_METHOD_ALL (unsigned int)0xFFFF --# define ENGINE_METHOD_NONE (unsigned int)0x0000 -- --/* -- * This(ese) flag(s) controls behaviour of the ENGINE_TABLE mechanism used -- * internally to control registration of ENGINE implementations, and can be -- * set by ENGINE_set_table_flags(). The "NOINIT" flag prevents attempts to -- * initialise registered ENGINEs if they are not already initialised. -- */ --# define ENGINE_TABLE_FLAG_NOINIT (unsigned int)0x0001 -- --/* ENGINE flags that can be set by ENGINE_set_flags(). */ --/* Not used */ --/* #define ENGINE_FLAGS_MALLOCED 0x0001 */ -- --/* -- * This flag is for ENGINEs that wish to handle the various 'CMD'-related -- * control commands on their own. Without this flag, ENGINE_ctrl() handles -- * these control commands on behalf of the ENGINE using their "cmd_defns" -- * data. -- */ --# define ENGINE_FLAGS_MANUAL_CMD_CTRL (int)0x0002 -- --/* -- * This flag is for ENGINEs who return new duplicate structures when found -- * via "ENGINE_by_id()". When an ENGINE must store state (eg. if -- * ENGINE_ctrl() commands are called in sequence as part of some stateful -- * process like key-generation setup and execution), it can set this flag - -- * then each attempt to obtain the ENGINE will result in it being copied into -- * a new structure. Normally, ENGINEs don't declare this flag so -- * ENGINE_by_id() just increments the existing ENGINE's structural reference -- * count. -- */ --# define ENGINE_FLAGS_BY_ID_COPY (int)0x0004 -- --/* -- * This flag if for an ENGINE that does not want its methods registered as -- * part of ENGINE_register_all_complete() for example if the methods are not -- * usable as default methods. -- */ -- --# define ENGINE_FLAGS_NO_REGISTER_ALL (int)0x0008 -- --/* -- * ENGINEs can support their own command types, and these flags are used in -- * ENGINE_CTRL_GET_CMD_FLAGS to indicate to the caller what kind of input -- * each command expects. Currently only numeric and string input is -- * supported. If a control command supports none of the _NUMERIC, _STRING, or -- * _NO_INPUT options, then it is regarded as an "internal" control command - -- * and not for use in config setting situations. As such, they're not -- * available to the ENGINE_ctrl_cmd_string() function, only raw ENGINE_ctrl() -- * access. Changes to this list of 'command types' should be reflected -- * carefully in ENGINE_cmd_is_executable() and ENGINE_ctrl_cmd_string(). -- */ -- --/* accepts a 'long' input value (3rd parameter to ENGINE_ctrl) */ --# define ENGINE_CMD_FLAG_NUMERIC (unsigned int)0x0001 --/* -- * accepts string input (cast from 'void*' to 'const char *', 4th parameter -- * to ENGINE_ctrl) -- */ --# define ENGINE_CMD_FLAG_STRING (unsigned int)0x0002 --/* -- * Indicates that the control command takes *no* input. Ie. the control -- * command is unparameterised. -- */ --# define ENGINE_CMD_FLAG_NO_INPUT (unsigned int)0x0004 --/* -- * Indicates that the control command is internal. This control command won't -- * be shown in any output, and is only usable through the ENGINE_ctrl_cmd() -- * function. -- */ --# define ENGINE_CMD_FLAG_INTERNAL (unsigned int)0x0008 -- --/* -- * NB: These 3 control commands are deprecated and should not be used. -- * ENGINEs relying on these commands should compile conditional support for -- * compatibility (eg. if these symbols are defined) but should also migrate -- * the same functionality to their own ENGINE-specific control functions that -- * can be "discovered" by calling applications. The fact these control -- * commands wouldn't be "executable" (ie. usable by text-based config) -- * doesn't change the fact that application code can find and use them -- * without requiring per-ENGINE hacking. -- */ -- --/* -- * These flags are used to tell the ctrl function what should be done. All -- * command numbers are shared between all engines, even if some don't make -- * sense to some engines. In such a case, they do nothing but return the -- * error ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED. -- */ --# define ENGINE_CTRL_SET_LOGSTREAM 1 --# define ENGINE_CTRL_SET_PASSWORD_CALLBACK 2 --# define ENGINE_CTRL_HUP 3/* Close and reinitialise -- * any handles/connections -- * etc. */ --# define ENGINE_CTRL_SET_USER_INTERFACE 4/* Alternative to callback */ --# define ENGINE_CTRL_SET_CALLBACK_DATA 5/* User-specific data, used -- * when calling the password -- * callback and the user -- * interface */ --# define ENGINE_CTRL_LOAD_CONFIGURATION 6/* Load a configuration, -- * given a string that -- * represents a file name -- * or so */ --# define ENGINE_CTRL_LOAD_SECTION 7/* Load data from a given -- * section in the already -- * loaded configuration */ -- --/* -- * These control commands allow an application to deal with an arbitrary -- * engine in a dynamic way. Warn: Negative return values indicate errors FOR -- * THESE COMMANDS because zero is used to indicate 'end-of-list'. Other -- * commands, including ENGINE-specific command types, return zero for an -- * error. An ENGINE can choose to implement these ctrl functions, and can -- * internally manage things however it chooses - it does so by setting the -- * ENGINE_FLAGS_MANUAL_CMD_CTRL flag (using ENGINE_set_flags()). Otherwise -- * the ENGINE_ctrl() code handles this on the ENGINE's behalf using the -- * cmd_defns data (set using ENGINE_set_cmd_defns()). This means an ENGINE's -- * ctrl() handler need only implement its own commands - the above "meta" -- * commands will be taken care of. -- */ -- --/* -- * Returns non-zero if the supplied ENGINE has a ctrl() handler. If "not", -- * then all the remaining control commands will return failure, so it is -- * worth checking this first if the caller is trying to "discover" the -- * engine's capabilities and doesn't want errors generated unnecessarily. -- */ --# define ENGINE_CTRL_HAS_CTRL_FUNCTION 10 --/* -- * Returns a positive command number for the first command supported by the -- * engine. Returns zero if no ctrl commands are supported. -- */ --# define ENGINE_CTRL_GET_FIRST_CMD_TYPE 11 --/* -- * The 'long' argument specifies a command implemented by the engine, and the -- * return value is the next command supported, or zero if there are no more. -- */ --# define ENGINE_CTRL_GET_NEXT_CMD_TYPE 12 --/* -- * The 'void*' argument is a command name (cast from 'const char *'), and the -- * return value is the command that corresponds to it. -- */ --# define ENGINE_CTRL_GET_CMD_FROM_NAME 13 --/* -- * The next two allow a command to be converted into its corresponding string -- * form. In each case, the 'long' argument supplies the command. In the -- * NAME_LEN case, the return value is the length of the command name (not -- * counting a trailing EOL). In the NAME case, the 'void*' argument must be a -- * string buffer large enough, and it will be populated with the name of the -- * command (WITH a trailing EOL). -- */ --# define ENGINE_CTRL_GET_NAME_LEN_FROM_CMD 14 --# define ENGINE_CTRL_GET_NAME_FROM_CMD 15 --/* The next two are similar but give a "short description" of a command. */ --# define ENGINE_CTRL_GET_DESC_LEN_FROM_CMD 16 --# define ENGINE_CTRL_GET_DESC_FROM_CMD 17 --/* -- * With this command, the return value is the OR'd combination of -- * ENGINE_CMD_FLAG_*** values that indicate what kind of input a given -- * engine-specific ctrl command expects. -- */ --# define ENGINE_CTRL_GET_CMD_FLAGS 18 -- --/* -- * ENGINE implementations should start the numbering of their own control -- * commands from this value. (ie. ENGINE_CMD_BASE, ENGINE_CMD_BASE + 1, etc). -- */ --# define ENGINE_CMD_BASE 200 -- --/* -- * NB: These 2 nCipher "chil" control commands are deprecated, and their -- * functionality is now available through ENGINE-specific control commands -- * (exposed through the above-mentioned 'CMD'-handling). Code using these 2 -- * commands should be migrated to the more general command handling before -- * these are removed. -- */ -- --/* Flags specific to the nCipher "chil" engine */ --# define ENGINE_CTRL_CHIL_SET_FORKCHECK 100 -- /* -- * Depending on the value of the (long)i argument, this sets or -- * unsets the SimpleForkCheck flag in the CHIL API to enable or -- * disable checking and workarounds for applications that fork(). -- */ --# define ENGINE_CTRL_CHIL_NO_LOCKING 101 -- /* -- * This prevents the initialisation function from providing mutex -- * callbacks to the nCipher library. -- */ -- --/* -- * If an ENGINE supports its own specific control commands and wishes the -- * framework to handle the above 'ENGINE_CMD_***'-manipulation commands on -- * its behalf, it should supply a null-terminated array of ENGINE_CMD_DEFN -- * entries to ENGINE_set_cmd_defns(). It should also implement a ctrl() -- * handler that supports the stated commands (ie. the "cmd_num" entries as -- * described by the array). NB: The array must be ordered in increasing order -- * of cmd_num. "null-terminated" means that the last ENGINE_CMD_DEFN element -- * has cmd_num set to zero and/or cmd_name set to NULL. -- */ --typedef struct ENGINE_CMD_DEFN_st { -- unsigned int cmd_num; /* The command number */ -- const char *cmd_name; /* The command name itself */ -- const char *cmd_desc; /* A short description of the command */ -- unsigned int cmd_flags; /* The input the command expects */ --} ENGINE_CMD_DEFN; -- --/* Generic function pointer */ --typedef int (*ENGINE_GEN_FUNC_PTR) (void); --/* Generic function pointer taking no arguments */ --typedef int (*ENGINE_GEN_INT_FUNC_PTR) (ENGINE *); --/* Specific control function pointer */ --typedef int (*ENGINE_CTRL_FUNC_PTR) (ENGINE *, int, long, void *, -- void (*f) (void)); --/* Generic load_key function pointer */ --typedef EVP_PKEY *(*ENGINE_LOAD_KEY_PTR)(ENGINE *, const char *, -- UI_METHOD *ui_method, -- void *callback_data); --typedef int (*ENGINE_SSL_CLIENT_CERT_PTR) (ENGINE *, SSL *ssl, -- STACK_OF(X509_NAME) *ca_dn, -- X509 **pcert, EVP_PKEY **pkey, -- STACK_OF(X509) **pother, -- UI_METHOD *ui_method, -- void *callback_data); --/*- -- * These callback types are for an ENGINE's handler for cipher and digest logic. -- * These handlers have these prototypes; -- * int foo(ENGINE *e, const EVP_CIPHER **cipher, const int **nids, int nid); -- * int foo(ENGINE *e, const EVP_MD **digest, const int **nids, int nid); -- * Looking at how to implement these handlers in the case of cipher support, if -- * the framework wants the EVP_CIPHER for 'nid', it will call; -- * foo(e, &p_evp_cipher, NULL, nid); (return zero for failure) -- * If the framework wants a list of supported 'nid's, it will call; -- * foo(e, NULL, &p_nids, 0); (returns number of 'nids' or -1 for error) -- */ --/* -- * Returns to a pointer to the array of supported cipher 'nid's. If the -- * second parameter is non-NULL it is set to the size of the returned array. -- */ --typedef int (*ENGINE_CIPHERS_PTR) (ENGINE *, const EVP_CIPHER **, -- const int **, int); --typedef int (*ENGINE_DIGESTS_PTR) (ENGINE *, const EVP_MD **, const int **, -- int); --typedef int (*ENGINE_PKEY_METHS_PTR) (ENGINE *, EVP_PKEY_METHOD **, -- const int **, int); --typedef int (*ENGINE_PKEY_ASN1_METHS_PTR) (ENGINE *, EVP_PKEY_ASN1_METHOD **, -- const int **, int); --/* -- * STRUCTURE functions ... all of these functions deal with pointers to -- * ENGINE structures where the pointers have a "structural reference". This -- * means that their reference is to allowed access to the structure but it -- * does not imply that the structure is functional. To simply increment or -- * decrement the structural reference count, use ENGINE_by_id and -- * ENGINE_free. NB: This is not required when iterating using ENGINE_get_next -- * as it will automatically decrement the structural reference count of the -- * "current" ENGINE and increment the structural reference count of the -- * ENGINE it returns (unless it is NULL). -- */ -- --/* Get the first/last "ENGINE" type available. */ --ENGINE *ENGINE_get_first(void); --ENGINE *ENGINE_get_last(void); --/* Iterate to the next/previous "ENGINE" type (NULL = end of the list). */ --ENGINE *ENGINE_get_next(ENGINE *e); --ENGINE *ENGINE_get_prev(ENGINE *e); --/* Add another "ENGINE" type into the array. */ --int ENGINE_add(ENGINE *e); --/* Remove an existing "ENGINE" type from the array. */ --int ENGINE_remove(ENGINE *e); --/* Retrieve an engine from the list by its unique "id" value. */ --ENGINE *ENGINE_by_id(const char *id); -- --#if OPENSSL_API_COMPAT < 0x10100000L --# define ENGINE_load_openssl() \ -- OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_OPENSSL, NULL) --# define ENGINE_load_dynamic() \ -- OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_DYNAMIC, NULL) --# ifndef OPENSSL_NO_STATIC_ENGINE --# define ENGINE_load_padlock() \ -- OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_PADLOCK, NULL) --# define ENGINE_load_capi() \ -- OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_CAPI, NULL) --# define ENGINE_load_afalg() \ -- OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_AFALG, NULL) --# endif --# define ENGINE_load_cryptodev() \ -- OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_CRYPTODEV, NULL) --# define ENGINE_load_rdrand() \ -- OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_RDRAND, NULL) --#endif --void ENGINE_load_builtin_engines(void); -- --/* -- * Get and set global flags (ENGINE_TABLE_FLAG_***) for the implementation -- * "registry" handling. -- */ --unsigned int ENGINE_get_table_flags(void); --void ENGINE_set_table_flags(unsigned int flags); -- --/*- Manage registration of ENGINEs per "table". For each type, there are 3 -- * functions; -- * ENGINE_register_***(e) - registers the implementation from 'e' (if it has one) -- * ENGINE_unregister_***(e) - unregister the implementation from 'e' -- * ENGINE_register_all_***() - call ENGINE_register_***() for each 'e' in the list -- * Cleanup is automatically registered from each table when required. -- */ -- --int ENGINE_register_RSA(ENGINE *e); --void ENGINE_unregister_RSA(ENGINE *e); --void ENGINE_register_all_RSA(void); -- --int ENGINE_register_DSA(ENGINE *e); --void ENGINE_unregister_DSA(ENGINE *e); --void ENGINE_register_all_DSA(void); -- --int ENGINE_register_EC(ENGINE *e); --void ENGINE_unregister_EC(ENGINE *e); --void ENGINE_register_all_EC(void); -- --int ENGINE_register_DH(ENGINE *e); --void ENGINE_unregister_DH(ENGINE *e); --void ENGINE_register_all_DH(void); -- --int ENGINE_register_RAND(ENGINE *e); --void ENGINE_unregister_RAND(ENGINE *e); --void ENGINE_register_all_RAND(void); -- --int ENGINE_register_ciphers(ENGINE *e); --void ENGINE_unregister_ciphers(ENGINE *e); --void ENGINE_register_all_ciphers(void); -- --int ENGINE_register_digests(ENGINE *e); --void ENGINE_unregister_digests(ENGINE *e); --void ENGINE_register_all_digests(void); -- --int ENGINE_register_pkey_meths(ENGINE *e); --void ENGINE_unregister_pkey_meths(ENGINE *e); --void ENGINE_register_all_pkey_meths(void); -- --int ENGINE_register_pkey_asn1_meths(ENGINE *e); --void ENGINE_unregister_pkey_asn1_meths(ENGINE *e); --void ENGINE_register_all_pkey_asn1_meths(void); -- --/* -- * These functions register all support from the above categories. Note, use -- * of these functions can result in static linkage of code your application -- * may not need. If you only need a subset of functionality, consider using -- * more selective initialisation. -- */ --int ENGINE_register_complete(ENGINE *e); --int ENGINE_register_all_complete(void); -- --/* -- * Send parameterised control commands to the engine. The possibilities to -- * send down an integer, a pointer to data or a function pointer are -- * provided. Any of the parameters may or may not be NULL, depending on the -- * command number. In actuality, this function only requires a structural -- * (rather than functional) reference to an engine, but many control commands -- * may require the engine be functional. The caller should be aware of trying -- * commands that require an operational ENGINE, and only use functional -- * references in such situations. -- */ --int ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f) (void)); -- --/* -- * This function tests if an ENGINE-specific command is usable as a -- * "setting". Eg. in an application's config file that gets processed through -- * ENGINE_ctrl_cmd_string(). If this returns zero, it is not available to -- * ENGINE_ctrl_cmd_string(), only ENGINE_ctrl(). -- */ --int ENGINE_cmd_is_executable(ENGINE *e, int cmd); -- --/* -- * This function works like ENGINE_ctrl() with the exception of taking a -- * command name instead of a command number, and can handle optional -- * commands. See the comment on ENGINE_ctrl_cmd_string() for an explanation -- * on how to use the cmd_name and cmd_optional. -- */ --int ENGINE_ctrl_cmd(ENGINE *e, const char *cmd_name, -- long i, void *p, void (*f) (void), int cmd_optional); -- --/* -- * This function passes a command-name and argument to an ENGINE. The -- * cmd_name is converted to a command number and the control command is -- * called using 'arg' as an argument (unless the ENGINE doesn't support such -- * a command, in which case no control command is called). The command is -- * checked for input flags, and if necessary the argument will be converted -- * to a numeric value. If cmd_optional is non-zero, then if the ENGINE -- * doesn't support the given cmd_name the return value will be success -- * anyway. This function is intended for applications to use so that users -- * (or config files) can supply engine-specific config data to the ENGINE at -- * run-time to control behaviour of specific engines. As such, it shouldn't -- * be used for calling ENGINE_ctrl() functions that return data, deal with -- * binary data, or that are otherwise supposed to be used directly through -- * ENGINE_ctrl() in application code. Any "return" data from an ENGINE_ctrl() -- * operation in this function will be lost - the return value is interpreted -- * as failure if the return value is zero, success otherwise, and this -- * function returns a boolean value as a result. In other words, vendors of -- * 'ENGINE'-enabled devices should write ENGINE implementations with -- * parameterisations that work in this scheme, so that compliant ENGINE-based -- * applications can work consistently with the same configuration for the -- * same ENGINE-enabled devices, across applications. -- */ --int ENGINE_ctrl_cmd_string(ENGINE *e, const char *cmd_name, const char *arg, -- int cmd_optional); -- --/* -- * These functions are useful for manufacturing new ENGINE structures. They -- * don't address reference counting at all - one uses them to populate an -- * ENGINE structure with personalised implementations of things prior to -- * using it directly or adding it to the builtin ENGINE list in OpenSSL. -- * These are also here so that the ENGINE structure doesn't have to be -- * exposed and break binary compatibility! -- */ --ENGINE *ENGINE_new(void); --int ENGINE_free(ENGINE *e); --int ENGINE_up_ref(ENGINE *e); --int ENGINE_set_id(ENGINE *e, const char *id); --int ENGINE_set_name(ENGINE *e, const char *name); --int ENGINE_set_RSA(ENGINE *e, const RSA_METHOD *rsa_meth); --int ENGINE_set_DSA(ENGINE *e, const DSA_METHOD *dsa_meth); --int ENGINE_set_EC(ENGINE *e, const EC_KEY_METHOD *ecdsa_meth); --int ENGINE_set_DH(ENGINE *e, const DH_METHOD *dh_meth); --int ENGINE_set_RAND(ENGINE *e, const RAND_METHOD *rand_meth); --int ENGINE_set_destroy_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR destroy_f); --int ENGINE_set_init_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR init_f); --int ENGINE_set_finish_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR finish_f); --int ENGINE_set_ctrl_function(ENGINE *e, ENGINE_CTRL_FUNC_PTR ctrl_f); --int ENGINE_set_load_privkey_function(ENGINE *e, -- ENGINE_LOAD_KEY_PTR loadpriv_f); --int ENGINE_set_load_pubkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpub_f); --int ENGINE_set_load_ssl_client_cert_function(ENGINE *e, -- ENGINE_SSL_CLIENT_CERT_PTR -- loadssl_f); --int ENGINE_set_ciphers(ENGINE *e, ENGINE_CIPHERS_PTR f); --int ENGINE_set_digests(ENGINE *e, ENGINE_DIGESTS_PTR f); --int ENGINE_set_pkey_meths(ENGINE *e, ENGINE_PKEY_METHS_PTR f); --int ENGINE_set_pkey_asn1_meths(ENGINE *e, ENGINE_PKEY_ASN1_METHS_PTR f); --int ENGINE_set_flags(ENGINE *e, int flags); --int ENGINE_set_cmd_defns(ENGINE *e, const ENGINE_CMD_DEFN *defns); --/* These functions allow control over any per-structure ENGINE data. */ --#define ENGINE_get_ex_new_index(l, p, newf, dupf, freef) \ -- CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_ENGINE, l, p, newf, dupf, freef) --int ENGINE_set_ex_data(ENGINE *e, int idx, void *arg); --void *ENGINE_get_ex_data(const ENGINE *e, int idx); -- --#if OPENSSL_API_COMPAT < 0x10100000L --/* -- * This function previously cleaned up anything that needs it. Auto-deinit will -- * now take care of it so it is no longer required to call this function. -- */ --# define ENGINE_cleanup() while(0) continue --#endif -- --/* -- * These return values from within the ENGINE structure. These can be useful -- * with functional references as well as structural references - it depends -- * which you obtained. Using the result for functional purposes if you only -- * obtained a structural reference may be problematic! -- */ --const char *ENGINE_get_id(const ENGINE *e); --const char *ENGINE_get_name(const ENGINE *e); --const RSA_METHOD *ENGINE_get_RSA(const ENGINE *e); --const DSA_METHOD *ENGINE_get_DSA(const ENGINE *e); --const EC_KEY_METHOD *ENGINE_get_EC(const ENGINE *e); --const DH_METHOD *ENGINE_get_DH(const ENGINE *e); --const RAND_METHOD *ENGINE_get_RAND(const ENGINE *e); --ENGINE_GEN_INT_FUNC_PTR ENGINE_get_destroy_function(const ENGINE *e); --ENGINE_GEN_INT_FUNC_PTR ENGINE_get_init_function(const ENGINE *e); --ENGINE_GEN_INT_FUNC_PTR ENGINE_get_finish_function(const ENGINE *e); --ENGINE_CTRL_FUNC_PTR ENGINE_get_ctrl_function(const ENGINE *e); --ENGINE_LOAD_KEY_PTR ENGINE_get_load_privkey_function(const ENGINE *e); --ENGINE_LOAD_KEY_PTR ENGINE_get_load_pubkey_function(const ENGINE *e); --ENGINE_SSL_CLIENT_CERT_PTR ENGINE_get_ssl_client_cert_function(const ENGINE -- *e); --ENGINE_CIPHERS_PTR ENGINE_get_ciphers(const ENGINE *e); --ENGINE_DIGESTS_PTR ENGINE_get_digests(const ENGINE *e); --ENGINE_PKEY_METHS_PTR ENGINE_get_pkey_meths(const ENGINE *e); --ENGINE_PKEY_ASN1_METHS_PTR ENGINE_get_pkey_asn1_meths(const ENGINE *e); --const EVP_CIPHER *ENGINE_get_cipher(ENGINE *e, int nid); --const EVP_MD *ENGINE_get_digest(ENGINE *e, int nid); --const EVP_PKEY_METHOD *ENGINE_get_pkey_meth(ENGINE *e, int nid); --const EVP_PKEY_ASN1_METHOD *ENGINE_get_pkey_asn1_meth(ENGINE *e, int nid); --const EVP_PKEY_ASN1_METHOD *ENGINE_get_pkey_asn1_meth_str(ENGINE *e, -- const char *str, -- int len); --const EVP_PKEY_ASN1_METHOD *ENGINE_pkey_asn1_find_str(ENGINE **pe, -- const char *str, -- int len); --const ENGINE_CMD_DEFN *ENGINE_get_cmd_defns(const ENGINE *e); --int ENGINE_get_flags(const ENGINE *e); -- --/* -- * FUNCTIONAL functions. These functions deal with ENGINE structures that -- * have (or will) be initialised for use. Broadly speaking, the structural -- * functions are useful for iterating the list of available engine types, -- * creating new engine types, and other "list" operations. These functions -- * actually deal with ENGINEs that are to be used. As such these functions -- * can fail (if applicable) when particular engines are unavailable - eg. if -- * a hardware accelerator is not attached or not functioning correctly. Each -- * ENGINE has 2 reference counts; structural and functional. Every time a -- * functional reference is obtained or released, a corresponding structural -- * reference is automatically obtained or released too. -- */ -- --/* -- * Initialise a engine type for use (or up its reference count if it's -- * already in use). This will fail if the engine is not currently operational -- * and cannot initialise. -- */ --int ENGINE_init(ENGINE *e); --/* -- * Free a functional reference to a engine type. This does not require a -- * corresponding call to ENGINE_free as it also releases a structural -- * reference. -- */ --int ENGINE_finish(ENGINE *e); -- --/* -- * The following functions handle keys that are stored in some secondary -- * location, handled by the engine. The storage may be on a card or -- * whatever. -- */ --EVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id, -- UI_METHOD *ui_method, void *callback_data); --EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id, -- UI_METHOD *ui_method, void *callback_data); --int ENGINE_load_ssl_client_cert(ENGINE *e, SSL *s, -- STACK_OF(X509_NAME) *ca_dn, X509 **pcert, -- EVP_PKEY **ppkey, STACK_OF(X509) **pother, -- UI_METHOD *ui_method, void *callback_data); -- --/* -- * This returns a pointer for the current ENGINE structure that is (by -- * default) performing any RSA operations. The value returned is an -- * incremented reference, so it should be free'd (ENGINE_finish) before it is -- * discarded. -- */ --ENGINE *ENGINE_get_default_RSA(void); --/* Same for the other "methods" */ --ENGINE *ENGINE_get_default_DSA(void); --ENGINE *ENGINE_get_default_EC(void); --ENGINE *ENGINE_get_default_DH(void); --ENGINE *ENGINE_get_default_RAND(void); --/* -- * These functions can be used to get a functional reference to perform -- * ciphering or digesting corresponding to "nid". -- */ --ENGINE *ENGINE_get_cipher_engine(int nid); --ENGINE *ENGINE_get_digest_engine(int nid); --ENGINE *ENGINE_get_pkey_meth_engine(int nid); --ENGINE *ENGINE_get_pkey_asn1_meth_engine(int nid); -- --/* -- * This sets a new default ENGINE structure for performing RSA operations. If -- * the result is non-zero (success) then the ENGINE structure will have had -- * its reference count up'd so the caller should still free their own -- * reference 'e'. -- */ --int ENGINE_set_default_RSA(ENGINE *e); --int ENGINE_set_default_string(ENGINE *e, const char *def_list); --/* Same for the other "methods" */ --int ENGINE_set_default_DSA(ENGINE *e); --int ENGINE_set_default_EC(ENGINE *e); --int ENGINE_set_default_DH(ENGINE *e); --int ENGINE_set_default_RAND(ENGINE *e); --int ENGINE_set_default_ciphers(ENGINE *e); --int ENGINE_set_default_digests(ENGINE *e); --int ENGINE_set_default_pkey_meths(ENGINE *e); --int ENGINE_set_default_pkey_asn1_meths(ENGINE *e); -- --/* -- * The combination "set" - the flags are bitwise "OR"d from the -- * ENGINE_METHOD_*** defines above. As with the "ENGINE_register_complete()" -- * function, this function can result in unnecessary static linkage. If your -- * application requires only specific functionality, consider using more -- * selective functions. -- */ --int ENGINE_set_default(ENGINE *e, unsigned int flags); -- --void ENGINE_add_conf_module(void); -- --/* Deprecated functions ... */ --/* int ENGINE_clear_defaults(void); */ -- --/**************************/ --/* DYNAMIC ENGINE SUPPORT */ --/**************************/ -- --/* Binary/behaviour compatibility levels */ --# define OSSL_DYNAMIC_VERSION (unsigned long)0x00030000 --/* -- * Binary versions older than this are too old for us (whether we're a loader -- * or a loadee) -- */ --# define OSSL_DYNAMIC_OLDEST (unsigned long)0x00030000 -- --/* -- * When compiling an ENGINE entirely as an external shared library, loadable -- * by the "dynamic" ENGINE, these types are needed. The 'dynamic_fns' -- * structure type provides the calling application's (or library's) error -- * functionality and memory management function pointers to the loaded -- * library. These should be used/set in the loaded library code so that the -- * loading application's 'state' will be used/changed in all operations. The -- * 'static_state' pointer allows the loaded library to know if it shares the -- * same static data as the calling application (or library), and thus whether -- * these callbacks need to be set or not. -- */ --typedef void *(*dyn_MEM_malloc_fn) (size_t, const char *, int); --typedef void *(*dyn_MEM_realloc_fn) (void *, size_t, const char *, int); --typedef void (*dyn_MEM_free_fn) (void *, const char *, int); --typedef struct st_dynamic_MEM_fns { -- dyn_MEM_malloc_fn malloc_fn; -- dyn_MEM_realloc_fn realloc_fn; -- dyn_MEM_free_fn free_fn; --} dynamic_MEM_fns; --/* -- * FIXME: Perhaps the memory and locking code (crypto.h) should declare and -- * use these types so we (and any other dependent code) can simplify a bit?? -- */ --/* The top-level structure */ --typedef struct st_dynamic_fns { -- void *static_state; -- dynamic_MEM_fns mem_fns; --} dynamic_fns; -- --/* -- * The version checking function should be of this prototype. NB: The -- * ossl_version value passed in is the OSSL_DYNAMIC_VERSION of the loading -- * code. If this function returns zero, it indicates a (potential) version -- * incompatibility and the loaded library doesn't believe it can proceed. -- * Otherwise, the returned value is the (latest) version supported by the -- * loading library. The loader may still decide that the loaded code's -- * version is unsatisfactory and could veto the load. The function is -- * expected to be implemented with the symbol name "v_check", and a default -- * implementation can be fully instantiated with -- * IMPLEMENT_DYNAMIC_CHECK_FN(). -- */ --typedef unsigned long (*dynamic_v_check_fn) (unsigned long ossl_version); --# define IMPLEMENT_DYNAMIC_CHECK_FN() \ -- OPENSSL_EXPORT unsigned long v_check(unsigned long v); \ -- OPENSSL_EXPORT unsigned long v_check(unsigned long v) { \ -- if (v >= OSSL_DYNAMIC_OLDEST) return OSSL_DYNAMIC_VERSION; \ -- return 0; } -- --/* -- * This function is passed the ENGINE structure to initialise with its own -- * function and command settings. It should not adjust the structural or -- * functional reference counts. If this function returns zero, (a) the load -- * will be aborted, (b) the previous ENGINE state will be memcpy'd back onto -- * the structure, and (c) the shared library will be unloaded. So -- * implementations should do their own internal cleanup in failure -- * circumstances otherwise they could leak. The 'id' parameter, if non-NULL, -- * represents the ENGINE id that the loader is looking for. If this is NULL, -- * the shared library can choose to return failure or to initialise a -- * 'default' ENGINE. If non-NULL, the shared library must initialise only an -- * ENGINE matching the passed 'id'. The function is expected to be -- * implemented with the symbol name "bind_engine". A standard implementation -- * can be instantiated with IMPLEMENT_DYNAMIC_BIND_FN(fn) where the parameter -- * 'fn' is a callback function that populates the ENGINE structure and -- * returns an int value (zero for failure). 'fn' should have prototype; -- * [static] int fn(ENGINE *e, const char *id); -- */ --typedef int (*dynamic_bind_engine) (ENGINE *e, const char *id, -- const dynamic_fns *fns); --# define IMPLEMENT_DYNAMIC_BIND_FN(fn) \ -- OPENSSL_EXPORT \ -- int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns); \ -- OPENSSL_EXPORT \ -- int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns) { \ -- if (ENGINE_get_static_state() == fns->static_state) goto skip_cbs; \ -- CRYPTO_set_mem_functions(fns->mem_fns.malloc_fn, \ -- fns->mem_fns.realloc_fn, \ -- fns->mem_fns.free_fn); \ -- skip_cbs: \ -- if (!fn(e, id)) return 0; \ -- return 1; } -- --/* -- * If the loading application (or library) and the loaded ENGINE library -- * share the same static data (eg. they're both dynamically linked to the -- * same libcrypto.so) we need a way to avoid trying to set system callbacks - -- * this would fail, and for the same reason that it's unnecessary to try. If -- * the loaded ENGINE has (or gets from through the loader) its own copy of -- * the libcrypto static data, we will need to set the callbacks. The easiest -- * way to detect this is to have a function that returns a pointer to some -- * static data and let the loading application and loaded ENGINE compare -- * their respective values. -- */ --void *ENGINE_get_static_state(void); -- --# if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) --DEPRECATEDIN_1_1_0(void ENGINE_setup_bsd_cryptodev(void)) --# endif -- -- --# ifdef __cplusplus --} --# endif --# endif --#endif -diff --git a/uadk_tool/include/openssl/engineerr.h b/uadk_tool/include/openssl/engineerr.h -deleted file mode 100644 -index 05e84bd..0000000 ---- a/uadk_tool/include/openssl/engineerr.h -+++ /dev/null -@@ -1,111 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_ENGINEERR_H --# define HEADER_ENGINEERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# include -- --# ifndef OPENSSL_NO_ENGINE -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_ENGINE_strings(void); -- --/* -- * ENGINE function codes. -- */ --# define ENGINE_F_DIGEST_UPDATE 198 --# define ENGINE_F_DYNAMIC_CTRL 180 --# define ENGINE_F_DYNAMIC_GET_DATA_CTX 181 --# define ENGINE_F_DYNAMIC_LOAD 182 --# define ENGINE_F_DYNAMIC_SET_DATA_CTX 183 --# define ENGINE_F_ENGINE_ADD 105 --# define ENGINE_F_ENGINE_BY_ID 106 --# define ENGINE_F_ENGINE_CMD_IS_EXECUTABLE 170 --# define ENGINE_F_ENGINE_CTRL 142 --# define ENGINE_F_ENGINE_CTRL_CMD 178 --# define ENGINE_F_ENGINE_CTRL_CMD_STRING 171 --# define ENGINE_F_ENGINE_FINISH 107 --# define ENGINE_F_ENGINE_GET_CIPHER 185 --# define ENGINE_F_ENGINE_GET_DIGEST 186 --# define ENGINE_F_ENGINE_GET_FIRST 195 --# define ENGINE_F_ENGINE_GET_LAST 196 --# define ENGINE_F_ENGINE_GET_NEXT 115 --# define ENGINE_F_ENGINE_GET_PKEY_ASN1_METH 193 --# define ENGINE_F_ENGINE_GET_PKEY_METH 192 --# define ENGINE_F_ENGINE_GET_PREV 116 --# define ENGINE_F_ENGINE_INIT 119 --# define ENGINE_F_ENGINE_LIST_ADD 120 --# define ENGINE_F_ENGINE_LIST_REMOVE 121 --# define ENGINE_F_ENGINE_LOAD_PRIVATE_KEY 150 --# define ENGINE_F_ENGINE_LOAD_PUBLIC_KEY 151 --# define ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT 194 --# define ENGINE_F_ENGINE_NEW 122 --# define ENGINE_F_ENGINE_PKEY_ASN1_FIND_STR 197 --# define ENGINE_F_ENGINE_REMOVE 123 --# define ENGINE_F_ENGINE_SET_DEFAULT_STRING 189 --# define ENGINE_F_ENGINE_SET_ID 129 --# define ENGINE_F_ENGINE_SET_NAME 130 --# define ENGINE_F_ENGINE_TABLE_REGISTER 184 --# define ENGINE_F_ENGINE_UNLOCKED_FINISH 191 --# define ENGINE_F_ENGINE_UP_REF 190 --# define ENGINE_F_INT_CLEANUP_ITEM 199 --# define ENGINE_F_INT_CTRL_HELPER 172 --# define ENGINE_F_INT_ENGINE_CONFIGURE 188 --# define ENGINE_F_INT_ENGINE_MODULE_INIT 187 --# define ENGINE_F_OSSL_HMAC_INIT 200 -- --/* -- * ENGINE reason codes. -- */ --# define ENGINE_R_ALREADY_LOADED 100 --# define ENGINE_R_ARGUMENT_IS_NOT_A_NUMBER 133 --# define ENGINE_R_CMD_NOT_EXECUTABLE 134 --# define ENGINE_R_COMMAND_TAKES_INPUT 135 --# define ENGINE_R_COMMAND_TAKES_NO_INPUT 136 --# define ENGINE_R_CONFLICTING_ENGINE_ID 103 --# define ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED 119 --# define ENGINE_R_DSO_FAILURE 104 --# define ENGINE_R_DSO_NOT_FOUND 132 --# define ENGINE_R_ENGINES_SECTION_ERROR 148 --# define ENGINE_R_ENGINE_CONFIGURATION_ERROR 102 --# define ENGINE_R_ENGINE_IS_NOT_IN_LIST 105 --# define ENGINE_R_ENGINE_SECTION_ERROR 149 --# define ENGINE_R_FAILED_LOADING_PRIVATE_KEY 128 --# define ENGINE_R_FAILED_LOADING_PUBLIC_KEY 129 --# define ENGINE_R_FINISH_FAILED 106 --# define ENGINE_R_ID_OR_NAME_MISSING 108 --# define ENGINE_R_INIT_FAILED 109 --# define ENGINE_R_INTERNAL_LIST_ERROR 110 --# define ENGINE_R_INVALID_ARGUMENT 143 --# define ENGINE_R_INVALID_CMD_NAME 137 --# define ENGINE_R_INVALID_CMD_NUMBER 138 --# define ENGINE_R_INVALID_INIT_VALUE 151 --# define ENGINE_R_INVALID_STRING 150 --# define ENGINE_R_NOT_INITIALISED 117 --# define ENGINE_R_NOT_LOADED 112 --# define ENGINE_R_NO_CONTROL_FUNCTION 120 --# define ENGINE_R_NO_INDEX 144 --# define ENGINE_R_NO_LOAD_FUNCTION 125 --# define ENGINE_R_NO_REFERENCE 130 --# define ENGINE_R_NO_SUCH_ENGINE 116 --# define ENGINE_R_UNIMPLEMENTED_CIPHER 146 --# define ENGINE_R_UNIMPLEMENTED_DIGEST 147 --# define ENGINE_R_UNIMPLEMENTED_PUBLIC_KEY_METHOD 101 --# define ENGINE_R_VERSION_INCOMPATIBILITY 145 -- --# endif --#endif -diff --git a/uadk_tool/include/openssl/err.h b/uadk_tool/include/openssl/err.h -deleted file mode 100644 -index b49f881..0000000 ---- a/uadk_tool/include/openssl/err.h -+++ /dev/null -@@ -1,274 +0,0 @@ --/* -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_ERR_H --# define HEADER_ERR_H -- --# include -- --# ifndef OPENSSL_NO_STDIO --# include --# include --# endif -- --# include --# include --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --# ifndef OPENSSL_NO_ERR --# define ERR_PUT_error(a,b,c,d,e) ERR_put_error(a,b,c,d,e) --# else --# define ERR_PUT_error(a,b,c,d,e) ERR_put_error(a,b,c,NULL,0) --# endif -- --# include -- --# define ERR_TXT_MALLOCED 0x01 --# define ERR_TXT_STRING 0x02 -- --# define ERR_FLAG_MARK 0x01 --# define ERR_FLAG_CLEAR 0x02 -- --# define ERR_NUM_ERRORS 16 --typedef struct err_state_st { -- int err_flags[ERR_NUM_ERRORS]; -- unsigned long err_buffer[ERR_NUM_ERRORS]; -- char *err_data[ERR_NUM_ERRORS]; -- int err_data_flags[ERR_NUM_ERRORS]; -- const char *err_file[ERR_NUM_ERRORS]; -- int err_line[ERR_NUM_ERRORS]; -- int top, bottom; --} ERR_STATE; -- --/* library */ --# define ERR_LIB_NONE 1 --# define ERR_LIB_SYS 2 --# define ERR_LIB_BN 3 --# define ERR_LIB_RSA 4 --# define ERR_LIB_DH 5 --# define ERR_LIB_EVP 6 --# define ERR_LIB_BUF 7 --# define ERR_LIB_OBJ 8 --# define ERR_LIB_PEM 9 --# define ERR_LIB_DSA 10 --# define ERR_LIB_X509 11 --/* #define ERR_LIB_METH 12 */ --# define ERR_LIB_ASN1 13 --# define ERR_LIB_CONF 14 --# define ERR_LIB_CRYPTO 15 --# define ERR_LIB_EC 16 --# define ERR_LIB_SSL 20 --/* #define ERR_LIB_SSL23 21 */ --/* #define ERR_LIB_SSL2 22 */ --/* #define ERR_LIB_SSL3 23 */ --/* #define ERR_LIB_RSAREF 30 */ --/* #define ERR_LIB_PROXY 31 */ --# define ERR_LIB_BIO 32 --# define ERR_LIB_PKCS7 33 --# define ERR_LIB_X509V3 34 --# define ERR_LIB_PKCS12 35 --# define ERR_LIB_RAND 36 --# define ERR_LIB_DSO 37 --# define ERR_LIB_ENGINE 38 --# define ERR_LIB_OCSP 39 --# define ERR_LIB_UI 40 --# define ERR_LIB_COMP 41 --# define ERR_LIB_ECDSA 42 --# define ERR_LIB_ECDH 43 --# define ERR_LIB_OSSL_STORE 44 --# define ERR_LIB_FIPS 45 --# define ERR_LIB_CMS 46 --# define ERR_LIB_TS 47 --# define ERR_LIB_HMAC 48 --/* # define ERR_LIB_JPAKE 49 */ --# define ERR_LIB_CT 50 --# define ERR_LIB_ASYNC 51 --# define ERR_LIB_KDF 52 --# define ERR_LIB_SM2 53 -- --# define ERR_LIB_USER 128 -- --# define SYSerr(f,r) ERR_PUT_error(ERR_LIB_SYS,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define BNerr(f,r) ERR_PUT_error(ERR_LIB_BN,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define RSAerr(f,r) ERR_PUT_error(ERR_LIB_RSA,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define DHerr(f,r) ERR_PUT_error(ERR_LIB_DH,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define EVPerr(f,r) ERR_PUT_error(ERR_LIB_EVP,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define BUFerr(f,r) ERR_PUT_error(ERR_LIB_BUF,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define OBJerr(f,r) ERR_PUT_error(ERR_LIB_OBJ,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define PEMerr(f,r) ERR_PUT_error(ERR_LIB_PEM,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define DSAerr(f,r) ERR_PUT_error(ERR_LIB_DSA,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define X509err(f,r) ERR_PUT_error(ERR_LIB_X509,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define ASN1err(f,r) ERR_PUT_error(ERR_LIB_ASN1,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define CONFerr(f,r) ERR_PUT_error(ERR_LIB_CONF,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define CRYPTOerr(f,r) ERR_PUT_error(ERR_LIB_CRYPTO,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define ECerr(f,r) ERR_PUT_error(ERR_LIB_EC,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define SSLerr(f,r) ERR_PUT_error(ERR_LIB_SSL,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define BIOerr(f,r) ERR_PUT_error(ERR_LIB_BIO,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define PKCS7err(f,r) ERR_PUT_error(ERR_LIB_PKCS7,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define X509V3err(f,r) ERR_PUT_error(ERR_LIB_X509V3,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define PKCS12err(f,r) ERR_PUT_error(ERR_LIB_PKCS12,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define RANDerr(f,r) ERR_PUT_error(ERR_LIB_RAND,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define DSOerr(f,r) ERR_PUT_error(ERR_LIB_DSO,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define ENGINEerr(f,r) ERR_PUT_error(ERR_LIB_ENGINE,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define OCSPerr(f,r) ERR_PUT_error(ERR_LIB_OCSP,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define UIerr(f,r) ERR_PUT_error(ERR_LIB_UI,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define COMPerr(f,r) ERR_PUT_error(ERR_LIB_COMP,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define ECDSAerr(f,r) ERR_PUT_error(ERR_LIB_ECDSA,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define ECDHerr(f,r) ERR_PUT_error(ERR_LIB_ECDH,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define OSSL_STOREerr(f,r) ERR_PUT_error(ERR_LIB_OSSL_STORE,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define FIPSerr(f,r) ERR_PUT_error(ERR_LIB_FIPS,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define CMSerr(f,r) ERR_PUT_error(ERR_LIB_CMS,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define TSerr(f,r) ERR_PUT_error(ERR_LIB_TS,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define HMACerr(f,r) ERR_PUT_error(ERR_LIB_HMAC,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define CTerr(f,r) ERR_PUT_error(ERR_LIB_CT,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define ASYNCerr(f,r) ERR_PUT_error(ERR_LIB_ASYNC,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define KDFerr(f,r) ERR_PUT_error(ERR_LIB_KDF,(f),(r),OPENSSL_FILE,OPENSSL_LINE) --# define SM2err(f,r) ERR_PUT_error(ERR_LIB_SM2,(f),(r),OPENSSL_FILE,OPENSSL_LINE) -- --# define ERR_PACK(l,f,r) ( \ -- (((unsigned int)(l) & 0x0FF) << 24L) | \ -- (((unsigned int)(f) & 0xFFF) << 12L) | \ -- (((unsigned int)(r) & 0xFFF) ) ) --# define ERR_GET_LIB(l) (int)(((l) >> 24L) & 0x0FFL) --# define ERR_GET_FUNC(l) (int)(((l) >> 12L) & 0xFFFL) --# define ERR_GET_REASON(l) (int)( (l) & 0xFFFL) --# define ERR_FATAL_ERROR(l) (int)( (l) & ERR_R_FATAL) -- --/* OS functions */ --# define SYS_F_FOPEN 1 --# define SYS_F_CONNECT 2 --# define SYS_F_GETSERVBYNAME 3 --# define SYS_F_SOCKET 4 --# define SYS_F_IOCTLSOCKET 5 --# define SYS_F_BIND 6 --# define SYS_F_LISTEN 7 --# define SYS_F_ACCEPT 8 --# define SYS_F_WSASTARTUP 9/* Winsock stuff */ --# define SYS_F_OPENDIR 10 --# define SYS_F_FREAD 11 --# define SYS_F_GETADDRINFO 12 --# define SYS_F_GETNAMEINFO 13 --# define SYS_F_SETSOCKOPT 14 --# define SYS_F_GETSOCKOPT 15 --# define SYS_F_GETSOCKNAME 16 --# define SYS_F_GETHOSTBYNAME 17 --# define SYS_F_FFLUSH 18 --# define SYS_F_OPEN 19 --# define SYS_F_CLOSE 20 --# define SYS_F_IOCTL 21 --# define SYS_F_STAT 22 --# define SYS_F_FCNTL 23 --# define SYS_F_FSTAT 24 -- --/* reasons */ --# define ERR_R_SYS_LIB ERR_LIB_SYS/* 2 */ --# define ERR_R_BN_LIB ERR_LIB_BN/* 3 */ --# define ERR_R_RSA_LIB ERR_LIB_RSA/* 4 */ --# define ERR_R_DH_LIB ERR_LIB_DH/* 5 */ --# define ERR_R_EVP_LIB ERR_LIB_EVP/* 6 */ --# define ERR_R_BUF_LIB ERR_LIB_BUF/* 7 */ --# define ERR_R_OBJ_LIB ERR_LIB_OBJ/* 8 */ --# define ERR_R_PEM_LIB ERR_LIB_PEM/* 9 */ --# define ERR_R_DSA_LIB ERR_LIB_DSA/* 10 */ --# define ERR_R_X509_LIB ERR_LIB_X509/* 11 */ --# define ERR_R_ASN1_LIB ERR_LIB_ASN1/* 13 */ --# define ERR_R_EC_LIB ERR_LIB_EC/* 16 */ --# define ERR_R_BIO_LIB ERR_LIB_BIO/* 32 */ --# define ERR_R_PKCS7_LIB ERR_LIB_PKCS7/* 33 */ --# define ERR_R_X509V3_LIB ERR_LIB_X509V3/* 34 */ --# define ERR_R_ENGINE_LIB ERR_LIB_ENGINE/* 38 */ --# define ERR_R_UI_LIB ERR_LIB_UI/* 40 */ --# define ERR_R_ECDSA_LIB ERR_LIB_ECDSA/* 42 */ --# define ERR_R_OSSL_STORE_LIB ERR_LIB_OSSL_STORE/* 44 */ -- --# define ERR_R_NESTED_ASN1_ERROR 58 --# define ERR_R_MISSING_ASN1_EOS 63 -- --/* fatal error */ --# define ERR_R_FATAL 64 --# define ERR_R_MALLOC_FAILURE (1|ERR_R_FATAL) --# define ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED (2|ERR_R_FATAL) --# define ERR_R_PASSED_NULL_PARAMETER (3|ERR_R_FATAL) --# define ERR_R_INTERNAL_ERROR (4|ERR_R_FATAL) --# define ERR_R_DISABLED (5|ERR_R_FATAL) --# define ERR_R_INIT_FAIL (6|ERR_R_FATAL) --# define ERR_R_PASSED_INVALID_ARGUMENT (7) --# define ERR_R_OPERATION_FAIL (8|ERR_R_FATAL) -- --/* -- * 99 is the maximum possible ERR_R_... code, higher values are reserved for -- * the individual libraries -- */ -- --typedef struct ERR_string_data_st { -- unsigned long error; -- const char *string; --} ERR_STRING_DATA; -- --DEFINE_LHASH_OF(ERR_STRING_DATA); -- --void ERR_put_error(int lib, int func, int reason, const char *file, int line); --void ERR_set_error_data(char *data, int flags); -- --unsigned long ERR_get_error(void); --unsigned long ERR_get_error_line(const char **file, int *line); --unsigned long ERR_get_error_line_data(const char **file, int *line, -- const char **data, int *flags); --unsigned long ERR_peek_error(void); --unsigned long ERR_peek_error_line(const char **file, int *line); --unsigned long ERR_peek_error_line_data(const char **file, int *line, -- const char **data, int *flags); --unsigned long ERR_peek_last_error(void); --unsigned long ERR_peek_last_error_line(const char **file, int *line); --unsigned long ERR_peek_last_error_line_data(const char **file, int *line, -- const char **data, int *flags); --void ERR_clear_error(void); --char *ERR_error_string(unsigned long e, char *buf); --void ERR_error_string_n(unsigned long e, char *buf, size_t len); --const char *ERR_lib_error_string(unsigned long e); --const char *ERR_func_error_string(unsigned long e); --const char *ERR_reason_error_string(unsigned long e); --void ERR_print_errors_cb(int (*cb) (const char *str, size_t len, void *u), -- void *u); --# ifndef OPENSSL_NO_STDIO --void ERR_print_errors_fp(FILE *fp); --# endif --void ERR_print_errors(BIO *bp); --void ERR_add_error_data(int num, ...); --void ERR_add_error_vdata(int num, va_list args); --int ERR_load_strings(int lib, ERR_STRING_DATA *str); --int ERR_load_strings_const(const ERR_STRING_DATA *str); --int ERR_unload_strings(int lib, ERR_STRING_DATA *str); --int ERR_load_ERR_strings(void); -- --#if OPENSSL_API_COMPAT < 0x10100000L --# define ERR_load_crypto_strings() \ -- OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL) --# define ERR_free_strings() while(0) continue --#endif -- --DEPRECATEDIN_1_1_0(void ERR_remove_thread_state(void *)) --DEPRECATEDIN_1_0_0(void ERR_remove_state(unsigned long pid)) --ERR_STATE *ERR_get_state(void); -- --int ERR_get_next_error_library(void); -- --int ERR_set_mark(void); --int ERR_pop_to_mark(void); --int ERR_clear_last_mark(void); -- --#ifdef __cplusplus --} --#endif -- --#endif -diff --git a/uadk_tool/include/openssl/evp.h b/uadk_tool/include/openssl/evp.h -deleted file mode 100644 -index a411f3f..0000000 ---- a/uadk_tool/include/openssl/evp.h -+++ /dev/null -@@ -1,1666 +0,0 @@ --/* -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_ENVELOPE_H --# define HEADER_ENVELOPE_H -- --# include --# include --# include --# include --# include -- --# define EVP_MAX_MD_SIZE 64/* longest known is SHA512 */ --# define EVP_MAX_KEY_LENGTH 64 --# define EVP_MAX_IV_LENGTH 16 --# define EVP_MAX_BLOCK_LENGTH 32 -- --# define PKCS5_SALT_LEN 8 --/* Default PKCS#5 iteration count */ --# define PKCS5_DEFAULT_ITER 2048 -- --# include -- --# define EVP_PK_RSA 0x0001 --# define EVP_PK_DSA 0x0002 --# define EVP_PK_DH 0x0004 --# define EVP_PK_EC 0x0008 --# define EVP_PKT_SIGN 0x0010 --# define EVP_PKT_ENC 0x0020 --# define EVP_PKT_EXCH 0x0040 --# define EVP_PKS_RSA 0x0100 --# define EVP_PKS_DSA 0x0200 --# define EVP_PKS_EC 0x0400 -- --# define EVP_PKEY_NONE NID_undef --# define EVP_PKEY_RSA NID_rsaEncryption --# define EVP_PKEY_RSA2 NID_rsa --# define EVP_PKEY_RSA_PSS NID_rsassaPss --# define EVP_PKEY_DSA NID_dsa --# define EVP_PKEY_DSA1 NID_dsa_2 --# define EVP_PKEY_DSA2 NID_dsaWithSHA --# define EVP_PKEY_DSA3 NID_dsaWithSHA1 --# define EVP_PKEY_DSA4 NID_dsaWithSHA1_2 --# define EVP_PKEY_DH NID_dhKeyAgreement --# define EVP_PKEY_DHX NID_dhpublicnumber --# define EVP_PKEY_EC NID_X9_62_id_ecPublicKey --# define EVP_PKEY_SM2 NID_sm2 --# define EVP_PKEY_HMAC NID_hmac --# define EVP_PKEY_CMAC NID_cmac --# define EVP_PKEY_SCRYPT NID_id_scrypt --# define EVP_PKEY_TLS1_PRF NID_tls1_prf --# define EVP_PKEY_HKDF NID_hkdf --# define EVP_PKEY_POLY1305 NID_poly1305 --# define EVP_PKEY_SIPHASH NID_siphash --# define EVP_PKEY_X25519 NID_X25519 --# define EVP_PKEY_ED25519 NID_ED25519 --# define EVP_PKEY_X448 NID_X448 --# define EVP_PKEY_ED448 NID_ED448 -- --#ifdef __cplusplus --extern "C" { --#endif -- --# define EVP_PKEY_MO_SIGN 0x0001 --# define EVP_PKEY_MO_VERIFY 0x0002 --# define EVP_PKEY_MO_ENCRYPT 0x0004 --# define EVP_PKEY_MO_DECRYPT 0x0008 -- --# ifndef EVP_MD --EVP_MD *EVP_MD_meth_new(int md_type, int pkey_type); --EVP_MD *EVP_MD_meth_dup(const EVP_MD *md); --void EVP_MD_meth_free(EVP_MD *md); -- --int EVP_MD_meth_set_input_blocksize(EVP_MD *md, int blocksize); --int EVP_MD_meth_set_result_size(EVP_MD *md, int resultsize); --int EVP_MD_meth_set_app_datasize(EVP_MD *md, int datasize); --int EVP_MD_meth_set_flags(EVP_MD *md, unsigned long flags); --int EVP_MD_meth_set_init(EVP_MD *md, int (*init)(EVP_MD_CTX *ctx)); --int EVP_MD_meth_set_update(EVP_MD *md, int (*update)(EVP_MD_CTX *ctx, -- const void *data, -- size_t count)); --int EVP_MD_meth_set_final(EVP_MD *md, int (*final)(EVP_MD_CTX *ctx, -- unsigned char *md)); --int EVP_MD_meth_set_copy(EVP_MD *md, int (*copy)(EVP_MD_CTX *to, -- const EVP_MD_CTX *from)); --int EVP_MD_meth_set_cleanup(EVP_MD *md, int (*cleanup)(EVP_MD_CTX *ctx)); --int EVP_MD_meth_set_ctrl(EVP_MD *md, int (*ctrl)(EVP_MD_CTX *ctx, int cmd, -- int p1, void *p2)); -- --int EVP_MD_meth_get_input_blocksize(const EVP_MD *md); --int EVP_MD_meth_get_result_size(const EVP_MD *md); --int EVP_MD_meth_get_app_datasize(const EVP_MD *md); --unsigned long EVP_MD_meth_get_flags(const EVP_MD *md); --int (*EVP_MD_meth_get_init(const EVP_MD *md))(EVP_MD_CTX *ctx); --int (*EVP_MD_meth_get_update(const EVP_MD *md))(EVP_MD_CTX *ctx, -- const void *data, -- size_t count); --int (*EVP_MD_meth_get_final(const EVP_MD *md))(EVP_MD_CTX *ctx, -- unsigned char *md); --int (*EVP_MD_meth_get_copy(const EVP_MD *md))(EVP_MD_CTX *to, -- const EVP_MD_CTX *from); --int (*EVP_MD_meth_get_cleanup(const EVP_MD *md))(EVP_MD_CTX *ctx); --int (*EVP_MD_meth_get_ctrl(const EVP_MD *md))(EVP_MD_CTX *ctx, int cmd, -- int p1, void *p2); -- --/* digest can only handle a single block */ --# define EVP_MD_FLAG_ONESHOT 0x0001 -- --/* digest is extensible-output function, XOF */ --# define EVP_MD_FLAG_XOF 0x0002 -- --/* DigestAlgorithmIdentifier flags... */ -- --# define EVP_MD_FLAG_DIGALGID_MASK 0x0018 -- --/* NULL or absent parameter accepted. Use NULL */ -- --# define EVP_MD_FLAG_DIGALGID_NULL 0x0000 -- --/* NULL or absent parameter accepted. Use NULL for PKCS#1 otherwise absent */ -- --# define EVP_MD_FLAG_DIGALGID_ABSENT 0x0008 -- --/* Custom handling via ctrl */ -- --# define EVP_MD_FLAG_DIGALGID_CUSTOM 0x0018 -- --/* Note if suitable for use in FIPS mode */ --# define EVP_MD_FLAG_FIPS 0x0400 -- --/* Digest ctrls */ -- --# define EVP_MD_CTRL_DIGALGID 0x1 --# define EVP_MD_CTRL_MICALG 0x2 --# define EVP_MD_CTRL_XOF_LEN 0x3 -- --/* Minimum Algorithm specific ctrl value */ -- --# define EVP_MD_CTRL_ALG_CTRL 0x1000 -- --# endif /* !EVP_MD */ -- --/* values for EVP_MD_CTX flags */ -- --# define EVP_MD_CTX_FLAG_ONESHOT 0x0001/* digest update will be -- * called once only */ --# define EVP_MD_CTX_FLAG_CLEANED 0x0002/* context has already been -- * cleaned */ --# define EVP_MD_CTX_FLAG_REUSE 0x0004/* Don't free up ctx->md_data -- * in EVP_MD_CTX_reset */ --/* -- * FIPS and pad options are ignored in 1.0.0, definitions are here so we -- * don't accidentally reuse the values for other purposes. -- */ -- --# define EVP_MD_CTX_FLAG_NON_FIPS_ALLOW 0x0008/* Allow use of non FIPS -- * digest in FIPS mode */ -- --/* -- * The following PAD options are also currently ignored in 1.0.0, digest -- * parameters are handled through EVP_DigestSign*() and EVP_DigestVerify*() -- * instead. -- */ --# define EVP_MD_CTX_FLAG_PAD_MASK 0xF0/* RSA mode to use */ --# define EVP_MD_CTX_FLAG_PAD_PKCS1 0x00/* PKCS#1 v1.5 mode */ --# define EVP_MD_CTX_FLAG_PAD_X931 0x10/* X9.31 mode */ --# define EVP_MD_CTX_FLAG_PAD_PSS 0x20/* PSS mode */ -- --# define EVP_MD_CTX_FLAG_NO_INIT 0x0100/* Don't initialize md_data */ --/* -- * Some functions such as EVP_DigestSign only finalise copies of internal -- * contexts so additional data can be included after the finalisation call. -- * This is inefficient if this functionality is not required: it is disabled -- * if the following flag is set. -- */ --# define EVP_MD_CTX_FLAG_FINALISE 0x0200 --/* NOTE: 0x0400 is reserved for internal usage */ -- --EVP_CIPHER *EVP_CIPHER_meth_new(int cipher_type, int block_size, int key_len); --EVP_CIPHER *EVP_CIPHER_meth_dup(const EVP_CIPHER *cipher); --void EVP_CIPHER_meth_free(EVP_CIPHER *cipher); -- --int EVP_CIPHER_meth_set_iv_length(EVP_CIPHER *cipher, int iv_len); --int EVP_CIPHER_meth_set_flags(EVP_CIPHER *cipher, unsigned long flags); --int EVP_CIPHER_meth_set_impl_ctx_size(EVP_CIPHER *cipher, int ctx_size); --int EVP_CIPHER_meth_set_init(EVP_CIPHER *cipher, -- int (*init) (EVP_CIPHER_CTX *ctx, -- const unsigned char *key, -- const unsigned char *iv, -- int enc)); --int EVP_CIPHER_meth_set_do_cipher(EVP_CIPHER *cipher, -- int (*do_cipher) (EVP_CIPHER_CTX *ctx, -- unsigned char *out, -- const unsigned char *in, -- size_t inl)); --int EVP_CIPHER_meth_set_cleanup(EVP_CIPHER *cipher, -- int (*cleanup) (EVP_CIPHER_CTX *)); --int EVP_CIPHER_meth_set_set_asn1_params(EVP_CIPHER *cipher, -- int (*set_asn1_parameters) (EVP_CIPHER_CTX *, -- ASN1_TYPE *)); --int EVP_CIPHER_meth_set_get_asn1_params(EVP_CIPHER *cipher, -- int (*get_asn1_parameters) (EVP_CIPHER_CTX *, -- ASN1_TYPE *)); --int EVP_CIPHER_meth_set_ctrl(EVP_CIPHER *cipher, -- int (*ctrl) (EVP_CIPHER_CTX *, int type, -- int arg, void *ptr)); -- --int (*EVP_CIPHER_meth_get_init(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *ctx, -- const unsigned char *key, -- const unsigned char *iv, -- int enc); --int (*EVP_CIPHER_meth_get_do_cipher(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *ctx, -- unsigned char *out, -- const unsigned char *in, -- size_t inl); --int (*EVP_CIPHER_meth_get_cleanup(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *); --int (*EVP_CIPHER_meth_get_set_asn1_params(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *, -- ASN1_TYPE *); --int (*EVP_CIPHER_meth_get_get_asn1_params(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *, -- ASN1_TYPE *); --int (*EVP_CIPHER_meth_get_ctrl(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *, -- int type, int arg, -- void *ptr); -- --/* Values for cipher flags */ -- --/* Modes for ciphers */ -- --# define EVP_CIPH_STREAM_CIPHER 0x0 --# define EVP_CIPH_ECB_MODE 0x1 --# define EVP_CIPH_CBC_MODE 0x2 --# define EVP_CIPH_CFB_MODE 0x3 --# define EVP_CIPH_OFB_MODE 0x4 --# define EVP_CIPH_CTR_MODE 0x5 --# define EVP_CIPH_GCM_MODE 0x6 --# define EVP_CIPH_CCM_MODE 0x7 --# define EVP_CIPH_XTS_MODE 0x10001 --# define EVP_CIPH_WRAP_MODE 0x10002 --# define EVP_CIPH_OCB_MODE 0x10003 --# define EVP_CIPH_MODE 0xF0007 --/* Set if variable length cipher */ --# define EVP_CIPH_VARIABLE_LENGTH 0x8 --/* Set if the iv handling should be done by the cipher itself */ --# define EVP_CIPH_CUSTOM_IV 0x10 --/* Set if the cipher's init() function should be called if key is NULL */ --# define EVP_CIPH_ALWAYS_CALL_INIT 0x20 --/* Call ctrl() to init cipher parameters */ --# define EVP_CIPH_CTRL_INIT 0x40 --/* Don't use standard key length function */ --# define EVP_CIPH_CUSTOM_KEY_LENGTH 0x80 --/* Don't use standard block padding */ --# define EVP_CIPH_NO_PADDING 0x100 --/* cipher handles random key generation */ --# define EVP_CIPH_RAND_KEY 0x200 --/* cipher has its own additional copying logic */ --# define EVP_CIPH_CUSTOM_COPY 0x400 --/* Don't use standard iv length function */ --# define EVP_CIPH_CUSTOM_IV_LENGTH 0x800 --/* Allow use default ASN1 get/set iv */ --# define EVP_CIPH_FLAG_DEFAULT_ASN1 0x1000 --/* Buffer length in bits not bytes: CFB1 mode only */ --# define EVP_CIPH_FLAG_LENGTH_BITS 0x2000 --/* Note if suitable for use in FIPS mode */ --# define EVP_CIPH_FLAG_FIPS 0x4000 --/* Allow non FIPS cipher in FIPS mode */ --# define EVP_CIPH_FLAG_NON_FIPS_ALLOW 0x8000 --/* -- * Cipher handles any and all padding logic as well as finalisation. -- */ --# define EVP_CIPH_FLAG_CUSTOM_CIPHER 0x100000 --# define EVP_CIPH_FLAG_AEAD_CIPHER 0x200000 --# define EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK 0x400000 --/* Cipher can handle pipeline operations */ --# define EVP_CIPH_FLAG_PIPELINE 0X800000 -- --/* -- * Cipher context flag to indicate we can handle wrap mode: if allowed in -- * older applications it could overflow buffers. -- */ -- --# define EVP_CIPHER_CTX_FLAG_WRAP_ALLOW 0x1 -- --/* ctrl() values */ -- --# define EVP_CTRL_INIT 0x0 --# define EVP_CTRL_SET_KEY_LENGTH 0x1 --# define EVP_CTRL_GET_RC2_KEY_BITS 0x2 --# define EVP_CTRL_SET_RC2_KEY_BITS 0x3 --# define EVP_CTRL_GET_RC5_ROUNDS 0x4 --# define EVP_CTRL_SET_RC5_ROUNDS 0x5 --# define EVP_CTRL_RAND_KEY 0x6 --# define EVP_CTRL_PBE_PRF_NID 0x7 --# define EVP_CTRL_COPY 0x8 --# define EVP_CTRL_AEAD_SET_IVLEN 0x9 --# define EVP_CTRL_AEAD_GET_TAG 0x10 --# define EVP_CTRL_AEAD_SET_TAG 0x11 --# define EVP_CTRL_AEAD_SET_IV_FIXED 0x12 --# define EVP_CTRL_GCM_SET_IVLEN EVP_CTRL_AEAD_SET_IVLEN --# define EVP_CTRL_GCM_GET_TAG EVP_CTRL_AEAD_GET_TAG --# define EVP_CTRL_GCM_SET_TAG EVP_CTRL_AEAD_SET_TAG --# define EVP_CTRL_GCM_SET_IV_FIXED EVP_CTRL_AEAD_SET_IV_FIXED --# define EVP_CTRL_GCM_IV_GEN 0x13 --# define EVP_CTRL_CCM_SET_IVLEN EVP_CTRL_AEAD_SET_IVLEN --# define EVP_CTRL_CCM_GET_TAG EVP_CTRL_AEAD_GET_TAG --# define EVP_CTRL_CCM_SET_TAG EVP_CTRL_AEAD_SET_TAG --# define EVP_CTRL_CCM_SET_IV_FIXED EVP_CTRL_AEAD_SET_IV_FIXED --# define EVP_CTRL_CCM_SET_L 0x14 --# define EVP_CTRL_CCM_SET_MSGLEN 0x15 --/* -- * AEAD cipher deduces payload length and returns number of bytes required to -- * store MAC and eventual padding. Subsequent call to EVP_Cipher even -- * appends/verifies MAC. -- */ --# define EVP_CTRL_AEAD_TLS1_AAD 0x16 --/* Used by composite AEAD ciphers, no-op in GCM, CCM... */ --# define EVP_CTRL_AEAD_SET_MAC_KEY 0x17 --/* Set the GCM invocation field, decrypt only */ --# define EVP_CTRL_GCM_SET_IV_INV 0x18 -- --# define EVP_CTRL_TLS1_1_MULTIBLOCK_AAD 0x19 --# define EVP_CTRL_TLS1_1_MULTIBLOCK_ENCRYPT 0x1a --# define EVP_CTRL_TLS1_1_MULTIBLOCK_DECRYPT 0x1b --# define EVP_CTRL_TLS1_1_MULTIBLOCK_MAX_BUFSIZE 0x1c -- --# define EVP_CTRL_SSL3_MASTER_SECRET 0x1d -- --/* EVP_CTRL_SET_SBOX takes the char * specifying S-boxes */ --# define EVP_CTRL_SET_SBOX 0x1e --/* -- * EVP_CTRL_SBOX_USED takes a 'size_t' and 'char *', pointing at a -- * pre-allocated buffer with specified size -- */ --# define EVP_CTRL_SBOX_USED 0x1f --/* EVP_CTRL_KEY_MESH takes 'size_t' number of bytes to mesh the key after, -- * 0 switches meshing off -- */ --# define EVP_CTRL_KEY_MESH 0x20 --/* EVP_CTRL_BLOCK_PADDING_MODE takes the padding mode */ --# define EVP_CTRL_BLOCK_PADDING_MODE 0x21 -- --/* Set the output buffers to use for a pipelined operation */ --# define EVP_CTRL_SET_PIPELINE_OUTPUT_BUFS 0x22 --/* Set the input buffers to use for a pipelined operation */ --# define EVP_CTRL_SET_PIPELINE_INPUT_BUFS 0x23 --/* Set the input buffer lengths to use for a pipelined operation */ --# define EVP_CTRL_SET_PIPELINE_INPUT_LENS 0x24 -- --# define EVP_CTRL_GET_IVLEN 0x25 -- --/* Padding modes */ --#define EVP_PADDING_PKCS7 1 --#define EVP_PADDING_ISO7816_4 2 --#define EVP_PADDING_ANSI923 3 --#define EVP_PADDING_ISO10126 4 --#define EVP_PADDING_ZERO 5 -- --/* RFC 5246 defines additional data to be 13 bytes in length */ --# define EVP_AEAD_TLS1_AAD_LEN 13 -- --typedef struct { -- unsigned char *out; -- const unsigned char *inp; -- size_t len; -- unsigned int interleave; --} EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM; -- --/* GCM TLS constants */ --/* Length of fixed part of IV derived from PRF */ --# define EVP_GCM_TLS_FIXED_IV_LEN 4 --/* Length of explicit part of IV part of TLS records */ --# define EVP_GCM_TLS_EXPLICIT_IV_LEN 8 --/* Length of tag for TLS */ --# define EVP_GCM_TLS_TAG_LEN 16 -- --/* CCM TLS constants */ --/* Length of fixed part of IV derived from PRF */ --# define EVP_CCM_TLS_FIXED_IV_LEN 4 --/* Length of explicit part of IV part of TLS records */ --# define EVP_CCM_TLS_EXPLICIT_IV_LEN 8 --/* Total length of CCM IV length for TLS */ --# define EVP_CCM_TLS_IV_LEN 12 --/* Length of tag for TLS */ --# define EVP_CCM_TLS_TAG_LEN 16 --/* Length of CCM8 tag for TLS */ --# define EVP_CCM8_TLS_TAG_LEN 8 -- --/* Length of tag for TLS */ --# define EVP_CHACHAPOLY_TLS_TAG_LEN 16 -- --typedef struct evp_cipher_info_st { -- const EVP_CIPHER *cipher; -- unsigned char iv[EVP_MAX_IV_LENGTH]; --} EVP_CIPHER_INFO; -- -- --/* Password based encryption function */ --typedef int (EVP_PBE_KEYGEN) (EVP_CIPHER_CTX *ctx, const char *pass, -- int passlen, ASN1_TYPE *param, -- const EVP_CIPHER *cipher, const EVP_MD *md, -- int en_de); -- --# ifndef OPENSSL_NO_RSA --# define EVP_PKEY_assign_RSA(pkey,rsa) EVP_PKEY_assign((pkey),EVP_PKEY_RSA,\ -- (char *)(rsa)) --# endif -- --# ifndef OPENSSL_NO_DSA --# define EVP_PKEY_assign_DSA(pkey,dsa) EVP_PKEY_assign((pkey),EVP_PKEY_DSA,\ -- (char *)(dsa)) --# endif -- --# ifndef OPENSSL_NO_DH --# define EVP_PKEY_assign_DH(pkey,dh) EVP_PKEY_assign((pkey),EVP_PKEY_DH,\ -- (char *)(dh)) --# endif -- --# ifndef OPENSSL_NO_EC --# define EVP_PKEY_assign_EC_KEY(pkey,eckey) EVP_PKEY_assign((pkey),EVP_PKEY_EC,\ -- (char *)(eckey)) --# endif --# ifndef OPENSSL_NO_SIPHASH --# define EVP_PKEY_assign_SIPHASH(pkey,shkey) EVP_PKEY_assign((pkey),EVP_PKEY_SIPHASH,\ -- (char *)(shkey)) --# endif -- --# ifndef OPENSSL_NO_POLY1305 --# define EVP_PKEY_assign_POLY1305(pkey,polykey) EVP_PKEY_assign((pkey),EVP_PKEY_POLY1305,\ -- (char *)(polykey)) --# endif -- --/* Add some extra combinations */ --# define EVP_get_digestbynid(a) EVP_get_digestbyname(OBJ_nid2sn(a)) --# define EVP_get_digestbyobj(a) EVP_get_digestbynid(OBJ_obj2nid(a)) --# define EVP_get_cipherbynid(a) EVP_get_cipherbyname(OBJ_nid2sn(a)) --# define EVP_get_cipherbyobj(a) EVP_get_cipherbynid(OBJ_obj2nid(a)) -- --int EVP_MD_type(const EVP_MD *md); --# define EVP_MD_nid(e) EVP_MD_type(e) --# define EVP_MD_name(e) OBJ_nid2sn(EVP_MD_nid(e)) --int EVP_MD_pkey_type(const EVP_MD *md); --int EVP_MD_size(const EVP_MD *md); --int EVP_MD_block_size(const EVP_MD *md); --unsigned long EVP_MD_flags(const EVP_MD *md); -- --const EVP_MD *EVP_MD_CTX_md(const EVP_MD_CTX *ctx); --int (*EVP_MD_CTX_update_fn(EVP_MD_CTX *ctx))(EVP_MD_CTX *ctx, -- const void *data, size_t count); --void EVP_MD_CTX_set_update_fn(EVP_MD_CTX *ctx, -- int (*update) (EVP_MD_CTX *ctx, -- const void *data, size_t count)); --# define EVP_MD_CTX_size(e) EVP_MD_size(EVP_MD_CTX_md(e)) --# define EVP_MD_CTX_block_size(e) EVP_MD_block_size(EVP_MD_CTX_md(e)) --# define EVP_MD_CTX_type(e) EVP_MD_type(EVP_MD_CTX_md(e)) --EVP_PKEY_CTX *EVP_MD_CTX_pkey_ctx(const EVP_MD_CTX *ctx); --void EVP_MD_CTX_set_pkey_ctx(EVP_MD_CTX *ctx, EVP_PKEY_CTX *pctx); --void *EVP_MD_CTX_md_data(const EVP_MD_CTX *ctx); -- --int EVP_CIPHER_nid(const EVP_CIPHER *cipher); --# define EVP_CIPHER_name(e) OBJ_nid2sn(EVP_CIPHER_nid(e)) --int EVP_CIPHER_block_size(const EVP_CIPHER *cipher); --int EVP_CIPHER_impl_ctx_size(const EVP_CIPHER *cipher); --int EVP_CIPHER_key_length(const EVP_CIPHER *cipher); --int EVP_CIPHER_iv_length(const EVP_CIPHER *cipher); --unsigned long EVP_CIPHER_flags(const EVP_CIPHER *cipher); --# define EVP_CIPHER_mode(e) (EVP_CIPHER_flags(e) & EVP_CIPH_MODE) -- --const EVP_CIPHER *EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *ctx); --int EVP_CIPHER_CTX_encrypting(const EVP_CIPHER_CTX *ctx); --int EVP_CIPHER_CTX_nid(const EVP_CIPHER_CTX *ctx); --int EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *ctx); --int EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *ctx); --int EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx); --const unsigned char *EVP_CIPHER_CTX_iv(const EVP_CIPHER_CTX *ctx); --const unsigned char *EVP_CIPHER_CTX_original_iv(const EVP_CIPHER_CTX *ctx); --unsigned char *EVP_CIPHER_CTX_iv_noconst(EVP_CIPHER_CTX *ctx); --unsigned char *EVP_CIPHER_CTX_buf_noconst(EVP_CIPHER_CTX *ctx); --int EVP_CIPHER_CTX_num(const EVP_CIPHER_CTX *ctx); --void EVP_CIPHER_CTX_set_num(EVP_CIPHER_CTX *ctx, int num); --int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in); --void *EVP_CIPHER_CTX_get_app_data(const EVP_CIPHER_CTX *ctx); --void EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX *ctx, void *data); --void *EVP_CIPHER_CTX_get_cipher_data(const EVP_CIPHER_CTX *ctx); --void *EVP_CIPHER_CTX_set_cipher_data(EVP_CIPHER_CTX *ctx, void *cipher_data); --# define EVP_CIPHER_CTX_type(c) EVP_CIPHER_type(EVP_CIPHER_CTX_cipher(c)) --# if OPENSSL_API_COMPAT < 0x10100000L --# define EVP_CIPHER_CTX_flags(c) EVP_CIPHER_flags(EVP_CIPHER_CTX_cipher(c)) --# endif --# define EVP_CIPHER_CTX_mode(c) EVP_CIPHER_mode(EVP_CIPHER_CTX_cipher(c)) -- --# define EVP_ENCODE_LENGTH(l) ((((l)+2)/3*4)+((l)/48+1)*2+80) --# define EVP_DECODE_LENGTH(l) (((l)+3)/4*3+80) -- --# define EVP_SignInit_ex(a,b,c) EVP_DigestInit_ex(a,b,c) --# define EVP_SignInit(a,b) EVP_DigestInit(a,b) --# define EVP_SignUpdate(a,b,c) EVP_DigestUpdate(a,b,c) --# define EVP_VerifyInit_ex(a,b,c) EVP_DigestInit_ex(a,b,c) --# define EVP_VerifyInit(a,b) EVP_DigestInit(a,b) --# define EVP_VerifyUpdate(a,b,c) EVP_DigestUpdate(a,b,c) --# define EVP_OpenUpdate(a,b,c,d,e) EVP_DecryptUpdate(a,b,c,d,e) --# define EVP_SealUpdate(a,b,c,d,e) EVP_EncryptUpdate(a,b,c,d,e) --# define EVP_DigestSignUpdate(a,b,c) EVP_DigestUpdate(a,b,c) --# define EVP_DigestVerifyUpdate(a,b,c) EVP_DigestUpdate(a,b,c) -- --# ifdef CONST_STRICT --void BIO_set_md(BIO *, const EVP_MD *md); --# else --# define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,0,(char *)(md)) --# endif --# define BIO_get_md(b,mdp) BIO_ctrl(b,BIO_C_GET_MD,0,(char *)(mdp)) --# define BIO_get_md_ctx(b,mdcp) BIO_ctrl(b,BIO_C_GET_MD_CTX,0, \ -- (char *)(mdcp)) --# define BIO_set_md_ctx(b,mdcp) BIO_ctrl(b,BIO_C_SET_MD_CTX,0, \ -- (char *)(mdcp)) --# define BIO_get_cipher_status(b) BIO_ctrl(b,BIO_C_GET_CIPHER_STATUS,0,NULL) --# define BIO_get_cipher_ctx(b,c_pp) BIO_ctrl(b,BIO_C_GET_CIPHER_CTX,0, \ -- (char *)(c_pp)) -- --/*__owur*/ int EVP_Cipher(EVP_CIPHER_CTX *c, -- unsigned char *out, -- const unsigned char *in, unsigned int inl); -- --# define EVP_add_cipher_alias(n,alias) \ -- OBJ_NAME_add((alias),OBJ_NAME_TYPE_CIPHER_METH|OBJ_NAME_ALIAS,(n)) --# define EVP_add_digest_alias(n,alias) \ -- OBJ_NAME_add((alias),OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,(n)) --# define EVP_delete_cipher_alias(alias) \ -- OBJ_NAME_remove(alias,OBJ_NAME_TYPE_CIPHER_METH|OBJ_NAME_ALIAS); --# define EVP_delete_digest_alias(alias) \ -- OBJ_NAME_remove(alias,OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS); -- --int EVP_MD_CTX_ctrl(EVP_MD_CTX *ctx, int cmd, int p1, void *p2); --EVP_MD_CTX *EVP_MD_CTX_new(void); --int EVP_MD_CTX_reset(EVP_MD_CTX *ctx); --void EVP_MD_CTX_free(EVP_MD_CTX *ctx); --# define EVP_MD_CTX_create() EVP_MD_CTX_new() --# define EVP_MD_CTX_init(ctx) EVP_MD_CTX_reset((ctx)) --# define EVP_MD_CTX_destroy(ctx) EVP_MD_CTX_free((ctx)) --__owur int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in); --void EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags); --void EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags); --int EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx, int flags); --__owur int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, -- ENGINE *impl); --__owur int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, -- size_t cnt); --__owur int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, -- unsigned int *s); --__owur int EVP_Digest(const void *data, size_t count, -- unsigned char *md, unsigned int *size, -- const EVP_MD *type, ENGINE *impl); -- --__owur int EVP_MD_CTX_copy(EVP_MD_CTX *out, const EVP_MD_CTX *in); --__owur int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type); --__owur int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, -- unsigned int *s); --__owur int EVP_DigestFinalXOF(EVP_MD_CTX *ctx, unsigned char *md, -- size_t len); -- --int EVP_read_pw_string(char *buf, int length, const char *prompt, int verify); --int EVP_read_pw_string_min(char *buf, int minlen, int maxlen, -- const char *prompt, int verify); --void EVP_set_pw_prompt(const char *prompt); --char *EVP_get_pw_prompt(void); -- --__owur int EVP_BytesToKey(const EVP_CIPHER *type, const EVP_MD *md, -- const unsigned char *salt, -- const unsigned char *data, int datal, int count, -- unsigned char *key, unsigned char *iv); -- --void EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX *ctx, int flags); --void EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX *ctx, int flags); --int EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx, int flags); -- --__owur int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, -- const unsigned char *key, const unsigned char *iv); --/*__owur*/ int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, -- const EVP_CIPHER *cipher, ENGINE *impl, -- const unsigned char *key, -- const unsigned char *iv); --/*__owur*/ int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, -- int *outl, const unsigned char *in, int inl); --/*__owur*/ int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, -- int *outl); --/*__owur*/ int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, -- int *outl); -- --__owur int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, -- const unsigned char *key, const unsigned char *iv); --/*__owur*/ int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, -- const EVP_CIPHER *cipher, ENGINE *impl, -- const unsigned char *key, -- const unsigned char *iv); --/*__owur*/ int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, -- int *outl, const unsigned char *in, int inl); --__owur int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, -- int *outl); --/*__owur*/ int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, -- int *outl); -- --__owur int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, -- const unsigned char *key, const unsigned char *iv, -- int enc); --/*__owur*/ int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, -- const EVP_CIPHER *cipher, ENGINE *impl, -- const unsigned char *key, -- const unsigned char *iv, int enc); --__owur int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, -- int *outl, const unsigned char *in, int inl); --__owur int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, -- int *outl); --__owur int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, -- int *outl); -- --__owur int EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s, -- EVP_PKEY *pkey); -- --__owur int EVP_DigestSign(EVP_MD_CTX *ctx, unsigned char *sigret, -- size_t *siglen, const unsigned char *tbs, -- size_t tbslen); -- --__owur int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, -- unsigned int siglen, EVP_PKEY *pkey); -- --__owur int EVP_DigestVerify(EVP_MD_CTX *ctx, const unsigned char *sigret, -- size_t siglen, const unsigned char *tbs, -- size_t tbslen); -- --/*__owur*/ int EVP_DigestSignInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, -- const EVP_MD *type, ENGINE *e, -- EVP_PKEY *pkey); --__owur int EVP_DigestSignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, -- size_t *siglen); -- --__owur int EVP_DigestVerifyInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, -- const EVP_MD *type, ENGINE *e, -- EVP_PKEY *pkey); --__owur int EVP_DigestVerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sig, -- size_t siglen); -- --# ifndef OPENSSL_NO_RSA --__owur int EVP_OpenInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, -- const unsigned char *ek, int ekl, -- const unsigned char *iv, EVP_PKEY *priv); --__owur int EVP_OpenFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); -- --__owur int EVP_SealInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, -- unsigned char **ek, int *ekl, unsigned char *iv, -- EVP_PKEY **pubk, int npubk); --__owur int EVP_SealFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); --# endif -- --EVP_ENCODE_CTX *EVP_ENCODE_CTX_new(void); --void EVP_ENCODE_CTX_free(EVP_ENCODE_CTX *ctx); --int EVP_ENCODE_CTX_copy(EVP_ENCODE_CTX *dctx, EVP_ENCODE_CTX *sctx); --int EVP_ENCODE_CTX_num(EVP_ENCODE_CTX *ctx); --void EVP_EncodeInit(EVP_ENCODE_CTX *ctx); --int EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl, -- const unsigned char *in, int inl); --void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl); --int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int n); -- --void EVP_DecodeInit(EVP_ENCODE_CTX *ctx); --int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl, -- const unsigned char *in, int inl); --int EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, unsigned -- char *out, int *outl); --int EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n); -- --# if OPENSSL_API_COMPAT < 0x10100000L --# define EVP_CIPHER_CTX_init(c) EVP_CIPHER_CTX_reset(c) --# define EVP_CIPHER_CTX_cleanup(c) EVP_CIPHER_CTX_reset(c) --# endif --EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void); --int EVP_CIPHER_CTX_reset(EVP_CIPHER_CTX *c); --void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *c); --int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *x, int keylen); --int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *c, int pad); --int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr); --int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key); -- --const BIO_METHOD *BIO_f_md(void); --const BIO_METHOD *BIO_f_base64(void); --const BIO_METHOD *BIO_f_cipher(void); --const BIO_METHOD *BIO_f_reliable(void); --__owur int BIO_set_cipher(BIO *b, const EVP_CIPHER *c, const unsigned char *k, -- const unsigned char *i, int enc); -- --const EVP_MD *EVP_md_null(void); --# ifndef OPENSSL_NO_MD2 --const EVP_MD *EVP_md2(void); --# endif --# ifndef OPENSSL_NO_MD4 --const EVP_MD *EVP_md4(void); --# endif --# ifndef OPENSSL_NO_MD5 --const EVP_MD *EVP_md5(void); --const EVP_MD *EVP_md5_sha1(void); --# endif --# ifndef OPENSSL_NO_BLAKE2 --const EVP_MD *EVP_blake2b512(void); --const EVP_MD *EVP_blake2s256(void); --# endif --const EVP_MD *EVP_sha1(void); --const EVP_MD *EVP_sha224(void); --const EVP_MD *EVP_sha256(void); --const EVP_MD *EVP_sha384(void); --const EVP_MD *EVP_sha512(void); --const EVP_MD *EVP_sha512_224(void); --const EVP_MD *EVP_sha512_256(void); --const EVP_MD *EVP_sha3_224(void); --const EVP_MD *EVP_sha3_256(void); --const EVP_MD *EVP_sha3_384(void); --const EVP_MD *EVP_sha3_512(void); --const EVP_MD *EVP_shake128(void); --const EVP_MD *EVP_shake256(void); --# ifndef OPENSSL_NO_MDC2 --const EVP_MD *EVP_mdc2(void); --# endif --# ifndef OPENSSL_NO_RMD160 --const EVP_MD *EVP_ripemd160(void); --# endif --# ifndef OPENSSL_NO_WHIRLPOOL --const EVP_MD *EVP_whirlpool(void); --# endif --# ifndef OPENSSL_NO_SM3 --const EVP_MD *EVP_sm3(void); --# endif --const EVP_CIPHER *EVP_enc_null(void); /* does nothing :-) */ --# ifndef OPENSSL_NO_DES --const EVP_CIPHER *EVP_des_ecb(void); --const EVP_CIPHER *EVP_des_ede(void); --const EVP_CIPHER *EVP_des_ede3(void); --const EVP_CIPHER *EVP_des_ede_ecb(void); --const EVP_CIPHER *EVP_des_ede3_ecb(void); --const EVP_CIPHER *EVP_des_cfb64(void); --# define EVP_des_cfb EVP_des_cfb64 --const EVP_CIPHER *EVP_des_cfb1(void); --const EVP_CIPHER *EVP_des_cfb8(void); --const EVP_CIPHER *EVP_des_ede_cfb64(void); --# define EVP_des_ede_cfb EVP_des_ede_cfb64 --const EVP_CIPHER *EVP_des_ede3_cfb64(void); --# define EVP_des_ede3_cfb EVP_des_ede3_cfb64 --const EVP_CIPHER *EVP_des_ede3_cfb1(void); --const EVP_CIPHER *EVP_des_ede3_cfb8(void); --const EVP_CIPHER *EVP_des_ofb(void); --const EVP_CIPHER *EVP_des_ede_ofb(void); --const EVP_CIPHER *EVP_des_ede3_ofb(void); --const EVP_CIPHER *EVP_des_cbc(void); --const EVP_CIPHER *EVP_des_ede_cbc(void); --const EVP_CIPHER *EVP_des_ede3_cbc(void); --const EVP_CIPHER *EVP_desx_cbc(void); --const EVP_CIPHER *EVP_des_ede3_wrap(void); --/* -- * This should now be supported through the dev_crypto ENGINE. But also, why -- * are rc4 and md5 declarations made here inside a "NO_DES" precompiler -- * branch? -- */ --# endif --# ifndef OPENSSL_NO_RC4 --const EVP_CIPHER *EVP_rc4(void); --const EVP_CIPHER *EVP_rc4_40(void); --# ifndef OPENSSL_NO_MD5 --const EVP_CIPHER *EVP_rc4_hmac_md5(void); --# endif --# endif --# ifndef OPENSSL_NO_IDEA --const EVP_CIPHER *EVP_idea_ecb(void); --const EVP_CIPHER *EVP_idea_cfb64(void); --# define EVP_idea_cfb EVP_idea_cfb64 --const EVP_CIPHER *EVP_idea_ofb(void); --const EVP_CIPHER *EVP_idea_cbc(void); --# endif --# ifndef OPENSSL_NO_RC2 --const EVP_CIPHER *EVP_rc2_ecb(void); --const EVP_CIPHER *EVP_rc2_cbc(void); --const EVP_CIPHER *EVP_rc2_40_cbc(void); --const EVP_CIPHER *EVP_rc2_64_cbc(void); --const EVP_CIPHER *EVP_rc2_cfb64(void); --# define EVP_rc2_cfb EVP_rc2_cfb64 --const EVP_CIPHER *EVP_rc2_ofb(void); --# endif --# ifndef OPENSSL_NO_BF --const EVP_CIPHER *EVP_bf_ecb(void); --const EVP_CIPHER *EVP_bf_cbc(void); --const EVP_CIPHER *EVP_bf_cfb64(void); --# define EVP_bf_cfb EVP_bf_cfb64 --const EVP_CIPHER *EVP_bf_ofb(void); --# endif --# ifndef OPENSSL_NO_CAST --const EVP_CIPHER *EVP_cast5_ecb(void); --const EVP_CIPHER *EVP_cast5_cbc(void); --const EVP_CIPHER *EVP_cast5_cfb64(void); --# define EVP_cast5_cfb EVP_cast5_cfb64 --const EVP_CIPHER *EVP_cast5_ofb(void); --# endif --# ifndef OPENSSL_NO_RC5 --const EVP_CIPHER *EVP_rc5_32_12_16_cbc(void); --const EVP_CIPHER *EVP_rc5_32_12_16_ecb(void); --const EVP_CIPHER *EVP_rc5_32_12_16_cfb64(void); --# define EVP_rc5_32_12_16_cfb EVP_rc5_32_12_16_cfb64 --const EVP_CIPHER *EVP_rc5_32_12_16_ofb(void); --# endif --const EVP_CIPHER *EVP_aes_128_ecb(void); --const EVP_CIPHER *EVP_aes_128_cbc(void); --const EVP_CIPHER *EVP_aes_128_cfb1(void); --const EVP_CIPHER *EVP_aes_128_cfb8(void); --const EVP_CIPHER *EVP_aes_128_cfb128(void); --# define EVP_aes_128_cfb EVP_aes_128_cfb128 --const EVP_CIPHER *EVP_aes_128_ofb(void); --const EVP_CIPHER *EVP_aes_128_ctr(void); --const EVP_CIPHER *EVP_aes_128_ccm(void); --const EVP_CIPHER *EVP_aes_128_gcm(void); --const EVP_CIPHER *EVP_aes_128_xts(void); --const EVP_CIPHER *EVP_aes_128_wrap(void); --const EVP_CIPHER *EVP_aes_128_wrap_pad(void); --# ifndef OPENSSL_NO_OCB --const EVP_CIPHER *EVP_aes_128_ocb(void); --# endif --const EVP_CIPHER *EVP_aes_192_ecb(void); --const EVP_CIPHER *EVP_aes_192_cbc(void); --const EVP_CIPHER *EVP_aes_192_cfb1(void); --const EVP_CIPHER *EVP_aes_192_cfb8(void); --const EVP_CIPHER *EVP_aes_192_cfb128(void); --# define EVP_aes_192_cfb EVP_aes_192_cfb128 --const EVP_CIPHER *EVP_aes_192_ofb(void); --const EVP_CIPHER *EVP_aes_192_ctr(void); --const EVP_CIPHER *EVP_aes_192_ccm(void); --const EVP_CIPHER *EVP_aes_192_gcm(void); --const EVP_CIPHER *EVP_aes_192_wrap(void); --const EVP_CIPHER *EVP_aes_192_wrap_pad(void); --# ifndef OPENSSL_NO_OCB --const EVP_CIPHER *EVP_aes_192_ocb(void); --# endif --const EVP_CIPHER *EVP_aes_256_ecb(void); --const EVP_CIPHER *EVP_aes_256_cbc(void); --const EVP_CIPHER *EVP_aes_256_cfb1(void); --const EVP_CIPHER *EVP_aes_256_cfb8(void); --const EVP_CIPHER *EVP_aes_256_cfb128(void); --# define EVP_aes_256_cfb EVP_aes_256_cfb128 --const EVP_CIPHER *EVP_aes_256_ofb(void); --const EVP_CIPHER *EVP_aes_256_ctr(void); --const EVP_CIPHER *EVP_aes_256_ccm(void); --const EVP_CIPHER *EVP_aes_256_gcm(void); --const EVP_CIPHER *EVP_aes_256_xts(void); --const EVP_CIPHER *EVP_aes_256_wrap(void); --const EVP_CIPHER *EVP_aes_256_wrap_pad(void); --# ifndef OPENSSL_NO_OCB --const EVP_CIPHER *EVP_aes_256_ocb(void); --# endif --const EVP_CIPHER *EVP_aes_128_cbc_hmac_sha1(void); --const EVP_CIPHER *EVP_aes_256_cbc_hmac_sha1(void); --const EVP_CIPHER *EVP_aes_128_cbc_hmac_sha256(void); --const EVP_CIPHER *EVP_aes_256_cbc_hmac_sha256(void); --# ifndef OPENSSL_NO_ARIA --const EVP_CIPHER *EVP_aria_128_ecb(void); --const EVP_CIPHER *EVP_aria_128_cbc(void); --const EVP_CIPHER *EVP_aria_128_cfb1(void); --const EVP_CIPHER *EVP_aria_128_cfb8(void); --const EVP_CIPHER *EVP_aria_128_cfb128(void); --# define EVP_aria_128_cfb EVP_aria_128_cfb128 --const EVP_CIPHER *EVP_aria_128_ctr(void); --const EVP_CIPHER *EVP_aria_128_ofb(void); --const EVP_CIPHER *EVP_aria_128_gcm(void); --const EVP_CIPHER *EVP_aria_128_ccm(void); --const EVP_CIPHER *EVP_aria_192_ecb(void); --const EVP_CIPHER *EVP_aria_192_cbc(void); --const EVP_CIPHER *EVP_aria_192_cfb1(void); --const EVP_CIPHER *EVP_aria_192_cfb8(void); --const EVP_CIPHER *EVP_aria_192_cfb128(void); --# define EVP_aria_192_cfb EVP_aria_192_cfb128 --const EVP_CIPHER *EVP_aria_192_ctr(void); --const EVP_CIPHER *EVP_aria_192_ofb(void); --const EVP_CIPHER *EVP_aria_192_gcm(void); --const EVP_CIPHER *EVP_aria_192_ccm(void); --const EVP_CIPHER *EVP_aria_256_ecb(void); --const EVP_CIPHER *EVP_aria_256_cbc(void); --const EVP_CIPHER *EVP_aria_256_cfb1(void); --const EVP_CIPHER *EVP_aria_256_cfb8(void); --const EVP_CIPHER *EVP_aria_256_cfb128(void); --# define EVP_aria_256_cfb EVP_aria_256_cfb128 --const EVP_CIPHER *EVP_aria_256_ctr(void); --const EVP_CIPHER *EVP_aria_256_ofb(void); --const EVP_CIPHER *EVP_aria_256_gcm(void); --const EVP_CIPHER *EVP_aria_256_ccm(void); --# endif --# ifndef OPENSSL_NO_CAMELLIA --const EVP_CIPHER *EVP_camellia_128_ecb(void); --const EVP_CIPHER *EVP_camellia_128_cbc(void); --const EVP_CIPHER *EVP_camellia_128_cfb1(void); --const EVP_CIPHER *EVP_camellia_128_cfb8(void); --const EVP_CIPHER *EVP_camellia_128_cfb128(void); --# define EVP_camellia_128_cfb EVP_camellia_128_cfb128 --const EVP_CIPHER *EVP_camellia_128_ofb(void); --const EVP_CIPHER *EVP_camellia_128_ctr(void); --const EVP_CIPHER *EVP_camellia_192_ecb(void); --const EVP_CIPHER *EVP_camellia_192_cbc(void); --const EVP_CIPHER *EVP_camellia_192_cfb1(void); --const EVP_CIPHER *EVP_camellia_192_cfb8(void); --const EVP_CIPHER *EVP_camellia_192_cfb128(void); --# define EVP_camellia_192_cfb EVP_camellia_192_cfb128 --const EVP_CIPHER *EVP_camellia_192_ofb(void); --const EVP_CIPHER *EVP_camellia_192_ctr(void); --const EVP_CIPHER *EVP_camellia_256_ecb(void); --const EVP_CIPHER *EVP_camellia_256_cbc(void); --const EVP_CIPHER *EVP_camellia_256_cfb1(void); --const EVP_CIPHER *EVP_camellia_256_cfb8(void); --const EVP_CIPHER *EVP_camellia_256_cfb128(void); --# define EVP_camellia_256_cfb EVP_camellia_256_cfb128 --const EVP_CIPHER *EVP_camellia_256_ofb(void); --const EVP_CIPHER *EVP_camellia_256_ctr(void); --# endif --# ifndef OPENSSL_NO_CHACHA --const EVP_CIPHER *EVP_chacha20(void); --# ifndef OPENSSL_NO_POLY1305 --const EVP_CIPHER *EVP_chacha20_poly1305(void); --# endif --# endif -- --# ifndef OPENSSL_NO_SEED --const EVP_CIPHER *EVP_seed_ecb(void); --const EVP_CIPHER *EVP_seed_cbc(void); --const EVP_CIPHER *EVP_seed_cfb128(void); --# define EVP_seed_cfb EVP_seed_cfb128 --const EVP_CIPHER *EVP_seed_ofb(void); --# endif -- --# ifndef OPENSSL_NO_SM4 --const EVP_CIPHER *EVP_sm4_ecb(void); --const EVP_CIPHER *EVP_sm4_cbc(void); --const EVP_CIPHER *EVP_sm4_cfb128(void); --# define EVP_sm4_cfb EVP_sm4_cfb128 --const EVP_CIPHER *EVP_sm4_ofb(void); --const EVP_CIPHER *EVP_sm4_ctr(void); --# endif -- --# if OPENSSL_API_COMPAT < 0x10100000L --# define OPENSSL_add_all_algorithms_conf() \ -- OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS \ -- | OPENSSL_INIT_ADD_ALL_DIGESTS \ -- | OPENSSL_INIT_LOAD_CONFIG, NULL) --# define OPENSSL_add_all_algorithms_noconf() \ -- OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS \ -- | OPENSSL_INIT_ADD_ALL_DIGESTS, NULL) -- --# ifdef OPENSSL_LOAD_CONF --# define OpenSSL_add_all_algorithms() OPENSSL_add_all_algorithms_conf() --# else --# define OpenSSL_add_all_algorithms() OPENSSL_add_all_algorithms_noconf() --# endif -- --# define OpenSSL_add_all_ciphers() \ -- OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS, NULL) --# define OpenSSL_add_all_digests() \ -- OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_DIGESTS, NULL) -- --# define EVP_cleanup() while(0) continue --# endif -- --int EVP_add_cipher(const EVP_CIPHER *cipher); --int EVP_add_digest(const EVP_MD *digest); -- --const EVP_CIPHER *EVP_get_cipherbyname(const char *name); --const EVP_MD *EVP_get_digestbyname(const char *name); -- --void EVP_CIPHER_do_all(void (*fn) (const EVP_CIPHER *ciph, -- const char *from, const char *to, void *x), -- void *arg); --void EVP_CIPHER_do_all_sorted(void (*fn) -- (const EVP_CIPHER *ciph, const char *from, -- const char *to, void *x), void *arg); -- --void EVP_MD_do_all(void (*fn) (const EVP_MD *ciph, -- const char *from, const char *to, void *x), -- void *arg); --void EVP_MD_do_all_sorted(void (*fn) -- (const EVP_MD *ciph, const char *from, -- const char *to, void *x), void *arg); -- --int EVP_PKEY_decrypt_old(unsigned char *dec_key, -- const unsigned char *enc_key, int enc_key_len, -- EVP_PKEY *private_key); --int EVP_PKEY_encrypt_old(unsigned char *enc_key, -- const unsigned char *key, int key_len, -- EVP_PKEY *pub_key); --int EVP_PKEY_type(int type); --int EVP_PKEY_id(const EVP_PKEY *pkey); --int EVP_PKEY_base_id(const EVP_PKEY *pkey); --int EVP_PKEY_bits(const EVP_PKEY *pkey); --int EVP_PKEY_security_bits(const EVP_PKEY *pkey); --int EVP_PKEY_size(const EVP_PKEY *pkey); --int EVP_PKEY_set_type(EVP_PKEY *pkey, int type); --int EVP_PKEY_set_type_str(EVP_PKEY *pkey, const char *str, int len); --int EVP_PKEY_set_alias_type(EVP_PKEY *pkey, int type); --# ifndef OPENSSL_NO_ENGINE --int EVP_PKEY_set1_engine(EVP_PKEY *pkey, ENGINE *e); --ENGINE *EVP_PKEY_get0_engine(const EVP_PKEY *pkey); --# endif --int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key); --void *EVP_PKEY_get0(const EVP_PKEY *pkey); --const unsigned char *EVP_PKEY_get0_hmac(const EVP_PKEY *pkey, size_t *len); --# ifndef OPENSSL_NO_POLY1305 --const unsigned char *EVP_PKEY_get0_poly1305(const EVP_PKEY *pkey, size_t *len); --# endif --# ifndef OPENSSL_NO_SIPHASH --const unsigned char *EVP_PKEY_get0_siphash(const EVP_PKEY *pkey, size_t *len); --# endif -- --# ifndef OPENSSL_NO_RSA --struct rsa_st; --int EVP_PKEY_set1_RSA(EVP_PKEY *pkey, struct rsa_st *key); --struct rsa_st *EVP_PKEY_get0_RSA(EVP_PKEY *pkey); --struct rsa_st *EVP_PKEY_get1_RSA(EVP_PKEY *pkey); --# endif --# ifndef OPENSSL_NO_DSA --struct dsa_st; --int EVP_PKEY_set1_DSA(EVP_PKEY *pkey, struct dsa_st *key); --struct dsa_st *EVP_PKEY_get0_DSA(EVP_PKEY *pkey); --struct dsa_st *EVP_PKEY_get1_DSA(EVP_PKEY *pkey); --# endif --# ifndef OPENSSL_NO_DH --struct dh_st; --int EVP_PKEY_set1_DH(EVP_PKEY *pkey, struct dh_st *key); --struct dh_st *EVP_PKEY_get0_DH(EVP_PKEY *pkey); --struct dh_st *EVP_PKEY_get1_DH(EVP_PKEY *pkey); --# endif --# ifndef OPENSSL_NO_EC --struct ec_key_st; --int EVP_PKEY_set1_EC_KEY(EVP_PKEY *pkey, struct ec_key_st *key); --struct ec_key_st *EVP_PKEY_get0_EC_KEY(EVP_PKEY *pkey); --struct ec_key_st *EVP_PKEY_get1_EC_KEY(EVP_PKEY *pkey); --# endif -- --EVP_PKEY *EVP_PKEY_new(void); --int EVP_PKEY_up_ref(EVP_PKEY *pkey); --void EVP_PKEY_free(EVP_PKEY *pkey); -- --EVP_PKEY *d2i_PublicKey(int type, EVP_PKEY **a, const unsigned char **pp, -- long length); --int i2d_PublicKey(EVP_PKEY *a, unsigned char **pp); -- --EVP_PKEY *d2i_PrivateKey(int type, EVP_PKEY **a, const unsigned char **pp, -- long length); --EVP_PKEY *d2i_AutoPrivateKey(EVP_PKEY **a, const unsigned char **pp, -- long length); --int i2d_PrivateKey(EVP_PKEY *a, unsigned char **pp); -- --int EVP_PKEY_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from); --int EVP_PKEY_missing_parameters(const EVP_PKEY *pkey); --int EVP_PKEY_save_parameters(EVP_PKEY *pkey, int mode); --int EVP_PKEY_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b); -- --int EVP_PKEY_cmp(const EVP_PKEY *a, const EVP_PKEY *b); -- --int EVP_PKEY_print_public(BIO *out, const EVP_PKEY *pkey, -- int indent, ASN1_PCTX *pctx); --int EVP_PKEY_print_private(BIO *out, const EVP_PKEY *pkey, -- int indent, ASN1_PCTX *pctx); --int EVP_PKEY_print_params(BIO *out, const EVP_PKEY *pkey, -- int indent, ASN1_PCTX *pctx); -- --int EVP_PKEY_get_default_digest_nid(EVP_PKEY *pkey, int *pnid); -- --int EVP_PKEY_set1_tls_encodedpoint(EVP_PKEY *pkey, -- const unsigned char *pt, size_t ptlen); --size_t EVP_PKEY_get1_tls_encodedpoint(EVP_PKEY *pkey, unsigned char **ppt); -- --int EVP_CIPHER_type(const EVP_CIPHER *ctx); -- --/* calls methods */ --int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type); --int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type); -- --/* These are used by EVP_CIPHER methods */ --int EVP_CIPHER_set_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type); --int EVP_CIPHER_get_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type); -- --/* PKCS5 password based encryption */ --int PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, -- ASN1_TYPE *param, const EVP_CIPHER *cipher, -- const EVP_MD *md, int en_de); --int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen, -- const unsigned char *salt, int saltlen, int iter, -- int keylen, unsigned char *out); --int PKCS5_PBKDF2_HMAC(const char *pass, int passlen, -- const unsigned char *salt, int saltlen, int iter, -- const EVP_MD *digest, int keylen, unsigned char *out); --int PKCS5_v2_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, -- ASN1_TYPE *param, const EVP_CIPHER *cipher, -- const EVP_MD *md, int en_de); -- --#ifndef OPENSSL_NO_SCRYPT --int EVP_PBE_scrypt(const char *pass, size_t passlen, -- const unsigned char *salt, size_t saltlen, -- uint64_t N, uint64_t r, uint64_t p, uint64_t maxmem, -- unsigned char *key, size_t keylen); -- --int PKCS5_v2_scrypt_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, -- int passlen, ASN1_TYPE *param, -- const EVP_CIPHER *c, const EVP_MD *md, int en_de); --#endif -- --void PKCS5_PBE_add(void); -- --int EVP_PBE_CipherInit(ASN1_OBJECT *pbe_obj, const char *pass, int passlen, -- ASN1_TYPE *param, EVP_CIPHER_CTX *ctx, int en_de); -- --/* PBE type */ -- --/* Can appear as the outermost AlgorithmIdentifier */ --# define EVP_PBE_TYPE_OUTER 0x0 --/* Is an PRF type OID */ --# define EVP_PBE_TYPE_PRF 0x1 --/* Is a PKCS#5 v2.0 KDF */ --# define EVP_PBE_TYPE_KDF 0x2 -- --int EVP_PBE_alg_add_type(int pbe_type, int pbe_nid, int cipher_nid, -- int md_nid, EVP_PBE_KEYGEN *keygen); --int EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md, -- EVP_PBE_KEYGEN *keygen); --int EVP_PBE_find(int type, int pbe_nid, int *pcnid, int *pmnid, -- EVP_PBE_KEYGEN **pkeygen); --void EVP_PBE_cleanup(void); --int EVP_PBE_get(int *ptype, int *ppbe_nid, size_t num); -- --# define ASN1_PKEY_ALIAS 0x1 --# define ASN1_PKEY_DYNAMIC 0x2 --# define ASN1_PKEY_SIGPARAM_NULL 0x4 -- --# define ASN1_PKEY_CTRL_PKCS7_SIGN 0x1 --# define ASN1_PKEY_CTRL_PKCS7_ENCRYPT 0x2 --# define ASN1_PKEY_CTRL_DEFAULT_MD_NID 0x3 --# define ASN1_PKEY_CTRL_CMS_SIGN 0x5 --# define ASN1_PKEY_CTRL_CMS_ENVELOPE 0x7 --# define ASN1_PKEY_CTRL_CMS_RI_TYPE 0x8 -- --# define ASN1_PKEY_CTRL_SET1_TLS_ENCPT 0x9 --# define ASN1_PKEY_CTRL_GET1_TLS_ENCPT 0xa -- --int EVP_PKEY_asn1_get_count(void); --const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_get0(int idx); --const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find(ENGINE **pe, int type); --const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find_str(ENGINE **pe, -- const char *str, int len); --int EVP_PKEY_asn1_add0(const EVP_PKEY_ASN1_METHOD *ameth); --int EVP_PKEY_asn1_add_alias(int to, int from); --int EVP_PKEY_asn1_get0_info(int *ppkey_id, int *pkey_base_id, -- int *ppkey_flags, const char **pinfo, -- const char **ppem_str, -- const EVP_PKEY_ASN1_METHOD *ameth); -- --const EVP_PKEY_ASN1_METHOD *EVP_PKEY_get0_asn1(const EVP_PKEY *pkey); --EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_new(int id, int flags, -- const char *pem_str, -- const char *info); --void EVP_PKEY_asn1_copy(EVP_PKEY_ASN1_METHOD *dst, -- const EVP_PKEY_ASN1_METHOD *src); --void EVP_PKEY_asn1_free(EVP_PKEY_ASN1_METHOD *ameth); --void EVP_PKEY_asn1_set_public(EVP_PKEY_ASN1_METHOD *ameth, -- int (*pub_decode) (EVP_PKEY *pk, -- X509_PUBKEY *pub), -- int (*pub_encode) (X509_PUBKEY *pub, -- const EVP_PKEY *pk), -- int (*pub_cmp) (const EVP_PKEY *a, -- const EVP_PKEY *b), -- int (*pub_print) (BIO *out, -- const EVP_PKEY *pkey, -- int indent, ASN1_PCTX *pctx), -- int (*pkey_size) (const EVP_PKEY *pk), -- int (*pkey_bits) (const EVP_PKEY *pk)); --void EVP_PKEY_asn1_set_private(EVP_PKEY_ASN1_METHOD *ameth, -- int (*priv_decode) (EVP_PKEY *pk, -- const PKCS8_PRIV_KEY_INFO -- *p8inf), -- int (*priv_encode) (PKCS8_PRIV_KEY_INFO *p8, -- const EVP_PKEY *pk), -- int (*priv_print) (BIO *out, -- const EVP_PKEY *pkey, -- int indent, -- ASN1_PCTX *pctx)); --void EVP_PKEY_asn1_set_param(EVP_PKEY_ASN1_METHOD *ameth, -- int (*param_decode) (EVP_PKEY *pkey, -- const unsigned char **pder, -- int derlen), -- int (*param_encode) (const EVP_PKEY *pkey, -- unsigned char **pder), -- int (*param_missing) (const EVP_PKEY *pk), -- int (*param_copy) (EVP_PKEY *to, -- const EVP_PKEY *from), -- int (*param_cmp) (const EVP_PKEY *a, -- const EVP_PKEY *b), -- int (*param_print) (BIO *out, -- const EVP_PKEY *pkey, -- int indent, -- ASN1_PCTX *pctx)); -- --void EVP_PKEY_asn1_set_free(EVP_PKEY_ASN1_METHOD *ameth, -- void (*pkey_free) (EVP_PKEY *pkey)); --void EVP_PKEY_asn1_set_ctrl(EVP_PKEY_ASN1_METHOD *ameth, -- int (*pkey_ctrl) (EVP_PKEY *pkey, int op, -- long arg1, void *arg2)); --void EVP_PKEY_asn1_set_item(EVP_PKEY_ASN1_METHOD *ameth, -- int (*item_verify) (EVP_MD_CTX *ctx, -- const ASN1_ITEM *it, -- void *asn, -- X509_ALGOR *a, -- ASN1_BIT_STRING *sig, -- EVP_PKEY *pkey), -- int (*item_sign) (EVP_MD_CTX *ctx, -- const ASN1_ITEM *it, -- void *asn, -- X509_ALGOR *alg1, -- X509_ALGOR *alg2, -- ASN1_BIT_STRING *sig)); -- --void EVP_PKEY_asn1_set_siginf(EVP_PKEY_ASN1_METHOD *ameth, -- int (*siginf_set) (X509_SIG_INFO *siginf, -- const X509_ALGOR *alg, -- const ASN1_STRING *sig)); -- --void EVP_PKEY_asn1_set_check(EVP_PKEY_ASN1_METHOD *ameth, -- int (*pkey_check) (const EVP_PKEY *pk)); -- --void EVP_PKEY_asn1_set_public_check(EVP_PKEY_ASN1_METHOD *ameth, -- int (*pkey_pub_check) (const EVP_PKEY *pk)); -- --void EVP_PKEY_asn1_set_param_check(EVP_PKEY_ASN1_METHOD *ameth, -- int (*pkey_param_check) (const EVP_PKEY *pk)); -- --void EVP_PKEY_asn1_set_set_priv_key(EVP_PKEY_ASN1_METHOD *ameth, -- int (*set_priv_key) (EVP_PKEY *pk, -- const unsigned char -- *priv, -- size_t len)); --void EVP_PKEY_asn1_set_set_pub_key(EVP_PKEY_ASN1_METHOD *ameth, -- int (*set_pub_key) (EVP_PKEY *pk, -- const unsigned char *pub, -- size_t len)); --void EVP_PKEY_asn1_set_get_priv_key(EVP_PKEY_ASN1_METHOD *ameth, -- int (*get_priv_key) (const EVP_PKEY *pk, -- unsigned char *priv, -- size_t *len)); --void EVP_PKEY_asn1_set_get_pub_key(EVP_PKEY_ASN1_METHOD *ameth, -- int (*get_pub_key) (const EVP_PKEY *pk, -- unsigned char *pub, -- size_t *len)); -- --void EVP_PKEY_asn1_set_security_bits(EVP_PKEY_ASN1_METHOD *ameth, -- int (*pkey_security_bits) (const EVP_PKEY -- *pk)); -- --# define EVP_PKEY_OP_UNDEFINED 0 --# define EVP_PKEY_OP_PARAMGEN (1<<1) --# define EVP_PKEY_OP_KEYGEN (1<<2) --# define EVP_PKEY_OP_SIGN (1<<3) --# define EVP_PKEY_OP_VERIFY (1<<4) --# define EVP_PKEY_OP_VERIFYRECOVER (1<<5) --# define EVP_PKEY_OP_SIGNCTX (1<<6) --# define EVP_PKEY_OP_VERIFYCTX (1<<7) --# define EVP_PKEY_OP_ENCRYPT (1<<8) --# define EVP_PKEY_OP_DECRYPT (1<<9) --# define EVP_PKEY_OP_DERIVE (1<<10) -- --# define EVP_PKEY_OP_TYPE_SIG \ -- (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_VERIFY | EVP_PKEY_OP_VERIFYRECOVER \ -- | EVP_PKEY_OP_SIGNCTX | EVP_PKEY_OP_VERIFYCTX) -- --# define EVP_PKEY_OP_TYPE_CRYPT \ -- (EVP_PKEY_OP_ENCRYPT | EVP_PKEY_OP_DECRYPT) -- --# define EVP_PKEY_OP_TYPE_NOGEN \ -- (EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT | EVP_PKEY_OP_DERIVE) -- --# define EVP_PKEY_OP_TYPE_GEN \ -- (EVP_PKEY_OP_PARAMGEN | EVP_PKEY_OP_KEYGEN) -- --# define EVP_PKEY_CTX_set_signature_md(ctx, md) \ -- EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_TYPE_SIG, \ -- EVP_PKEY_CTRL_MD, 0, (void *)(md)) -- --# define EVP_PKEY_CTX_get_signature_md(ctx, pmd) \ -- EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_TYPE_SIG, \ -- EVP_PKEY_CTRL_GET_MD, 0, (void *)(pmd)) -- --# define EVP_PKEY_CTX_set_mac_key(ctx, key, len) \ -- EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_KEYGEN, \ -- EVP_PKEY_CTRL_SET_MAC_KEY, len, (void *)(key)) -- --# define EVP_PKEY_CTRL_MD 1 --# define EVP_PKEY_CTRL_PEER_KEY 2 -- --# define EVP_PKEY_CTRL_PKCS7_ENCRYPT 3 --# define EVP_PKEY_CTRL_PKCS7_DECRYPT 4 -- --# define EVP_PKEY_CTRL_PKCS7_SIGN 5 -- --# define EVP_PKEY_CTRL_SET_MAC_KEY 6 -- --# define EVP_PKEY_CTRL_DIGESTINIT 7 -- --/* Used by GOST key encryption in TLS */ --# define EVP_PKEY_CTRL_SET_IV 8 -- --# define EVP_PKEY_CTRL_CMS_ENCRYPT 9 --# define EVP_PKEY_CTRL_CMS_DECRYPT 10 --# define EVP_PKEY_CTRL_CMS_SIGN 11 -- --# define EVP_PKEY_CTRL_CIPHER 12 -- --# define EVP_PKEY_CTRL_GET_MD 13 -- --# define EVP_PKEY_CTRL_SET_DIGEST_SIZE 14 -- --# define EVP_PKEY_ALG_CTRL 0x1000 -- --# define EVP_PKEY_FLAG_AUTOARGLEN 2 --/* -- * Method handles all operations: don't assume any digest related defaults. -- */ --# define EVP_PKEY_FLAG_SIGCTX_CUSTOM 4 -- --const EVP_PKEY_METHOD *EVP_PKEY_meth_find(int type); --EVP_PKEY_METHOD *EVP_PKEY_meth_new(int id, int flags); --void EVP_PKEY_meth_get0_info(int *ppkey_id, int *pflags, -- const EVP_PKEY_METHOD *meth); --void EVP_PKEY_meth_copy(EVP_PKEY_METHOD *dst, const EVP_PKEY_METHOD *src); --void EVP_PKEY_meth_free(EVP_PKEY_METHOD *pmeth); --int EVP_PKEY_meth_add0(const EVP_PKEY_METHOD *pmeth); --int EVP_PKEY_meth_remove(const EVP_PKEY_METHOD *pmeth); --size_t EVP_PKEY_meth_get_count(void); --const EVP_PKEY_METHOD *EVP_PKEY_meth_get0(size_t idx); -- --EVP_PKEY_CTX *EVP_PKEY_CTX_new(EVP_PKEY *pkey, ENGINE *e); --EVP_PKEY_CTX *EVP_PKEY_CTX_new_id(int id, ENGINE *e); --EVP_PKEY_CTX *EVP_PKEY_CTX_dup(EVP_PKEY_CTX *ctx); --void EVP_PKEY_CTX_free(EVP_PKEY_CTX *ctx); -- --int EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX *ctx, int keytype, int optype, -- int cmd, int p1, void *p2); --int EVP_PKEY_CTX_ctrl_str(EVP_PKEY_CTX *ctx, const char *type, -- const char *value); --int EVP_PKEY_CTX_ctrl_uint64(EVP_PKEY_CTX *ctx, int keytype, int optype, -- int cmd, uint64_t value); -- --int EVP_PKEY_CTX_str2ctrl(EVP_PKEY_CTX *ctx, int cmd, const char *str); --int EVP_PKEY_CTX_hex2ctrl(EVP_PKEY_CTX *ctx, int cmd, const char *hex); -- --int EVP_PKEY_CTX_md(EVP_PKEY_CTX *ctx, int optype, int cmd, const char *md); -- --int EVP_PKEY_CTX_get_operation(EVP_PKEY_CTX *ctx); --void EVP_PKEY_CTX_set0_keygen_info(EVP_PKEY_CTX *ctx, int *dat, int datlen); -- --EVP_PKEY *EVP_PKEY_new_mac_key(int type, ENGINE *e, -- const unsigned char *key, int keylen); --EVP_PKEY *EVP_PKEY_new_raw_private_key(int type, ENGINE *e, -- const unsigned char *priv, -- size_t len); --EVP_PKEY *EVP_PKEY_new_raw_public_key(int type, ENGINE *e, -- const unsigned char *pub, -- size_t len); --int EVP_PKEY_get_raw_private_key(const EVP_PKEY *pkey, unsigned char *priv, -- size_t *len); --int EVP_PKEY_get_raw_public_key(const EVP_PKEY *pkey, unsigned char *pub, -- size_t *len); -- --EVP_PKEY *EVP_PKEY_new_CMAC_key(ENGINE *e, const unsigned char *priv, -- size_t len, const EVP_CIPHER *cipher); -- --void EVP_PKEY_CTX_set_data(EVP_PKEY_CTX *ctx, void *data); --void *EVP_PKEY_CTX_get_data(EVP_PKEY_CTX *ctx); --EVP_PKEY *EVP_PKEY_CTX_get0_pkey(EVP_PKEY_CTX *ctx); -- --EVP_PKEY *EVP_PKEY_CTX_get0_peerkey(EVP_PKEY_CTX *ctx); -- --void EVP_PKEY_CTX_set_app_data(EVP_PKEY_CTX *ctx, void *data); --void *EVP_PKEY_CTX_get_app_data(EVP_PKEY_CTX *ctx); -- --int EVP_PKEY_sign_init(EVP_PKEY_CTX *ctx); --int EVP_PKEY_sign(EVP_PKEY_CTX *ctx, -- unsigned char *sig, size_t *siglen, -- const unsigned char *tbs, size_t tbslen); --int EVP_PKEY_verify_init(EVP_PKEY_CTX *ctx); --int EVP_PKEY_verify(EVP_PKEY_CTX *ctx, -- const unsigned char *sig, size_t siglen, -- const unsigned char *tbs, size_t tbslen); --int EVP_PKEY_verify_recover_init(EVP_PKEY_CTX *ctx); --int EVP_PKEY_verify_recover(EVP_PKEY_CTX *ctx, -- unsigned char *rout, size_t *routlen, -- const unsigned char *sig, size_t siglen); --int EVP_PKEY_encrypt_init(EVP_PKEY_CTX *ctx); --int EVP_PKEY_encrypt(EVP_PKEY_CTX *ctx, -- unsigned char *out, size_t *outlen, -- const unsigned char *in, size_t inlen); --int EVP_PKEY_decrypt_init(EVP_PKEY_CTX *ctx); --int EVP_PKEY_decrypt(EVP_PKEY_CTX *ctx, -- unsigned char *out, size_t *outlen, -- const unsigned char *in, size_t inlen); -- --int EVP_PKEY_derive_init(EVP_PKEY_CTX *ctx); --int EVP_PKEY_derive_set_peer(EVP_PKEY_CTX *ctx, EVP_PKEY *peer); --int EVP_PKEY_derive(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen); -- --typedef int EVP_PKEY_gen_cb(EVP_PKEY_CTX *ctx); -- --int EVP_PKEY_paramgen_init(EVP_PKEY_CTX *ctx); --int EVP_PKEY_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey); --int EVP_PKEY_keygen_init(EVP_PKEY_CTX *ctx); --int EVP_PKEY_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey); --int EVP_PKEY_check(EVP_PKEY_CTX *ctx); --int EVP_PKEY_public_check(EVP_PKEY_CTX *ctx); --int EVP_PKEY_param_check(EVP_PKEY_CTX *ctx); -- --void EVP_PKEY_CTX_set_cb(EVP_PKEY_CTX *ctx, EVP_PKEY_gen_cb *cb); --EVP_PKEY_gen_cb *EVP_PKEY_CTX_get_cb(EVP_PKEY_CTX *ctx); -- --int EVP_PKEY_CTX_get_keygen_info(EVP_PKEY_CTX *ctx, int idx); -- --void EVP_PKEY_meth_set_init(EVP_PKEY_METHOD *pmeth, -- int (*init) (EVP_PKEY_CTX *ctx)); -- --void EVP_PKEY_meth_set_copy(EVP_PKEY_METHOD *pmeth, -- int (*copy) (EVP_PKEY_CTX *dst, -- EVP_PKEY_CTX *src)); -- --void EVP_PKEY_meth_set_cleanup(EVP_PKEY_METHOD *pmeth, -- void (*cleanup) (EVP_PKEY_CTX *ctx)); -- --void EVP_PKEY_meth_set_paramgen(EVP_PKEY_METHOD *pmeth, -- int (*paramgen_init) (EVP_PKEY_CTX *ctx), -- int (*paramgen) (EVP_PKEY_CTX *ctx, -- EVP_PKEY *pkey)); -- --void EVP_PKEY_meth_set_keygen(EVP_PKEY_METHOD *pmeth, -- int (*keygen_init) (EVP_PKEY_CTX *ctx), -- int (*keygen) (EVP_PKEY_CTX *ctx, -- EVP_PKEY *pkey)); -- --void EVP_PKEY_meth_set_sign(EVP_PKEY_METHOD *pmeth, -- int (*sign_init) (EVP_PKEY_CTX *ctx), -- int (*sign) (EVP_PKEY_CTX *ctx, -- unsigned char *sig, size_t *siglen, -- const unsigned char *tbs, -- size_t tbslen)); -- --void EVP_PKEY_meth_set_verify(EVP_PKEY_METHOD *pmeth, -- int (*verify_init) (EVP_PKEY_CTX *ctx), -- int (*verify) (EVP_PKEY_CTX *ctx, -- const unsigned char *sig, -- size_t siglen, -- const unsigned char *tbs, -- size_t tbslen)); -- --void EVP_PKEY_meth_set_verify_recover(EVP_PKEY_METHOD *pmeth, -- int (*verify_recover_init) (EVP_PKEY_CTX -- *ctx), -- int (*verify_recover) (EVP_PKEY_CTX -- *ctx, -- unsigned char -- *sig, -- size_t *siglen, -- const unsigned -- char *tbs, -- size_t tbslen)); -- --void EVP_PKEY_meth_set_signctx(EVP_PKEY_METHOD *pmeth, -- int (*signctx_init) (EVP_PKEY_CTX *ctx, -- EVP_MD_CTX *mctx), -- int (*signctx) (EVP_PKEY_CTX *ctx, -- unsigned char *sig, -- size_t *siglen, -- EVP_MD_CTX *mctx)); -- --void EVP_PKEY_meth_set_verifyctx(EVP_PKEY_METHOD *pmeth, -- int (*verifyctx_init) (EVP_PKEY_CTX *ctx, -- EVP_MD_CTX *mctx), -- int (*verifyctx) (EVP_PKEY_CTX *ctx, -- const unsigned char *sig, -- int siglen, -- EVP_MD_CTX *mctx)); -- --void EVP_PKEY_meth_set_encrypt(EVP_PKEY_METHOD *pmeth, -- int (*encrypt_init) (EVP_PKEY_CTX *ctx), -- int (*encryptfn) (EVP_PKEY_CTX *ctx, -- unsigned char *out, -- size_t *outlen, -- const unsigned char *in, -- size_t inlen)); -- --void EVP_PKEY_meth_set_decrypt(EVP_PKEY_METHOD *pmeth, -- int (*decrypt_init) (EVP_PKEY_CTX *ctx), -- int (*decrypt) (EVP_PKEY_CTX *ctx, -- unsigned char *out, -- size_t *outlen, -- const unsigned char *in, -- size_t inlen)); -- --void EVP_PKEY_meth_set_derive(EVP_PKEY_METHOD *pmeth, -- int (*derive_init) (EVP_PKEY_CTX *ctx), -- int (*derive) (EVP_PKEY_CTX *ctx, -- unsigned char *key, -- size_t *keylen)); -- --void EVP_PKEY_meth_set_ctrl(EVP_PKEY_METHOD *pmeth, -- int (*ctrl) (EVP_PKEY_CTX *ctx, int type, int p1, -- void *p2), -- int (*ctrl_str) (EVP_PKEY_CTX *ctx, -- const char *type, -- const char *value)); -- --void EVP_PKEY_meth_set_digestsign(EVP_PKEY_METHOD *pmeth, -- int (*digestsign) (EVP_MD_CTX *ctx, -- unsigned char *sig, -- size_t *siglen, -- const unsigned char *tbs, -- size_t tbslen)); -- --void EVP_PKEY_meth_set_digestverify(EVP_PKEY_METHOD *pmeth, -- int (*digestverify) (EVP_MD_CTX *ctx, -- const unsigned char *sig, -- size_t siglen, -- const unsigned char *tbs, -- size_t tbslen)); -- --void EVP_PKEY_meth_set_check(EVP_PKEY_METHOD *pmeth, -- int (*check) (EVP_PKEY *pkey)); -- --void EVP_PKEY_meth_set_public_check(EVP_PKEY_METHOD *pmeth, -- int (*check) (EVP_PKEY *pkey)); -- --void EVP_PKEY_meth_set_param_check(EVP_PKEY_METHOD *pmeth, -- int (*check) (EVP_PKEY *pkey)); -- --void EVP_PKEY_meth_set_digest_custom(EVP_PKEY_METHOD *pmeth, -- int (*digest_custom) (EVP_PKEY_CTX *ctx, -- EVP_MD_CTX *mctx)); -- --void EVP_PKEY_meth_get_init(const EVP_PKEY_METHOD *pmeth, -- int (**pinit) (EVP_PKEY_CTX *ctx)); -- --void EVP_PKEY_meth_get_copy(const EVP_PKEY_METHOD *pmeth, -- int (**pcopy) (EVP_PKEY_CTX *dst, -- EVP_PKEY_CTX *src)); -- --void EVP_PKEY_meth_get_cleanup(const EVP_PKEY_METHOD *pmeth, -- void (**pcleanup) (EVP_PKEY_CTX *ctx)); -- --void EVP_PKEY_meth_get_paramgen(const EVP_PKEY_METHOD *pmeth, -- int (**pparamgen_init) (EVP_PKEY_CTX *ctx), -- int (**pparamgen) (EVP_PKEY_CTX *ctx, -- EVP_PKEY *pkey)); -- --void EVP_PKEY_meth_get_keygen(const EVP_PKEY_METHOD *pmeth, -- int (**pkeygen_init) (EVP_PKEY_CTX *ctx), -- int (**pkeygen) (EVP_PKEY_CTX *ctx, -- EVP_PKEY *pkey)); -- --void EVP_PKEY_meth_get_sign(const EVP_PKEY_METHOD *pmeth, -- int (**psign_init) (EVP_PKEY_CTX *ctx), -- int (**psign) (EVP_PKEY_CTX *ctx, -- unsigned char *sig, size_t *siglen, -- const unsigned char *tbs, -- size_t tbslen)); -- --void EVP_PKEY_meth_get_verify(const EVP_PKEY_METHOD *pmeth, -- int (**pverify_init) (EVP_PKEY_CTX *ctx), -- int (**pverify) (EVP_PKEY_CTX *ctx, -- const unsigned char *sig, -- size_t siglen, -- const unsigned char *tbs, -- size_t tbslen)); -- --void EVP_PKEY_meth_get_verify_recover(const EVP_PKEY_METHOD *pmeth, -- int (**pverify_recover_init) (EVP_PKEY_CTX -- *ctx), -- int (**pverify_recover) (EVP_PKEY_CTX -- *ctx, -- unsigned char -- *sig, -- size_t *siglen, -- const unsigned -- char *tbs, -- size_t tbslen)); -- --void EVP_PKEY_meth_get_signctx(const EVP_PKEY_METHOD *pmeth, -- int (**psignctx_init) (EVP_PKEY_CTX *ctx, -- EVP_MD_CTX *mctx), -- int (**psignctx) (EVP_PKEY_CTX *ctx, -- unsigned char *sig, -- size_t *siglen, -- EVP_MD_CTX *mctx)); -- --void EVP_PKEY_meth_get_verifyctx(const EVP_PKEY_METHOD *pmeth, -- int (**pverifyctx_init) (EVP_PKEY_CTX *ctx, -- EVP_MD_CTX *mctx), -- int (**pverifyctx) (EVP_PKEY_CTX *ctx, -- const unsigned char *sig, -- int siglen, -- EVP_MD_CTX *mctx)); -- --void EVP_PKEY_meth_get_encrypt(const EVP_PKEY_METHOD *pmeth, -- int (**pencrypt_init) (EVP_PKEY_CTX *ctx), -- int (**pencryptfn) (EVP_PKEY_CTX *ctx, -- unsigned char *out, -- size_t *outlen, -- const unsigned char *in, -- size_t inlen)); -- --void EVP_PKEY_meth_get_decrypt(const EVP_PKEY_METHOD *pmeth, -- int (**pdecrypt_init) (EVP_PKEY_CTX *ctx), -- int (**pdecrypt) (EVP_PKEY_CTX *ctx, -- unsigned char *out, -- size_t *outlen, -- const unsigned char *in, -- size_t inlen)); -- --void EVP_PKEY_meth_get_derive(const EVP_PKEY_METHOD *pmeth, -- int (**pderive_init) (EVP_PKEY_CTX *ctx), -- int (**pderive) (EVP_PKEY_CTX *ctx, -- unsigned char *key, -- size_t *keylen)); -- --void EVP_PKEY_meth_get_ctrl(const EVP_PKEY_METHOD *pmeth, -- int (**pctrl) (EVP_PKEY_CTX *ctx, int type, int p1, -- void *p2), -- int (**pctrl_str) (EVP_PKEY_CTX *ctx, -- const char *type, -- const char *value)); -- --void EVP_PKEY_meth_get_digestsign(EVP_PKEY_METHOD *pmeth, -- int (**digestsign) (EVP_MD_CTX *ctx, -- unsigned char *sig, -- size_t *siglen, -- const unsigned char *tbs, -- size_t tbslen)); -- --void EVP_PKEY_meth_get_digestverify(EVP_PKEY_METHOD *pmeth, -- int (**digestverify) (EVP_MD_CTX *ctx, -- const unsigned char *sig, -- size_t siglen, -- const unsigned char *tbs, -- size_t tbslen)); -- --void EVP_PKEY_meth_get_check(const EVP_PKEY_METHOD *pmeth, -- int (**pcheck) (EVP_PKEY *pkey)); -- --void EVP_PKEY_meth_get_public_check(const EVP_PKEY_METHOD *pmeth, -- int (**pcheck) (EVP_PKEY *pkey)); -- --void EVP_PKEY_meth_get_param_check(const EVP_PKEY_METHOD *pmeth, -- int (**pcheck) (EVP_PKEY *pkey)); -- --void EVP_PKEY_meth_get_digest_custom(EVP_PKEY_METHOD *pmeth, -- int (**pdigest_custom) (EVP_PKEY_CTX *ctx, -- EVP_MD_CTX *mctx)); --void EVP_add_alg_module(void); -- -- --# ifdef __cplusplus --} --# endif --#endif -diff --git a/uadk_tool/include/openssl/evperr.h b/uadk_tool/include/openssl/evperr.h -deleted file mode 100644 -index b4ea90a..0000000 ---- a/uadk_tool/include/openssl/evperr.h -+++ /dev/null -@@ -1,204 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_EVPERR_H --# define HEADER_EVPERR_H -- --# include -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_EVP_strings(void); -- --/* -- * EVP function codes. -- */ --# define EVP_F_AESNI_INIT_KEY 165 --# define EVP_F_AESNI_XTS_INIT_KEY 207 --# define EVP_F_AES_GCM_CTRL 196 --# define EVP_F_AES_INIT_KEY 133 --# define EVP_F_AES_OCB_CIPHER 169 --# define EVP_F_AES_T4_INIT_KEY 178 --# define EVP_F_AES_T4_XTS_INIT_KEY 208 --# define EVP_F_AES_WRAP_CIPHER 170 --# define EVP_F_AES_XTS_INIT_KEY 209 --# define EVP_F_ALG_MODULE_INIT 177 --# define EVP_F_ARIA_CCM_INIT_KEY 175 --# define EVP_F_ARIA_GCM_CTRL 197 --# define EVP_F_ARIA_GCM_INIT_KEY 176 --# define EVP_F_ARIA_INIT_KEY 185 --# define EVP_F_B64_NEW 198 --# define EVP_F_CAMELLIA_INIT_KEY 159 --# define EVP_F_CHACHA20_POLY1305_CTRL 182 --# define EVP_F_CMLL_T4_INIT_KEY 179 --# define EVP_F_DES_EDE3_WRAP_CIPHER 171 --# define EVP_F_DO_SIGVER_INIT 161 --# define EVP_F_ENC_NEW 199 --# define EVP_F_EVP_CIPHERINIT_EX 123 --# define EVP_F_EVP_CIPHER_ASN1_TO_PARAM 204 --# define EVP_F_EVP_CIPHER_CTX_COPY 163 --# define EVP_F_EVP_CIPHER_CTX_CTRL 124 --# define EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH 122 --# define EVP_F_EVP_CIPHER_PARAM_TO_ASN1 205 --# define EVP_F_EVP_DECRYPTFINAL_EX 101 --# define EVP_F_EVP_DECRYPTUPDATE 166 --# define EVP_F_EVP_DIGESTFINALXOF 174 --# define EVP_F_EVP_DIGESTINIT_EX 128 --# define EVP_F_EVP_ENCRYPTDECRYPTUPDATE 219 --# define EVP_F_EVP_ENCRYPTFINAL_EX 127 --# define EVP_F_EVP_ENCRYPTUPDATE 167 --# define EVP_F_EVP_MD_CTX_COPY_EX 110 --# define EVP_F_EVP_MD_SIZE 162 --# define EVP_F_EVP_OPENINIT 102 --# define EVP_F_EVP_PBE_ALG_ADD 115 --# define EVP_F_EVP_PBE_ALG_ADD_TYPE 160 --# define EVP_F_EVP_PBE_CIPHERINIT 116 --# define EVP_F_EVP_PBE_SCRYPT 181 --# define EVP_F_EVP_PKCS82PKEY 111 --# define EVP_F_EVP_PKEY2PKCS8 113 --# define EVP_F_EVP_PKEY_ASN1_ADD0 188 --# define EVP_F_EVP_PKEY_CHECK 186 --# define EVP_F_EVP_PKEY_COPY_PARAMETERS 103 --# define EVP_F_EVP_PKEY_CTX_CTRL 137 --# define EVP_F_EVP_PKEY_CTX_CTRL_STR 150 --# define EVP_F_EVP_PKEY_CTX_DUP 156 --# define EVP_F_EVP_PKEY_CTX_MD 168 --# define EVP_F_EVP_PKEY_DECRYPT 104 --# define EVP_F_EVP_PKEY_DECRYPT_INIT 138 --# define EVP_F_EVP_PKEY_DECRYPT_OLD 151 --# define EVP_F_EVP_PKEY_DERIVE 153 --# define EVP_F_EVP_PKEY_DERIVE_INIT 154 --# define EVP_F_EVP_PKEY_DERIVE_SET_PEER 155 --# define EVP_F_EVP_PKEY_ENCRYPT 105 --# define EVP_F_EVP_PKEY_ENCRYPT_INIT 139 --# define EVP_F_EVP_PKEY_ENCRYPT_OLD 152 --# define EVP_F_EVP_PKEY_GET0_DH 119 --# define EVP_F_EVP_PKEY_GET0_DSA 120 --# define EVP_F_EVP_PKEY_GET0_EC_KEY 131 --# define EVP_F_EVP_PKEY_GET0_HMAC 183 --# define EVP_F_EVP_PKEY_GET0_POLY1305 184 --# define EVP_F_EVP_PKEY_GET0_RSA 121 --# define EVP_F_EVP_PKEY_GET0_SIPHASH 172 --# define EVP_F_EVP_PKEY_GET_RAW_PRIVATE_KEY 202 --# define EVP_F_EVP_PKEY_GET_RAW_PUBLIC_KEY 203 --# define EVP_F_EVP_PKEY_KEYGEN 146 --# define EVP_F_EVP_PKEY_KEYGEN_INIT 147 --# define EVP_F_EVP_PKEY_METH_ADD0 194 --# define EVP_F_EVP_PKEY_METH_NEW 195 --# define EVP_F_EVP_PKEY_NEW 106 --# define EVP_F_EVP_PKEY_NEW_CMAC_KEY 193 --# define EVP_F_EVP_PKEY_NEW_RAW_PRIVATE_KEY 191 --# define EVP_F_EVP_PKEY_NEW_RAW_PUBLIC_KEY 192 --# define EVP_F_EVP_PKEY_PARAMGEN 148 --# define EVP_F_EVP_PKEY_PARAMGEN_INIT 149 --# define EVP_F_EVP_PKEY_PARAM_CHECK 189 --# define EVP_F_EVP_PKEY_PUBLIC_CHECK 190 --# define EVP_F_EVP_PKEY_SET1_ENGINE 187 --# define EVP_F_EVP_PKEY_SET_ALIAS_TYPE 206 --# define EVP_F_EVP_PKEY_SIGN 140 --# define EVP_F_EVP_PKEY_SIGN_INIT 141 --# define EVP_F_EVP_PKEY_VERIFY 142 --# define EVP_F_EVP_PKEY_VERIFY_INIT 143 --# define EVP_F_EVP_PKEY_VERIFY_RECOVER 144 --# define EVP_F_EVP_PKEY_VERIFY_RECOVER_INIT 145 --# define EVP_F_EVP_SIGNFINAL 107 --# define EVP_F_EVP_VERIFYFINAL 108 --# define EVP_F_INT_CTX_NEW 157 --# define EVP_F_OK_NEW 200 --# define EVP_F_PKCS5_PBE_KEYIVGEN 117 --# define EVP_F_PKCS5_V2_PBE_KEYIVGEN 118 --# define EVP_F_PKCS5_V2_PBKDF2_KEYIVGEN 164 --# define EVP_F_PKCS5_V2_SCRYPT_KEYIVGEN 180 --# define EVP_F_PKEY_SET_TYPE 158 --# define EVP_F_RC2_MAGIC_TO_METH 109 --# define EVP_F_RC5_CTRL 125 --# define EVP_F_R_32_12_16_INIT_KEY 242 --# define EVP_F_S390X_AES_GCM_CTRL 201 --# define EVP_F_UPDATE 173 -- --/* -- * EVP reason codes. -- */ --# define EVP_R_AES_KEY_SETUP_FAILED 143 --# define EVP_R_ARIA_KEY_SETUP_FAILED 176 --# define EVP_R_BAD_DECRYPT 100 --# define EVP_R_BAD_KEY_LENGTH 195 --# define EVP_R_BUFFER_TOO_SMALL 155 --# define EVP_R_CAMELLIA_KEY_SETUP_FAILED 157 --# define EVP_R_CIPHER_PARAMETER_ERROR 122 --# define EVP_R_COMMAND_NOT_SUPPORTED 147 --# define EVP_R_COPY_ERROR 173 --# define EVP_R_CTRL_NOT_IMPLEMENTED 132 --# define EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED 133 --# define EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH 138 --# define EVP_R_DECODE_ERROR 114 --# define EVP_R_DIFFERENT_KEY_TYPES 101 --# define EVP_R_DIFFERENT_PARAMETERS 153 --# define EVP_R_ERROR_LOADING_SECTION 165 --# define EVP_R_ERROR_SETTING_FIPS_MODE 166 --# define EVP_R_EXPECTING_AN_HMAC_KEY 174 --# define EVP_R_EXPECTING_AN_RSA_KEY 127 --# define EVP_R_EXPECTING_A_DH_KEY 128 --# define EVP_R_EXPECTING_A_DSA_KEY 129 --# define EVP_R_EXPECTING_A_EC_KEY 142 --# define EVP_R_EXPECTING_A_POLY1305_KEY 164 --# define EVP_R_EXPECTING_A_SIPHASH_KEY 175 --# define EVP_R_FIPS_MODE_NOT_SUPPORTED 167 --# define EVP_R_GET_RAW_KEY_FAILED 182 --# define EVP_R_ILLEGAL_SCRYPT_PARAMETERS 171 --# define EVP_R_INITIALIZATION_ERROR 134 --# define EVP_R_INPUT_NOT_INITIALIZED 111 --# define EVP_R_INVALID_DIGEST 152 --# define EVP_R_INVALID_FIPS_MODE 168 --# define EVP_R_INVALID_IV_LENGTH 194 --# define EVP_R_INVALID_KEY 163 --# define EVP_R_INVALID_KEY_LENGTH 130 --# define EVP_R_INVALID_OPERATION 148 --# define EVP_R_KEYGEN_FAILURE 120 --# define EVP_R_KEY_SETUP_FAILED 180 --# define EVP_R_MEMORY_LIMIT_EXCEEDED 172 --# define EVP_R_MESSAGE_DIGEST_IS_NULL 159 --# define EVP_R_METHOD_NOT_SUPPORTED 144 --# define EVP_R_MISSING_PARAMETERS 103 --# define EVP_R_NOT_XOF_OR_INVALID_LENGTH 178 --# define EVP_R_NO_CIPHER_SET 131 --# define EVP_R_NO_DEFAULT_DIGEST 158 --# define EVP_R_NO_DIGEST_SET 139 --# define EVP_R_NO_KEY_SET 154 --# define EVP_R_NO_OPERATION_SET 149 --# define EVP_R_ONLY_ONESHOT_SUPPORTED 177 --# define EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE 150 --# define EVP_R_OPERATON_NOT_INITIALIZED 151 --# define EVP_R_OUTPUT_WOULD_OVERFLOW 184 --# define EVP_R_PARTIALLY_OVERLAPPING 162 --# define EVP_R_PBKDF2_ERROR 181 --# define EVP_R_PKEY_APPLICATION_ASN1_METHOD_ALREADY_REGISTERED 179 --# define EVP_R_PRIVATE_KEY_DECODE_ERROR 145 --# define EVP_R_PRIVATE_KEY_ENCODE_ERROR 146 --# define EVP_R_PUBLIC_KEY_NOT_RSA 106 --# define EVP_R_UNKNOWN_CIPHER 160 --# define EVP_R_UNKNOWN_DIGEST 161 --# define EVP_R_UNKNOWN_OPTION 169 --# define EVP_R_UNKNOWN_PBE_ALGORITHM 121 --# define EVP_R_UNSUPPORTED_ALGORITHM 156 --# define EVP_R_UNSUPPORTED_CIPHER 107 --# define EVP_R_UNSUPPORTED_KEYLENGTH 123 --# define EVP_R_UNSUPPORTED_KEY_DERIVATION_FUNCTION 124 --# define EVP_R_UNSUPPORTED_KEY_SIZE 108 --# define EVP_R_UNSUPPORTED_NUMBER_OF_ROUNDS 135 --# define EVP_R_UNSUPPORTED_PRF 125 --# define EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM 118 --# define EVP_R_UNSUPPORTED_SALT_TYPE 126 --# define EVP_R_WRAP_MODE_NOT_ALLOWED 170 --# define EVP_R_WRONG_FINAL_BLOCK_LENGTH 109 --# define EVP_R_XTS_DUPLICATED_KEYS 183 -- --#endif -diff --git a/uadk_tool/include/openssl/hmac.h b/uadk_tool/include/openssl/hmac.h -deleted file mode 100644 -index 458efc1..0000000 ---- a/uadk_tool/include/openssl/hmac.h -+++ /dev/null -@@ -1,51 +0,0 @@ --/* -- * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_HMAC_H --# define HEADER_HMAC_H -- --# include -- --# include -- --# if OPENSSL_API_COMPAT < 0x10200000L --# define HMAC_MAX_MD_CBLOCK 128 /* Deprecated */ --# endif -- --#ifdef __cplusplus --extern "C" { --#endif -- --size_t HMAC_size(const HMAC_CTX *e); --HMAC_CTX *HMAC_CTX_new(void); --int HMAC_CTX_reset(HMAC_CTX *ctx); --void HMAC_CTX_free(HMAC_CTX *ctx); -- --DEPRECATEDIN_1_1_0(__owur int HMAC_Init(HMAC_CTX *ctx, const void *key, int len, -- const EVP_MD *md)) -- --/*__owur*/ int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, -- const EVP_MD *md, ENGINE *impl); --/*__owur*/ int HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, -- size_t len); --/*__owur*/ int HMAC_Final(HMAC_CTX *ctx, unsigned char *md, -- unsigned int *len); --unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len, -- const unsigned char *d, size_t n, unsigned char *md, -- unsigned int *md_len); --__owur int HMAC_CTX_copy(HMAC_CTX *dctx, HMAC_CTX *sctx); -- --void HMAC_CTX_set_flags(HMAC_CTX *ctx, unsigned long flags); --const EVP_MD *HMAC_CTX_get_md(const HMAC_CTX *ctx); -- --#ifdef __cplusplus --} --#endif -- --#endif -diff --git a/uadk_tool/include/openssl/idea.h b/uadk_tool/include/openssl/idea.h -deleted file mode 100644 -index 4334f3e..0000000 ---- a/uadk_tool/include/openssl/idea.h -+++ /dev/null -@@ -1,64 +0,0 @@ --/* -- * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_IDEA_H --# define HEADER_IDEA_H -- --# include -- --# ifndef OPENSSL_NO_IDEA --# ifdef __cplusplus --extern "C" { --# endif -- --typedef unsigned int IDEA_INT; -- --# define IDEA_ENCRYPT 1 --# define IDEA_DECRYPT 0 -- --# define IDEA_BLOCK 8 --# define IDEA_KEY_LENGTH 16 -- --typedef struct idea_key_st { -- IDEA_INT data[9][6]; --} IDEA_KEY_SCHEDULE; -- --const char *IDEA_options(void); --void IDEA_ecb_encrypt(const unsigned char *in, unsigned char *out, -- IDEA_KEY_SCHEDULE *ks); --void IDEA_set_encrypt_key(const unsigned char *key, IDEA_KEY_SCHEDULE *ks); --void IDEA_set_decrypt_key(IDEA_KEY_SCHEDULE *ek, IDEA_KEY_SCHEDULE *dk); --void IDEA_cbc_encrypt(const unsigned char *in, unsigned char *out, -- long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv, -- int enc); --void IDEA_cfb64_encrypt(const unsigned char *in, unsigned char *out, -- long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv, -- int *num, int enc); --void IDEA_ofb64_encrypt(const unsigned char *in, unsigned char *out, -- long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv, -- int *num); --void IDEA_encrypt(unsigned long *in, IDEA_KEY_SCHEDULE *ks); -- --# if OPENSSL_API_COMPAT < 0x10100000L --# define idea_options IDEA_options --# define idea_ecb_encrypt IDEA_ecb_encrypt --# define idea_set_encrypt_key IDEA_set_encrypt_key --# define idea_set_decrypt_key IDEA_set_decrypt_key --# define idea_cbc_encrypt IDEA_cbc_encrypt --# define idea_cfb64_encrypt IDEA_cfb64_encrypt --# define idea_ofb64_encrypt IDEA_ofb64_encrypt --# define idea_encrypt IDEA_encrypt --# endif -- --# ifdef __cplusplus --} --# endif --# endif -- --#endif -diff --git a/uadk_tool/include/openssl/kdf.h b/uadk_tool/include/openssl/kdf.h -deleted file mode 100644 -index 5abd4c3..0000000 ---- a/uadk_tool/include/openssl/kdf.h -+++ /dev/null -@@ -1,97 +0,0 @@ --/* -- * Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_KDF_H --# define HEADER_KDF_H -- --# include --#ifdef __cplusplus --extern "C" { --#endif -- --# define EVP_PKEY_CTRL_TLS_MD (EVP_PKEY_ALG_CTRL) --# define EVP_PKEY_CTRL_TLS_SECRET (EVP_PKEY_ALG_CTRL + 1) --# define EVP_PKEY_CTRL_TLS_SEED (EVP_PKEY_ALG_CTRL + 2) --# define EVP_PKEY_CTRL_HKDF_MD (EVP_PKEY_ALG_CTRL + 3) --# define EVP_PKEY_CTRL_HKDF_SALT (EVP_PKEY_ALG_CTRL + 4) --# define EVP_PKEY_CTRL_HKDF_KEY (EVP_PKEY_ALG_CTRL + 5) --# define EVP_PKEY_CTRL_HKDF_INFO (EVP_PKEY_ALG_CTRL + 6) --# define EVP_PKEY_CTRL_HKDF_MODE (EVP_PKEY_ALG_CTRL + 7) --# define EVP_PKEY_CTRL_PASS (EVP_PKEY_ALG_CTRL + 8) --# define EVP_PKEY_CTRL_SCRYPT_SALT (EVP_PKEY_ALG_CTRL + 9) --# define EVP_PKEY_CTRL_SCRYPT_N (EVP_PKEY_ALG_CTRL + 10) --# define EVP_PKEY_CTRL_SCRYPT_R (EVP_PKEY_ALG_CTRL + 11) --# define EVP_PKEY_CTRL_SCRYPT_P (EVP_PKEY_ALG_CTRL + 12) --# define EVP_PKEY_CTRL_SCRYPT_MAXMEM_BYTES (EVP_PKEY_ALG_CTRL + 13) -- --# define EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND 0 --# define EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY 1 --# define EVP_PKEY_HKDEF_MODE_EXPAND_ONLY 2 -- --# define EVP_PKEY_CTX_set_tls1_prf_md(pctx, md) \ -- EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_TLS_MD, 0, (void *)(md)) -- --# define EVP_PKEY_CTX_set1_tls1_prf_secret(pctx, sec, seclen) \ -- EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_TLS_SECRET, seclen, (void *)(sec)) -- --# define EVP_PKEY_CTX_add1_tls1_prf_seed(pctx, seed, seedlen) \ -- EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_TLS_SEED, seedlen, (void *)(seed)) -- --# define EVP_PKEY_CTX_set_hkdf_md(pctx, md) \ -- EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_HKDF_MD, 0, (void *)(md)) -- --# define EVP_PKEY_CTX_set1_hkdf_salt(pctx, salt, saltlen) \ -- EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_HKDF_SALT, saltlen, (void *)(salt)) -- --# define EVP_PKEY_CTX_set1_hkdf_key(pctx, key, keylen) \ -- EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_HKDF_KEY, keylen, (void *)(key)) -- --# define EVP_PKEY_CTX_add1_hkdf_info(pctx, info, infolen) \ -- EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_HKDF_INFO, infolen, (void *)(info)) -- --# define EVP_PKEY_CTX_hkdf_mode(pctx, mode) \ -- EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_HKDF_MODE, mode, NULL) -- --# define EVP_PKEY_CTX_set1_pbe_pass(pctx, pass, passlen) \ -- EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_PASS, passlen, (void *)(pass)) -- --# define EVP_PKEY_CTX_set1_scrypt_salt(pctx, salt, saltlen) \ -- EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_SCRYPT_SALT, saltlen, (void *)(salt)) -- --# define EVP_PKEY_CTX_set_scrypt_N(pctx, n) \ -- EVP_PKEY_CTX_ctrl_uint64(pctx, -1, EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_SCRYPT_N, n) -- --# define EVP_PKEY_CTX_set_scrypt_r(pctx, r) \ -- EVP_PKEY_CTX_ctrl_uint64(pctx, -1, EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_SCRYPT_R, r) -- --# define EVP_PKEY_CTX_set_scrypt_p(pctx, p) \ -- EVP_PKEY_CTX_ctrl_uint64(pctx, -1, EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_SCRYPT_P, p) -- --# define EVP_PKEY_CTX_set_scrypt_maxmem_bytes(pctx, maxmem_bytes) \ -- EVP_PKEY_CTX_ctrl_uint64(pctx, -1, EVP_PKEY_OP_DERIVE, \ -- EVP_PKEY_CTRL_SCRYPT_MAXMEM_BYTES, maxmem_bytes) -- -- --# ifdef __cplusplus --} --# endif --#endif -diff --git a/uadk_tool/include/openssl/kdferr.h b/uadk_tool/include/openssl/kdferr.h -deleted file mode 100644 -index 3f51bd0..0000000 ---- a/uadk_tool/include/openssl/kdferr.h -+++ /dev/null -@@ -1,55 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_KDFERR_H --# define HEADER_KDFERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_KDF_strings(void); -- --/* -- * KDF function codes. -- */ --# define KDF_F_PKEY_HKDF_CTRL_STR 103 --# define KDF_F_PKEY_HKDF_DERIVE 102 --# define KDF_F_PKEY_HKDF_INIT 108 --# define KDF_F_PKEY_SCRYPT_CTRL_STR 104 --# define KDF_F_PKEY_SCRYPT_CTRL_UINT64 105 --# define KDF_F_PKEY_SCRYPT_DERIVE 109 --# define KDF_F_PKEY_SCRYPT_INIT 106 --# define KDF_F_PKEY_SCRYPT_SET_MEMBUF 107 --# define KDF_F_PKEY_TLS1_PRF_CTRL_STR 100 --# define KDF_F_PKEY_TLS1_PRF_DERIVE 101 --# define KDF_F_PKEY_TLS1_PRF_INIT 110 --# define KDF_F_TLS1_PRF_ALG 111 -- --/* -- * KDF reason codes. -- */ --# define KDF_R_INVALID_DIGEST 100 --# define KDF_R_MISSING_ITERATION_COUNT 109 --# define KDF_R_MISSING_KEY 104 --# define KDF_R_MISSING_MESSAGE_DIGEST 105 --# define KDF_R_MISSING_PARAMETER 101 --# define KDF_R_MISSING_PASS 110 --# define KDF_R_MISSING_SALT 111 --# define KDF_R_MISSING_SECRET 107 --# define KDF_R_MISSING_SEED 106 --# define KDF_R_UNKNOWN_PARAMETER_TYPE 103 --# define KDF_R_VALUE_ERROR 108 --# define KDF_R_VALUE_MISSING 102 -- --#endif -diff --git a/uadk_tool/include/openssl/lhash.h b/uadk_tool/include/openssl/lhash.h -deleted file mode 100644 -index 2e42d72..0000000 ---- a/uadk_tool/include/openssl/lhash.h -+++ /dev/null -@@ -1,241 +0,0 @@ --/* -- * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --/* -- * Header for dynamic hash table routines Author - Eric Young -- */ -- --#ifndef HEADER_LHASH_H --# define HEADER_LHASH_H -- --# include --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --typedef struct lhash_node_st OPENSSL_LH_NODE; --typedef int (*OPENSSL_LH_COMPFUNC) (const void *, const void *); --typedef unsigned long (*OPENSSL_LH_HASHFUNC) (const void *); --typedef void (*OPENSSL_LH_DOALL_FUNC) (void *); --typedef void (*OPENSSL_LH_DOALL_FUNCARG) (void *, void *); --typedef struct lhash_st OPENSSL_LHASH; -- --/* -- * Macros for declaring and implementing type-safe wrappers for LHASH -- * callbacks. This way, callbacks can be provided to LHASH structures without -- * function pointer casting and the macro-defined callbacks provide -- * per-variable casting before deferring to the underlying type-specific -- * callbacks. NB: It is possible to place a "static" in front of both the -- * DECLARE and IMPLEMENT macros if the functions are strictly internal. -- */ -- --/* First: "hash" functions */ --# define DECLARE_LHASH_HASH_FN(name, o_type) \ -- unsigned long name##_LHASH_HASH(const void *); --# define IMPLEMENT_LHASH_HASH_FN(name, o_type) \ -- unsigned long name##_LHASH_HASH(const void *arg) { \ -- const o_type *a = arg; \ -- return name##_hash(a); } --# define LHASH_HASH_FN(name) name##_LHASH_HASH -- --/* Second: "compare" functions */ --# define DECLARE_LHASH_COMP_FN(name, o_type) \ -- int name##_LHASH_COMP(const void *, const void *); --# define IMPLEMENT_LHASH_COMP_FN(name, o_type) \ -- int name##_LHASH_COMP(const void *arg1, const void *arg2) { \ -- const o_type *a = arg1; \ -- const o_type *b = arg2; \ -- return name##_cmp(a,b); } --# define LHASH_COMP_FN(name) name##_LHASH_COMP -- --/* Fourth: "doall_arg" functions */ --# define DECLARE_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ -- void name##_LHASH_DOALL_ARG(void *, void *); --# define IMPLEMENT_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ -- void name##_LHASH_DOALL_ARG(void *arg1, void *arg2) { \ -- o_type *a = arg1; \ -- a_type *b = arg2; \ -- name##_doall_arg(a, b); } --# define LHASH_DOALL_ARG_FN(name) name##_LHASH_DOALL_ARG -- -- --# define LH_LOAD_MULT 256 -- --int OPENSSL_LH_error(OPENSSL_LHASH *lh); --OPENSSL_LHASH *OPENSSL_LH_new(OPENSSL_LH_HASHFUNC h, OPENSSL_LH_COMPFUNC c); --void OPENSSL_LH_free(OPENSSL_LHASH *lh); --void *OPENSSL_LH_insert(OPENSSL_LHASH *lh, void *data); --void *OPENSSL_LH_delete(OPENSSL_LHASH *lh, const void *data); --void *OPENSSL_LH_retrieve(OPENSSL_LHASH *lh, const void *data); --void OPENSSL_LH_doall(OPENSSL_LHASH *lh, OPENSSL_LH_DOALL_FUNC func); --void OPENSSL_LH_doall_arg(OPENSSL_LHASH *lh, OPENSSL_LH_DOALL_FUNCARG func, void *arg); --unsigned long OPENSSL_LH_strhash(const char *c); --unsigned long OPENSSL_LH_num_items(const OPENSSL_LHASH *lh); --unsigned long OPENSSL_LH_get_down_load(const OPENSSL_LHASH *lh); --void OPENSSL_LH_set_down_load(OPENSSL_LHASH *lh, unsigned long down_load); -- --# ifndef OPENSSL_NO_STDIO --void OPENSSL_LH_stats(const OPENSSL_LHASH *lh, FILE *fp); --void OPENSSL_LH_node_stats(const OPENSSL_LHASH *lh, FILE *fp); --void OPENSSL_LH_node_usage_stats(const OPENSSL_LHASH *lh, FILE *fp); --# endif --void OPENSSL_LH_stats_bio(const OPENSSL_LHASH *lh, BIO *out); --void OPENSSL_LH_node_stats_bio(const OPENSSL_LHASH *lh, BIO *out); --void OPENSSL_LH_node_usage_stats_bio(const OPENSSL_LHASH *lh, BIO *out); -- --# if OPENSSL_API_COMPAT < 0x10100000L --# define _LHASH OPENSSL_LHASH --# define LHASH_NODE OPENSSL_LH_NODE --# define lh_error OPENSSL_LH_error --# define lh_new OPENSSL_LH_new --# define lh_free OPENSSL_LH_free --# define lh_insert OPENSSL_LH_insert --# define lh_delete OPENSSL_LH_delete --# define lh_retrieve OPENSSL_LH_retrieve --# define lh_doall OPENSSL_LH_doall --# define lh_doall_arg OPENSSL_LH_doall_arg --# define lh_strhash OPENSSL_LH_strhash --# define lh_num_items OPENSSL_LH_num_items --# ifndef OPENSSL_NO_STDIO --# define lh_stats OPENSSL_LH_stats --# define lh_node_stats OPENSSL_LH_node_stats --# define lh_node_usage_stats OPENSSL_LH_node_usage_stats --# endif --# define lh_stats_bio OPENSSL_LH_stats_bio --# define lh_node_stats_bio OPENSSL_LH_node_stats_bio --# define lh_node_usage_stats_bio OPENSSL_LH_node_usage_stats_bio --# endif -- --/* Type checking... */ -- --# define LHASH_OF(type) struct lhash_st_##type -- --# define DEFINE_LHASH_OF(type) \ -- LHASH_OF(type) { union lh_##type##_dummy { void* d1; unsigned long d2; int d3; } dummy; }; \ -- static ossl_unused ossl_inline LHASH_OF(type) *lh_##type##_new(unsigned long (*hfn)(const type *), \ -- int (*cfn)(const type *, const type *)) \ -- { \ -- return (LHASH_OF(type) *) \ -- OPENSSL_LH_new((OPENSSL_LH_HASHFUNC)hfn, (OPENSSL_LH_COMPFUNC)cfn); \ -- } \ -- static ossl_unused ossl_inline void lh_##type##_free(LHASH_OF(type) *lh) \ -- { \ -- OPENSSL_LH_free((OPENSSL_LHASH *)lh); \ -- } \ -- static ossl_unused ossl_inline type *lh_##type##_insert(LHASH_OF(type) *lh, type *d) \ -- { \ -- return (type *)OPENSSL_LH_insert((OPENSSL_LHASH *)lh, d); \ -- } \ -- static ossl_unused ossl_inline type *lh_##type##_delete(LHASH_OF(type) *lh, const type *d) \ -- { \ -- return (type *)OPENSSL_LH_delete((OPENSSL_LHASH *)lh, d); \ -- } \ -- static ossl_unused ossl_inline type *lh_##type##_retrieve(LHASH_OF(type) *lh, const type *d) \ -- { \ -- return (type *)OPENSSL_LH_retrieve((OPENSSL_LHASH *)lh, d); \ -- } \ -- static ossl_unused ossl_inline int lh_##type##_error(LHASH_OF(type) *lh) \ -- { \ -- return OPENSSL_LH_error((OPENSSL_LHASH *)lh); \ -- } \ -- static ossl_unused ossl_inline unsigned long lh_##type##_num_items(LHASH_OF(type) *lh) \ -- { \ -- return OPENSSL_LH_num_items((OPENSSL_LHASH *)lh); \ -- } \ -- static ossl_unused ossl_inline void lh_##type##_node_stats_bio(const LHASH_OF(type) *lh, BIO *out) \ -- { \ -- OPENSSL_LH_node_stats_bio((const OPENSSL_LHASH *)lh, out); \ -- } \ -- static ossl_unused ossl_inline void lh_##type##_node_usage_stats_bio(const LHASH_OF(type) *lh, BIO *out) \ -- { \ -- OPENSSL_LH_node_usage_stats_bio((const OPENSSL_LHASH *)lh, out); \ -- } \ -- static ossl_unused ossl_inline void lh_##type##_stats_bio(const LHASH_OF(type) *lh, BIO *out) \ -- { \ -- OPENSSL_LH_stats_bio((const OPENSSL_LHASH *)lh, out); \ -- } \ -- static ossl_unused ossl_inline unsigned long lh_##type##_get_down_load(LHASH_OF(type) *lh) \ -- { \ -- return OPENSSL_LH_get_down_load((OPENSSL_LHASH *)lh); \ -- } \ -- static ossl_unused ossl_inline void lh_##type##_set_down_load(LHASH_OF(type) *lh, unsigned long dl) \ -- { \ -- OPENSSL_LH_set_down_load((OPENSSL_LHASH *)lh, dl); \ -- } \ -- static ossl_unused ossl_inline void lh_##type##_doall(LHASH_OF(type) *lh, \ -- void (*doall)(type *)) \ -- { \ -- OPENSSL_LH_doall((OPENSSL_LHASH *)lh, (OPENSSL_LH_DOALL_FUNC)doall); \ -- } \ -- LHASH_OF(type) -- --#define IMPLEMENT_LHASH_DOALL_ARG_CONST(type, argtype) \ -- int_implement_lhash_doall(type, argtype, const type) -- --#define IMPLEMENT_LHASH_DOALL_ARG(type, argtype) \ -- int_implement_lhash_doall(type, argtype, type) -- --#define int_implement_lhash_doall(type, argtype, cbargtype) \ -- static ossl_unused ossl_inline void \ -- lh_##type##_doall_##argtype(LHASH_OF(type) *lh, \ -- void (*fn)(cbargtype *, argtype *), \ -- argtype *arg) \ -- { \ -- OPENSSL_LH_doall_arg((OPENSSL_LHASH *)lh, (OPENSSL_LH_DOALL_FUNCARG)fn, (void *)arg); \ -- } \ -- LHASH_OF(type) -- --DEFINE_LHASH_OF(OPENSSL_STRING); --# ifdef _MSC_VER --/* -- * push and pop this warning: -- * warning C4090: 'function': different 'const' qualifiers -- */ --# pragma warning (push) --# pragma warning (disable: 4090) --# endif -- --DEFINE_LHASH_OF(OPENSSL_CSTRING); -- --# ifdef _MSC_VER --# pragma warning (pop) --# endif -- --/* -- * If called without higher optimization (min. -xO3) the Oracle Developer -- * Studio compiler generates code for the defined (static inline) functions -- * above. -- * This would later lead to the linker complaining about missing symbols when -- * this header file is included but the resulting object is not linked against -- * the Crypto library (openssl#6912). -- */ --# ifdef __SUNPRO_C --# pragma weak OPENSSL_LH_new --# pragma weak OPENSSL_LH_free --# pragma weak OPENSSL_LH_insert --# pragma weak OPENSSL_LH_delete --# pragma weak OPENSSL_LH_retrieve --# pragma weak OPENSSL_LH_error --# pragma weak OPENSSL_LH_num_items --# pragma weak OPENSSL_LH_node_stats_bio --# pragma weak OPENSSL_LH_node_usage_stats_bio --# pragma weak OPENSSL_LH_stats_bio --# pragma weak OPENSSL_LH_get_down_load --# pragma weak OPENSSL_LH_set_down_load --# pragma weak OPENSSL_LH_doall --# pragma weak OPENSSL_LH_doall_arg --# endif /* __SUNPRO_C */ -- --#ifdef __cplusplus --} --#endif -- --#endif -diff --git a/uadk_tool/include/openssl/md2.h b/uadk_tool/include/openssl/md2.h -deleted file mode 100644 -index 7faf8e3..0000000 ---- a/uadk_tool/include/openssl/md2.h -+++ /dev/null -@@ -1,44 +0,0 @@ --/* -- * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_MD2_H --# define HEADER_MD2_H -- --# include -- --# ifndef OPENSSL_NO_MD2 --# include --# ifdef __cplusplus --extern "C" { --# endif -- --typedef unsigned char MD2_INT; -- --# define MD2_DIGEST_LENGTH 16 --# define MD2_BLOCK 16 -- --typedef struct MD2state_st { -- unsigned int num; -- unsigned char data[MD2_BLOCK]; -- MD2_INT cksm[MD2_BLOCK]; -- MD2_INT state[MD2_BLOCK]; --} MD2_CTX; -- --const char *MD2_options(void); --int MD2_Init(MD2_CTX *c); --int MD2_Update(MD2_CTX *c, const unsigned char *data, size_t len); --int MD2_Final(unsigned char *md, MD2_CTX *c); --unsigned char *MD2(const unsigned char *d, size_t n, unsigned char *md); -- --# ifdef __cplusplus --} --# endif --# endif -- --#endif -diff --git a/uadk_tool/include/openssl/md4.h b/uadk_tool/include/openssl/md4.h -deleted file mode 100644 -index 940e29d..0000000 ---- a/uadk_tool/include/openssl/md4.h -+++ /dev/null -@@ -1,51 +0,0 @@ --/* -- * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_MD4_H --# define HEADER_MD4_H -- --# include -- --# ifndef OPENSSL_NO_MD4 --# include --# include --# ifdef __cplusplus --extern "C" { --# endif -- --/*- -- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -- * ! MD4_LONG has to be at least 32 bits wide. ! -- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -- */ --# define MD4_LONG unsigned int -- --# define MD4_CBLOCK 64 --# define MD4_LBLOCK (MD4_CBLOCK/4) --# define MD4_DIGEST_LENGTH 16 -- --typedef struct MD4state_st { -- MD4_LONG A, B, C, D; -- MD4_LONG Nl, Nh; -- MD4_LONG data[MD4_LBLOCK]; -- unsigned int num; --} MD4_CTX; -- --int MD4_Init(MD4_CTX *c); --int MD4_Update(MD4_CTX *c, const void *data, size_t len); --int MD4_Final(unsigned char *md, MD4_CTX *c); --unsigned char *MD4(const unsigned char *d, size_t n, unsigned char *md); --void MD4_Transform(MD4_CTX *c, const unsigned char *b); -- --# ifdef __cplusplus --} --# endif --# endif -- --#endif -diff --git a/uadk_tool/include/openssl/md5.h b/uadk_tool/include/openssl/md5.h -deleted file mode 100644 -index 2deb772..0000000 ---- a/uadk_tool/include/openssl/md5.h -+++ /dev/null -@@ -1,50 +0,0 @@ --/* -- * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_MD5_H --# define HEADER_MD5_H -- --# include -- --# ifndef OPENSSL_NO_MD5 --# include --# include --# ifdef __cplusplus --extern "C" { --# endif -- --/* -- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -- * ! MD5_LONG has to be at least 32 bits wide. ! -- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -- */ --# define MD5_LONG unsigned int -- --# define MD5_CBLOCK 64 --# define MD5_LBLOCK (MD5_CBLOCK/4) --# define MD5_DIGEST_LENGTH 16 -- --typedef struct MD5state_st { -- MD5_LONG A, B, C, D; -- MD5_LONG Nl, Nh; -- MD5_LONG data[MD5_LBLOCK]; -- unsigned int num; --} MD5_CTX; -- --int MD5_Init(MD5_CTX *c); --int MD5_Update(MD5_CTX *c, const void *data, size_t len); --int MD5_Final(unsigned char *md, MD5_CTX *c); --unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md); --void MD5_Transform(MD5_CTX *c, const unsigned char *b); --# ifdef __cplusplus --} --# endif --# endif -- --#endif -diff --git a/uadk_tool/include/openssl/mdc2.h b/uadk_tool/include/openssl/mdc2.h -deleted file mode 100644 -index aabd2bf..0000000 ---- a/uadk_tool/include/openssl/mdc2.h -+++ /dev/null -@@ -1,42 +0,0 @@ --/* -- * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_MDC2_H --# define HEADER_MDC2_H -- --# include -- --#ifndef OPENSSL_NO_MDC2 --# include --# include --# ifdef __cplusplus --extern "C" { --# endif -- --# define MDC2_BLOCK 8 --# define MDC2_DIGEST_LENGTH 16 -- --typedef struct mdc2_ctx_st { -- unsigned int num; -- unsigned char data[MDC2_BLOCK]; -- DES_cblock h, hh; -- int pad_type; /* either 1 or 2, default 1 */ --} MDC2_CTX; -- --int MDC2_Init(MDC2_CTX *c); --int MDC2_Update(MDC2_CTX *c, const unsigned char *data, size_t len); --int MDC2_Final(unsigned char *md, MDC2_CTX *c); --unsigned char *MDC2(const unsigned char *d, size_t n, unsigned char *md); -- --# ifdef __cplusplus --} --# endif --# endif -- --#endif -diff --git a/uadk_tool/include/openssl/modes.h b/uadk_tool/include/openssl/modes.h -deleted file mode 100644 -index d544f98..0000000 ---- a/uadk_tool/include/openssl/modes.h -+++ /dev/null -@@ -1,208 +0,0 @@ --/* -- * Copyright 2008-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_MODES_H --# define HEADER_MODES_H -- --# include -- --# ifdef __cplusplus --extern "C" { --# endif --typedef void (*block128_f) (const unsigned char in[16], -- unsigned char out[16], const void *key); -- --typedef void (*cbc128_f) (const unsigned char *in, unsigned char *out, -- size_t len, const void *key, -- unsigned char ivec[16], int enc); -- --typedef void (*ctr128_f) (const unsigned char *in, unsigned char *out, -- size_t blocks, const void *key, -- const unsigned char ivec[16]); -- --typedef void (*ccm128_f) (const unsigned char *in, unsigned char *out, -- size_t blocks, const void *key, -- const unsigned char ivec[16], -- unsigned char cmac[16]); -- --void CRYPTO_cbc128_encrypt(const unsigned char *in, unsigned char *out, -- size_t len, const void *key, -- unsigned char ivec[16], block128_f block); --void CRYPTO_cbc128_decrypt(const unsigned char *in, unsigned char *out, -- size_t len, const void *key, -- unsigned char ivec[16], block128_f block); -- --void CRYPTO_ctr128_encrypt(const unsigned char *in, unsigned char *out, -- size_t len, const void *key, -- unsigned char ivec[16], -- unsigned char ecount_buf[16], unsigned int *num, -- block128_f block); -- --void CRYPTO_ctr128_encrypt_ctr32(const unsigned char *in, unsigned char *out, -- size_t len, const void *key, -- unsigned char ivec[16], -- unsigned char ecount_buf[16], -- unsigned int *num, ctr128_f ctr); -- --void CRYPTO_ofb128_encrypt(const unsigned char *in, unsigned char *out, -- size_t len, const void *key, -- unsigned char ivec[16], int *num, -- block128_f block); -- --void CRYPTO_cfb128_encrypt(const unsigned char *in, unsigned char *out, -- size_t len, const void *key, -- unsigned char ivec[16], int *num, -- int enc, block128_f block); --void CRYPTO_cfb128_8_encrypt(const unsigned char *in, unsigned char *out, -- size_t length, const void *key, -- unsigned char ivec[16], int *num, -- int enc, block128_f block); --void CRYPTO_cfb128_1_encrypt(const unsigned char *in, unsigned char *out, -- size_t bits, const void *key, -- unsigned char ivec[16], int *num, -- int enc, block128_f block); -- --size_t CRYPTO_cts128_encrypt_block(const unsigned char *in, -- unsigned char *out, size_t len, -- const void *key, unsigned char ivec[16], -- block128_f block); --size_t CRYPTO_cts128_encrypt(const unsigned char *in, unsigned char *out, -- size_t len, const void *key, -- unsigned char ivec[16], cbc128_f cbc); --size_t CRYPTO_cts128_decrypt_block(const unsigned char *in, -- unsigned char *out, size_t len, -- const void *key, unsigned char ivec[16], -- block128_f block); --size_t CRYPTO_cts128_decrypt(const unsigned char *in, unsigned char *out, -- size_t len, const void *key, -- unsigned char ivec[16], cbc128_f cbc); -- --size_t CRYPTO_nistcts128_encrypt_block(const unsigned char *in, -- unsigned char *out, size_t len, -- const void *key, -- unsigned char ivec[16], -- block128_f block); --size_t CRYPTO_nistcts128_encrypt(const unsigned char *in, unsigned char *out, -- size_t len, const void *key, -- unsigned char ivec[16], cbc128_f cbc); --size_t CRYPTO_nistcts128_decrypt_block(const unsigned char *in, -- unsigned char *out, size_t len, -- const void *key, -- unsigned char ivec[16], -- block128_f block); --size_t CRYPTO_nistcts128_decrypt(const unsigned char *in, unsigned char *out, -- size_t len, const void *key, -- unsigned char ivec[16], cbc128_f cbc); -- --typedef struct gcm128_context GCM128_CONTEXT; -- --GCM128_CONTEXT *CRYPTO_gcm128_new(void *key, block128_f block); --void CRYPTO_gcm128_init(GCM128_CONTEXT *ctx, void *key, block128_f block); --void CRYPTO_gcm128_setiv(GCM128_CONTEXT *ctx, const unsigned char *iv, -- size_t len); --int CRYPTO_gcm128_aad(GCM128_CONTEXT *ctx, const unsigned char *aad, -- size_t len); --int CRYPTO_gcm128_encrypt(GCM128_CONTEXT *ctx, -- const unsigned char *in, unsigned char *out, -- size_t len); --int CRYPTO_gcm128_decrypt(GCM128_CONTEXT *ctx, -- const unsigned char *in, unsigned char *out, -- size_t len); --int CRYPTO_gcm128_encrypt_ctr32(GCM128_CONTEXT *ctx, -- const unsigned char *in, unsigned char *out, -- size_t len, ctr128_f stream); --int CRYPTO_gcm128_decrypt_ctr32(GCM128_CONTEXT *ctx, -- const unsigned char *in, unsigned char *out, -- size_t len, ctr128_f stream); --int CRYPTO_gcm128_finish(GCM128_CONTEXT *ctx, const unsigned char *tag, -- size_t len); --void CRYPTO_gcm128_tag(GCM128_CONTEXT *ctx, unsigned char *tag, size_t len); --void CRYPTO_gcm128_release(GCM128_CONTEXT *ctx); -- --typedef struct ccm128_context CCM128_CONTEXT; -- --void CRYPTO_ccm128_init(CCM128_CONTEXT *ctx, -- unsigned int M, unsigned int L, void *key, -- block128_f block); --int CRYPTO_ccm128_setiv(CCM128_CONTEXT *ctx, const unsigned char *nonce, -- size_t nlen, size_t mlen); --void CRYPTO_ccm128_aad(CCM128_CONTEXT *ctx, const unsigned char *aad, -- size_t alen); --int CRYPTO_ccm128_encrypt(CCM128_CONTEXT *ctx, const unsigned char *inp, -- unsigned char *out, size_t len); --int CRYPTO_ccm128_decrypt(CCM128_CONTEXT *ctx, const unsigned char *inp, -- unsigned char *out, size_t len); --int CRYPTO_ccm128_encrypt_ccm64(CCM128_CONTEXT *ctx, const unsigned char *inp, -- unsigned char *out, size_t len, -- ccm128_f stream); --int CRYPTO_ccm128_decrypt_ccm64(CCM128_CONTEXT *ctx, const unsigned char *inp, -- unsigned char *out, size_t len, -- ccm128_f stream); --size_t CRYPTO_ccm128_tag(CCM128_CONTEXT *ctx, unsigned char *tag, size_t len); -- --typedef struct xts128_context XTS128_CONTEXT; -- --int CRYPTO_xts128_encrypt(const XTS128_CONTEXT *ctx, -- const unsigned char iv[16], -- const unsigned char *inp, unsigned char *out, -- size_t len, int enc); -- --size_t CRYPTO_128_wrap(void *key, const unsigned char *iv, -- unsigned char *out, -- const unsigned char *in, size_t inlen, -- block128_f block); -- --size_t CRYPTO_128_unwrap(void *key, const unsigned char *iv, -- unsigned char *out, -- const unsigned char *in, size_t inlen, -- block128_f block); --size_t CRYPTO_128_wrap_pad(void *key, const unsigned char *icv, -- unsigned char *out, const unsigned char *in, -- size_t inlen, block128_f block); --size_t CRYPTO_128_unwrap_pad(void *key, const unsigned char *icv, -- unsigned char *out, const unsigned char *in, -- size_t inlen, block128_f block); -- --# ifndef OPENSSL_NO_OCB --typedef struct ocb128_context OCB128_CONTEXT; -- --typedef void (*ocb128_f) (const unsigned char *in, unsigned char *out, -- size_t blocks, const void *key, -- size_t start_block_num, -- unsigned char offset_i[16], -- const unsigned char L_[][16], -- unsigned char checksum[16]); -- --OCB128_CONTEXT *CRYPTO_ocb128_new(void *keyenc, void *keydec, -- block128_f encrypt, block128_f decrypt, -- ocb128_f stream); --int CRYPTO_ocb128_init(OCB128_CONTEXT *ctx, void *keyenc, void *keydec, -- block128_f encrypt, block128_f decrypt, -- ocb128_f stream); --int CRYPTO_ocb128_copy_ctx(OCB128_CONTEXT *dest, OCB128_CONTEXT *src, -- void *keyenc, void *keydec); --int CRYPTO_ocb128_setiv(OCB128_CONTEXT *ctx, const unsigned char *iv, -- size_t len, size_t taglen); --int CRYPTO_ocb128_aad(OCB128_CONTEXT *ctx, const unsigned char *aad, -- size_t len); --int CRYPTO_ocb128_encrypt(OCB128_CONTEXT *ctx, const unsigned char *in, -- unsigned char *out, size_t len); --int CRYPTO_ocb128_decrypt(OCB128_CONTEXT *ctx, const unsigned char *in, -- unsigned char *out, size_t len); --int CRYPTO_ocb128_finish(OCB128_CONTEXT *ctx, const unsigned char *tag, -- size_t len); --int CRYPTO_ocb128_tag(OCB128_CONTEXT *ctx, unsigned char *tag, size_t len); --void CRYPTO_ocb128_cleanup(OCB128_CONTEXT *ctx); --# endif /* OPENSSL_NO_OCB */ -- --# ifdef __cplusplus --} --# endif -- --#endif -diff --git a/uadk_tool/include/openssl/obj_mac.h b/uadk_tool/include/openssl/obj_mac.h -deleted file mode 100644 -index eb812ed..0000000 ---- a/uadk_tool/include/openssl/obj_mac.h -+++ /dev/null -@@ -1,5198 +0,0 @@ --/* -- * WARNING: do not edit! -- * Generated by crypto/objects/objects.pl -- * -- * Copyright 2000-2021 The OpenSSL Project Authors. All Rights Reserved. -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#define SN_undef "UNDEF" --#define LN_undef "undefined" --#define NID_undef 0 --#define OBJ_undef 0L -- --#define SN_itu_t "ITU-T" --#define LN_itu_t "itu-t" --#define NID_itu_t 645 --#define OBJ_itu_t 0L -- --#define NID_ccitt 404 --#define OBJ_ccitt OBJ_itu_t -- --#define SN_iso "ISO" --#define LN_iso "iso" --#define NID_iso 181 --#define OBJ_iso 1L -- --#define SN_joint_iso_itu_t "JOINT-ISO-ITU-T" --#define LN_joint_iso_itu_t "joint-iso-itu-t" --#define NID_joint_iso_itu_t 646 --#define OBJ_joint_iso_itu_t 2L -- --#define NID_joint_iso_ccitt 393 --#define OBJ_joint_iso_ccitt OBJ_joint_iso_itu_t -- --#define SN_member_body "member-body" --#define LN_member_body "ISO Member Body" --#define NID_member_body 182 --#define OBJ_member_body OBJ_iso,2L -- --#define SN_identified_organization "identified-organization" --#define NID_identified_organization 676 --#define OBJ_identified_organization OBJ_iso,3L -- --#define SN_hmac_md5 "HMAC-MD5" --#define LN_hmac_md5 "hmac-md5" --#define NID_hmac_md5 780 --#define OBJ_hmac_md5 OBJ_identified_organization,6L,1L,5L,5L,8L,1L,1L -- --#define SN_hmac_sha1 "HMAC-SHA1" --#define LN_hmac_sha1 "hmac-sha1" --#define NID_hmac_sha1 781 --#define OBJ_hmac_sha1 OBJ_identified_organization,6L,1L,5L,5L,8L,1L,2L -- --#define SN_x509ExtAdmission "x509ExtAdmission" --#define LN_x509ExtAdmission "Professional Information or basis for Admission" --#define NID_x509ExtAdmission 1093 --#define OBJ_x509ExtAdmission OBJ_identified_organization,36L,8L,3L,3L -- --#define SN_certicom_arc "certicom-arc" --#define NID_certicom_arc 677 --#define OBJ_certicom_arc OBJ_identified_organization,132L -- --#define SN_ieee "ieee" --#define NID_ieee 1170 --#define OBJ_ieee OBJ_identified_organization,111L -- --#define SN_ieee_siswg "ieee-siswg" --#define LN_ieee_siswg "IEEE Security in Storage Working Group" --#define NID_ieee_siswg 1171 --#define OBJ_ieee_siswg OBJ_ieee,2L,1619L -- --#define SN_international_organizations "international-organizations" --#define LN_international_organizations "International Organizations" --#define NID_international_organizations 647 --#define OBJ_international_organizations OBJ_joint_iso_itu_t,23L -- --#define SN_wap "wap" --#define NID_wap 678 --#define OBJ_wap OBJ_international_organizations,43L -- --#define SN_wap_wsg "wap-wsg" --#define NID_wap_wsg 679 --#define OBJ_wap_wsg OBJ_wap,1L -- --#define SN_selected_attribute_types "selected-attribute-types" --#define LN_selected_attribute_types "Selected Attribute Types" --#define NID_selected_attribute_types 394 --#define OBJ_selected_attribute_types OBJ_joint_iso_itu_t,5L,1L,5L -- --#define SN_clearance "clearance" --#define NID_clearance 395 --#define OBJ_clearance OBJ_selected_attribute_types,55L -- --#define SN_ISO_US "ISO-US" --#define LN_ISO_US "ISO US Member Body" --#define NID_ISO_US 183 --#define OBJ_ISO_US OBJ_member_body,840L -- --#define SN_X9_57 "X9-57" --#define LN_X9_57 "X9.57" --#define NID_X9_57 184 --#define OBJ_X9_57 OBJ_ISO_US,10040L -- --#define SN_X9cm "X9cm" --#define LN_X9cm "X9.57 CM ?" --#define NID_X9cm 185 --#define OBJ_X9cm OBJ_X9_57,4L -- --#define SN_ISO_CN "ISO-CN" --#define LN_ISO_CN "ISO CN Member Body" --#define NID_ISO_CN 1140 --#define OBJ_ISO_CN OBJ_member_body,156L -- --#define SN_oscca "oscca" --#define NID_oscca 1141 --#define OBJ_oscca OBJ_ISO_CN,10197L -- --#define SN_sm_scheme "sm-scheme" --#define NID_sm_scheme 1142 --#define OBJ_sm_scheme OBJ_oscca,1L -- --#define SN_dsa "DSA" --#define LN_dsa "dsaEncryption" --#define NID_dsa 116 --#define OBJ_dsa OBJ_X9cm,1L -- --#define SN_dsaWithSHA1 "DSA-SHA1" --#define LN_dsaWithSHA1 "dsaWithSHA1" --#define NID_dsaWithSHA1 113 --#define OBJ_dsaWithSHA1 OBJ_X9cm,3L -- --#define SN_ansi_X9_62 "ansi-X9-62" --#define LN_ansi_X9_62 "ANSI X9.62" --#define NID_ansi_X9_62 405 --#define OBJ_ansi_X9_62 OBJ_ISO_US,10045L -- --#define OBJ_X9_62_id_fieldType OBJ_ansi_X9_62,1L -- --#define SN_X9_62_prime_field "prime-field" --#define NID_X9_62_prime_field 406 --#define OBJ_X9_62_prime_field OBJ_X9_62_id_fieldType,1L -- --#define SN_X9_62_characteristic_two_field "characteristic-two-field" --#define NID_X9_62_characteristic_two_field 407 --#define OBJ_X9_62_characteristic_two_field OBJ_X9_62_id_fieldType,2L -- --#define SN_X9_62_id_characteristic_two_basis "id-characteristic-two-basis" --#define NID_X9_62_id_characteristic_two_basis 680 --#define OBJ_X9_62_id_characteristic_two_basis OBJ_X9_62_characteristic_two_field,3L -- --#define SN_X9_62_onBasis "onBasis" --#define NID_X9_62_onBasis 681 --#define OBJ_X9_62_onBasis OBJ_X9_62_id_characteristic_two_basis,1L -- --#define SN_X9_62_tpBasis "tpBasis" --#define NID_X9_62_tpBasis 682 --#define OBJ_X9_62_tpBasis OBJ_X9_62_id_characteristic_two_basis,2L -- --#define SN_X9_62_ppBasis "ppBasis" --#define NID_X9_62_ppBasis 683 --#define OBJ_X9_62_ppBasis OBJ_X9_62_id_characteristic_two_basis,3L -- --#define OBJ_X9_62_id_publicKeyType OBJ_ansi_X9_62,2L -- --#define SN_X9_62_id_ecPublicKey "id-ecPublicKey" --#define NID_X9_62_id_ecPublicKey 408 --#define OBJ_X9_62_id_ecPublicKey OBJ_X9_62_id_publicKeyType,1L -- --#define OBJ_X9_62_ellipticCurve OBJ_ansi_X9_62,3L -- --#define OBJ_X9_62_c_TwoCurve OBJ_X9_62_ellipticCurve,0L -- --#define SN_X9_62_c2pnb163v1 "c2pnb163v1" --#define NID_X9_62_c2pnb163v1 684 --#define OBJ_X9_62_c2pnb163v1 OBJ_X9_62_c_TwoCurve,1L -- --#define SN_X9_62_c2pnb163v2 "c2pnb163v2" --#define NID_X9_62_c2pnb163v2 685 --#define OBJ_X9_62_c2pnb163v2 OBJ_X9_62_c_TwoCurve,2L -- --#define SN_X9_62_c2pnb163v3 "c2pnb163v3" --#define NID_X9_62_c2pnb163v3 686 --#define OBJ_X9_62_c2pnb163v3 OBJ_X9_62_c_TwoCurve,3L -- --#define SN_X9_62_c2pnb176v1 "c2pnb176v1" --#define NID_X9_62_c2pnb176v1 687 --#define OBJ_X9_62_c2pnb176v1 OBJ_X9_62_c_TwoCurve,4L -- --#define SN_X9_62_c2tnb191v1 "c2tnb191v1" --#define NID_X9_62_c2tnb191v1 688 --#define OBJ_X9_62_c2tnb191v1 OBJ_X9_62_c_TwoCurve,5L -- --#define SN_X9_62_c2tnb191v2 "c2tnb191v2" --#define NID_X9_62_c2tnb191v2 689 --#define OBJ_X9_62_c2tnb191v2 OBJ_X9_62_c_TwoCurve,6L -- --#define SN_X9_62_c2tnb191v3 "c2tnb191v3" --#define NID_X9_62_c2tnb191v3 690 --#define OBJ_X9_62_c2tnb191v3 OBJ_X9_62_c_TwoCurve,7L -- --#define SN_X9_62_c2onb191v4 "c2onb191v4" --#define NID_X9_62_c2onb191v4 691 --#define OBJ_X9_62_c2onb191v4 OBJ_X9_62_c_TwoCurve,8L -- --#define SN_X9_62_c2onb191v5 "c2onb191v5" --#define NID_X9_62_c2onb191v5 692 --#define OBJ_X9_62_c2onb191v5 OBJ_X9_62_c_TwoCurve,9L -- --#define SN_X9_62_c2pnb208w1 "c2pnb208w1" --#define NID_X9_62_c2pnb208w1 693 --#define OBJ_X9_62_c2pnb208w1 OBJ_X9_62_c_TwoCurve,10L -- --#define SN_X9_62_c2tnb239v1 "c2tnb239v1" --#define NID_X9_62_c2tnb239v1 694 --#define OBJ_X9_62_c2tnb239v1 OBJ_X9_62_c_TwoCurve,11L -- --#define SN_X9_62_c2tnb239v2 "c2tnb239v2" --#define NID_X9_62_c2tnb239v2 695 --#define OBJ_X9_62_c2tnb239v2 OBJ_X9_62_c_TwoCurve,12L -- --#define SN_X9_62_c2tnb239v3 "c2tnb239v3" --#define NID_X9_62_c2tnb239v3 696 --#define OBJ_X9_62_c2tnb239v3 OBJ_X9_62_c_TwoCurve,13L -- --#define SN_X9_62_c2onb239v4 "c2onb239v4" --#define NID_X9_62_c2onb239v4 697 --#define OBJ_X9_62_c2onb239v4 OBJ_X9_62_c_TwoCurve,14L -- --#define SN_X9_62_c2onb239v5 "c2onb239v5" --#define NID_X9_62_c2onb239v5 698 --#define OBJ_X9_62_c2onb239v5 OBJ_X9_62_c_TwoCurve,15L -- --#define SN_X9_62_c2pnb272w1 "c2pnb272w1" --#define NID_X9_62_c2pnb272w1 699 --#define OBJ_X9_62_c2pnb272w1 OBJ_X9_62_c_TwoCurve,16L -- --#define SN_X9_62_c2pnb304w1 "c2pnb304w1" --#define NID_X9_62_c2pnb304w1 700 --#define OBJ_X9_62_c2pnb304w1 OBJ_X9_62_c_TwoCurve,17L -- --#define SN_X9_62_c2tnb359v1 "c2tnb359v1" --#define NID_X9_62_c2tnb359v1 701 --#define OBJ_X9_62_c2tnb359v1 OBJ_X9_62_c_TwoCurve,18L -- --#define SN_X9_62_c2pnb368w1 "c2pnb368w1" --#define NID_X9_62_c2pnb368w1 702 --#define OBJ_X9_62_c2pnb368w1 OBJ_X9_62_c_TwoCurve,19L -- --#define SN_X9_62_c2tnb431r1 "c2tnb431r1" --#define NID_X9_62_c2tnb431r1 703 --#define OBJ_X9_62_c2tnb431r1 OBJ_X9_62_c_TwoCurve,20L -- --#define OBJ_X9_62_primeCurve OBJ_X9_62_ellipticCurve,1L -- --#define SN_X9_62_prime192v1 "prime192v1" --#define NID_X9_62_prime192v1 409 --#define OBJ_X9_62_prime192v1 OBJ_X9_62_primeCurve,1L -- --#define SN_X9_62_prime192v2 "prime192v2" --#define NID_X9_62_prime192v2 410 --#define OBJ_X9_62_prime192v2 OBJ_X9_62_primeCurve,2L -- --#define SN_X9_62_prime192v3 "prime192v3" --#define NID_X9_62_prime192v3 411 --#define OBJ_X9_62_prime192v3 OBJ_X9_62_primeCurve,3L -- --#define SN_X9_62_prime239v1 "prime239v1" --#define NID_X9_62_prime239v1 412 --#define OBJ_X9_62_prime239v1 OBJ_X9_62_primeCurve,4L -- --#define SN_X9_62_prime239v2 "prime239v2" --#define NID_X9_62_prime239v2 413 --#define OBJ_X9_62_prime239v2 OBJ_X9_62_primeCurve,5L -- --#define SN_X9_62_prime239v3 "prime239v3" --#define NID_X9_62_prime239v3 414 --#define OBJ_X9_62_prime239v3 OBJ_X9_62_primeCurve,6L -- --#define SN_X9_62_prime256v1 "prime256v1" --#define NID_X9_62_prime256v1 415 --#define OBJ_X9_62_prime256v1 OBJ_X9_62_primeCurve,7L -- --#define OBJ_X9_62_id_ecSigType OBJ_ansi_X9_62,4L -- --#define SN_ecdsa_with_SHA1 "ecdsa-with-SHA1" --#define NID_ecdsa_with_SHA1 416 --#define OBJ_ecdsa_with_SHA1 OBJ_X9_62_id_ecSigType,1L -- --#define SN_ecdsa_with_Recommended "ecdsa-with-Recommended" --#define NID_ecdsa_with_Recommended 791 --#define OBJ_ecdsa_with_Recommended OBJ_X9_62_id_ecSigType,2L -- --#define SN_ecdsa_with_Specified "ecdsa-with-Specified" --#define NID_ecdsa_with_Specified 792 --#define OBJ_ecdsa_with_Specified OBJ_X9_62_id_ecSigType,3L -- --#define SN_ecdsa_with_SHA224 "ecdsa-with-SHA224" --#define NID_ecdsa_with_SHA224 793 --#define OBJ_ecdsa_with_SHA224 OBJ_ecdsa_with_Specified,1L -- --#define SN_ecdsa_with_SHA256 "ecdsa-with-SHA256" --#define NID_ecdsa_with_SHA256 794 --#define OBJ_ecdsa_with_SHA256 OBJ_ecdsa_with_Specified,2L -- --#define SN_ecdsa_with_SHA384 "ecdsa-with-SHA384" --#define NID_ecdsa_with_SHA384 795 --#define OBJ_ecdsa_with_SHA384 OBJ_ecdsa_with_Specified,3L -- --#define SN_ecdsa_with_SHA512 "ecdsa-with-SHA512" --#define NID_ecdsa_with_SHA512 796 --#define OBJ_ecdsa_with_SHA512 OBJ_ecdsa_with_Specified,4L -- --#define OBJ_secg_ellipticCurve OBJ_certicom_arc,0L -- --#define SN_secp112r1 "secp112r1" --#define NID_secp112r1 704 --#define OBJ_secp112r1 OBJ_secg_ellipticCurve,6L -- --#define SN_secp112r2 "secp112r2" --#define NID_secp112r2 705 --#define OBJ_secp112r2 OBJ_secg_ellipticCurve,7L -- --#define SN_secp128r1 "secp128r1" --#define NID_secp128r1 706 --#define OBJ_secp128r1 OBJ_secg_ellipticCurve,28L -- --#define SN_secp128r2 "secp128r2" --#define NID_secp128r2 707 --#define OBJ_secp128r2 OBJ_secg_ellipticCurve,29L -- --#define SN_secp160k1 "secp160k1" --#define NID_secp160k1 708 --#define OBJ_secp160k1 OBJ_secg_ellipticCurve,9L -- --#define SN_secp160r1 "secp160r1" --#define NID_secp160r1 709 --#define OBJ_secp160r1 OBJ_secg_ellipticCurve,8L -- --#define SN_secp160r2 "secp160r2" --#define NID_secp160r2 710 --#define OBJ_secp160r2 OBJ_secg_ellipticCurve,30L -- --#define SN_secp192k1 "secp192k1" --#define NID_secp192k1 711 --#define OBJ_secp192k1 OBJ_secg_ellipticCurve,31L -- --#define SN_secp224k1 "secp224k1" --#define NID_secp224k1 712 --#define OBJ_secp224k1 OBJ_secg_ellipticCurve,32L -- --#define SN_secp224r1 "secp224r1" --#define NID_secp224r1 713 --#define OBJ_secp224r1 OBJ_secg_ellipticCurve,33L -- --#define SN_secp256k1 "secp256k1" --#define NID_secp256k1 714 --#define OBJ_secp256k1 OBJ_secg_ellipticCurve,10L -- --#define SN_secp384r1 "secp384r1" --#define NID_secp384r1 715 --#define OBJ_secp384r1 OBJ_secg_ellipticCurve,34L -- --#define SN_secp521r1 "secp521r1" --#define NID_secp521r1 716 --#define OBJ_secp521r1 OBJ_secg_ellipticCurve,35L -- --#define SN_sect113r1 "sect113r1" --#define NID_sect113r1 717 --#define OBJ_sect113r1 OBJ_secg_ellipticCurve,4L -- --#define SN_sect113r2 "sect113r2" --#define NID_sect113r2 718 --#define OBJ_sect113r2 OBJ_secg_ellipticCurve,5L -- --#define SN_sect131r1 "sect131r1" --#define NID_sect131r1 719 --#define OBJ_sect131r1 OBJ_secg_ellipticCurve,22L -- --#define SN_sect131r2 "sect131r2" --#define NID_sect131r2 720 --#define OBJ_sect131r2 OBJ_secg_ellipticCurve,23L -- --#define SN_sect163k1 "sect163k1" --#define NID_sect163k1 721 --#define OBJ_sect163k1 OBJ_secg_ellipticCurve,1L -- --#define SN_sect163r1 "sect163r1" --#define NID_sect163r1 722 --#define OBJ_sect163r1 OBJ_secg_ellipticCurve,2L -- --#define SN_sect163r2 "sect163r2" --#define NID_sect163r2 723 --#define OBJ_sect163r2 OBJ_secg_ellipticCurve,15L -- --#define SN_sect193r1 "sect193r1" --#define NID_sect193r1 724 --#define OBJ_sect193r1 OBJ_secg_ellipticCurve,24L -- --#define SN_sect193r2 "sect193r2" --#define NID_sect193r2 725 --#define OBJ_sect193r2 OBJ_secg_ellipticCurve,25L -- --#define SN_sect233k1 "sect233k1" --#define NID_sect233k1 726 --#define OBJ_sect233k1 OBJ_secg_ellipticCurve,26L -- --#define SN_sect233r1 "sect233r1" --#define NID_sect233r1 727 --#define OBJ_sect233r1 OBJ_secg_ellipticCurve,27L -- --#define SN_sect239k1 "sect239k1" --#define NID_sect239k1 728 --#define OBJ_sect239k1 OBJ_secg_ellipticCurve,3L -- --#define SN_sect283k1 "sect283k1" --#define NID_sect283k1 729 --#define OBJ_sect283k1 OBJ_secg_ellipticCurve,16L -- --#define SN_sect283r1 "sect283r1" --#define NID_sect283r1 730 --#define OBJ_sect283r1 OBJ_secg_ellipticCurve,17L -- --#define SN_sect409k1 "sect409k1" --#define NID_sect409k1 731 --#define OBJ_sect409k1 OBJ_secg_ellipticCurve,36L -- --#define SN_sect409r1 "sect409r1" --#define NID_sect409r1 732 --#define OBJ_sect409r1 OBJ_secg_ellipticCurve,37L -- --#define SN_sect571k1 "sect571k1" --#define NID_sect571k1 733 --#define OBJ_sect571k1 OBJ_secg_ellipticCurve,38L -- --#define SN_sect571r1 "sect571r1" --#define NID_sect571r1 734 --#define OBJ_sect571r1 OBJ_secg_ellipticCurve,39L -- --#define OBJ_wap_wsg_idm_ecid OBJ_wap_wsg,4L -- --#define SN_wap_wsg_idm_ecid_wtls1 "wap-wsg-idm-ecid-wtls1" --#define NID_wap_wsg_idm_ecid_wtls1 735 --#define OBJ_wap_wsg_idm_ecid_wtls1 OBJ_wap_wsg_idm_ecid,1L -- --#define SN_wap_wsg_idm_ecid_wtls3 "wap-wsg-idm-ecid-wtls3" --#define NID_wap_wsg_idm_ecid_wtls3 736 --#define OBJ_wap_wsg_idm_ecid_wtls3 OBJ_wap_wsg_idm_ecid,3L -- --#define SN_wap_wsg_idm_ecid_wtls4 "wap-wsg-idm-ecid-wtls4" --#define NID_wap_wsg_idm_ecid_wtls4 737 --#define OBJ_wap_wsg_idm_ecid_wtls4 OBJ_wap_wsg_idm_ecid,4L -- --#define SN_wap_wsg_idm_ecid_wtls5 "wap-wsg-idm-ecid-wtls5" --#define NID_wap_wsg_idm_ecid_wtls5 738 --#define OBJ_wap_wsg_idm_ecid_wtls5 OBJ_wap_wsg_idm_ecid,5L -- --#define SN_wap_wsg_idm_ecid_wtls6 "wap-wsg-idm-ecid-wtls6" --#define NID_wap_wsg_idm_ecid_wtls6 739 --#define OBJ_wap_wsg_idm_ecid_wtls6 OBJ_wap_wsg_idm_ecid,6L -- --#define SN_wap_wsg_idm_ecid_wtls7 "wap-wsg-idm-ecid-wtls7" --#define NID_wap_wsg_idm_ecid_wtls7 740 --#define OBJ_wap_wsg_idm_ecid_wtls7 OBJ_wap_wsg_idm_ecid,7L -- --#define SN_wap_wsg_idm_ecid_wtls8 "wap-wsg-idm-ecid-wtls8" --#define NID_wap_wsg_idm_ecid_wtls8 741 --#define OBJ_wap_wsg_idm_ecid_wtls8 OBJ_wap_wsg_idm_ecid,8L -- --#define SN_wap_wsg_idm_ecid_wtls9 "wap-wsg-idm-ecid-wtls9" --#define NID_wap_wsg_idm_ecid_wtls9 742 --#define OBJ_wap_wsg_idm_ecid_wtls9 OBJ_wap_wsg_idm_ecid,9L -- --#define SN_wap_wsg_idm_ecid_wtls10 "wap-wsg-idm-ecid-wtls10" --#define NID_wap_wsg_idm_ecid_wtls10 743 --#define OBJ_wap_wsg_idm_ecid_wtls10 OBJ_wap_wsg_idm_ecid,10L -- --#define SN_wap_wsg_idm_ecid_wtls11 "wap-wsg-idm-ecid-wtls11" --#define NID_wap_wsg_idm_ecid_wtls11 744 --#define OBJ_wap_wsg_idm_ecid_wtls11 OBJ_wap_wsg_idm_ecid,11L -- --#define SN_wap_wsg_idm_ecid_wtls12 "wap-wsg-idm-ecid-wtls12" --#define NID_wap_wsg_idm_ecid_wtls12 745 --#define OBJ_wap_wsg_idm_ecid_wtls12 OBJ_wap_wsg_idm_ecid,12L -- --#define SN_cast5_cbc "CAST5-CBC" --#define LN_cast5_cbc "cast5-cbc" --#define NID_cast5_cbc 108 --#define OBJ_cast5_cbc OBJ_ISO_US,113533L,7L,66L,10L -- --#define SN_cast5_ecb "CAST5-ECB" --#define LN_cast5_ecb "cast5-ecb" --#define NID_cast5_ecb 109 -- --#define SN_cast5_cfb64 "CAST5-CFB" --#define LN_cast5_cfb64 "cast5-cfb" --#define NID_cast5_cfb64 110 -- --#define SN_cast5_ofb64 "CAST5-OFB" --#define LN_cast5_ofb64 "cast5-ofb" --#define NID_cast5_ofb64 111 -- --#define LN_pbeWithMD5AndCast5_CBC "pbeWithMD5AndCast5CBC" --#define NID_pbeWithMD5AndCast5_CBC 112 --#define OBJ_pbeWithMD5AndCast5_CBC OBJ_ISO_US,113533L,7L,66L,12L -- --#define SN_id_PasswordBasedMAC "id-PasswordBasedMAC" --#define LN_id_PasswordBasedMAC "password based MAC" --#define NID_id_PasswordBasedMAC 782 --#define OBJ_id_PasswordBasedMAC OBJ_ISO_US,113533L,7L,66L,13L -- --#define SN_id_DHBasedMac "id-DHBasedMac" --#define LN_id_DHBasedMac "Diffie-Hellman based MAC" --#define NID_id_DHBasedMac 783 --#define OBJ_id_DHBasedMac OBJ_ISO_US,113533L,7L,66L,30L -- --#define SN_rsadsi "rsadsi" --#define LN_rsadsi "RSA Data Security, Inc." --#define NID_rsadsi 1 --#define OBJ_rsadsi OBJ_ISO_US,113549L -- --#define SN_pkcs "pkcs" --#define LN_pkcs "RSA Data Security, Inc. PKCS" --#define NID_pkcs 2 --#define OBJ_pkcs OBJ_rsadsi,1L -- --#define SN_pkcs1 "pkcs1" --#define NID_pkcs1 186 --#define OBJ_pkcs1 OBJ_pkcs,1L -- --#define LN_rsaEncryption "rsaEncryption" --#define NID_rsaEncryption 6 --#define OBJ_rsaEncryption OBJ_pkcs1,1L -- --#define SN_md2WithRSAEncryption "RSA-MD2" --#define LN_md2WithRSAEncryption "md2WithRSAEncryption" --#define NID_md2WithRSAEncryption 7 --#define OBJ_md2WithRSAEncryption OBJ_pkcs1,2L -- --#define SN_md4WithRSAEncryption "RSA-MD4" --#define LN_md4WithRSAEncryption "md4WithRSAEncryption" --#define NID_md4WithRSAEncryption 396 --#define OBJ_md4WithRSAEncryption OBJ_pkcs1,3L -- --#define SN_md5WithRSAEncryption "RSA-MD5" --#define LN_md5WithRSAEncryption "md5WithRSAEncryption" --#define NID_md5WithRSAEncryption 8 --#define OBJ_md5WithRSAEncryption OBJ_pkcs1,4L -- --#define SN_sha1WithRSAEncryption "RSA-SHA1" --#define LN_sha1WithRSAEncryption "sha1WithRSAEncryption" --#define NID_sha1WithRSAEncryption 65 --#define OBJ_sha1WithRSAEncryption OBJ_pkcs1,5L -- --#define SN_rsaesOaep "RSAES-OAEP" --#define LN_rsaesOaep "rsaesOaep" --#define NID_rsaesOaep 919 --#define OBJ_rsaesOaep OBJ_pkcs1,7L -- --#define SN_mgf1 "MGF1" --#define LN_mgf1 "mgf1" --#define NID_mgf1 911 --#define OBJ_mgf1 OBJ_pkcs1,8L -- --#define SN_pSpecified "PSPECIFIED" --#define LN_pSpecified "pSpecified" --#define NID_pSpecified 935 --#define OBJ_pSpecified OBJ_pkcs1,9L -- --#define SN_rsassaPss "RSASSA-PSS" --#define LN_rsassaPss "rsassaPss" --#define NID_rsassaPss 912 --#define OBJ_rsassaPss OBJ_pkcs1,10L -- --#define SN_sha256WithRSAEncryption "RSA-SHA256" --#define LN_sha256WithRSAEncryption "sha256WithRSAEncryption" --#define NID_sha256WithRSAEncryption 668 --#define OBJ_sha256WithRSAEncryption OBJ_pkcs1,11L -- --#define SN_sha384WithRSAEncryption "RSA-SHA384" --#define LN_sha384WithRSAEncryption "sha384WithRSAEncryption" --#define NID_sha384WithRSAEncryption 669 --#define OBJ_sha384WithRSAEncryption OBJ_pkcs1,12L -- --#define SN_sha512WithRSAEncryption "RSA-SHA512" --#define LN_sha512WithRSAEncryption "sha512WithRSAEncryption" --#define NID_sha512WithRSAEncryption 670 --#define OBJ_sha512WithRSAEncryption OBJ_pkcs1,13L -- --#define SN_sha224WithRSAEncryption "RSA-SHA224" --#define LN_sha224WithRSAEncryption "sha224WithRSAEncryption" --#define NID_sha224WithRSAEncryption 671 --#define OBJ_sha224WithRSAEncryption OBJ_pkcs1,14L -- --#define SN_sha512_224WithRSAEncryption "RSA-SHA512/224" --#define LN_sha512_224WithRSAEncryption "sha512-224WithRSAEncryption" --#define NID_sha512_224WithRSAEncryption 1145 --#define OBJ_sha512_224WithRSAEncryption OBJ_pkcs1,15L -- --#define SN_sha512_256WithRSAEncryption "RSA-SHA512/256" --#define LN_sha512_256WithRSAEncryption "sha512-256WithRSAEncryption" --#define NID_sha512_256WithRSAEncryption 1146 --#define OBJ_sha512_256WithRSAEncryption OBJ_pkcs1,16L -- --#define SN_pkcs3 "pkcs3" --#define NID_pkcs3 27 --#define OBJ_pkcs3 OBJ_pkcs,3L -- --#define LN_dhKeyAgreement "dhKeyAgreement" --#define NID_dhKeyAgreement 28 --#define OBJ_dhKeyAgreement OBJ_pkcs3,1L -- --#define SN_pkcs5 "pkcs5" --#define NID_pkcs5 187 --#define OBJ_pkcs5 OBJ_pkcs,5L -- --#define SN_pbeWithMD2AndDES_CBC "PBE-MD2-DES" --#define LN_pbeWithMD2AndDES_CBC "pbeWithMD2AndDES-CBC" --#define NID_pbeWithMD2AndDES_CBC 9 --#define OBJ_pbeWithMD2AndDES_CBC OBJ_pkcs5,1L -- --#define SN_pbeWithMD5AndDES_CBC "PBE-MD5-DES" --#define LN_pbeWithMD5AndDES_CBC "pbeWithMD5AndDES-CBC" --#define NID_pbeWithMD5AndDES_CBC 10 --#define OBJ_pbeWithMD5AndDES_CBC OBJ_pkcs5,3L -- --#define SN_pbeWithMD2AndRC2_CBC "PBE-MD2-RC2-64" --#define LN_pbeWithMD2AndRC2_CBC "pbeWithMD2AndRC2-CBC" --#define NID_pbeWithMD2AndRC2_CBC 168 --#define OBJ_pbeWithMD2AndRC2_CBC OBJ_pkcs5,4L -- --#define SN_pbeWithMD5AndRC2_CBC "PBE-MD5-RC2-64" --#define LN_pbeWithMD5AndRC2_CBC "pbeWithMD5AndRC2-CBC" --#define NID_pbeWithMD5AndRC2_CBC 169 --#define OBJ_pbeWithMD5AndRC2_CBC OBJ_pkcs5,6L -- --#define SN_pbeWithSHA1AndDES_CBC "PBE-SHA1-DES" --#define LN_pbeWithSHA1AndDES_CBC "pbeWithSHA1AndDES-CBC" --#define NID_pbeWithSHA1AndDES_CBC 170 --#define OBJ_pbeWithSHA1AndDES_CBC OBJ_pkcs5,10L -- --#define SN_pbeWithSHA1AndRC2_CBC "PBE-SHA1-RC2-64" --#define LN_pbeWithSHA1AndRC2_CBC "pbeWithSHA1AndRC2-CBC" --#define NID_pbeWithSHA1AndRC2_CBC 68 --#define OBJ_pbeWithSHA1AndRC2_CBC OBJ_pkcs5,11L -- --#define LN_id_pbkdf2 "PBKDF2" --#define NID_id_pbkdf2 69 --#define OBJ_id_pbkdf2 OBJ_pkcs5,12L -- --#define LN_pbes2 "PBES2" --#define NID_pbes2 161 --#define OBJ_pbes2 OBJ_pkcs5,13L -- --#define LN_pbmac1 "PBMAC1" --#define NID_pbmac1 162 --#define OBJ_pbmac1 OBJ_pkcs5,14L -- --#define SN_pkcs7 "pkcs7" --#define NID_pkcs7 20 --#define OBJ_pkcs7 OBJ_pkcs,7L -- --#define LN_pkcs7_data "pkcs7-data" --#define NID_pkcs7_data 21 --#define OBJ_pkcs7_data OBJ_pkcs7,1L -- --#define LN_pkcs7_signed "pkcs7-signedData" --#define NID_pkcs7_signed 22 --#define OBJ_pkcs7_signed OBJ_pkcs7,2L -- --#define LN_pkcs7_enveloped "pkcs7-envelopedData" --#define NID_pkcs7_enveloped 23 --#define OBJ_pkcs7_enveloped OBJ_pkcs7,3L -- --#define LN_pkcs7_signedAndEnveloped "pkcs7-signedAndEnvelopedData" --#define NID_pkcs7_signedAndEnveloped 24 --#define OBJ_pkcs7_signedAndEnveloped OBJ_pkcs7,4L -- --#define LN_pkcs7_digest "pkcs7-digestData" --#define NID_pkcs7_digest 25 --#define OBJ_pkcs7_digest OBJ_pkcs7,5L -- --#define LN_pkcs7_encrypted "pkcs7-encryptedData" --#define NID_pkcs7_encrypted 26 --#define OBJ_pkcs7_encrypted OBJ_pkcs7,6L -- --#define SN_pkcs9 "pkcs9" --#define NID_pkcs9 47 --#define OBJ_pkcs9 OBJ_pkcs,9L -- --#define LN_pkcs9_emailAddress "emailAddress" --#define NID_pkcs9_emailAddress 48 --#define OBJ_pkcs9_emailAddress OBJ_pkcs9,1L -- --#define LN_pkcs9_unstructuredName "unstructuredName" --#define NID_pkcs9_unstructuredName 49 --#define OBJ_pkcs9_unstructuredName OBJ_pkcs9,2L -- --#define LN_pkcs9_contentType "contentType" --#define NID_pkcs9_contentType 50 --#define OBJ_pkcs9_contentType OBJ_pkcs9,3L -- --#define LN_pkcs9_messageDigest "messageDigest" --#define NID_pkcs9_messageDigest 51 --#define OBJ_pkcs9_messageDigest OBJ_pkcs9,4L -- --#define LN_pkcs9_signingTime "signingTime" --#define NID_pkcs9_signingTime 52 --#define OBJ_pkcs9_signingTime OBJ_pkcs9,5L -- --#define LN_pkcs9_countersignature "countersignature" --#define NID_pkcs9_countersignature 53 --#define OBJ_pkcs9_countersignature OBJ_pkcs9,6L -- --#define LN_pkcs9_challengePassword "challengePassword" --#define NID_pkcs9_challengePassword 54 --#define OBJ_pkcs9_challengePassword OBJ_pkcs9,7L -- --#define LN_pkcs9_unstructuredAddress "unstructuredAddress" --#define NID_pkcs9_unstructuredAddress 55 --#define OBJ_pkcs9_unstructuredAddress OBJ_pkcs9,8L -- --#define LN_pkcs9_extCertAttributes "extendedCertificateAttributes" --#define NID_pkcs9_extCertAttributes 56 --#define OBJ_pkcs9_extCertAttributes OBJ_pkcs9,9L -- --#define SN_ext_req "extReq" --#define LN_ext_req "Extension Request" --#define NID_ext_req 172 --#define OBJ_ext_req OBJ_pkcs9,14L -- --#define SN_SMIMECapabilities "SMIME-CAPS" --#define LN_SMIMECapabilities "S/MIME Capabilities" --#define NID_SMIMECapabilities 167 --#define OBJ_SMIMECapabilities OBJ_pkcs9,15L -- --#define SN_SMIME "SMIME" --#define LN_SMIME "S/MIME" --#define NID_SMIME 188 --#define OBJ_SMIME OBJ_pkcs9,16L -- --#define SN_id_smime_mod "id-smime-mod" --#define NID_id_smime_mod 189 --#define OBJ_id_smime_mod OBJ_SMIME,0L -- --#define SN_id_smime_ct "id-smime-ct" --#define NID_id_smime_ct 190 --#define OBJ_id_smime_ct OBJ_SMIME,1L -- --#define SN_id_smime_aa "id-smime-aa" --#define NID_id_smime_aa 191 --#define OBJ_id_smime_aa OBJ_SMIME,2L -- --#define SN_id_smime_alg "id-smime-alg" --#define NID_id_smime_alg 192 --#define OBJ_id_smime_alg OBJ_SMIME,3L -- --#define SN_id_smime_cd "id-smime-cd" --#define NID_id_smime_cd 193 --#define OBJ_id_smime_cd OBJ_SMIME,4L -- --#define SN_id_smime_spq "id-smime-spq" --#define NID_id_smime_spq 194 --#define OBJ_id_smime_spq OBJ_SMIME,5L -- --#define SN_id_smime_cti "id-smime-cti" --#define NID_id_smime_cti 195 --#define OBJ_id_smime_cti OBJ_SMIME,6L -- --#define SN_id_smime_mod_cms "id-smime-mod-cms" --#define NID_id_smime_mod_cms 196 --#define OBJ_id_smime_mod_cms OBJ_id_smime_mod,1L -- --#define SN_id_smime_mod_ess "id-smime-mod-ess" --#define NID_id_smime_mod_ess 197 --#define OBJ_id_smime_mod_ess OBJ_id_smime_mod,2L -- --#define SN_id_smime_mod_oid "id-smime-mod-oid" --#define NID_id_smime_mod_oid 198 --#define OBJ_id_smime_mod_oid OBJ_id_smime_mod,3L -- --#define SN_id_smime_mod_msg_v3 "id-smime-mod-msg-v3" --#define NID_id_smime_mod_msg_v3 199 --#define OBJ_id_smime_mod_msg_v3 OBJ_id_smime_mod,4L -- --#define SN_id_smime_mod_ets_eSignature_88 "id-smime-mod-ets-eSignature-88" --#define NID_id_smime_mod_ets_eSignature_88 200 --#define OBJ_id_smime_mod_ets_eSignature_88 OBJ_id_smime_mod,5L -- --#define SN_id_smime_mod_ets_eSignature_97 "id-smime-mod-ets-eSignature-97" --#define NID_id_smime_mod_ets_eSignature_97 201 --#define OBJ_id_smime_mod_ets_eSignature_97 OBJ_id_smime_mod,6L -- --#define SN_id_smime_mod_ets_eSigPolicy_88 "id-smime-mod-ets-eSigPolicy-88" --#define NID_id_smime_mod_ets_eSigPolicy_88 202 --#define OBJ_id_smime_mod_ets_eSigPolicy_88 OBJ_id_smime_mod,7L -- --#define SN_id_smime_mod_ets_eSigPolicy_97 "id-smime-mod-ets-eSigPolicy-97" --#define NID_id_smime_mod_ets_eSigPolicy_97 203 --#define OBJ_id_smime_mod_ets_eSigPolicy_97 OBJ_id_smime_mod,8L -- --#define SN_id_smime_ct_receipt "id-smime-ct-receipt" --#define NID_id_smime_ct_receipt 204 --#define OBJ_id_smime_ct_receipt OBJ_id_smime_ct,1L -- --#define SN_id_smime_ct_authData "id-smime-ct-authData" --#define NID_id_smime_ct_authData 205 --#define OBJ_id_smime_ct_authData OBJ_id_smime_ct,2L -- --#define SN_id_smime_ct_publishCert "id-smime-ct-publishCert" --#define NID_id_smime_ct_publishCert 206 --#define OBJ_id_smime_ct_publishCert OBJ_id_smime_ct,3L -- --#define SN_id_smime_ct_TSTInfo "id-smime-ct-TSTInfo" --#define NID_id_smime_ct_TSTInfo 207 --#define OBJ_id_smime_ct_TSTInfo OBJ_id_smime_ct,4L -- --#define SN_id_smime_ct_TDTInfo "id-smime-ct-TDTInfo" --#define NID_id_smime_ct_TDTInfo 208 --#define OBJ_id_smime_ct_TDTInfo OBJ_id_smime_ct,5L -- --#define SN_id_smime_ct_contentInfo "id-smime-ct-contentInfo" --#define NID_id_smime_ct_contentInfo 209 --#define OBJ_id_smime_ct_contentInfo OBJ_id_smime_ct,6L -- --#define SN_id_smime_ct_DVCSRequestData "id-smime-ct-DVCSRequestData" --#define NID_id_smime_ct_DVCSRequestData 210 --#define OBJ_id_smime_ct_DVCSRequestData OBJ_id_smime_ct,7L -- --#define SN_id_smime_ct_DVCSResponseData "id-smime-ct-DVCSResponseData" --#define NID_id_smime_ct_DVCSResponseData 211 --#define OBJ_id_smime_ct_DVCSResponseData OBJ_id_smime_ct,8L -- --#define SN_id_smime_ct_compressedData "id-smime-ct-compressedData" --#define NID_id_smime_ct_compressedData 786 --#define OBJ_id_smime_ct_compressedData OBJ_id_smime_ct,9L -- --#define SN_id_smime_ct_contentCollection "id-smime-ct-contentCollection" --#define NID_id_smime_ct_contentCollection 1058 --#define OBJ_id_smime_ct_contentCollection OBJ_id_smime_ct,19L -- --#define SN_id_smime_ct_authEnvelopedData "id-smime-ct-authEnvelopedData" --#define NID_id_smime_ct_authEnvelopedData 1059 --#define OBJ_id_smime_ct_authEnvelopedData OBJ_id_smime_ct,23L -- --#define SN_id_ct_asciiTextWithCRLF "id-ct-asciiTextWithCRLF" --#define NID_id_ct_asciiTextWithCRLF 787 --#define OBJ_id_ct_asciiTextWithCRLF OBJ_id_smime_ct,27L -- --#define SN_id_ct_xml "id-ct-xml" --#define NID_id_ct_xml 1060 --#define OBJ_id_ct_xml OBJ_id_smime_ct,28L -- --#define SN_id_smime_aa_receiptRequest "id-smime-aa-receiptRequest" --#define NID_id_smime_aa_receiptRequest 212 --#define OBJ_id_smime_aa_receiptRequest OBJ_id_smime_aa,1L -- --#define SN_id_smime_aa_securityLabel "id-smime-aa-securityLabel" --#define NID_id_smime_aa_securityLabel 213 --#define OBJ_id_smime_aa_securityLabel OBJ_id_smime_aa,2L -- --#define SN_id_smime_aa_mlExpandHistory "id-smime-aa-mlExpandHistory" --#define NID_id_smime_aa_mlExpandHistory 214 --#define OBJ_id_smime_aa_mlExpandHistory OBJ_id_smime_aa,3L -- --#define SN_id_smime_aa_contentHint "id-smime-aa-contentHint" --#define NID_id_smime_aa_contentHint 215 --#define OBJ_id_smime_aa_contentHint OBJ_id_smime_aa,4L -- --#define SN_id_smime_aa_msgSigDigest "id-smime-aa-msgSigDigest" --#define NID_id_smime_aa_msgSigDigest 216 --#define OBJ_id_smime_aa_msgSigDigest OBJ_id_smime_aa,5L -- --#define SN_id_smime_aa_encapContentType "id-smime-aa-encapContentType" --#define NID_id_smime_aa_encapContentType 217 --#define OBJ_id_smime_aa_encapContentType OBJ_id_smime_aa,6L -- --#define SN_id_smime_aa_contentIdentifier "id-smime-aa-contentIdentifier" --#define NID_id_smime_aa_contentIdentifier 218 --#define OBJ_id_smime_aa_contentIdentifier OBJ_id_smime_aa,7L -- --#define SN_id_smime_aa_macValue "id-smime-aa-macValue" --#define NID_id_smime_aa_macValue 219 --#define OBJ_id_smime_aa_macValue OBJ_id_smime_aa,8L -- --#define SN_id_smime_aa_equivalentLabels "id-smime-aa-equivalentLabels" --#define NID_id_smime_aa_equivalentLabels 220 --#define OBJ_id_smime_aa_equivalentLabels OBJ_id_smime_aa,9L -- --#define SN_id_smime_aa_contentReference "id-smime-aa-contentReference" --#define NID_id_smime_aa_contentReference 221 --#define OBJ_id_smime_aa_contentReference OBJ_id_smime_aa,10L -- --#define SN_id_smime_aa_encrypKeyPref "id-smime-aa-encrypKeyPref" --#define NID_id_smime_aa_encrypKeyPref 222 --#define OBJ_id_smime_aa_encrypKeyPref OBJ_id_smime_aa,11L -- --#define SN_id_smime_aa_signingCertificate "id-smime-aa-signingCertificate" --#define NID_id_smime_aa_signingCertificate 223 --#define OBJ_id_smime_aa_signingCertificate OBJ_id_smime_aa,12L -- --#define SN_id_smime_aa_smimeEncryptCerts "id-smime-aa-smimeEncryptCerts" --#define NID_id_smime_aa_smimeEncryptCerts 224 --#define OBJ_id_smime_aa_smimeEncryptCerts OBJ_id_smime_aa,13L -- --#define SN_id_smime_aa_timeStampToken "id-smime-aa-timeStampToken" --#define NID_id_smime_aa_timeStampToken 225 --#define OBJ_id_smime_aa_timeStampToken OBJ_id_smime_aa,14L -- --#define SN_id_smime_aa_ets_sigPolicyId "id-smime-aa-ets-sigPolicyId" --#define NID_id_smime_aa_ets_sigPolicyId 226 --#define OBJ_id_smime_aa_ets_sigPolicyId OBJ_id_smime_aa,15L -- --#define SN_id_smime_aa_ets_commitmentType "id-smime-aa-ets-commitmentType" --#define NID_id_smime_aa_ets_commitmentType 227 --#define OBJ_id_smime_aa_ets_commitmentType OBJ_id_smime_aa,16L -- --#define SN_id_smime_aa_ets_signerLocation "id-smime-aa-ets-signerLocation" --#define NID_id_smime_aa_ets_signerLocation 228 --#define OBJ_id_smime_aa_ets_signerLocation OBJ_id_smime_aa,17L -- --#define SN_id_smime_aa_ets_signerAttr "id-smime-aa-ets-signerAttr" --#define NID_id_smime_aa_ets_signerAttr 229 --#define OBJ_id_smime_aa_ets_signerAttr OBJ_id_smime_aa,18L -- --#define SN_id_smime_aa_ets_otherSigCert "id-smime-aa-ets-otherSigCert" --#define NID_id_smime_aa_ets_otherSigCert 230 --#define OBJ_id_smime_aa_ets_otherSigCert OBJ_id_smime_aa,19L -- --#define SN_id_smime_aa_ets_contentTimestamp "id-smime-aa-ets-contentTimestamp" --#define NID_id_smime_aa_ets_contentTimestamp 231 --#define OBJ_id_smime_aa_ets_contentTimestamp OBJ_id_smime_aa,20L -- --#define SN_id_smime_aa_ets_CertificateRefs "id-smime-aa-ets-CertificateRefs" --#define NID_id_smime_aa_ets_CertificateRefs 232 --#define OBJ_id_smime_aa_ets_CertificateRefs OBJ_id_smime_aa,21L -- --#define SN_id_smime_aa_ets_RevocationRefs "id-smime-aa-ets-RevocationRefs" --#define NID_id_smime_aa_ets_RevocationRefs 233 --#define OBJ_id_smime_aa_ets_RevocationRefs OBJ_id_smime_aa,22L -- --#define SN_id_smime_aa_ets_certValues "id-smime-aa-ets-certValues" --#define NID_id_smime_aa_ets_certValues 234 --#define OBJ_id_smime_aa_ets_certValues OBJ_id_smime_aa,23L -- --#define SN_id_smime_aa_ets_revocationValues "id-smime-aa-ets-revocationValues" --#define NID_id_smime_aa_ets_revocationValues 235 --#define OBJ_id_smime_aa_ets_revocationValues OBJ_id_smime_aa,24L -- --#define SN_id_smime_aa_ets_escTimeStamp "id-smime-aa-ets-escTimeStamp" --#define NID_id_smime_aa_ets_escTimeStamp 236 --#define OBJ_id_smime_aa_ets_escTimeStamp OBJ_id_smime_aa,25L -- --#define SN_id_smime_aa_ets_certCRLTimestamp "id-smime-aa-ets-certCRLTimestamp" --#define NID_id_smime_aa_ets_certCRLTimestamp 237 --#define OBJ_id_smime_aa_ets_certCRLTimestamp OBJ_id_smime_aa,26L -- --#define SN_id_smime_aa_ets_archiveTimeStamp "id-smime-aa-ets-archiveTimeStamp" --#define NID_id_smime_aa_ets_archiveTimeStamp 238 --#define OBJ_id_smime_aa_ets_archiveTimeStamp OBJ_id_smime_aa,27L -- --#define SN_id_smime_aa_signatureType "id-smime-aa-signatureType" --#define NID_id_smime_aa_signatureType 239 --#define OBJ_id_smime_aa_signatureType OBJ_id_smime_aa,28L -- --#define SN_id_smime_aa_dvcs_dvc "id-smime-aa-dvcs-dvc" --#define NID_id_smime_aa_dvcs_dvc 240 --#define OBJ_id_smime_aa_dvcs_dvc OBJ_id_smime_aa,29L -- --#define SN_id_smime_aa_signingCertificateV2 "id-smime-aa-signingCertificateV2" --#define NID_id_smime_aa_signingCertificateV2 1086 --#define OBJ_id_smime_aa_signingCertificateV2 OBJ_id_smime_aa,47L -- --#define SN_id_smime_alg_ESDHwith3DES "id-smime-alg-ESDHwith3DES" --#define NID_id_smime_alg_ESDHwith3DES 241 --#define OBJ_id_smime_alg_ESDHwith3DES OBJ_id_smime_alg,1L -- --#define SN_id_smime_alg_ESDHwithRC2 "id-smime-alg-ESDHwithRC2" --#define NID_id_smime_alg_ESDHwithRC2 242 --#define OBJ_id_smime_alg_ESDHwithRC2 OBJ_id_smime_alg,2L -- --#define SN_id_smime_alg_3DESwrap "id-smime-alg-3DESwrap" --#define NID_id_smime_alg_3DESwrap 243 --#define OBJ_id_smime_alg_3DESwrap OBJ_id_smime_alg,3L -- --#define SN_id_smime_alg_RC2wrap "id-smime-alg-RC2wrap" --#define NID_id_smime_alg_RC2wrap 244 --#define OBJ_id_smime_alg_RC2wrap OBJ_id_smime_alg,4L -- --#define SN_id_smime_alg_ESDH "id-smime-alg-ESDH" --#define NID_id_smime_alg_ESDH 245 --#define OBJ_id_smime_alg_ESDH OBJ_id_smime_alg,5L -- --#define SN_id_smime_alg_CMS3DESwrap "id-smime-alg-CMS3DESwrap" --#define NID_id_smime_alg_CMS3DESwrap 246 --#define OBJ_id_smime_alg_CMS3DESwrap OBJ_id_smime_alg,6L -- --#define SN_id_smime_alg_CMSRC2wrap "id-smime-alg-CMSRC2wrap" --#define NID_id_smime_alg_CMSRC2wrap 247 --#define OBJ_id_smime_alg_CMSRC2wrap OBJ_id_smime_alg,7L -- --#define SN_id_alg_PWRI_KEK "id-alg-PWRI-KEK" --#define NID_id_alg_PWRI_KEK 893 --#define OBJ_id_alg_PWRI_KEK OBJ_id_smime_alg,9L -- --#define SN_id_smime_cd_ldap "id-smime-cd-ldap" --#define NID_id_smime_cd_ldap 248 --#define OBJ_id_smime_cd_ldap OBJ_id_smime_cd,1L -- --#define SN_id_smime_spq_ets_sqt_uri "id-smime-spq-ets-sqt-uri" --#define NID_id_smime_spq_ets_sqt_uri 249 --#define OBJ_id_smime_spq_ets_sqt_uri OBJ_id_smime_spq,1L -- --#define SN_id_smime_spq_ets_sqt_unotice "id-smime-spq-ets-sqt-unotice" --#define NID_id_smime_spq_ets_sqt_unotice 250 --#define OBJ_id_smime_spq_ets_sqt_unotice OBJ_id_smime_spq,2L -- --#define SN_id_smime_cti_ets_proofOfOrigin "id-smime-cti-ets-proofOfOrigin" --#define NID_id_smime_cti_ets_proofOfOrigin 251 --#define OBJ_id_smime_cti_ets_proofOfOrigin OBJ_id_smime_cti,1L -- --#define SN_id_smime_cti_ets_proofOfReceipt "id-smime-cti-ets-proofOfReceipt" --#define NID_id_smime_cti_ets_proofOfReceipt 252 --#define OBJ_id_smime_cti_ets_proofOfReceipt OBJ_id_smime_cti,2L -- --#define SN_id_smime_cti_ets_proofOfDelivery "id-smime-cti-ets-proofOfDelivery" --#define NID_id_smime_cti_ets_proofOfDelivery 253 --#define OBJ_id_smime_cti_ets_proofOfDelivery OBJ_id_smime_cti,3L -- --#define SN_id_smime_cti_ets_proofOfSender "id-smime-cti-ets-proofOfSender" --#define NID_id_smime_cti_ets_proofOfSender 254 --#define OBJ_id_smime_cti_ets_proofOfSender OBJ_id_smime_cti,4L -- --#define SN_id_smime_cti_ets_proofOfApproval "id-smime-cti-ets-proofOfApproval" --#define NID_id_smime_cti_ets_proofOfApproval 255 --#define OBJ_id_smime_cti_ets_proofOfApproval OBJ_id_smime_cti,5L -- --#define SN_id_smime_cti_ets_proofOfCreation "id-smime-cti-ets-proofOfCreation" --#define NID_id_smime_cti_ets_proofOfCreation 256 --#define OBJ_id_smime_cti_ets_proofOfCreation OBJ_id_smime_cti,6L -- --#define LN_friendlyName "friendlyName" --#define NID_friendlyName 156 --#define OBJ_friendlyName OBJ_pkcs9,20L -- --#define LN_localKeyID "localKeyID" --#define NID_localKeyID 157 --#define OBJ_localKeyID OBJ_pkcs9,21L -- --#define SN_ms_csp_name "CSPName" --#define LN_ms_csp_name "Microsoft CSP Name" --#define NID_ms_csp_name 417 --#define OBJ_ms_csp_name 1L,3L,6L,1L,4L,1L,311L,17L,1L -- --#define SN_LocalKeySet "LocalKeySet" --#define LN_LocalKeySet "Microsoft Local Key set" --#define NID_LocalKeySet 856 --#define OBJ_LocalKeySet 1L,3L,6L,1L,4L,1L,311L,17L,2L -- --#define OBJ_certTypes OBJ_pkcs9,22L -- --#define LN_x509Certificate "x509Certificate" --#define NID_x509Certificate 158 --#define OBJ_x509Certificate OBJ_certTypes,1L -- --#define LN_sdsiCertificate "sdsiCertificate" --#define NID_sdsiCertificate 159 --#define OBJ_sdsiCertificate OBJ_certTypes,2L -- --#define OBJ_crlTypes OBJ_pkcs9,23L -- --#define LN_x509Crl "x509Crl" --#define NID_x509Crl 160 --#define OBJ_x509Crl OBJ_crlTypes,1L -- --#define OBJ_pkcs12 OBJ_pkcs,12L -- --#define OBJ_pkcs12_pbeids OBJ_pkcs12,1L -- --#define SN_pbe_WithSHA1And128BitRC4 "PBE-SHA1-RC4-128" --#define LN_pbe_WithSHA1And128BitRC4 "pbeWithSHA1And128BitRC4" --#define NID_pbe_WithSHA1And128BitRC4 144 --#define OBJ_pbe_WithSHA1And128BitRC4 OBJ_pkcs12_pbeids,1L -- --#define SN_pbe_WithSHA1And40BitRC4 "PBE-SHA1-RC4-40" --#define LN_pbe_WithSHA1And40BitRC4 "pbeWithSHA1And40BitRC4" --#define NID_pbe_WithSHA1And40BitRC4 145 --#define OBJ_pbe_WithSHA1And40BitRC4 OBJ_pkcs12_pbeids,2L -- --#define SN_pbe_WithSHA1And3_Key_TripleDES_CBC "PBE-SHA1-3DES" --#define LN_pbe_WithSHA1And3_Key_TripleDES_CBC "pbeWithSHA1And3-KeyTripleDES-CBC" --#define NID_pbe_WithSHA1And3_Key_TripleDES_CBC 146 --#define OBJ_pbe_WithSHA1And3_Key_TripleDES_CBC OBJ_pkcs12_pbeids,3L -- --#define SN_pbe_WithSHA1And2_Key_TripleDES_CBC "PBE-SHA1-2DES" --#define LN_pbe_WithSHA1And2_Key_TripleDES_CBC "pbeWithSHA1And2-KeyTripleDES-CBC" --#define NID_pbe_WithSHA1And2_Key_TripleDES_CBC 147 --#define OBJ_pbe_WithSHA1And2_Key_TripleDES_CBC OBJ_pkcs12_pbeids,4L -- --#define SN_pbe_WithSHA1And128BitRC2_CBC "PBE-SHA1-RC2-128" --#define LN_pbe_WithSHA1And128BitRC2_CBC "pbeWithSHA1And128BitRC2-CBC" --#define NID_pbe_WithSHA1And128BitRC2_CBC 148 --#define OBJ_pbe_WithSHA1And128BitRC2_CBC OBJ_pkcs12_pbeids,5L -- --#define SN_pbe_WithSHA1And40BitRC2_CBC "PBE-SHA1-RC2-40" --#define LN_pbe_WithSHA1And40BitRC2_CBC "pbeWithSHA1And40BitRC2-CBC" --#define NID_pbe_WithSHA1And40BitRC2_CBC 149 --#define OBJ_pbe_WithSHA1And40BitRC2_CBC OBJ_pkcs12_pbeids,6L -- --#define OBJ_pkcs12_Version1 OBJ_pkcs12,10L -- --#define OBJ_pkcs12_BagIds OBJ_pkcs12_Version1,1L -- --#define LN_keyBag "keyBag" --#define NID_keyBag 150 --#define OBJ_keyBag OBJ_pkcs12_BagIds,1L -- --#define LN_pkcs8ShroudedKeyBag "pkcs8ShroudedKeyBag" --#define NID_pkcs8ShroudedKeyBag 151 --#define OBJ_pkcs8ShroudedKeyBag OBJ_pkcs12_BagIds,2L -- --#define LN_certBag "certBag" --#define NID_certBag 152 --#define OBJ_certBag OBJ_pkcs12_BagIds,3L -- --#define LN_crlBag "crlBag" --#define NID_crlBag 153 --#define OBJ_crlBag OBJ_pkcs12_BagIds,4L -- --#define LN_secretBag "secretBag" --#define NID_secretBag 154 --#define OBJ_secretBag OBJ_pkcs12_BagIds,5L -- --#define LN_safeContentsBag "safeContentsBag" --#define NID_safeContentsBag 155 --#define OBJ_safeContentsBag OBJ_pkcs12_BagIds,6L -- --#define SN_md2 "MD2" --#define LN_md2 "md2" --#define NID_md2 3 --#define OBJ_md2 OBJ_rsadsi,2L,2L -- --#define SN_md4 "MD4" --#define LN_md4 "md4" --#define NID_md4 257 --#define OBJ_md4 OBJ_rsadsi,2L,4L -- --#define SN_md5 "MD5" --#define LN_md5 "md5" --#define NID_md5 4 --#define OBJ_md5 OBJ_rsadsi,2L,5L -- --#define SN_md5_sha1 "MD5-SHA1" --#define LN_md5_sha1 "md5-sha1" --#define NID_md5_sha1 114 -- --#define LN_hmacWithMD5 "hmacWithMD5" --#define NID_hmacWithMD5 797 --#define OBJ_hmacWithMD5 OBJ_rsadsi,2L,6L -- --#define LN_hmacWithSHA1 "hmacWithSHA1" --#define NID_hmacWithSHA1 163 --#define OBJ_hmacWithSHA1 OBJ_rsadsi,2L,7L -- --#define SN_sm2 "SM2" --#define LN_sm2 "sm2" --#define NID_sm2 1172 --#define OBJ_sm2 OBJ_sm_scheme,301L -- --#define SN_sm3 "SM3" --#define LN_sm3 "sm3" --#define NID_sm3 1143 --#define OBJ_sm3 OBJ_sm_scheme,401L -- --#define SN_sm3WithRSAEncryption "RSA-SM3" --#define LN_sm3WithRSAEncryption "sm3WithRSAEncryption" --#define NID_sm3WithRSAEncryption 1144 --#define OBJ_sm3WithRSAEncryption OBJ_sm_scheme,504L -- --#define LN_hmacWithSHA224 "hmacWithSHA224" --#define NID_hmacWithSHA224 798 --#define OBJ_hmacWithSHA224 OBJ_rsadsi,2L,8L -- --#define LN_hmacWithSHA256 "hmacWithSHA256" --#define NID_hmacWithSHA256 799 --#define OBJ_hmacWithSHA256 OBJ_rsadsi,2L,9L -- --#define LN_hmacWithSHA384 "hmacWithSHA384" --#define NID_hmacWithSHA384 800 --#define OBJ_hmacWithSHA384 OBJ_rsadsi,2L,10L -- --#define LN_hmacWithSHA512 "hmacWithSHA512" --#define NID_hmacWithSHA512 801 --#define OBJ_hmacWithSHA512 OBJ_rsadsi,2L,11L -- --#define LN_hmacWithSHA512_224 "hmacWithSHA512-224" --#define NID_hmacWithSHA512_224 1193 --#define OBJ_hmacWithSHA512_224 OBJ_rsadsi,2L,12L -- --#define LN_hmacWithSHA512_256 "hmacWithSHA512-256" --#define NID_hmacWithSHA512_256 1194 --#define OBJ_hmacWithSHA512_256 OBJ_rsadsi,2L,13L -- --#define SN_rc2_cbc "RC2-CBC" --#define LN_rc2_cbc "rc2-cbc" --#define NID_rc2_cbc 37 --#define OBJ_rc2_cbc OBJ_rsadsi,3L,2L -- --#define SN_rc2_ecb "RC2-ECB" --#define LN_rc2_ecb "rc2-ecb" --#define NID_rc2_ecb 38 -- --#define SN_rc2_cfb64 "RC2-CFB" --#define LN_rc2_cfb64 "rc2-cfb" --#define NID_rc2_cfb64 39 -- --#define SN_rc2_ofb64 "RC2-OFB" --#define LN_rc2_ofb64 "rc2-ofb" --#define NID_rc2_ofb64 40 -- --#define SN_rc2_40_cbc "RC2-40-CBC" --#define LN_rc2_40_cbc "rc2-40-cbc" --#define NID_rc2_40_cbc 98 -- --#define SN_rc2_64_cbc "RC2-64-CBC" --#define LN_rc2_64_cbc "rc2-64-cbc" --#define NID_rc2_64_cbc 166 -- --#define SN_rc4 "RC4" --#define LN_rc4 "rc4" --#define NID_rc4 5 --#define OBJ_rc4 OBJ_rsadsi,3L,4L -- --#define SN_rc4_40 "RC4-40" --#define LN_rc4_40 "rc4-40" --#define NID_rc4_40 97 -- --#define SN_des_ede3_cbc "DES-EDE3-CBC" --#define LN_des_ede3_cbc "des-ede3-cbc" --#define NID_des_ede3_cbc 44 --#define OBJ_des_ede3_cbc OBJ_rsadsi,3L,7L -- --#define SN_rc5_cbc "RC5-CBC" --#define LN_rc5_cbc "rc5-cbc" --#define NID_rc5_cbc 120 --#define OBJ_rc5_cbc OBJ_rsadsi,3L,8L -- --#define SN_rc5_ecb "RC5-ECB" --#define LN_rc5_ecb "rc5-ecb" --#define NID_rc5_ecb 121 -- --#define SN_rc5_cfb64 "RC5-CFB" --#define LN_rc5_cfb64 "rc5-cfb" --#define NID_rc5_cfb64 122 -- --#define SN_rc5_ofb64 "RC5-OFB" --#define LN_rc5_ofb64 "rc5-ofb" --#define NID_rc5_ofb64 123 -- --#define SN_ms_ext_req "msExtReq" --#define LN_ms_ext_req "Microsoft Extension Request" --#define NID_ms_ext_req 171 --#define OBJ_ms_ext_req 1L,3L,6L,1L,4L,1L,311L,2L,1L,14L -- --#define SN_ms_code_ind "msCodeInd" --#define LN_ms_code_ind "Microsoft Individual Code Signing" --#define NID_ms_code_ind 134 --#define OBJ_ms_code_ind 1L,3L,6L,1L,4L,1L,311L,2L,1L,21L -- --#define SN_ms_code_com "msCodeCom" --#define LN_ms_code_com "Microsoft Commercial Code Signing" --#define NID_ms_code_com 135 --#define OBJ_ms_code_com 1L,3L,6L,1L,4L,1L,311L,2L,1L,22L -- --#define SN_ms_ctl_sign "msCTLSign" --#define LN_ms_ctl_sign "Microsoft Trust List Signing" --#define NID_ms_ctl_sign 136 --#define OBJ_ms_ctl_sign 1L,3L,6L,1L,4L,1L,311L,10L,3L,1L -- --#define SN_ms_sgc "msSGC" --#define LN_ms_sgc "Microsoft Server Gated Crypto" --#define NID_ms_sgc 137 --#define OBJ_ms_sgc 1L,3L,6L,1L,4L,1L,311L,10L,3L,3L -- --#define SN_ms_efs "msEFS" --#define LN_ms_efs "Microsoft Encrypted File System" --#define NID_ms_efs 138 --#define OBJ_ms_efs 1L,3L,6L,1L,4L,1L,311L,10L,3L,4L -- --#define SN_ms_smartcard_login "msSmartcardLogin" --#define LN_ms_smartcard_login "Microsoft Smartcard Login" --#define NID_ms_smartcard_login 648 --#define OBJ_ms_smartcard_login 1L,3L,6L,1L,4L,1L,311L,20L,2L,2L -- --#define SN_ms_upn "msUPN" --#define LN_ms_upn "Microsoft User Principal Name" --#define NID_ms_upn 649 --#define OBJ_ms_upn 1L,3L,6L,1L,4L,1L,311L,20L,2L,3L -- --#define SN_idea_cbc "IDEA-CBC" --#define LN_idea_cbc "idea-cbc" --#define NID_idea_cbc 34 --#define OBJ_idea_cbc 1L,3L,6L,1L,4L,1L,188L,7L,1L,1L,2L -- --#define SN_idea_ecb "IDEA-ECB" --#define LN_idea_ecb "idea-ecb" --#define NID_idea_ecb 36 -- --#define SN_idea_cfb64 "IDEA-CFB" --#define LN_idea_cfb64 "idea-cfb" --#define NID_idea_cfb64 35 -- --#define SN_idea_ofb64 "IDEA-OFB" --#define LN_idea_ofb64 "idea-ofb" --#define NID_idea_ofb64 46 -- --#define SN_bf_cbc "BF-CBC" --#define LN_bf_cbc "bf-cbc" --#define NID_bf_cbc 91 --#define OBJ_bf_cbc 1L,3L,6L,1L,4L,1L,3029L,1L,2L -- --#define SN_bf_ecb "BF-ECB" --#define LN_bf_ecb "bf-ecb" --#define NID_bf_ecb 92 -- --#define SN_bf_cfb64 "BF-CFB" --#define LN_bf_cfb64 "bf-cfb" --#define NID_bf_cfb64 93 -- --#define SN_bf_ofb64 "BF-OFB" --#define LN_bf_ofb64 "bf-ofb" --#define NID_bf_ofb64 94 -- --#define SN_id_pkix "PKIX" --#define NID_id_pkix 127 --#define OBJ_id_pkix 1L,3L,6L,1L,5L,5L,7L -- --#define SN_id_pkix_mod "id-pkix-mod" --#define NID_id_pkix_mod 258 --#define OBJ_id_pkix_mod OBJ_id_pkix,0L -- --#define SN_id_pe "id-pe" --#define NID_id_pe 175 --#define OBJ_id_pe OBJ_id_pkix,1L -- --#define SN_id_qt "id-qt" --#define NID_id_qt 259 --#define OBJ_id_qt OBJ_id_pkix,2L -- --#define SN_id_kp "id-kp" --#define NID_id_kp 128 --#define OBJ_id_kp OBJ_id_pkix,3L -- --#define SN_id_it "id-it" --#define NID_id_it 260 --#define OBJ_id_it OBJ_id_pkix,4L -- --#define SN_id_pkip "id-pkip" --#define NID_id_pkip 261 --#define OBJ_id_pkip OBJ_id_pkix,5L -- --#define SN_id_alg "id-alg" --#define NID_id_alg 262 --#define OBJ_id_alg OBJ_id_pkix,6L -- --#define SN_id_cmc "id-cmc" --#define NID_id_cmc 263 --#define OBJ_id_cmc OBJ_id_pkix,7L -- --#define SN_id_on "id-on" --#define NID_id_on 264 --#define OBJ_id_on OBJ_id_pkix,8L -- --#define SN_id_pda "id-pda" --#define NID_id_pda 265 --#define OBJ_id_pda OBJ_id_pkix,9L -- --#define SN_id_aca "id-aca" --#define NID_id_aca 266 --#define OBJ_id_aca OBJ_id_pkix,10L -- --#define SN_id_qcs "id-qcs" --#define NID_id_qcs 267 --#define OBJ_id_qcs OBJ_id_pkix,11L -- --#define SN_id_cct "id-cct" --#define NID_id_cct 268 --#define OBJ_id_cct OBJ_id_pkix,12L -- --#define SN_id_ppl "id-ppl" --#define NID_id_ppl 662 --#define OBJ_id_ppl OBJ_id_pkix,21L -- --#define SN_id_ad "id-ad" --#define NID_id_ad 176 --#define OBJ_id_ad OBJ_id_pkix,48L -- --#define SN_id_pkix1_explicit_88 "id-pkix1-explicit-88" --#define NID_id_pkix1_explicit_88 269 --#define OBJ_id_pkix1_explicit_88 OBJ_id_pkix_mod,1L -- --#define SN_id_pkix1_implicit_88 "id-pkix1-implicit-88" --#define NID_id_pkix1_implicit_88 270 --#define OBJ_id_pkix1_implicit_88 OBJ_id_pkix_mod,2L -- --#define SN_id_pkix1_explicit_93 "id-pkix1-explicit-93" --#define NID_id_pkix1_explicit_93 271 --#define OBJ_id_pkix1_explicit_93 OBJ_id_pkix_mod,3L -- --#define SN_id_pkix1_implicit_93 "id-pkix1-implicit-93" --#define NID_id_pkix1_implicit_93 272 --#define OBJ_id_pkix1_implicit_93 OBJ_id_pkix_mod,4L -- --#define SN_id_mod_crmf "id-mod-crmf" --#define NID_id_mod_crmf 273 --#define OBJ_id_mod_crmf OBJ_id_pkix_mod,5L -- --#define SN_id_mod_cmc "id-mod-cmc" --#define NID_id_mod_cmc 274 --#define OBJ_id_mod_cmc OBJ_id_pkix_mod,6L -- --#define SN_id_mod_kea_profile_88 "id-mod-kea-profile-88" --#define NID_id_mod_kea_profile_88 275 --#define OBJ_id_mod_kea_profile_88 OBJ_id_pkix_mod,7L -- --#define SN_id_mod_kea_profile_93 "id-mod-kea-profile-93" --#define NID_id_mod_kea_profile_93 276 --#define OBJ_id_mod_kea_profile_93 OBJ_id_pkix_mod,8L -- --#define SN_id_mod_cmp "id-mod-cmp" --#define NID_id_mod_cmp 277 --#define OBJ_id_mod_cmp OBJ_id_pkix_mod,9L -- --#define SN_id_mod_qualified_cert_88 "id-mod-qualified-cert-88" --#define NID_id_mod_qualified_cert_88 278 --#define OBJ_id_mod_qualified_cert_88 OBJ_id_pkix_mod,10L -- --#define SN_id_mod_qualified_cert_93 "id-mod-qualified-cert-93" --#define NID_id_mod_qualified_cert_93 279 --#define OBJ_id_mod_qualified_cert_93 OBJ_id_pkix_mod,11L -- --#define SN_id_mod_attribute_cert "id-mod-attribute-cert" --#define NID_id_mod_attribute_cert 280 --#define OBJ_id_mod_attribute_cert OBJ_id_pkix_mod,12L -- --#define SN_id_mod_timestamp_protocol "id-mod-timestamp-protocol" --#define NID_id_mod_timestamp_protocol 281 --#define OBJ_id_mod_timestamp_protocol OBJ_id_pkix_mod,13L -- --#define SN_id_mod_ocsp "id-mod-ocsp" --#define NID_id_mod_ocsp 282 --#define OBJ_id_mod_ocsp OBJ_id_pkix_mod,14L -- --#define SN_id_mod_dvcs "id-mod-dvcs" --#define NID_id_mod_dvcs 283 --#define OBJ_id_mod_dvcs OBJ_id_pkix_mod,15L -- --#define SN_id_mod_cmp2000 "id-mod-cmp2000" --#define NID_id_mod_cmp2000 284 --#define OBJ_id_mod_cmp2000 OBJ_id_pkix_mod,16L -- --#define SN_info_access "authorityInfoAccess" --#define LN_info_access "Authority Information Access" --#define NID_info_access 177 --#define OBJ_info_access OBJ_id_pe,1L -- --#define SN_biometricInfo "biometricInfo" --#define LN_biometricInfo "Biometric Info" --#define NID_biometricInfo 285 --#define OBJ_biometricInfo OBJ_id_pe,2L -- --#define SN_qcStatements "qcStatements" --#define NID_qcStatements 286 --#define OBJ_qcStatements OBJ_id_pe,3L -- --#define SN_ac_auditEntity "ac-auditEntity" --#define NID_ac_auditEntity 287 --#define OBJ_ac_auditEntity OBJ_id_pe,4L -- --#define SN_ac_targeting "ac-targeting" --#define NID_ac_targeting 288 --#define OBJ_ac_targeting OBJ_id_pe,5L -- --#define SN_aaControls "aaControls" --#define NID_aaControls 289 --#define OBJ_aaControls OBJ_id_pe,6L -- --#define SN_sbgp_ipAddrBlock "sbgp-ipAddrBlock" --#define NID_sbgp_ipAddrBlock 290 --#define OBJ_sbgp_ipAddrBlock OBJ_id_pe,7L -- --#define SN_sbgp_autonomousSysNum "sbgp-autonomousSysNum" --#define NID_sbgp_autonomousSysNum 291 --#define OBJ_sbgp_autonomousSysNum OBJ_id_pe,8L -- --#define SN_sbgp_routerIdentifier "sbgp-routerIdentifier" --#define NID_sbgp_routerIdentifier 292 --#define OBJ_sbgp_routerIdentifier OBJ_id_pe,9L -- --#define SN_ac_proxying "ac-proxying" --#define NID_ac_proxying 397 --#define OBJ_ac_proxying OBJ_id_pe,10L -- --#define SN_sinfo_access "subjectInfoAccess" --#define LN_sinfo_access "Subject Information Access" --#define NID_sinfo_access 398 --#define OBJ_sinfo_access OBJ_id_pe,11L -- --#define SN_proxyCertInfo "proxyCertInfo" --#define LN_proxyCertInfo "Proxy Certificate Information" --#define NID_proxyCertInfo 663 --#define OBJ_proxyCertInfo OBJ_id_pe,14L -- --#define SN_tlsfeature "tlsfeature" --#define LN_tlsfeature "TLS Feature" --#define NID_tlsfeature 1020 --#define OBJ_tlsfeature OBJ_id_pe,24L -- --#define SN_id_qt_cps "id-qt-cps" --#define LN_id_qt_cps "Policy Qualifier CPS" --#define NID_id_qt_cps 164 --#define OBJ_id_qt_cps OBJ_id_qt,1L -- --#define SN_id_qt_unotice "id-qt-unotice" --#define LN_id_qt_unotice "Policy Qualifier User Notice" --#define NID_id_qt_unotice 165 --#define OBJ_id_qt_unotice OBJ_id_qt,2L -- --#define SN_textNotice "textNotice" --#define NID_textNotice 293 --#define OBJ_textNotice OBJ_id_qt,3L -- --#define SN_server_auth "serverAuth" --#define LN_server_auth "TLS Web Server Authentication" --#define NID_server_auth 129 --#define OBJ_server_auth OBJ_id_kp,1L -- --#define SN_client_auth "clientAuth" --#define LN_client_auth "TLS Web Client Authentication" --#define NID_client_auth 130 --#define OBJ_client_auth OBJ_id_kp,2L -- --#define SN_code_sign "codeSigning" --#define LN_code_sign "Code Signing" --#define NID_code_sign 131 --#define OBJ_code_sign OBJ_id_kp,3L -- --#define SN_email_protect "emailProtection" --#define LN_email_protect "E-mail Protection" --#define NID_email_protect 132 --#define OBJ_email_protect OBJ_id_kp,4L -- --#define SN_ipsecEndSystem "ipsecEndSystem" --#define LN_ipsecEndSystem "IPSec End System" --#define NID_ipsecEndSystem 294 --#define OBJ_ipsecEndSystem OBJ_id_kp,5L -- --#define SN_ipsecTunnel "ipsecTunnel" --#define LN_ipsecTunnel "IPSec Tunnel" --#define NID_ipsecTunnel 295 --#define OBJ_ipsecTunnel OBJ_id_kp,6L -- --#define SN_ipsecUser "ipsecUser" --#define LN_ipsecUser "IPSec User" --#define NID_ipsecUser 296 --#define OBJ_ipsecUser OBJ_id_kp,7L -- --#define SN_time_stamp "timeStamping" --#define LN_time_stamp "Time Stamping" --#define NID_time_stamp 133 --#define OBJ_time_stamp OBJ_id_kp,8L -- --#define SN_OCSP_sign "OCSPSigning" --#define LN_OCSP_sign "OCSP Signing" --#define NID_OCSP_sign 180 --#define OBJ_OCSP_sign OBJ_id_kp,9L -- --#define SN_dvcs "DVCS" --#define LN_dvcs "dvcs" --#define NID_dvcs 297 --#define OBJ_dvcs OBJ_id_kp,10L -- --#define SN_ipsec_IKE "ipsecIKE" --#define LN_ipsec_IKE "ipsec Internet Key Exchange" --#define NID_ipsec_IKE 1022 --#define OBJ_ipsec_IKE OBJ_id_kp,17L -- --#define SN_capwapAC "capwapAC" --#define LN_capwapAC "Ctrl/provision WAP Access" --#define NID_capwapAC 1023 --#define OBJ_capwapAC OBJ_id_kp,18L -- --#define SN_capwapWTP "capwapWTP" --#define LN_capwapWTP "Ctrl/Provision WAP Termination" --#define NID_capwapWTP 1024 --#define OBJ_capwapWTP OBJ_id_kp,19L -- --#define SN_sshClient "secureShellClient" --#define LN_sshClient "SSH Client" --#define NID_sshClient 1025 --#define OBJ_sshClient OBJ_id_kp,21L -- --#define SN_sshServer "secureShellServer" --#define LN_sshServer "SSH Server" --#define NID_sshServer 1026 --#define OBJ_sshServer OBJ_id_kp,22L -- --#define SN_sendRouter "sendRouter" --#define LN_sendRouter "Send Router" --#define NID_sendRouter 1027 --#define OBJ_sendRouter OBJ_id_kp,23L -- --#define SN_sendProxiedRouter "sendProxiedRouter" --#define LN_sendProxiedRouter "Send Proxied Router" --#define NID_sendProxiedRouter 1028 --#define OBJ_sendProxiedRouter OBJ_id_kp,24L -- --#define SN_sendOwner "sendOwner" --#define LN_sendOwner "Send Owner" --#define NID_sendOwner 1029 --#define OBJ_sendOwner OBJ_id_kp,25L -- --#define SN_sendProxiedOwner "sendProxiedOwner" --#define LN_sendProxiedOwner "Send Proxied Owner" --#define NID_sendProxiedOwner 1030 --#define OBJ_sendProxiedOwner OBJ_id_kp,26L -- --#define SN_cmcCA "cmcCA" --#define LN_cmcCA "CMC Certificate Authority" --#define NID_cmcCA 1131 --#define OBJ_cmcCA OBJ_id_kp,27L -- --#define SN_cmcRA "cmcRA" --#define LN_cmcRA "CMC Registration Authority" --#define NID_cmcRA 1132 --#define OBJ_cmcRA OBJ_id_kp,28L -- --#define SN_id_it_caProtEncCert "id-it-caProtEncCert" --#define NID_id_it_caProtEncCert 298 --#define OBJ_id_it_caProtEncCert OBJ_id_it,1L -- --#define SN_id_it_signKeyPairTypes "id-it-signKeyPairTypes" --#define NID_id_it_signKeyPairTypes 299 --#define OBJ_id_it_signKeyPairTypes OBJ_id_it,2L -- --#define SN_id_it_encKeyPairTypes "id-it-encKeyPairTypes" --#define NID_id_it_encKeyPairTypes 300 --#define OBJ_id_it_encKeyPairTypes OBJ_id_it,3L -- --#define SN_id_it_preferredSymmAlg "id-it-preferredSymmAlg" --#define NID_id_it_preferredSymmAlg 301 --#define OBJ_id_it_preferredSymmAlg OBJ_id_it,4L -- --#define SN_id_it_caKeyUpdateInfo "id-it-caKeyUpdateInfo" --#define NID_id_it_caKeyUpdateInfo 302 --#define OBJ_id_it_caKeyUpdateInfo OBJ_id_it,5L -- --#define SN_id_it_currentCRL "id-it-currentCRL" --#define NID_id_it_currentCRL 303 --#define OBJ_id_it_currentCRL OBJ_id_it,6L -- --#define SN_id_it_unsupportedOIDs "id-it-unsupportedOIDs" --#define NID_id_it_unsupportedOIDs 304 --#define OBJ_id_it_unsupportedOIDs OBJ_id_it,7L -- --#define SN_id_it_subscriptionRequest "id-it-subscriptionRequest" --#define NID_id_it_subscriptionRequest 305 --#define OBJ_id_it_subscriptionRequest OBJ_id_it,8L -- --#define SN_id_it_subscriptionResponse "id-it-subscriptionResponse" --#define NID_id_it_subscriptionResponse 306 --#define OBJ_id_it_subscriptionResponse OBJ_id_it,9L -- --#define SN_id_it_keyPairParamReq "id-it-keyPairParamReq" --#define NID_id_it_keyPairParamReq 307 --#define OBJ_id_it_keyPairParamReq OBJ_id_it,10L -- --#define SN_id_it_keyPairParamRep "id-it-keyPairParamRep" --#define NID_id_it_keyPairParamRep 308 --#define OBJ_id_it_keyPairParamRep OBJ_id_it,11L -- --#define SN_id_it_revPassphrase "id-it-revPassphrase" --#define NID_id_it_revPassphrase 309 --#define OBJ_id_it_revPassphrase OBJ_id_it,12L -- --#define SN_id_it_implicitConfirm "id-it-implicitConfirm" --#define NID_id_it_implicitConfirm 310 --#define OBJ_id_it_implicitConfirm OBJ_id_it,13L -- --#define SN_id_it_confirmWaitTime "id-it-confirmWaitTime" --#define NID_id_it_confirmWaitTime 311 --#define OBJ_id_it_confirmWaitTime OBJ_id_it,14L -- --#define SN_id_it_origPKIMessage "id-it-origPKIMessage" --#define NID_id_it_origPKIMessage 312 --#define OBJ_id_it_origPKIMessage OBJ_id_it,15L -- --#define SN_id_it_suppLangTags "id-it-suppLangTags" --#define NID_id_it_suppLangTags 784 --#define OBJ_id_it_suppLangTags OBJ_id_it,16L -- --#define SN_id_regCtrl "id-regCtrl" --#define NID_id_regCtrl 313 --#define OBJ_id_regCtrl OBJ_id_pkip,1L -- --#define SN_id_regInfo "id-regInfo" --#define NID_id_regInfo 314 --#define OBJ_id_regInfo OBJ_id_pkip,2L -- --#define SN_id_regCtrl_regToken "id-regCtrl-regToken" --#define NID_id_regCtrl_regToken 315 --#define OBJ_id_regCtrl_regToken OBJ_id_regCtrl,1L -- --#define SN_id_regCtrl_authenticator "id-regCtrl-authenticator" --#define NID_id_regCtrl_authenticator 316 --#define OBJ_id_regCtrl_authenticator OBJ_id_regCtrl,2L -- --#define SN_id_regCtrl_pkiPublicationInfo "id-regCtrl-pkiPublicationInfo" --#define NID_id_regCtrl_pkiPublicationInfo 317 --#define OBJ_id_regCtrl_pkiPublicationInfo OBJ_id_regCtrl,3L -- --#define SN_id_regCtrl_pkiArchiveOptions "id-regCtrl-pkiArchiveOptions" --#define NID_id_regCtrl_pkiArchiveOptions 318 --#define OBJ_id_regCtrl_pkiArchiveOptions OBJ_id_regCtrl,4L -- --#define SN_id_regCtrl_oldCertID "id-regCtrl-oldCertID" --#define NID_id_regCtrl_oldCertID 319 --#define OBJ_id_regCtrl_oldCertID OBJ_id_regCtrl,5L -- --#define SN_id_regCtrl_protocolEncrKey "id-regCtrl-protocolEncrKey" --#define NID_id_regCtrl_protocolEncrKey 320 --#define OBJ_id_regCtrl_protocolEncrKey OBJ_id_regCtrl,6L -- --#define SN_id_regInfo_utf8Pairs "id-regInfo-utf8Pairs" --#define NID_id_regInfo_utf8Pairs 321 --#define OBJ_id_regInfo_utf8Pairs OBJ_id_regInfo,1L -- --#define SN_id_regInfo_certReq "id-regInfo-certReq" --#define NID_id_regInfo_certReq 322 --#define OBJ_id_regInfo_certReq OBJ_id_regInfo,2L -- --#define SN_id_alg_des40 "id-alg-des40" --#define NID_id_alg_des40 323 --#define OBJ_id_alg_des40 OBJ_id_alg,1L -- --#define SN_id_alg_noSignature "id-alg-noSignature" --#define NID_id_alg_noSignature 324 --#define OBJ_id_alg_noSignature OBJ_id_alg,2L -- --#define SN_id_alg_dh_sig_hmac_sha1 "id-alg-dh-sig-hmac-sha1" --#define NID_id_alg_dh_sig_hmac_sha1 325 --#define OBJ_id_alg_dh_sig_hmac_sha1 OBJ_id_alg,3L -- --#define SN_id_alg_dh_pop "id-alg-dh-pop" --#define NID_id_alg_dh_pop 326 --#define OBJ_id_alg_dh_pop OBJ_id_alg,4L -- --#define SN_id_cmc_statusInfo "id-cmc-statusInfo" --#define NID_id_cmc_statusInfo 327 --#define OBJ_id_cmc_statusInfo OBJ_id_cmc,1L -- --#define SN_id_cmc_identification "id-cmc-identification" --#define NID_id_cmc_identification 328 --#define OBJ_id_cmc_identification OBJ_id_cmc,2L -- --#define SN_id_cmc_identityProof "id-cmc-identityProof" --#define NID_id_cmc_identityProof 329 --#define OBJ_id_cmc_identityProof OBJ_id_cmc,3L -- --#define SN_id_cmc_dataReturn "id-cmc-dataReturn" --#define NID_id_cmc_dataReturn 330 --#define OBJ_id_cmc_dataReturn OBJ_id_cmc,4L -- --#define SN_id_cmc_transactionId "id-cmc-transactionId" --#define NID_id_cmc_transactionId 331 --#define OBJ_id_cmc_transactionId OBJ_id_cmc,5L -- --#define SN_id_cmc_senderNonce "id-cmc-senderNonce" --#define NID_id_cmc_senderNonce 332 --#define OBJ_id_cmc_senderNonce OBJ_id_cmc,6L -- --#define SN_id_cmc_recipientNonce "id-cmc-recipientNonce" --#define NID_id_cmc_recipientNonce 333 --#define OBJ_id_cmc_recipientNonce OBJ_id_cmc,7L -- --#define SN_id_cmc_addExtensions "id-cmc-addExtensions" --#define NID_id_cmc_addExtensions 334 --#define OBJ_id_cmc_addExtensions OBJ_id_cmc,8L -- --#define SN_id_cmc_encryptedPOP "id-cmc-encryptedPOP" --#define NID_id_cmc_encryptedPOP 335 --#define OBJ_id_cmc_encryptedPOP OBJ_id_cmc,9L -- --#define SN_id_cmc_decryptedPOP "id-cmc-decryptedPOP" --#define NID_id_cmc_decryptedPOP 336 --#define OBJ_id_cmc_decryptedPOP OBJ_id_cmc,10L -- --#define SN_id_cmc_lraPOPWitness "id-cmc-lraPOPWitness" --#define NID_id_cmc_lraPOPWitness 337 --#define OBJ_id_cmc_lraPOPWitness OBJ_id_cmc,11L -- --#define SN_id_cmc_getCert "id-cmc-getCert" --#define NID_id_cmc_getCert 338 --#define OBJ_id_cmc_getCert OBJ_id_cmc,15L -- --#define SN_id_cmc_getCRL "id-cmc-getCRL" --#define NID_id_cmc_getCRL 339 --#define OBJ_id_cmc_getCRL OBJ_id_cmc,16L -- --#define SN_id_cmc_revokeRequest "id-cmc-revokeRequest" --#define NID_id_cmc_revokeRequest 340 --#define OBJ_id_cmc_revokeRequest OBJ_id_cmc,17L -- --#define SN_id_cmc_regInfo "id-cmc-regInfo" --#define NID_id_cmc_regInfo 341 --#define OBJ_id_cmc_regInfo OBJ_id_cmc,18L -- --#define SN_id_cmc_responseInfo "id-cmc-responseInfo" --#define NID_id_cmc_responseInfo 342 --#define OBJ_id_cmc_responseInfo OBJ_id_cmc,19L -- --#define SN_id_cmc_queryPending "id-cmc-queryPending" --#define NID_id_cmc_queryPending 343 --#define OBJ_id_cmc_queryPending OBJ_id_cmc,21L -- --#define SN_id_cmc_popLinkRandom "id-cmc-popLinkRandom" --#define NID_id_cmc_popLinkRandom 344 --#define OBJ_id_cmc_popLinkRandom OBJ_id_cmc,22L -- --#define SN_id_cmc_popLinkWitness "id-cmc-popLinkWitness" --#define NID_id_cmc_popLinkWitness 345 --#define OBJ_id_cmc_popLinkWitness OBJ_id_cmc,23L -- --#define SN_id_cmc_confirmCertAcceptance "id-cmc-confirmCertAcceptance" --#define NID_id_cmc_confirmCertAcceptance 346 --#define OBJ_id_cmc_confirmCertAcceptance OBJ_id_cmc,24L -- --#define SN_id_on_personalData "id-on-personalData" --#define NID_id_on_personalData 347 --#define OBJ_id_on_personalData OBJ_id_on,1L -- --#define SN_id_on_permanentIdentifier "id-on-permanentIdentifier" --#define LN_id_on_permanentIdentifier "Permanent Identifier" --#define NID_id_on_permanentIdentifier 858 --#define OBJ_id_on_permanentIdentifier OBJ_id_on,3L -- --#define SN_id_pda_dateOfBirth "id-pda-dateOfBirth" --#define NID_id_pda_dateOfBirth 348 --#define OBJ_id_pda_dateOfBirth OBJ_id_pda,1L -- --#define SN_id_pda_placeOfBirth "id-pda-placeOfBirth" --#define NID_id_pda_placeOfBirth 349 --#define OBJ_id_pda_placeOfBirth OBJ_id_pda,2L -- --#define SN_id_pda_gender "id-pda-gender" --#define NID_id_pda_gender 351 --#define OBJ_id_pda_gender OBJ_id_pda,3L -- --#define SN_id_pda_countryOfCitizenship "id-pda-countryOfCitizenship" --#define NID_id_pda_countryOfCitizenship 352 --#define OBJ_id_pda_countryOfCitizenship OBJ_id_pda,4L -- --#define SN_id_pda_countryOfResidence "id-pda-countryOfResidence" --#define NID_id_pda_countryOfResidence 353 --#define OBJ_id_pda_countryOfResidence OBJ_id_pda,5L -- --#define SN_id_aca_authenticationInfo "id-aca-authenticationInfo" --#define NID_id_aca_authenticationInfo 354 --#define OBJ_id_aca_authenticationInfo OBJ_id_aca,1L -- --#define SN_id_aca_accessIdentity "id-aca-accessIdentity" --#define NID_id_aca_accessIdentity 355 --#define OBJ_id_aca_accessIdentity OBJ_id_aca,2L -- --#define SN_id_aca_chargingIdentity "id-aca-chargingIdentity" --#define NID_id_aca_chargingIdentity 356 --#define OBJ_id_aca_chargingIdentity OBJ_id_aca,3L -- --#define SN_id_aca_group "id-aca-group" --#define NID_id_aca_group 357 --#define OBJ_id_aca_group OBJ_id_aca,4L -- --#define SN_id_aca_role "id-aca-role" --#define NID_id_aca_role 358 --#define OBJ_id_aca_role OBJ_id_aca,5L -- --#define SN_id_aca_encAttrs "id-aca-encAttrs" --#define NID_id_aca_encAttrs 399 --#define OBJ_id_aca_encAttrs OBJ_id_aca,6L -- --#define SN_id_qcs_pkixQCSyntax_v1 "id-qcs-pkixQCSyntax-v1" --#define NID_id_qcs_pkixQCSyntax_v1 359 --#define OBJ_id_qcs_pkixQCSyntax_v1 OBJ_id_qcs,1L -- --#define SN_id_cct_crs "id-cct-crs" --#define NID_id_cct_crs 360 --#define OBJ_id_cct_crs OBJ_id_cct,1L -- --#define SN_id_cct_PKIData "id-cct-PKIData" --#define NID_id_cct_PKIData 361 --#define OBJ_id_cct_PKIData OBJ_id_cct,2L -- --#define SN_id_cct_PKIResponse "id-cct-PKIResponse" --#define NID_id_cct_PKIResponse 362 --#define OBJ_id_cct_PKIResponse OBJ_id_cct,3L -- --#define SN_id_ppl_anyLanguage "id-ppl-anyLanguage" --#define LN_id_ppl_anyLanguage "Any language" --#define NID_id_ppl_anyLanguage 664 --#define OBJ_id_ppl_anyLanguage OBJ_id_ppl,0L -- --#define SN_id_ppl_inheritAll "id-ppl-inheritAll" --#define LN_id_ppl_inheritAll "Inherit all" --#define NID_id_ppl_inheritAll 665 --#define OBJ_id_ppl_inheritAll OBJ_id_ppl,1L -- --#define SN_Independent "id-ppl-independent" --#define LN_Independent "Independent" --#define NID_Independent 667 --#define OBJ_Independent OBJ_id_ppl,2L -- --#define SN_ad_OCSP "OCSP" --#define LN_ad_OCSP "OCSP" --#define NID_ad_OCSP 178 --#define OBJ_ad_OCSP OBJ_id_ad,1L -- --#define SN_ad_ca_issuers "caIssuers" --#define LN_ad_ca_issuers "CA Issuers" --#define NID_ad_ca_issuers 179 --#define OBJ_ad_ca_issuers OBJ_id_ad,2L -- --#define SN_ad_timeStamping "ad_timestamping" --#define LN_ad_timeStamping "AD Time Stamping" --#define NID_ad_timeStamping 363 --#define OBJ_ad_timeStamping OBJ_id_ad,3L -- --#define SN_ad_dvcs "AD_DVCS" --#define LN_ad_dvcs "ad dvcs" --#define NID_ad_dvcs 364 --#define OBJ_ad_dvcs OBJ_id_ad,4L -- --#define SN_caRepository "caRepository" --#define LN_caRepository "CA Repository" --#define NID_caRepository 785 --#define OBJ_caRepository OBJ_id_ad,5L -- --#define OBJ_id_pkix_OCSP OBJ_ad_OCSP -- --#define SN_id_pkix_OCSP_basic "basicOCSPResponse" --#define LN_id_pkix_OCSP_basic "Basic OCSP Response" --#define NID_id_pkix_OCSP_basic 365 --#define OBJ_id_pkix_OCSP_basic OBJ_id_pkix_OCSP,1L -- --#define SN_id_pkix_OCSP_Nonce "Nonce" --#define LN_id_pkix_OCSP_Nonce "OCSP Nonce" --#define NID_id_pkix_OCSP_Nonce 366 --#define OBJ_id_pkix_OCSP_Nonce OBJ_id_pkix_OCSP,2L -- --#define SN_id_pkix_OCSP_CrlID "CrlID" --#define LN_id_pkix_OCSP_CrlID "OCSP CRL ID" --#define NID_id_pkix_OCSP_CrlID 367 --#define OBJ_id_pkix_OCSP_CrlID OBJ_id_pkix_OCSP,3L -- --#define SN_id_pkix_OCSP_acceptableResponses "acceptableResponses" --#define LN_id_pkix_OCSP_acceptableResponses "Acceptable OCSP Responses" --#define NID_id_pkix_OCSP_acceptableResponses 368 --#define OBJ_id_pkix_OCSP_acceptableResponses OBJ_id_pkix_OCSP,4L -- --#define SN_id_pkix_OCSP_noCheck "noCheck" --#define LN_id_pkix_OCSP_noCheck "OCSP No Check" --#define NID_id_pkix_OCSP_noCheck 369 --#define OBJ_id_pkix_OCSP_noCheck OBJ_id_pkix_OCSP,5L -- --#define SN_id_pkix_OCSP_archiveCutoff "archiveCutoff" --#define LN_id_pkix_OCSP_archiveCutoff "OCSP Archive Cutoff" --#define NID_id_pkix_OCSP_archiveCutoff 370 --#define OBJ_id_pkix_OCSP_archiveCutoff OBJ_id_pkix_OCSP,6L -- --#define SN_id_pkix_OCSP_serviceLocator "serviceLocator" --#define LN_id_pkix_OCSP_serviceLocator "OCSP Service Locator" --#define NID_id_pkix_OCSP_serviceLocator 371 --#define OBJ_id_pkix_OCSP_serviceLocator OBJ_id_pkix_OCSP,7L -- --#define SN_id_pkix_OCSP_extendedStatus "extendedStatus" --#define LN_id_pkix_OCSP_extendedStatus "Extended OCSP Status" --#define NID_id_pkix_OCSP_extendedStatus 372 --#define OBJ_id_pkix_OCSP_extendedStatus OBJ_id_pkix_OCSP,8L -- --#define SN_id_pkix_OCSP_valid "valid" --#define NID_id_pkix_OCSP_valid 373 --#define OBJ_id_pkix_OCSP_valid OBJ_id_pkix_OCSP,9L -- --#define SN_id_pkix_OCSP_path "path" --#define NID_id_pkix_OCSP_path 374 --#define OBJ_id_pkix_OCSP_path OBJ_id_pkix_OCSP,10L -- --#define SN_id_pkix_OCSP_trustRoot "trustRoot" --#define LN_id_pkix_OCSP_trustRoot "Trust Root" --#define NID_id_pkix_OCSP_trustRoot 375 --#define OBJ_id_pkix_OCSP_trustRoot OBJ_id_pkix_OCSP,11L -- --#define SN_algorithm "algorithm" --#define LN_algorithm "algorithm" --#define NID_algorithm 376 --#define OBJ_algorithm 1L,3L,14L,3L,2L -- --#define SN_md5WithRSA "RSA-NP-MD5" --#define LN_md5WithRSA "md5WithRSA" --#define NID_md5WithRSA 104 --#define OBJ_md5WithRSA OBJ_algorithm,3L -- --#define SN_des_ecb "DES-ECB" --#define LN_des_ecb "des-ecb" --#define NID_des_ecb 29 --#define OBJ_des_ecb OBJ_algorithm,6L -- --#define SN_des_cbc "DES-CBC" --#define LN_des_cbc "des-cbc" --#define NID_des_cbc 31 --#define OBJ_des_cbc OBJ_algorithm,7L -- --#define SN_des_ofb64 "DES-OFB" --#define LN_des_ofb64 "des-ofb" --#define NID_des_ofb64 45 --#define OBJ_des_ofb64 OBJ_algorithm,8L -- --#define SN_des_cfb64 "DES-CFB" --#define LN_des_cfb64 "des-cfb" --#define NID_des_cfb64 30 --#define OBJ_des_cfb64 OBJ_algorithm,9L -- --#define SN_rsaSignature "rsaSignature" --#define NID_rsaSignature 377 --#define OBJ_rsaSignature OBJ_algorithm,11L -- --#define SN_dsa_2 "DSA-old" --#define LN_dsa_2 "dsaEncryption-old" --#define NID_dsa_2 67 --#define OBJ_dsa_2 OBJ_algorithm,12L -- --#define SN_dsaWithSHA "DSA-SHA" --#define LN_dsaWithSHA "dsaWithSHA" --#define NID_dsaWithSHA 66 --#define OBJ_dsaWithSHA OBJ_algorithm,13L -- --#define SN_shaWithRSAEncryption "RSA-SHA" --#define LN_shaWithRSAEncryption "shaWithRSAEncryption" --#define NID_shaWithRSAEncryption 42 --#define OBJ_shaWithRSAEncryption OBJ_algorithm,15L -- --#define SN_des_ede_ecb "DES-EDE" --#define LN_des_ede_ecb "des-ede" --#define NID_des_ede_ecb 32 --#define OBJ_des_ede_ecb OBJ_algorithm,17L -- --#define SN_des_ede3_ecb "DES-EDE3" --#define LN_des_ede3_ecb "des-ede3" --#define NID_des_ede3_ecb 33 -- --#define SN_des_ede_cbc "DES-EDE-CBC" --#define LN_des_ede_cbc "des-ede-cbc" --#define NID_des_ede_cbc 43 -- --#define SN_des_ede_cfb64 "DES-EDE-CFB" --#define LN_des_ede_cfb64 "des-ede-cfb" --#define NID_des_ede_cfb64 60 -- --#define SN_des_ede3_cfb64 "DES-EDE3-CFB" --#define LN_des_ede3_cfb64 "des-ede3-cfb" --#define NID_des_ede3_cfb64 61 -- --#define SN_des_ede_ofb64 "DES-EDE-OFB" --#define LN_des_ede_ofb64 "des-ede-ofb" --#define NID_des_ede_ofb64 62 -- --#define SN_des_ede3_ofb64 "DES-EDE3-OFB" --#define LN_des_ede3_ofb64 "des-ede3-ofb" --#define NID_des_ede3_ofb64 63 -- --#define SN_desx_cbc "DESX-CBC" --#define LN_desx_cbc "desx-cbc" --#define NID_desx_cbc 80 -- --#define SN_sha "SHA" --#define LN_sha "sha" --#define NID_sha 41 --#define OBJ_sha OBJ_algorithm,18L -- --#define SN_sha1 "SHA1" --#define LN_sha1 "sha1" --#define NID_sha1 64 --#define OBJ_sha1 OBJ_algorithm,26L -- --#define SN_dsaWithSHA1_2 "DSA-SHA1-old" --#define LN_dsaWithSHA1_2 "dsaWithSHA1-old" --#define NID_dsaWithSHA1_2 70 --#define OBJ_dsaWithSHA1_2 OBJ_algorithm,27L -- --#define SN_sha1WithRSA "RSA-SHA1-2" --#define LN_sha1WithRSA "sha1WithRSA" --#define NID_sha1WithRSA 115 --#define OBJ_sha1WithRSA OBJ_algorithm,29L -- --#define SN_ripemd160 "RIPEMD160" --#define LN_ripemd160 "ripemd160" --#define NID_ripemd160 117 --#define OBJ_ripemd160 1L,3L,36L,3L,2L,1L -- --#define SN_ripemd160WithRSA "RSA-RIPEMD160" --#define LN_ripemd160WithRSA "ripemd160WithRSA" --#define NID_ripemd160WithRSA 119 --#define OBJ_ripemd160WithRSA 1L,3L,36L,3L,3L,1L,2L -- --#define SN_blake2b512 "BLAKE2b512" --#define LN_blake2b512 "blake2b512" --#define NID_blake2b512 1056 --#define OBJ_blake2b512 1L,3L,6L,1L,4L,1L,1722L,12L,2L,1L,16L -- --#define SN_blake2s256 "BLAKE2s256" --#define LN_blake2s256 "blake2s256" --#define NID_blake2s256 1057 --#define OBJ_blake2s256 1L,3L,6L,1L,4L,1L,1722L,12L,2L,2L,8L -- --#define SN_sxnet "SXNetID" --#define LN_sxnet "Strong Extranet ID" --#define NID_sxnet 143 --#define OBJ_sxnet 1L,3L,101L,1L,4L,1L -- --#define SN_X500 "X500" --#define LN_X500 "directory services (X.500)" --#define NID_X500 11 --#define OBJ_X500 2L,5L -- --#define SN_X509 "X509" --#define NID_X509 12 --#define OBJ_X509 OBJ_X500,4L -- --#define SN_commonName "CN" --#define LN_commonName "commonName" --#define NID_commonName 13 --#define OBJ_commonName OBJ_X509,3L -- --#define SN_surname "SN" --#define LN_surname "surname" --#define NID_surname 100 --#define OBJ_surname OBJ_X509,4L -- --#define LN_serialNumber "serialNumber" --#define NID_serialNumber 105 --#define OBJ_serialNumber OBJ_X509,5L -- --#define SN_countryName "C" --#define LN_countryName "countryName" --#define NID_countryName 14 --#define OBJ_countryName OBJ_X509,6L -- --#define SN_localityName "L" --#define LN_localityName "localityName" --#define NID_localityName 15 --#define OBJ_localityName OBJ_X509,7L -- --#define SN_stateOrProvinceName "ST" --#define LN_stateOrProvinceName "stateOrProvinceName" --#define NID_stateOrProvinceName 16 --#define OBJ_stateOrProvinceName OBJ_X509,8L -- --#define SN_streetAddress "street" --#define LN_streetAddress "streetAddress" --#define NID_streetAddress 660 --#define OBJ_streetAddress OBJ_X509,9L -- --#define SN_organizationName "O" --#define LN_organizationName "organizationName" --#define NID_organizationName 17 --#define OBJ_organizationName OBJ_X509,10L -- --#define SN_organizationalUnitName "OU" --#define LN_organizationalUnitName "organizationalUnitName" --#define NID_organizationalUnitName 18 --#define OBJ_organizationalUnitName OBJ_X509,11L -- --#define SN_title "title" --#define LN_title "title" --#define NID_title 106 --#define OBJ_title OBJ_X509,12L -- --#define LN_description "description" --#define NID_description 107 --#define OBJ_description OBJ_X509,13L -- --#define LN_searchGuide "searchGuide" --#define NID_searchGuide 859 --#define OBJ_searchGuide OBJ_X509,14L -- --#define LN_businessCategory "businessCategory" --#define NID_businessCategory 860 --#define OBJ_businessCategory OBJ_X509,15L -- --#define LN_postalAddress "postalAddress" --#define NID_postalAddress 861 --#define OBJ_postalAddress OBJ_X509,16L -- --#define LN_postalCode "postalCode" --#define NID_postalCode 661 --#define OBJ_postalCode OBJ_X509,17L -- --#define LN_postOfficeBox "postOfficeBox" --#define NID_postOfficeBox 862 --#define OBJ_postOfficeBox OBJ_X509,18L -- --#define LN_physicalDeliveryOfficeName "physicalDeliveryOfficeName" --#define NID_physicalDeliveryOfficeName 863 --#define OBJ_physicalDeliveryOfficeName OBJ_X509,19L -- --#define LN_telephoneNumber "telephoneNumber" --#define NID_telephoneNumber 864 --#define OBJ_telephoneNumber OBJ_X509,20L -- --#define LN_telexNumber "telexNumber" --#define NID_telexNumber 865 --#define OBJ_telexNumber OBJ_X509,21L -- --#define LN_teletexTerminalIdentifier "teletexTerminalIdentifier" --#define NID_teletexTerminalIdentifier 866 --#define OBJ_teletexTerminalIdentifier OBJ_X509,22L -- --#define LN_facsimileTelephoneNumber "facsimileTelephoneNumber" --#define NID_facsimileTelephoneNumber 867 --#define OBJ_facsimileTelephoneNumber OBJ_X509,23L -- --#define LN_x121Address "x121Address" --#define NID_x121Address 868 --#define OBJ_x121Address OBJ_X509,24L -- --#define LN_internationaliSDNNumber "internationaliSDNNumber" --#define NID_internationaliSDNNumber 869 --#define OBJ_internationaliSDNNumber OBJ_X509,25L -- --#define LN_registeredAddress "registeredAddress" --#define NID_registeredAddress 870 --#define OBJ_registeredAddress OBJ_X509,26L -- --#define LN_destinationIndicator "destinationIndicator" --#define NID_destinationIndicator 871 --#define OBJ_destinationIndicator OBJ_X509,27L -- --#define LN_preferredDeliveryMethod "preferredDeliveryMethod" --#define NID_preferredDeliveryMethod 872 --#define OBJ_preferredDeliveryMethod OBJ_X509,28L -- --#define LN_presentationAddress "presentationAddress" --#define NID_presentationAddress 873 --#define OBJ_presentationAddress OBJ_X509,29L -- --#define LN_supportedApplicationContext "supportedApplicationContext" --#define NID_supportedApplicationContext 874 --#define OBJ_supportedApplicationContext OBJ_X509,30L -- --#define SN_member "member" --#define NID_member 875 --#define OBJ_member OBJ_X509,31L -- --#define SN_owner "owner" --#define NID_owner 876 --#define OBJ_owner OBJ_X509,32L -- --#define LN_roleOccupant "roleOccupant" --#define NID_roleOccupant 877 --#define OBJ_roleOccupant OBJ_X509,33L -- --#define SN_seeAlso "seeAlso" --#define NID_seeAlso 878 --#define OBJ_seeAlso OBJ_X509,34L -- --#define LN_userPassword "userPassword" --#define NID_userPassword 879 --#define OBJ_userPassword OBJ_X509,35L -- --#define LN_userCertificate "userCertificate" --#define NID_userCertificate 880 --#define OBJ_userCertificate OBJ_X509,36L -- --#define LN_cACertificate "cACertificate" --#define NID_cACertificate 881 --#define OBJ_cACertificate OBJ_X509,37L -- --#define LN_authorityRevocationList "authorityRevocationList" --#define NID_authorityRevocationList 882 --#define OBJ_authorityRevocationList OBJ_X509,38L -- --#define LN_certificateRevocationList "certificateRevocationList" --#define NID_certificateRevocationList 883 --#define OBJ_certificateRevocationList OBJ_X509,39L -- --#define LN_crossCertificatePair "crossCertificatePair" --#define NID_crossCertificatePair 884 --#define OBJ_crossCertificatePair OBJ_X509,40L -- --#define SN_name "name" --#define LN_name "name" --#define NID_name 173 --#define OBJ_name OBJ_X509,41L -- --#define SN_givenName "GN" --#define LN_givenName "givenName" --#define NID_givenName 99 --#define OBJ_givenName OBJ_X509,42L -- --#define SN_initials "initials" --#define LN_initials "initials" --#define NID_initials 101 --#define OBJ_initials OBJ_X509,43L -- --#define LN_generationQualifier "generationQualifier" --#define NID_generationQualifier 509 --#define OBJ_generationQualifier OBJ_X509,44L -- --#define LN_x500UniqueIdentifier "x500UniqueIdentifier" --#define NID_x500UniqueIdentifier 503 --#define OBJ_x500UniqueIdentifier OBJ_X509,45L -- --#define SN_dnQualifier "dnQualifier" --#define LN_dnQualifier "dnQualifier" --#define NID_dnQualifier 174 --#define OBJ_dnQualifier OBJ_X509,46L -- --#define LN_enhancedSearchGuide "enhancedSearchGuide" --#define NID_enhancedSearchGuide 885 --#define OBJ_enhancedSearchGuide OBJ_X509,47L -- --#define LN_protocolInformation "protocolInformation" --#define NID_protocolInformation 886 --#define OBJ_protocolInformation OBJ_X509,48L -- --#define LN_distinguishedName "distinguishedName" --#define NID_distinguishedName 887 --#define OBJ_distinguishedName OBJ_X509,49L -- --#define LN_uniqueMember "uniqueMember" --#define NID_uniqueMember 888 --#define OBJ_uniqueMember OBJ_X509,50L -- --#define LN_houseIdentifier "houseIdentifier" --#define NID_houseIdentifier 889 --#define OBJ_houseIdentifier OBJ_X509,51L -- --#define LN_supportedAlgorithms "supportedAlgorithms" --#define NID_supportedAlgorithms 890 --#define OBJ_supportedAlgorithms OBJ_X509,52L -- --#define LN_deltaRevocationList "deltaRevocationList" --#define NID_deltaRevocationList 891 --#define OBJ_deltaRevocationList OBJ_X509,53L -- --#define SN_dmdName "dmdName" --#define NID_dmdName 892 --#define OBJ_dmdName OBJ_X509,54L -- --#define LN_pseudonym "pseudonym" --#define NID_pseudonym 510 --#define OBJ_pseudonym OBJ_X509,65L -- --#define SN_role "role" --#define LN_role "role" --#define NID_role 400 --#define OBJ_role OBJ_X509,72L -- --#define LN_organizationIdentifier "organizationIdentifier" --#define NID_organizationIdentifier 1089 --#define OBJ_organizationIdentifier OBJ_X509,97L -- --#define SN_countryCode3c "c3" --#define LN_countryCode3c "countryCode3c" --#define NID_countryCode3c 1090 --#define OBJ_countryCode3c OBJ_X509,98L -- --#define SN_countryCode3n "n3" --#define LN_countryCode3n "countryCode3n" --#define NID_countryCode3n 1091 --#define OBJ_countryCode3n OBJ_X509,99L -- --#define LN_dnsName "dnsName" --#define NID_dnsName 1092 --#define OBJ_dnsName OBJ_X509,100L -- --#define SN_X500algorithms "X500algorithms" --#define LN_X500algorithms "directory services - algorithms" --#define NID_X500algorithms 378 --#define OBJ_X500algorithms OBJ_X500,8L -- --#define SN_rsa "RSA" --#define LN_rsa "rsa" --#define NID_rsa 19 --#define OBJ_rsa OBJ_X500algorithms,1L,1L -- --#define SN_mdc2WithRSA "RSA-MDC2" --#define LN_mdc2WithRSA "mdc2WithRSA" --#define NID_mdc2WithRSA 96 --#define OBJ_mdc2WithRSA OBJ_X500algorithms,3L,100L -- --#define SN_mdc2 "MDC2" --#define LN_mdc2 "mdc2" --#define NID_mdc2 95 --#define OBJ_mdc2 OBJ_X500algorithms,3L,101L -- --#define SN_id_ce "id-ce" --#define NID_id_ce 81 --#define OBJ_id_ce OBJ_X500,29L -- --#define SN_subject_directory_attributes "subjectDirectoryAttributes" --#define LN_subject_directory_attributes "X509v3 Subject Directory Attributes" --#define NID_subject_directory_attributes 769 --#define OBJ_subject_directory_attributes OBJ_id_ce,9L -- --#define SN_subject_key_identifier "subjectKeyIdentifier" --#define LN_subject_key_identifier "X509v3 Subject Key Identifier" --#define NID_subject_key_identifier 82 --#define OBJ_subject_key_identifier OBJ_id_ce,14L -- --#define SN_key_usage "keyUsage" --#define LN_key_usage "X509v3 Key Usage" --#define NID_key_usage 83 --#define OBJ_key_usage OBJ_id_ce,15L -- --#define SN_private_key_usage_period "privateKeyUsagePeriod" --#define LN_private_key_usage_period "X509v3 Private Key Usage Period" --#define NID_private_key_usage_period 84 --#define OBJ_private_key_usage_period OBJ_id_ce,16L -- --#define SN_subject_alt_name "subjectAltName" --#define LN_subject_alt_name "X509v3 Subject Alternative Name" --#define NID_subject_alt_name 85 --#define OBJ_subject_alt_name OBJ_id_ce,17L -- --#define SN_issuer_alt_name "issuerAltName" --#define LN_issuer_alt_name "X509v3 Issuer Alternative Name" --#define NID_issuer_alt_name 86 --#define OBJ_issuer_alt_name OBJ_id_ce,18L -- --#define SN_basic_constraints "basicConstraints" --#define LN_basic_constraints "X509v3 Basic Constraints" --#define NID_basic_constraints 87 --#define OBJ_basic_constraints OBJ_id_ce,19L -- --#define SN_crl_number "crlNumber" --#define LN_crl_number "X509v3 CRL Number" --#define NID_crl_number 88 --#define OBJ_crl_number OBJ_id_ce,20L -- --#define SN_crl_reason "CRLReason" --#define LN_crl_reason "X509v3 CRL Reason Code" --#define NID_crl_reason 141 --#define OBJ_crl_reason OBJ_id_ce,21L -- --#define SN_invalidity_date "invalidityDate" --#define LN_invalidity_date "Invalidity Date" --#define NID_invalidity_date 142 --#define OBJ_invalidity_date OBJ_id_ce,24L -- --#define SN_delta_crl "deltaCRL" --#define LN_delta_crl "X509v3 Delta CRL Indicator" --#define NID_delta_crl 140 --#define OBJ_delta_crl OBJ_id_ce,27L -- --#define SN_issuing_distribution_point "issuingDistributionPoint" --#define LN_issuing_distribution_point "X509v3 Issuing Distribution Point" --#define NID_issuing_distribution_point 770 --#define OBJ_issuing_distribution_point OBJ_id_ce,28L -- --#define SN_certificate_issuer "certificateIssuer" --#define LN_certificate_issuer "X509v3 Certificate Issuer" --#define NID_certificate_issuer 771 --#define OBJ_certificate_issuer OBJ_id_ce,29L -- --#define SN_name_constraints "nameConstraints" --#define LN_name_constraints "X509v3 Name Constraints" --#define NID_name_constraints 666 --#define OBJ_name_constraints OBJ_id_ce,30L -- --#define SN_crl_distribution_points "crlDistributionPoints" --#define LN_crl_distribution_points "X509v3 CRL Distribution Points" --#define NID_crl_distribution_points 103 --#define OBJ_crl_distribution_points OBJ_id_ce,31L -- --#define SN_certificate_policies "certificatePolicies" --#define LN_certificate_policies "X509v3 Certificate Policies" --#define NID_certificate_policies 89 --#define OBJ_certificate_policies OBJ_id_ce,32L -- --#define SN_any_policy "anyPolicy" --#define LN_any_policy "X509v3 Any Policy" --#define NID_any_policy 746 --#define OBJ_any_policy OBJ_certificate_policies,0L -- --#define SN_policy_mappings "policyMappings" --#define LN_policy_mappings "X509v3 Policy Mappings" --#define NID_policy_mappings 747 --#define OBJ_policy_mappings OBJ_id_ce,33L -- --#define SN_authority_key_identifier "authorityKeyIdentifier" --#define LN_authority_key_identifier "X509v3 Authority Key Identifier" --#define NID_authority_key_identifier 90 --#define OBJ_authority_key_identifier OBJ_id_ce,35L -- --#define SN_policy_constraints "policyConstraints" --#define LN_policy_constraints "X509v3 Policy Constraints" --#define NID_policy_constraints 401 --#define OBJ_policy_constraints OBJ_id_ce,36L -- --#define SN_ext_key_usage "extendedKeyUsage" --#define LN_ext_key_usage "X509v3 Extended Key Usage" --#define NID_ext_key_usage 126 --#define OBJ_ext_key_usage OBJ_id_ce,37L -- --#define SN_freshest_crl "freshestCRL" --#define LN_freshest_crl "X509v3 Freshest CRL" --#define NID_freshest_crl 857 --#define OBJ_freshest_crl OBJ_id_ce,46L -- --#define SN_inhibit_any_policy "inhibitAnyPolicy" --#define LN_inhibit_any_policy "X509v3 Inhibit Any Policy" --#define NID_inhibit_any_policy 748 --#define OBJ_inhibit_any_policy OBJ_id_ce,54L -- --#define SN_target_information "targetInformation" --#define LN_target_information "X509v3 AC Targeting" --#define NID_target_information 402 --#define OBJ_target_information OBJ_id_ce,55L -- --#define SN_no_rev_avail "noRevAvail" --#define LN_no_rev_avail "X509v3 No Revocation Available" --#define NID_no_rev_avail 403 --#define OBJ_no_rev_avail OBJ_id_ce,56L -- --#define SN_anyExtendedKeyUsage "anyExtendedKeyUsage" --#define LN_anyExtendedKeyUsage "Any Extended Key Usage" --#define NID_anyExtendedKeyUsage 910 --#define OBJ_anyExtendedKeyUsage OBJ_ext_key_usage,0L -- --#define SN_netscape "Netscape" --#define LN_netscape "Netscape Communications Corp." --#define NID_netscape 57 --#define OBJ_netscape 2L,16L,840L,1L,113730L -- --#define SN_netscape_cert_extension "nsCertExt" --#define LN_netscape_cert_extension "Netscape Certificate Extension" --#define NID_netscape_cert_extension 58 --#define OBJ_netscape_cert_extension OBJ_netscape,1L -- --#define SN_netscape_data_type "nsDataType" --#define LN_netscape_data_type "Netscape Data Type" --#define NID_netscape_data_type 59 --#define OBJ_netscape_data_type OBJ_netscape,2L -- --#define SN_netscape_cert_type "nsCertType" --#define LN_netscape_cert_type "Netscape Cert Type" --#define NID_netscape_cert_type 71 --#define OBJ_netscape_cert_type OBJ_netscape_cert_extension,1L -- --#define SN_netscape_base_url "nsBaseUrl" --#define LN_netscape_base_url "Netscape Base Url" --#define NID_netscape_base_url 72 --#define OBJ_netscape_base_url OBJ_netscape_cert_extension,2L -- --#define SN_netscape_revocation_url "nsRevocationUrl" --#define LN_netscape_revocation_url "Netscape Revocation Url" --#define NID_netscape_revocation_url 73 --#define OBJ_netscape_revocation_url OBJ_netscape_cert_extension,3L -- --#define SN_netscape_ca_revocation_url "nsCaRevocationUrl" --#define LN_netscape_ca_revocation_url "Netscape CA Revocation Url" --#define NID_netscape_ca_revocation_url 74 --#define OBJ_netscape_ca_revocation_url OBJ_netscape_cert_extension,4L -- --#define SN_netscape_renewal_url "nsRenewalUrl" --#define LN_netscape_renewal_url "Netscape Renewal Url" --#define NID_netscape_renewal_url 75 --#define OBJ_netscape_renewal_url OBJ_netscape_cert_extension,7L -- --#define SN_netscape_ca_policy_url "nsCaPolicyUrl" --#define LN_netscape_ca_policy_url "Netscape CA Policy Url" --#define NID_netscape_ca_policy_url 76 --#define OBJ_netscape_ca_policy_url OBJ_netscape_cert_extension,8L -- --#define SN_netscape_ssl_server_name "nsSslServerName" --#define LN_netscape_ssl_server_name "Netscape SSL Server Name" --#define NID_netscape_ssl_server_name 77 --#define OBJ_netscape_ssl_server_name OBJ_netscape_cert_extension,12L -- --#define SN_netscape_comment "nsComment" --#define LN_netscape_comment "Netscape Comment" --#define NID_netscape_comment 78 --#define OBJ_netscape_comment OBJ_netscape_cert_extension,13L -- --#define SN_netscape_cert_sequence "nsCertSequence" --#define LN_netscape_cert_sequence "Netscape Certificate Sequence" --#define NID_netscape_cert_sequence 79 --#define OBJ_netscape_cert_sequence OBJ_netscape_data_type,5L -- --#define SN_ns_sgc "nsSGC" --#define LN_ns_sgc "Netscape Server Gated Crypto" --#define NID_ns_sgc 139 --#define OBJ_ns_sgc OBJ_netscape,4L,1L -- --#define SN_org "ORG" --#define LN_org "org" --#define NID_org 379 --#define OBJ_org OBJ_iso,3L -- --#define SN_dod "DOD" --#define LN_dod "dod" --#define NID_dod 380 --#define OBJ_dod OBJ_org,6L -- --#define SN_iana "IANA" --#define LN_iana "iana" --#define NID_iana 381 --#define OBJ_iana OBJ_dod,1L -- --#define OBJ_internet OBJ_iana -- --#define SN_Directory "directory" --#define LN_Directory "Directory" --#define NID_Directory 382 --#define OBJ_Directory OBJ_internet,1L -- --#define SN_Management "mgmt" --#define LN_Management "Management" --#define NID_Management 383 --#define OBJ_Management OBJ_internet,2L -- --#define SN_Experimental "experimental" --#define LN_Experimental "Experimental" --#define NID_Experimental 384 --#define OBJ_Experimental OBJ_internet,3L -- --#define SN_Private "private" --#define LN_Private "Private" --#define NID_Private 385 --#define OBJ_Private OBJ_internet,4L -- --#define SN_Security "security" --#define LN_Security "Security" --#define NID_Security 386 --#define OBJ_Security OBJ_internet,5L -- --#define SN_SNMPv2 "snmpv2" --#define LN_SNMPv2 "SNMPv2" --#define NID_SNMPv2 387 --#define OBJ_SNMPv2 OBJ_internet,6L -- --#define LN_Mail "Mail" --#define NID_Mail 388 --#define OBJ_Mail OBJ_internet,7L -- --#define SN_Enterprises "enterprises" --#define LN_Enterprises "Enterprises" --#define NID_Enterprises 389 --#define OBJ_Enterprises OBJ_Private,1L -- --#define SN_dcObject "dcobject" --#define LN_dcObject "dcObject" --#define NID_dcObject 390 --#define OBJ_dcObject OBJ_Enterprises,1466L,344L -- --#define SN_mime_mhs "mime-mhs" --#define LN_mime_mhs "MIME MHS" --#define NID_mime_mhs 504 --#define OBJ_mime_mhs OBJ_Mail,1L -- --#define SN_mime_mhs_headings "mime-mhs-headings" --#define LN_mime_mhs_headings "mime-mhs-headings" --#define NID_mime_mhs_headings 505 --#define OBJ_mime_mhs_headings OBJ_mime_mhs,1L -- --#define SN_mime_mhs_bodies "mime-mhs-bodies" --#define LN_mime_mhs_bodies "mime-mhs-bodies" --#define NID_mime_mhs_bodies 506 --#define OBJ_mime_mhs_bodies OBJ_mime_mhs,2L -- --#define SN_id_hex_partial_message "id-hex-partial-message" --#define LN_id_hex_partial_message "id-hex-partial-message" --#define NID_id_hex_partial_message 507 --#define OBJ_id_hex_partial_message OBJ_mime_mhs_headings,1L -- --#define SN_id_hex_multipart_message "id-hex-multipart-message" --#define LN_id_hex_multipart_message "id-hex-multipart-message" --#define NID_id_hex_multipart_message 508 --#define OBJ_id_hex_multipart_message OBJ_mime_mhs_headings,2L -- --#define SN_zlib_compression "ZLIB" --#define LN_zlib_compression "zlib compression" --#define NID_zlib_compression 125 --#define OBJ_zlib_compression OBJ_id_smime_alg,8L -- --#define OBJ_csor 2L,16L,840L,1L,101L,3L -- --#define OBJ_nistAlgorithms OBJ_csor,4L -- --#define OBJ_aes OBJ_nistAlgorithms,1L -- --#define SN_aes_128_ecb "AES-128-ECB" --#define LN_aes_128_ecb "aes-128-ecb" --#define NID_aes_128_ecb 418 --#define OBJ_aes_128_ecb OBJ_aes,1L -- --#define SN_aes_128_cbc "AES-128-CBC" --#define LN_aes_128_cbc "aes-128-cbc" --#define NID_aes_128_cbc 419 --#define OBJ_aes_128_cbc OBJ_aes,2L -- --#define SN_aes_128_ofb128 "AES-128-OFB" --#define LN_aes_128_ofb128 "aes-128-ofb" --#define NID_aes_128_ofb128 420 --#define OBJ_aes_128_ofb128 OBJ_aes,3L -- --#define SN_aes_128_cfb128 "AES-128-CFB" --#define LN_aes_128_cfb128 "aes-128-cfb" --#define NID_aes_128_cfb128 421 --#define OBJ_aes_128_cfb128 OBJ_aes,4L -- --#define SN_id_aes128_wrap "id-aes128-wrap" --#define NID_id_aes128_wrap 788 --#define OBJ_id_aes128_wrap OBJ_aes,5L -- --#define SN_aes_128_gcm "id-aes128-GCM" --#define LN_aes_128_gcm "aes-128-gcm" --#define NID_aes_128_gcm 895 --#define OBJ_aes_128_gcm OBJ_aes,6L -- --#define SN_aes_128_ccm "id-aes128-CCM" --#define LN_aes_128_ccm "aes-128-ccm" --#define NID_aes_128_ccm 896 --#define OBJ_aes_128_ccm OBJ_aes,7L -- --#define SN_id_aes128_wrap_pad "id-aes128-wrap-pad" --#define NID_id_aes128_wrap_pad 897 --#define OBJ_id_aes128_wrap_pad OBJ_aes,8L -- --#define SN_aes_192_ecb "AES-192-ECB" --#define LN_aes_192_ecb "aes-192-ecb" --#define NID_aes_192_ecb 422 --#define OBJ_aes_192_ecb OBJ_aes,21L -- --#define SN_aes_192_cbc "AES-192-CBC" --#define LN_aes_192_cbc "aes-192-cbc" --#define NID_aes_192_cbc 423 --#define OBJ_aes_192_cbc OBJ_aes,22L -- --#define SN_aes_192_ofb128 "AES-192-OFB" --#define LN_aes_192_ofb128 "aes-192-ofb" --#define NID_aes_192_ofb128 424 --#define OBJ_aes_192_ofb128 OBJ_aes,23L -- --#define SN_aes_192_cfb128 "AES-192-CFB" --#define LN_aes_192_cfb128 "aes-192-cfb" --#define NID_aes_192_cfb128 425 --#define OBJ_aes_192_cfb128 OBJ_aes,24L -- --#define SN_id_aes192_wrap "id-aes192-wrap" --#define NID_id_aes192_wrap 789 --#define OBJ_id_aes192_wrap OBJ_aes,25L -- --#define SN_aes_192_gcm "id-aes192-GCM" --#define LN_aes_192_gcm "aes-192-gcm" --#define NID_aes_192_gcm 898 --#define OBJ_aes_192_gcm OBJ_aes,26L -- --#define SN_aes_192_ccm "id-aes192-CCM" --#define LN_aes_192_ccm "aes-192-ccm" --#define NID_aes_192_ccm 899 --#define OBJ_aes_192_ccm OBJ_aes,27L -- --#define SN_id_aes192_wrap_pad "id-aes192-wrap-pad" --#define NID_id_aes192_wrap_pad 900 --#define OBJ_id_aes192_wrap_pad OBJ_aes,28L -- --#define SN_aes_256_ecb "AES-256-ECB" --#define LN_aes_256_ecb "aes-256-ecb" --#define NID_aes_256_ecb 426 --#define OBJ_aes_256_ecb OBJ_aes,41L -- --#define SN_aes_256_cbc "AES-256-CBC" --#define LN_aes_256_cbc "aes-256-cbc" --#define NID_aes_256_cbc 427 --#define OBJ_aes_256_cbc OBJ_aes,42L -- --#define SN_aes_256_ofb128 "AES-256-OFB" --#define LN_aes_256_ofb128 "aes-256-ofb" --#define NID_aes_256_ofb128 428 --#define OBJ_aes_256_ofb128 OBJ_aes,43L -- --#define SN_aes_256_cfb128 "AES-256-CFB" --#define LN_aes_256_cfb128 "aes-256-cfb" --#define NID_aes_256_cfb128 429 --#define OBJ_aes_256_cfb128 OBJ_aes,44L -- --#define SN_id_aes256_wrap "id-aes256-wrap" --#define NID_id_aes256_wrap 790 --#define OBJ_id_aes256_wrap OBJ_aes,45L -- --#define SN_aes_256_gcm "id-aes256-GCM" --#define LN_aes_256_gcm "aes-256-gcm" --#define NID_aes_256_gcm 901 --#define OBJ_aes_256_gcm OBJ_aes,46L -- --#define SN_aes_256_ccm "id-aes256-CCM" --#define LN_aes_256_ccm "aes-256-ccm" --#define NID_aes_256_ccm 902 --#define OBJ_aes_256_ccm OBJ_aes,47L -- --#define SN_id_aes256_wrap_pad "id-aes256-wrap-pad" --#define NID_id_aes256_wrap_pad 903 --#define OBJ_id_aes256_wrap_pad OBJ_aes,48L -- --#define SN_aes_128_xts "AES-128-XTS" --#define LN_aes_128_xts "aes-128-xts" --#define NID_aes_128_xts 913 --#define OBJ_aes_128_xts OBJ_ieee_siswg,0L,1L,1L -- --#define SN_aes_256_xts "AES-256-XTS" --#define LN_aes_256_xts "aes-256-xts" --#define NID_aes_256_xts 914 --#define OBJ_aes_256_xts OBJ_ieee_siswg,0L,1L,2L -- --#define SN_aes_128_cfb1 "AES-128-CFB1" --#define LN_aes_128_cfb1 "aes-128-cfb1" --#define NID_aes_128_cfb1 650 -- --#define SN_aes_192_cfb1 "AES-192-CFB1" --#define LN_aes_192_cfb1 "aes-192-cfb1" --#define NID_aes_192_cfb1 651 -- --#define SN_aes_256_cfb1 "AES-256-CFB1" --#define LN_aes_256_cfb1 "aes-256-cfb1" --#define NID_aes_256_cfb1 652 -- --#define SN_aes_128_cfb8 "AES-128-CFB8" --#define LN_aes_128_cfb8 "aes-128-cfb8" --#define NID_aes_128_cfb8 653 -- --#define SN_aes_192_cfb8 "AES-192-CFB8" --#define LN_aes_192_cfb8 "aes-192-cfb8" --#define NID_aes_192_cfb8 654 -- --#define SN_aes_256_cfb8 "AES-256-CFB8" --#define LN_aes_256_cfb8 "aes-256-cfb8" --#define NID_aes_256_cfb8 655 -- --#define SN_aes_128_ctr "AES-128-CTR" --#define LN_aes_128_ctr "aes-128-ctr" --#define NID_aes_128_ctr 904 -- --#define SN_aes_192_ctr "AES-192-CTR" --#define LN_aes_192_ctr "aes-192-ctr" --#define NID_aes_192_ctr 905 -- --#define SN_aes_256_ctr "AES-256-CTR" --#define LN_aes_256_ctr "aes-256-ctr" --#define NID_aes_256_ctr 906 -- --#define SN_aes_128_ocb "AES-128-OCB" --#define LN_aes_128_ocb "aes-128-ocb" --#define NID_aes_128_ocb 958 -- --#define SN_aes_192_ocb "AES-192-OCB" --#define LN_aes_192_ocb "aes-192-ocb" --#define NID_aes_192_ocb 959 -- --#define SN_aes_256_ocb "AES-256-OCB" --#define LN_aes_256_ocb "aes-256-ocb" --#define NID_aes_256_ocb 960 -- --#define SN_des_cfb1 "DES-CFB1" --#define LN_des_cfb1 "des-cfb1" --#define NID_des_cfb1 656 -- --#define SN_des_cfb8 "DES-CFB8" --#define LN_des_cfb8 "des-cfb8" --#define NID_des_cfb8 657 -- --#define SN_des_ede3_cfb1 "DES-EDE3-CFB1" --#define LN_des_ede3_cfb1 "des-ede3-cfb1" --#define NID_des_ede3_cfb1 658 -- --#define SN_des_ede3_cfb8 "DES-EDE3-CFB8" --#define LN_des_ede3_cfb8 "des-ede3-cfb8" --#define NID_des_ede3_cfb8 659 -- --#define OBJ_nist_hashalgs OBJ_nistAlgorithms,2L -- --#define SN_sha256 "SHA256" --#define LN_sha256 "sha256" --#define NID_sha256 672 --#define OBJ_sha256 OBJ_nist_hashalgs,1L -- --#define SN_sha384 "SHA384" --#define LN_sha384 "sha384" --#define NID_sha384 673 --#define OBJ_sha384 OBJ_nist_hashalgs,2L -- --#define SN_sha512 "SHA512" --#define LN_sha512 "sha512" --#define NID_sha512 674 --#define OBJ_sha512 OBJ_nist_hashalgs,3L -- --#define SN_sha224 "SHA224" --#define LN_sha224 "sha224" --#define NID_sha224 675 --#define OBJ_sha224 OBJ_nist_hashalgs,4L -- --#define SN_sha512_224 "SHA512-224" --#define LN_sha512_224 "sha512-224" --#define NID_sha512_224 1094 --#define OBJ_sha512_224 OBJ_nist_hashalgs,5L -- --#define SN_sha512_256 "SHA512-256" --#define LN_sha512_256 "sha512-256" --#define NID_sha512_256 1095 --#define OBJ_sha512_256 OBJ_nist_hashalgs,6L -- --#define SN_sha3_224 "SHA3-224" --#define LN_sha3_224 "sha3-224" --#define NID_sha3_224 1096 --#define OBJ_sha3_224 OBJ_nist_hashalgs,7L -- --#define SN_sha3_256 "SHA3-256" --#define LN_sha3_256 "sha3-256" --#define NID_sha3_256 1097 --#define OBJ_sha3_256 OBJ_nist_hashalgs,8L -- --#define SN_sha3_384 "SHA3-384" --#define LN_sha3_384 "sha3-384" --#define NID_sha3_384 1098 --#define OBJ_sha3_384 OBJ_nist_hashalgs,9L -- --#define SN_sha3_512 "SHA3-512" --#define LN_sha3_512 "sha3-512" --#define NID_sha3_512 1099 --#define OBJ_sha3_512 OBJ_nist_hashalgs,10L -- --#define SN_shake128 "SHAKE128" --#define LN_shake128 "shake128" --#define NID_shake128 1100 --#define OBJ_shake128 OBJ_nist_hashalgs,11L -- --#define SN_shake256 "SHAKE256" --#define LN_shake256 "shake256" --#define NID_shake256 1101 --#define OBJ_shake256 OBJ_nist_hashalgs,12L -- --#define SN_hmac_sha3_224 "id-hmacWithSHA3-224" --#define LN_hmac_sha3_224 "hmac-sha3-224" --#define NID_hmac_sha3_224 1102 --#define OBJ_hmac_sha3_224 OBJ_nist_hashalgs,13L -- --#define SN_hmac_sha3_256 "id-hmacWithSHA3-256" --#define LN_hmac_sha3_256 "hmac-sha3-256" --#define NID_hmac_sha3_256 1103 --#define OBJ_hmac_sha3_256 OBJ_nist_hashalgs,14L -- --#define SN_hmac_sha3_384 "id-hmacWithSHA3-384" --#define LN_hmac_sha3_384 "hmac-sha3-384" --#define NID_hmac_sha3_384 1104 --#define OBJ_hmac_sha3_384 OBJ_nist_hashalgs,15L -- --#define SN_hmac_sha3_512 "id-hmacWithSHA3-512" --#define LN_hmac_sha3_512 "hmac-sha3-512" --#define NID_hmac_sha3_512 1105 --#define OBJ_hmac_sha3_512 OBJ_nist_hashalgs,16L -- --#define OBJ_dsa_with_sha2 OBJ_nistAlgorithms,3L -- --#define SN_dsa_with_SHA224 "dsa_with_SHA224" --#define NID_dsa_with_SHA224 802 --#define OBJ_dsa_with_SHA224 OBJ_dsa_with_sha2,1L -- --#define SN_dsa_with_SHA256 "dsa_with_SHA256" --#define NID_dsa_with_SHA256 803 --#define OBJ_dsa_with_SHA256 OBJ_dsa_with_sha2,2L -- --#define OBJ_sigAlgs OBJ_nistAlgorithms,3L -- --#define SN_dsa_with_SHA384 "id-dsa-with-sha384" --#define LN_dsa_with_SHA384 "dsa_with_SHA384" --#define NID_dsa_with_SHA384 1106 --#define OBJ_dsa_with_SHA384 OBJ_sigAlgs,3L -- --#define SN_dsa_with_SHA512 "id-dsa-with-sha512" --#define LN_dsa_with_SHA512 "dsa_with_SHA512" --#define NID_dsa_with_SHA512 1107 --#define OBJ_dsa_with_SHA512 OBJ_sigAlgs,4L -- --#define SN_dsa_with_SHA3_224 "id-dsa-with-sha3-224" --#define LN_dsa_with_SHA3_224 "dsa_with_SHA3-224" --#define NID_dsa_with_SHA3_224 1108 --#define OBJ_dsa_with_SHA3_224 OBJ_sigAlgs,5L -- --#define SN_dsa_with_SHA3_256 "id-dsa-with-sha3-256" --#define LN_dsa_with_SHA3_256 "dsa_with_SHA3-256" --#define NID_dsa_with_SHA3_256 1109 --#define OBJ_dsa_with_SHA3_256 OBJ_sigAlgs,6L -- --#define SN_dsa_with_SHA3_384 "id-dsa-with-sha3-384" --#define LN_dsa_with_SHA3_384 "dsa_with_SHA3-384" --#define NID_dsa_with_SHA3_384 1110 --#define OBJ_dsa_with_SHA3_384 OBJ_sigAlgs,7L -- --#define SN_dsa_with_SHA3_512 "id-dsa-with-sha3-512" --#define LN_dsa_with_SHA3_512 "dsa_with_SHA3-512" --#define NID_dsa_with_SHA3_512 1111 --#define OBJ_dsa_with_SHA3_512 OBJ_sigAlgs,8L -- --#define SN_ecdsa_with_SHA3_224 "id-ecdsa-with-sha3-224" --#define LN_ecdsa_with_SHA3_224 "ecdsa_with_SHA3-224" --#define NID_ecdsa_with_SHA3_224 1112 --#define OBJ_ecdsa_with_SHA3_224 OBJ_sigAlgs,9L -- --#define SN_ecdsa_with_SHA3_256 "id-ecdsa-with-sha3-256" --#define LN_ecdsa_with_SHA3_256 "ecdsa_with_SHA3-256" --#define NID_ecdsa_with_SHA3_256 1113 --#define OBJ_ecdsa_with_SHA3_256 OBJ_sigAlgs,10L -- --#define SN_ecdsa_with_SHA3_384 "id-ecdsa-with-sha3-384" --#define LN_ecdsa_with_SHA3_384 "ecdsa_with_SHA3-384" --#define NID_ecdsa_with_SHA3_384 1114 --#define OBJ_ecdsa_with_SHA3_384 OBJ_sigAlgs,11L -- --#define SN_ecdsa_with_SHA3_512 "id-ecdsa-with-sha3-512" --#define LN_ecdsa_with_SHA3_512 "ecdsa_with_SHA3-512" --#define NID_ecdsa_with_SHA3_512 1115 --#define OBJ_ecdsa_with_SHA3_512 OBJ_sigAlgs,12L -- --#define SN_RSA_SHA3_224 "id-rsassa-pkcs1-v1_5-with-sha3-224" --#define LN_RSA_SHA3_224 "RSA-SHA3-224" --#define NID_RSA_SHA3_224 1116 --#define OBJ_RSA_SHA3_224 OBJ_sigAlgs,13L -- --#define SN_RSA_SHA3_256 "id-rsassa-pkcs1-v1_5-with-sha3-256" --#define LN_RSA_SHA3_256 "RSA-SHA3-256" --#define NID_RSA_SHA3_256 1117 --#define OBJ_RSA_SHA3_256 OBJ_sigAlgs,14L -- --#define SN_RSA_SHA3_384 "id-rsassa-pkcs1-v1_5-with-sha3-384" --#define LN_RSA_SHA3_384 "RSA-SHA3-384" --#define NID_RSA_SHA3_384 1118 --#define OBJ_RSA_SHA3_384 OBJ_sigAlgs,15L -- --#define SN_RSA_SHA3_512 "id-rsassa-pkcs1-v1_5-with-sha3-512" --#define LN_RSA_SHA3_512 "RSA-SHA3-512" --#define NID_RSA_SHA3_512 1119 --#define OBJ_RSA_SHA3_512 OBJ_sigAlgs,16L -- --#define SN_hold_instruction_code "holdInstructionCode" --#define LN_hold_instruction_code "Hold Instruction Code" --#define NID_hold_instruction_code 430 --#define OBJ_hold_instruction_code OBJ_id_ce,23L -- --#define OBJ_holdInstruction OBJ_X9_57,2L -- --#define SN_hold_instruction_none "holdInstructionNone" --#define LN_hold_instruction_none "Hold Instruction None" --#define NID_hold_instruction_none 431 --#define OBJ_hold_instruction_none OBJ_holdInstruction,1L -- --#define SN_hold_instruction_call_issuer "holdInstructionCallIssuer" --#define LN_hold_instruction_call_issuer "Hold Instruction Call Issuer" --#define NID_hold_instruction_call_issuer 432 --#define OBJ_hold_instruction_call_issuer OBJ_holdInstruction,2L -- --#define SN_hold_instruction_reject "holdInstructionReject" --#define LN_hold_instruction_reject "Hold Instruction Reject" --#define NID_hold_instruction_reject 433 --#define OBJ_hold_instruction_reject OBJ_holdInstruction,3L -- --#define SN_data "data" --#define NID_data 434 --#define OBJ_data OBJ_itu_t,9L -- --#define SN_pss "pss" --#define NID_pss 435 --#define OBJ_pss OBJ_data,2342L -- --#define SN_ucl "ucl" --#define NID_ucl 436 --#define OBJ_ucl OBJ_pss,19200300L -- --#define SN_pilot "pilot" --#define NID_pilot 437 --#define OBJ_pilot OBJ_ucl,100L -- --#define LN_pilotAttributeType "pilotAttributeType" --#define NID_pilotAttributeType 438 --#define OBJ_pilotAttributeType OBJ_pilot,1L -- --#define LN_pilotAttributeSyntax "pilotAttributeSyntax" --#define NID_pilotAttributeSyntax 439 --#define OBJ_pilotAttributeSyntax OBJ_pilot,3L -- --#define LN_pilotObjectClass "pilotObjectClass" --#define NID_pilotObjectClass 440 --#define OBJ_pilotObjectClass OBJ_pilot,4L -- --#define LN_pilotGroups "pilotGroups" --#define NID_pilotGroups 441 --#define OBJ_pilotGroups OBJ_pilot,10L -- --#define LN_iA5StringSyntax "iA5StringSyntax" --#define NID_iA5StringSyntax 442 --#define OBJ_iA5StringSyntax OBJ_pilotAttributeSyntax,4L -- --#define LN_caseIgnoreIA5StringSyntax "caseIgnoreIA5StringSyntax" --#define NID_caseIgnoreIA5StringSyntax 443 --#define OBJ_caseIgnoreIA5StringSyntax OBJ_pilotAttributeSyntax,5L -- --#define LN_pilotObject "pilotObject" --#define NID_pilotObject 444 --#define OBJ_pilotObject OBJ_pilotObjectClass,3L -- --#define LN_pilotPerson "pilotPerson" --#define NID_pilotPerson 445 --#define OBJ_pilotPerson OBJ_pilotObjectClass,4L -- --#define SN_account "account" --#define NID_account 446 --#define OBJ_account OBJ_pilotObjectClass,5L -- --#define SN_document "document" --#define NID_document 447 --#define OBJ_document OBJ_pilotObjectClass,6L -- --#define SN_room "room" --#define NID_room 448 --#define OBJ_room OBJ_pilotObjectClass,7L -- --#define LN_documentSeries "documentSeries" --#define NID_documentSeries 449 --#define OBJ_documentSeries OBJ_pilotObjectClass,9L -- --#define SN_Domain "domain" --#define LN_Domain "Domain" --#define NID_Domain 392 --#define OBJ_Domain OBJ_pilotObjectClass,13L -- --#define LN_rFC822localPart "rFC822localPart" --#define NID_rFC822localPart 450 --#define OBJ_rFC822localPart OBJ_pilotObjectClass,14L -- --#define LN_dNSDomain "dNSDomain" --#define NID_dNSDomain 451 --#define OBJ_dNSDomain OBJ_pilotObjectClass,15L -- --#define LN_domainRelatedObject "domainRelatedObject" --#define NID_domainRelatedObject 452 --#define OBJ_domainRelatedObject OBJ_pilotObjectClass,17L -- --#define LN_friendlyCountry "friendlyCountry" --#define NID_friendlyCountry 453 --#define OBJ_friendlyCountry OBJ_pilotObjectClass,18L -- --#define LN_simpleSecurityObject "simpleSecurityObject" --#define NID_simpleSecurityObject 454 --#define OBJ_simpleSecurityObject OBJ_pilotObjectClass,19L -- --#define LN_pilotOrganization "pilotOrganization" --#define NID_pilotOrganization 455 --#define OBJ_pilotOrganization OBJ_pilotObjectClass,20L -- --#define LN_pilotDSA "pilotDSA" --#define NID_pilotDSA 456 --#define OBJ_pilotDSA OBJ_pilotObjectClass,21L -- --#define LN_qualityLabelledData "qualityLabelledData" --#define NID_qualityLabelledData 457 --#define OBJ_qualityLabelledData OBJ_pilotObjectClass,22L -- --#define SN_userId "UID" --#define LN_userId "userId" --#define NID_userId 458 --#define OBJ_userId OBJ_pilotAttributeType,1L -- --#define LN_textEncodedORAddress "textEncodedORAddress" --#define NID_textEncodedORAddress 459 --#define OBJ_textEncodedORAddress OBJ_pilotAttributeType,2L -- --#define SN_rfc822Mailbox "mail" --#define LN_rfc822Mailbox "rfc822Mailbox" --#define NID_rfc822Mailbox 460 --#define OBJ_rfc822Mailbox OBJ_pilotAttributeType,3L -- --#define SN_info "info" --#define NID_info 461 --#define OBJ_info OBJ_pilotAttributeType,4L -- --#define LN_favouriteDrink "favouriteDrink" --#define NID_favouriteDrink 462 --#define OBJ_favouriteDrink OBJ_pilotAttributeType,5L -- --#define LN_roomNumber "roomNumber" --#define NID_roomNumber 463 --#define OBJ_roomNumber OBJ_pilotAttributeType,6L -- --#define SN_photo "photo" --#define NID_photo 464 --#define OBJ_photo OBJ_pilotAttributeType,7L -- --#define LN_userClass "userClass" --#define NID_userClass 465 --#define OBJ_userClass OBJ_pilotAttributeType,8L -- --#define SN_host "host" --#define NID_host 466 --#define OBJ_host OBJ_pilotAttributeType,9L -- --#define SN_manager "manager" --#define NID_manager 467 --#define OBJ_manager OBJ_pilotAttributeType,10L -- --#define LN_documentIdentifier "documentIdentifier" --#define NID_documentIdentifier 468 --#define OBJ_documentIdentifier OBJ_pilotAttributeType,11L -- --#define LN_documentTitle "documentTitle" --#define NID_documentTitle 469 --#define OBJ_documentTitle OBJ_pilotAttributeType,12L -- --#define LN_documentVersion "documentVersion" --#define NID_documentVersion 470 --#define OBJ_documentVersion OBJ_pilotAttributeType,13L -- --#define LN_documentAuthor "documentAuthor" --#define NID_documentAuthor 471 --#define OBJ_documentAuthor OBJ_pilotAttributeType,14L -- --#define LN_documentLocation "documentLocation" --#define NID_documentLocation 472 --#define OBJ_documentLocation OBJ_pilotAttributeType,15L -- --#define LN_homeTelephoneNumber "homeTelephoneNumber" --#define NID_homeTelephoneNumber 473 --#define OBJ_homeTelephoneNumber OBJ_pilotAttributeType,20L -- --#define SN_secretary "secretary" --#define NID_secretary 474 --#define OBJ_secretary OBJ_pilotAttributeType,21L -- --#define LN_otherMailbox "otherMailbox" --#define NID_otherMailbox 475 --#define OBJ_otherMailbox OBJ_pilotAttributeType,22L -- --#define LN_lastModifiedTime "lastModifiedTime" --#define NID_lastModifiedTime 476 --#define OBJ_lastModifiedTime OBJ_pilotAttributeType,23L -- --#define LN_lastModifiedBy "lastModifiedBy" --#define NID_lastModifiedBy 477 --#define OBJ_lastModifiedBy OBJ_pilotAttributeType,24L -- --#define SN_domainComponent "DC" --#define LN_domainComponent "domainComponent" --#define NID_domainComponent 391 --#define OBJ_domainComponent OBJ_pilotAttributeType,25L -- --#define LN_aRecord "aRecord" --#define NID_aRecord 478 --#define OBJ_aRecord OBJ_pilotAttributeType,26L -- --#define LN_pilotAttributeType27 "pilotAttributeType27" --#define NID_pilotAttributeType27 479 --#define OBJ_pilotAttributeType27 OBJ_pilotAttributeType,27L -- --#define LN_mXRecord "mXRecord" --#define NID_mXRecord 480 --#define OBJ_mXRecord OBJ_pilotAttributeType,28L -- --#define LN_nSRecord "nSRecord" --#define NID_nSRecord 481 --#define OBJ_nSRecord OBJ_pilotAttributeType,29L -- --#define LN_sOARecord "sOARecord" --#define NID_sOARecord 482 --#define OBJ_sOARecord OBJ_pilotAttributeType,30L -- --#define LN_cNAMERecord "cNAMERecord" --#define NID_cNAMERecord 483 --#define OBJ_cNAMERecord OBJ_pilotAttributeType,31L -- --#define LN_associatedDomain "associatedDomain" --#define NID_associatedDomain 484 --#define OBJ_associatedDomain OBJ_pilotAttributeType,37L -- --#define LN_associatedName "associatedName" --#define NID_associatedName 485 --#define OBJ_associatedName OBJ_pilotAttributeType,38L -- --#define LN_homePostalAddress "homePostalAddress" --#define NID_homePostalAddress 486 --#define OBJ_homePostalAddress OBJ_pilotAttributeType,39L -- --#define LN_personalTitle "personalTitle" --#define NID_personalTitle 487 --#define OBJ_personalTitle OBJ_pilotAttributeType,40L -- --#define LN_mobileTelephoneNumber "mobileTelephoneNumber" --#define NID_mobileTelephoneNumber 488 --#define OBJ_mobileTelephoneNumber OBJ_pilotAttributeType,41L -- --#define LN_pagerTelephoneNumber "pagerTelephoneNumber" --#define NID_pagerTelephoneNumber 489 --#define OBJ_pagerTelephoneNumber OBJ_pilotAttributeType,42L -- --#define LN_friendlyCountryName "friendlyCountryName" --#define NID_friendlyCountryName 490 --#define OBJ_friendlyCountryName OBJ_pilotAttributeType,43L -- --#define SN_uniqueIdentifier "uid" --#define LN_uniqueIdentifier "uniqueIdentifier" --#define NID_uniqueIdentifier 102 --#define OBJ_uniqueIdentifier OBJ_pilotAttributeType,44L -- --#define LN_organizationalStatus "organizationalStatus" --#define NID_organizationalStatus 491 --#define OBJ_organizationalStatus OBJ_pilotAttributeType,45L -- --#define LN_janetMailbox "janetMailbox" --#define NID_janetMailbox 492 --#define OBJ_janetMailbox OBJ_pilotAttributeType,46L -- --#define LN_mailPreferenceOption "mailPreferenceOption" --#define NID_mailPreferenceOption 493 --#define OBJ_mailPreferenceOption OBJ_pilotAttributeType,47L -- --#define LN_buildingName "buildingName" --#define NID_buildingName 494 --#define OBJ_buildingName OBJ_pilotAttributeType,48L -- --#define LN_dSAQuality "dSAQuality" --#define NID_dSAQuality 495 --#define OBJ_dSAQuality OBJ_pilotAttributeType,49L -- --#define LN_singleLevelQuality "singleLevelQuality" --#define NID_singleLevelQuality 496 --#define OBJ_singleLevelQuality OBJ_pilotAttributeType,50L -- --#define LN_subtreeMinimumQuality "subtreeMinimumQuality" --#define NID_subtreeMinimumQuality 497 --#define OBJ_subtreeMinimumQuality OBJ_pilotAttributeType,51L -- --#define LN_subtreeMaximumQuality "subtreeMaximumQuality" --#define NID_subtreeMaximumQuality 498 --#define OBJ_subtreeMaximumQuality OBJ_pilotAttributeType,52L -- --#define LN_personalSignature "personalSignature" --#define NID_personalSignature 499 --#define OBJ_personalSignature OBJ_pilotAttributeType,53L -- --#define LN_dITRedirect "dITRedirect" --#define NID_dITRedirect 500 --#define OBJ_dITRedirect OBJ_pilotAttributeType,54L -- --#define SN_audio "audio" --#define NID_audio 501 --#define OBJ_audio OBJ_pilotAttributeType,55L -- --#define LN_documentPublisher "documentPublisher" --#define NID_documentPublisher 502 --#define OBJ_documentPublisher OBJ_pilotAttributeType,56L -- --#define SN_id_set "id-set" --#define LN_id_set "Secure Electronic Transactions" --#define NID_id_set 512 --#define OBJ_id_set OBJ_international_organizations,42L -- --#define SN_set_ctype "set-ctype" --#define LN_set_ctype "content types" --#define NID_set_ctype 513 --#define OBJ_set_ctype OBJ_id_set,0L -- --#define SN_set_msgExt "set-msgExt" --#define LN_set_msgExt "message extensions" --#define NID_set_msgExt 514 --#define OBJ_set_msgExt OBJ_id_set,1L -- --#define SN_set_attr "set-attr" --#define NID_set_attr 515 --#define OBJ_set_attr OBJ_id_set,3L -- --#define SN_set_policy "set-policy" --#define NID_set_policy 516 --#define OBJ_set_policy OBJ_id_set,5L -- --#define SN_set_certExt "set-certExt" --#define LN_set_certExt "certificate extensions" --#define NID_set_certExt 517 --#define OBJ_set_certExt OBJ_id_set,7L -- --#define SN_set_brand "set-brand" --#define NID_set_brand 518 --#define OBJ_set_brand OBJ_id_set,8L -- --#define SN_setct_PANData "setct-PANData" --#define NID_setct_PANData 519 --#define OBJ_setct_PANData OBJ_set_ctype,0L -- --#define SN_setct_PANToken "setct-PANToken" --#define NID_setct_PANToken 520 --#define OBJ_setct_PANToken OBJ_set_ctype,1L -- --#define SN_setct_PANOnly "setct-PANOnly" --#define NID_setct_PANOnly 521 --#define OBJ_setct_PANOnly OBJ_set_ctype,2L -- --#define SN_setct_OIData "setct-OIData" --#define NID_setct_OIData 522 --#define OBJ_setct_OIData OBJ_set_ctype,3L -- --#define SN_setct_PI "setct-PI" --#define NID_setct_PI 523 --#define OBJ_setct_PI OBJ_set_ctype,4L -- --#define SN_setct_PIData "setct-PIData" --#define NID_setct_PIData 524 --#define OBJ_setct_PIData OBJ_set_ctype,5L -- --#define SN_setct_PIDataUnsigned "setct-PIDataUnsigned" --#define NID_setct_PIDataUnsigned 525 --#define OBJ_setct_PIDataUnsigned OBJ_set_ctype,6L -- --#define SN_setct_HODInput "setct-HODInput" --#define NID_setct_HODInput 526 --#define OBJ_setct_HODInput OBJ_set_ctype,7L -- --#define SN_setct_AuthResBaggage "setct-AuthResBaggage" --#define NID_setct_AuthResBaggage 527 --#define OBJ_setct_AuthResBaggage OBJ_set_ctype,8L -- --#define SN_setct_AuthRevReqBaggage "setct-AuthRevReqBaggage" --#define NID_setct_AuthRevReqBaggage 528 --#define OBJ_setct_AuthRevReqBaggage OBJ_set_ctype,9L -- --#define SN_setct_AuthRevResBaggage "setct-AuthRevResBaggage" --#define NID_setct_AuthRevResBaggage 529 --#define OBJ_setct_AuthRevResBaggage OBJ_set_ctype,10L -- --#define SN_setct_CapTokenSeq "setct-CapTokenSeq" --#define NID_setct_CapTokenSeq 530 --#define OBJ_setct_CapTokenSeq OBJ_set_ctype,11L -- --#define SN_setct_PInitResData "setct-PInitResData" --#define NID_setct_PInitResData 531 --#define OBJ_setct_PInitResData OBJ_set_ctype,12L -- --#define SN_setct_PI_TBS "setct-PI-TBS" --#define NID_setct_PI_TBS 532 --#define OBJ_setct_PI_TBS OBJ_set_ctype,13L -- --#define SN_setct_PResData "setct-PResData" --#define NID_setct_PResData 533 --#define OBJ_setct_PResData OBJ_set_ctype,14L -- --#define SN_setct_AuthReqTBS "setct-AuthReqTBS" --#define NID_setct_AuthReqTBS 534 --#define OBJ_setct_AuthReqTBS OBJ_set_ctype,16L -- --#define SN_setct_AuthResTBS "setct-AuthResTBS" --#define NID_setct_AuthResTBS 535 --#define OBJ_setct_AuthResTBS OBJ_set_ctype,17L -- --#define SN_setct_AuthResTBSX "setct-AuthResTBSX" --#define NID_setct_AuthResTBSX 536 --#define OBJ_setct_AuthResTBSX OBJ_set_ctype,18L -- --#define SN_setct_AuthTokenTBS "setct-AuthTokenTBS" --#define NID_setct_AuthTokenTBS 537 --#define OBJ_setct_AuthTokenTBS OBJ_set_ctype,19L -- --#define SN_setct_CapTokenData "setct-CapTokenData" --#define NID_setct_CapTokenData 538 --#define OBJ_setct_CapTokenData OBJ_set_ctype,20L -- --#define SN_setct_CapTokenTBS "setct-CapTokenTBS" --#define NID_setct_CapTokenTBS 539 --#define OBJ_setct_CapTokenTBS OBJ_set_ctype,21L -- --#define SN_setct_AcqCardCodeMsg "setct-AcqCardCodeMsg" --#define NID_setct_AcqCardCodeMsg 540 --#define OBJ_setct_AcqCardCodeMsg OBJ_set_ctype,22L -- --#define SN_setct_AuthRevReqTBS "setct-AuthRevReqTBS" --#define NID_setct_AuthRevReqTBS 541 --#define OBJ_setct_AuthRevReqTBS OBJ_set_ctype,23L -- --#define SN_setct_AuthRevResData "setct-AuthRevResData" --#define NID_setct_AuthRevResData 542 --#define OBJ_setct_AuthRevResData OBJ_set_ctype,24L -- --#define SN_setct_AuthRevResTBS "setct-AuthRevResTBS" --#define NID_setct_AuthRevResTBS 543 --#define OBJ_setct_AuthRevResTBS OBJ_set_ctype,25L -- --#define SN_setct_CapReqTBS "setct-CapReqTBS" --#define NID_setct_CapReqTBS 544 --#define OBJ_setct_CapReqTBS OBJ_set_ctype,26L -- --#define SN_setct_CapReqTBSX "setct-CapReqTBSX" --#define NID_setct_CapReqTBSX 545 --#define OBJ_setct_CapReqTBSX OBJ_set_ctype,27L -- --#define SN_setct_CapResData "setct-CapResData" --#define NID_setct_CapResData 546 --#define OBJ_setct_CapResData OBJ_set_ctype,28L -- --#define SN_setct_CapRevReqTBS "setct-CapRevReqTBS" --#define NID_setct_CapRevReqTBS 547 --#define OBJ_setct_CapRevReqTBS OBJ_set_ctype,29L -- --#define SN_setct_CapRevReqTBSX "setct-CapRevReqTBSX" --#define NID_setct_CapRevReqTBSX 548 --#define OBJ_setct_CapRevReqTBSX OBJ_set_ctype,30L -- --#define SN_setct_CapRevResData "setct-CapRevResData" --#define NID_setct_CapRevResData 549 --#define OBJ_setct_CapRevResData OBJ_set_ctype,31L -- --#define SN_setct_CredReqTBS "setct-CredReqTBS" --#define NID_setct_CredReqTBS 550 --#define OBJ_setct_CredReqTBS OBJ_set_ctype,32L -- --#define SN_setct_CredReqTBSX "setct-CredReqTBSX" --#define NID_setct_CredReqTBSX 551 --#define OBJ_setct_CredReqTBSX OBJ_set_ctype,33L -- --#define SN_setct_CredResData "setct-CredResData" --#define NID_setct_CredResData 552 --#define OBJ_setct_CredResData OBJ_set_ctype,34L -- --#define SN_setct_CredRevReqTBS "setct-CredRevReqTBS" --#define NID_setct_CredRevReqTBS 553 --#define OBJ_setct_CredRevReqTBS OBJ_set_ctype,35L -- --#define SN_setct_CredRevReqTBSX "setct-CredRevReqTBSX" --#define NID_setct_CredRevReqTBSX 554 --#define OBJ_setct_CredRevReqTBSX OBJ_set_ctype,36L -- --#define SN_setct_CredRevResData "setct-CredRevResData" --#define NID_setct_CredRevResData 555 --#define OBJ_setct_CredRevResData OBJ_set_ctype,37L -- --#define SN_setct_PCertReqData "setct-PCertReqData" --#define NID_setct_PCertReqData 556 --#define OBJ_setct_PCertReqData OBJ_set_ctype,38L -- --#define SN_setct_PCertResTBS "setct-PCertResTBS" --#define NID_setct_PCertResTBS 557 --#define OBJ_setct_PCertResTBS OBJ_set_ctype,39L -- --#define SN_setct_BatchAdminReqData "setct-BatchAdminReqData" --#define NID_setct_BatchAdminReqData 558 --#define OBJ_setct_BatchAdminReqData OBJ_set_ctype,40L -- --#define SN_setct_BatchAdminResData "setct-BatchAdminResData" --#define NID_setct_BatchAdminResData 559 --#define OBJ_setct_BatchAdminResData OBJ_set_ctype,41L -- --#define SN_setct_CardCInitResTBS "setct-CardCInitResTBS" --#define NID_setct_CardCInitResTBS 560 --#define OBJ_setct_CardCInitResTBS OBJ_set_ctype,42L -- --#define SN_setct_MeAqCInitResTBS "setct-MeAqCInitResTBS" --#define NID_setct_MeAqCInitResTBS 561 --#define OBJ_setct_MeAqCInitResTBS OBJ_set_ctype,43L -- --#define SN_setct_RegFormResTBS "setct-RegFormResTBS" --#define NID_setct_RegFormResTBS 562 --#define OBJ_setct_RegFormResTBS OBJ_set_ctype,44L -- --#define SN_setct_CertReqData "setct-CertReqData" --#define NID_setct_CertReqData 563 --#define OBJ_setct_CertReqData OBJ_set_ctype,45L -- --#define SN_setct_CertReqTBS "setct-CertReqTBS" --#define NID_setct_CertReqTBS 564 --#define OBJ_setct_CertReqTBS OBJ_set_ctype,46L -- --#define SN_setct_CertResData "setct-CertResData" --#define NID_setct_CertResData 565 --#define OBJ_setct_CertResData OBJ_set_ctype,47L -- --#define SN_setct_CertInqReqTBS "setct-CertInqReqTBS" --#define NID_setct_CertInqReqTBS 566 --#define OBJ_setct_CertInqReqTBS OBJ_set_ctype,48L -- --#define SN_setct_ErrorTBS "setct-ErrorTBS" --#define NID_setct_ErrorTBS 567 --#define OBJ_setct_ErrorTBS OBJ_set_ctype,49L -- --#define SN_setct_PIDualSignedTBE "setct-PIDualSignedTBE" --#define NID_setct_PIDualSignedTBE 568 --#define OBJ_setct_PIDualSignedTBE OBJ_set_ctype,50L -- --#define SN_setct_PIUnsignedTBE "setct-PIUnsignedTBE" --#define NID_setct_PIUnsignedTBE 569 --#define OBJ_setct_PIUnsignedTBE OBJ_set_ctype,51L -- --#define SN_setct_AuthReqTBE "setct-AuthReqTBE" --#define NID_setct_AuthReqTBE 570 --#define OBJ_setct_AuthReqTBE OBJ_set_ctype,52L -- --#define SN_setct_AuthResTBE "setct-AuthResTBE" --#define NID_setct_AuthResTBE 571 --#define OBJ_setct_AuthResTBE OBJ_set_ctype,53L -- --#define SN_setct_AuthResTBEX "setct-AuthResTBEX" --#define NID_setct_AuthResTBEX 572 --#define OBJ_setct_AuthResTBEX OBJ_set_ctype,54L -- --#define SN_setct_AuthTokenTBE "setct-AuthTokenTBE" --#define NID_setct_AuthTokenTBE 573 --#define OBJ_setct_AuthTokenTBE OBJ_set_ctype,55L -- --#define SN_setct_CapTokenTBE "setct-CapTokenTBE" --#define NID_setct_CapTokenTBE 574 --#define OBJ_setct_CapTokenTBE OBJ_set_ctype,56L -- --#define SN_setct_CapTokenTBEX "setct-CapTokenTBEX" --#define NID_setct_CapTokenTBEX 575 --#define OBJ_setct_CapTokenTBEX OBJ_set_ctype,57L -- --#define SN_setct_AcqCardCodeMsgTBE "setct-AcqCardCodeMsgTBE" --#define NID_setct_AcqCardCodeMsgTBE 576 --#define OBJ_setct_AcqCardCodeMsgTBE OBJ_set_ctype,58L -- --#define SN_setct_AuthRevReqTBE "setct-AuthRevReqTBE" --#define NID_setct_AuthRevReqTBE 577 --#define OBJ_setct_AuthRevReqTBE OBJ_set_ctype,59L -- --#define SN_setct_AuthRevResTBE "setct-AuthRevResTBE" --#define NID_setct_AuthRevResTBE 578 --#define OBJ_setct_AuthRevResTBE OBJ_set_ctype,60L -- --#define SN_setct_AuthRevResTBEB "setct-AuthRevResTBEB" --#define NID_setct_AuthRevResTBEB 579 --#define OBJ_setct_AuthRevResTBEB OBJ_set_ctype,61L -- --#define SN_setct_CapReqTBE "setct-CapReqTBE" --#define NID_setct_CapReqTBE 580 --#define OBJ_setct_CapReqTBE OBJ_set_ctype,62L -- --#define SN_setct_CapReqTBEX "setct-CapReqTBEX" --#define NID_setct_CapReqTBEX 581 --#define OBJ_setct_CapReqTBEX OBJ_set_ctype,63L -- --#define SN_setct_CapResTBE "setct-CapResTBE" --#define NID_setct_CapResTBE 582 --#define OBJ_setct_CapResTBE OBJ_set_ctype,64L -- --#define SN_setct_CapRevReqTBE "setct-CapRevReqTBE" --#define NID_setct_CapRevReqTBE 583 --#define OBJ_setct_CapRevReqTBE OBJ_set_ctype,65L -- --#define SN_setct_CapRevReqTBEX "setct-CapRevReqTBEX" --#define NID_setct_CapRevReqTBEX 584 --#define OBJ_setct_CapRevReqTBEX OBJ_set_ctype,66L -- --#define SN_setct_CapRevResTBE "setct-CapRevResTBE" --#define NID_setct_CapRevResTBE 585 --#define OBJ_setct_CapRevResTBE OBJ_set_ctype,67L -- --#define SN_setct_CredReqTBE "setct-CredReqTBE" --#define NID_setct_CredReqTBE 586 --#define OBJ_setct_CredReqTBE OBJ_set_ctype,68L -- --#define SN_setct_CredReqTBEX "setct-CredReqTBEX" --#define NID_setct_CredReqTBEX 587 --#define OBJ_setct_CredReqTBEX OBJ_set_ctype,69L -- --#define SN_setct_CredResTBE "setct-CredResTBE" --#define NID_setct_CredResTBE 588 --#define OBJ_setct_CredResTBE OBJ_set_ctype,70L -- --#define SN_setct_CredRevReqTBE "setct-CredRevReqTBE" --#define NID_setct_CredRevReqTBE 589 --#define OBJ_setct_CredRevReqTBE OBJ_set_ctype,71L -- --#define SN_setct_CredRevReqTBEX "setct-CredRevReqTBEX" --#define NID_setct_CredRevReqTBEX 590 --#define OBJ_setct_CredRevReqTBEX OBJ_set_ctype,72L -- --#define SN_setct_CredRevResTBE "setct-CredRevResTBE" --#define NID_setct_CredRevResTBE 591 --#define OBJ_setct_CredRevResTBE OBJ_set_ctype,73L -- --#define SN_setct_BatchAdminReqTBE "setct-BatchAdminReqTBE" --#define NID_setct_BatchAdminReqTBE 592 --#define OBJ_setct_BatchAdminReqTBE OBJ_set_ctype,74L -- --#define SN_setct_BatchAdminResTBE "setct-BatchAdminResTBE" --#define NID_setct_BatchAdminResTBE 593 --#define OBJ_setct_BatchAdminResTBE OBJ_set_ctype,75L -- --#define SN_setct_RegFormReqTBE "setct-RegFormReqTBE" --#define NID_setct_RegFormReqTBE 594 --#define OBJ_setct_RegFormReqTBE OBJ_set_ctype,76L -- --#define SN_setct_CertReqTBE "setct-CertReqTBE" --#define NID_setct_CertReqTBE 595 --#define OBJ_setct_CertReqTBE OBJ_set_ctype,77L -- --#define SN_setct_CertReqTBEX "setct-CertReqTBEX" --#define NID_setct_CertReqTBEX 596 --#define OBJ_setct_CertReqTBEX OBJ_set_ctype,78L -- --#define SN_setct_CertResTBE "setct-CertResTBE" --#define NID_setct_CertResTBE 597 --#define OBJ_setct_CertResTBE OBJ_set_ctype,79L -- --#define SN_setct_CRLNotificationTBS "setct-CRLNotificationTBS" --#define NID_setct_CRLNotificationTBS 598 --#define OBJ_setct_CRLNotificationTBS OBJ_set_ctype,80L -- --#define SN_setct_CRLNotificationResTBS "setct-CRLNotificationResTBS" --#define NID_setct_CRLNotificationResTBS 599 --#define OBJ_setct_CRLNotificationResTBS OBJ_set_ctype,81L -- --#define SN_setct_BCIDistributionTBS "setct-BCIDistributionTBS" --#define NID_setct_BCIDistributionTBS 600 --#define OBJ_setct_BCIDistributionTBS OBJ_set_ctype,82L -- --#define SN_setext_genCrypt "setext-genCrypt" --#define LN_setext_genCrypt "generic cryptogram" --#define NID_setext_genCrypt 601 --#define OBJ_setext_genCrypt OBJ_set_msgExt,1L -- --#define SN_setext_miAuth "setext-miAuth" --#define LN_setext_miAuth "merchant initiated auth" --#define NID_setext_miAuth 602 --#define OBJ_setext_miAuth OBJ_set_msgExt,3L -- --#define SN_setext_pinSecure "setext-pinSecure" --#define NID_setext_pinSecure 603 --#define OBJ_setext_pinSecure OBJ_set_msgExt,4L -- --#define SN_setext_pinAny "setext-pinAny" --#define NID_setext_pinAny 604 --#define OBJ_setext_pinAny OBJ_set_msgExt,5L -- --#define SN_setext_track2 "setext-track2" --#define NID_setext_track2 605 --#define OBJ_setext_track2 OBJ_set_msgExt,7L -- --#define SN_setext_cv "setext-cv" --#define LN_setext_cv "additional verification" --#define NID_setext_cv 606 --#define OBJ_setext_cv OBJ_set_msgExt,8L -- --#define SN_set_policy_root "set-policy-root" --#define NID_set_policy_root 607 --#define OBJ_set_policy_root OBJ_set_policy,0L -- --#define SN_setCext_hashedRoot "setCext-hashedRoot" --#define NID_setCext_hashedRoot 608 --#define OBJ_setCext_hashedRoot OBJ_set_certExt,0L -- --#define SN_setCext_certType "setCext-certType" --#define NID_setCext_certType 609 --#define OBJ_setCext_certType OBJ_set_certExt,1L -- --#define SN_setCext_merchData "setCext-merchData" --#define NID_setCext_merchData 610 --#define OBJ_setCext_merchData OBJ_set_certExt,2L -- --#define SN_setCext_cCertRequired "setCext-cCertRequired" --#define NID_setCext_cCertRequired 611 --#define OBJ_setCext_cCertRequired OBJ_set_certExt,3L -- --#define SN_setCext_tunneling "setCext-tunneling" --#define NID_setCext_tunneling 612 --#define OBJ_setCext_tunneling OBJ_set_certExt,4L -- --#define SN_setCext_setExt "setCext-setExt" --#define NID_setCext_setExt 613 --#define OBJ_setCext_setExt OBJ_set_certExt,5L -- --#define SN_setCext_setQualf "setCext-setQualf" --#define NID_setCext_setQualf 614 --#define OBJ_setCext_setQualf OBJ_set_certExt,6L -- --#define SN_setCext_PGWYcapabilities "setCext-PGWYcapabilities" --#define NID_setCext_PGWYcapabilities 615 --#define OBJ_setCext_PGWYcapabilities OBJ_set_certExt,7L -- --#define SN_setCext_TokenIdentifier "setCext-TokenIdentifier" --#define NID_setCext_TokenIdentifier 616 --#define OBJ_setCext_TokenIdentifier OBJ_set_certExt,8L -- --#define SN_setCext_Track2Data "setCext-Track2Data" --#define NID_setCext_Track2Data 617 --#define OBJ_setCext_Track2Data OBJ_set_certExt,9L -- --#define SN_setCext_TokenType "setCext-TokenType" --#define NID_setCext_TokenType 618 --#define OBJ_setCext_TokenType OBJ_set_certExt,10L -- --#define SN_setCext_IssuerCapabilities "setCext-IssuerCapabilities" --#define NID_setCext_IssuerCapabilities 619 --#define OBJ_setCext_IssuerCapabilities OBJ_set_certExt,11L -- --#define SN_setAttr_Cert "setAttr-Cert" --#define NID_setAttr_Cert 620 --#define OBJ_setAttr_Cert OBJ_set_attr,0L -- --#define SN_setAttr_PGWYcap "setAttr-PGWYcap" --#define LN_setAttr_PGWYcap "payment gateway capabilities" --#define NID_setAttr_PGWYcap 621 --#define OBJ_setAttr_PGWYcap OBJ_set_attr,1L -- --#define SN_setAttr_TokenType "setAttr-TokenType" --#define NID_setAttr_TokenType 622 --#define OBJ_setAttr_TokenType OBJ_set_attr,2L -- --#define SN_setAttr_IssCap "setAttr-IssCap" --#define LN_setAttr_IssCap "issuer capabilities" --#define NID_setAttr_IssCap 623 --#define OBJ_setAttr_IssCap OBJ_set_attr,3L -- --#define SN_set_rootKeyThumb "set-rootKeyThumb" --#define NID_set_rootKeyThumb 624 --#define OBJ_set_rootKeyThumb OBJ_setAttr_Cert,0L -- --#define SN_set_addPolicy "set-addPolicy" --#define NID_set_addPolicy 625 --#define OBJ_set_addPolicy OBJ_setAttr_Cert,1L -- --#define SN_setAttr_Token_EMV "setAttr-Token-EMV" --#define NID_setAttr_Token_EMV 626 --#define OBJ_setAttr_Token_EMV OBJ_setAttr_TokenType,1L -- --#define SN_setAttr_Token_B0Prime "setAttr-Token-B0Prime" --#define NID_setAttr_Token_B0Prime 627 --#define OBJ_setAttr_Token_B0Prime OBJ_setAttr_TokenType,2L -- --#define SN_setAttr_IssCap_CVM "setAttr-IssCap-CVM" --#define NID_setAttr_IssCap_CVM 628 --#define OBJ_setAttr_IssCap_CVM OBJ_setAttr_IssCap,3L -- --#define SN_setAttr_IssCap_T2 "setAttr-IssCap-T2" --#define NID_setAttr_IssCap_T2 629 --#define OBJ_setAttr_IssCap_T2 OBJ_setAttr_IssCap,4L -- --#define SN_setAttr_IssCap_Sig "setAttr-IssCap-Sig" --#define NID_setAttr_IssCap_Sig 630 --#define OBJ_setAttr_IssCap_Sig OBJ_setAttr_IssCap,5L -- --#define SN_setAttr_GenCryptgrm "setAttr-GenCryptgrm" --#define LN_setAttr_GenCryptgrm "generate cryptogram" --#define NID_setAttr_GenCryptgrm 631 --#define OBJ_setAttr_GenCryptgrm OBJ_setAttr_IssCap_CVM,1L -- --#define SN_setAttr_T2Enc "setAttr-T2Enc" --#define LN_setAttr_T2Enc "encrypted track 2" --#define NID_setAttr_T2Enc 632 --#define OBJ_setAttr_T2Enc OBJ_setAttr_IssCap_T2,1L -- --#define SN_setAttr_T2cleartxt "setAttr-T2cleartxt" --#define LN_setAttr_T2cleartxt "cleartext track 2" --#define NID_setAttr_T2cleartxt 633 --#define OBJ_setAttr_T2cleartxt OBJ_setAttr_IssCap_T2,2L -- --#define SN_setAttr_TokICCsig "setAttr-TokICCsig" --#define LN_setAttr_TokICCsig "ICC or token signature" --#define NID_setAttr_TokICCsig 634 --#define OBJ_setAttr_TokICCsig OBJ_setAttr_IssCap_Sig,1L -- --#define SN_setAttr_SecDevSig "setAttr-SecDevSig" --#define LN_setAttr_SecDevSig "secure device signature" --#define NID_setAttr_SecDevSig 635 --#define OBJ_setAttr_SecDevSig OBJ_setAttr_IssCap_Sig,2L -- --#define SN_set_brand_IATA_ATA "set-brand-IATA-ATA" --#define NID_set_brand_IATA_ATA 636 --#define OBJ_set_brand_IATA_ATA OBJ_set_brand,1L -- --#define SN_set_brand_Diners "set-brand-Diners" --#define NID_set_brand_Diners 637 --#define OBJ_set_brand_Diners OBJ_set_brand,30L -- --#define SN_set_brand_AmericanExpress "set-brand-AmericanExpress" --#define NID_set_brand_AmericanExpress 638 --#define OBJ_set_brand_AmericanExpress OBJ_set_brand,34L -- --#define SN_set_brand_JCB "set-brand-JCB" --#define NID_set_brand_JCB 639 --#define OBJ_set_brand_JCB OBJ_set_brand,35L -- --#define SN_set_brand_Visa "set-brand-Visa" --#define NID_set_brand_Visa 640 --#define OBJ_set_brand_Visa OBJ_set_brand,4L -- --#define SN_set_brand_MasterCard "set-brand-MasterCard" --#define NID_set_brand_MasterCard 641 --#define OBJ_set_brand_MasterCard OBJ_set_brand,5L -- --#define SN_set_brand_Novus "set-brand-Novus" --#define NID_set_brand_Novus 642 --#define OBJ_set_brand_Novus OBJ_set_brand,6011L -- --#define SN_des_cdmf "DES-CDMF" --#define LN_des_cdmf "des-cdmf" --#define NID_des_cdmf 643 --#define OBJ_des_cdmf OBJ_rsadsi,3L,10L -- --#define SN_rsaOAEPEncryptionSET "rsaOAEPEncryptionSET" --#define NID_rsaOAEPEncryptionSET 644 --#define OBJ_rsaOAEPEncryptionSET OBJ_rsadsi,1L,1L,6L -- --#define SN_ipsec3 "Oakley-EC2N-3" --#define LN_ipsec3 "ipsec3" --#define NID_ipsec3 749 -- --#define SN_ipsec4 "Oakley-EC2N-4" --#define LN_ipsec4 "ipsec4" --#define NID_ipsec4 750 -- --#define SN_whirlpool "whirlpool" --#define NID_whirlpool 804 --#define OBJ_whirlpool OBJ_iso,0L,10118L,3L,0L,55L -- --#define SN_cryptopro "cryptopro" --#define NID_cryptopro 805 --#define OBJ_cryptopro OBJ_member_body,643L,2L,2L -- --#define SN_cryptocom "cryptocom" --#define NID_cryptocom 806 --#define OBJ_cryptocom OBJ_member_body,643L,2L,9L -- --#define SN_id_tc26 "id-tc26" --#define NID_id_tc26 974 --#define OBJ_id_tc26 OBJ_member_body,643L,7L,1L -- --#define SN_id_GostR3411_94_with_GostR3410_2001 "id-GostR3411-94-with-GostR3410-2001" --#define LN_id_GostR3411_94_with_GostR3410_2001 "GOST R 34.11-94 with GOST R 34.10-2001" --#define NID_id_GostR3411_94_with_GostR3410_2001 807 --#define OBJ_id_GostR3411_94_with_GostR3410_2001 OBJ_cryptopro,3L -- --#define SN_id_GostR3411_94_with_GostR3410_94 "id-GostR3411-94-with-GostR3410-94" --#define LN_id_GostR3411_94_with_GostR3410_94 "GOST R 34.11-94 with GOST R 34.10-94" --#define NID_id_GostR3411_94_with_GostR3410_94 808 --#define OBJ_id_GostR3411_94_with_GostR3410_94 OBJ_cryptopro,4L -- --#define SN_id_GostR3411_94 "md_gost94" --#define LN_id_GostR3411_94 "GOST R 34.11-94" --#define NID_id_GostR3411_94 809 --#define OBJ_id_GostR3411_94 OBJ_cryptopro,9L -- --#define SN_id_HMACGostR3411_94 "id-HMACGostR3411-94" --#define LN_id_HMACGostR3411_94 "HMAC GOST 34.11-94" --#define NID_id_HMACGostR3411_94 810 --#define OBJ_id_HMACGostR3411_94 OBJ_cryptopro,10L -- --#define SN_id_GostR3410_2001 "gost2001" --#define LN_id_GostR3410_2001 "GOST R 34.10-2001" --#define NID_id_GostR3410_2001 811 --#define OBJ_id_GostR3410_2001 OBJ_cryptopro,19L -- --#define SN_id_GostR3410_94 "gost94" --#define LN_id_GostR3410_94 "GOST R 34.10-94" --#define NID_id_GostR3410_94 812 --#define OBJ_id_GostR3410_94 OBJ_cryptopro,20L -- --#define SN_id_Gost28147_89 "gost89" --#define LN_id_Gost28147_89 "GOST 28147-89" --#define NID_id_Gost28147_89 813 --#define OBJ_id_Gost28147_89 OBJ_cryptopro,21L -- --#define SN_gost89_cnt "gost89-cnt" --#define NID_gost89_cnt 814 -- --#define SN_gost89_cnt_12 "gost89-cnt-12" --#define NID_gost89_cnt_12 975 -- --#define SN_gost89_cbc "gost89-cbc" --#define NID_gost89_cbc 1009 -- --#define SN_gost89_ecb "gost89-ecb" --#define NID_gost89_ecb 1010 -- --#define SN_gost89_ctr "gost89-ctr" --#define NID_gost89_ctr 1011 -- --#define SN_id_Gost28147_89_MAC "gost-mac" --#define LN_id_Gost28147_89_MAC "GOST 28147-89 MAC" --#define NID_id_Gost28147_89_MAC 815 --#define OBJ_id_Gost28147_89_MAC OBJ_cryptopro,22L -- --#define SN_gost_mac_12 "gost-mac-12" --#define NID_gost_mac_12 976 -- --#define SN_id_GostR3411_94_prf "prf-gostr3411-94" --#define LN_id_GostR3411_94_prf "GOST R 34.11-94 PRF" --#define NID_id_GostR3411_94_prf 816 --#define OBJ_id_GostR3411_94_prf OBJ_cryptopro,23L -- --#define SN_id_GostR3410_2001DH "id-GostR3410-2001DH" --#define LN_id_GostR3410_2001DH "GOST R 34.10-2001 DH" --#define NID_id_GostR3410_2001DH 817 --#define OBJ_id_GostR3410_2001DH OBJ_cryptopro,98L -- --#define SN_id_GostR3410_94DH "id-GostR3410-94DH" --#define LN_id_GostR3410_94DH "GOST R 34.10-94 DH" --#define NID_id_GostR3410_94DH 818 --#define OBJ_id_GostR3410_94DH OBJ_cryptopro,99L -- --#define SN_id_Gost28147_89_CryptoPro_KeyMeshing "id-Gost28147-89-CryptoPro-KeyMeshing" --#define NID_id_Gost28147_89_CryptoPro_KeyMeshing 819 --#define OBJ_id_Gost28147_89_CryptoPro_KeyMeshing OBJ_cryptopro,14L,1L -- --#define SN_id_Gost28147_89_None_KeyMeshing "id-Gost28147-89-None-KeyMeshing" --#define NID_id_Gost28147_89_None_KeyMeshing 820 --#define OBJ_id_Gost28147_89_None_KeyMeshing OBJ_cryptopro,14L,0L -- --#define SN_id_GostR3411_94_TestParamSet "id-GostR3411-94-TestParamSet" --#define NID_id_GostR3411_94_TestParamSet 821 --#define OBJ_id_GostR3411_94_TestParamSet OBJ_cryptopro,30L,0L -- --#define SN_id_GostR3411_94_CryptoProParamSet "id-GostR3411-94-CryptoProParamSet" --#define NID_id_GostR3411_94_CryptoProParamSet 822 --#define OBJ_id_GostR3411_94_CryptoProParamSet OBJ_cryptopro,30L,1L -- --#define SN_id_Gost28147_89_TestParamSet "id-Gost28147-89-TestParamSet" --#define NID_id_Gost28147_89_TestParamSet 823 --#define OBJ_id_Gost28147_89_TestParamSet OBJ_cryptopro,31L,0L -- --#define SN_id_Gost28147_89_CryptoPro_A_ParamSet "id-Gost28147-89-CryptoPro-A-ParamSet" --#define NID_id_Gost28147_89_CryptoPro_A_ParamSet 824 --#define OBJ_id_Gost28147_89_CryptoPro_A_ParamSet OBJ_cryptopro,31L,1L -- --#define SN_id_Gost28147_89_CryptoPro_B_ParamSet "id-Gost28147-89-CryptoPro-B-ParamSet" --#define NID_id_Gost28147_89_CryptoPro_B_ParamSet 825 --#define OBJ_id_Gost28147_89_CryptoPro_B_ParamSet OBJ_cryptopro,31L,2L -- --#define SN_id_Gost28147_89_CryptoPro_C_ParamSet "id-Gost28147-89-CryptoPro-C-ParamSet" --#define NID_id_Gost28147_89_CryptoPro_C_ParamSet 826 --#define OBJ_id_Gost28147_89_CryptoPro_C_ParamSet OBJ_cryptopro,31L,3L -- --#define SN_id_Gost28147_89_CryptoPro_D_ParamSet "id-Gost28147-89-CryptoPro-D-ParamSet" --#define NID_id_Gost28147_89_CryptoPro_D_ParamSet 827 --#define OBJ_id_Gost28147_89_CryptoPro_D_ParamSet OBJ_cryptopro,31L,4L -- --#define SN_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet "id-Gost28147-89-CryptoPro-Oscar-1-1-ParamSet" --#define NID_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet 828 --#define OBJ_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet OBJ_cryptopro,31L,5L -- --#define SN_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet "id-Gost28147-89-CryptoPro-Oscar-1-0-ParamSet" --#define NID_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet 829 --#define OBJ_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet OBJ_cryptopro,31L,6L -- --#define SN_id_Gost28147_89_CryptoPro_RIC_1_ParamSet "id-Gost28147-89-CryptoPro-RIC-1-ParamSet" --#define NID_id_Gost28147_89_CryptoPro_RIC_1_ParamSet 830 --#define OBJ_id_Gost28147_89_CryptoPro_RIC_1_ParamSet OBJ_cryptopro,31L,7L -- --#define SN_id_GostR3410_94_TestParamSet "id-GostR3410-94-TestParamSet" --#define NID_id_GostR3410_94_TestParamSet 831 --#define OBJ_id_GostR3410_94_TestParamSet OBJ_cryptopro,32L,0L -- --#define SN_id_GostR3410_94_CryptoPro_A_ParamSet "id-GostR3410-94-CryptoPro-A-ParamSet" --#define NID_id_GostR3410_94_CryptoPro_A_ParamSet 832 --#define OBJ_id_GostR3410_94_CryptoPro_A_ParamSet OBJ_cryptopro,32L,2L -- --#define SN_id_GostR3410_94_CryptoPro_B_ParamSet "id-GostR3410-94-CryptoPro-B-ParamSet" --#define NID_id_GostR3410_94_CryptoPro_B_ParamSet 833 --#define OBJ_id_GostR3410_94_CryptoPro_B_ParamSet OBJ_cryptopro,32L,3L -- --#define SN_id_GostR3410_94_CryptoPro_C_ParamSet "id-GostR3410-94-CryptoPro-C-ParamSet" --#define NID_id_GostR3410_94_CryptoPro_C_ParamSet 834 --#define OBJ_id_GostR3410_94_CryptoPro_C_ParamSet OBJ_cryptopro,32L,4L -- --#define SN_id_GostR3410_94_CryptoPro_D_ParamSet "id-GostR3410-94-CryptoPro-D-ParamSet" --#define NID_id_GostR3410_94_CryptoPro_D_ParamSet 835 --#define OBJ_id_GostR3410_94_CryptoPro_D_ParamSet OBJ_cryptopro,32L,5L -- --#define SN_id_GostR3410_94_CryptoPro_XchA_ParamSet "id-GostR3410-94-CryptoPro-XchA-ParamSet" --#define NID_id_GostR3410_94_CryptoPro_XchA_ParamSet 836 --#define OBJ_id_GostR3410_94_CryptoPro_XchA_ParamSet OBJ_cryptopro,33L,1L -- --#define SN_id_GostR3410_94_CryptoPro_XchB_ParamSet "id-GostR3410-94-CryptoPro-XchB-ParamSet" --#define NID_id_GostR3410_94_CryptoPro_XchB_ParamSet 837 --#define OBJ_id_GostR3410_94_CryptoPro_XchB_ParamSet OBJ_cryptopro,33L,2L -- --#define SN_id_GostR3410_94_CryptoPro_XchC_ParamSet "id-GostR3410-94-CryptoPro-XchC-ParamSet" --#define NID_id_GostR3410_94_CryptoPro_XchC_ParamSet 838 --#define OBJ_id_GostR3410_94_CryptoPro_XchC_ParamSet OBJ_cryptopro,33L,3L -- --#define SN_id_GostR3410_2001_TestParamSet "id-GostR3410-2001-TestParamSet" --#define NID_id_GostR3410_2001_TestParamSet 839 --#define OBJ_id_GostR3410_2001_TestParamSet OBJ_cryptopro,35L,0L -- --#define SN_id_GostR3410_2001_CryptoPro_A_ParamSet "id-GostR3410-2001-CryptoPro-A-ParamSet" --#define NID_id_GostR3410_2001_CryptoPro_A_ParamSet 840 --#define OBJ_id_GostR3410_2001_CryptoPro_A_ParamSet OBJ_cryptopro,35L,1L -- --#define SN_id_GostR3410_2001_CryptoPro_B_ParamSet "id-GostR3410-2001-CryptoPro-B-ParamSet" --#define NID_id_GostR3410_2001_CryptoPro_B_ParamSet 841 --#define OBJ_id_GostR3410_2001_CryptoPro_B_ParamSet OBJ_cryptopro,35L,2L -- --#define SN_id_GostR3410_2001_CryptoPro_C_ParamSet "id-GostR3410-2001-CryptoPro-C-ParamSet" --#define NID_id_GostR3410_2001_CryptoPro_C_ParamSet 842 --#define OBJ_id_GostR3410_2001_CryptoPro_C_ParamSet OBJ_cryptopro,35L,3L -- --#define SN_id_GostR3410_2001_CryptoPro_XchA_ParamSet "id-GostR3410-2001-CryptoPro-XchA-ParamSet" --#define NID_id_GostR3410_2001_CryptoPro_XchA_ParamSet 843 --#define OBJ_id_GostR3410_2001_CryptoPro_XchA_ParamSet OBJ_cryptopro,36L,0L -- --#define SN_id_GostR3410_2001_CryptoPro_XchB_ParamSet "id-GostR3410-2001-CryptoPro-XchB-ParamSet" --#define NID_id_GostR3410_2001_CryptoPro_XchB_ParamSet 844 --#define OBJ_id_GostR3410_2001_CryptoPro_XchB_ParamSet OBJ_cryptopro,36L,1L -- --#define SN_id_GostR3410_94_a "id-GostR3410-94-a" --#define NID_id_GostR3410_94_a 845 --#define OBJ_id_GostR3410_94_a OBJ_id_GostR3410_94,1L -- --#define SN_id_GostR3410_94_aBis "id-GostR3410-94-aBis" --#define NID_id_GostR3410_94_aBis 846 --#define OBJ_id_GostR3410_94_aBis OBJ_id_GostR3410_94,2L -- --#define SN_id_GostR3410_94_b "id-GostR3410-94-b" --#define NID_id_GostR3410_94_b 847 --#define OBJ_id_GostR3410_94_b OBJ_id_GostR3410_94,3L -- --#define SN_id_GostR3410_94_bBis "id-GostR3410-94-bBis" --#define NID_id_GostR3410_94_bBis 848 --#define OBJ_id_GostR3410_94_bBis OBJ_id_GostR3410_94,4L -- --#define SN_id_Gost28147_89_cc "id-Gost28147-89-cc" --#define LN_id_Gost28147_89_cc "GOST 28147-89 Cryptocom ParamSet" --#define NID_id_Gost28147_89_cc 849 --#define OBJ_id_Gost28147_89_cc OBJ_cryptocom,1L,6L,1L -- --#define SN_id_GostR3410_94_cc "gost94cc" --#define LN_id_GostR3410_94_cc "GOST 34.10-94 Cryptocom" --#define NID_id_GostR3410_94_cc 850 --#define OBJ_id_GostR3410_94_cc OBJ_cryptocom,1L,5L,3L -- --#define SN_id_GostR3410_2001_cc "gost2001cc" --#define LN_id_GostR3410_2001_cc "GOST 34.10-2001 Cryptocom" --#define NID_id_GostR3410_2001_cc 851 --#define OBJ_id_GostR3410_2001_cc OBJ_cryptocom,1L,5L,4L -- --#define SN_id_GostR3411_94_with_GostR3410_94_cc "id-GostR3411-94-with-GostR3410-94-cc" --#define LN_id_GostR3411_94_with_GostR3410_94_cc "GOST R 34.11-94 with GOST R 34.10-94 Cryptocom" --#define NID_id_GostR3411_94_with_GostR3410_94_cc 852 --#define OBJ_id_GostR3411_94_with_GostR3410_94_cc OBJ_cryptocom,1L,3L,3L -- --#define SN_id_GostR3411_94_with_GostR3410_2001_cc "id-GostR3411-94-with-GostR3410-2001-cc" --#define LN_id_GostR3411_94_with_GostR3410_2001_cc "GOST R 34.11-94 with GOST R 34.10-2001 Cryptocom" --#define NID_id_GostR3411_94_with_GostR3410_2001_cc 853 --#define OBJ_id_GostR3411_94_with_GostR3410_2001_cc OBJ_cryptocom,1L,3L,4L -- --#define SN_id_GostR3410_2001_ParamSet_cc "id-GostR3410-2001-ParamSet-cc" --#define LN_id_GostR3410_2001_ParamSet_cc "GOST R 3410-2001 Parameter Set Cryptocom" --#define NID_id_GostR3410_2001_ParamSet_cc 854 --#define OBJ_id_GostR3410_2001_ParamSet_cc OBJ_cryptocom,1L,8L,1L -- --#define SN_id_tc26_algorithms "id-tc26-algorithms" --#define NID_id_tc26_algorithms 977 --#define OBJ_id_tc26_algorithms OBJ_id_tc26,1L -- --#define SN_id_tc26_sign "id-tc26-sign" --#define NID_id_tc26_sign 978 --#define OBJ_id_tc26_sign OBJ_id_tc26_algorithms,1L -- --#define SN_id_GostR3410_2012_256 "gost2012_256" --#define LN_id_GostR3410_2012_256 "GOST R 34.10-2012 with 256 bit modulus" --#define NID_id_GostR3410_2012_256 979 --#define OBJ_id_GostR3410_2012_256 OBJ_id_tc26_sign,1L -- --#define SN_id_GostR3410_2012_512 "gost2012_512" --#define LN_id_GostR3410_2012_512 "GOST R 34.10-2012 with 512 bit modulus" --#define NID_id_GostR3410_2012_512 980 --#define OBJ_id_GostR3410_2012_512 OBJ_id_tc26_sign,2L -- --#define SN_id_tc26_digest "id-tc26-digest" --#define NID_id_tc26_digest 981 --#define OBJ_id_tc26_digest OBJ_id_tc26_algorithms,2L -- --#define SN_id_GostR3411_2012_256 "md_gost12_256" --#define LN_id_GostR3411_2012_256 "GOST R 34.11-2012 with 256 bit hash" --#define NID_id_GostR3411_2012_256 982 --#define OBJ_id_GostR3411_2012_256 OBJ_id_tc26_digest,2L -- --#define SN_id_GostR3411_2012_512 "md_gost12_512" --#define LN_id_GostR3411_2012_512 "GOST R 34.11-2012 with 512 bit hash" --#define NID_id_GostR3411_2012_512 983 --#define OBJ_id_GostR3411_2012_512 OBJ_id_tc26_digest,3L -- --#define SN_id_tc26_signwithdigest "id-tc26-signwithdigest" --#define NID_id_tc26_signwithdigest 984 --#define OBJ_id_tc26_signwithdigest OBJ_id_tc26_algorithms,3L -- --#define SN_id_tc26_signwithdigest_gost3410_2012_256 "id-tc26-signwithdigest-gost3410-2012-256" --#define LN_id_tc26_signwithdigest_gost3410_2012_256 "GOST R 34.10-2012 with GOST R 34.11-2012 (256 bit)" --#define NID_id_tc26_signwithdigest_gost3410_2012_256 985 --#define OBJ_id_tc26_signwithdigest_gost3410_2012_256 OBJ_id_tc26_signwithdigest,2L -- --#define SN_id_tc26_signwithdigest_gost3410_2012_512 "id-tc26-signwithdigest-gost3410-2012-512" --#define LN_id_tc26_signwithdigest_gost3410_2012_512 "GOST R 34.10-2012 with GOST R 34.11-2012 (512 bit)" --#define NID_id_tc26_signwithdigest_gost3410_2012_512 986 --#define OBJ_id_tc26_signwithdigest_gost3410_2012_512 OBJ_id_tc26_signwithdigest,3L -- --#define SN_id_tc26_mac "id-tc26-mac" --#define NID_id_tc26_mac 987 --#define OBJ_id_tc26_mac OBJ_id_tc26_algorithms,4L -- --#define SN_id_tc26_hmac_gost_3411_2012_256 "id-tc26-hmac-gost-3411-2012-256" --#define LN_id_tc26_hmac_gost_3411_2012_256 "HMAC GOST 34.11-2012 256 bit" --#define NID_id_tc26_hmac_gost_3411_2012_256 988 --#define OBJ_id_tc26_hmac_gost_3411_2012_256 OBJ_id_tc26_mac,1L -- --#define SN_id_tc26_hmac_gost_3411_2012_512 "id-tc26-hmac-gost-3411-2012-512" --#define LN_id_tc26_hmac_gost_3411_2012_512 "HMAC GOST 34.11-2012 512 bit" --#define NID_id_tc26_hmac_gost_3411_2012_512 989 --#define OBJ_id_tc26_hmac_gost_3411_2012_512 OBJ_id_tc26_mac,2L -- --#define SN_id_tc26_cipher "id-tc26-cipher" --#define NID_id_tc26_cipher 990 --#define OBJ_id_tc26_cipher OBJ_id_tc26_algorithms,5L -- --#define SN_id_tc26_cipher_gostr3412_2015_magma "id-tc26-cipher-gostr3412-2015-magma" --#define NID_id_tc26_cipher_gostr3412_2015_magma 1173 --#define OBJ_id_tc26_cipher_gostr3412_2015_magma OBJ_id_tc26_cipher,1L -- --#define SN_id_tc26_cipher_gostr3412_2015_magma_ctracpkm "id-tc26-cipher-gostr3412-2015-magma-ctracpkm" --#define NID_id_tc26_cipher_gostr3412_2015_magma_ctracpkm 1174 --#define OBJ_id_tc26_cipher_gostr3412_2015_magma_ctracpkm OBJ_id_tc26_cipher_gostr3412_2015_magma,1L -- --#define SN_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac "id-tc26-cipher-gostr3412-2015-magma-ctracpkm-omac" --#define NID_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac 1175 --#define OBJ_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac OBJ_id_tc26_cipher_gostr3412_2015_magma,2L -- --#define SN_id_tc26_cipher_gostr3412_2015_kuznyechik "id-tc26-cipher-gostr3412-2015-kuznyechik" --#define NID_id_tc26_cipher_gostr3412_2015_kuznyechik 1176 --#define OBJ_id_tc26_cipher_gostr3412_2015_kuznyechik OBJ_id_tc26_cipher,2L -- --#define SN_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm "id-tc26-cipher-gostr3412-2015-kuznyechik-ctracpkm" --#define NID_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm 1177 --#define OBJ_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm OBJ_id_tc26_cipher_gostr3412_2015_kuznyechik,1L -- --#define SN_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac "id-tc26-cipher-gostr3412-2015-kuznyechik-ctracpkm-omac" --#define NID_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac 1178 --#define OBJ_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac OBJ_id_tc26_cipher_gostr3412_2015_kuznyechik,2L -- --#define SN_id_tc26_agreement "id-tc26-agreement" --#define NID_id_tc26_agreement 991 --#define OBJ_id_tc26_agreement OBJ_id_tc26_algorithms,6L -- --#define SN_id_tc26_agreement_gost_3410_2012_256 "id-tc26-agreement-gost-3410-2012-256" --#define NID_id_tc26_agreement_gost_3410_2012_256 992 --#define OBJ_id_tc26_agreement_gost_3410_2012_256 OBJ_id_tc26_agreement,1L -- --#define SN_id_tc26_agreement_gost_3410_2012_512 "id-tc26-agreement-gost-3410-2012-512" --#define NID_id_tc26_agreement_gost_3410_2012_512 993 --#define OBJ_id_tc26_agreement_gost_3410_2012_512 OBJ_id_tc26_agreement,2L -- --#define SN_id_tc26_wrap "id-tc26-wrap" --#define NID_id_tc26_wrap 1179 --#define OBJ_id_tc26_wrap OBJ_id_tc26_algorithms,7L -- --#define SN_id_tc26_wrap_gostr3412_2015_magma "id-tc26-wrap-gostr3412-2015-magma" --#define NID_id_tc26_wrap_gostr3412_2015_magma 1180 --#define OBJ_id_tc26_wrap_gostr3412_2015_magma OBJ_id_tc26_wrap,1L -- --#define SN_id_tc26_wrap_gostr3412_2015_magma_kexp15 "id-tc26-wrap-gostr3412-2015-magma-kexp15" --#define NID_id_tc26_wrap_gostr3412_2015_magma_kexp15 1181 --#define OBJ_id_tc26_wrap_gostr3412_2015_magma_kexp15 OBJ_id_tc26_wrap_gostr3412_2015_magma,1L -- --#define SN_id_tc26_wrap_gostr3412_2015_kuznyechik "id-tc26-wrap-gostr3412-2015-kuznyechik" --#define NID_id_tc26_wrap_gostr3412_2015_kuznyechik 1182 --#define OBJ_id_tc26_wrap_gostr3412_2015_kuznyechik OBJ_id_tc26_wrap,2L -- --#define SN_id_tc26_wrap_gostr3412_2015_kuznyechik_kexp15 "id-tc26-wrap-gostr3412-2015-kuznyechik-kexp15" --#define NID_id_tc26_wrap_gostr3412_2015_kuznyechik_kexp15 1183 --#define OBJ_id_tc26_wrap_gostr3412_2015_kuznyechik_kexp15 OBJ_id_tc26_wrap_gostr3412_2015_kuznyechik,1L -- --#define SN_id_tc26_constants "id-tc26-constants" --#define NID_id_tc26_constants 994 --#define OBJ_id_tc26_constants OBJ_id_tc26,2L -- --#define SN_id_tc26_sign_constants "id-tc26-sign-constants" --#define NID_id_tc26_sign_constants 995 --#define OBJ_id_tc26_sign_constants OBJ_id_tc26_constants,1L -- --#define SN_id_tc26_gost_3410_2012_256_constants "id-tc26-gost-3410-2012-256-constants" --#define NID_id_tc26_gost_3410_2012_256_constants 1147 --#define OBJ_id_tc26_gost_3410_2012_256_constants OBJ_id_tc26_sign_constants,1L -- --#define SN_id_tc26_gost_3410_2012_256_paramSetA "id-tc26-gost-3410-2012-256-paramSetA" --#define LN_id_tc26_gost_3410_2012_256_paramSetA "GOST R 34.10-2012 (256 bit) ParamSet A" --#define NID_id_tc26_gost_3410_2012_256_paramSetA 1148 --#define OBJ_id_tc26_gost_3410_2012_256_paramSetA OBJ_id_tc26_gost_3410_2012_256_constants,1L -- --#define SN_id_tc26_gost_3410_2012_256_paramSetB "id-tc26-gost-3410-2012-256-paramSetB" --#define LN_id_tc26_gost_3410_2012_256_paramSetB "GOST R 34.10-2012 (256 bit) ParamSet B" --#define NID_id_tc26_gost_3410_2012_256_paramSetB 1184 --#define OBJ_id_tc26_gost_3410_2012_256_paramSetB OBJ_id_tc26_gost_3410_2012_256_constants,2L -- --#define SN_id_tc26_gost_3410_2012_256_paramSetC "id-tc26-gost-3410-2012-256-paramSetC" --#define LN_id_tc26_gost_3410_2012_256_paramSetC "GOST R 34.10-2012 (256 bit) ParamSet C" --#define NID_id_tc26_gost_3410_2012_256_paramSetC 1185 --#define OBJ_id_tc26_gost_3410_2012_256_paramSetC OBJ_id_tc26_gost_3410_2012_256_constants,3L -- --#define SN_id_tc26_gost_3410_2012_256_paramSetD "id-tc26-gost-3410-2012-256-paramSetD" --#define LN_id_tc26_gost_3410_2012_256_paramSetD "GOST R 34.10-2012 (256 bit) ParamSet D" --#define NID_id_tc26_gost_3410_2012_256_paramSetD 1186 --#define OBJ_id_tc26_gost_3410_2012_256_paramSetD OBJ_id_tc26_gost_3410_2012_256_constants,4L -- --#define SN_id_tc26_gost_3410_2012_512_constants "id-tc26-gost-3410-2012-512-constants" --#define NID_id_tc26_gost_3410_2012_512_constants 996 --#define OBJ_id_tc26_gost_3410_2012_512_constants OBJ_id_tc26_sign_constants,2L -- --#define SN_id_tc26_gost_3410_2012_512_paramSetTest "id-tc26-gost-3410-2012-512-paramSetTest" --#define LN_id_tc26_gost_3410_2012_512_paramSetTest "GOST R 34.10-2012 (512 bit) testing parameter set" --#define NID_id_tc26_gost_3410_2012_512_paramSetTest 997 --#define OBJ_id_tc26_gost_3410_2012_512_paramSetTest OBJ_id_tc26_gost_3410_2012_512_constants,0L -- --#define SN_id_tc26_gost_3410_2012_512_paramSetA "id-tc26-gost-3410-2012-512-paramSetA" --#define LN_id_tc26_gost_3410_2012_512_paramSetA "GOST R 34.10-2012 (512 bit) ParamSet A" --#define NID_id_tc26_gost_3410_2012_512_paramSetA 998 --#define OBJ_id_tc26_gost_3410_2012_512_paramSetA OBJ_id_tc26_gost_3410_2012_512_constants,1L -- --#define SN_id_tc26_gost_3410_2012_512_paramSetB "id-tc26-gost-3410-2012-512-paramSetB" --#define LN_id_tc26_gost_3410_2012_512_paramSetB "GOST R 34.10-2012 (512 bit) ParamSet B" --#define NID_id_tc26_gost_3410_2012_512_paramSetB 999 --#define OBJ_id_tc26_gost_3410_2012_512_paramSetB OBJ_id_tc26_gost_3410_2012_512_constants,2L -- --#define SN_id_tc26_gost_3410_2012_512_paramSetC "id-tc26-gost-3410-2012-512-paramSetC" --#define LN_id_tc26_gost_3410_2012_512_paramSetC "GOST R 34.10-2012 (512 bit) ParamSet C" --#define NID_id_tc26_gost_3410_2012_512_paramSetC 1149 --#define OBJ_id_tc26_gost_3410_2012_512_paramSetC OBJ_id_tc26_gost_3410_2012_512_constants,3L -- --#define SN_id_tc26_digest_constants "id-tc26-digest-constants" --#define NID_id_tc26_digest_constants 1000 --#define OBJ_id_tc26_digest_constants OBJ_id_tc26_constants,2L -- --#define SN_id_tc26_cipher_constants "id-tc26-cipher-constants" --#define NID_id_tc26_cipher_constants 1001 --#define OBJ_id_tc26_cipher_constants OBJ_id_tc26_constants,5L -- --#define SN_id_tc26_gost_28147_constants "id-tc26-gost-28147-constants" --#define NID_id_tc26_gost_28147_constants 1002 --#define OBJ_id_tc26_gost_28147_constants OBJ_id_tc26_cipher_constants,1L -- --#define SN_id_tc26_gost_28147_param_Z "id-tc26-gost-28147-param-Z" --#define LN_id_tc26_gost_28147_param_Z "GOST 28147-89 TC26 parameter set" --#define NID_id_tc26_gost_28147_param_Z 1003 --#define OBJ_id_tc26_gost_28147_param_Z OBJ_id_tc26_gost_28147_constants,1L -- --#define SN_INN "INN" --#define LN_INN "INN" --#define NID_INN 1004 --#define OBJ_INN OBJ_member_body,643L,3L,131L,1L,1L -- --#define SN_OGRN "OGRN" --#define LN_OGRN "OGRN" --#define NID_OGRN 1005 --#define OBJ_OGRN OBJ_member_body,643L,100L,1L -- --#define SN_SNILS "SNILS" --#define LN_SNILS "SNILS" --#define NID_SNILS 1006 --#define OBJ_SNILS OBJ_member_body,643L,100L,3L -- --#define SN_subjectSignTool "subjectSignTool" --#define LN_subjectSignTool "Signing Tool of Subject" --#define NID_subjectSignTool 1007 --#define OBJ_subjectSignTool OBJ_member_body,643L,100L,111L -- --#define SN_issuerSignTool "issuerSignTool" --#define LN_issuerSignTool "Signing Tool of Issuer" --#define NID_issuerSignTool 1008 --#define OBJ_issuerSignTool OBJ_member_body,643L,100L,112L -- --#define SN_grasshopper_ecb "grasshopper-ecb" --#define NID_grasshopper_ecb 1012 -- --#define SN_grasshopper_ctr "grasshopper-ctr" --#define NID_grasshopper_ctr 1013 -- --#define SN_grasshopper_ofb "grasshopper-ofb" --#define NID_grasshopper_ofb 1014 -- --#define SN_grasshopper_cbc "grasshopper-cbc" --#define NID_grasshopper_cbc 1015 -- --#define SN_grasshopper_cfb "grasshopper-cfb" --#define NID_grasshopper_cfb 1016 -- --#define SN_grasshopper_mac "grasshopper-mac" --#define NID_grasshopper_mac 1017 -- --#define SN_magma_ecb "magma-ecb" --#define NID_magma_ecb 1187 -- --#define SN_magma_ctr "magma-ctr" --#define NID_magma_ctr 1188 -- --#define SN_magma_ofb "magma-ofb" --#define NID_magma_ofb 1189 -- --#define SN_magma_cbc "magma-cbc" --#define NID_magma_cbc 1190 -- --#define SN_magma_cfb "magma-cfb" --#define NID_magma_cfb 1191 -- --#define SN_magma_mac "magma-mac" --#define NID_magma_mac 1192 -- --#define SN_camellia_128_cbc "CAMELLIA-128-CBC" --#define LN_camellia_128_cbc "camellia-128-cbc" --#define NID_camellia_128_cbc 751 --#define OBJ_camellia_128_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,2L -- --#define SN_camellia_192_cbc "CAMELLIA-192-CBC" --#define LN_camellia_192_cbc "camellia-192-cbc" --#define NID_camellia_192_cbc 752 --#define OBJ_camellia_192_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,3L -- --#define SN_camellia_256_cbc "CAMELLIA-256-CBC" --#define LN_camellia_256_cbc "camellia-256-cbc" --#define NID_camellia_256_cbc 753 --#define OBJ_camellia_256_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,4L -- --#define SN_id_camellia128_wrap "id-camellia128-wrap" --#define NID_id_camellia128_wrap 907 --#define OBJ_id_camellia128_wrap 1L,2L,392L,200011L,61L,1L,1L,3L,2L -- --#define SN_id_camellia192_wrap "id-camellia192-wrap" --#define NID_id_camellia192_wrap 908 --#define OBJ_id_camellia192_wrap 1L,2L,392L,200011L,61L,1L,1L,3L,3L -- --#define SN_id_camellia256_wrap "id-camellia256-wrap" --#define NID_id_camellia256_wrap 909 --#define OBJ_id_camellia256_wrap 1L,2L,392L,200011L,61L,1L,1L,3L,4L -- --#define OBJ_ntt_ds 0L,3L,4401L,5L -- --#define OBJ_camellia OBJ_ntt_ds,3L,1L,9L -- --#define SN_camellia_128_ecb "CAMELLIA-128-ECB" --#define LN_camellia_128_ecb "camellia-128-ecb" --#define NID_camellia_128_ecb 754 --#define OBJ_camellia_128_ecb OBJ_camellia,1L -- --#define SN_camellia_128_ofb128 "CAMELLIA-128-OFB" --#define LN_camellia_128_ofb128 "camellia-128-ofb" --#define NID_camellia_128_ofb128 766 --#define OBJ_camellia_128_ofb128 OBJ_camellia,3L -- --#define SN_camellia_128_cfb128 "CAMELLIA-128-CFB" --#define LN_camellia_128_cfb128 "camellia-128-cfb" --#define NID_camellia_128_cfb128 757 --#define OBJ_camellia_128_cfb128 OBJ_camellia,4L -- --#define SN_camellia_128_gcm "CAMELLIA-128-GCM" --#define LN_camellia_128_gcm "camellia-128-gcm" --#define NID_camellia_128_gcm 961 --#define OBJ_camellia_128_gcm OBJ_camellia,6L -- --#define SN_camellia_128_ccm "CAMELLIA-128-CCM" --#define LN_camellia_128_ccm "camellia-128-ccm" --#define NID_camellia_128_ccm 962 --#define OBJ_camellia_128_ccm OBJ_camellia,7L -- --#define SN_camellia_128_ctr "CAMELLIA-128-CTR" --#define LN_camellia_128_ctr "camellia-128-ctr" --#define NID_camellia_128_ctr 963 --#define OBJ_camellia_128_ctr OBJ_camellia,9L -- --#define SN_camellia_128_cmac "CAMELLIA-128-CMAC" --#define LN_camellia_128_cmac "camellia-128-cmac" --#define NID_camellia_128_cmac 964 --#define OBJ_camellia_128_cmac OBJ_camellia,10L -- --#define SN_camellia_192_ecb "CAMELLIA-192-ECB" --#define LN_camellia_192_ecb "camellia-192-ecb" --#define NID_camellia_192_ecb 755 --#define OBJ_camellia_192_ecb OBJ_camellia,21L -- --#define SN_camellia_192_ofb128 "CAMELLIA-192-OFB" --#define LN_camellia_192_ofb128 "camellia-192-ofb" --#define NID_camellia_192_ofb128 767 --#define OBJ_camellia_192_ofb128 OBJ_camellia,23L -- --#define SN_camellia_192_cfb128 "CAMELLIA-192-CFB" --#define LN_camellia_192_cfb128 "camellia-192-cfb" --#define NID_camellia_192_cfb128 758 --#define OBJ_camellia_192_cfb128 OBJ_camellia,24L -- --#define SN_camellia_192_gcm "CAMELLIA-192-GCM" --#define LN_camellia_192_gcm "camellia-192-gcm" --#define NID_camellia_192_gcm 965 --#define OBJ_camellia_192_gcm OBJ_camellia,26L -- --#define SN_camellia_192_ccm "CAMELLIA-192-CCM" --#define LN_camellia_192_ccm "camellia-192-ccm" --#define NID_camellia_192_ccm 966 --#define OBJ_camellia_192_ccm OBJ_camellia,27L -- --#define SN_camellia_192_ctr "CAMELLIA-192-CTR" --#define LN_camellia_192_ctr "camellia-192-ctr" --#define NID_camellia_192_ctr 967 --#define OBJ_camellia_192_ctr OBJ_camellia,29L -- --#define SN_camellia_192_cmac "CAMELLIA-192-CMAC" --#define LN_camellia_192_cmac "camellia-192-cmac" --#define NID_camellia_192_cmac 968 --#define OBJ_camellia_192_cmac OBJ_camellia,30L -- --#define SN_camellia_256_ecb "CAMELLIA-256-ECB" --#define LN_camellia_256_ecb "camellia-256-ecb" --#define NID_camellia_256_ecb 756 --#define OBJ_camellia_256_ecb OBJ_camellia,41L -- --#define SN_camellia_256_ofb128 "CAMELLIA-256-OFB" --#define LN_camellia_256_ofb128 "camellia-256-ofb" --#define NID_camellia_256_ofb128 768 --#define OBJ_camellia_256_ofb128 OBJ_camellia,43L -- --#define SN_camellia_256_cfb128 "CAMELLIA-256-CFB" --#define LN_camellia_256_cfb128 "camellia-256-cfb" --#define NID_camellia_256_cfb128 759 --#define OBJ_camellia_256_cfb128 OBJ_camellia,44L -- --#define SN_camellia_256_gcm "CAMELLIA-256-GCM" --#define LN_camellia_256_gcm "camellia-256-gcm" --#define NID_camellia_256_gcm 969 --#define OBJ_camellia_256_gcm OBJ_camellia,46L -- --#define SN_camellia_256_ccm "CAMELLIA-256-CCM" --#define LN_camellia_256_ccm "camellia-256-ccm" --#define NID_camellia_256_ccm 970 --#define OBJ_camellia_256_ccm OBJ_camellia,47L -- --#define SN_camellia_256_ctr "CAMELLIA-256-CTR" --#define LN_camellia_256_ctr "camellia-256-ctr" --#define NID_camellia_256_ctr 971 --#define OBJ_camellia_256_ctr OBJ_camellia,49L -- --#define SN_camellia_256_cmac "CAMELLIA-256-CMAC" --#define LN_camellia_256_cmac "camellia-256-cmac" --#define NID_camellia_256_cmac 972 --#define OBJ_camellia_256_cmac OBJ_camellia,50L -- --#define SN_camellia_128_cfb1 "CAMELLIA-128-CFB1" --#define LN_camellia_128_cfb1 "camellia-128-cfb1" --#define NID_camellia_128_cfb1 760 -- --#define SN_camellia_192_cfb1 "CAMELLIA-192-CFB1" --#define LN_camellia_192_cfb1 "camellia-192-cfb1" --#define NID_camellia_192_cfb1 761 -- --#define SN_camellia_256_cfb1 "CAMELLIA-256-CFB1" --#define LN_camellia_256_cfb1 "camellia-256-cfb1" --#define NID_camellia_256_cfb1 762 -- --#define SN_camellia_128_cfb8 "CAMELLIA-128-CFB8" --#define LN_camellia_128_cfb8 "camellia-128-cfb8" --#define NID_camellia_128_cfb8 763 -- --#define SN_camellia_192_cfb8 "CAMELLIA-192-CFB8" --#define LN_camellia_192_cfb8 "camellia-192-cfb8" --#define NID_camellia_192_cfb8 764 -- --#define SN_camellia_256_cfb8 "CAMELLIA-256-CFB8" --#define LN_camellia_256_cfb8 "camellia-256-cfb8" --#define NID_camellia_256_cfb8 765 -- --#define OBJ_aria 1L,2L,410L,200046L,1L,1L -- --#define SN_aria_128_ecb "ARIA-128-ECB" --#define LN_aria_128_ecb "aria-128-ecb" --#define NID_aria_128_ecb 1065 --#define OBJ_aria_128_ecb OBJ_aria,1L -- --#define SN_aria_128_cbc "ARIA-128-CBC" --#define LN_aria_128_cbc "aria-128-cbc" --#define NID_aria_128_cbc 1066 --#define OBJ_aria_128_cbc OBJ_aria,2L -- --#define SN_aria_128_cfb128 "ARIA-128-CFB" --#define LN_aria_128_cfb128 "aria-128-cfb" --#define NID_aria_128_cfb128 1067 --#define OBJ_aria_128_cfb128 OBJ_aria,3L -- --#define SN_aria_128_ofb128 "ARIA-128-OFB" --#define LN_aria_128_ofb128 "aria-128-ofb" --#define NID_aria_128_ofb128 1068 --#define OBJ_aria_128_ofb128 OBJ_aria,4L -- --#define SN_aria_128_ctr "ARIA-128-CTR" --#define LN_aria_128_ctr "aria-128-ctr" --#define NID_aria_128_ctr 1069 --#define OBJ_aria_128_ctr OBJ_aria,5L -- --#define SN_aria_192_ecb "ARIA-192-ECB" --#define LN_aria_192_ecb "aria-192-ecb" --#define NID_aria_192_ecb 1070 --#define OBJ_aria_192_ecb OBJ_aria,6L -- --#define SN_aria_192_cbc "ARIA-192-CBC" --#define LN_aria_192_cbc "aria-192-cbc" --#define NID_aria_192_cbc 1071 --#define OBJ_aria_192_cbc OBJ_aria,7L -- --#define SN_aria_192_cfb128 "ARIA-192-CFB" --#define LN_aria_192_cfb128 "aria-192-cfb" --#define NID_aria_192_cfb128 1072 --#define OBJ_aria_192_cfb128 OBJ_aria,8L -- --#define SN_aria_192_ofb128 "ARIA-192-OFB" --#define LN_aria_192_ofb128 "aria-192-ofb" --#define NID_aria_192_ofb128 1073 --#define OBJ_aria_192_ofb128 OBJ_aria,9L -- --#define SN_aria_192_ctr "ARIA-192-CTR" --#define LN_aria_192_ctr "aria-192-ctr" --#define NID_aria_192_ctr 1074 --#define OBJ_aria_192_ctr OBJ_aria,10L -- --#define SN_aria_256_ecb "ARIA-256-ECB" --#define LN_aria_256_ecb "aria-256-ecb" --#define NID_aria_256_ecb 1075 --#define OBJ_aria_256_ecb OBJ_aria,11L -- --#define SN_aria_256_cbc "ARIA-256-CBC" --#define LN_aria_256_cbc "aria-256-cbc" --#define NID_aria_256_cbc 1076 --#define OBJ_aria_256_cbc OBJ_aria,12L -- --#define SN_aria_256_cfb128 "ARIA-256-CFB" --#define LN_aria_256_cfb128 "aria-256-cfb" --#define NID_aria_256_cfb128 1077 --#define OBJ_aria_256_cfb128 OBJ_aria,13L -- --#define SN_aria_256_ofb128 "ARIA-256-OFB" --#define LN_aria_256_ofb128 "aria-256-ofb" --#define NID_aria_256_ofb128 1078 --#define OBJ_aria_256_ofb128 OBJ_aria,14L -- --#define SN_aria_256_ctr "ARIA-256-CTR" --#define LN_aria_256_ctr "aria-256-ctr" --#define NID_aria_256_ctr 1079 --#define OBJ_aria_256_ctr OBJ_aria,15L -- --#define SN_aria_128_cfb1 "ARIA-128-CFB1" --#define LN_aria_128_cfb1 "aria-128-cfb1" --#define NID_aria_128_cfb1 1080 -- --#define SN_aria_192_cfb1 "ARIA-192-CFB1" --#define LN_aria_192_cfb1 "aria-192-cfb1" --#define NID_aria_192_cfb1 1081 -- --#define SN_aria_256_cfb1 "ARIA-256-CFB1" --#define LN_aria_256_cfb1 "aria-256-cfb1" --#define NID_aria_256_cfb1 1082 -- --#define SN_aria_128_cfb8 "ARIA-128-CFB8" --#define LN_aria_128_cfb8 "aria-128-cfb8" --#define NID_aria_128_cfb8 1083 -- --#define SN_aria_192_cfb8 "ARIA-192-CFB8" --#define LN_aria_192_cfb8 "aria-192-cfb8" --#define NID_aria_192_cfb8 1084 -- --#define SN_aria_256_cfb8 "ARIA-256-CFB8" --#define LN_aria_256_cfb8 "aria-256-cfb8" --#define NID_aria_256_cfb8 1085 -- --#define SN_aria_128_ccm "ARIA-128-CCM" --#define LN_aria_128_ccm "aria-128-ccm" --#define NID_aria_128_ccm 1120 --#define OBJ_aria_128_ccm OBJ_aria,37L -- --#define SN_aria_192_ccm "ARIA-192-CCM" --#define LN_aria_192_ccm "aria-192-ccm" --#define NID_aria_192_ccm 1121 --#define OBJ_aria_192_ccm OBJ_aria,38L -- --#define SN_aria_256_ccm "ARIA-256-CCM" --#define LN_aria_256_ccm "aria-256-ccm" --#define NID_aria_256_ccm 1122 --#define OBJ_aria_256_ccm OBJ_aria,39L -- --#define SN_aria_128_gcm "ARIA-128-GCM" --#define LN_aria_128_gcm "aria-128-gcm" --#define NID_aria_128_gcm 1123 --#define OBJ_aria_128_gcm OBJ_aria,34L -- --#define SN_aria_192_gcm "ARIA-192-GCM" --#define LN_aria_192_gcm "aria-192-gcm" --#define NID_aria_192_gcm 1124 --#define OBJ_aria_192_gcm OBJ_aria,35L -- --#define SN_aria_256_gcm "ARIA-256-GCM" --#define LN_aria_256_gcm "aria-256-gcm" --#define NID_aria_256_gcm 1125 --#define OBJ_aria_256_gcm OBJ_aria,36L -- --#define SN_kisa "KISA" --#define LN_kisa "kisa" --#define NID_kisa 773 --#define OBJ_kisa OBJ_member_body,410L,200004L -- --#define SN_seed_ecb "SEED-ECB" --#define LN_seed_ecb "seed-ecb" --#define NID_seed_ecb 776 --#define OBJ_seed_ecb OBJ_kisa,1L,3L -- --#define SN_seed_cbc "SEED-CBC" --#define LN_seed_cbc "seed-cbc" --#define NID_seed_cbc 777 --#define OBJ_seed_cbc OBJ_kisa,1L,4L -- --#define SN_seed_cfb128 "SEED-CFB" --#define LN_seed_cfb128 "seed-cfb" --#define NID_seed_cfb128 779 --#define OBJ_seed_cfb128 OBJ_kisa,1L,5L -- --#define SN_seed_ofb128 "SEED-OFB" --#define LN_seed_ofb128 "seed-ofb" --#define NID_seed_ofb128 778 --#define OBJ_seed_ofb128 OBJ_kisa,1L,6L -- --#define SN_sm4_ecb "SM4-ECB" --#define LN_sm4_ecb "sm4-ecb" --#define NID_sm4_ecb 1133 --#define OBJ_sm4_ecb OBJ_sm_scheme,104L,1L -- --#define SN_sm4_cbc "SM4-CBC" --#define LN_sm4_cbc "sm4-cbc" --#define NID_sm4_cbc 1134 --#define OBJ_sm4_cbc OBJ_sm_scheme,104L,2L -- --#define SN_sm4_ofb128 "SM4-OFB" --#define LN_sm4_ofb128 "sm4-ofb" --#define NID_sm4_ofb128 1135 --#define OBJ_sm4_ofb128 OBJ_sm_scheme,104L,3L -- --#define SN_sm4_cfb128 "SM4-CFB" --#define LN_sm4_cfb128 "sm4-cfb" --#define NID_sm4_cfb128 1137 --#define OBJ_sm4_cfb128 OBJ_sm_scheme,104L,4L -- --#define SN_sm4_cfb1 "SM4-CFB1" --#define LN_sm4_cfb1 "sm4-cfb1" --#define NID_sm4_cfb1 1136 --#define OBJ_sm4_cfb1 OBJ_sm_scheme,104L,5L -- --#define SN_sm4_cfb8 "SM4-CFB8" --#define LN_sm4_cfb8 "sm4-cfb8" --#define NID_sm4_cfb8 1138 --#define OBJ_sm4_cfb8 OBJ_sm_scheme,104L,6L -- --#define SN_sm4_ctr "SM4-CTR" --#define LN_sm4_ctr "sm4-ctr" --#define NID_sm4_ctr 1139 --#define OBJ_sm4_ctr OBJ_sm_scheme,104L,7L -- --#define SN_hmac "HMAC" --#define LN_hmac "hmac" --#define NID_hmac 855 -- --#define SN_cmac "CMAC" --#define LN_cmac "cmac" --#define NID_cmac 894 -- --#define SN_rc4_hmac_md5 "RC4-HMAC-MD5" --#define LN_rc4_hmac_md5 "rc4-hmac-md5" --#define NID_rc4_hmac_md5 915 -- --#define SN_aes_128_cbc_hmac_sha1 "AES-128-CBC-HMAC-SHA1" --#define LN_aes_128_cbc_hmac_sha1 "aes-128-cbc-hmac-sha1" --#define NID_aes_128_cbc_hmac_sha1 916 -- --#define SN_aes_192_cbc_hmac_sha1 "AES-192-CBC-HMAC-SHA1" --#define LN_aes_192_cbc_hmac_sha1 "aes-192-cbc-hmac-sha1" --#define NID_aes_192_cbc_hmac_sha1 917 -- --#define SN_aes_256_cbc_hmac_sha1 "AES-256-CBC-HMAC-SHA1" --#define LN_aes_256_cbc_hmac_sha1 "aes-256-cbc-hmac-sha1" --#define NID_aes_256_cbc_hmac_sha1 918 -- --#define SN_aes_128_cbc_hmac_sha256 "AES-128-CBC-HMAC-SHA256" --#define LN_aes_128_cbc_hmac_sha256 "aes-128-cbc-hmac-sha256" --#define NID_aes_128_cbc_hmac_sha256 948 -- --#define SN_aes_192_cbc_hmac_sha256 "AES-192-CBC-HMAC-SHA256" --#define LN_aes_192_cbc_hmac_sha256 "aes-192-cbc-hmac-sha256" --#define NID_aes_192_cbc_hmac_sha256 949 -- --#define SN_aes_256_cbc_hmac_sha256 "AES-256-CBC-HMAC-SHA256" --#define LN_aes_256_cbc_hmac_sha256 "aes-256-cbc-hmac-sha256" --#define NID_aes_256_cbc_hmac_sha256 950 -- --#define SN_chacha20_poly1305 "ChaCha20-Poly1305" --#define LN_chacha20_poly1305 "chacha20-poly1305" --#define NID_chacha20_poly1305 1018 -- --#define SN_chacha20 "ChaCha20" --#define LN_chacha20 "chacha20" --#define NID_chacha20 1019 -- --#define SN_dhpublicnumber "dhpublicnumber" --#define LN_dhpublicnumber "X9.42 DH" --#define NID_dhpublicnumber 920 --#define OBJ_dhpublicnumber OBJ_ISO_US,10046L,2L,1L -- --#define SN_brainpoolP160r1 "brainpoolP160r1" --#define NID_brainpoolP160r1 921 --#define OBJ_brainpoolP160r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,1L -- --#define SN_brainpoolP160t1 "brainpoolP160t1" --#define NID_brainpoolP160t1 922 --#define OBJ_brainpoolP160t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,2L -- --#define SN_brainpoolP192r1 "brainpoolP192r1" --#define NID_brainpoolP192r1 923 --#define OBJ_brainpoolP192r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,3L -- --#define SN_brainpoolP192t1 "brainpoolP192t1" --#define NID_brainpoolP192t1 924 --#define OBJ_brainpoolP192t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,4L -- --#define SN_brainpoolP224r1 "brainpoolP224r1" --#define NID_brainpoolP224r1 925 --#define OBJ_brainpoolP224r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,5L -- --#define SN_brainpoolP224t1 "brainpoolP224t1" --#define NID_brainpoolP224t1 926 --#define OBJ_brainpoolP224t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,6L -- --#define SN_brainpoolP256r1 "brainpoolP256r1" --#define NID_brainpoolP256r1 927 --#define OBJ_brainpoolP256r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,7L -- --#define SN_brainpoolP256t1 "brainpoolP256t1" --#define NID_brainpoolP256t1 928 --#define OBJ_brainpoolP256t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,8L -- --#define SN_brainpoolP320r1 "brainpoolP320r1" --#define NID_brainpoolP320r1 929 --#define OBJ_brainpoolP320r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,9L -- --#define SN_brainpoolP320t1 "brainpoolP320t1" --#define NID_brainpoolP320t1 930 --#define OBJ_brainpoolP320t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,10L -- --#define SN_brainpoolP384r1 "brainpoolP384r1" --#define NID_brainpoolP384r1 931 --#define OBJ_brainpoolP384r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,11L -- --#define SN_brainpoolP384t1 "brainpoolP384t1" --#define NID_brainpoolP384t1 932 --#define OBJ_brainpoolP384t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,12L -- --#define SN_brainpoolP512r1 "brainpoolP512r1" --#define NID_brainpoolP512r1 933 --#define OBJ_brainpoolP512r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,13L -- --#define SN_brainpoolP512t1 "brainpoolP512t1" --#define NID_brainpoolP512t1 934 --#define OBJ_brainpoolP512t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,14L -- --#define OBJ_x9_63_scheme 1L,3L,133L,16L,840L,63L,0L -- --#define OBJ_secg_scheme OBJ_certicom_arc,1L -- --#define SN_dhSinglePass_stdDH_sha1kdf_scheme "dhSinglePass-stdDH-sha1kdf-scheme" --#define NID_dhSinglePass_stdDH_sha1kdf_scheme 936 --#define OBJ_dhSinglePass_stdDH_sha1kdf_scheme OBJ_x9_63_scheme,2L -- --#define SN_dhSinglePass_stdDH_sha224kdf_scheme "dhSinglePass-stdDH-sha224kdf-scheme" --#define NID_dhSinglePass_stdDH_sha224kdf_scheme 937 --#define OBJ_dhSinglePass_stdDH_sha224kdf_scheme OBJ_secg_scheme,11L,0L -- --#define SN_dhSinglePass_stdDH_sha256kdf_scheme "dhSinglePass-stdDH-sha256kdf-scheme" --#define NID_dhSinglePass_stdDH_sha256kdf_scheme 938 --#define OBJ_dhSinglePass_stdDH_sha256kdf_scheme OBJ_secg_scheme,11L,1L -- --#define SN_dhSinglePass_stdDH_sha384kdf_scheme "dhSinglePass-stdDH-sha384kdf-scheme" --#define NID_dhSinglePass_stdDH_sha384kdf_scheme 939 --#define OBJ_dhSinglePass_stdDH_sha384kdf_scheme OBJ_secg_scheme,11L,2L -- --#define SN_dhSinglePass_stdDH_sha512kdf_scheme "dhSinglePass-stdDH-sha512kdf-scheme" --#define NID_dhSinglePass_stdDH_sha512kdf_scheme 940 --#define OBJ_dhSinglePass_stdDH_sha512kdf_scheme OBJ_secg_scheme,11L,3L -- --#define SN_dhSinglePass_cofactorDH_sha1kdf_scheme "dhSinglePass-cofactorDH-sha1kdf-scheme" --#define NID_dhSinglePass_cofactorDH_sha1kdf_scheme 941 --#define OBJ_dhSinglePass_cofactorDH_sha1kdf_scheme OBJ_x9_63_scheme,3L -- --#define SN_dhSinglePass_cofactorDH_sha224kdf_scheme "dhSinglePass-cofactorDH-sha224kdf-scheme" --#define NID_dhSinglePass_cofactorDH_sha224kdf_scheme 942 --#define OBJ_dhSinglePass_cofactorDH_sha224kdf_scheme OBJ_secg_scheme,14L,0L -- --#define SN_dhSinglePass_cofactorDH_sha256kdf_scheme "dhSinglePass-cofactorDH-sha256kdf-scheme" --#define NID_dhSinglePass_cofactorDH_sha256kdf_scheme 943 --#define OBJ_dhSinglePass_cofactorDH_sha256kdf_scheme OBJ_secg_scheme,14L,1L -- --#define SN_dhSinglePass_cofactorDH_sha384kdf_scheme "dhSinglePass-cofactorDH-sha384kdf-scheme" --#define NID_dhSinglePass_cofactorDH_sha384kdf_scheme 944 --#define OBJ_dhSinglePass_cofactorDH_sha384kdf_scheme OBJ_secg_scheme,14L,2L -- --#define SN_dhSinglePass_cofactorDH_sha512kdf_scheme "dhSinglePass-cofactorDH-sha512kdf-scheme" --#define NID_dhSinglePass_cofactorDH_sha512kdf_scheme 945 --#define OBJ_dhSinglePass_cofactorDH_sha512kdf_scheme OBJ_secg_scheme,14L,3L -- --#define SN_dh_std_kdf "dh-std-kdf" --#define NID_dh_std_kdf 946 -- --#define SN_dh_cofactor_kdf "dh-cofactor-kdf" --#define NID_dh_cofactor_kdf 947 -- --#define SN_ct_precert_scts "ct_precert_scts" --#define LN_ct_precert_scts "CT Precertificate SCTs" --#define NID_ct_precert_scts 951 --#define OBJ_ct_precert_scts 1L,3L,6L,1L,4L,1L,11129L,2L,4L,2L -- --#define SN_ct_precert_poison "ct_precert_poison" --#define LN_ct_precert_poison "CT Precertificate Poison" --#define NID_ct_precert_poison 952 --#define OBJ_ct_precert_poison 1L,3L,6L,1L,4L,1L,11129L,2L,4L,3L -- --#define SN_ct_precert_signer "ct_precert_signer" --#define LN_ct_precert_signer "CT Precertificate Signer" --#define NID_ct_precert_signer 953 --#define OBJ_ct_precert_signer 1L,3L,6L,1L,4L,1L,11129L,2L,4L,4L -- --#define SN_ct_cert_scts "ct_cert_scts" --#define LN_ct_cert_scts "CT Certificate SCTs" --#define NID_ct_cert_scts 954 --#define OBJ_ct_cert_scts 1L,3L,6L,1L,4L,1L,11129L,2L,4L,5L -- --#define SN_jurisdictionLocalityName "jurisdictionL" --#define LN_jurisdictionLocalityName "jurisdictionLocalityName" --#define NID_jurisdictionLocalityName 955 --#define OBJ_jurisdictionLocalityName 1L,3L,6L,1L,4L,1L,311L,60L,2L,1L,1L -- --#define SN_jurisdictionStateOrProvinceName "jurisdictionST" --#define LN_jurisdictionStateOrProvinceName "jurisdictionStateOrProvinceName" --#define NID_jurisdictionStateOrProvinceName 956 --#define OBJ_jurisdictionStateOrProvinceName 1L,3L,6L,1L,4L,1L,311L,60L,2L,1L,2L -- --#define SN_jurisdictionCountryName "jurisdictionC" --#define LN_jurisdictionCountryName "jurisdictionCountryName" --#define NID_jurisdictionCountryName 957 --#define OBJ_jurisdictionCountryName 1L,3L,6L,1L,4L,1L,311L,60L,2L,1L,3L -- --#define SN_id_scrypt "id-scrypt" --#define LN_id_scrypt "scrypt" --#define NID_id_scrypt 973 --#define OBJ_id_scrypt 1L,3L,6L,1L,4L,1L,11591L,4L,11L -- --#define SN_tls1_prf "TLS1-PRF" --#define LN_tls1_prf "tls1-prf" --#define NID_tls1_prf 1021 -- --#define SN_hkdf "HKDF" --#define LN_hkdf "hkdf" --#define NID_hkdf 1036 -- --#define SN_id_pkinit "id-pkinit" --#define NID_id_pkinit 1031 --#define OBJ_id_pkinit 1L,3L,6L,1L,5L,2L,3L -- --#define SN_pkInitClientAuth "pkInitClientAuth" --#define LN_pkInitClientAuth "PKINIT Client Auth" --#define NID_pkInitClientAuth 1032 --#define OBJ_pkInitClientAuth OBJ_id_pkinit,4L -- --#define SN_pkInitKDC "pkInitKDC" --#define LN_pkInitKDC "Signing KDC Response" --#define NID_pkInitKDC 1033 --#define OBJ_pkInitKDC OBJ_id_pkinit,5L -- --#define SN_X25519 "X25519" --#define NID_X25519 1034 --#define OBJ_X25519 1L,3L,101L,110L -- --#define SN_X448 "X448" --#define NID_X448 1035 --#define OBJ_X448 1L,3L,101L,111L -- --#define SN_ED25519 "ED25519" --#define NID_ED25519 1087 --#define OBJ_ED25519 1L,3L,101L,112L -- --#define SN_ED448 "ED448" --#define NID_ED448 1088 --#define OBJ_ED448 1L,3L,101L,113L -- --#define SN_kx_rsa "KxRSA" --#define LN_kx_rsa "kx-rsa" --#define NID_kx_rsa 1037 -- --#define SN_kx_ecdhe "KxECDHE" --#define LN_kx_ecdhe "kx-ecdhe" --#define NID_kx_ecdhe 1038 -- --#define SN_kx_dhe "KxDHE" --#define LN_kx_dhe "kx-dhe" --#define NID_kx_dhe 1039 -- --#define SN_kx_ecdhe_psk "KxECDHE-PSK" --#define LN_kx_ecdhe_psk "kx-ecdhe-psk" --#define NID_kx_ecdhe_psk 1040 -- --#define SN_kx_dhe_psk "KxDHE-PSK" --#define LN_kx_dhe_psk "kx-dhe-psk" --#define NID_kx_dhe_psk 1041 -- --#define SN_kx_rsa_psk "KxRSA_PSK" --#define LN_kx_rsa_psk "kx-rsa-psk" --#define NID_kx_rsa_psk 1042 -- --#define SN_kx_psk "KxPSK" --#define LN_kx_psk "kx-psk" --#define NID_kx_psk 1043 -- --#define SN_kx_srp "KxSRP" --#define LN_kx_srp "kx-srp" --#define NID_kx_srp 1044 -- --#define SN_kx_gost "KxGOST" --#define LN_kx_gost "kx-gost" --#define NID_kx_gost 1045 -- --#define SN_kx_any "KxANY" --#define LN_kx_any "kx-any" --#define NID_kx_any 1063 -- --#define SN_auth_rsa "AuthRSA" --#define LN_auth_rsa "auth-rsa" --#define NID_auth_rsa 1046 -- --#define SN_auth_ecdsa "AuthECDSA" --#define LN_auth_ecdsa "auth-ecdsa" --#define NID_auth_ecdsa 1047 -- --#define SN_auth_psk "AuthPSK" --#define LN_auth_psk "auth-psk" --#define NID_auth_psk 1048 -- --#define SN_auth_dss "AuthDSS" --#define LN_auth_dss "auth-dss" --#define NID_auth_dss 1049 -- --#define SN_auth_gost01 "AuthGOST01" --#define LN_auth_gost01 "auth-gost01" --#define NID_auth_gost01 1050 -- --#define SN_auth_gost12 "AuthGOST12" --#define LN_auth_gost12 "auth-gost12" --#define NID_auth_gost12 1051 -- --#define SN_auth_srp "AuthSRP" --#define LN_auth_srp "auth-srp" --#define NID_auth_srp 1052 -- --#define SN_auth_null "AuthNULL" --#define LN_auth_null "auth-null" --#define NID_auth_null 1053 -- --#define SN_auth_any "AuthANY" --#define LN_auth_any "auth-any" --#define NID_auth_any 1064 -- --#define SN_poly1305 "Poly1305" --#define LN_poly1305 "poly1305" --#define NID_poly1305 1061 -- --#define SN_siphash "SipHash" --#define LN_siphash "siphash" --#define NID_siphash 1062 -- --#define SN_ffdhe2048 "ffdhe2048" --#define NID_ffdhe2048 1126 -- --#define SN_ffdhe3072 "ffdhe3072" --#define NID_ffdhe3072 1127 -- --#define SN_ffdhe4096 "ffdhe4096" --#define NID_ffdhe4096 1128 -- --#define SN_ffdhe6144 "ffdhe6144" --#define NID_ffdhe6144 1129 -- --#define SN_ffdhe8192 "ffdhe8192" --#define NID_ffdhe8192 1130 -- --#define SN_ISO_UA "ISO-UA" --#define NID_ISO_UA 1150 --#define OBJ_ISO_UA OBJ_member_body,804L -- --#define SN_ua_pki "ua-pki" --#define NID_ua_pki 1151 --#define OBJ_ua_pki OBJ_ISO_UA,2L,1L,1L,1L -- --#define SN_dstu28147 "dstu28147" --#define LN_dstu28147 "DSTU Gost 28147-2009" --#define NID_dstu28147 1152 --#define OBJ_dstu28147 OBJ_ua_pki,1L,1L,1L -- --#define SN_dstu28147_ofb "dstu28147-ofb" --#define LN_dstu28147_ofb "DSTU Gost 28147-2009 OFB mode" --#define NID_dstu28147_ofb 1153 --#define OBJ_dstu28147_ofb OBJ_dstu28147,2L -- --#define SN_dstu28147_cfb "dstu28147-cfb" --#define LN_dstu28147_cfb "DSTU Gost 28147-2009 CFB mode" --#define NID_dstu28147_cfb 1154 --#define OBJ_dstu28147_cfb OBJ_dstu28147,3L -- --#define SN_dstu28147_wrap "dstu28147-wrap" --#define LN_dstu28147_wrap "DSTU Gost 28147-2009 key wrap" --#define NID_dstu28147_wrap 1155 --#define OBJ_dstu28147_wrap OBJ_dstu28147,5L -- --#define SN_hmacWithDstu34311 "hmacWithDstu34311" --#define LN_hmacWithDstu34311 "HMAC DSTU Gost 34311-95" --#define NID_hmacWithDstu34311 1156 --#define OBJ_hmacWithDstu34311 OBJ_ua_pki,1L,1L,2L -- --#define SN_dstu34311 "dstu34311" --#define LN_dstu34311 "DSTU Gost 34311-95" --#define NID_dstu34311 1157 --#define OBJ_dstu34311 OBJ_ua_pki,1L,2L,1L -- --#define SN_dstu4145le "dstu4145le" --#define LN_dstu4145le "DSTU 4145-2002 little endian" --#define NID_dstu4145le 1158 --#define OBJ_dstu4145le OBJ_ua_pki,1L,3L,1L,1L -- --#define SN_dstu4145be "dstu4145be" --#define LN_dstu4145be "DSTU 4145-2002 big endian" --#define NID_dstu4145be 1159 --#define OBJ_dstu4145be OBJ_dstu4145le,1L,1L -- --#define SN_uacurve0 "uacurve0" --#define LN_uacurve0 "DSTU curve 0" --#define NID_uacurve0 1160 --#define OBJ_uacurve0 OBJ_dstu4145le,2L,0L -- --#define SN_uacurve1 "uacurve1" --#define LN_uacurve1 "DSTU curve 1" --#define NID_uacurve1 1161 --#define OBJ_uacurve1 OBJ_dstu4145le,2L,1L -- --#define SN_uacurve2 "uacurve2" --#define LN_uacurve2 "DSTU curve 2" --#define NID_uacurve2 1162 --#define OBJ_uacurve2 OBJ_dstu4145le,2L,2L -- --#define SN_uacurve3 "uacurve3" --#define LN_uacurve3 "DSTU curve 3" --#define NID_uacurve3 1163 --#define OBJ_uacurve3 OBJ_dstu4145le,2L,3L -- --#define SN_uacurve4 "uacurve4" --#define LN_uacurve4 "DSTU curve 4" --#define NID_uacurve4 1164 --#define OBJ_uacurve4 OBJ_dstu4145le,2L,4L -- --#define SN_uacurve5 "uacurve5" --#define LN_uacurve5 "DSTU curve 5" --#define NID_uacurve5 1165 --#define OBJ_uacurve5 OBJ_dstu4145le,2L,5L -- --#define SN_uacurve6 "uacurve6" --#define LN_uacurve6 "DSTU curve 6" --#define NID_uacurve6 1166 --#define OBJ_uacurve6 OBJ_dstu4145le,2L,6L -- --#define SN_uacurve7 "uacurve7" --#define LN_uacurve7 "DSTU curve 7" --#define NID_uacurve7 1167 --#define OBJ_uacurve7 OBJ_dstu4145le,2L,7L -- --#define SN_uacurve8 "uacurve8" --#define LN_uacurve8 "DSTU curve 8" --#define NID_uacurve8 1168 --#define OBJ_uacurve8 OBJ_dstu4145le,2L,8L -- --#define SN_uacurve9 "uacurve9" --#define LN_uacurve9 "DSTU curve 9" --#define NID_uacurve9 1169 --#define OBJ_uacurve9 OBJ_dstu4145le,2L,9L -diff --git a/uadk_tool/include/openssl/objects.h b/uadk_tool/include/openssl/objects.h -deleted file mode 100644 -index 5e8b576..0000000 ---- a/uadk_tool/include/openssl/objects.h -+++ /dev/null -@@ -1,175 +0,0 @@ --/* -- * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_OBJECTS_H --# define HEADER_OBJECTS_H -- --# include --# include --# include --# include -- --# define OBJ_NAME_TYPE_UNDEF 0x00 --# define OBJ_NAME_TYPE_MD_METH 0x01 --# define OBJ_NAME_TYPE_CIPHER_METH 0x02 --# define OBJ_NAME_TYPE_PKEY_METH 0x03 --# define OBJ_NAME_TYPE_COMP_METH 0x04 --# define OBJ_NAME_TYPE_NUM 0x05 -- --# define OBJ_NAME_ALIAS 0x8000 -- --# define OBJ_BSEARCH_VALUE_ON_NOMATCH 0x01 --# define OBJ_BSEARCH_FIRST_VALUE_ON_MATCH 0x02 -- -- --#ifdef __cplusplus --extern "C" { --#endif -- --typedef struct obj_name_st { -- int type; -- int alias; -- const char *name; -- const char *data; --} OBJ_NAME; -- --# define OBJ_create_and_add_object(a,b,c) OBJ_create(a,b,c) -- --int OBJ_NAME_init(void); --int OBJ_NAME_new_index(unsigned long (*hash_func) (const char *), -- int (*cmp_func) (const char *, const char *), -- void (*free_func) (const char *, int, const char *)); --const char *OBJ_NAME_get(const char *name, int type); --int OBJ_NAME_add(const char *name, int type, const char *data); --int OBJ_NAME_remove(const char *name, int type); --void OBJ_NAME_cleanup(int type); /* -1 for everything */ --void OBJ_NAME_do_all(int type, void (*fn) (const OBJ_NAME *, void *arg), -- void *arg); --void OBJ_NAME_do_all_sorted(int type, -- void (*fn) (const OBJ_NAME *, void *arg), -- void *arg); -- --ASN1_OBJECT *OBJ_dup(const ASN1_OBJECT *o); --ASN1_OBJECT *OBJ_nid2obj(int n); --const char *OBJ_nid2ln(int n); --const char *OBJ_nid2sn(int n); --int OBJ_obj2nid(const ASN1_OBJECT *o); --ASN1_OBJECT *OBJ_txt2obj(const char *s, int no_name); --int OBJ_obj2txt(char *buf, int buf_len, const ASN1_OBJECT *a, int no_name); --int OBJ_txt2nid(const char *s); --int OBJ_ln2nid(const char *s); --int OBJ_sn2nid(const char *s); --int OBJ_cmp(const ASN1_OBJECT *a, const ASN1_OBJECT *b); --const void *OBJ_bsearch_(const void *key, const void *base, int num, int size, -- int (*cmp) (const void *, const void *)); --const void *OBJ_bsearch_ex_(const void *key, const void *base, int num, -- int size, -- int (*cmp) (const void *, const void *), -- int flags); -- --# define _DECLARE_OBJ_BSEARCH_CMP_FN(scope, type1, type2, nm) \ -- static int nm##_cmp_BSEARCH_CMP_FN(const void *, const void *); \ -- static int nm##_cmp(type1 const *, type2 const *); \ -- scope type2 * OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) -- --# define DECLARE_OBJ_BSEARCH_CMP_FN(type1, type2, cmp) \ -- _DECLARE_OBJ_BSEARCH_CMP_FN(static, type1, type2, cmp) --# define DECLARE_OBJ_BSEARCH_GLOBAL_CMP_FN(type1, type2, nm) \ -- type2 * OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) -- --/*- -- * Unsolved problem: if a type is actually a pointer type, like -- * nid_triple is, then its impossible to get a const where you need -- * it. Consider: -- * -- * typedef int nid_triple[3]; -- * const void *a_; -- * const nid_triple const *a = a_; -- * -- * The assignment discards a const because what you really want is: -- * -- * const int const * const *a = a_; -- * -- * But if you do that, you lose the fact that a is an array of 3 ints, -- * which breaks comparison functions. -- * -- * Thus we end up having to cast, sadly, or unpack the -- * declarations. Or, as I finally did in this case, declare nid_triple -- * to be a struct, which it should have been in the first place. -- * -- * Ben, August 2008. -- * -- * Also, strictly speaking not all types need be const, but handling -- * the non-constness means a lot of complication, and in practice -- * comparison routines do always not touch their arguments. -- */ -- --# define IMPLEMENT_OBJ_BSEARCH_CMP_FN(type1, type2, nm) \ -- static int nm##_cmp_BSEARCH_CMP_FN(const void *a_, const void *b_) \ -- { \ -- type1 const *a = a_; \ -- type2 const *b = b_; \ -- return nm##_cmp(a,b); \ -- } \ -- static type2 *OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) \ -- { \ -- return (type2 *)OBJ_bsearch_(key, base, num, sizeof(type2), \ -- nm##_cmp_BSEARCH_CMP_FN); \ -- } \ -- extern void dummy_prototype(void) -- --# define IMPLEMENT_OBJ_BSEARCH_GLOBAL_CMP_FN(type1, type2, nm) \ -- static int nm##_cmp_BSEARCH_CMP_FN(const void *a_, const void *b_) \ -- { \ -- type1 const *a = a_; \ -- type2 const *b = b_; \ -- return nm##_cmp(a,b); \ -- } \ -- type2 *OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) \ -- { \ -- return (type2 *)OBJ_bsearch_(key, base, num, sizeof(type2), \ -- nm##_cmp_BSEARCH_CMP_FN); \ -- } \ -- extern void dummy_prototype(void) -- --# define OBJ_bsearch(type1,key,type2,base,num,cmp) \ -- ((type2 *)OBJ_bsearch_(CHECKED_PTR_OF(type1,key),CHECKED_PTR_OF(type2,base), \ -- num,sizeof(type2), \ -- ((void)CHECKED_PTR_OF(type1,cmp##_type_1), \ -- (void)CHECKED_PTR_OF(type2,cmp##_type_2), \ -- cmp##_BSEARCH_CMP_FN))) -- --# define OBJ_bsearch_ex(type1,key,type2,base,num,cmp,flags) \ -- ((type2 *)OBJ_bsearch_ex_(CHECKED_PTR_OF(type1,key),CHECKED_PTR_OF(type2,base), \ -- num,sizeof(type2), \ -- ((void)CHECKED_PTR_OF(type1,cmp##_type_1), \ -- (void)type_2=CHECKED_PTR_OF(type2,cmp##_type_2), \ -- cmp##_BSEARCH_CMP_FN)),flags) -- --int OBJ_new_nid(int num); --int OBJ_add_object(const ASN1_OBJECT *obj); --int OBJ_create(const char *oid, const char *sn, const char *ln); --#if OPENSSL_API_COMPAT < 0x10100000L --# define OBJ_cleanup() while(0) continue --#endif --int OBJ_create_objects(BIO *in); -- --size_t OBJ_length(const ASN1_OBJECT *obj); --const unsigned char *OBJ_get0_data(const ASN1_OBJECT *obj); -- --int OBJ_find_sigid_algs(int signid, int *pdig_nid, int *ppkey_nid); --int OBJ_find_sigid_by_algs(int *psignid, int dig_nid, int pkey_nid); --int OBJ_add_sigid(int signid, int dig_id, int pkey_id); --void OBJ_sigid_free(void); -- -- --# ifdef __cplusplus --} --# endif --#endif -diff --git a/uadk_tool/include/openssl/objectserr.h b/uadk_tool/include/openssl/objectserr.h -deleted file mode 100644 -index 02e166f..0000000 ---- a/uadk_tool/include/openssl/objectserr.h -+++ /dev/null -@@ -1,42 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_OBJERR_H --# define HEADER_OBJERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_OBJ_strings(void); -- --/* -- * OBJ function codes. -- */ --# define OBJ_F_OBJ_ADD_OBJECT 105 --# define OBJ_F_OBJ_ADD_SIGID 107 --# define OBJ_F_OBJ_CREATE 100 --# define OBJ_F_OBJ_DUP 101 --# define OBJ_F_OBJ_NAME_NEW_INDEX 106 --# define OBJ_F_OBJ_NID2LN 102 --# define OBJ_F_OBJ_NID2OBJ 103 --# define OBJ_F_OBJ_NID2SN 104 --# define OBJ_F_OBJ_TXT2OBJ 108 -- --/* -- * OBJ reason codes. -- */ --# define OBJ_R_OID_EXISTS 102 --# define OBJ_R_UNKNOWN_NID 101 -- --#endif -diff --git a/uadk_tool/include/openssl/ocsp.h b/uadk_tool/include/openssl/ocsp.h -deleted file mode 100644 -index 4d759a4..0000000 ---- a/uadk_tool/include/openssl/ocsp.h -+++ /dev/null -@@ -1,352 +0,0 @@ --/* -- * Copyright 2000-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_OCSP_H --# define HEADER_OCSP_H -- --#include -- --/* -- * These definitions are outside the OPENSSL_NO_OCSP guard because although for -- * historical reasons they have OCSP_* names, they can actually be used -- * independently of OCSP. E.g. see RFC5280 -- */ --/*- -- * CRLReason ::= ENUMERATED { -- * unspecified (0), -- * keyCompromise (1), -- * cACompromise (2), -- * affiliationChanged (3), -- * superseded (4), -- * cessationOfOperation (5), -- * certificateHold (6), -- * removeFromCRL (8) } -- */ --# define OCSP_REVOKED_STATUS_NOSTATUS -1 --# define OCSP_REVOKED_STATUS_UNSPECIFIED 0 --# define OCSP_REVOKED_STATUS_KEYCOMPROMISE 1 --# define OCSP_REVOKED_STATUS_CACOMPROMISE 2 --# define OCSP_REVOKED_STATUS_AFFILIATIONCHANGED 3 --# define OCSP_REVOKED_STATUS_SUPERSEDED 4 --# define OCSP_REVOKED_STATUS_CESSATIONOFOPERATION 5 --# define OCSP_REVOKED_STATUS_CERTIFICATEHOLD 6 --# define OCSP_REVOKED_STATUS_REMOVEFROMCRL 8 -- -- --# ifndef OPENSSL_NO_OCSP -- --# include --# include --# include --# include --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --/* Various flags and values */ -- --# define OCSP_DEFAULT_NONCE_LENGTH 16 -- --# define OCSP_NOCERTS 0x1 --# define OCSP_NOINTERN 0x2 --# define OCSP_NOSIGS 0x4 --# define OCSP_NOCHAIN 0x8 --# define OCSP_NOVERIFY 0x10 --# define OCSP_NOEXPLICIT 0x20 --# define OCSP_NOCASIGN 0x40 --# define OCSP_NODELEGATED 0x80 --# define OCSP_NOCHECKS 0x100 --# define OCSP_TRUSTOTHER 0x200 --# define OCSP_RESPID_KEY 0x400 --# define OCSP_NOTIME 0x800 -- --typedef struct ocsp_cert_id_st OCSP_CERTID; -- --DEFINE_STACK_OF(OCSP_CERTID) -- --typedef struct ocsp_one_request_st OCSP_ONEREQ; -- --DEFINE_STACK_OF(OCSP_ONEREQ) -- --typedef struct ocsp_req_info_st OCSP_REQINFO; --typedef struct ocsp_signature_st OCSP_SIGNATURE; --typedef struct ocsp_request_st OCSP_REQUEST; -- --# define OCSP_RESPONSE_STATUS_SUCCESSFUL 0 --# define OCSP_RESPONSE_STATUS_MALFORMEDREQUEST 1 --# define OCSP_RESPONSE_STATUS_INTERNALERROR 2 --# define OCSP_RESPONSE_STATUS_TRYLATER 3 --# define OCSP_RESPONSE_STATUS_SIGREQUIRED 5 --# define OCSP_RESPONSE_STATUS_UNAUTHORIZED 6 -- --typedef struct ocsp_resp_bytes_st OCSP_RESPBYTES; -- --# define V_OCSP_RESPID_NAME 0 --# define V_OCSP_RESPID_KEY 1 -- --DEFINE_STACK_OF(OCSP_RESPID) -- --typedef struct ocsp_revoked_info_st OCSP_REVOKEDINFO; -- --# define V_OCSP_CERTSTATUS_GOOD 0 --# define V_OCSP_CERTSTATUS_REVOKED 1 --# define V_OCSP_CERTSTATUS_UNKNOWN 2 -- --typedef struct ocsp_cert_status_st OCSP_CERTSTATUS; --typedef struct ocsp_single_response_st OCSP_SINGLERESP; -- --DEFINE_STACK_OF(OCSP_SINGLERESP) -- --typedef struct ocsp_response_data_st OCSP_RESPDATA; -- --typedef struct ocsp_basic_response_st OCSP_BASICRESP; -- --typedef struct ocsp_crl_id_st OCSP_CRLID; --typedef struct ocsp_service_locator_st OCSP_SERVICELOC; -- --# define PEM_STRING_OCSP_REQUEST "OCSP REQUEST" --# define PEM_STRING_OCSP_RESPONSE "OCSP RESPONSE" -- --# define d2i_OCSP_REQUEST_bio(bp,p) ASN1_d2i_bio_of(OCSP_REQUEST,OCSP_REQUEST_new,d2i_OCSP_REQUEST,bp,p) -- --# define d2i_OCSP_RESPONSE_bio(bp,p) ASN1_d2i_bio_of(OCSP_RESPONSE,OCSP_RESPONSE_new,d2i_OCSP_RESPONSE,bp,p) -- --# define PEM_read_bio_OCSP_REQUEST(bp,x,cb) (OCSP_REQUEST *)PEM_ASN1_read_bio( \ -- (char *(*)())d2i_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST, \ -- bp,(char **)(x),cb,NULL) -- --# define PEM_read_bio_OCSP_RESPONSE(bp,x,cb) (OCSP_RESPONSE *)PEM_ASN1_read_bio(\ -- (char *(*)())d2i_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE, \ -- bp,(char **)(x),cb,NULL) -- --# define PEM_write_bio_OCSP_REQUEST(bp,o) \ -- PEM_ASN1_write_bio((int (*)())i2d_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,\ -- bp,(char *)(o), NULL,NULL,0,NULL,NULL) -- --# define PEM_write_bio_OCSP_RESPONSE(bp,o) \ -- PEM_ASN1_write_bio((int (*)())i2d_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,\ -- bp,(char *)(o), NULL,NULL,0,NULL,NULL) -- --# define i2d_OCSP_RESPONSE_bio(bp,o) ASN1_i2d_bio_of(OCSP_RESPONSE,i2d_OCSP_RESPONSE,bp,o) -- --# define i2d_OCSP_REQUEST_bio(bp,o) ASN1_i2d_bio_of(OCSP_REQUEST,i2d_OCSP_REQUEST,bp,o) -- --# define ASN1_BIT_STRING_digest(data,type,md,len) \ -- ASN1_item_digest(ASN1_ITEM_rptr(ASN1_BIT_STRING),type,data,md,len) -- --# define OCSP_CERTSTATUS_dup(cs)\ -- (OCSP_CERTSTATUS*)ASN1_dup((int(*)())i2d_OCSP_CERTSTATUS,\ -- (char *(*)())d2i_OCSP_CERTSTATUS,(char *)(cs)) -- --OCSP_CERTID *OCSP_CERTID_dup(OCSP_CERTID *id); -- --OCSP_RESPONSE *OCSP_sendreq_bio(BIO *b, const char *path, OCSP_REQUEST *req); --OCSP_REQ_CTX *OCSP_sendreq_new(BIO *io, const char *path, OCSP_REQUEST *req, -- int maxline); --int OCSP_REQ_CTX_nbio(OCSP_REQ_CTX *rctx); --int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx); --OCSP_REQ_CTX *OCSP_REQ_CTX_new(BIO *io, int maxline); --void OCSP_REQ_CTX_free(OCSP_REQ_CTX *rctx); --void OCSP_set_max_response_length(OCSP_REQ_CTX *rctx, unsigned long len); --int OCSP_REQ_CTX_i2d(OCSP_REQ_CTX *rctx, const ASN1_ITEM *it, -- ASN1_VALUE *val); --int OCSP_REQ_CTX_nbio_d2i(OCSP_REQ_CTX *rctx, ASN1_VALUE **pval, -- const ASN1_ITEM *it); --BIO *OCSP_REQ_CTX_get0_mem_bio(OCSP_REQ_CTX *rctx); --int OCSP_REQ_CTX_http(OCSP_REQ_CTX *rctx, const char *op, const char *path); --int OCSP_REQ_CTX_set1_req(OCSP_REQ_CTX *rctx, OCSP_REQUEST *req); --int OCSP_REQ_CTX_add1_header(OCSP_REQ_CTX *rctx, -- const char *name, const char *value); -- --OCSP_CERTID *OCSP_cert_to_id(const EVP_MD *dgst, const X509 *subject, -- const X509 *issuer); -- --OCSP_CERTID *OCSP_cert_id_new(const EVP_MD *dgst, -- const X509_NAME *issuerName, -- const ASN1_BIT_STRING *issuerKey, -- const ASN1_INTEGER *serialNumber); -- --OCSP_ONEREQ *OCSP_request_add0_id(OCSP_REQUEST *req, OCSP_CERTID *cid); -- --int OCSP_request_add1_nonce(OCSP_REQUEST *req, unsigned char *val, int len); --int OCSP_basic_add1_nonce(OCSP_BASICRESP *resp, unsigned char *val, int len); --int OCSP_check_nonce(OCSP_REQUEST *req, OCSP_BASICRESP *bs); --int OCSP_copy_nonce(OCSP_BASICRESP *resp, OCSP_REQUEST *req); -- --int OCSP_request_set1_name(OCSP_REQUEST *req, X509_NAME *nm); --int OCSP_request_add1_cert(OCSP_REQUEST *req, X509 *cert); -- --int OCSP_request_sign(OCSP_REQUEST *req, -- X509 *signer, -- EVP_PKEY *key, -- const EVP_MD *dgst, -- STACK_OF(X509) *certs, unsigned long flags); -- --int OCSP_response_status(OCSP_RESPONSE *resp); --OCSP_BASICRESP *OCSP_response_get1_basic(OCSP_RESPONSE *resp); -- --const ASN1_OCTET_STRING *OCSP_resp_get0_signature(const OCSP_BASICRESP *bs); --const X509_ALGOR *OCSP_resp_get0_tbs_sigalg(const OCSP_BASICRESP *bs); --const OCSP_RESPDATA *OCSP_resp_get0_respdata(const OCSP_BASICRESP *bs); --int OCSP_resp_get0_signer(OCSP_BASICRESP *bs, X509 **signer, -- STACK_OF(X509) *extra_certs); -- --int OCSP_resp_count(OCSP_BASICRESP *bs); --OCSP_SINGLERESP *OCSP_resp_get0(OCSP_BASICRESP *bs, int idx); --const ASN1_GENERALIZEDTIME *OCSP_resp_get0_produced_at(const OCSP_BASICRESP* bs); --const STACK_OF(X509) *OCSP_resp_get0_certs(const OCSP_BASICRESP *bs); --int OCSP_resp_get0_id(const OCSP_BASICRESP *bs, -- const ASN1_OCTET_STRING **pid, -- const X509_NAME **pname); --int OCSP_resp_get1_id(const OCSP_BASICRESP *bs, -- ASN1_OCTET_STRING **pid, -- X509_NAME **pname); -- --int OCSP_resp_find(OCSP_BASICRESP *bs, OCSP_CERTID *id, int last); --int OCSP_single_get0_status(OCSP_SINGLERESP *single, int *reason, -- ASN1_GENERALIZEDTIME **revtime, -- ASN1_GENERALIZEDTIME **thisupd, -- ASN1_GENERALIZEDTIME **nextupd); --int OCSP_resp_find_status(OCSP_BASICRESP *bs, OCSP_CERTID *id, int *status, -- int *reason, -- ASN1_GENERALIZEDTIME **revtime, -- ASN1_GENERALIZEDTIME **thisupd, -- ASN1_GENERALIZEDTIME **nextupd); --int OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd, -- ASN1_GENERALIZEDTIME *nextupd, long sec, long maxsec); -- --int OCSP_request_verify(OCSP_REQUEST *req, STACK_OF(X509) *certs, -- X509_STORE *store, unsigned long flags); -- --int OCSP_parse_url(const char *url, char **phost, char **pport, char **ppath, -- int *pssl); -- --int OCSP_id_issuer_cmp(const OCSP_CERTID *a, const OCSP_CERTID *b); --int OCSP_id_cmp(const OCSP_CERTID *a, const OCSP_CERTID *b); -- --int OCSP_request_onereq_count(OCSP_REQUEST *req); --OCSP_ONEREQ *OCSP_request_onereq_get0(OCSP_REQUEST *req, int i); --OCSP_CERTID *OCSP_onereq_get0_id(OCSP_ONEREQ *one); --int OCSP_id_get0_info(ASN1_OCTET_STRING **piNameHash, ASN1_OBJECT **pmd, -- ASN1_OCTET_STRING **pikeyHash, -- ASN1_INTEGER **pserial, OCSP_CERTID *cid); --int OCSP_request_is_signed(OCSP_REQUEST *req); --OCSP_RESPONSE *OCSP_response_create(int status, OCSP_BASICRESP *bs); --OCSP_SINGLERESP *OCSP_basic_add1_status(OCSP_BASICRESP *rsp, -- OCSP_CERTID *cid, -- int status, int reason, -- ASN1_TIME *revtime, -- ASN1_TIME *thisupd, -- ASN1_TIME *nextupd); --int OCSP_basic_add1_cert(OCSP_BASICRESP *resp, X509 *cert); --int OCSP_basic_sign(OCSP_BASICRESP *brsp, -- X509 *signer, EVP_PKEY *key, const EVP_MD *dgst, -- STACK_OF(X509) *certs, unsigned long flags); --int OCSP_basic_sign_ctx(OCSP_BASICRESP *brsp, -- X509 *signer, EVP_MD_CTX *ctx, -- STACK_OF(X509) *certs, unsigned long flags); --int OCSP_RESPID_set_by_name(OCSP_RESPID *respid, X509 *cert); --int OCSP_RESPID_set_by_key(OCSP_RESPID *respid, X509 *cert); --int OCSP_RESPID_match(OCSP_RESPID *respid, X509 *cert); -- --X509_EXTENSION *OCSP_crlID_new(const char *url, long *n, char *tim); -- --X509_EXTENSION *OCSP_accept_responses_new(char **oids); -- --X509_EXTENSION *OCSP_archive_cutoff_new(char *tim); -- --X509_EXTENSION *OCSP_url_svcloc_new(X509_NAME *issuer, const char **urls); -- --int OCSP_REQUEST_get_ext_count(OCSP_REQUEST *x); --int OCSP_REQUEST_get_ext_by_NID(OCSP_REQUEST *x, int nid, int lastpos); --int OCSP_REQUEST_get_ext_by_OBJ(OCSP_REQUEST *x, const ASN1_OBJECT *obj, -- int lastpos); --int OCSP_REQUEST_get_ext_by_critical(OCSP_REQUEST *x, int crit, int lastpos); --X509_EXTENSION *OCSP_REQUEST_get_ext(OCSP_REQUEST *x, int loc); --X509_EXTENSION *OCSP_REQUEST_delete_ext(OCSP_REQUEST *x, int loc); --void *OCSP_REQUEST_get1_ext_d2i(OCSP_REQUEST *x, int nid, int *crit, -- int *idx); --int OCSP_REQUEST_add1_ext_i2d(OCSP_REQUEST *x, int nid, void *value, int crit, -- unsigned long flags); --int OCSP_REQUEST_add_ext(OCSP_REQUEST *x, X509_EXTENSION *ex, int loc); -- --int OCSP_ONEREQ_get_ext_count(OCSP_ONEREQ *x); --int OCSP_ONEREQ_get_ext_by_NID(OCSP_ONEREQ *x, int nid, int lastpos); --int OCSP_ONEREQ_get_ext_by_OBJ(OCSP_ONEREQ *x, const ASN1_OBJECT *obj, int lastpos); --int OCSP_ONEREQ_get_ext_by_critical(OCSP_ONEREQ *x, int crit, int lastpos); --X509_EXTENSION *OCSP_ONEREQ_get_ext(OCSP_ONEREQ *x, int loc); --X509_EXTENSION *OCSP_ONEREQ_delete_ext(OCSP_ONEREQ *x, int loc); --void *OCSP_ONEREQ_get1_ext_d2i(OCSP_ONEREQ *x, int nid, int *crit, int *idx); --int OCSP_ONEREQ_add1_ext_i2d(OCSP_ONEREQ *x, int nid, void *value, int crit, -- unsigned long flags); --int OCSP_ONEREQ_add_ext(OCSP_ONEREQ *x, X509_EXTENSION *ex, int loc); -- --int OCSP_BASICRESP_get_ext_count(OCSP_BASICRESP *x); --int OCSP_BASICRESP_get_ext_by_NID(OCSP_BASICRESP *x, int nid, int lastpos); --int OCSP_BASICRESP_get_ext_by_OBJ(OCSP_BASICRESP *x, const ASN1_OBJECT *obj, -- int lastpos); --int OCSP_BASICRESP_get_ext_by_critical(OCSP_BASICRESP *x, int crit, -- int lastpos); --X509_EXTENSION *OCSP_BASICRESP_get_ext(OCSP_BASICRESP *x, int loc); --X509_EXTENSION *OCSP_BASICRESP_delete_ext(OCSP_BASICRESP *x, int loc); --void *OCSP_BASICRESP_get1_ext_d2i(OCSP_BASICRESP *x, int nid, int *crit, -- int *idx); --int OCSP_BASICRESP_add1_ext_i2d(OCSP_BASICRESP *x, int nid, void *value, -- int crit, unsigned long flags); --int OCSP_BASICRESP_add_ext(OCSP_BASICRESP *x, X509_EXTENSION *ex, int loc); -- --int OCSP_SINGLERESP_get_ext_count(OCSP_SINGLERESP *x); --int OCSP_SINGLERESP_get_ext_by_NID(OCSP_SINGLERESP *x, int nid, int lastpos); --int OCSP_SINGLERESP_get_ext_by_OBJ(OCSP_SINGLERESP *x, const ASN1_OBJECT *obj, -- int lastpos); --int OCSP_SINGLERESP_get_ext_by_critical(OCSP_SINGLERESP *x, int crit, -- int lastpos); --X509_EXTENSION *OCSP_SINGLERESP_get_ext(OCSP_SINGLERESP *x, int loc); --X509_EXTENSION *OCSP_SINGLERESP_delete_ext(OCSP_SINGLERESP *x, int loc); --void *OCSP_SINGLERESP_get1_ext_d2i(OCSP_SINGLERESP *x, int nid, int *crit, -- int *idx); --int OCSP_SINGLERESP_add1_ext_i2d(OCSP_SINGLERESP *x, int nid, void *value, -- int crit, unsigned long flags); --int OCSP_SINGLERESP_add_ext(OCSP_SINGLERESP *x, X509_EXTENSION *ex, int loc); --const OCSP_CERTID *OCSP_SINGLERESP_get0_id(const OCSP_SINGLERESP *x); -- --DECLARE_ASN1_FUNCTIONS(OCSP_SINGLERESP) --DECLARE_ASN1_FUNCTIONS(OCSP_CERTSTATUS) --DECLARE_ASN1_FUNCTIONS(OCSP_REVOKEDINFO) --DECLARE_ASN1_FUNCTIONS(OCSP_BASICRESP) --DECLARE_ASN1_FUNCTIONS(OCSP_RESPDATA) --DECLARE_ASN1_FUNCTIONS(OCSP_RESPID) --DECLARE_ASN1_FUNCTIONS(OCSP_RESPONSE) --DECLARE_ASN1_FUNCTIONS(OCSP_RESPBYTES) --DECLARE_ASN1_FUNCTIONS(OCSP_ONEREQ) --DECLARE_ASN1_FUNCTIONS(OCSP_CERTID) --DECLARE_ASN1_FUNCTIONS(OCSP_REQUEST) --DECLARE_ASN1_FUNCTIONS(OCSP_SIGNATURE) --DECLARE_ASN1_FUNCTIONS(OCSP_REQINFO) --DECLARE_ASN1_FUNCTIONS(OCSP_CRLID) --DECLARE_ASN1_FUNCTIONS(OCSP_SERVICELOC) -- --const char *OCSP_response_status_str(long s); --const char *OCSP_cert_status_str(long s); --const char *OCSP_crl_reason_str(long s); -- --int OCSP_REQUEST_print(BIO *bp, OCSP_REQUEST *a, unsigned long flags); --int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE *o, unsigned long flags); -- --int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs, -- X509_STORE *st, unsigned long flags); -- -- --# ifdef __cplusplus --} --# endif --# endif --#endif -diff --git a/uadk_tool/include/openssl/ocsperr.h b/uadk_tool/include/openssl/ocsperr.h -deleted file mode 100644 -index 8dd9e01..0000000 ---- a/uadk_tool/include/openssl/ocsperr.h -+++ /dev/null -@@ -1,78 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_OCSPERR_H --# define HEADER_OCSPERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# include -- --# ifndef OPENSSL_NO_OCSP -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_OCSP_strings(void); -- --/* -- * OCSP function codes. -- */ --# define OCSP_F_D2I_OCSP_NONCE 102 --# define OCSP_F_OCSP_BASIC_ADD1_STATUS 103 --# define OCSP_F_OCSP_BASIC_SIGN 104 --# define OCSP_F_OCSP_BASIC_SIGN_CTX 119 --# define OCSP_F_OCSP_BASIC_VERIFY 105 --# define OCSP_F_OCSP_CERT_ID_NEW 101 --# define OCSP_F_OCSP_CHECK_DELEGATED 106 --# define OCSP_F_OCSP_CHECK_IDS 107 --# define OCSP_F_OCSP_CHECK_ISSUER 108 --# define OCSP_F_OCSP_CHECK_VALIDITY 115 --# define OCSP_F_OCSP_MATCH_ISSUERID 109 --# define OCSP_F_OCSP_PARSE_URL 114 --# define OCSP_F_OCSP_REQUEST_SIGN 110 --# define OCSP_F_OCSP_REQUEST_VERIFY 116 --# define OCSP_F_OCSP_RESPONSE_GET1_BASIC 111 --# define OCSP_F_PARSE_HTTP_LINE1 118 -- --/* -- * OCSP reason codes. -- */ --# define OCSP_R_CERTIFICATE_VERIFY_ERROR 101 --# define OCSP_R_DIGEST_ERR 102 --# define OCSP_R_ERROR_IN_NEXTUPDATE_FIELD 122 --# define OCSP_R_ERROR_IN_THISUPDATE_FIELD 123 --# define OCSP_R_ERROR_PARSING_URL 121 --# define OCSP_R_MISSING_OCSPSIGNING_USAGE 103 --# define OCSP_R_NEXTUPDATE_BEFORE_THISUPDATE 124 --# define OCSP_R_NOT_BASIC_RESPONSE 104 --# define OCSP_R_NO_CERTIFICATES_IN_CHAIN 105 --# define OCSP_R_NO_RESPONSE_DATA 108 --# define OCSP_R_NO_REVOKED_TIME 109 --# define OCSP_R_NO_SIGNER_KEY 130 --# define OCSP_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 110 --# define OCSP_R_REQUEST_NOT_SIGNED 128 --# define OCSP_R_RESPONSE_CONTAINS_NO_REVOCATION_DATA 111 --# define OCSP_R_ROOT_CA_NOT_TRUSTED 112 --# define OCSP_R_SERVER_RESPONSE_ERROR 114 --# define OCSP_R_SERVER_RESPONSE_PARSE_ERROR 115 --# define OCSP_R_SIGNATURE_FAILURE 117 --# define OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND 118 --# define OCSP_R_STATUS_EXPIRED 125 --# define OCSP_R_STATUS_NOT_YET_VALID 126 --# define OCSP_R_STATUS_TOO_OLD 127 --# define OCSP_R_UNKNOWN_MESSAGE_DIGEST 119 --# define OCSP_R_UNKNOWN_NID 120 --# define OCSP_R_UNSUPPORTED_REQUESTORNAME_TYPE 129 -- --# endif --#endif -diff --git a/uadk_tool/include/openssl/opensslconf.h b/uadk_tool/include/openssl/opensslconf.h -deleted file mode 100644 -index 805d530..0000000 ---- a/uadk_tool/include/openssl/opensslconf.h -+++ /dev/null -@@ -1,197 +0,0 @@ --/* -- * WARNING: do not edit! -- * Generated by Makefile from include/openssl/opensslconf.h.in -- * -- * Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#include -- --#ifdef __cplusplus --extern "C" { --#endif -- --#ifdef OPENSSL_ALGORITHM_DEFINES --# error OPENSSL_ALGORITHM_DEFINES no longer supported --#endif -- --/* -- * OpenSSL was configured with the following options: -- */ -- --#ifndef OPENSSL_NO_MD2 --# define OPENSSL_NO_MD2 --#endif --#ifndef OPENSSL_NO_RC5 --# define OPENSSL_NO_RC5 --#endif --#ifndef OPENSSL_THREADS --# define OPENSSL_THREADS --#endif --#ifndef OPENSSL_RAND_SEED_OS --# define OPENSSL_RAND_SEED_OS --#endif --#ifndef OPENSSL_NO_ASAN --# define OPENSSL_NO_ASAN --#endif --#ifndef OPENSSL_NO_CRYPTO_MDEBUG --# define OPENSSL_NO_CRYPTO_MDEBUG --#endif --#ifndef OPENSSL_NO_CRYPTO_MDEBUG_BACKTRACE --# define OPENSSL_NO_CRYPTO_MDEBUG_BACKTRACE --#endif --#ifndef OPENSSL_NO_DEVCRYPTOENG --# define OPENSSL_NO_DEVCRYPTOENG --#endif --#ifndef OPENSSL_NO_EC_NISTP_64_GCC_128 --# define OPENSSL_NO_EC_NISTP_64_GCC_128 --#endif --#ifndef OPENSSL_NO_EGD --# define OPENSSL_NO_EGD --#endif --#ifndef OPENSSL_NO_EXTERNAL_TESTS --# define OPENSSL_NO_EXTERNAL_TESTS --#endif --#ifndef OPENSSL_NO_FUZZ_AFL --# define OPENSSL_NO_FUZZ_AFL --#endif --#ifndef OPENSSL_NO_FUZZ_LIBFUZZER --# define OPENSSL_NO_FUZZ_LIBFUZZER --#endif --#ifndef OPENSSL_NO_HEARTBEATS --# define OPENSSL_NO_HEARTBEATS --#endif --#ifndef OPENSSL_NO_MSAN --# define OPENSSL_NO_MSAN --#endif --#ifndef OPENSSL_NO_SCTP --# define OPENSSL_NO_SCTP --#endif --#ifndef OPENSSL_NO_SSL_TRACE --# define OPENSSL_NO_SSL_TRACE --#endif --#ifndef OPENSSL_NO_SSL3 --# define OPENSSL_NO_SSL3 --#endif --#ifndef OPENSSL_NO_SSL3_METHOD --# define OPENSSL_NO_SSL3_METHOD --#endif --#ifndef OPENSSL_NO_UBSAN --# define OPENSSL_NO_UBSAN --#endif --#ifndef OPENSSL_NO_UNIT_TEST --# define OPENSSL_NO_UNIT_TEST --#endif --#ifndef OPENSSL_NO_WEAK_SSL_CIPHERS --# define OPENSSL_NO_WEAK_SSL_CIPHERS --#endif --#ifndef OPENSSL_NO_STATIC_ENGINE --# define OPENSSL_NO_STATIC_ENGINE --#endif -- -- --/* -- * Sometimes OPENSSSL_NO_xxx ends up with an empty file and some compilers -- * don't like that. This will hopefully silence them. -- */ --#define NON_EMPTY_TRANSLATION_UNIT static void *dummy = &dummy; -- --/* -- * Applications should use -DOPENSSL_API_COMPAT= to suppress the -- * declarations of functions deprecated in or before . Otherwise, they -- * still won't see them if the library has been built to disable deprecated -- * functions. -- */ --#ifndef DECLARE_DEPRECATED --# define DECLARE_DEPRECATED(f) f; --# ifdef __GNUC__ --# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 0) --# undef DECLARE_DEPRECATED --# define DECLARE_DEPRECATED(f) f __attribute__ ((deprecated)); --# endif --# elif defined(__SUNPRO_C) --# if (__SUNPRO_C >= 0x5130) --# undef DECLARE_DEPRECATED --# define DECLARE_DEPRECATED(f) f __attribute__ ((deprecated)); --# endif --# endif --#endif -- --#ifndef OPENSSL_FILE --# ifdef OPENSSL_NO_FILENAMES --# define OPENSSL_FILE "" --# define OPENSSL_LINE 0 --# else --# define OPENSSL_FILE __FILE__ --# define OPENSSL_LINE __LINE__ --# endif --#endif -- --#ifndef OPENSSL_MIN_API --# define OPENSSL_MIN_API 0 --#endif -- --#if !defined(OPENSSL_API_COMPAT) || OPENSSL_API_COMPAT < OPENSSL_MIN_API --# undef OPENSSL_API_COMPAT --# define OPENSSL_API_COMPAT OPENSSL_MIN_API --#endif -- --/* -- * Do not deprecate things to be deprecated in version 1.2.0 before the -- * OpenSSL version number matches. -- */ --#if OPENSSL_VERSION_NUMBER < 0x10200000L --# define DEPRECATEDIN_1_2_0(f) f; --#elif OPENSSL_API_COMPAT < 0x10200000L --# define DEPRECATEDIN_1_2_0(f) DECLARE_DEPRECATED(f) --#else --# define DEPRECATEDIN_1_2_0(f) --#endif -- --#if OPENSSL_API_COMPAT < 0x10100000L --# define DEPRECATEDIN_1_1_0(f) DECLARE_DEPRECATED(f) --#else --# define DEPRECATEDIN_1_1_0(f) --#endif -- --#if OPENSSL_API_COMPAT < 0x10000000L --# define DEPRECATEDIN_1_0_0(f) DECLARE_DEPRECATED(f) --#else --# define DEPRECATEDIN_1_0_0(f) --#endif -- --#if OPENSSL_API_COMPAT < 0x00908000L --# define DEPRECATEDIN_0_9_8(f) DECLARE_DEPRECATED(f) --#else --# define DEPRECATEDIN_0_9_8(f) --#endif -- --/* Generate 80386 code? */ --#undef I386_ONLY -- --#undef OPENSSL_UNISTD --#define OPENSSL_UNISTD -- --#undef OPENSSL_EXPORT_VAR_AS_FUNCTION -- --/* -- * The following are cipher-specific, but are part of the public API. -- */ --#if !defined(OPENSSL_SYS_UEFI) --# undef BN_LLONG --/* Only one for the following should be defined */ --# define SIXTY_FOUR_BIT_LONG --# undef SIXTY_FOUR_BIT --# undef THIRTY_TWO_BIT --#endif -- --#define RC4_INT unsigned char -- --#ifdef __cplusplus --} --#endif -diff --git a/uadk_tool/include/openssl/opensslv.h b/uadk_tool/include/openssl/opensslv.h -deleted file mode 100644 -index 2a5fb9f..0000000 ---- a/uadk_tool/include/openssl/opensslv.h -+++ /dev/null -@@ -1,101 +0,0 @@ --/* -- * Copyright 1999-2021 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_OPENSSLV_H --# define HEADER_OPENSSLV_H -- --#ifdef __cplusplus --extern "C" { --#endif -- --/*- -- * Numeric release version identifier: -- * MNNFFPPS: major minor fix patch status -- * The status nibble has one of the values 0 for development, 1 to e for betas -- * 1 to 14, and f for release. The patch level is exactly that. -- * For example: -- * 0.9.3-dev 0x00903000 -- * 0.9.3-beta1 0x00903001 -- * 0.9.3-beta2-dev 0x00903002 -- * 0.9.3-beta2 0x00903002 (same as ...beta2-dev) -- * 0.9.3 0x0090300f -- * 0.9.3a 0x0090301f -- * 0.9.4 0x0090400f -- * 1.2.3z 0x102031af -- * -- * For continuity reasons (because 0.9.5 is already out, and is coded -- * 0x00905100), between 0.9.5 and 0.9.6 the coding of the patch level -- * part is slightly different, by setting the highest bit. This means -- * that 0.9.5a looks like this: 0x0090581f. At 0.9.6, we can start -- * with 0x0090600S... -- * -- * (Prior to 0.9.3-dev a different scheme was used: 0.9.2b is 0x0922.) -- * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for -- * major minor fix final patch/beta) -- */ --# define OPENSSL_VERSION_NUMBER 0x101010d0L --# define OPENSSL_VERSION_TEXT "OpenSSL 1.1.1m-dev xx XXX xxxx" -- --/*- -- * The macros below are to be used for shared library (.so, .dll, ...) -- * versioning. That kind of versioning works a bit differently between -- * operating systems. The most usual scheme is to set a major and a minor -- * number, and have the runtime loader check that the major number is equal -- * to what it was at application link time, while the minor number has to -- * be greater or equal to what it was at application link time. With this -- * scheme, the version number is usually part of the file name, like this: -- * -- * libcrypto.so.0.9 -- * -- * Some unixen also make a softlink with the major version number only: -- * -- * libcrypto.so.0 -- * -- * On Tru64 and IRIX 6.x it works a little bit differently. There, the -- * shared library version is stored in the file, and is actually a series -- * of versions, separated by colons. The rightmost version present in the -- * library when linking an application is stored in the application to be -- * matched at run time. When the application is run, a check is done to -- * see if the library version stored in the application matches any of the -- * versions in the version string of the library itself. -- * This version string can be constructed in any way, depending on what -- * kind of matching is desired. However, to implement the same scheme as -- * the one used in the other unixen, all compatible versions, from lowest -- * to highest, should be part of the string. Consecutive builds would -- * give the following versions strings: -- * -- * 3.0 -- * 3.0:3.1 -- * 3.0:3.1:3.2 -- * 4.0 -- * 4.0:4.1 -- * -- * Notice how version 4 is completely incompatible with version, and -- * therefore give the breach you can see. -- * -- * There may be other schemes as well that I haven't yet discovered. -- * -- * So, here's the way it works here: first of all, the library version -- * number doesn't need at all to match the overall OpenSSL version. -- * However, it's nice and more understandable if it actually does. -- * The current library version is stored in the macro SHLIB_VERSION_NUMBER, -- * which is just a piece of text in the format "M.m.e" (Major, minor, edit). -- * For the sake of Tru64, IRIX, and any other OS that behaves in similar ways, -- * we need to keep a history of version numbers, which is done in the -- * macro SHLIB_VERSION_HISTORY. The numbers are separated by colons and -- * should only keep the versions that are binary compatible with the current. -- */ --# define SHLIB_VERSION_HISTORY "" --# define SHLIB_VERSION_NUMBER "1.1" -- -- --#ifdef __cplusplus --} --#endif --#endif /* HEADER_OPENSSLV_H */ -diff --git a/uadk_tool/include/openssl/ossl_typ.h b/uadk_tool/include/openssl/ossl_typ.h -deleted file mode 100644 -index e0edfaa..0000000 ---- a/uadk_tool/include/openssl/ossl_typ.h -+++ /dev/null -@@ -1,197 +0,0 @@ --/* -- * Copyright 2001-2018 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_OPENSSL_TYPES_H --# define HEADER_OPENSSL_TYPES_H -- --#include -- --#ifdef __cplusplus --extern "C" { --#endif -- --# include -- --# ifdef NO_ASN1_TYPEDEFS --# define ASN1_INTEGER ASN1_STRING --# define ASN1_ENUMERATED ASN1_STRING --# define ASN1_BIT_STRING ASN1_STRING --# define ASN1_OCTET_STRING ASN1_STRING --# define ASN1_PRINTABLESTRING ASN1_STRING --# define ASN1_T61STRING ASN1_STRING --# define ASN1_IA5STRING ASN1_STRING --# define ASN1_UTCTIME ASN1_STRING --# define ASN1_GENERALIZEDTIME ASN1_STRING --# define ASN1_TIME ASN1_STRING --# define ASN1_GENERALSTRING ASN1_STRING --# define ASN1_UNIVERSALSTRING ASN1_STRING --# define ASN1_BMPSTRING ASN1_STRING --# define ASN1_VISIBLESTRING ASN1_STRING --# define ASN1_UTF8STRING ASN1_STRING --# define ASN1_BOOLEAN int --# define ASN1_NULL int --# else --typedef struct asn1_string_st ASN1_INTEGER; --typedef struct asn1_string_st ASN1_ENUMERATED; --typedef struct asn1_string_st ASN1_BIT_STRING; --typedef struct asn1_string_st ASN1_OCTET_STRING; --typedef struct asn1_string_st ASN1_PRINTABLESTRING; --typedef struct asn1_string_st ASN1_T61STRING; --typedef struct asn1_string_st ASN1_IA5STRING; --typedef struct asn1_string_st ASN1_GENERALSTRING; --typedef struct asn1_string_st ASN1_UNIVERSALSTRING; --typedef struct asn1_string_st ASN1_BMPSTRING; --typedef struct asn1_string_st ASN1_UTCTIME; --typedef struct asn1_string_st ASN1_TIME; --typedef struct asn1_string_st ASN1_GENERALIZEDTIME; --typedef struct asn1_string_st ASN1_VISIBLESTRING; --typedef struct asn1_string_st ASN1_UTF8STRING; --typedef struct asn1_string_st ASN1_STRING; --typedef int ASN1_BOOLEAN; --typedef int ASN1_NULL; --# endif -- --typedef struct asn1_object_st ASN1_OBJECT; -- --typedef struct ASN1_ITEM_st ASN1_ITEM; --typedef struct asn1_pctx_st ASN1_PCTX; --typedef struct asn1_sctx_st ASN1_SCTX; -- --# ifdef _WIN32 --# undef X509_NAME --# undef X509_EXTENSIONS --# undef PKCS7_ISSUER_AND_SERIAL --# undef PKCS7_SIGNER_INFO --# undef OCSP_REQUEST --# undef OCSP_RESPONSE --# endif -- --# ifdef BIGNUM --# undef BIGNUM --# endif --struct dane_st; --typedef struct bio_st BIO; --typedef struct bignum_st BIGNUM; --typedef struct bignum_ctx BN_CTX; --typedef struct bn_blinding_st BN_BLINDING; --typedef struct bn_mont_ctx_st BN_MONT_CTX; --typedef struct bn_recp_ctx_st BN_RECP_CTX; --typedef struct bn_gencb_st BN_GENCB; -- --typedef struct buf_mem_st BUF_MEM; -- --typedef struct evp_cipher_st EVP_CIPHER; --typedef struct evp_cipher_ctx_st EVP_CIPHER_CTX; --typedef struct evp_md_st EVP_MD; --typedef struct evp_md_ctx_st EVP_MD_CTX; --typedef struct evp_pkey_st EVP_PKEY; -- --typedef struct evp_pkey_asn1_method_st EVP_PKEY_ASN1_METHOD; -- --typedef struct evp_pkey_method_st EVP_PKEY_METHOD; --typedef struct evp_pkey_ctx_st EVP_PKEY_CTX; -- --typedef struct evp_Encode_Ctx_st EVP_ENCODE_CTX; -- --typedef struct hmac_ctx_st HMAC_CTX; -- --typedef struct dh_st DH; --typedef struct dh_method DH_METHOD; -- --typedef struct dsa_st DSA; --typedef struct dsa_method DSA_METHOD; -- --typedef struct rsa_st RSA; --typedef struct rsa_meth_st RSA_METHOD; --typedef struct rsa_pss_params_st RSA_PSS_PARAMS; -- --typedef struct ec_key_st EC_KEY; --typedef struct ec_key_method_st EC_KEY_METHOD; -- --typedef struct rand_meth_st RAND_METHOD; --typedef struct rand_drbg_st RAND_DRBG; -- --typedef struct ssl_dane_st SSL_DANE; --typedef struct x509_st X509; --typedef struct X509_algor_st X509_ALGOR; --typedef struct X509_crl_st X509_CRL; --typedef struct x509_crl_method_st X509_CRL_METHOD; --typedef struct x509_revoked_st X509_REVOKED; --typedef struct X509_name_st X509_NAME; --typedef struct X509_pubkey_st X509_PUBKEY; --typedef struct x509_store_st X509_STORE; --typedef struct x509_store_ctx_st X509_STORE_CTX; -- --typedef struct x509_object_st X509_OBJECT; --typedef struct x509_lookup_st X509_LOOKUP; --typedef struct x509_lookup_method_st X509_LOOKUP_METHOD; --typedef struct X509_VERIFY_PARAM_st X509_VERIFY_PARAM; -- --typedef struct x509_sig_info_st X509_SIG_INFO; -- --typedef struct pkcs8_priv_key_info_st PKCS8_PRIV_KEY_INFO; -- --typedef struct v3_ext_ctx X509V3_CTX; --typedef struct conf_st CONF; --typedef struct ossl_init_settings_st OPENSSL_INIT_SETTINGS; -- --typedef struct ui_st UI; --typedef struct ui_method_st UI_METHOD; -- --typedef struct engine_st ENGINE; --typedef struct ssl_st SSL; --typedef struct ssl_ctx_st SSL_CTX; -- --typedef struct comp_ctx_st COMP_CTX; --typedef struct comp_method_st COMP_METHOD; -- --typedef struct X509_POLICY_NODE_st X509_POLICY_NODE; --typedef struct X509_POLICY_LEVEL_st X509_POLICY_LEVEL; --typedef struct X509_POLICY_TREE_st X509_POLICY_TREE; --typedef struct X509_POLICY_CACHE_st X509_POLICY_CACHE; -- --typedef struct AUTHORITY_KEYID_st AUTHORITY_KEYID; --typedef struct DIST_POINT_st DIST_POINT; --typedef struct ISSUING_DIST_POINT_st ISSUING_DIST_POINT; --typedef struct NAME_CONSTRAINTS_st NAME_CONSTRAINTS; -- --typedef struct crypto_ex_data_st CRYPTO_EX_DATA; -- --typedef struct ocsp_req_ctx_st OCSP_REQ_CTX; --typedef struct ocsp_response_st OCSP_RESPONSE; --typedef struct ocsp_responder_id_st OCSP_RESPID; -- --typedef struct sct_st SCT; --typedef struct sct_ctx_st SCT_CTX; --typedef struct ctlog_st CTLOG; --typedef struct ctlog_store_st CTLOG_STORE; --typedef struct ct_policy_eval_ctx_st CT_POLICY_EVAL_CTX; -- --typedef struct ossl_store_info_st OSSL_STORE_INFO; --typedef struct ossl_store_search_st OSSL_STORE_SEARCH; -- --#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L && \ -- defined(INTMAX_MAX) && defined(UINTMAX_MAX) --typedef intmax_t ossl_intmax_t; --typedef uintmax_t ossl_uintmax_t; --#else --/* -- * Not long long, because the C-library can only be expected to provide -- * strtoll(), strtoull() at the same time as intmax_t and strtoimax(), -- * strtoumax(). Since we use these for parsing arguments, we need the -- * conversion functions, not just the sizes. -- */ --typedef long ossl_intmax_t; --typedef unsigned long ossl_uintmax_t; --#endif -- --#ifdef __cplusplus --} --#endif --#endif /* def HEADER_OPENSSL_TYPES_H */ -diff --git a/uadk_tool/include/openssl/pem.h b/uadk_tool/include/openssl/pem.h -deleted file mode 100644 -index 2ef5b5d..0000000 ---- a/uadk_tool/include/openssl/pem.h -+++ /dev/null -@@ -1,378 +0,0 @@ --/* -- * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_PEM_H --# define HEADER_PEM_H -- --# include --# include --# include --# include --# include --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --# define PEM_BUFSIZE 1024 -- --# define PEM_STRING_X509_OLD "X509 CERTIFICATE" --# define PEM_STRING_X509 "CERTIFICATE" --# define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE" --# define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST" --# define PEM_STRING_X509_REQ "CERTIFICATE REQUEST" --# define PEM_STRING_X509_CRL "X509 CRL" --# define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY" --# define PEM_STRING_PUBLIC "PUBLIC KEY" --# define PEM_STRING_RSA "RSA PRIVATE KEY" --# define PEM_STRING_RSA_PUBLIC "RSA PUBLIC KEY" --# define PEM_STRING_DSA "DSA PRIVATE KEY" --# define PEM_STRING_DSA_PUBLIC "DSA PUBLIC KEY" --# define PEM_STRING_PKCS7 "PKCS7" --# define PEM_STRING_PKCS7_SIGNED "PKCS #7 SIGNED DATA" --# define PEM_STRING_PKCS8 "ENCRYPTED PRIVATE KEY" --# define PEM_STRING_PKCS8INF "PRIVATE KEY" --# define PEM_STRING_DHPARAMS "DH PARAMETERS" --# define PEM_STRING_DHXPARAMS "X9.42 DH PARAMETERS" --# define PEM_STRING_SSL_SESSION "SSL SESSION PARAMETERS" --# define PEM_STRING_DSAPARAMS "DSA PARAMETERS" --# define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY" --# define PEM_STRING_ECPARAMETERS "EC PARAMETERS" --# define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY" --# define PEM_STRING_PARAMETERS "PARAMETERS" --# define PEM_STRING_CMS "CMS" -- --# define PEM_TYPE_ENCRYPTED 10 --# define PEM_TYPE_MIC_ONLY 20 --# define PEM_TYPE_MIC_CLEAR 30 --# define PEM_TYPE_CLEAR 40 -- --/* -- * These macros make the PEM_read/PEM_write functions easier to maintain and -- * write. Now they are all implemented with either: IMPLEMENT_PEM_rw(...) or -- * IMPLEMENT_PEM_rw_cb(...) -- */ -- --# ifdef OPENSSL_NO_STDIO -- --# define IMPLEMENT_PEM_read_fp(name, type, str, asn1) /**/ --# define IMPLEMENT_PEM_write_fp(name, type, str, asn1) /**/ --# define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) /**/ --# define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) /**/ --# define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) /**/ --# else -- --# define IMPLEMENT_PEM_read_fp(name, type, str, asn1) \ --type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u)\ --{ \ --return PEM_ASN1_read((d2i_of_void *)d2i_##asn1, str,fp,(void **)x,cb,u); \ --} -- --# define IMPLEMENT_PEM_write_fp(name, type, str, asn1) \ --int PEM_write_##name(FILE *fp, type *x) \ --{ \ --return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,NULL,NULL,0,NULL,NULL); \ --} -- --# define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) \ --int PEM_write_##name(FILE *fp, const type *x) \ --{ \ --return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,(void *)x,NULL,NULL,0,NULL,NULL); \ --} -- --# define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) \ --int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ -- unsigned char *kstr, int klen, pem_password_cb *cb, \ -- void *u) \ -- { \ -- return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,enc,kstr,klen,cb,u); \ -- } -- --# define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) \ --int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ -- unsigned char *kstr, int klen, pem_password_cb *cb, \ -- void *u) \ -- { \ -- return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,enc,kstr,klen,cb,u); \ -- } -- --# endif -- --# define IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ --type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u)\ --{ \ --return PEM_ASN1_read_bio((d2i_of_void *)d2i_##asn1, str,bp,(void **)x,cb,u); \ --} -- --# define IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ --int PEM_write_bio_##name(BIO *bp, type *x) \ --{ \ --return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,x,NULL,NULL,0,NULL,NULL); \ --} -- --# define IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ --int PEM_write_bio_##name(BIO *bp, const type *x) \ --{ \ --return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,(void *)x,NULL,NULL,0,NULL,NULL); \ --} -- --# define IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ --int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ -- unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \ -- { \ -- return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,x,enc,kstr,klen,cb,u); \ -- } -- --# define IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ --int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ -- unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \ -- { \ -- return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,(void *)x,enc,kstr,klen,cb,u); \ -- } -- --# define IMPLEMENT_PEM_write(name, type, str, asn1) \ -- IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ -- IMPLEMENT_PEM_write_fp(name, type, str, asn1) -- --# define IMPLEMENT_PEM_write_const(name, type, str, asn1) \ -- IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ -- IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) -- --# define IMPLEMENT_PEM_write_cb(name, type, str, asn1) \ -- IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ -- IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) -- --# define IMPLEMENT_PEM_write_cb_const(name, type, str, asn1) \ -- IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ -- IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) -- --# define IMPLEMENT_PEM_read(name, type, str, asn1) \ -- IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ -- IMPLEMENT_PEM_read_fp(name, type, str, asn1) -- --# define IMPLEMENT_PEM_rw(name, type, str, asn1) \ -- IMPLEMENT_PEM_read(name, type, str, asn1) \ -- IMPLEMENT_PEM_write(name, type, str, asn1) -- --# define IMPLEMENT_PEM_rw_const(name, type, str, asn1) \ -- IMPLEMENT_PEM_read(name, type, str, asn1) \ -- IMPLEMENT_PEM_write_const(name, type, str, asn1) -- --# define IMPLEMENT_PEM_rw_cb(name, type, str, asn1) \ -- IMPLEMENT_PEM_read(name, type, str, asn1) \ -- IMPLEMENT_PEM_write_cb(name, type, str, asn1) -- --/* These are the same except they are for the declarations */ -- --# if defined(OPENSSL_NO_STDIO) -- --# define DECLARE_PEM_read_fp(name, type) /**/ --# define DECLARE_PEM_write_fp(name, type) /**/ --# define DECLARE_PEM_write_fp_const(name, type) /**/ --# define DECLARE_PEM_write_cb_fp(name, type) /**/ --# else -- --# define DECLARE_PEM_read_fp(name, type) \ -- type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u); -- --# define DECLARE_PEM_write_fp(name, type) \ -- int PEM_write_##name(FILE *fp, type *x); -- --# define DECLARE_PEM_write_fp_const(name, type) \ -- int PEM_write_##name(FILE *fp, const type *x); -- --# define DECLARE_PEM_write_cb_fp(name, type) \ -- int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ -- unsigned char *kstr, int klen, pem_password_cb *cb, void *u); -- --# endif -- --# define DECLARE_PEM_read_bio(name, type) \ -- type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u); -- --# define DECLARE_PEM_write_bio(name, type) \ -- int PEM_write_bio_##name(BIO *bp, type *x); -- --# define DECLARE_PEM_write_bio_const(name, type) \ -- int PEM_write_bio_##name(BIO *bp, const type *x); -- --# define DECLARE_PEM_write_cb_bio(name, type) \ -- int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ -- unsigned char *kstr, int klen, pem_password_cb *cb, void *u); -- --# define DECLARE_PEM_write(name, type) \ -- DECLARE_PEM_write_bio(name, type) \ -- DECLARE_PEM_write_fp(name, type) --# define DECLARE_PEM_write_const(name, type) \ -- DECLARE_PEM_write_bio_const(name, type) \ -- DECLARE_PEM_write_fp_const(name, type) --# define DECLARE_PEM_write_cb(name, type) \ -- DECLARE_PEM_write_cb_bio(name, type) \ -- DECLARE_PEM_write_cb_fp(name, type) --# define DECLARE_PEM_read(name, type) \ -- DECLARE_PEM_read_bio(name, type) \ -- DECLARE_PEM_read_fp(name, type) --# define DECLARE_PEM_rw(name, type) \ -- DECLARE_PEM_read(name, type) \ -- DECLARE_PEM_write(name, type) --# define DECLARE_PEM_rw_const(name, type) \ -- DECLARE_PEM_read(name, type) \ -- DECLARE_PEM_write_const(name, type) --# define DECLARE_PEM_rw_cb(name, type) \ -- DECLARE_PEM_read(name, type) \ -- DECLARE_PEM_write_cb(name, type) --typedef int pem_password_cb (char *buf, int size, int rwflag, void *userdata); -- --int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher); --int PEM_do_header(EVP_CIPHER_INFO *cipher, unsigned char *data, long *len, -- pem_password_cb *callback, void *u); -- --int PEM_read_bio(BIO *bp, char **name, char **header, -- unsigned char **data, long *len); --# define PEM_FLAG_SECURE 0x1 --# define PEM_FLAG_EAY_COMPATIBLE 0x2 --# define PEM_FLAG_ONLY_B64 0x4 --int PEM_read_bio_ex(BIO *bp, char **name, char **header, -- unsigned char **data, long *len, unsigned int flags); --int PEM_bytes_read_bio_secmem(unsigned char **pdata, long *plen, char **pnm, -- const char *name, BIO *bp, pem_password_cb *cb, -- void *u); --int PEM_write_bio(BIO *bp, const char *name, const char *hdr, -- const unsigned char *data, long len); --int PEM_bytes_read_bio(unsigned char **pdata, long *plen, char **pnm, -- const char *name, BIO *bp, pem_password_cb *cb, -- void *u); --void *PEM_ASN1_read_bio(d2i_of_void *d2i, const char *name, BIO *bp, void **x, -- pem_password_cb *cb, void *u); --int PEM_ASN1_write_bio(i2d_of_void *i2d, const char *name, BIO *bp, void *x, -- const EVP_CIPHER *enc, unsigned char *kstr, int klen, -- pem_password_cb *cb, void *u); -- --STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, -- pem_password_cb *cb, void *u); --int PEM_X509_INFO_write_bio(BIO *bp, X509_INFO *xi, EVP_CIPHER *enc, -- unsigned char *kstr, int klen, -- pem_password_cb *cd, void *u); -- --#ifndef OPENSSL_NO_STDIO --int PEM_read(FILE *fp, char **name, char **header, -- unsigned char **data, long *len); --int PEM_write(FILE *fp, const char *name, const char *hdr, -- const unsigned char *data, long len); --void *PEM_ASN1_read(d2i_of_void *d2i, const char *name, FILE *fp, void **x, -- pem_password_cb *cb, void *u); --int PEM_ASN1_write(i2d_of_void *i2d, const char *name, FILE *fp, -- void *x, const EVP_CIPHER *enc, unsigned char *kstr, -- int klen, pem_password_cb *callback, void *u); --STACK_OF(X509_INFO) *PEM_X509_INFO_read(FILE *fp, STACK_OF(X509_INFO) *sk, -- pem_password_cb *cb, void *u); --#endif -- --int PEM_SignInit(EVP_MD_CTX *ctx, EVP_MD *type); --int PEM_SignUpdate(EVP_MD_CTX *ctx, unsigned char *d, unsigned int cnt); --int PEM_SignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, -- unsigned int *siglen, EVP_PKEY *pkey); -- --/* The default pem_password_cb that's used internally */ --int PEM_def_callback(char *buf, int num, int rwflag, void *userdata); --void PEM_proc_type(char *buf, int type); --void PEM_dek_info(char *buf, const char *type, int len, char *str); -- --# include -- --DECLARE_PEM_rw(X509, X509) --DECLARE_PEM_rw(X509_AUX, X509) --DECLARE_PEM_rw(X509_REQ, X509_REQ) --DECLARE_PEM_write(X509_REQ_NEW, X509_REQ) --DECLARE_PEM_rw(X509_CRL, X509_CRL) --DECLARE_PEM_rw(PKCS7, PKCS7) --DECLARE_PEM_rw(NETSCAPE_CERT_SEQUENCE, NETSCAPE_CERT_SEQUENCE) --DECLARE_PEM_rw(PKCS8, X509_SIG) --DECLARE_PEM_rw(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO) --# ifndef OPENSSL_NO_RSA --DECLARE_PEM_rw_cb(RSAPrivateKey, RSA) --DECLARE_PEM_rw_const(RSAPublicKey, RSA) --DECLARE_PEM_rw(RSA_PUBKEY, RSA) --# endif --# ifndef OPENSSL_NO_DSA --DECLARE_PEM_rw_cb(DSAPrivateKey, DSA) --DECLARE_PEM_rw(DSA_PUBKEY, DSA) --DECLARE_PEM_rw_const(DSAparams, DSA) --# endif --# ifndef OPENSSL_NO_EC --DECLARE_PEM_rw_const(ECPKParameters, EC_GROUP) --DECLARE_PEM_rw_cb(ECPrivateKey, EC_KEY) --DECLARE_PEM_rw(EC_PUBKEY, EC_KEY) --# endif --# ifndef OPENSSL_NO_DH --DECLARE_PEM_rw_const(DHparams, DH) --DECLARE_PEM_write_const(DHxparams, DH) --# endif --DECLARE_PEM_rw_cb(PrivateKey, EVP_PKEY) --DECLARE_PEM_rw(PUBKEY, EVP_PKEY) -- --int PEM_write_bio_PrivateKey_traditional(BIO *bp, EVP_PKEY *x, -- const EVP_CIPHER *enc, -- unsigned char *kstr, int klen, -- pem_password_cb *cb, void *u); -- --int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid, -- char *kstr, int klen, -- pem_password_cb *cb, void *u); --int PEM_write_bio_PKCS8PrivateKey(BIO *, EVP_PKEY *, const EVP_CIPHER *, -- char *, int, pem_password_cb *, void *); --int i2d_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, -- char *kstr, int klen, -- pem_password_cb *cb, void *u); --int i2d_PKCS8PrivateKey_nid_bio(BIO *bp, EVP_PKEY *x, int nid, -- char *kstr, int klen, -- pem_password_cb *cb, void *u); --EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, -- void *u); -- --# ifndef OPENSSL_NO_STDIO --int i2d_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, -- char *kstr, int klen, -- pem_password_cb *cb, void *u); --int i2d_PKCS8PrivateKey_nid_fp(FILE *fp, EVP_PKEY *x, int nid, -- char *kstr, int klen, -- pem_password_cb *cb, void *u); --int PEM_write_PKCS8PrivateKey_nid(FILE *fp, EVP_PKEY *x, int nid, -- char *kstr, int klen, -- pem_password_cb *cb, void *u); -- --EVP_PKEY *d2i_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, -- void *u); -- --int PEM_write_PKCS8PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, -- char *kstr, int klen, pem_password_cb *cd, -- void *u); --# endif --EVP_PKEY *PEM_read_bio_Parameters(BIO *bp, EVP_PKEY **x); --int PEM_write_bio_Parameters(BIO *bp, EVP_PKEY *x); -- --# ifndef OPENSSL_NO_DSA --EVP_PKEY *b2i_PrivateKey(const unsigned char **in, long length); --EVP_PKEY *b2i_PublicKey(const unsigned char **in, long length); --EVP_PKEY *b2i_PrivateKey_bio(BIO *in); --EVP_PKEY *b2i_PublicKey_bio(BIO *in); --int i2b_PrivateKey_bio(BIO *out, EVP_PKEY *pk); --int i2b_PublicKey_bio(BIO *out, EVP_PKEY *pk); --# ifndef OPENSSL_NO_RC4 --EVP_PKEY *b2i_PVK_bio(BIO *in, pem_password_cb *cb, void *u); --int i2b_PVK_bio(BIO *out, EVP_PKEY *pk, int enclevel, -- pem_password_cb *cb, void *u); --# endif --# endif -- --# ifdef __cplusplus --} --# endif --#endif -diff --git a/uadk_tool/include/openssl/pem2.h b/uadk_tool/include/openssl/pem2.h -deleted file mode 100644 -index 038fe79..0000000 ---- a/uadk_tool/include/openssl/pem2.h -+++ /dev/null -@@ -1,13 +0,0 @@ --/* -- * Copyright 1999-2018 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_PEM2_H --# define HEADER_PEM2_H --# include --#endif -diff --git a/uadk_tool/include/openssl/pemerr.h b/uadk_tool/include/openssl/pemerr.h -deleted file mode 100644 -index 4f7e357..0000000 ---- a/uadk_tool/include/openssl/pemerr.h -+++ /dev/null -@@ -1,105 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_PEMERR_H --# define HEADER_PEMERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_PEM_strings(void); -- --/* -- * PEM function codes. -- */ --# define PEM_F_B2I_DSS 127 --# define PEM_F_B2I_PVK_BIO 128 --# define PEM_F_B2I_RSA 129 --# define PEM_F_CHECK_BITLEN_DSA 130 --# define PEM_F_CHECK_BITLEN_RSA 131 --# define PEM_F_D2I_PKCS8PRIVATEKEY_BIO 120 --# define PEM_F_D2I_PKCS8PRIVATEKEY_FP 121 --# define PEM_F_DO_B2I 132 --# define PEM_F_DO_B2I_BIO 133 --# define PEM_F_DO_BLOB_HEADER 134 --# define PEM_F_DO_I2B 146 --# define PEM_F_DO_PK8PKEY 126 --# define PEM_F_DO_PK8PKEY_FP 125 --# define PEM_F_DO_PVK_BODY 135 --# define PEM_F_DO_PVK_HEADER 136 --# define PEM_F_GET_HEADER_AND_DATA 143 --# define PEM_F_GET_NAME 144 --# define PEM_F_I2B_PVK 137 --# define PEM_F_I2B_PVK_BIO 138 --# define PEM_F_LOAD_IV 101 --# define PEM_F_PEM_ASN1_READ 102 --# define PEM_F_PEM_ASN1_READ_BIO 103 --# define PEM_F_PEM_ASN1_WRITE 104 --# define PEM_F_PEM_ASN1_WRITE_BIO 105 --# define PEM_F_PEM_DEF_CALLBACK 100 --# define PEM_F_PEM_DO_HEADER 106 --# define PEM_F_PEM_GET_EVP_CIPHER_INFO 107 --# define PEM_F_PEM_READ 108 --# define PEM_F_PEM_READ_BIO 109 --# define PEM_F_PEM_READ_BIO_DHPARAMS 141 --# define PEM_F_PEM_READ_BIO_EX 145 --# define PEM_F_PEM_READ_BIO_PARAMETERS 140 --# define PEM_F_PEM_READ_BIO_PRIVATEKEY 123 --# define PEM_F_PEM_READ_DHPARAMS 142 --# define PEM_F_PEM_READ_PRIVATEKEY 124 --# define PEM_F_PEM_SIGNFINAL 112 --# define PEM_F_PEM_WRITE 113 --# define PEM_F_PEM_WRITE_BIO 114 --# define PEM_F_PEM_WRITE_BIO_PRIVATEKEY_TRADITIONAL 147 --# define PEM_F_PEM_WRITE_PRIVATEKEY 139 --# define PEM_F_PEM_X509_INFO_READ 115 --# define PEM_F_PEM_X509_INFO_READ_BIO 116 --# define PEM_F_PEM_X509_INFO_WRITE_BIO 117 -- --/* -- * PEM reason codes. -- */ --# define PEM_R_BAD_BASE64_DECODE 100 --# define PEM_R_BAD_DECRYPT 101 --# define PEM_R_BAD_END_LINE 102 --# define PEM_R_BAD_IV_CHARS 103 --# define PEM_R_BAD_MAGIC_NUMBER 116 --# define PEM_R_BAD_PASSWORD_READ 104 --# define PEM_R_BAD_VERSION_NUMBER 117 --# define PEM_R_BIO_WRITE_FAILURE 118 --# define PEM_R_CIPHER_IS_NULL 127 --# define PEM_R_ERROR_CONVERTING_PRIVATE_KEY 115 --# define PEM_R_EXPECTING_PRIVATE_KEY_BLOB 119 --# define PEM_R_EXPECTING_PUBLIC_KEY_BLOB 120 --# define PEM_R_HEADER_TOO_LONG 128 --# define PEM_R_INCONSISTENT_HEADER 121 --# define PEM_R_KEYBLOB_HEADER_PARSE_ERROR 122 --# define PEM_R_KEYBLOB_TOO_SHORT 123 --# define PEM_R_MISSING_DEK_IV 129 --# define PEM_R_NOT_DEK_INFO 105 --# define PEM_R_NOT_ENCRYPTED 106 --# define PEM_R_NOT_PROC_TYPE 107 --# define PEM_R_NO_START_LINE 108 --# define PEM_R_PROBLEMS_GETTING_PASSWORD 109 --# define PEM_R_PVK_DATA_TOO_SHORT 124 --# define PEM_R_PVK_TOO_SHORT 125 --# define PEM_R_READ_KEY 111 --# define PEM_R_SHORT_HEADER 112 --# define PEM_R_UNEXPECTED_DEK_IV 130 --# define PEM_R_UNSUPPORTED_CIPHER 113 --# define PEM_R_UNSUPPORTED_ENCRYPTION 114 --# define PEM_R_UNSUPPORTED_KEY_COMPONENTS 126 --# define PEM_R_UNSUPPORTED_PUBLIC_KEY_TYPE 110 -- --#endif -diff --git a/uadk_tool/include/openssl/pkcs12.h b/uadk_tool/include/openssl/pkcs12.h -deleted file mode 100644 -index 3f43dad..0000000 ---- a/uadk_tool/include/openssl/pkcs12.h -+++ /dev/null -@@ -1,223 +0,0 @@ --/* -- * Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_PKCS12_H --# define HEADER_PKCS12_H -- --# include --# include --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --# define PKCS12_KEY_ID 1 --# define PKCS12_IV_ID 2 --# define PKCS12_MAC_ID 3 -- --/* Default iteration count */ --# ifndef PKCS12_DEFAULT_ITER --# define PKCS12_DEFAULT_ITER PKCS5_DEFAULT_ITER --# endif -- --# define PKCS12_MAC_KEY_LENGTH 20 -- --# define PKCS12_SALT_LEN 8 -- --/* It's not clear if these are actually needed... */ --# define PKCS12_key_gen PKCS12_key_gen_utf8 --# define PKCS12_add_friendlyname PKCS12_add_friendlyname_utf8 -- --/* MS key usage constants */ -- --# define KEY_EX 0x10 --# define KEY_SIG 0x80 -- --typedef struct PKCS12_MAC_DATA_st PKCS12_MAC_DATA; -- --typedef struct PKCS12_st PKCS12; -- --typedef struct PKCS12_SAFEBAG_st PKCS12_SAFEBAG; -- --DEFINE_STACK_OF(PKCS12_SAFEBAG) -- --typedef struct pkcs12_bag_st PKCS12_BAGS; -- --# define PKCS12_ERROR 0 --# define PKCS12_OK 1 -- --/* Compatibility macros */ -- --#if OPENSSL_API_COMPAT < 0x10100000L -- --# define M_PKCS12_bag_type PKCS12_bag_type --# define M_PKCS12_cert_bag_type PKCS12_cert_bag_type --# define M_PKCS12_crl_bag_type PKCS12_cert_bag_type -- --# define PKCS12_certbag2x509 PKCS12_SAFEBAG_get1_cert --# define PKCS12_certbag2scrl PKCS12_SAFEBAG_get1_crl --# define PKCS12_bag_type PKCS12_SAFEBAG_get_nid --# define PKCS12_cert_bag_type PKCS12_SAFEBAG_get_bag_nid --# define PKCS12_x5092certbag PKCS12_SAFEBAG_create_cert --# define PKCS12_x509crl2certbag PKCS12_SAFEBAG_create_crl --# define PKCS12_MAKE_KEYBAG PKCS12_SAFEBAG_create0_p8inf --# define PKCS12_MAKE_SHKEYBAG PKCS12_SAFEBAG_create_pkcs8_encrypt -- --#endif -- --DEPRECATEDIN_1_1_0(ASN1_TYPE *PKCS12_get_attr(const PKCS12_SAFEBAG *bag, int attr_nid)) -- --ASN1_TYPE *PKCS8_get_attr(PKCS8_PRIV_KEY_INFO *p8, int attr_nid); --int PKCS12_mac_present(const PKCS12 *p12); --void PKCS12_get0_mac(const ASN1_OCTET_STRING **pmac, -- const X509_ALGOR **pmacalg, -- const ASN1_OCTET_STRING **psalt, -- const ASN1_INTEGER **piter, -- const PKCS12 *p12); -- --const ASN1_TYPE *PKCS12_SAFEBAG_get0_attr(const PKCS12_SAFEBAG *bag, -- int attr_nid); --const ASN1_OBJECT *PKCS12_SAFEBAG_get0_type(const PKCS12_SAFEBAG *bag); --int PKCS12_SAFEBAG_get_nid(const PKCS12_SAFEBAG *bag); --int PKCS12_SAFEBAG_get_bag_nid(const PKCS12_SAFEBAG *bag); -- --X509 *PKCS12_SAFEBAG_get1_cert(const PKCS12_SAFEBAG *bag); --X509_CRL *PKCS12_SAFEBAG_get1_crl(const PKCS12_SAFEBAG *bag); --const STACK_OF(PKCS12_SAFEBAG) * --PKCS12_SAFEBAG_get0_safes(const PKCS12_SAFEBAG *bag); --const PKCS8_PRIV_KEY_INFO *PKCS12_SAFEBAG_get0_p8inf(const PKCS12_SAFEBAG *bag); --const X509_SIG *PKCS12_SAFEBAG_get0_pkcs8(const PKCS12_SAFEBAG *bag); -- --PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_cert(X509 *x509); --PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_crl(X509_CRL *crl); --PKCS12_SAFEBAG *PKCS12_SAFEBAG_create0_p8inf(PKCS8_PRIV_KEY_INFO *p8); --PKCS12_SAFEBAG *PKCS12_SAFEBAG_create0_pkcs8(X509_SIG *p8); --PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_pkcs8_encrypt(int pbe_nid, -- const char *pass, -- int passlen, -- unsigned char *salt, -- int saltlen, int iter, -- PKCS8_PRIV_KEY_INFO *p8inf); -- --PKCS12_SAFEBAG *PKCS12_item_pack_safebag(void *obj, const ASN1_ITEM *it, -- int nid1, int nid2); --PKCS8_PRIV_KEY_INFO *PKCS8_decrypt(const X509_SIG *p8, const char *pass, -- int passlen); --PKCS8_PRIV_KEY_INFO *PKCS12_decrypt_skey(const PKCS12_SAFEBAG *bag, -- const char *pass, int passlen); --X509_SIG *PKCS8_encrypt(int pbe_nid, const EVP_CIPHER *cipher, -- const char *pass, int passlen, unsigned char *salt, -- int saltlen, int iter, PKCS8_PRIV_KEY_INFO *p8); --X509_SIG *PKCS8_set0_pbe(const char *pass, int passlen, -- PKCS8_PRIV_KEY_INFO *p8inf, X509_ALGOR *pbe); --PKCS7 *PKCS12_pack_p7data(STACK_OF(PKCS12_SAFEBAG) *sk); --STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7data(PKCS7 *p7); --PKCS7 *PKCS12_pack_p7encdata(int pbe_nid, const char *pass, int passlen, -- unsigned char *salt, int saltlen, int iter, -- STACK_OF(PKCS12_SAFEBAG) *bags); --STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7encdata(PKCS7 *p7, const char *pass, -- int passlen); -- --int PKCS12_pack_authsafes(PKCS12 *p12, STACK_OF(PKCS7) *safes); --STACK_OF(PKCS7) *PKCS12_unpack_authsafes(const PKCS12 *p12); -- --int PKCS12_add_localkeyid(PKCS12_SAFEBAG *bag, unsigned char *name, -- int namelen); --int PKCS12_add_friendlyname_asc(PKCS12_SAFEBAG *bag, const char *name, -- int namelen); --int PKCS12_add_friendlyname_utf8(PKCS12_SAFEBAG *bag, const char *name, -- int namelen); --int PKCS12_add_CSPName_asc(PKCS12_SAFEBAG *bag, const char *name, -- int namelen); --int PKCS12_add_friendlyname_uni(PKCS12_SAFEBAG *bag, -- const unsigned char *name, int namelen); --int PKCS8_add_keyusage(PKCS8_PRIV_KEY_INFO *p8, int usage); --ASN1_TYPE *PKCS12_get_attr_gen(const STACK_OF(X509_ATTRIBUTE) *attrs, -- int attr_nid); --char *PKCS12_get_friendlyname(PKCS12_SAFEBAG *bag); --const STACK_OF(X509_ATTRIBUTE) * --PKCS12_SAFEBAG_get0_attrs(const PKCS12_SAFEBAG *bag); --unsigned char *PKCS12_pbe_crypt(const X509_ALGOR *algor, -- const char *pass, int passlen, -- const unsigned char *in, int inlen, -- unsigned char **data, int *datalen, -- int en_de); --void *PKCS12_item_decrypt_d2i(const X509_ALGOR *algor, const ASN1_ITEM *it, -- const char *pass, int passlen, -- const ASN1_OCTET_STRING *oct, int zbuf); --ASN1_OCTET_STRING *PKCS12_item_i2d_encrypt(X509_ALGOR *algor, -- const ASN1_ITEM *it, -- const char *pass, int passlen, -- void *obj, int zbuf); --PKCS12 *PKCS12_init(int mode); --int PKCS12_key_gen_asc(const char *pass, int passlen, unsigned char *salt, -- int saltlen, int id, int iter, int n, -- unsigned char *out, const EVP_MD *md_type); --int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, -- int saltlen, int id, int iter, int n, -- unsigned char *out, const EVP_MD *md_type); --int PKCS12_key_gen_utf8(const char *pass, int passlen, unsigned char *salt, -- int saltlen, int id, int iter, int n, -- unsigned char *out, const EVP_MD *md_type); --int PKCS12_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, -- ASN1_TYPE *param, const EVP_CIPHER *cipher, -- const EVP_MD *md_type, int en_de); --int PKCS12_gen_mac(PKCS12 *p12, const char *pass, int passlen, -- unsigned char *mac, unsigned int *maclen); --int PKCS12_verify_mac(PKCS12 *p12, const char *pass, int passlen); --int PKCS12_set_mac(PKCS12 *p12, const char *pass, int passlen, -- unsigned char *salt, int saltlen, int iter, -- const EVP_MD *md_type); --int PKCS12_setup_mac(PKCS12 *p12, int iter, unsigned char *salt, -- int saltlen, const EVP_MD *md_type); --unsigned char *OPENSSL_asc2uni(const char *asc, int asclen, -- unsigned char **uni, int *unilen); --char *OPENSSL_uni2asc(const unsigned char *uni, int unilen); --unsigned char *OPENSSL_utf82uni(const char *asc, int asclen, -- unsigned char **uni, int *unilen); --char *OPENSSL_uni2utf8(const unsigned char *uni, int unilen); -- --DECLARE_ASN1_FUNCTIONS(PKCS12) --DECLARE_ASN1_FUNCTIONS(PKCS12_MAC_DATA) --DECLARE_ASN1_FUNCTIONS(PKCS12_SAFEBAG) --DECLARE_ASN1_FUNCTIONS(PKCS12_BAGS) -- --DECLARE_ASN1_ITEM(PKCS12_SAFEBAGS) --DECLARE_ASN1_ITEM(PKCS12_AUTHSAFES) -- --void PKCS12_PBE_add(void); --int PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert, -- STACK_OF(X509) **ca); --PKCS12 *PKCS12_create(const char *pass, const char *name, EVP_PKEY *pkey, -- X509 *cert, STACK_OF(X509) *ca, int nid_key, int nid_cert, -- int iter, int mac_iter, int keytype); -- --PKCS12_SAFEBAG *PKCS12_add_cert(STACK_OF(PKCS12_SAFEBAG) **pbags, X509 *cert); --PKCS12_SAFEBAG *PKCS12_add_key(STACK_OF(PKCS12_SAFEBAG) **pbags, -- EVP_PKEY *key, int key_usage, int iter, -- int key_nid, const char *pass); --int PKCS12_add_safe(STACK_OF(PKCS7) **psafes, STACK_OF(PKCS12_SAFEBAG) *bags, -- int safe_nid, int iter, const char *pass); --PKCS12 *PKCS12_add_safes(STACK_OF(PKCS7) *safes, int p7_nid); -- --int i2d_PKCS12_bio(BIO *bp, PKCS12 *p12); --# ifndef OPENSSL_NO_STDIO --int i2d_PKCS12_fp(FILE *fp, PKCS12 *p12); --# endif --PKCS12 *d2i_PKCS12_bio(BIO *bp, PKCS12 **p12); --# ifndef OPENSSL_NO_STDIO --PKCS12 *d2i_PKCS12_fp(FILE *fp, PKCS12 **p12); --# endif --int PKCS12_newpass(PKCS12 *p12, const char *oldpass, const char *newpass); -- --# ifdef __cplusplus --} --# endif --#endif -diff --git a/uadk_tool/include/openssl/pkcs12err.h b/uadk_tool/include/openssl/pkcs12err.h -deleted file mode 100644 -index eff5eb2..0000000 ---- a/uadk_tool/include/openssl/pkcs12err.h -+++ /dev/null -@@ -1,81 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_PKCS12ERR_H --# define HEADER_PKCS12ERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_PKCS12_strings(void); -- --/* -- * PKCS12 function codes. -- */ --# define PKCS12_F_OPENSSL_ASC2UNI 121 --# define PKCS12_F_OPENSSL_UNI2ASC 124 --# define PKCS12_F_OPENSSL_UNI2UTF8 127 --# define PKCS12_F_OPENSSL_UTF82UNI 129 --# define PKCS12_F_PKCS12_CREATE 105 --# define PKCS12_F_PKCS12_GEN_MAC 107 --# define PKCS12_F_PKCS12_INIT 109 --# define PKCS12_F_PKCS12_ITEM_DECRYPT_D2I 106 --# define PKCS12_F_PKCS12_ITEM_I2D_ENCRYPT 108 --# define PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG 117 --# define PKCS12_F_PKCS12_KEY_GEN_ASC 110 --# define PKCS12_F_PKCS12_KEY_GEN_UNI 111 --# define PKCS12_F_PKCS12_KEY_GEN_UTF8 116 --# define PKCS12_F_PKCS12_NEWPASS 128 --# define PKCS12_F_PKCS12_PACK_P7DATA 114 --# define PKCS12_F_PKCS12_PACK_P7ENCDATA 115 --# define PKCS12_F_PKCS12_PARSE 118 --# define PKCS12_F_PKCS12_PBE_CRYPT 119 --# define PKCS12_F_PKCS12_PBE_KEYIVGEN 120 --# define PKCS12_F_PKCS12_SAFEBAG_CREATE0_P8INF 112 --# define PKCS12_F_PKCS12_SAFEBAG_CREATE0_PKCS8 113 --# define PKCS12_F_PKCS12_SAFEBAG_CREATE_PKCS8_ENCRYPT 133 --# define PKCS12_F_PKCS12_SETUP_MAC 122 --# define PKCS12_F_PKCS12_SET_MAC 123 --# define PKCS12_F_PKCS12_UNPACK_AUTHSAFES 130 --# define PKCS12_F_PKCS12_UNPACK_P7DATA 131 --# define PKCS12_F_PKCS12_VERIFY_MAC 126 --# define PKCS12_F_PKCS8_ENCRYPT 125 --# define PKCS12_F_PKCS8_SET0_PBE 132 -- --/* -- * PKCS12 reason codes. -- */ --# define PKCS12_R_CANT_PACK_STRUCTURE 100 --# define PKCS12_R_CONTENT_TYPE_NOT_DATA 121 --# define PKCS12_R_DECODE_ERROR 101 --# define PKCS12_R_ENCODE_ERROR 102 --# define PKCS12_R_ENCRYPT_ERROR 103 --# define PKCS12_R_ERROR_SETTING_ENCRYPTED_DATA_TYPE 120 --# define PKCS12_R_INVALID_NULL_ARGUMENT 104 --# define PKCS12_R_INVALID_NULL_PKCS12_POINTER 105 --# define PKCS12_R_IV_GEN_ERROR 106 --# define PKCS12_R_KEY_GEN_ERROR 107 --# define PKCS12_R_MAC_ABSENT 108 --# define PKCS12_R_MAC_GENERATION_ERROR 109 --# define PKCS12_R_MAC_SETUP_ERROR 110 --# define PKCS12_R_MAC_STRING_SET_ERROR 111 --# define PKCS12_R_MAC_VERIFY_FAILURE 113 --# define PKCS12_R_PARSE_ERROR 114 --# define PKCS12_R_PKCS12_ALGOR_CIPHERINIT_ERROR 115 --# define PKCS12_R_PKCS12_CIPHERFINAL_ERROR 116 --# define PKCS12_R_PKCS12_PBE_CRYPT_ERROR 117 --# define PKCS12_R_UNKNOWN_DIGEST_ALGORITHM 118 --# define PKCS12_R_UNSUPPORTED_PKCS12_MODE 119 -- --#endif -diff --git a/uadk_tool/include/openssl/pkcs7.h b/uadk_tool/include/openssl/pkcs7.h -deleted file mode 100644 -index 9b66e00..0000000 ---- a/uadk_tool/include/openssl/pkcs7.h -+++ /dev/null -@@ -1,319 +0,0 @@ --/* -- * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_PKCS7_H --# define HEADER_PKCS7_H -- --# include --# include --# include -- --# include --# include --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --/*- --Encryption_ID DES-CBC --Digest_ID MD5 --Digest_Encryption_ID rsaEncryption --Key_Encryption_ID rsaEncryption --*/ -- --typedef struct pkcs7_issuer_and_serial_st { -- X509_NAME *issuer; -- ASN1_INTEGER *serial; --} PKCS7_ISSUER_AND_SERIAL; -- --typedef struct pkcs7_signer_info_st { -- ASN1_INTEGER *version; /* version 1 */ -- PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; -- X509_ALGOR *digest_alg; -- STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */ -- X509_ALGOR *digest_enc_alg; -- ASN1_OCTET_STRING *enc_digest; -- STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */ -- /* The private key to sign with */ -- EVP_PKEY *pkey; --} PKCS7_SIGNER_INFO; -- --DEFINE_STACK_OF(PKCS7_SIGNER_INFO) -- --typedef struct pkcs7_recip_info_st { -- ASN1_INTEGER *version; /* version 0 */ -- PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; -- X509_ALGOR *key_enc_algor; -- ASN1_OCTET_STRING *enc_key; -- X509 *cert; /* get the pub-key from this */ --} PKCS7_RECIP_INFO; -- --DEFINE_STACK_OF(PKCS7_RECIP_INFO) -- --typedef struct pkcs7_signed_st { -- ASN1_INTEGER *version; /* version 1 */ -- STACK_OF(X509_ALGOR) *md_algs; /* md used */ -- STACK_OF(X509) *cert; /* [ 0 ] */ -- STACK_OF(X509_CRL) *crl; /* [ 1 ] */ -- STACK_OF(PKCS7_SIGNER_INFO) *signer_info; -- struct pkcs7_st *contents; --} PKCS7_SIGNED; --/* -- * The above structure is very very similar to PKCS7_SIGN_ENVELOPE. How about -- * merging the two -- */ -- --typedef struct pkcs7_enc_content_st { -- ASN1_OBJECT *content_type; -- X509_ALGOR *algorithm; -- ASN1_OCTET_STRING *enc_data; /* [ 0 ] */ -- const EVP_CIPHER *cipher; --} PKCS7_ENC_CONTENT; -- --typedef struct pkcs7_enveloped_st { -- ASN1_INTEGER *version; /* version 0 */ -- STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; -- PKCS7_ENC_CONTENT *enc_data; --} PKCS7_ENVELOPE; -- --typedef struct pkcs7_signedandenveloped_st { -- ASN1_INTEGER *version; /* version 1 */ -- STACK_OF(X509_ALGOR) *md_algs; /* md used */ -- STACK_OF(X509) *cert; /* [ 0 ] */ -- STACK_OF(X509_CRL) *crl; /* [ 1 ] */ -- STACK_OF(PKCS7_SIGNER_INFO) *signer_info; -- PKCS7_ENC_CONTENT *enc_data; -- STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; --} PKCS7_SIGN_ENVELOPE; -- --typedef struct pkcs7_digest_st { -- ASN1_INTEGER *version; /* version 0 */ -- X509_ALGOR *md; /* md used */ -- struct pkcs7_st *contents; -- ASN1_OCTET_STRING *digest; --} PKCS7_DIGEST; -- --typedef struct pkcs7_encrypted_st { -- ASN1_INTEGER *version; /* version 0 */ -- PKCS7_ENC_CONTENT *enc_data; --} PKCS7_ENCRYPT; -- --typedef struct pkcs7_st { -- /* -- * The following is non NULL if it contains ASN1 encoding of this -- * structure -- */ -- unsigned char *asn1; -- long length; --# define PKCS7_S_HEADER 0 --# define PKCS7_S_BODY 1 --# define PKCS7_S_TAIL 2 -- int state; /* used during processing */ -- int detached; -- ASN1_OBJECT *type; -- /* content as defined by the type */ -- /* -- * all encryption/message digests are applied to the 'contents', leaving -- * out the 'type' field. -- */ -- union { -- char *ptr; -- /* NID_pkcs7_data */ -- ASN1_OCTET_STRING *data; -- /* NID_pkcs7_signed */ -- PKCS7_SIGNED *sign; -- /* NID_pkcs7_enveloped */ -- PKCS7_ENVELOPE *enveloped; -- /* NID_pkcs7_signedAndEnveloped */ -- PKCS7_SIGN_ENVELOPE *signed_and_enveloped; -- /* NID_pkcs7_digest */ -- PKCS7_DIGEST *digest; -- /* NID_pkcs7_encrypted */ -- PKCS7_ENCRYPT *encrypted; -- /* Anything else */ -- ASN1_TYPE *other; -- } d; --} PKCS7; -- --DEFINE_STACK_OF(PKCS7) -- --# define PKCS7_OP_SET_DETACHED_SIGNATURE 1 --# define PKCS7_OP_GET_DETACHED_SIGNATURE 2 -- --# define PKCS7_get_signed_attributes(si) ((si)->auth_attr) --# define PKCS7_get_attributes(si) ((si)->unauth_attr) -- --# define PKCS7_type_is_signed(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_signed) --# define PKCS7_type_is_encrypted(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_encrypted) --# define PKCS7_type_is_enveloped(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_enveloped) --# define PKCS7_type_is_signedAndEnveloped(a) \ -- (OBJ_obj2nid((a)->type) == NID_pkcs7_signedAndEnveloped) --# define PKCS7_type_is_data(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_data) --# define PKCS7_type_is_digest(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_digest) -- --# define PKCS7_set_detached(p,v) \ -- PKCS7_ctrl(p,PKCS7_OP_SET_DETACHED_SIGNATURE,v,NULL) --# define PKCS7_get_detached(p) \ -- PKCS7_ctrl(p,PKCS7_OP_GET_DETACHED_SIGNATURE,0,NULL) -- --# define PKCS7_is_detached(p7) (PKCS7_type_is_signed(p7) && PKCS7_get_detached(p7)) -- --/* S/MIME related flags */ -- --# define PKCS7_TEXT 0x1 --# define PKCS7_NOCERTS 0x2 --# define PKCS7_NOSIGS 0x4 --# define PKCS7_NOCHAIN 0x8 --# define PKCS7_NOINTERN 0x10 --# define PKCS7_NOVERIFY 0x20 --# define PKCS7_DETACHED 0x40 --# define PKCS7_BINARY 0x80 --# define PKCS7_NOATTR 0x100 --# define PKCS7_NOSMIMECAP 0x200 --# define PKCS7_NOOLDMIMETYPE 0x400 --# define PKCS7_CRLFEOL 0x800 --# define PKCS7_STREAM 0x1000 --# define PKCS7_NOCRL 0x2000 --# define PKCS7_PARTIAL 0x4000 --# define PKCS7_REUSE_DIGEST 0x8000 --# define PKCS7_NO_DUAL_CONTENT 0x10000 -- --/* Flags: for compatibility with older code */ -- --# define SMIME_TEXT PKCS7_TEXT --# define SMIME_NOCERTS PKCS7_NOCERTS --# define SMIME_NOSIGS PKCS7_NOSIGS --# define SMIME_NOCHAIN PKCS7_NOCHAIN --# define SMIME_NOINTERN PKCS7_NOINTERN --# define SMIME_NOVERIFY PKCS7_NOVERIFY --# define SMIME_DETACHED PKCS7_DETACHED --# define SMIME_BINARY PKCS7_BINARY --# define SMIME_NOATTR PKCS7_NOATTR -- --/* CRLF ASCII canonicalisation */ --# define SMIME_ASCIICRLF 0x80000 -- --DECLARE_ASN1_FUNCTIONS(PKCS7_ISSUER_AND_SERIAL) -- --int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data, -- const EVP_MD *type, unsigned char *md, -- unsigned int *len); --# ifndef OPENSSL_NO_STDIO --PKCS7 *d2i_PKCS7_fp(FILE *fp, PKCS7 **p7); --int i2d_PKCS7_fp(FILE *fp, PKCS7 *p7); --# endif --PKCS7 *PKCS7_dup(PKCS7 *p7); --PKCS7 *d2i_PKCS7_bio(BIO *bp, PKCS7 **p7); --int i2d_PKCS7_bio(BIO *bp, PKCS7 *p7); --int i2d_PKCS7_bio_stream(BIO *out, PKCS7 *p7, BIO *in, int flags); --int PEM_write_bio_PKCS7_stream(BIO *out, PKCS7 *p7, BIO *in, int flags); -- --DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNER_INFO) --DECLARE_ASN1_FUNCTIONS(PKCS7_RECIP_INFO) --DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNED) --DECLARE_ASN1_FUNCTIONS(PKCS7_ENC_CONTENT) --DECLARE_ASN1_FUNCTIONS(PKCS7_ENVELOPE) --DECLARE_ASN1_FUNCTIONS(PKCS7_SIGN_ENVELOPE) --DECLARE_ASN1_FUNCTIONS(PKCS7_DIGEST) --DECLARE_ASN1_FUNCTIONS(PKCS7_ENCRYPT) --DECLARE_ASN1_FUNCTIONS(PKCS7) -- --DECLARE_ASN1_ITEM(PKCS7_ATTR_SIGN) --DECLARE_ASN1_ITEM(PKCS7_ATTR_VERIFY) -- --DECLARE_ASN1_NDEF_FUNCTION(PKCS7) --DECLARE_ASN1_PRINT_FUNCTION(PKCS7) -- --long PKCS7_ctrl(PKCS7 *p7, int cmd, long larg, char *parg); -- --int PKCS7_set_type(PKCS7 *p7, int type); --int PKCS7_set0_type_other(PKCS7 *p7, int type, ASN1_TYPE *other); --int PKCS7_set_content(PKCS7 *p7, PKCS7 *p7_data); --int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey, -- const EVP_MD *dgst); --int PKCS7_SIGNER_INFO_sign(PKCS7_SIGNER_INFO *si); --int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *p7i); --int PKCS7_add_certificate(PKCS7 *p7, X509 *x509); --int PKCS7_add_crl(PKCS7 *p7, X509_CRL *x509); --int PKCS7_content_new(PKCS7 *p7, int nid); --int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx, -- BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si); --int PKCS7_signatureVerify(BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si, -- X509 *x509); -- --BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio); --int PKCS7_dataFinal(PKCS7 *p7, BIO *bio); --BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert); -- --PKCS7_SIGNER_INFO *PKCS7_add_signature(PKCS7 *p7, X509 *x509, -- EVP_PKEY *pkey, const EVP_MD *dgst); --X509 *PKCS7_cert_from_signer_info(PKCS7 *p7, PKCS7_SIGNER_INFO *si); --int PKCS7_set_digest(PKCS7 *p7, const EVP_MD *md); --STACK_OF(PKCS7_SIGNER_INFO) *PKCS7_get_signer_info(PKCS7 *p7); -- --PKCS7_RECIP_INFO *PKCS7_add_recipient(PKCS7 *p7, X509 *x509); --void PKCS7_SIGNER_INFO_get0_algs(PKCS7_SIGNER_INFO *si, EVP_PKEY **pk, -- X509_ALGOR **pdig, X509_ALGOR **psig); --void PKCS7_RECIP_INFO_get0_alg(PKCS7_RECIP_INFO *ri, X509_ALGOR **penc); --int PKCS7_add_recipient_info(PKCS7 *p7, PKCS7_RECIP_INFO *ri); --int PKCS7_RECIP_INFO_set(PKCS7_RECIP_INFO *p7i, X509 *x509); --int PKCS7_set_cipher(PKCS7 *p7, const EVP_CIPHER *cipher); --int PKCS7_stream(unsigned char ***boundary, PKCS7 *p7); -- --PKCS7_ISSUER_AND_SERIAL *PKCS7_get_issuer_and_serial(PKCS7 *p7, int idx); --ASN1_OCTET_STRING *PKCS7_digest_from_attributes(STACK_OF(X509_ATTRIBUTE) *sk); --int PKCS7_add_signed_attribute(PKCS7_SIGNER_INFO *p7si, int nid, int type, -- void *data); --int PKCS7_add_attribute(PKCS7_SIGNER_INFO *p7si, int nid, int atrtype, -- void *value); --ASN1_TYPE *PKCS7_get_attribute(PKCS7_SIGNER_INFO *si, int nid); --ASN1_TYPE *PKCS7_get_signed_attribute(PKCS7_SIGNER_INFO *si, int nid); --int PKCS7_set_signed_attributes(PKCS7_SIGNER_INFO *p7si, -- STACK_OF(X509_ATTRIBUTE) *sk); --int PKCS7_set_attributes(PKCS7_SIGNER_INFO *p7si, -- STACK_OF(X509_ATTRIBUTE) *sk); -- --PKCS7 *PKCS7_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, -- BIO *data, int flags); -- --PKCS7_SIGNER_INFO *PKCS7_sign_add_signer(PKCS7 *p7, -- X509 *signcert, EVP_PKEY *pkey, -- const EVP_MD *md, int flags); -- --int PKCS7_final(PKCS7 *p7, BIO *data, int flags); --int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store, -- BIO *indata, BIO *out, int flags); --STACK_OF(X509) *PKCS7_get0_signers(PKCS7 *p7, STACK_OF(X509) *certs, -- int flags); --PKCS7 *PKCS7_encrypt(STACK_OF(X509) *certs, BIO *in, const EVP_CIPHER *cipher, -- int flags); --int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, -- int flags); -- --int PKCS7_add_attrib_smimecap(PKCS7_SIGNER_INFO *si, -- STACK_OF(X509_ALGOR) *cap); --STACK_OF(X509_ALGOR) *PKCS7_get_smimecap(PKCS7_SIGNER_INFO *si); --int PKCS7_simple_smimecap(STACK_OF(X509_ALGOR) *sk, int nid, int arg); -- --int PKCS7_add_attrib_content_type(PKCS7_SIGNER_INFO *si, ASN1_OBJECT *coid); --int PKCS7_add0_attrib_signing_time(PKCS7_SIGNER_INFO *si, ASN1_TIME *t); --int PKCS7_add1_attrib_digest(PKCS7_SIGNER_INFO *si, -- const unsigned char *md, int mdlen); -- --int SMIME_write_PKCS7(BIO *bio, PKCS7 *p7, BIO *data, int flags); --PKCS7 *SMIME_read_PKCS7(BIO *bio, BIO **bcont); -- --BIO *BIO_new_PKCS7(BIO *out, PKCS7 *p7); -- --# ifdef __cplusplus --} --# endif --#endif -diff --git a/uadk_tool/include/openssl/pkcs7err.h b/uadk_tool/include/openssl/pkcs7err.h -deleted file mode 100644 -index 02e0299..0000000 ---- a/uadk_tool/include/openssl/pkcs7err.h -+++ /dev/null -@@ -1,103 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_PKCS7ERR_H --# define HEADER_PKCS7ERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_PKCS7_strings(void); -- --/* -- * PKCS7 function codes. -- */ --# define PKCS7_F_DO_PKCS7_SIGNED_ATTRIB 136 --# define PKCS7_F_PKCS7_ADD0_ATTRIB_SIGNING_TIME 135 --# define PKCS7_F_PKCS7_ADD_ATTRIB_SMIMECAP 118 --# define PKCS7_F_PKCS7_ADD_CERTIFICATE 100 --# define PKCS7_F_PKCS7_ADD_CRL 101 --# define PKCS7_F_PKCS7_ADD_RECIPIENT_INFO 102 --# define PKCS7_F_PKCS7_ADD_SIGNATURE 131 --# define PKCS7_F_PKCS7_ADD_SIGNER 103 --# define PKCS7_F_PKCS7_BIO_ADD_DIGEST 125 --# define PKCS7_F_PKCS7_COPY_EXISTING_DIGEST 138 --# define PKCS7_F_PKCS7_CTRL 104 --# define PKCS7_F_PKCS7_DATADECODE 112 --# define PKCS7_F_PKCS7_DATAFINAL 128 --# define PKCS7_F_PKCS7_DATAINIT 105 --# define PKCS7_F_PKCS7_DATAVERIFY 107 --# define PKCS7_F_PKCS7_DECRYPT 114 --# define PKCS7_F_PKCS7_DECRYPT_RINFO 133 --# define PKCS7_F_PKCS7_ENCODE_RINFO 132 --# define PKCS7_F_PKCS7_ENCRYPT 115 --# define PKCS7_F_PKCS7_FINAL 134 --# define PKCS7_F_PKCS7_FIND_DIGEST 127 --# define PKCS7_F_PKCS7_GET0_SIGNERS 124 --# define PKCS7_F_PKCS7_RECIP_INFO_SET 130 --# define PKCS7_F_PKCS7_SET_CIPHER 108 --# define PKCS7_F_PKCS7_SET_CONTENT 109 --# define PKCS7_F_PKCS7_SET_DIGEST 126 --# define PKCS7_F_PKCS7_SET_TYPE 110 --# define PKCS7_F_PKCS7_SIGN 116 --# define PKCS7_F_PKCS7_SIGNATUREVERIFY 113 --# define PKCS7_F_PKCS7_SIGNER_INFO_SET 129 --# define PKCS7_F_PKCS7_SIGNER_INFO_SIGN 139 --# define PKCS7_F_PKCS7_SIGN_ADD_SIGNER 137 --# define PKCS7_F_PKCS7_SIMPLE_SMIMECAP 119 --# define PKCS7_F_PKCS7_VERIFY 117 -- --/* -- * PKCS7 reason codes. -- */ --# define PKCS7_R_CERTIFICATE_VERIFY_ERROR 117 --# define PKCS7_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER 144 --# define PKCS7_R_CIPHER_NOT_INITIALIZED 116 --# define PKCS7_R_CONTENT_AND_DATA_PRESENT 118 --# define PKCS7_R_CTRL_ERROR 152 --# define PKCS7_R_DECRYPT_ERROR 119 --# define PKCS7_R_DIGEST_FAILURE 101 --# define PKCS7_R_ENCRYPTION_CTRL_FAILURE 149 --# define PKCS7_R_ENCRYPTION_NOT_SUPPORTED_FOR_THIS_KEY_TYPE 150 --# define PKCS7_R_ERROR_ADDING_RECIPIENT 120 --# define PKCS7_R_ERROR_SETTING_CIPHER 121 --# define PKCS7_R_INVALID_NULL_POINTER 143 --# define PKCS7_R_INVALID_SIGNED_DATA_TYPE 155 --# define PKCS7_R_NO_CONTENT 122 --# define PKCS7_R_NO_DEFAULT_DIGEST 151 --# define PKCS7_R_NO_MATCHING_DIGEST_TYPE_FOUND 154 --# define PKCS7_R_NO_RECIPIENT_MATCHES_CERTIFICATE 115 --# define PKCS7_R_NO_SIGNATURES_ON_DATA 123 --# define PKCS7_R_NO_SIGNERS 142 --# define PKCS7_R_OPERATION_NOT_SUPPORTED_ON_THIS_TYPE 104 --# define PKCS7_R_PKCS7_ADD_SIGNATURE_ERROR 124 --# define PKCS7_R_PKCS7_ADD_SIGNER_ERROR 153 --# define PKCS7_R_PKCS7_DATASIGN 145 --# define PKCS7_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 127 --# define PKCS7_R_SIGNATURE_FAILURE 105 --# define PKCS7_R_SIGNER_CERTIFICATE_NOT_FOUND 128 --# define PKCS7_R_SIGNING_CTRL_FAILURE 147 --# define PKCS7_R_SIGNING_NOT_SUPPORTED_FOR_THIS_KEY_TYPE 148 --# define PKCS7_R_SMIME_TEXT_ERROR 129 --# define PKCS7_R_UNABLE_TO_FIND_CERTIFICATE 106 --# define PKCS7_R_UNABLE_TO_FIND_MEM_BIO 107 --# define PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST 108 --# define PKCS7_R_UNKNOWN_DIGEST_TYPE 109 --# define PKCS7_R_UNKNOWN_OPERATION 110 --# define PKCS7_R_UNSUPPORTED_CIPHER_TYPE 111 --# define PKCS7_R_UNSUPPORTED_CONTENT_TYPE 112 --# define PKCS7_R_WRONG_CONTENT_TYPE 113 --# define PKCS7_R_WRONG_PKCS7_TYPE 114 -- --#endif -diff --git a/uadk_tool/include/openssl/rand.h b/uadk_tool/include/openssl/rand.h -deleted file mode 100644 -index 38a2a27..0000000 ---- a/uadk_tool/include/openssl/rand.h -+++ /dev/null -@@ -1,77 +0,0 @@ --/* -- * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_RAND_H --# define HEADER_RAND_H -- --# include --# include --# include --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --struct rand_meth_st { -- int (*seed) (const void *buf, int num); -- int (*bytes) (unsigned char *buf, int num); -- void (*cleanup) (void); -- int (*add) (const void *buf, int num, double randomness); -- int (*pseudorand) (unsigned char *buf, int num); -- int (*status) (void); --}; -- --int RAND_set_rand_method(const RAND_METHOD *meth); --const RAND_METHOD *RAND_get_rand_method(void); --# ifndef OPENSSL_NO_ENGINE --int RAND_set_rand_engine(ENGINE *engine); --# endif -- --RAND_METHOD *RAND_OpenSSL(void); -- --# if OPENSSL_API_COMPAT < 0x10100000L --# define RAND_cleanup() while(0) continue --# endif --int RAND_bytes(unsigned char *buf, int num); --int RAND_priv_bytes(unsigned char *buf, int num); --DEPRECATEDIN_1_1_0(int RAND_pseudo_bytes(unsigned char *buf, int num)) -- --void RAND_seed(const void *buf, int num); --void RAND_keep_random_devices_open(int keep); -- --# if defined(__ANDROID__) && defined(__NDK_FPABI__) --__NDK_FPABI__ /* __attribute__((pcs("aapcs"))) on ARM */ --# endif --void RAND_add(const void *buf, int num, double randomness); --int RAND_load_file(const char *file, long max_bytes); --int RAND_write_file(const char *file); --const char *RAND_file_name(char *file, size_t num); --int RAND_status(void); -- --# ifndef OPENSSL_NO_EGD --int RAND_query_egd_bytes(const char *path, unsigned char *buf, int bytes); --int RAND_egd(const char *path); --int RAND_egd_bytes(const char *path, int bytes); --# endif -- --int RAND_poll(void); -- --# if defined(_WIN32) && (defined(BASETYPES) || defined(_WINDEF_H)) --/* application has to include in order to use these */ --DEPRECATEDIN_1_1_0(void RAND_screen(void)) --DEPRECATEDIN_1_1_0(int RAND_event(UINT, WPARAM, LPARAM)) --# endif -- -- --#ifdef __cplusplus --} --#endif -- --#endif -diff --git a/uadk_tool/include/openssl/rand_drbg.h b/uadk_tool/include/openssl/rand_drbg.h -deleted file mode 100644 -index 45b731b..0000000 ---- a/uadk_tool/include/openssl/rand_drbg.h -+++ /dev/null -@@ -1,130 +0,0 @@ --/* -- * Copyright 2017-2018 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_DRBG_RAND_H --# define HEADER_DRBG_RAND_H -- --# include --# include --# include -- --/* -- * RAND_DRBG flags -- * -- * Note: if new flags are added, the constant `rand_drbg_used_flags` -- * in drbg_lib.c needs to be updated accordingly. -- */ -- --/* In CTR mode, disable derivation function ctr_df */ --# define RAND_DRBG_FLAG_CTR_NO_DF 0x1 -- -- --# if OPENSSL_API_COMPAT < 0x10200000L --/* This #define was replaced by an internal constant and should not be used. */ --# define RAND_DRBG_USED_FLAGS (RAND_DRBG_FLAG_CTR_NO_DF) --# endif -- --/* -- * Default security strength (in the sense of [NIST SP 800-90Ar1]) -- * -- * NIST SP 800-90Ar1 supports the strength of the DRBG being smaller than that -- * of the cipher by collecting less entropy. The current DRBG implementation -- * does not take RAND_DRBG_STRENGTH into account and sets the strength of the -- * DRBG to that of the cipher. -- * -- * RAND_DRBG_STRENGTH is currently only used for the legacy RAND -- * implementation. -- * -- * Currently supported ciphers are: NID_aes_128_ctr, NID_aes_192_ctr and -- * NID_aes_256_ctr -- */ --# define RAND_DRBG_STRENGTH 256 --/* Default drbg type */ --# define RAND_DRBG_TYPE NID_aes_256_ctr --/* Default drbg flags */ --# define RAND_DRBG_FLAGS 0 -- -- --# ifdef __cplusplus --extern "C" { --# endif -- --/* -- * Object lifetime functions. -- */ --RAND_DRBG *RAND_DRBG_new(int type, unsigned int flags, RAND_DRBG *parent); --RAND_DRBG *RAND_DRBG_secure_new(int type, unsigned int flags, RAND_DRBG *parent); --int RAND_DRBG_set(RAND_DRBG *drbg, int type, unsigned int flags); --int RAND_DRBG_set_defaults(int type, unsigned int flags); --int RAND_DRBG_instantiate(RAND_DRBG *drbg, -- const unsigned char *pers, size_t perslen); --int RAND_DRBG_uninstantiate(RAND_DRBG *drbg); --void RAND_DRBG_free(RAND_DRBG *drbg); -- --/* -- * Object "use" functions. -- */ --int RAND_DRBG_reseed(RAND_DRBG *drbg, -- const unsigned char *adin, size_t adinlen, -- int prediction_resistance); --int RAND_DRBG_generate(RAND_DRBG *drbg, unsigned char *out, size_t outlen, -- int prediction_resistance, -- const unsigned char *adin, size_t adinlen); --int RAND_DRBG_bytes(RAND_DRBG *drbg, unsigned char *out, size_t outlen); -- --int RAND_DRBG_set_reseed_interval(RAND_DRBG *drbg, unsigned int interval); --int RAND_DRBG_set_reseed_time_interval(RAND_DRBG *drbg, time_t interval); -- --int RAND_DRBG_set_reseed_defaults( -- unsigned int master_reseed_interval, -- unsigned int slave_reseed_interval, -- time_t master_reseed_time_interval, -- time_t slave_reseed_time_interval -- ); -- --RAND_DRBG *RAND_DRBG_get0_master(void); --RAND_DRBG *RAND_DRBG_get0_public(void); --RAND_DRBG *RAND_DRBG_get0_private(void); -- --/* -- * EXDATA -- */ --# define RAND_DRBG_get_ex_new_index(l, p, newf, dupf, freef) \ -- CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_DRBG, l, p, newf, dupf, freef) --int RAND_DRBG_set_ex_data(RAND_DRBG *drbg, int idx, void *arg); --void *RAND_DRBG_get_ex_data(const RAND_DRBG *drbg, int idx); -- --/* -- * Callback function typedefs -- */ --typedef size_t (*RAND_DRBG_get_entropy_fn)(RAND_DRBG *drbg, -- unsigned char **pout, -- int entropy, size_t min_len, -- size_t max_len, -- int prediction_resistance); --typedef void (*RAND_DRBG_cleanup_entropy_fn)(RAND_DRBG *ctx, -- unsigned char *out, size_t outlen); --typedef size_t (*RAND_DRBG_get_nonce_fn)(RAND_DRBG *drbg, unsigned char **pout, -- int entropy, size_t min_len, -- size_t max_len); --typedef void (*RAND_DRBG_cleanup_nonce_fn)(RAND_DRBG *drbg, -- unsigned char *out, size_t outlen); -- --int RAND_DRBG_set_callbacks(RAND_DRBG *drbg, -- RAND_DRBG_get_entropy_fn get_entropy, -- RAND_DRBG_cleanup_entropy_fn cleanup_entropy, -- RAND_DRBG_get_nonce_fn get_nonce, -- RAND_DRBG_cleanup_nonce_fn cleanup_nonce); -- -- --# ifdef __cplusplus --} --# endif -- --#endif -diff --git a/uadk_tool/include/openssl/randerr.h b/uadk_tool/include/openssl/randerr.h -deleted file mode 100644 -index 79d5790..0000000 ---- a/uadk_tool/include/openssl/randerr.h -+++ /dev/null -@@ -1,94 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_RANDERR_H --# define HEADER_RANDERR_H -- --# include -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_RAND_strings(void); -- --/* -- * RAND function codes. -- */ --# define RAND_F_DATA_COLLECT_METHOD 127 --# define RAND_F_DRBG_BYTES 101 --# define RAND_F_DRBG_GET_ENTROPY 105 --# define RAND_F_DRBG_SETUP 117 --# define RAND_F_GET_ENTROPY 106 --# define RAND_F_RAND_BYTES 100 --# define RAND_F_RAND_DRBG_ENABLE_LOCKING 119 --# define RAND_F_RAND_DRBG_GENERATE 107 --# define RAND_F_RAND_DRBG_GET_ENTROPY 120 --# define RAND_F_RAND_DRBG_GET_NONCE 123 --# define RAND_F_RAND_DRBG_INSTANTIATE 108 --# define RAND_F_RAND_DRBG_NEW 109 --# define RAND_F_RAND_DRBG_RESEED 110 --# define RAND_F_RAND_DRBG_RESTART 102 --# define RAND_F_RAND_DRBG_SET 104 --# define RAND_F_RAND_DRBG_SET_DEFAULTS 121 --# define RAND_F_RAND_DRBG_UNINSTANTIATE 118 --# define RAND_F_RAND_LOAD_FILE 111 --# define RAND_F_RAND_POOL_ACQUIRE_ENTROPY 122 --# define RAND_F_RAND_POOL_ADD 103 --# define RAND_F_RAND_POOL_ADD_BEGIN 113 --# define RAND_F_RAND_POOL_ADD_END 114 --# define RAND_F_RAND_POOL_ATTACH 124 --# define RAND_F_RAND_POOL_BYTES_NEEDED 115 --# define RAND_F_RAND_POOL_GROW 125 --# define RAND_F_RAND_POOL_NEW 116 --# define RAND_F_RAND_PSEUDO_BYTES 126 --# define RAND_F_RAND_WRITE_FILE 112 -- --/* -- * RAND reason codes. -- */ --# define RAND_R_ADDITIONAL_INPUT_TOO_LONG 102 --# define RAND_R_ALREADY_INSTANTIATED 103 --# define RAND_R_ARGUMENT_OUT_OF_RANGE 105 --# define RAND_R_CANNOT_OPEN_FILE 121 --# define RAND_R_DRBG_ALREADY_INITIALIZED 129 --# define RAND_R_DRBG_NOT_INITIALISED 104 --# define RAND_R_ENTROPY_INPUT_TOO_LONG 106 --# define RAND_R_ENTROPY_OUT_OF_RANGE 124 --# define RAND_R_ERROR_ENTROPY_POOL_WAS_IGNORED 127 --# define RAND_R_ERROR_INITIALISING_DRBG 107 --# define RAND_R_ERROR_INSTANTIATING_DRBG 108 --# define RAND_R_ERROR_RETRIEVING_ADDITIONAL_INPUT 109 --# define RAND_R_ERROR_RETRIEVING_ENTROPY 110 --# define RAND_R_ERROR_RETRIEVING_NONCE 111 --# define RAND_R_FAILED_TO_CREATE_LOCK 126 --# define RAND_R_FUNC_NOT_IMPLEMENTED 101 --# define RAND_R_FWRITE_ERROR 123 --# define RAND_R_GENERATE_ERROR 112 --# define RAND_R_INTERNAL_ERROR 113 --# define RAND_R_IN_ERROR_STATE 114 --# define RAND_R_NOT_A_REGULAR_FILE 122 --# define RAND_R_NOT_INSTANTIATED 115 --# define RAND_R_NO_DRBG_IMPLEMENTATION_SELECTED 128 --# define RAND_R_PARENT_LOCKING_NOT_ENABLED 130 --# define RAND_R_PARENT_STRENGTH_TOO_WEAK 131 --# define RAND_R_PERSONALISATION_STRING_TOO_LONG 116 --# define RAND_R_PREDICTION_RESISTANCE_NOT_SUPPORTED 133 --# define RAND_R_PRNG_NOT_SEEDED 100 --# define RAND_R_RANDOM_POOL_OVERFLOW 125 --# define RAND_R_RANDOM_POOL_UNDERFLOW 134 --# define RAND_R_REQUEST_TOO_LARGE_FOR_DRBG 117 --# define RAND_R_RESEED_ERROR 118 --# define RAND_R_SELFTEST_FAILURE 119 --# define RAND_R_TOO_LITTLE_NONCE_REQUESTED 135 --# define RAND_R_TOO_MUCH_NONCE_REQUESTED 136 --# define RAND_R_UNSUPPORTED_DRBG_FLAGS 132 --# define RAND_R_UNSUPPORTED_DRBG_TYPE 120 -- --#endif -diff --git a/uadk_tool/include/openssl/rc2.h b/uadk_tool/include/openssl/rc2.h -deleted file mode 100644 -index 585f9e4..0000000 ---- a/uadk_tool/include/openssl/rc2.h -+++ /dev/null -@@ -1,51 +0,0 @@ --/* -- * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_RC2_H --# define HEADER_RC2_H -- --# include -- --# ifndef OPENSSL_NO_RC2 --# ifdef __cplusplus --extern "C" { --# endif -- --typedef unsigned int RC2_INT; -- --# define RC2_ENCRYPT 1 --# define RC2_DECRYPT 0 -- --# define RC2_BLOCK 8 --# define RC2_KEY_LENGTH 16 -- --typedef struct rc2_key_st { -- RC2_INT data[64]; --} RC2_KEY; -- --void RC2_set_key(RC2_KEY *key, int len, const unsigned char *data, int bits); --void RC2_ecb_encrypt(const unsigned char *in, unsigned char *out, -- RC2_KEY *key, int enc); --void RC2_encrypt(unsigned long *data, RC2_KEY *key); --void RC2_decrypt(unsigned long *data, RC2_KEY *key); --void RC2_cbc_encrypt(const unsigned char *in, unsigned char *out, long length, -- RC2_KEY *ks, unsigned char *iv, int enc); --void RC2_cfb64_encrypt(const unsigned char *in, unsigned char *out, -- long length, RC2_KEY *schedule, unsigned char *ivec, -- int *num, int enc); --void RC2_ofb64_encrypt(const unsigned char *in, unsigned char *out, -- long length, RC2_KEY *schedule, unsigned char *ivec, -- int *num); -- --# ifdef __cplusplus --} --# endif --# endif -- --#endif -diff --git a/uadk_tool/include/openssl/rc4.h b/uadk_tool/include/openssl/rc4.h -deleted file mode 100644 -index 86803b3..0000000 ---- a/uadk_tool/include/openssl/rc4.h -+++ /dev/null -@@ -1,36 +0,0 @@ --/* -- * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_RC4_H --# define HEADER_RC4_H -- --# include -- --# ifndef OPENSSL_NO_RC4 --# include --#ifdef __cplusplus --extern "C" { --#endif -- --typedef struct rc4_key_st { -- RC4_INT x, y; -- RC4_INT data[256]; --} RC4_KEY; -- --const char *RC4_options(void); --void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data); --void RC4(RC4_KEY *key, size_t len, const unsigned char *indata, -- unsigned char *outdata); -- --# ifdef __cplusplus --} --# endif --# endif -- --#endif -diff --git a/uadk_tool/include/openssl/rc5.h b/uadk_tool/include/openssl/rc5.h -deleted file mode 100644 -index 793f88e..0000000 ---- a/uadk_tool/include/openssl/rc5.h -+++ /dev/null -@@ -1,63 +0,0 @@ --/* -- * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_RC5_H --# define HEADER_RC5_H -- --# include -- --# ifndef OPENSSL_NO_RC5 --# ifdef __cplusplus --extern "C" { --# endif -- --# define RC5_ENCRYPT 1 --# define RC5_DECRYPT 0 -- --# define RC5_32_INT unsigned int -- --# define RC5_32_BLOCK 8 --# define RC5_32_KEY_LENGTH 16/* This is a default, max is 255 */ -- --/* -- * This are the only values supported. Tweak the code if you want more The -- * most supported modes will be RC5-32/12/16 RC5-32/16/8 -- */ --# define RC5_8_ROUNDS 8 --# define RC5_12_ROUNDS 12 --# define RC5_16_ROUNDS 16 -- --typedef struct rc5_key_st { -- /* Number of rounds */ -- int rounds; -- RC5_32_INT data[2 * (RC5_16_ROUNDS + 1)]; --} RC5_32_KEY; -- --void RC5_32_set_key(RC5_32_KEY *key, int len, const unsigned char *data, -- int rounds); --void RC5_32_ecb_encrypt(const unsigned char *in, unsigned char *out, -- RC5_32_KEY *key, int enc); --void RC5_32_encrypt(unsigned long *data, RC5_32_KEY *key); --void RC5_32_decrypt(unsigned long *data, RC5_32_KEY *key); --void RC5_32_cbc_encrypt(const unsigned char *in, unsigned char *out, -- long length, RC5_32_KEY *ks, unsigned char *iv, -- int enc); --void RC5_32_cfb64_encrypt(const unsigned char *in, unsigned char *out, -- long length, RC5_32_KEY *schedule, -- unsigned char *ivec, int *num, int enc); --void RC5_32_ofb64_encrypt(const unsigned char *in, unsigned char *out, -- long length, RC5_32_KEY *schedule, -- unsigned char *ivec, int *num); -- --# ifdef __cplusplus --} --# endif --# endif -- --#endif -diff --git a/uadk_tool/include/openssl/ripemd.h b/uadk_tool/include/openssl/ripemd.h -deleted file mode 100644 -index c42026a..0000000 ---- a/uadk_tool/include/openssl/ripemd.h -+++ /dev/null -@@ -1,47 +0,0 @@ --/* -- * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_RIPEMD_H --# define HEADER_RIPEMD_H -- --# include -- --#ifndef OPENSSL_NO_RMD160 --# include --# include --# ifdef __cplusplus --extern "C" { --# endif -- --# define RIPEMD160_LONG unsigned int -- --# define RIPEMD160_CBLOCK 64 --# define RIPEMD160_LBLOCK (RIPEMD160_CBLOCK/4) --# define RIPEMD160_DIGEST_LENGTH 20 -- --typedef struct RIPEMD160state_st { -- RIPEMD160_LONG A, B, C, D, E; -- RIPEMD160_LONG Nl, Nh; -- RIPEMD160_LONG data[RIPEMD160_LBLOCK]; -- unsigned int num; --} RIPEMD160_CTX; -- --int RIPEMD160_Init(RIPEMD160_CTX *c); --int RIPEMD160_Update(RIPEMD160_CTX *c, const void *data, size_t len); --int RIPEMD160_Final(unsigned char *md, RIPEMD160_CTX *c); --unsigned char *RIPEMD160(const unsigned char *d, size_t n, unsigned char *md); --void RIPEMD160_Transform(RIPEMD160_CTX *c, const unsigned char *b); -- --# ifdef __cplusplus --} --# endif --# endif -- -- --#endif -diff --git a/uadk_tool/include/openssl/rsa.h b/uadk_tool/include/openssl/rsa.h -deleted file mode 100644 -index 5e76365..0000000 ---- a/uadk_tool/include/openssl/rsa.h -+++ /dev/null -@@ -1,513 +0,0 @@ --/* -- * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_RSA_H --# define HEADER_RSA_H -- --# include -- --# ifndef OPENSSL_NO_RSA --# include --# include --# include --# include --# if OPENSSL_API_COMPAT < 0x10100000L --# include --# endif --# include --# ifdef __cplusplus --extern "C" { --# endif -- --/* The types RSA and RSA_METHOD are defined in ossl_typ.h */ -- --# ifndef OPENSSL_RSA_MAX_MODULUS_BITS --# define OPENSSL_RSA_MAX_MODULUS_BITS 16384 --# endif -- --# define OPENSSL_RSA_FIPS_MIN_MODULUS_BITS 1024 -- --# ifndef OPENSSL_RSA_SMALL_MODULUS_BITS --# define OPENSSL_RSA_SMALL_MODULUS_BITS 3072 --# endif --# ifndef OPENSSL_RSA_MAX_PUBEXP_BITS -- --/* exponent limit enforced for "large" modulus only */ --# define OPENSSL_RSA_MAX_PUBEXP_BITS 64 --# endif -- --# define RSA_3 0x3L --# define RSA_F4 0x10001L -- --/* based on RFC 8017 appendix A.1.2 */ --# define RSA_ASN1_VERSION_DEFAULT 0 --# define RSA_ASN1_VERSION_MULTI 1 -- --# define RSA_DEFAULT_PRIME_NUM 2 -- --# define RSA_METHOD_FLAG_NO_CHECK 0x0001/* don't check pub/private -- * match */ -- --# define RSA_FLAG_CACHE_PUBLIC 0x0002 --# define RSA_FLAG_CACHE_PRIVATE 0x0004 --# define RSA_FLAG_BLINDING 0x0008 --# define RSA_FLAG_THREAD_SAFE 0x0010 --/* -- * This flag means the private key operations will be handled by rsa_mod_exp -- * and that they do not depend on the private key components being present: -- * for example a key stored in external hardware. Without this flag -- * bn_mod_exp gets called when private key components are absent. -- */ --# define RSA_FLAG_EXT_PKEY 0x0020 -- --/* -- * new with 0.9.6j and 0.9.7b; the built-in -- * RSA implementation now uses blinding by -- * default (ignoring RSA_FLAG_BLINDING), -- * but other engines might not need it -- */ --# define RSA_FLAG_NO_BLINDING 0x0080 --# if OPENSSL_API_COMPAT < 0x10100000L --/* -- * Does nothing. Previously this switched off constant time behaviour. -- */ --# define RSA_FLAG_NO_CONSTTIME 0x0000 --# endif --# if OPENSSL_API_COMPAT < 0x00908000L --/* deprecated name for the flag*/ --/* -- * new with 0.9.7h; the built-in RSA -- * implementation now uses constant time -- * modular exponentiation for secret exponents -- * by default. This flag causes the -- * faster variable sliding window method to -- * be used for all exponents. -- */ --# define RSA_FLAG_NO_EXP_CONSTTIME RSA_FLAG_NO_CONSTTIME --# endif -- --# define EVP_PKEY_CTX_set_rsa_padding(ctx, pad) \ -- RSA_pkey_ctx_ctrl(ctx, -1, EVP_PKEY_CTRL_RSA_PADDING, pad, NULL) -- --# define EVP_PKEY_CTX_get_rsa_padding(ctx, ppad) \ -- RSA_pkey_ctx_ctrl(ctx, -1, EVP_PKEY_CTRL_GET_RSA_PADDING, 0, ppad) -- --# define EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, len) \ -- RSA_pkey_ctx_ctrl(ctx, (EVP_PKEY_OP_SIGN|EVP_PKEY_OP_VERIFY), \ -- EVP_PKEY_CTRL_RSA_PSS_SALTLEN, len, NULL) --/* Salt length matches digest */ --# define RSA_PSS_SALTLEN_DIGEST -1 --/* Verify only: auto detect salt length */ --# define RSA_PSS_SALTLEN_AUTO -2 --/* Set salt length to maximum possible */ --# define RSA_PSS_SALTLEN_MAX -3 --/* Old compatible max salt length for sign only */ --# define RSA_PSS_SALTLEN_MAX_SIGN -2 -- --# define EVP_PKEY_CTX_set_rsa_pss_keygen_saltlen(ctx, len) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA_PSS, EVP_PKEY_OP_KEYGEN, \ -- EVP_PKEY_CTRL_RSA_PSS_SALTLEN, len, NULL) -- --# define EVP_PKEY_CTX_get_rsa_pss_saltlen(ctx, plen) \ -- RSA_pkey_ctx_ctrl(ctx, (EVP_PKEY_OP_SIGN|EVP_PKEY_OP_VERIFY), \ -- EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN, 0, plen) -- --# define EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, bits) \ -- RSA_pkey_ctx_ctrl(ctx, EVP_PKEY_OP_KEYGEN, \ -- EVP_PKEY_CTRL_RSA_KEYGEN_BITS, bits, NULL) -- --# define EVP_PKEY_CTX_set_rsa_keygen_pubexp(ctx, pubexp) \ -- RSA_pkey_ctx_ctrl(ctx, EVP_PKEY_OP_KEYGEN, \ -- EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP, 0, pubexp) -- --# define EVP_PKEY_CTX_set_rsa_keygen_primes(ctx, primes) \ -- RSA_pkey_ctx_ctrl(ctx, EVP_PKEY_OP_KEYGEN, \ -- EVP_PKEY_CTRL_RSA_KEYGEN_PRIMES, primes, NULL) -- --# define EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, md) \ -- RSA_pkey_ctx_ctrl(ctx, EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT, \ -- EVP_PKEY_CTRL_RSA_MGF1_MD, 0, (void *)(md)) -- --# define EVP_PKEY_CTX_set_rsa_pss_keygen_mgf1_md(ctx, md) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA_PSS, EVP_PKEY_OP_KEYGEN, \ -- EVP_PKEY_CTRL_RSA_MGF1_MD, 0, (void *)(md)) -- --# define EVP_PKEY_CTX_set_rsa_oaep_md(ctx, md) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ -- EVP_PKEY_CTRL_RSA_OAEP_MD, 0, (void *)(md)) -- --# define EVP_PKEY_CTX_get_rsa_mgf1_md(ctx, pmd) \ -- RSA_pkey_ctx_ctrl(ctx, EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT, \ -- EVP_PKEY_CTRL_GET_RSA_MGF1_MD, 0, (void *)(pmd)) -- --# define EVP_PKEY_CTX_get_rsa_oaep_md(ctx, pmd) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ -- EVP_PKEY_CTRL_GET_RSA_OAEP_MD, 0, (void *)(pmd)) -- --# define EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, l, llen) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ -- EVP_PKEY_CTRL_RSA_OAEP_LABEL, llen, (void *)(l)) -- --# define EVP_PKEY_CTX_get0_rsa_oaep_label(ctx, l) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT, \ -- EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL, 0, (void *)(l)) -- --# define EVP_PKEY_CTX_set_rsa_pss_keygen_md(ctx, md) \ -- EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA_PSS, \ -- EVP_PKEY_OP_KEYGEN, EVP_PKEY_CTRL_MD, \ -- 0, (void *)(md)) -- --# define EVP_PKEY_CTRL_RSA_PADDING (EVP_PKEY_ALG_CTRL + 1) --# define EVP_PKEY_CTRL_RSA_PSS_SALTLEN (EVP_PKEY_ALG_CTRL + 2) -- --# define EVP_PKEY_CTRL_RSA_KEYGEN_BITS (EVP_PKEY_ALG_CTRL + 3) --# define EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP (EVP_PKEY_ALG_CTRL + 4) --# define EVP_PKEY_CTRL_RSA_MGF1_MD (EVP_PKEY_ALG_CTRL + 5) -- --# define EVP_PKEY_CTRL_GET_RSA_PADDING (EVP_PKEY_ALG_CTRL + 6) --# define EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN (EVP_PKEY_ALG_CTRL + 7) --# define EVP_PKEY_CTRL_GET_RSA_MGF1_MD (EVP_PKEY_ALG_CTRL + 8) -- --# define EVP_PKEY_CTRL_RSA_OAEP_MD (EVP_PKEY_ALG_CTRL + 9) --# define EVP_PKEY_CTRL_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 10) -- --# define EVP_PKEY_CTRL_GET_RSA_OAEP_MD (EVP_PKEY_ALG_CTRL + 11) --# define EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 12) -- --# define EVP_PKEY_CTRL_RSA_KEYGEN_PRIMES (EVP_PKEY_ALG_CTRL + 13) -- --# define RSA_PKCS1_PADDING 1 --# define RSA_SSLV23_PADDING 2 --# define RSA_NO_PADDING 3 --# define RSA_PKCS1_OAEP_PADDING 4 --# define RSA_X931_PADDING 5 --/* EVP_PKEY_ only */ --# define RSA_PKCS1_PSS_PADDING 6 -- --# define RSA_PKCS1_PADDING_SIZE 11 -- --# define RSA_set_app_data(s,arg) RSA_set_ex_data(s,0,arg) --# define RSA_get_app_data(s) RSA_get_ex_data(s,0) -- --RSA *RSA_new(void); --RSA *RSA_new_method(ENGINE *engine); --int RSA_bits(const RSA *rsa); --int RSA_size(const RSA *rsa); --int RSA_security_bits(const RSA *rsa); -- --int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d); --int RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q); --int RSA_set0_crt_params(RSA *r,BIGNUM *dmp1, BIGNUM *dmq1, BIGNUM *iqmp); --int RSA_set0_multi_prime_params(RSA *r, BIGNUM *primes[], BIGNUM *exps[], -- BIGNUM *coeffs[], int pnum); --void RSA_get0_key(const RSA *r, -- const BIGNUM **n, const BIGNUM **e, const BIGNUM **d); --void RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q); --int RSA_get_multi_prime_extra_count(const RSA *r); --int RSA_get0_multi_prime_factors(const RSA *r, const BIGNUM *primes[]); --void RSA_get0_crt_params(const RSA *r, -- const BIGNUM **dmp1, const BIGNUM **dmq1, -- const BIGNUM **iqmp); --int RSA_get0_multi_prime_crt_params(const RSA *r, const BIGNUM *exps[], -- const BIGNUM *coeffs[]); --const BIGNUM *RSA_get0_n(const RSA *d); --const BIGNUM *RSA_get0_e(const RSA *d); --const BIGNUM *RSA_get0_d(const RSA *d); --const BIGNUM *RSA_get0_p(const RSA *d); --const BIGNUM *RSA_get0_q(const RSA *d); --const BIGNUM *RSA_get0_dmp1(const RSA *r); --const BIGNUM *RSA_get0_dmq1(const RSA *r); --const BIGNUM *RSA_get0_iqmp(const RSA *r); --const RSA_PSS_PARAMS *RSA_get0_pss_params(const RSA *r); --void RSA_clear_flags(RSA *r, int flags); --int RSA_test_flags(const RSA *r, int flags); --void RSA_set_flags(RSA *r, int flags); --int RSA_get_version(RSA *r); --ENGINE *RSA_get0_engine(const RSA *r); -- --/* Deprecated version */ --DEPRECATEDIN_0_9_8(RSA *RSA_generate_key(int bits, unsigned long e, void -- (*callback) (int, int, void *), -- void *cb_arg)) -- --/* New version */ --int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); --/* Multi-prime version */ --int RSA_generate_multi_prime_key(RSA *rsa, int bits, int primes, -- BIGNUM *e, BN_GENCB *cb); -- --int RSA_X931_derive_ex(RSA *rsa, BIGNUM *p1, BIGNUM *p2, BIGNUM *q1, -- BIGNUM *q2, const BIGNUM *Xp1, const BIGNUM *Xp2, -- const BIGNUM *Xp, const BIGNUM *Xq1, const BIGNUM *Xq2, -- const BIGNUM *Xq, const BIGNUM *e, BN_GENCB *cb); --int RSA_X931_generate_key_ex(RSA *rsa, int bits, const BIGNUM *e, -- BN_GENCB *cb); -- --int RSA_check_key(const RSA *); --int RSA_check_key_ex(const RSA *, BN_GENCB *cb); -- /* next 4 return -1 on error */ --int RSA_public_encrypt(int flen, const unsigned char *from, -- unsigned char *to, RSA *rsa, int padding); --int RSA_private_encrypt(int flen, const unsigned char *from, -- unsigned char *to, RSA *rsa, int padding); --int RSA_public_decrypt(int flen, const unsigned char *from, -- unsigned char *to, RSA *rsa, int padding); --int RSA_private_decrypt(int flen, const unsigned char *from, -- unsigned char *to, RSA *rsa, int padding); --void RSA_free(RSA *r); --/* "up" the RSA object's reference count */ --int RSA_up_ref(RSA *r); -- --int RSA_flags(const RSA *r); -- --void RSA_set_default_method(const RSA_METHOD *meth); --const RSA_METHOD *RSA_get_default_method(void); --const RSA_METHOD *RSA_null_method(void); --const RSA_METHOD *RSA_get_method(const RSA *rsa); --int RSA_set_method(RSA *rsa, const RSA_METHOD *meth); -- --/* these are the actual RSA functions */ --const RSA_METHOD *RSA_PKCS1_OpenSSL(void); -- --int RSA_pkey_ctx_ctrl(EVP_PKEY_CTX *ctx, int optype, int cmd, int p1, void *p2); -- --DECLARE_ASN1_ENCODE_FUNCTIONS_const(RSA, RSAPublicKey) --DECLARE_ASN1_ENCODE_FUNCTIONS_const(RSA, RSAPrivateKey) -- --struct rsa_pss_params_st { -- X509_ALGOR *hashAlgorithm; -- X509_ALGOR *maskGenAlgorithm; -- ASN1_INTEGER *saltLength; -- ASN1_INTEGER *trailerField; -- /* Decoded hash algorithm from maskGenAlgorithm */ -- X509_ALGOR *maskHash; --}; -- --DECLARE_ASN1_FUNCTIONS(RSA_PSS_PARAMS) -- --typedef struct rsa_oaep_params_st { -- X509_ALGOR *hashFunc; -- X509_ALGOR *maskGenFunc; -- X509_ALGOR *pSourceFunc; -- /* Decoded hash algorithm from maskGenFunc */ -- X509_ALGOR *maskHash; --} RSA_OAEP_PARAMS; -- --DECLARE_ASN1_FUNCTIONS(RSA_OAEP_PARAMS) -- --# ifndef OPENSSL_NO_STDIO --int RSA_print_fp(FILE *fp, const RSA *r, int offset); --# endif -- --int RSA_print(BIO *bp, const RSA *r, int offset); -- --/* -- * The following 2 functions sign and verify a X509_SIG ASN1 object inside -- * PKCS#1 padded RSA encryption -- */ --int RSA_sign(int type, const unsigned char *m, unsigned int m_length, -- unsigned char *sigret, unsigned int *siglen, RSA *rsa); --int RSA_verify(int type, const unsigned char *m, unsigned int m_length, -- const unsigned char *sigbuf, unsigned int siglen, RSA *rsa); -- --/* -- * The following 2 function sign and verify a ASN1_OCTET_STRING object inside -- * PKCS#1 padded RSA encryption -- */ --int RSA_sign_ASN1_OCTET_STRING(int type, -- const unsigned char *m, unsigned int m_length, -- unsigned char *sigret, unsigned int *siglen, -- RSA *rsa); --int RSA_verify_ASN1_OCTET_STRING(int type, const unsigned char *m, -- unsigned int m_length, unsigned char *sigbuf, -- unsigned int siglen, RSA *rsa); -- --int RSA_blinding_on(RSA *rsa, BN_CTX *ctx); --void RSA_blinding_off(RSA *rsa); --BN_BLINDING *RSA_setup_blinding(RSA *rsa, BN_CTX *ctx); -- --int RSA_padding_add_PKCS1_type_1(unsigned char *to, int tlen, -- const unsigned char *f, int fl); --int RSA_padding_check_PKCS1_type_1(unsigned char *to, int tlen, -- const unsigned char *f, int fl, -- int rsa_len); --int RSA_padding_add_PKCS1_type_2(unsigned char *to, int tlen, -- const unsigned char *f, int fl); --int RSA_padding_check_PKCS1_type_2(unsigned char *to, int tlen, -- const unsigned char *f, int fl, -- int rsa_len); --int PKCS1_MGF1(unsigned char *mask, long len, const unsigned char *seed, -- long seedlen, const EVP_MD *dgst); --int RSA_padding_add_PKCS1_OAEP(unsigned char *to, int tlen, -- const unsigned char *f, int fl, -- const unsigned char *p, int pl); --int RSA_padding_check_PKCS1_OAEP(unsigned char *to, int tlen, -- const unsigned char *f, int fl, int rsa_len, -- const unsigned char *p, int pl); --int RSA_padding_add_PKCS1_OAEP_mgf1(unsigned char *to, int tlen, -- const unsigned char *from, int flen, -- const unsigned char *param, int plen, -- const EVP_MD *md, const EVP_MD *mgf1md); --int RSA_padding_check_PKCS1_OAEP_mgf1(unsigned char *to, int tlen, -- const unsigned char *from, int flen, -- int num, const unsigned char *param, -- int plen, const EVP_MD *md, -- const EVP_MD *mgf1md); --int RSA_padding_add_SSLv23(unsigned char *to, int tlen, -- const unsigned char *f, int fl); --int RSA_padding_check_SSLv23(unsigned char *to, int tlen, -- const unsigned char *f, int fl, int rsa_len); --int RSA_padding_add_none(unsigned char *to, int tlen, const unsigned char *f, -- int fl); --int RSA_padding_check_none(unsigned char *to, int tlen, -- const unsigned char *f, int fl, int rsa_len); --int RSA_padding_add_X931(unsigned char *to, int tlen, const unsigned char *f, -- int fl); --int RSA_padding_check_X931(unsigned char *to, int tlen, -- const unsigned char *f, int fl, int rsa_len); --int RSA_X931_hash_id(int nid); -- --int RSA_verify_PKCS1_PSS(RSA *rsa, const unsigned char *mHash, -- const EVP_MD *Hash, const unsigned char *EM, -- int sLen); --int RSA_padding_add_PKCS1_PSS(RSA *rsa, unsigned char *EM, -- const unsigned char *mHash, const EVP_MD *Hash, -- int sLen); -- --int RSA_verify_PKCS1_PSS_mgf1(RSA *rsa, const unsigned char *mHash, -- const EVP_MD *Hash, const EVP_MD *mgf1Hash, -- const unsigned char *EM, int sLen); -- --int RSA_padding_add_PKCS1_PSS_mgf1(RSA *rsa, unsigned char *EM, -- const unsigned char *mHash, -- const EVP_MD *Hash, const EVP_MD *mgf1Hash, -- int sLen); -- --#define RSA_get_ex_new_index(l, p, newf, dupf, freef) \ -- CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_RSA, l, p, newf, dupf, freef) --int RSA_set_ex_data(RSA *r, int idx, void *arg); --void *RSA_get_ex_data(const RSA *r, int idx); -- --RSA *RSAPublicKey_dup(RSA *rsa); --RSA *RSAPrivateKey_dup(RSA *rsa); -- --/* -- * If this flag is set the RSA method is FIPS compliant and can be used in -- * FIPS mode. This is set in the validated module method. If an application -- * sets this flag in its own methods it is its responsibility to ensure the -- * result is compliant. -- */ -- --# define RSA_FLAG_FIPS_METHOD 0x0400 -- --/* -- * If this flag is set the operations normally disabled in FIPS mode are -- * permitted it is then the applications responsibility to ensure that the -- * usage is compliant. -- */ -- --# define RSA_FLAG_NON_FIPS_ALLOW 0x0400 --/* -- * Application has decided PRNG is good enough to generate a key: don't -- * check. -- */ --# define RSA_FLAG_CHECKED 0x0800 -- --RSA_METHOD *RSA_meth_new(const char *name, int flags); --void RSA_meth_free(RSA_METHOD *meth); --RSA_METHOD *RSA_meth_dup(const RSA_METHOD *meth); --const char *RSA_meth_get0_name(const RSA_METHOD *meth); --int RSA_meth_set1_name(RSA_METHOD *meth, const char *name); --int RSA_meth_get_flags(const RSA_METHOD *meth); --int RSA_meth_set_flags(RSA_METHOD *meth, int flags); --void *RSA_meth_get0_app_data(const RSA_METHOD *meth); --int RSA_meth_set0_app_data(RSA_METHOD *meth, void *app_data); --int (*RSA_meth_get_pub_enc(const RSA_METHOD *meth)) -- (int flen, const unsigned char *from, -- unsigned char *to, RSA *rsa, int padding); --int RSA_meth_set_pub_enc(RSA_METHOD *rsa, -- int (*pub_enc) (int flen, const unsigned char *from, -- unsigned char *to, RSA *rsa, -- int padding)); --int (*RSA_meth_get_pub_dec(const RSA_METHOD *meth)) -- (int flen, const unsigned char *from, -- unsigned char *to, RSA *rsa, int padding); --int RSA_meth_set_pub_dec(RSA_METHOD *rsa, -- int (*pub_dec) (int flen, const unsigned char *from, -- unsigned char *to, RSA *rsa, -- int padding)); --int (*RSA_meth_get_priv_enc(const RSA_METHOD *meth)) -- (int flen, const unsigned char *from, -- unsigned char *to, RSA *rsa, int padding); --int RSA_meth_set_priv_enc(RSA_METHOD *rsa, -- int (*priv_enc) (int flen, const unsigned char *from, -- unsigned char *to, RSA *rsa, -- int padding)); --int (*RSA_meth_get_priv_dec(const RSA_METHOD *meth)) -- (int flen, const unsigned char *from, -- unsigned char *to, RSA *rsa, int padding); --int RSA_meth_set_priv_dec(RSA_METHOD *rsa, -- int (*priv_dec) (int flen, const unsigned char *from, -- unsigned char *to, RSA *rsa, -- int padding)); --int (*RSA_meth_get_mod_exp(const RSA_METHOD *meth)) -- (BIGNUM *r0, const BIGNUM *i, RSA *rsa, BN_CTX *ctx); --int RSA_meth_set_mod_exp(RSA_METHOD *rsa, -- int (*mod_exp) (BIGNUM *r0, const BIGNUM *i, RSA *rsa, -- BN_CTX *ctx)); --int (*RSA_meth_get_bn_mod_exp(const RSA_METHOD *meth)) -- (BIGNUM *r, const BIGNUM *a, const BIGNUM *p, -- const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); --int RSA_meth_set_bn_mod_exp(RSA_METHOD *rsa, -- int (*bn_mod_exp) (BIGNUM *r, -- const BIGNUM *a, -- const BIGNUM *p, -- const BIGNUM *m, -- BN_CTX *ctx, -- BN_MONT_CTX *m_ctx)); --int (*RSA_meth_get_init(const RSA_METHOD *meth)) (RSA *rsa); --int RSA_meth_set_init(RSA_METHOD *rsa, int (*init) (RSA *rsa)); --int (*RSA_meth_get_finish(const RSA_METHOD *meth)) (RSA *rsa); --int RSA_meth_set_finish(RSA_METHOD *rsa, int (*finish) (RSA *rsa)); --int (*RSA_meth_get_sign(const RSA_METHOD *meth)) -- (int type, -- const unsigned char *m, unsigned int m_length, -- unsigned char *sigret, unsigned int *siglen, -- const RSA *rsa); --int RSA_meth_set_sign(RSA_METHOD *rsa, -- int (*sign) (int type, const unsigned char *m, -- unsigned int m_length, -- unsigned char *sigret, unsigned int *siglen, -- const RSA *rsa)); --int (*RSA_meth_get_verify(const RSA_METHOD *meth)) -- (int dtype, const unsigned char *m, -- unsigned int m_length, const unsigned char *sigbuf, -- unsigned int siglen, const RSA *rsa); --int RSA_meth_set_verify(RSA_METHOD *rsa, -- int (*verify) (int dtype, const unsigned char *m, -- unsigned int m_length, -- const unsigned char *sigbuf, -- unsigned int siglen, const RSA *rsa)); --int (*RSA_meth_get_keygen(const RSA_METHOD *meth)) -- (RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); --int RSA_meth_set_keygen(RSA_METHOD *rsa, -- int (*keygen) (RSA *rsa, int bits, BIGNUM *e, -- BN_GENCB *cb)); --int (*RSA_meth_get_multi_prime_keygen(const RSA_METHOD *meth)) -- (RSA *rsa, int bits, int primes, BIGNUM *e, BN_GENCB *cb); --int RSA_meth_set_multi_prime_keygen(RSA_METHOD *meth, -- int (*keygen) (RSA *rsa, int bits, -- int primes, BIGNUM *e, -- BN_GENCB *cb)); -- --# ifdef __cplusplus --} --# endif --# endif --#endif -diff --git a/uadk_tool/include/openssl/rsaerr.h b/uadk_tool/include/openssl/rsaerr.h -deleted file mode 100644 -index 59b15e1..0000000 ---- a/uadk_tool/include/openssl/rsaerr.h -+++ /dev/null -@@ -1,167 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_RSAERR_H --# define HEADER_RSAERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_RSA_strings(void); -- --/* -- * RSA function codes. -- */ --# define RSA_F_CHECK_PADDING_MD 140 --# define RSA_F_ENCODE_PKCS1 146 --# define RSA_F_INT_RSA_VERIFY 145 --# define RSA_F_OLD_RSA_PRIV_DECODE 147 --# define RSA_F_PKEY_PSS_INIT 165 --# define RSA_F_PKEY_RSA_CTRL 143 --# define RSA_F_PKEY_RSA_CTRL_STR 144 --# define RSA_F_PKEY_RSA_SIGN 142 --# define RSA_F_PKEY_RSA_VERIFY 149 --# define RSA_F_PKEY_RSA_VERIFYRECOVER 141 --# define RSA_F_RSA_ALGOR_TO_MD 156 --# define RSA_F_RSA_BUILTIN_KEYGEN 129 --# define RSA_F_RSA_CHECK_KEY 123 --# define RSA_F_RSA_CHECK_KEY_EX 160 --# define RSA_F_RSA_CMS_DECRYPT 159 --# define RSA_F_RSA_CMS_VERIFY 158 --# define RSA_F_RSA_ITEM_VERIFY 148 --# define RSA_F_RSA_METH_DUP 161 --# define RSA_F_RSA_METH_NEW 162 --# define RSA_F_RSA_METH_SET1_NAME 163 --# define RSA_F_RSA_MGF1_TO_MD 157 --# define RSA_F_RSA_MULTIP_INFO_NEW 166 --# define RSA_F_RSA_NEW_METHOD 106 --# define RSA_F_RSA_NULL 124 --# define RSA_F_RSA_NULL_PRIVATE_DECRYPT 132 --# define RSA_F_RSA_NULL_PRIVATE_ENCRYPT 133 --# define RSA_F_RSA_NULL_PUBLIC_DECRYPT 134 --# define RSA_F_RSA_NULL_PUBLIC_ENCRYPT 135 --# define RSA_F_RSA_OSSL_PRIVATE_DECRYPT 101 --# define RSA_F_RSA_OSSL_PRIVATE_ENCRYPT 102 --# define RSA_F_RSA_OSSL_PUBLIC_DECRYPT 103 --# define RSA_F_RSA_OSSL_PUBLIC_ENCRYPT 104 --# define RSA_F_RSA_PADDING_ADD_NONE 107 --# define RSA_F_RSA_PADDING_ADD_PKCS1_OAEP 121 --# define RSA_F_RSA_PADDING_ADD_PKCS1_OAEP_MGF1 154 --# define RSA_F_RSA_PADDING_ADD_PKCS1_PSS 125 --# define RSA_F_RSA_PADDING_ADD_PKCS1_PSS_MGF1 152 --# define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_1 108 --# define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_2 109 --# define RSA_F_RSA_PADDING_ADD_SSLV23 110 --# define RSA_F_RSA_PADDING_ADD_X931 127 --# define RSA_F_RSA_PADDING_CHECK_NONE 111 --# define RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP 122 --# define RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP_MGF1 153 --# define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1 112 --# define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2 113 --# define RSA_F_RSA_PADDING_CHECK_SSLV23 114 --# define RSA_F_RSA_PADDING_CHECK_X931 128 --# define RSA_F_RSA_PARAM_DECODE 164 --# define RSA_F_RSA_PRINT 115 --# define RSA_F_RSA_PRINT_FP 116 --# define RSA_F_RSA_PRIV_DECODE 150 --# define RSA_F_RSA_PRIV_ENCODE 138 --# define RSA_F_RSA_PSS_GET_PARAM 151 --# define RSA_F_RSA_PSS_TO_CTX 155 --# define RSA_F_RSA_PUB_DECODE 139 --# define RSA_F_RSA_SETUP_BLINDING 136 --# define RSA_F_RSA_SIGN 117 --# define RSA_F_RSA_SIGN_ASN1_OCTET_STRING 118 --# define RSA_F_RSA_VERIFY 119 --# define RSA_F_RSA_VERIFY_ASN1_OCTET_STRING 120 --# define RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1 126 --# define RSA_F_SETUP_TBUF 167 -- --/* -- * RSA reason codes. -- */ --# define RSA_R_ALGORITHM_MISMATCH 100 --# define RSA_R_BAD_E_VALUE 101 --# define RSA_R_BAD_FIXED_HEADER_DECRYPT 102 --# define RSA_R_BAD_PAD_BYTE_COUNT 103 --# define RSA_R_BAD_SIGNATURE 104 --# define RSA_R_BLOCK_TYPE_IS_NOT_01 106 --# define RSA_R_BLOCK_TYPE_IS_NOT_02 107 --# define RSA_R_DATA_GREATER_THAN_MOD_LEN 108 --# define RSA_R_DATA_TOO_LARGE 109 --# define RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 110 --# define RSA_R_DATA_TOO_LARGE_FOR_MODULUS 132 --# define RSA_R_DATA_TOO_SMALL 111 --# define RSA_R_DATA_TOO_SMALL_FOR_KEY_SIZE 122 --# define RSA_R_DIGEST_DOES_NOT_MATCH 158 --# define RSA_R_DIGEST_NOT_ALLOWED 145 --# define RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY 112 --# define RSA_R_DMP1_NOT_CONGRUENT_TO_D 124 --# define RSA_R_DMQ1_NOT_CONGRUENT_TO_D 125 --# define RSA_R_D_E_NOT_CONGRUENT_TO_1 123 --# define RSA_R_FIRST_OCTET_INVALID 133 --# define RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE 144 --# define RSA_R_INVALID_DIGEST 157 --# define RSA_R_INVALID_DIGEST_LENGTH 143 --# define RSA_R_INVALID_HEADER 137 --# define RSA_R_INVALID_LABEL 160 --# define RSA_R_INVALID_MESSAGE_LENGTH 131 --# define RSA_R_INVALID_MGF1_MD 156 --# define RSA_R_INVALID_MULTI_PRIME_KEY 167 --# define RSA_R_INVALID_OAEP_PARAMETERS 161 --# define RSA_R_INVALID_PADDING 138 --# define RSA_R_INVALID_PADDING_MODE 141 --# define RSA_R_INVALID_PSS_PARAMETERS 149 --# define RSA_R_INVALID_PSS_SALTLEN 146 --# define RSA_R_INVALID_SALT_LENGTH 150 --# define RSA_R_INVALID_TRAILER 139 --# define RSA_R_INVALID_X931_DIGEST 142 --# define RSA_R_IQMP_NOT_INVERSE_OF_Q 126 --# define RSA_R_KEY_PRIME_NUM_INVALID 165 --# define RSA_R_KEY_SIZE_TOO_SMALL 120 --# define RSA_R_LAST_OCTET_INVALID 134 --# define RSA_R_MISSING_PRIVATE_KEY 179 --# define RSA_R_MGF1_DIGEST_NOT_ALLOWED 152 --# define RSA_R_MODULUS_TOO_LARGE 105 --# define RSA_R_MP_COEFFICIENT_NOT_INVERSE_OF_R 168 --# define RSA_R_MP_EXPONENT_NOT_CONGRUENT_TO_D 169 --# define RSA_R_MP_R_NOT_PRIME 170 --# define RSA_R_NO_PUBLIC_EXPONENT 140 --# define RSA_R_NULL_BEFORE_BLOCK_MISSING 113 --# define RSA_R_N_DOES_NOT_EQUAL_PRODUCT_OF_PRIMES 172 --# define RSA_R_N_DOES_NOT_EQUAL_P_Q 127 --# define RSA_R_OAEP_DECODING_ERROR 121 --# define RSA_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE 148 --# define RSA_R_PADDING_CHECK_FAILED 114 --# define RSA_R_PKCS_DECODING_ERROR 159 --# define RSA_R_PSS_SALTLEN_TOO_SMALL 164 --# define RSA_R_P_NOT_PRIME 128 --# define RSA_R_Q_NOT_PRIME 129 --# define RSA_R_RSA_OPERATIONS_NOT_SUPPORTED 130 --# define RSA_R_SLEN_CHECK_FAILED 136 --# define RSA_R_SLEN_RECOVERY_FAILED 135 --# define RSA_R_SSLV3_ROLLBACK_ATTACK 115 --# define RSA_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 116 --# define RSA_R_UNKNOWN_ALGORITHM_TYPE 117 --# define RSA_R_UNKNOWN_DIGEST 166 --# define RSA_R_UNKNOWN_MASK_DIGEST 151 --# define RSA_R_UNKNOWN_PADDING_TYPE 118 --# define RSA_R_UNSUPPORTED_ENCRYPTION_TYPE 162 --# define RSA_R_UNSUPPORTED_LABEL_SOURCE 163 --# define RSA_R_UNSUPPORTED_MASK_ALGORITHM 153 --# define RSA_R_UNSUPPORTED_MASK_PARAMETER 154 --# define RSA_R_UNSUPPORTED_SIGNATURE_TYPE 155 --# define RSA_R_VALUE_MISSING 147 --# define RSA_R_WRONG_SIGNATURE_LENGTH 119 -- --#endif -diff --git a/uadk_tool/include/openssl/safestack.h b/uadk_tool/include/openssl/safestack.h -deleted file mode 100644 -index 38b5578..0000000 ---- a/uadk_tool/include/openssl/safestack.h -+++ /dev/null -@@ -1,207 +0,0 @@ --/* -- * Copyright 1999-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_SAFESTACK_H --# define HEADER_SAFESTACK_H -- --# include --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --# define STACK_OF(type) struct stack_st_##type -- --# define SKM_DEFINE_STACK_OF(t1, t2, t3) \ -- STACK_OF(t1); \ -- typedef int (*sk_##t1##_compfunc)(const t3 * const *a, const t3 *const *b); \ -- typedef void (*sk_##t1##_freefunc)(t3 *a); \ -- typedef t3 * (*sk_##t1##_copyfunc)(const t3 *a); \ -- static ossl_unused ossl_inline int sk_##t1##_num(const STACK_OF(t1) *sk) \ -- { \ -- return OPENSSL_sk_num((const OPENSSL_STACK *)sk); \ -- } \ -- static ossl_unused ossl_inline t2 *sk_##t1##_value(const STACK_OF(t1) *sk, int idx) \ -- { \ -- return (t2 *)OPENSSL_sk_value((const OPENSSL_STACK *)sk, idx); \ -- } \ -- static ossl_unused ossl_inline STACK_OF(t1) *sk_##t1##_new(sk_##t1##_compfunc compare) \ -- { \ -- return (STACK_OF(t1) *)OPENSSL_sk_new((OPENSSL_sk_compfunc)compare); \ -- } \ -- static ossl_unused ossl_inline STACK_OF(t1) *sk_##t1##_new_null(void) \ -- { \ -- return (STACK_OF(t1) *)OPENSSL_sk_new_null(); \ -- } \ -- static ossl_unused ossl_inline STACK_OF(t1) *sk_##t1##_new_reserve(sk_##t1##_compfunc compare, int n) \ -- { \ -- return (STACK_OF(t1) *)OPENSSL_sk_new_reserve((OPENSSL_sk_compfunc)compare, n); \ -- } \ -- static ossl_unused ossl_inline int sk_##t1##_reserve(STACK_OF(t1) *sk, int n) \ -- { \ -- return OPENSSL_sk_reserve((OPENSSL_STACK *)sk, n); \ -- } \ -- static ossl_unused ossl_inline void sk_##t1##_free(STACK_OF(t1) *sk) \ -- { \ -- OPENSSL_sk_free((OPENSSL_STACK *)sk); \ -- } \ -- static ossl_unused ossl_inline void sk_##t1##_zero(STACK_OF(t1) *sk) \ -- { \ -- OPENSSL_sk_zero((OPENSSL_STACK *)sk); \ -- } \ -- static ossl_unused ossl_inline t2 *sk_##t1##_delete(STACK_OF(t1) *sk, int i) \ -- { \ -- return (t2 *)OPENSSL_sk_delete((OPENSSL_STACK *)sk, i); \ -- } \ -- static ossl_unused ossl_inline t2 *sk_##t1##_delete_ptr(STACK_OF(t1) *sk, t2 *ptr) \ -- { \ -- return (t2 *)OPENSSL_sk_delete_ptr((OPENSSL_STACK *)sk, \ -- (const void *)ptr); \ -- } \ -- static ossl_unused ossl_inline int sk_##t1##_push(STACK_OF(t1) *sk, t2 *ptr) \ -- { \ -- return OPENSSL_sk_push((OPENSSL_STACK *)sk, (const void *)ptr); \ -- } \ -- static ossl_unused ossl_inline int sk_##t1##_unshift(STACK_OF(t1) *sk, t2 *ptr) \ -- { \ -- return OPENSSL_sk_unshift((OPENSSL_STACK *)sk, (const void *)ptr); \ -- } \ -- static ossl_unused ossl_inline t2 *sk_##t1##_pop(STACK_OF(t1) *sk) \ -- { \ -- return (t2 *)OPENSSL_sk_pop((OPENSSL_STACK *)sk); \ -- } \ -- static ossl_unused ossl_inline t2 *sk_##t1##_shift(STACK_OF(t1) *sk) \ -- { \ -- return (t2 *)OPENSSL_sk_shift((OPENSSL_STACK *)sk); \ -- } \ -- static ossl_unused ossl_inline void sk_##t1##_pop_free(STACK_OF(t1) *sk, sk_##t1##_freefunc freefunc) \ -- { \ -- OPENSSL_sk_pop_free((OPENSSL_STACK *)sk, (OPENSSL_sk_freefunc)freefunc); \ -- } \ -- static ossl_unused ossl_inline int sk_##t1##_insert(STACK_OF(t1) *sk, t2 *ptr, int idx) \ -- { \ -- return OPENSSL_sk_insert((OPENSSL_STACK *)sk, (const void *)ptr, idx); \ -- } \ -- static ossl_unused ossl_inline t2 *sk_##t1##_set(STACK_OF(t1) *sk, int idx, t2 *ptr) \ -- { \ -- return (t2 *)OPENSSL_sk_set((OPENSSL_STACK *)sk, idx, (const void *)ptr); \ -- } \ -- static ossl_unused ossl_inline int sk_##t1##_find(STACK_OF(t1) *sk, t2 *ptr) \ -- { \ -- return OPENSSL_sk_find((OPENSSL_STACK *)sk, (const void *)ptr); \ -- } \ -- static ossl_unused ossl_inline int sk_##t1##_find_ex(STACK_OF(t1) *sk, t2 *ptr) \ -- { \ -- return OPENSSL_sk_find_ex((OPENSSL_STACK *)sk, (const void *)ptr); \ -- } \ -- static ossl_unused ossl_inline void sk_##t1##_sort(STACK_OF(t1) *sk) \ -- { \ -- OPENSSL_sk_sort((OPENSSL_STACK *)sk); \ -- } \ -- static ossl_unused ossl_inline int sk_##t1##_is_sorted(const STACK_OF(t1) *sk) \ -- { \ -- return OPENSSL_sk_is_sorted((const OPENSSL_STACK *)sk); \ -- } \ -- static ossl_unused ossl_inline STACK_OF(t1) * sk_##t1##_dup(const STACK_OF(t1) *sk) \ -- { \ -- return (STACK_OF(t1) *)OPENSSL_sk_dup((const OPENSSL_STACK *)sk); \ -- } \ -- static ossl_unused ossl_inline STACK_OF(t1) *sk_##t1##_deep_copy(const STACK_OF(t1) *sk, \ -- sk_##t1##_copyfunc copyfunc, \ -- sk_##t1##_freefunc freefunc) \ -- { \ -- return (STACK_OF(t1) *)OPENSSL_sk_deep_copy((const OPENSSL_STACK *)sk, \ -- (OPENSSL_sk_copyfunc)copyfunc, \ -- (OPENSSL_sk_freefunc)freefunc); \ -- } \ -- static ossl_unused ossl_inline sk_##t1##_compfunc sk_##t1##_set_cmp_func(STACK_OF(t1) *sk, sk_##t1##_compfunc compare) \ -- { \ -- return (sk_##t1##_compfunc)OPENSSL_sk_set_cmp_func((OPENSSL_STACK *)sk, (OPENSSL_sk_compfunc)compare); \ -- } -- --# define DEFINE_SPECIAL_STACK_OF(t1, t2) SKM_DEFINE_STACK_OF(t1, t2, t2) --# define DEFINE_STACK_OF(t) SKM_DEFINE_STACK_OF(t, t, t) --# define DEFINE_SPECIAL_STACK_OF_CONST(t1, t2) \ -- SKM_DEFINE_STACK_OF(t1, const t2, t2) --# define DEFINE_STACK_OF_CONST(t) SKM_DEFINE_STACK_OF(t, const t, t) -- --/*- -- * Strings are special: normally an lhash entry will point to a single -- * (somewhat) mutable object. In the case of strings: -- * -- * a) Instead of a single char, there is an array of chars, NUL-terminated. -- * b) The string may have be immutable. -- * -- * So, they need their own declarations. Especially important for -- * type-checking tools, such as Deputy. -- * -- * In practice, however, it appears to be hard to have a const -- * string. For now, I'm settling for dealing with the fact it is a -- * string at all. -- */ --typedef char *OPENSSL_STRING; --typedef const char *OPENSSL_CSTRING; -- --/*- -- * Confusingly, LHASH_OF(STRING) deals with char ** throughout, but -- * STACK_OF(STRING) is really more like STACK_OF(char), only, as mentioned -- * above, instead of a single char each entry is a NUL-terminated array of -- * chars. So, we have to implement STRING specially for STACK_OF. This is -- * dealt with in the autogenerated macros below. -- */ --DEFINE_SPECIAL_STACK_OF(OPENSSL_STRING, char) --DEFINE_SPECIAL_STACK_OF_CONST(OPENSSL_CSTRING, char) -- --/* -- * Similarly, we sometimes use a block of characters, NOT nul-terminated. -- * These should also be distinguished from "normal" stacks. -- */ --typedef void *OPENSSL_BLOCK; --DEFINE_SPECIAL_STACK_OF(OPENSSL_BLOCK, void) -- --/* -- * If called without higher optimization (min. -xO3) the Oracle Developer -- * Studio compiler generates code for the defined (static inline) functions -- * above. -- * This would later lead to the linker complaining about missing symbols when -- * this header file is included but the resulting object is not linked against -- * the Crypto library (openssl#6912). -- */ --# ifdef __SUNPRO_C --# pragma weak OPENSSL_sk_num --# pragma weak OPENSSL_sk_value --# pragma weak OPENSSL_sk_new --# pragma weak OPENSSL_sk_new_null --# pragma weak OPENSSL_sk_new_reserve --# pragma weak OPENSSL_sk_reserve --# pragma weak OPENSSL_sk_free --# pragma weak OPENSSL_sk_zero --# pragma weak OPENSSL_sk_delete --# pragma weak OPENSSL_sk_delete_ptr --# pragma weak OPENSSL_sk_push --# pragma weak OPENSSL_sk_unshift --# pragma weak OPENSSL_sk_pop --# pragma weak OPENSSL_sk_shift --# pragma weak OPENSSL_sk_pop_free --# pragma weak OPENSSL_sk_insert --# pragma weak OPENSSL_sk_set --# pragma weak OPENSSL_sk_find --# pragma weak OPENSSL_sk_find_ex --# pragma weak OPENSSL_sk_sort --# pragma weak OPENSSL_sk_is_sorted --# pragma weak OPENSSL_sk_dup --# pragma weak OPENSSL_sk_deep_copy --# pragma weak OPENSSL_sk_set_cmp_func --# endif /* __SUNPRO_C */ -- --# ifdef __cplusplus --} --# endif --#endif -diff --git a/uadk_tool/include/openssl/seed.h b/uadk_tool/include/openssl/seed.h -deleted file mode 100644 -index de10b08..0000000 ---- a/uadk_tool/include/openssl/seed.h -+++ /dev/null -@@ -1,96 +0,0 @@ --/* -- * Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --/* -- * Copyright (c) 2007 KISA(Korea Information Security Agency). All rights reserved. -- * -- * Redistribution and use in source and binary forms, with or without -- * modification, are permitted provided that the following conditions -- * are met: -- * 1. Redistributions of source code must retain the above copyright -- * notice, this list of conditions and the following disclaimer. -- * 2. Neither the name of author nor the names of its contributors may -- * be used to endorse or promote products derived from this software -- * without specific prior written permission. -- * -- * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND -- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -- * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE -- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -- * SUCH DAMAGE. -- */ -- --#ifndef HEADER_SEED_H --# define HEADER_SEED_H -- --# include -- --# ifndef OPENSSL_NO_SEED --# include --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --/* look whether we need 'long' to get 32 bits */ --# ifdef AES_LONG --# ifndef SEED_LONG --# define SEED_LONG 1 --# endif --# endif -- --# include -- --# define SEED_BLOCK_SIZE 16 --# define SEED_KEY_LENGTH 16 -- --typedef struct seed_key_st { --# ifdef SEED_LONG -- unsigned long data[32]; --# else -- unsigned int data[32]; --# endif --} SEED_KEY_SCHEDULE; -- --void SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH], -- SEED_KEY_SCHEDULE *ks); -- --void SEED_encrypt(const unsigned char s[SEED_BLOCK_SIZE], -- unsigned char d[SEED_BLOCK_SIZE], -- const SEED_KEY_SCHEDULE *ks); --void SEED_decrypt(const unsigned char s[SEED_BLOCK_SIZE], -- unsigned char d[SEED_BLOCK_SIZE], -- const SEED_KEY_SCHEDULE *ks); -- --void SEED_ecb_encrypt(const unsigned char *in, unsigned char *out, -- const SEED_KEY_SCHEDULE *ks, int enc); --void SEED_cbc_encrypt(const unsigned char *in, unsigned char *out, size_t len, -- const SEED_KEY_SCHEDULE *ks, -- unsigned char ivec[SEED_BLOCK_SIZE], int enc); --void SEED_cfb128_encrypt(const unsigned char *in, unsigned char *out, -- size_t len, const SEED_KEY_SCHEDULE *ks, -- unsigned char ivec[SEED_BLOCK_SIZE], int *num, -- int enc); --void SEED_ofb128_encrypt(const unsigned char *in, unsigned char *out, -- size_t len, const SEED_KEY_SCHEDULE *ks, -- unsigned char ivec[SEED_BLOCK_SIZE], int *num); -- --# ifdef __cplusplus --} --# endif --# endif -- --#endif -diff --git a/uadk_tool/include/openssl/sha.h b/uadk_tool/include/openssl/sha.h -deleted file mode 100644 -index 6a1eb0d..0000000 ---- a/uadk_tool/include/openssl/sha.h -+++ /dev/null -@@ -1,119 +0,0 @@ --/* -- * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_SHA_H --# define HEADER_SHA_H -- --# include --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --/*- -- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -- * ! SHA_LONG has to be at least 32 bits wide. ! -- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -- */ --# define SHA_LONG unsigned int -- --# define SHA_LBLOCK 16 --# define SHA_CBLOCK (SHA_LBLOCK*4)/* SHA treats input data as a -- * contiguous array of 32 bit wide -- * big-endian values. */ --# define SHA_LAST_BLOCK (SHA_CBLOCK-8) --# define SHA_DIGEST_LENGTH 20 -- --typedef struct SHAstate_st { -- SHA_LONG h0, h1, h2, h3, h4; -- SHA_LONG Nl, Nh; -- SHA_LONG data[SHA_LBLOCK]; -- unsigned int num; --} SHA_CTX; -- --int SHA1_Init(SHA_CTX *c); --int SHA1_Update(SHA_CTX *c, const void *data, size_t len); --int SHA1_Final(unsigned char *md, SHA_CTX *c); --unsigned char *SHA1(const unsigned char *d, size_t n, unsigned char *md); --void SHA1_Transform(SHA_CTX *c, const unsigned char *data); -- --# define SHA256_CBLOCK (SHA_LBLOCK*4)/* SHA-256 treats input data as a -- * contiguous array of 32 bit wide -- * big-endian values. */ -- --typedef struct SHA256state_st { -- SHA_LONG h[8]; -- SHA_LONG Nl, Nh; -- SHA_LONG data[SHA_LBLOCK]; -- unsigned int num, md_len; --} SHA256_CTX; -- --int SHA224_Init(SHA256_CTX *c); --int SHA224_Update(SHA256_CTX *c, const void *data, size_t len); --int SHA224_Final(unsigned char *md, SHA256_CTX *c); --unsigned char *SHA224(const unsigned char *d, size_t n, unsigned char *md); --int SHA256_Init(SHA256_CTX *c); --int SHA256_Update(SHA256_CTX *c, const void *data, size_t len); --int SHA256_Final(unsigned char *md, SHA256_CTX *c); --unsigned char *SHA256(const unsigned char *d, size_t n, unsigned char *md); --void SHA256_Transform(SHA256_CTX *c, const unsigned char *data); -- --# define SHA224_DIGEST_LENGTH 28 --# define SHA256_DIGEST_LENGTH 32 --# define SHA384_DIGEST_LENGTH 48 --# define SHA512_DIGEST_LENGTH 64 -- --/* -- * Unlike 32-bit digest algorithms, SHA-512 *relies* on SHA_LONG64 -- * being exactly 64-bit wide. See Implementation Notes in sha512.c -- * for further details. -- */ --/* -- * SHA-512 treats input data as a -- * contiguous array of 64 bit -- * wide big-endian values. -- */ --# define SHA512_CBLOCK (SHA_LBLOCK*8) --# if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__) --# define SHA_LONG64 unsigned __int64 --# define U64(C) C##UI64 --# elif defined(__arch64__) --# define SHA_LONG64 unsigned long --# define U64(C) C##UL --# else --# define SHA_LONG64 unsigned long long --# define U64(C) C##ULL --# endif -- --typedef struct SHA512state_st { -- SHA_LONG64 h[8]; -- SHA_LONG64 Nl, Nh; -- union { -- SHA_LONG64 d[SHA_LBLOCK]; -- unsigned char p[SHA512_CBLOCK]; -- } u; -- unsigned int num, md_len; --} SHA512_CTX; -- --int SHA384_Init(SHA512_CTX *c); --int SHA384_Update(SHA512_CTX *c, const void *data, size_t len); --int SHA384_Final(unsigned char *md, SHA512_CTX *c); --unsigned char *SHA384(const unsigned char *d, size_t n, unsigned char *md); --int SHA512_Init(SHA512_CTX *c); --int SHA512_Update(SHA512_CTX *c, const void *data, size_t len); --int SHA512_Final(unsigned char *md, SHA512_CTX *c); --unsigned char *SHA512(const unsigned char *d, size_t n, unsigned char *md); --void SHA512_Transform(SHA512_CTX *c, const unsigned char *data); -- --#ifdef __cplusplus --} --#endif -- --#endif -diff --git a/uadk_tool/include/openssl/srp.h b/uadk_tool/include/openssl/srp.h -deleted file mode 100644 -index aaf1355..0000000 ---- a/uadk_tool/include/openssl/srp.h -+++ /dev/null -@@ -1,135 +0,0 @@ --/* -- * Copyright 2004-2018 The OpenSSL Project Authors. All Rights Reserved. -- * Copyright (c) 2004, EdelKey Project. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- * -- * Originally written by Christophe Renou and Peter Sylvester, -- * for the EdelKey project. -- */ -- --#ifndef HEADER_SRP_H --# define HEADER_SRP_H -- --#include -- --#ifndef OPENSSL_NO_SRP --# include --# include --# include --# include --# include -- --# ifdef __cplusplus --extern "C" { --# endif -- --typedef struct SRP_gN_cache_st { -- char *b64_bn; -- BIGNUM *bn; --} SRP_gN_cache; -- -- --DEFINE_STACK_OF(SRP_gN_cache) -- --typedef struct SRP_user_pwd_st { -- /* Owned by us. */ -- char *id; -- BIGNUM *s; -- BIGNUM *v; -- /* Not owned by us. */ -- const BIGNUM *g; -- const BIGNUM *N; -- /* Owned by us. */ -- char *info; --} SRP_user_pwd; -- --void SRP_user_pwd_free(SRP_user_pwd *user_pwd); -- --DEFINE_STACK_OF(SRP_user_pwd) -- --typedef struct SRP_VBASE_st { -- STACK_OF(SRP_user_pwd) *users_pwd; -- STACK_OF(SRP_gN_cache) *gN_cache; --/* to simulate a user */ -- char *seed_key; -- const BIGNUM *default_g; -- const BIGNUM *default_N; --} SRP_VBASE; -- --/* -- * Internal structure storing N and g pair -- */ --typedef struct SRP_gN_st { -- char *id; -- const BIGNUM *g; -- const BIGNUM *N; --} SRP_gN; -- --DEFINE_STACK_OF(SRP_gN) -- --SRP_VBASE *SRP_VBASE_new(char *seed_key); --void SRP_VBASE_free(SRP_VBASE *vb); --int SRP_VBASE_init(SRP_VBASE *vb, char *verifier_file); -- --/* This method ignores the configured seed and fails for an unknown user. */ --DEPRECATEDIN_1_1_0(SRP_user_pwd *SRP_VBASE_get_by_user(SRP_VBASE *vb, char *username)) --/* NOTE: unlike in SRP_VBASE_get_by_user, caller owns the returned pointer.*/ --SRP_user_pwd *SRP_VBASE_get1_by_user(SRP_VBASE *vb, char *username); -- --char *SRP_create_verifier(const char *user, const char *pass, char **salt, -- char **verifier, const char *N, const char *g); --int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt, -- BIGNUM **verifier, const BIGNUM *N, -- const BIGNUM *g); -- --# define SRP_NO_ERROR 0 --# define SRP_ERR_VBASE_INCOMPLETE_FILE 1 --# define SRP_ERR_VBASE_BN_LIB 2 --# define SRP_ERR_OPEN_FILE 3 --# define SRP_ERR_MEMORY 4 -- --# define DB_srptype 0 --# define DB_srpverifier 1 --# define DB_srpsalt 2 --# define DB_srpid 3 --# define DB_srpgN 4 --# define DB_srpinfo 5 --# undef DB_NUMBER --# define DB_NUMBER 6 -- --# define DB_SRP_INDEX 'I' --# define DB_SRP_VALID 'V' --# define DB_SRP_REVOKED 'R' --# define DB_SRP_MODIF 'v' -- --/* see srp.c */ --char *SRP_check_known_gN_param(const BIGNUM *g, const BIGNUM *N); --SRP_gN *SRP_get_default_gN(const char *id); -- --/* server side .... */ --BIGNUM *SRP_Calc_server_key(const BIGNUM *A, const BIGNUM *v, const BIGNUM *u, -- const BIGNUM *b, const BIGNUM *N); --BIGNUM *SRP_Calc_B(const BIGNUM *b, const BIGNUM *N, const BIGNUM *g, -- const BIGNUM *v); --int SRP_Verify_A_mod_N(const BIGNUM *A, const BIGNUM *N); --BIGNUM *SRP_Calc_u(const BIGNUM *A, const BIGNUM *B, const BIGNUM *N); -- --/* client side .... */ --BIGNUM *SRP_Calc_x(const BIGNUM *s, const char *user, const char *pass); --BIGNUM *SRP_Calc_A(const BIGNUM *a, const BIGNUM *N, const BIGNUM *g); --BIGNUM *SRP_Calc_client_key(const BIGNUM *N, const BIGNUM *B, const BIGNUM *g, -- const BIGNUM *x, const BIGNUM *a, const BIGNUM *u); --int SRP_Verify_B_mod_N(const BIGNUM *B, const BIGNUM *N); -- --# define SRP_MINIMAL_N 1024 -- --# ifdef __cplusplus --} --# endif --# endif -- --#endif -diff --git a/uadk_tool/include/openssl/srtp.h b/uadk_tool/include/openssl/srtp.h -deleted file mode 100644 -index 0b57c23..0000000 ---- a/uadk_tool/include/openssl/srtp.h -+++ /dev/null -@@ -1,50 +0,0 @@ --/* -- * Copyright 2011-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --/* -- * DTLS code by Eric Rescorla -- * -- * Copyright (C) 2006, Network Resonance, Inc. Copyright (C) 2011, RTFM, Inc. -- */ -- --#ifndef HEADER_D1_SRTP_H --# define HEADER_D1_SRTP_H -- --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --# define SRTP_AES128_CM_SHA1_80 0x0001 --# define SRTP_AES128_CM_SHA1_32 0x0002 --# define SRTP_AES128_F8_SHA1_80 0x0003 --# define SRTP_AES128_F8_SHA1_32 0x0004 --# define SRTP_NULL_SHA1_80 0x0005 --# define SRTP_NULL_SHA1_32 0x0006 -- --/* AEAD SRTP protection profiles from RFC 7714 */ --# define SRTP_AEAD_AES_128_GCM 0x0007 --# define SRTP_AEAD_AES_256_GCM 0x0008 -- --# ifndef OPENSSL_NO_SRTP -- --__owur int SSL_CTX_set_tlsext_use_srtp(SSL_CTX *ctx, const char *profiles); --__owur int SSL_set_tlsext_use_srtp(SSL *ssl, const char *profiles); -- --__owur STACK_OF(SRTP_PROTECTION_PROFILE) *SSL_get_srtp_profiles(SSL *ssl); --__owur SRTP_PROTECTION_PROFILE *SSL_get_selected_srtp_profile(SSL *s); -- --# endif -- --#ifdef __cplusplus --} --#endif -- --#endif -diff --git a/uadk_tool/include/openssl/ssl.h b/uadk_tool/include/openssl/ssl.h -deleted file mode 100644 -index fd0c5a9..0000000 ---- a/uadk_tool/include/openssl/ssl.h -+++ /dev/null -@@ -1,2438 +0,0 @@ --/* -- * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. -- * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved -- * Copyright 2005 Nokia. All rights reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_SSL_H --# define HEADER_SSL_H -- --# include --# include --# include --# include --# if OPENSSL_API_COMPAT < 0x10100000L --# include --# include --# include --# endif --# include --# include --# include --# include -- --# include --# include --# include --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --/* OpenSSL version number for ASN.1 encoding of the session information */ --/*- -- * Version 0 - initial version -- * Version 1 - added the optional peer certificate -- */ --# define SSL_SESSION_ASN1_VERSION 0x0001 -- --# define SSL_MAX_SSL_SESSION_ID_LENGTH 32 --# define SSL_MAX_SID_CTX_LENGTH 32 -- --# define SSL_MIN_RSA_MODULUS_LENGTH_IN_BYTES (512/8) --# define SSL_MAX_KEY_ARG_LENGTH 8 --# define SSL_MAX_MASTER_KEY_LENGTH 48 -- --/* The maximum number of encrypt/decrypt pipelines we can support */ --# define SSL_MAX_PIPELINES 32 -- --/* text strings for the ciphers */ -- --/* These are used to specify which ciphers to use and not to use */ -- --# define SSL_TXT_LOW "LOW" --# define SSL_TXT_MEDIUM "MEDIUM" --# define SSL_TXT_HIGH "HIGH" --# define SSL_TXT_FIPS "FIPS" -- --# define SSL_TXT_aNULL "aNULL" --# define SSL_TXT_eNULL "eNULL" --# define SSL_TXT_NULL "NULL" -- --# define SSL_TXT_kRSA "kRSA" --# define SSL_TXT_kDHr "kDHr"/* this cipher class has been removed */ --# define SSL_TXT_kDHd "kDHd"/* this cipher class has been removed */ --# define SSL_TXT_kDH "kDH"/* this cipher class has been removed */ --# define SSL_TXT_kEDH "kEDH"/* alias for kDHE */ --# define SSL_TXT_kDHE "kDHE" --# define SSL_TXT_kECDHr "kECDHr"/* this cipher class has been removed */ --# define SSL_TXT_kECDHe "kECDHe"/* this cipher class has been removed */ --# define SSL_TXT_kECDH "kECDH"/* this cipher class has been removed */ --# define SSL_TXT_kEECDH "kEECDH"/* alias for kECDHE */ --# define SSL_TXT_kECDHE "kECDHE" --# define SSL_TXT_kPSK "kPSK" --# define SSL_TXT_kRSAPSK "kRSAPSK" --# define SSL_TXT_kECDHEPSK "kECDHEPSK" --# define SSL_TXT_kDHEPSK "kDHEPSK" --# define SSL_TXT_kGOST "kGOST" --# define SSL_TXT_kSRP "kSRP" -- --# define SSL_TXT_aRSA "aRSA" --# define SSL_TXT_aDSS "aDSS" --# define SSL_TXT_aDH "aDH"/* this cipher class has been removed */ --# define SSL_TXT_aECDH "aECDH"/* this cipher class has been removed */ --# define SSL_TXT_aECDSA "aECDSA" --# define SSL_TXT_aPSK "aPSK" --# define SSL_TXT_aGOST94 "aGOST94" --# define SSL_TXT_aGOST01 "aGOST01" --# define SSL_TXT_aGOST12 "aGOST12" --# define SSL_TXT_aGOST "aGOST" --# define SSL_TXT_aSRP "aSRP" -- --# define SSL_TXT_DSS "DSS" --# define SSL_TXT_DH "DH" --# define SSL_TXT_DHE "DHE"/* same as "kDHE:-ADH" */ --# define SSL_TXT_EDH "EDH"/* alias for DHE */ --# define SSL_TXT_ADH "ADH" --# define SSL_TXT_RSA "RSA" --# define SSL_TXT_ECDH "ECDH" --# define SSL_TXT_EECDH "EECDH"/* alias for ECDHE" */ --# define SSL_TXT_ECDHE "ECDHE"/* same as "kECDHE:-AECDH" */ --# define SSL_TXT_AECDH "AECDH" --# define SSL_TXT_ECDSA "ECDSA" --# define SSL_TXT_PSK "PSK" --# define SSL_TXT_SRP "SRP" -- --# define SSL_TXT_DES "DES" --# define SSL_TXT_3DES "3DES" --# define SSL_TXT_RC4 "RC4" --# define SSL_TXT_RC2 "RC2" --# define SSL_TXT_IDEA "IDEA" --# define SSL_TXT_SEED "SEED" --# define SSL_TXT_AES128 "AES128" --# define SSL_TXT_AES256 "AES256" --# define SSL_TXT_AES "AES" --# define SSL_TXT_AES_GCM "AESGCM" --# define SSL_TXT_AES_CCM "AESCCM" --# define SSL_TXT_AES_CCM_8 "AESCCM8" --# define SSL_TXT_CAMELLIA128 "CAMELLIA128" --# define SSL_TXT_CAMELLIA256 "CAMELLIA256" --# define SSL_TXT_CAMELLIA "CAMELLIA" --# define SSL_TXT_CHACHA20 "CHACHA20" --# define SSL_TXT_GOST "GOST89" --# define SSL_TXT_ARIA "ARIA" --# define SSL_TXT_ARIA_GCM "ARIAGCM" --# define SSL_TXT_ARIA128 "ARIA128" --# define SSL_TXT_ARIA256 "ARIA256" -- --# define SSL_TXT_MD5 "MD5" --# define SSL_TXT_SHA1 "SHA1" --# define SSL_TXT_SHA "SHA"/* same as "SHA1" */ --# define SSL_TXT_GOST94 "GOST94" --# define SSL_TXT_GOST89MAC "GOST89MAC" --# define SSL_TXT_GOST12 "GOST12" --# define SSL_TXT_GOST89MAC12 "GOST89MAC12" --# define SSL_TXT_SHA256 "SHA256" --# define SSL_TXT_SHA384 "SHA384" -- --# define SSL_TXT_SSLV3 "SSLv3" --# define SSL_TXT_TLSV1 "TLSv1" --# define SSL_TXT_TLSV1_1 "TLSv1.1" --# define SSL_TXT_TLSV1_2 "TLSv1.2" -- --# define SSL_TXT_ALL "ALL" -- --/*- -- * COMPLEMENTOF* definitions. These identifiers are used to (de-select) -- * ciphers normally not being used. -- * Example: "RC4" will activate all ciphers using RC4 including ciphers -- * without authentication, which would normally disabled by DEFAULT (due -- * the "!ADH" being part of default). Therefore "RC4:!COMPLEMENTOFDEFAULT" -- * will make sure that it is also disabled in the specific selection. -- * COMPLEMENTOF* identifiers are portable between version, as adjustments -- * to the default cipher setup will also be included here. -- * -- * COMPLEMENTOFDEFAULT does not experience the same special treatment that -- * DEFAULT gets, as only selection is being done and no sorting as needed -- * for DEFAULT. -- */ --# define SSL_TXT_CMPALL "COMPLEMENTOFALL" --# define SSL_TXT_CMPDEF "COMPLEMENTOFDEFAULT" -- --/* -- * The following cipher list is used by default. It also is substituted when -- * an application-defined cipher list string starts with 'DEFAULT'. -- * This applies to ciphersuites for TLSv1.2 and below. -- */ --# define SSL_DEFAULT_CIPHER_LIST "ALL:!COMPLEMENTOFDEFAULT:!eNULL" --/* This is the default set of TLSv1.3 ciphersuites */ --# if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305) --# define TLS_DEFAULT_CIPHERSUITES "TLS_AES_256_GCM_SHA384:" \ -- "TLS_CHACHA20_POLY1305_SHA256:" \ -- "TLS_AES_128_GCM_SHA256" --# else --# define TLS_DEFAULT_CIPHERSUITES "TLS_AES_256_GCM_SHA384:" \ -- "TLS_AES_128_GCM_SHA256" --#endif --/* -- * As of OpenSSL 1.0.0, ssl_create_cipher_list() in ssl/ssl_ciph.c always -- * starts with a reasonable order, and all we have to do for DEFAULT is -- * throwing out anonymous and unencrypted ciphersuites! (The latter are not -- * actually enabled by ALL, but "ALL:RSA" would enable some of them.) -- */ -- --/* Used in SSL_set_shutdown()/SSL_get_shutdown(); */ --# define SSL_SENT_SHUTDOWN 1 --# define SSL_RECEIVED_SHUTDOWN 2 -- --#ifdef __cplusplus --} --#endif -- --#ifdef __cplusplus --extern "C" { --#endif -- --# define SSL_FILETYPE_ASN1 X509_FILETYPE_ASN1 --# define SSL_FILETYPE_PEM X509_FILETYPE_PEM -- --/* -- * This is needed to stop compilers complaining about the 'struct ssl_st *' -- * function parameters used to prototype callbacks in SSL_CTX. -- */ --typedef struct ssl_st *ssl_crock_st; --typedef struct tls_session_ticket_ext_st TLS_SESSION_TICKET_EXT; --typedef struct ssl_method_st SSL_METHOD; --typedef struct ssl_cipher_st SSL_CIPHER; --typedef struct ssl_session_st SSL_SESSION; --typedef struct tls_sigalgs_st TLS_SIGALGS; --typedef struct ssl_conf_ctx_st SSL_CONF_CTX; --typedef struct ssl_comp_st SSL_COMP; -- --STACK_OF(SSL_CIPHER); --STACK_OF(SSL_COMP); -- --/* SRTP protection profiles for use with the use_srtp extension (RFC 5764)*/ --typedef struct srtp_protection_profile_st { -- const char *name; -- unsigned long id; --} SRTP_PROTECTION_PROFILE; -- --DEFINE_STACK_OF(SRTP_PROTECTION_PROFILE) -- --typedef int (*tls_session_ticket_ext_cb_fn)(SSL *s, const unsigned char *data, -- int len, void *arg); --typedef int (*tls_session_secret_cb_fn)(SSL *s, void *secret, int *secret_len, -- STACK_OF(SSL_CIPHER) *peer_ciphers, -- const SSL_CIPHER **cipher, void *arg); -- --/* Extension context codes */ --/* This extension is only allowed in TLS */ --#define SSL_EXT_TLS_ONLY 0x0001 --/* This extension is only allowed in DTLS */ --#define SSL_EXT_DTLS_ONLY 0x0002 --/* Some extensions may be allowed in DTLS but we don't implement them for it */ --#define SSL_EXT_TLS_IMPLEMENTATION_ONLY 0x0004 --/* Most extensions are not defined for SSLv3 but EXT_TYPE_renegotiate is */ --#define SSL_EXT_SSL3_ALLOWED 0x0008 --/* Extension is only defined for TLS1.2 and below */ --#define SSL_EXT_TLS1_2_AND_BELOW_ONLY 0x0010 --/* Extension is only defined for TLS1.3 and above */ --#define SSL_EXT_TLS1_3_ONLY 0x0020 --/* Ignore this extension during parsing if we are resuming */ --#define SSL_EXT_IGNORE_ON_RESUMPTION 0x0040 --#define SSL_EXT_CLIENT_HELLO 0x0080 --/* Really means TLS1.2 or below */ --#define SSL_EXT_TLS1_2_SERVER_HELLO 0x0100 --#define SSL_EXT_TLS1_3_SERVER_HELLO 0x0200 --#define SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS 0x0400 --#define SSL_EXT_TLS1_3_HELLO_RETRY_REQUEST 0x0800 --#define SSL_EXT_TLS1_3_CERTIFICATE 0x1000 --#define SSL_EXT_TLS1_3_NEW_SESSION_TICKET 0x2000 --#define SSL_EXT_TLS1_3_CERTIFICATE_REQUEST 0x4000 -- --/* Typedefs for handling custom extensions */ -- --typedef int (*custom_ext_add_cb)(SSL *s, unsigned int ext_type, -- const unsigned char **out, size_t *outlen, -- int *al, void *add_arg); -- --typedef void (*custom_ext_free_cb)(SSL *s, unsigned int ext_type, -- const unsigned char *out, void *add_arg); -- --typedef int (*custom_ext_parse_cb)(SSL *s, unsigned int ext_type, -- const unsigned char *in, size_t inlen, -- int *al, void *parse_arg); -- -- --typedef int (*SSL_custom_ext_add_cb_ex)(SSL *s, unsigned int ext_type, -- unsigned int context, -- const unsigned char **out, -- size_t *outlen, X509 *x, -- size_t chainidx, -- int *al, void *add_arg); -- --typedef void (*SSL_custom_ext_free_cb_ex)(SSL *s, unsigned int ext_type, -- unsigned int context, -- const unsigned char *out, -- void *add_arg); -- --typedef int (*SSL_custom_ext_parse_cb_ex)(SSL *s, unsigned int ext_type, -- unsigned int context, -- const unsigned char *in, -- size_t inlen, X509 *x, -- size_t chainidx, -- int *al, void *parse_arg); -- --/* Typedef for verification callback */ --typedef int (*SSL_verify_cb)(int preverify_ok, X509_STORE_CTX *x509_ctx); -- --/* -- * Some values are reserved until OpenSSL 1.2.0 because they were previously -- * included in SSL_OP_ALL in a 1.1.x release. -- * -- * Reserved value (until OpenSSL 1.2.0) 0x00000001U -- * Reserved value (until OpenSSL 1.2.0) 0x00000002U -- */ --/* Allow initial connection to servers that don't support RI */ --# define SSL_OP_LEGACY_SERVER_CONNECT 0x00000004U -- --/* Reserved value (until OpenSSL 1.2.0) 0x00000008U */ --# define SSL_OP_TLSEXT_PADDING 0x00000010U --/* Reserved value (until OpenSSL 1.2.0) 0x00000020U */ --# define SSL_OP_SAFARI_ECDHE_ECDSA_BUG 0x00000040U --/* -- * Reserved value (until OpenSSL 1.2.0) 0x00000080U -- * Reserved value (until OpenSSL 1.2.0) 0x00000100U -- * Reserved value (until OpenSSL 1.2.0) 0x00000200U -- */ -- --/* In TLSv1.3 allow a non-(ec)dhe based kex_mode */ --# define SSL_OP_ALLOW_NO_DHE_KEX 0x00000400U -- --/* -- * Disable SSL 3.0/TLS 1.0 CBC vulnerability workaround that was added in -- * OpenSSL 0.9.6d. Usually (depending on the application protocol) the -- * workaround is not needed. Unfortunately some broken SSL/TLS -- * implementations cannot handle it at all, which is why we include it in -- * SSL_OP_ALL. Added in 0.9.6e -- */ --# define SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS 0x00000800U -- --/* DTLS options */ --# define SSL_OP_NO_QUERY_MTU 0x00001000U --/* Turn on Cookie Exchange (on relevant for servers) */ --# define SSL_OP_COOKIE_EXCHANGE 0x00002000U --/* Don't use RFC4507 ticket extension */ --# define SSL_OP_NO_TICKET 0x00004000U --# ifndef OPENSSL_NO_DTLS1_METHOD --/* Use Cisco's "speshul" version of DTLS_BAD_VER -- * (only with deprecated DTLSv1_client_method()) */ --# define SSL_OP_CISCO_ANYCONNECT 0x00008000U --# endif -- --/* As server, disallow session resumption on renegotiation */ --# define SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION 0x00010000U --/* Don't use compression even if supported */ --# define SSL_OP_NO_COMPRESSION 0x00020000U --/* Permit unsafe legacy renegotiation */ --# define SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION 0x00040000U --/* Disable encrypt-then-mac */ --# define SSL_OP_NO_ENCRYPT_THEN_MAC 0x00080000U -- --/* -- * Enable TLSv1.3 Compatibility mode. This is on by default. A future version -- * of OpenSSL may have this disabled by default. -- */ --# define SSL_OP_ENABLE_MIDDLEBOX_COMPAT 0x00100000U -- --/* Prioritize Chacha20Poly1305 when client does. -- * Modifies SSL_OP_CIPHER_SERVER_PREFERENCE */ --# define SSL_OP_PRIORITIZE_CHACHA 0x00200000U -- --/* -- * Set on servers to choose the cipher according to the server's preferences -- */ --# define SSL_OP_CIPHER_SERVER_PREFERENCE 0x00400000U --/* -- * If set, a server will allow a client to issue a SSLv3.0 version number as -- * latest version supported in the premaster secret, even when TLSv1.0 -- * (version 3.1) was announced in the client hello. Normally this is -- * forbidden to prevent version rollback attacks. -- */ --# define SSL_OP_TLS_ROLLBACK_BUG 0x00800000U -- --/* -- * Switches off automatic TLSv1.3 anti-replay protection for early data. This -- * is a server-side option only (no effect on the client). -- */ --# define SSL_OP_NO_ANTI_REPLAY 0x01000000U -- --# define SSL_OP_NO_SSLv3 0x02000000U --# define SSL_OP_NO_TLSv1 0x04000000U --# define SSL_OP_NO_TLSv1_2 0x08000000U --# define SSL_OP_NO_TLSv1_1 0x10000000U --# define SSL_OP_NO_TLSv1_3 0x20000000U -- --# define SSL_OP_NO_DTLSv1 0x04000000U --# define SSL_OP_NO_DTLSv1_2 0x08000000U -- --# define SSL_OP_NO_SSL_MASK (SSL_OP_NO_SSLv3|\ -- SSL_OP_NO_TLSv1|SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1_2|SSL_OP_NO_TLSv1_3) --# define SSL_OP_NO_DTLS_MASK (SSL_OP_NO_DTLSv1|SSL_OP_NO_DTLSv1_2) -- --/* Disallow all renegotiation */ --# define SSL_OP_NO_RENEGOTIATION 0x40000000U -- --/* -- * Make server add server-hello extension from early version of cryptopro -- * draft, when GOST ciphersuite is negotiated. Required for interoperability -- * with CryptoPro CSP 3.x -- */ --# define SSL_OP_CRYPTOPRO_TLSEXT_BUG 0x80000000U -- --/* -- * SSL_OP_ALL: various bug workarounds that should be rather harmless. -- * This used to be 0x000FFFFFL before 0.9.7. -- * This used to be 0x80000BFFU before 1.1.1. -- */ --# define SSL_OP_ALL (SSL_OP_CRYPTOPRO_TLSEXT_BUG|\ -- SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS|\ -- SSL_OP_LEGACY_SERVER_CONNECT|\ -- SSL_OP_TLSEXT_PADDING|\ -- SSL_OP_SAFARI_ECDHE_ECDSA_BUG) -- --/* OBSOLETE OPTIONS: retained for compatibility */ -- --/* Removed from OpenSSL 1.1.0. Was 0x00000001L */ --/* Related to removed SSLv2. */ --# define SSL_OP_MICROSOFT_SESS_ID_BUG 0x0 --/* Removed from OpenSSL 1.1.0. Was 0x00000002L */ --/* Related to removed SSLv2. */ --# define SSL_OP_NETSCAPE_CHALLENGE_BUG 0x0 --/* Removed from OpenSSL 0.9.8q and 1.0.0c. Was 0x00000008L */ --/* Dead forever, see CVE-2010-4180 */ --# define SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG 0x0 --/* Removed from OpenSSL 1.0.1h and 1.0.2. Was 0x00000010L */ --/* Refers to ancient SSLREF and SSLv2. */ --# define SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG 0x0 --/* Removed from OpenSSL 1.1.0. Was 0x00000020 */ --# define SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER 0x0 --/* Removed from OpenSSL 0.9.7h and 0.9.8b. Was 0x00000040L */ --# define SSL_OP_MSIE_SSLV2_RSA_PADDING 0x0 --/* Removed from OpenSSL 1.1.0. Was 0x00000080 */ --/* Ancient SSLeay version. */ --# define SSL_OP_SSLEAY_080_CLIENT_DH_BUG 0x0 --/* Removed from OpenSSL 1.1.0. Was 0x00000100L */ --# define SSL_OP_TLS_D5_BUG 0x0 --/* Removed from OpenSSL 1.1.0. Was 0x00000200L */ --# define SSL_OP_TLS_BLOCK_PADDING_BUG 0x0 --/* Removed from OpenSSL 1.1.0. Was 0x00080000L */ --# define SSL_OP_SINGLE_ECDH_USE 0x0 --/* Removed from OpenSSL 1.1.0. Was 0x00100000L */ --# define SSL_OP_SINGLE_DH_USE 0x0 --/* Removed from OpenSSL 1.0.1k and 1.0.2. Was 0x00200000L */ --# define SSL_OP_EPHEMERAL_RSA 0x0 --/* Removed from OpenSSL 1.1.0. Was 0x01000000L */ --# define SSL_OP_NO_SSLv2 0x0 --/* Removed from OpenSSL 1.0.1. Was 0x08000000L */ --# define SSL_OP_PKCS1_CHECK_1 0x0 --/* Removed from OpenSSL 1.0.1. Was 0x10000000L */ --# define SSL_OP_PKCS1_CHECK_2 0x0 --/* Removed from OpenSSL 1.1.0. Was 0x20000000L */ --# define SSL_OP_NETSCAPE_CA_DN_BUG 0x0 --/* Removed from OpenSSL 1.1.0. Was 0x40000000L */ --# define SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG 0x0 -- --/* -- * Allow SSL_write(..., n) to return r with 0 < r < n (i.e. report success -- * when just a single record has been written): -- */ --# define SSL_MODE_ENABLE_PARTIAL_WRITE 0x00000001U --/* -- * Make it possible to retry SSL_write() with changed buffer location (buffer -- * contents must stay the same!); this is not the default to avoid the -- * misconception that non-blocking SSL_write() behaves like non-blocking -- * write(): -- */ --# define SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER 0x00000002U --/* -- * Never bother the application with retries if the transport is blocking: -- */ --# define SSL_MODE_AUTO_RETRY 0x00000004U --/* Don't attempt to automatically build certificate chain */ --# define SSL_MODE_NO_AUTO_CHAIN 0x00000008U --/* -- * Save RAM by releasing read and write buffers when they're empty. (SSL3 and -- * TLS only.) Released buffers are freed. -- */ --# define SSL_MODE_RELEASE_BUFFERS 0x00000010U --/* -- * Send the current time in the Random fields of the ClientHello and -- * ServerHello records for compatibility with hypothetical implementations -- * that require it. -- */ --# define SSL_MODE_SEND_CLIENTHELLO_TIME 0x00000020U --# define SSL_MODE_SEND_SERVERHELLO_TIME 0x00000040U --/* -- * Send TLS_FALLBACK_SCSV in the ClientHello. To be set only by applications -- * that reconnect with a downgraded protocol version; see -- * draft-ietf-tls-downgrade-scsv-00 for details. DO NOT ENABLE THIS if your -- * application attempts a normal handshake. Only use this in explicit -- * fallback retries, following the guidance in -- * draft-ietf-tls-downgrade-scsv-00. -- */ --# define SSL_MODE_SEND_FALLBACK_SCSV 0x00000080U --/* -- * Support Asynchronous operation -- */ --# define SSL_MODE_ASYNC 0x00000100U -- --/* -- * When using DTLS/SCTP, include the terminating zero in the label -- * used for computing the endpoint-pair shared secret. Required for -- * interoperability with implementations having this bug like these -- * older version of OpenSSL: -- * - OpenSSL 1.0.0 series -- * - OpenSSL 1.0.1 series -- * - OpenSSL 1.0.2 series -- * - OpenSSL 1.1.0 series -- * - OpenSSL 1.1.1 and 1.1.1a -- */ --# define SSL_MODE_DTLS_SCTP_LABEL_LENGTH_BUG 0x00000400U -- --/* Cert related flags */ --/* -- * Many implementations ignore some aspects of the TLS standards such as -- * enforcing certificate chain algorithms. When this is set we enforce them. -- */ --# define SSL_CERT_FLAG_TLS_STRICT 0x00000001U -- --/* Suite B modes, takes same values as certificate verify flags */ --# define SSL_CERT_FLAG_SUITEB_128_LOS_ONLY 0x10000 --/* Suite B 192 bit only mode */ --# define SSL_CERT_FLAG_SUITEB_192_LOS 0x20000 --/* Suite B 128 bit mode allowing 192 bit algorithms */ --# define SSL_CERT_FLAG_SUITEB_128_LOS 0x30000 -- --/* Perform all sorts of protocol violations for testing purposes */ --# define SSL_CERT_FLAG_BROKEN_PROTOCOL 0x10000000 -- --/* Flags for building certificate chains */ --/* Treat any existing certificates as untrusted CAs */ --# define SSL_BUILD_CHAIN_FLAG_UNTRUSTED 0x1 --/* Don't include root CA in chain */ --# define SSL_BUILD_CHAIN_FLAG_NO_ROOT 0x2 --/* Just check certificates already there */ --# define SSL_BUILD_CHAIN_FLAG_CHECK 0x4 --/* Ignore verification errors */ --# define SSL_BUILD_CHAIN_FLAG_IGNORE_ERROR 0x8 --/* Clear verification errors from queue */ --# define SSL_BUILD_CHAIN_FLAG_CLEAR_ERROR 0x10 -- --/* Flags returned by SSL_check_chain */ --/* Certificate can be used with this session */ --# define CERT_PKEY_VALID 0x1 --/* Certificate can also be used for signing */ --# define CERT_PKEY_SIGN 0x2 --/* EE certificate signing algorithm OK */ --# define CERT_PKEY_EE_SIGNATURE 0x10 --/* CA signature algorithms OK */ --# define CERT_PKEY_CA_SIGNATURE 0x20 --/* EE certificate parameters OK */ --# define CERT_PKEY_EE_PARAM 0x40 --/* CA certificate parameters OK */ --# define CERT_PKEY_CA_PARAM 0x80 --/* Signing explicitly allowed as opposed to SHA1 fallback */ --# define CERT_PKEY_EXPLICIT_SIGN 0x100 --/* Client CA issuer names match (always set for server cert) */ --# define CERT_PKEY_ISSUER_NAME 0x200 --/* Cert type matches client types (always set for server cert) */ --# define CERT_PKEY_CERT_TYPE 0x400 --/* Cert chain suitable to Suite B */ --# define CERT_PKEY_SUITEB 0x800 -- --# define SSL_CONF_FLAG_CMDLINE 0x1 --# define SSL_CONF_FLAG_FILE 0x2 --# define SSL_CONF_FLAG_CLIENT 0x4 --# define SSL_CONF_FLAG_SERVER 0x8 --# define SSL_CONF_FLAG_SHOW_ERRORS 0x10 --# define SSL_CONF_FLAG_CERTIFICATE 0x20 --# define SSL_CONF_FLAG_REQUIRE_PRIVATE 0x40 --/* Configuration value types */ --# define SSL_CONF_TYPE_UNKNOWN 0x0 --# define SSL_CONF_TYPE_STRING 0x1 --# define SSL_CONF_TYPE_FILE 0x2 --# define SSL_CONF_TYPE_DIR 0x3 --# define SSL_CONF_TYPE_NONE 0x4 -- --/* Maximum length of the application-controlled segment of a a TLSv1.3 cookie */ --# define SSL_COOKIE_LENGTH 4096 -- --/* -- * Note: SSL[_CTX]_set_{options,mode} use |= op on the previous value, they -- * cannot be used to clear bits. -- */ -- --unsigned long SSL_CTX_get_options(const SSL_CTX *ctx); --unsigned long SSL_get_options(const SSL *s); --unsigned long SSL_CTX_clear_options(SSL_CTX *ctx, unsigned long op); --unsigned long SSL_clear_options(SSL *s, unsigned long op); --unsigned long SSL_CTX_set_options(SSL_CTX *ctx, unsigned long op); --unsigned long SSL_set_options(SSL *s, unsigned long op); -- --# define SSL_CTX_set_mode(ctx,op) \ -- SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,(op),NULL) --# define SSL_CTX_clear_mode(ctx,op) \ -- SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_MODE,(op),NULL) --# define SSL_CTX_get_mode(ctx) \ -- SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,0,NULL) --# define SSL_clear_mode(ssl,op) \ -- SSL_ctrl((ssl),SSL_CTRL_CLEAR_MODE,(op),NULL) --# define SSL_set_mode(ssl,op) \ -- SSL_ctrl((ssl),SSL_CTRL_MODE,(op),NULL) --# define SSL_get_mode(ssl) \ -- SSL_ctrl((ssl),SSL_CTRL_MODE,0,NULL) --# define SSL_set_mtu(ssl, mtu) \ -- SSL_ctrl((ssl),SSL_CTRL_SET_MTU,(mtu),NULL) --# define DTLS_set_link_mtu(ssl, mtu) \ -- SSL_ctrl((ssl),DTLS_CTRL_SET_LINK_MTU,(mtu),NULL) --# define DTLS_get_link_min_mtu(ssl) \ -- SSL_ctrl((ssl),DTLS_CTRL_GET_LINK_MIN_MTU,0,NULL) -- --# define SSL_get_secure_renegotiation_support(ssl) \ -- SSL_ctrl((ssl), SSL_CTRL_GET_RI_SUPPORT, 0, NULL) -- --# ifndef OPENSSL_NO_HEARTBEATS --# define SSL_heartbeat(ssl) \ -- SSL_ctrl((ssl),SSL_CTRL_DTLS_EXT_SEND_HEARTBEAT,0,NULL) --# endif -- --# define SSL_CTX_set_cert_flags(ctx,op) \ -- SSL_CTX_ctrl((ctx),SSL_CTRL_CERT_FLAGS,(op),NULL) --# define SSL_set_cert_flags(s,op) \ -- SSL_ctrl((s),SSL_CTRL_CERT_FLAGS,(op),NULL) --# define SSL_CTX_clear_cert_flags(ctx,op) \ -- SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_CERT_FLAGS,(op),NULL) --# define SSL_clear_cert_flags(s,op) \ -- SSL_ctrl((s),SSL_CTRL_CLEAR_CERT_FLAGS,(op),NULL) -- --void SSL_CTX_set_msg_callback(SSL_CTX *ctx, -- void (*cb) (int write_p, int version, -- int content_type, const void *buf, -- size_t len, SSL *ssl, void *arg)); --void SSL_set_msg_callback(SSL *ssl, -- void (*cb) (int write_p, int version, -- int content_type, const void *buf, -- size_t len, SSL *ssl, void *arg)); --# define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) --# define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) -- --# define SSL_get_extms_support(s) \ -- SSL_ctrl((s),SSL_CTRL_GET_EXTMS_SUPPORT,0,NULL) -- --# ifndef OPENSSL_NO_SRP -- --/* see tls_srp.c */ --__owur int SSL_SRP_CTX_init(SSL *s); --__owur int SSL_CTX_SRP_CTX_init(SSL_CTX *ctx); --int SSL_SRP_CTX_free(SSL *ctx); --int SSL_CTX_SRP_CTX_free(SSL_CTX *ctx); --__owur int SSL_srp_server_param_with_username(SSL *s, int *ad); --__owur int SRP_Calc_A_param(SSL *s); -- --# endif -- --/* 100k max cert list */ --# define SSL_MAX_CERT_LIST_DEFAULT 1024*100 -- --# define SSL_SESSION_CACHE_MAX_SIZE_DEFAULT (1024*20) -- --/* -- * This callback type is used inside SSL_CTX, SSL, and in the functions that -- * set them. It is used to override the generation of SSL/TLS session IDs in -- * a server. Return value should be zero on an error, non-zero to proceed. -- * Also, callbacks should themselves check if the id they generate is unique -- * otherwise the SSL handshake will fail with an error - callbacks can do -- * this using the 'ssl' value they're passed by; -- * SSL_has_matching_session_id(ssl, id, *id_len) The length value passed in -- * is set at the maximum size the session ID can be. In SSLv3/TLSv1 it is 32 -- * bytes. The callback can alter this length to be less if desired. It is -- * also an error for the callback to set the size to zero. -- */ --typedef int (*GEN_SESSION_CB) (SSL *ssl, unsigned char *id, -- unsigned int *id_len); -- --# define SSL_SESS_CACHE_OFF 0x0000 --# define SSL_SESS_CACHE_CLIENT 0x0001 --# define SSL_SESS_CACHE_SERVER 0x0002 --# define SSL_SESS_CACHE_BOTH (SSL_SESS_CACHE_CLIENT|SSL_SESS_CACHE_SERVER) --# define SSL_SESS_CACHE_NO_AUTO_CLEAR 0x0080 --/* enough comments already ... see SSL_CTX_set_session_cache_mode(3) */ --# define SSL_SESS_CACHE_NO_INTERNAL_LOOKUP 0x0100 --# define SSL_SESS_CACHE_NO_INTERNAL_STORE 0x0200 --# define SSL_SESS_CACHE_NO_INTERNAL \ -- (SSL_SESS_CACHE_NO_INTERNAL_LOOKUP|SSL_SESS_CACHE_NO_INTERNAL_STORE) -- --LHASH_OF(SSL_SESSION) *SSL_CTX_sessions(SSL_CTX *ctx); --# define SSL_CTX_sess_number(ctx) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_NUMBER,0,NULL) --# define SSL_CTX_sess_connect(ctx) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT,0,NULL) --# define SSL_CTX_sess_connect_good(ctx) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_GOOD,0,NULL) --# define SSL_CTX_sess_connect_renegotiate(ctx) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_RENEGOTIATE,0,NULL) --# define SSL_CTX_sess_accept(ctx) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT,0,NULL) --# define SSL_CTX_sess_accept_renegotiate(ctx) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_RENEGOTIATE,0,NULL) --# define SSL_CTX_sess_accept_good(ctx) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_GOOD,0,NULL) --# define SSL_CTX_sess_hits(ctx) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_HIT,0,NULL) --# define SSL_CTX_sess_cb_hits(ctx) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CB_HIT,0,NULL) --# define SSL_CTX_sess_misses(ctx) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_MISSES,0,NULL) --# define SSL_CTX_sess_timeouts(ctx) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_TIMEOUTS,0,NULL) --# define SSL_CTX_sess_cache_full(ctx) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CACHE_FULL,0,NULL) -- --void SSL_CTX_sess_set_new_cb(SSL_CTX *ctx, -- int (*new_session_cb) (struct ssl_st *ssl, -- SSL_SESSION *sess)); --int (*SSL_CTX_sess_get_new_cb(SSL_CTX *ctx)) (struct ssl_st *ssl, -- SSL_SESSION *sess); --void SSL_CTX_sess_set_remove_cb(SSL_CTX *ctx, -- void (*remove_session_cb) (struct ssl_ctx_st -- *ctx, -- SSL_SESSION *sess)); --void (*SSL_CTX_sess_get_remove_cb(SSL_CTX *ctx)) (struct ssl_ctx_st *ctx, -- SSL_SESSION *sess); --void SSL_CTX_sess_set_get_cb(SSL_CTX *ctx, -- SSL_SESSION *(*get_session_cb) (struct ssl_st -- *ssl, -- const unsigned char -- *data, int len, -- int *copy)); --SSL_SESSION *(*SSL_CTX_sess_get_get_cb(SSL_CTX *ctx)) (struct ssl_st *ssl, -- const unsigned char *data, -- int len, int *copy); --void SSL_CTX_set_info_callback(SSL_CTX *ctx, -- void (*cb) (const SSL *ssl, int type, int val)); --void (*SSL_CTX_get_info_callback(SSL_CTX *ctx)) (const SSL *ssl, int type, -- int val); --void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx, -- int (*client_cert_cb) (SSL *ssl, X509 **x509, -- EVP_PKEY **pkey)); --int (*SSL_CTX_get_client_cert_cb(SSL_CTX *ctx)) (SSL *ssl, X509 **x509, -- EVP_PKEY **pkey); --# ifndef OPENSSL_NO_ENGINE --__owur int SSL_CTX_set_client_cert_engine(SSL_CTX *ctx, ENGINE *e); --# endif --void SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx, -- int (*app_gen_cookie_cb) (SSL *ssl, -- unsigned char -- *cookie, -- unsigned int -- *cookie_len)); --void SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx, -- int (*app_verify_cookie_cb) (SSL *ssl, -- const unsigned -- char *cookie, -- unsigned int -- cookie_len)); -- --void SSL_CTX_set_stateless_cookie_generate_cb( -- SSL_CTX *ctx, -- int (*gen_stateless_cookie_cb) (SSL *ssl, -- unsigned char *cookie, -- size_t *cookie_len)); --void SSL_CTX_set_stateless_cookie_verify_cb( -- SSL_CTX *ctx, -- int (*verify_stateless_cookie_cb) (SSL *ssl, -- const unsigned char *cookie, -- size_t cookie_len)); --# ifndef OPENSSL_NO_NEXTPROTONEG -- --typedef int (*SSL_CTX_npn_advertised_cb_func)(SSL *ssl, -- const unsigned char **out, -- unsigned int *outlen, -- void *arg); --void SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *s, -- SSL_CTX_npn_advertised_cb_func cb, -- void *arg); --# define SSL_CTX_set_npn_advertised_cb SSL_CTX_set_next_protos_advertised_cb -- --typedef int (*SSL_CTX_npn_select_cb_func)(SSL *s, -- unsigned char **out, -- unsigned char *outlen, -- const unsigned char *in, -- unsigned int inlen, -- void *arg); --void SSL_CTX_set_next_proto_select_cb(SSL_CTX *s, -- SSL_CTX_npn_select_cb_func cb, -- void *arg); --# define SSL_CTX_set_npn_select_cb SSL_CTX_set_next_proto_select_cb -- --void SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data, -- unsigned *len); --# define SSL_get0_npn_negotiated SSL_get0_next_proto_negotiated --# endif -- --__owur int SSL_select_next_proto(unsigned char **out, unsigned char *outlen, -- const unsigned char *in, unsigned int inlen, -- const unsigned char *client, -- unsigned int client_len); -- --# define OPENSSL_NPN_UNSUPPORTED 0 --# define OPENSSL_NPN_NEGOTIATED 1 --# define OPENSSL_NPN_NO_OVERLAP 2 -- --__owur int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const unsigned char *protos, -- unsigned int protos_len); --__owur int SSL_set_alpn_protos(SSL *ssl, const unsigned char *protos, -- unsigned int protos_len); --typedef int (*SSL_CTX_alpn_select_cb_func)(SSL *ssl, -- const unsigned char **out, -- unsigned char *outlen, -- const unsigned char *in, -- unsigned int inlen, -- void *arg); --void SSL_CTX_set_alpn_select_cb(SSL_CTX *ctx, -- SSL_CTX_alpn_select_cb_func cb, -- void *arg); --void SSL_get0_alpn_selected(const SSL *ssl, const unsigned char **data, -- unsigned int *len); -- --# ifndef OPENSSL_NO_PSK --/* -- * the maximum length of the buffer given to callbacks containing the -- * resulting identity/psk -- */ --# define PSK_MAX_IDENTITY_LEN 128 --# define PSK_MAX_PSK_LEN 256 --typedef unsigned int (*SSL_psk_client_cb_func)(SSL *ssl, -- const char *hint, -- char *identity, -- unsigned int max_identity_len, -- unsigned char *psk, -- unsigned int max_psk_len); --void SSL_CTX_set_psk_client_callback(SSL_CTX *ctx, SSL_psk_client_cb_func cb); --void SSL_set_psk_client_callback(SSL *ssl, SSL_psk_client_cb_func cb); -- --typedef unsigned int (*SSL_psk_server_cb_func)(SSL *ssl, -- const char *identity, -- unsigned char *psk, -- unsigned int max_psk_len); --void SSL_CTX_set_psk_server_callback(SSL_CTX *ctx, SSL_psk_server_cb_func cb); --void SSL_set_psk_server_callback(SSL *ssl, SSL_psk_server_cb_func cb); -- --__owur int SSL_CTX_use_psk_identity_hint(SSL_CTX *ctx, const char *identity_hint); --__owur int SSL_use_psk_identity_hint(SSL *s, const char *identity_hint); --const char *SSL_get_psk_identity_hint(const SSL *s); --const char *SSL_get_psk_identity(const SSL *s); --# endif -- --typedef int (*SSL_psk_find_session_cb_func)(SSL *ssl, -- const unsigned char *identity, -- size_t identity_len, -- SSL_SESSION **sess); --typedef int (*SSL_psk_use_session_cb_func)(SSL *ssl, const EVP_MD *md, -- const unsigned char **id, -- size_t *idlen, -- SSL_SESSION **sess); -- --void SSL_set_psk_find_session_callback(SSL *s, SSL_psk_find_session_cb_func cb); --void SSL_CTX_set_psk_find_session_callback(SSL_CTX *ctx, -- SSL_psk_find_session_cb_func cb); --void SSL_set_psk_use_session_callback(SSL *s, SSL_psk_use_session_cb_func cb); --void SSL_CTX_set_psk_use_session_callback(SSL_CTX *ctx, -- SSL_psk_use_session_cb_func cb); -- --/* Register callbacks to handle custom TLS Extensions for client or server. */ -- --__owur int SSL_CTX_has_client_custom_ext(const SSL_CTX *ctx, -- unsigned int ext_type); -- --__owur int SSL_CTX_add_client_custom_ext(SSL_CTX *ctx, -- unsigned int ext_type, -- custom_ext_add_cb add_cb, -- custom_ext_free_cb free_cb, -- void *add_arg, -- custom_ext_parse_cb parse_cb, -- void *parse_arg); -- --__owur int SSL_CTX_add_server_custom_ext(SSL_CTX *ctx, -- unsigned int ext_type, -- custom_ext_add_cb add_cb, -- custom_ext_free_cb free_cb, -- void *add_arg, -- custom_ext_parse_cb parse_cb, -- void *parse_arg); -- --__owur int SSL_CTX_add_custom_ext(SSL_CTX *ctx, unsigned int ext_type, -- unsigned int context, -- SSL_custom_ext_add_cb_ex add_cb, -- SSL_custom_ext_free_cb_ex free_cb, -- void *add_arg, -- SSL_custom_ext_parse_cb_ex parse_cb, -- void *parse_arg); -- --__owur int SSL_extension_supported(unsigned int ext_type); -- --# define SSL_NOTHING 1 --# define SSL_WRITING 2 --# define SSL_READING 3 --# define SSL_X509_LOOKUP 4 --# define SSL_ASYNC_PAUSED 5 --# define SSL_ASYNC_NO_JOBS 6 --# define SSL_CLIENT_HELLO_CB 7 -- --/* These will only be used when doing non-blocking IO */ --# define SSL_want_nothing(s) (SSL_want(s) == SSL_NOTHING) --# define SSL_want_read(s) (SSL_want(s) == SSL_READING) --# define SSL_want_write(s) (SSL_want(s) == SSL_WRITING) --# define SSL_want_x509_lookup(s) (SSL_want(s) == SSL_X509_LOOKUP) --# define SSL_want_async(s) (SSL_want(s) == SSL_ASYNC_PAUSED) --# define SSL_want_async_job(s) (SSL_want(s) == SSL_ASYNC_NO_JOBS) --# define SSL_want_client_hello_cb(s) (SSL_want(s) == SSL_CLIENT_HELLO_CB) -- --# define SSL_MAC_FLAG_READ_MAC_STREAM 1 --# define SSL_MAC_FLAG_WRITE_MAC_STREAM 2 -- --/* -- * A callback for logging out TLS key material. This callback should log out -- * |line| followed by a newline. -- */ --typedef void (*SSL_CTX_keylog_cb_func)(const SSL *ssl, const char *line); -- --/* -- * SSL_CTX_set_keylog_callback configures a callback to log key material. This -- * is intended for debugging use with tools like Wireshark. The cb function -- * should log line followed by a newline. -- */ --void SSL_CTX_set_keylog_callback(SSL_CTX *ctx, SSL_CTX_keylog_cb_func cb); -- --/* -- * SSL_CTX_get_keylog_callback returns the callback configured by -- * SSL_CTX_set_keylog_callback. -- */ --SSL_CTX_keylog_cb_func SSL_CTX_get_keylog_callback(const SSL_CTX *ctx); -- --int SSL_CTX_set_max_early_data(SSL_CTX *ctx, uint32_t max_early_data); --uint32_t SSL_CTX_get_max_early_data(const SSL_CTX *ctx); --int SSL_set_max_early_data(SSL *s, uint32_t max_early_data); --uint32_t SSL_get_max_early_data(const SSL *s); --int SSL_CTX_set_recv_max_early_data(SSL_CTX *ctx, uint32_t recv_max_early_data); --uint32_t SSL_CTX_get_recv_max_early_data(const SSL_CTX *ctx); --int SSL_set_recv_max_early_data(SSL *s, uint32_t recv_max_early_data); --uint32_t SSL_get_recv_max_early_data(const SSL *s); -- --#ifdef __cplusplus --} --#endif -- --# include --# include --# include /* This is mostly sslv3 with a few tweaks */ --# include /* Datagram TLS */ --# include /* Support for the use_srtp extension */ -- --#ifdef __cplusplus --extern "C" { --#endif -- --/* -- * These need to be after the above set of includes due to a compiler bug -- * in VisualStudio 2015 -- */ --DEFINE_STACK_OF_CONST(SSL_CIPHER) --DEFINE_STACK_OF(SSL_COMP) -- --/* compatibility */ --# define SSL_set_app_data(s,arg) (SSL_set_ex_data(s,0,(char *)(arg))) --# define SSL_get_app_data(s) (SSL_get_ex_data(s,0)) --# define SSL_SESSION_set_app_data(s,a) (SSL_SESSION_set_ex_data(s,0, \ -- (char *)(a))) --# define SSL_SESSION_get_app_data(s) (SSL_SESSION_get_ex_data(s,0)) --# define SSL_CTX_get_app_data(ctx) (SSL_CTX_get_ex_data(ctx,0)) --# define SSL_CTX_set_app_data(ctx,arg) (SSL_CTX_set_ex_data(ctx,0, \ -- (char *)(arg))) --DEPRECATEDIN_1_1_0(void SSL_set_debug(SSL *s, int debug)) -- --/* TLSv1.3 KeyUpdate message types */ --/* -1 used so that this is an invalid value for the on-the-wire protocol */ --#define SSL_KEY_UPDATE_NONE -1 --/* Values as defined for the on-the-wire protocol */ --#define SSL_KEY_UPDATE_NOT_REQUESTED 0 --#define SSL_KEY_UPDATE_REQUESTED 1 -- --/* -- * The valid handshake states (one for each type message sent and one for each -- * type of message received). There are also two "special" states: -- * TLS = TLS or DTLS state -- * DTLS = DTLS specific state -- * CR/SR = Client Read/Server Read -- * CW/SW = Client Write/Server Write -- * -- * The "special" states are: -- * TLS_ST_BEFORE = No handshake has been initiated yet -- * TLS_ST_OK = A handshake has been successfully completed -- */ --typedef enum { -- TLS_ST_BEFORE, -- TLS_ST_OK, -- DTLS_ST_CR_HELLO_VERIFY_REQUEST, -- TLS_ST_CR_SRVR_HELLO, -- TLS_ST_CR_CERT, -- TLS_ST_CR_CERT_STATUS, -- TLS_ST_CR_KEY_EXCH, -- TLS_ST_CR_CERT_REQ, -- TLS_ST_CR_SRVR_DONE, -- TLS_ST_CR_SESSION_TICKET, -- TLS_ST_CR_CHANGE, -- TLS_ST_CR_FINISHED, -- TLS_ST_CW_CLNT_HELLO, -- TLS_ST_CW_CERT, -- TLS_ST_CW_KEY_EXCH, -- TLS_ST_CW_CERT_VRFY, -- TLS_ST_CW_CHANGE, -- TLS_ST_CW_NEXT_PROTO, -- TLS_ST_CW_FINISHED, -- TLS_ST_SW_HELLO_REQ, -- TLS_ST_SR_CLNT_HELLO, -- DTLS_ST_SW_HELLO_VERIFY_REQUEST, -- TLS_ST_SW_SRVR_HELLO, -- TLS_ST_SW_CERT, -- TLS_ST_SW_KEY_EXCH, -- TLS_ST_SW_CERT_REQ, -- TLS_ST_SW_SRVR_DONE, -- TLS_ST_SR_CERT, -- TLS_ST_SR_KEY_EXCH, -- TLS_ST_SR_CERT_VRFY, -- TLS_ST_SR_NEXT_PROTO, -- TLS_ST_SR_CHANGE, -- TLS_ST_SR_FINISHED, -- TLS_ST_SW_SESSION_TICKET, -- TLS_ST_SW_CERT_STATUS, -- TLS_ST_SW_CHANGE, -- TLS_ST_SW_FINISHED, -- TLS_ST_SW_ENCRYPTED_EXTENSIONS, -- TLS_ST_CR_ENCRYPTED_EXTENSIONS, -- TLS_ST_CR_CERT_VRFY, -- TLS_ST_SW_CERT_VRFY, -- TLS_ST_CR_HELLO_REQ, -- TLS_ST_SW_KEY_UPDATE, -- TLS_ST_CW_KEY_UPDATE, -- TLS_ST_SR_KEY_UPDATE, -- TLS_ST_CR_KEY_UPDATE, -- TLS_ST_EARLY_DATA, -- TLS_ST_PENDING_EARLY_DATA_END, -- TLS_ST_CW_END_OF_EARLY_DATA, -- TLS_ST_SR_END_OF_EARLY_DATA --} OSSL_HANDSHAKE_STATE; -- --/* -- * Most of the following state values are no longer used and are defined to be -- * the closest equivalent value in the current state machine code. Not all -- * defines have an equivalent and are set to a dummy value (-1). SSL_ST_CONNECT -- * and SSL_ST_ACCEPT are still in use in the definition of SSL_CB_ACCEPT_LOOP, -- * SSL_CB_ACCEPT_EXIT, SSL_CB_CONNECT_LOOP and SSL_CB_CONNECT_EXIT. -- */ -- --# define SSL_ST_CONNECT 0x1000 --# define SSL_ST_ACCEPT 0x2000 -- --# define SSL_ST_MASK 0x0FFF -- --# define SSL_CB_LOOP 0x01 --# define SSL_CB_EXIT 0x02 --# define SSL_CB_READ 0x04 --# define SSL_CB_WRITE 0x08 --# define SSL_CB_ALERT 0x4000/* used in callback */ --# define SSL_CB_READ_ALERT (SSL_CB_ALERT|SSL_CB_READ) --# define SSL_CB_WRITE_ALERT (SSL_CB_ALERT|SSL_CB_WRITE) --# define SSL_CB_ACCEPT_LOOP (SSL_ST_ACCEPT|SSL_CB_LOOP) --# define SSL_CB_ACCEPT_EXIT (SSL_ST_ACCEPT|SSL_CB_EXIT) --# define SSL_CB_CONNECT_LOOP (SSL_ST_CONNECT|SSL_CB_LOOP) --# define SSL_CB_CONNECT_EXIT (SSL_ST_CONNECT|SSL_CB_EXIT) --# define SSL_CB_HANDSHAKE_START 0x10 --# define SSL_CB_HANDSHAKE_DONE 0x20 -- --/* Is the SSL_connection established? */ --# define SSL_in_connect_init(a) (SSL_in_init(a) && !SSL_is_server(a)) --# define SSL_in_accept_init(a) (SSL_in_init(a) && SSL_is_server(a)) --int SSL_in_init(const SSL *s); --int SSL_in_before(const SSL *s); --int SSL_is_init_finished(const SSL *s); -- --/* -- * The following 3 states are kept in ssl->rlayer.rstate when reads fail, you -- * should not need these -- */ --# define SSL_ST_READ_HEADER 0xF0 --# define SSL_ST_READ_BODY 0xF1 --# define SSL_ST_READ_DONE 0xF2 -- --/*- -- * Obtain latest Finished message -- * -- that we sent (SSL_get_finished) -- * -- that we expected from peer (SSL_get_peer_finished). -- * Returns length (0 == no Finished so far), copies up to 'count' bytes. -- */ --size_t SSL_get_finished(const SSL *s, void *buf, size_t count); --size_t SSL_get_peer_finished(const SSL *s, void *buf, size_t count); -- --/* -- * use either SSL_VERIFY_NONE or SSL_VERIFY_PEER, the last 3 options are -- * 'ored' with SSL_VERIFY_PEER if they are desired -- */ --# define SSL_VERIFY_NONE 0x00 --# define SSL_VERIFY_PEER 0x01 --# define SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02 --# define SSL_VERIFY_CLIENT_ONCE 0x04 --# define SSL_VERIFY_POST_HANDSHAKE 0x08 -- --# if OPENSSL_API_COMPAT < 0x10100000L --# define OpenSSL_add_ssl_algorithms() SSL_library_init() --# define SSLeay_add_ssl_algorithms() SSL_library_init() --# endif -- --/* More backward compatibility */ --# define SSL_get_cipher(s) \ -- SSL_CIPHER_get_name(SSL_get_current_cipher(s)) --# define SSL_get_cipher_bits(s,np) \ -- SSL_CIPHER_get_bits(SSL_get_current_cipher(s),np) --# define SSL_get_cipher_version(s) \ -- SSL_CIPHER_get_version(SSL_get_current_cipher(s)) --# define SSL_get_cipher_name(s) \ -- SSL_CIPHER_get_name(SSL_get_current_cipher(s)) --# define SSL_get_time(a) SSL_SESSION_get_time(a) --# define SSL_set_time(a,b) SSL_SESSION_set_time((a),(b)) --# define SSL_get_timeout(a) SSL_SESSION_get_timeout(a) --# define SSL_set_timeout(a,b) SSL_SESSION_set_timeout((a),(b)) -- --# define d2i_SSL_SESSION_bio(bp,s_id) ASN1_d2i_bio_of(SSL_SESSION,SSL_SESSION_new,d2i_SSL_SESSION,bp,s_id) --# define i2d_SSL_SESSION_bio(bp,s_id) ASN1_i2d_bio_of(SSL_SESSION,i2d_SSL_SESSION,bp,s_id) -- --DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION) --# define SSL_AD_REASON_OFFSET 1000/* offset to get SSL_R_... value -- * from SSL_AD_... */ --/* These alert types are for SSLv3 and TLSv1 */ --# define SSL_AD_CLOSE_NOTIFY SSL3_AD_CLOSE_NOTIFY --/* fatal */ --# define SSL_AD_UNEXPECTED_MESSAGE SSL3_AD_UNEXPECTED_MESSAGE --/* fatal */ --# define SSL_AD_BAD_RECORD_MAC SSL3_AD_BAD_RECORD_MAC --# define SSL_AD_DECRYPTION_FAILED TLS1_AD_DECRYPTION_FAILED --# define SSL_AD_RECORD_OVERFLOW TLS1_AD_RECORD_OVERFLOW --/* fatal */ --# define SSL_AD_DECOMPRESSION_FAILURE SSL3_AD_DECOMPRESSION_FAILURE --/* fatal */ --# define SSL_AD_HANDSHAKE_FAILURE SSL3_AD_HANDSHAKE_FAILURE --/* Not for TLS */ --# define SSL_AD_NO_CERTIFICATE SSL3_AD_NO_CERTIFICATE --# define SSL_AD_BAD_CERTIFICATE SSL3_AD_BAD_CERTIFICATE --# define SSL_AD_UNSUPPORTED_CERTIFICATE SSL3_AD_UNSUPPORTED_CERTIFICATE --# define SSL_AD_CERTIFICATE_REVOKED SSL3_AD_CERTIFICATE_REVOKED --# define SSL_AD_CERTIFICATE_EXPIRED SSL3_AD_CERTIFICATE_EXPIRED --# define SSL_AD_CERTIFICATE_UNKNOWN SSL3_AD_CERTIFICATE_UNKNOWN --/* fatal */ --# define SSL_AD_ILLEGAL_PARAMETER SSL3_AD_ILLEGAL_PARAMETER --/* fatal */ --# define SSL_AD_UNKNOWN_CA TLS1_AD_UNKNOWN_CA --/* fatal */ --# define SSL_AD_ACCESS_DENIED TLS1_AD_ACCESS_DENIED --/* fatal */ --# define SSL_AD_DECODE_ERROR TLS1_AD_DECODE_ERROR --# define SSL_AD_DECRYPT_ERROR TLS1_AD_DECRYPT_ERROR --/* fatal */ --# define SSL_AD_EXPORT_RESTRICTION TLS1_AD_EXPORT_RESTRICTION --/* fatal */ --# define SSL_AD_PROTOCOL_VERSION TLS1_AD_PROTOCOL_VERSION --/* fatal */ --# define SSL_AD_INSUFFICIENT_SECURITY TLS1_AD_INSUFFICIENT_SECURITY --/* fatal */ --# define SSL_AD_INTERNAL_ERROR TLS1_AD_INTERNAL_ERROR --# define SSL_AD_USER_CANCELLED TLS1_AD_USER_CANCELLED --# define SSL_AD_NO_RENEGOTIATION TLS1_AD_NO_RENEGOTIATION --# define SSL_AD_MISSING_EXTENSION TLS13_AD_MISSING_EXTENSION --# define SSL_AD_CERTIFICATE_REQUIRED TLS13_AD_CERTIFICATE_REQUIRED --# define SSL_AD_UNSUPPORTED_EXTENSION TLS1_AD_UNSUPPORTED_EXTENSION --# define SSL_AD_CERTIFICATE_UNOBTAINABLE TLS1_AD_CERTIFICATE_UNOBTAINABLE --# define SSL_AD_UNRECOGNIZED_NAME TLS1_AD_UNRECOGNIZED_NAME --# define SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE --# define SSL_AD_BAD_CERTIFICATE_HASH_VALUE TLS1_AD_BAD_CERTIFICATE_HASH_VALUE --/* fatal */ --# define SSL_AD_UNKNOWN_PSK_IDENTITY TLS1_AD_UNKNOWN_PSK_IDENTITY --/* fatal */ --# define SSL_AD_INAPPROPRIATE_FALLBACK TLS1_AD_INAPPROPRIATE_FALLBACK --# define SSL_AD_NO_APPLICATION_PROTOCOL TLS1_AD_NO_APPLICATION_PROTOCOL --# define SSL_ERROR_NONE 0 --# define SSL_ERROR_SSL 1 --# define SSL_ERROR_WANT_READ 2 --# define SSL_ERROR_WANT_WRITE 3 --# define SSL_ERROR_WANT_X509_LOOKUP 4 --# define SSL_ERROR_SYSCALL 5/* look at error stack/return -- * value/errno */ --# define SSL_ERROR_ZERO_RETURN 6 --# define SSL_ERROR_WANT_CONNECT 7 --# define SSL_ERROR_WANT_ACCEPT 8 --# define SSL_ERROR_WANT_ASYNC 9 --# define SSL_ERROR_WANT_ASYNC_JOB 10 --# define SSL_ERROR_WANT_CLIENT_HELLO_CB 11 --# define SSL_CTRL_SET_TMP_DH 3 --# define SSL_CTRL_SET_TMP_ECDH 4 --# define SSL_CTRL_SET_TMP_DH_CB 6 --# define SSL_CTRL_GET_CLIENT_CERT_REQUEST 9 --# define SSL_CTRL_GET_NUM_RENEGOTIATIONS 10 --# define SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS 11 --# define SSL_CTRL_GET_TOTAL_RENEGOTIATIONS 12 --# define SSL_CTRL_GET_FLAGS 13 --# define SSL_CTRL_EXTRA_CHAIN_CERT 14 --# define SSL_CTRL_SET_MSG_CALLBACK 15 --# define SSL_CTRL_SET_MSG_CALLBACK_ARG 16 --/* only applies to datagram connections */ --# define SSL_CTRL_SET_MTU 17 --/* Stats */ --# define SSL_CTRL_SESS_NUMBER 20 --# define SSL_CTRL_SESS_CONNECT 21 --# define SSL_CTRL_SESS_CONNECT_GOOD 22 --# define SSL_CTRL_SESS_CONNECT_RENEGOTIATE 23 --# define SSL_CTRL_SESS_ACCEPT 24 --# define SSL_CTRL_SESS_ACCEPT_GOOD 25 --# define SSL_CTRL_SESS_ACCEPT_RENEGOTIATE 26 --# define SSL_CTRL_SESS_HIT 27 --# define SSL_CTRL_SESS_CB_HIT 28 --# define SSL_CTRL_SESS_MISSES 29 --# define SSL_CTRL_SESS_TIMEOUTS 30 --# define SSL_CTRL_SESS_CACHE_FULL 31 --# define SSL_CTRL_MODE 33 --# define SSL_CTRL_GET_READ_AHEAD 40 --# define SSL_CTRL_SET_READ_AHEAD 41 --# define SSL_CTRL_SET_SESS_CACHE_SIZE 42 --# define SSL_CTRL_GET_SESS_CACHE_SIZE 43 --# define SSL_CTRL_SET_SESS_CACHE_MODE 44 --# define SSL_CTRL_GET_SESS_CACHE_MODE 45 --# define SSL_CTRL_GET_MAX_CERT_LIST 50 --# define SSL_CTRL_SET_MAX_CERT_LIST 51 --# define SSL_CTRL_SET_MAX_SEND_FRAGMENT 52 --/* see tls1.h for macros based on these */ --# define SSL_CTRL_SET_TLSEXT_SERVERNAME_CB 53 --# define SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG 54 --# define SSL_CTRL_SET_TLSEXT_HOSTNAME 55 --# define SSL_CTRL_SET_TLSEXT_DEBUG_CB 56 --# define SSL_CTRL_SET_TLSEXT_DEBUG_ARG 57 --# define SSL_CTRL_GET_TLSEXT_TICKET_KEYS 58 --# define SSL_CTRL_SET_TLSEXT_TICKET_KEYS 59 --/*# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT 60 */ --/*# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB 61 */ --/*# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB_ARG 62 */ --# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB 63 --# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG 64 --# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE 65 --# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS 66 --# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS 67 --# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS 68 --# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS 69 --# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP 70 --# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP 71 --# define SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB 72 --# define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME_CB 75 --# define SSL_CTRL_SET_SRP_VERIFY_PARAM_CB 76 --# define SSL_CTRL_SET_SRP_GIVE_CLIENT_PWD_CB 77 --# define SSL_CTRL_SET_SRP_ARG 78 --# define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME 79 --# define SSL_CTRL_SET_TLS_EXT_SRP_STRENGTH 80 --# define SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD 81 --# ifndef OPENSSL_NO_HEARTBEATS --# define SSL_CTRL_DTLS_EXT_SEND_HEARTBEAT 85 --# define SSL_CTRL_GET_DTLS_EXT_HEARTBEAT_PENDING 86 --# define SSL_CTRL_SET_DTLS_EXT_HEARTBEAT_NO_REQUESTS 87 --# endif --# define DTLS_CTRL_GET_TIMEOUT 73 --# define DTLS_CTRL_HANDLE_TIMEOUT 74 --# define SSL_CTRL_GET_RI_SUPPORT 76 --# define SSL_CTRL_CLEAR_MODE 78 --# define SSL_CTRL_SET_NOT_RESUMABLE_SESS_CB 79 --# define SSL_CTRL_GET_EXTRA_CHAIN_CERTS 82 --# define SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS 83 --# define SSL_CTRL_CHAIN 88 --# define SSL_CTRL_CHAIN_CERT 89 --# define SSL_CTRL_GET_GROUPS 90 --# define SSL_CTRL_SET_GROUPS 91 --# define SSL_CTRL_SET_GROUPS_LIST 92 --# define SSL_CTRL_GET_SHARED_GROUP 93 --# define SSL_CTRL_SET_SIGALGS 97 --# define SSL_CTRL_SET_SIGALGS_LIST 98 --# define SSL_CTRL_CERT_FLAGS 99 --# define SSL_CTRL_CLEAR_CERT_FLAGS 100 --# define SSL_CTRL_SET_CLIENT_SIGALGS 101 --# define SSL_CTRL_SET_CLIENT_SIGALGS_LIST 102 --# define SSL_CTRL_GET_CLIENT_CERT_TYPES 103 --# define SSL_CTRL_SET_CLIENT_CERT_TYPES 104 --# define SSL_CTRL_BUILD_CERT_CHAIN 105 --# define SSL_CTRL_SET_VERIFY_CERT_STORE 106 --# define SSL_CTRL_SET_CHAIN_CERT_STORE 107 --# define SSL_CTRL_GET_PEER_SIGNATURE_NID 108 --# define SSL_CTRL_GET_PEER_TMP_KEY 109 --# define SSL_CTRL_GET_RAW_CIPHERLIST 110 --# define SSL_CTRL_GET_EC_POINT_FORMATS 111 --# define SSL_CTRL_GET_CHAIN_CERTS 115 --# define SSL_CTRL_SELECT_CURRENT_CERT 116 --# define SSL_CTRL_SET_CURRENT_CERT 117 --# define SSL_CTRL_SET_DH_AUTO 118 --# define DTLS_CTRL_SET_LINK_MTU 120 --# define DTLS_CTRL_GET_LINK_MIN_MTU 121 --# define SSL_CTRL_GET_EXTMS_SUPPORT 122 --# define SSL_CTRL_SET_MIN_PROTO_VERSION 123 --# define SSL_CTRL_SET_MAX_PROTO_VERSION 124 --# define SSL_CTRL_SET_SPLIT_SEND_FRAGMENT 125 --# define SSL_CTRL_SET_MAX_PIPELINES 126 --# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_TYPE 127 --# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB 128 --# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG 129 --# define SSL_CTRL_GET_MIN_PROTO_VERSION 130 --# define SSL_CTRL_GET_MAX_PROTO_VERSION 131 --# define SSL_CTRL_GET_SIGNATURE_NID 132 --# define SSL_CTRL_GET_TMP_KEY 133 --# define SSL_CERT_SET_FIRST 1 --# define SSL_CERT_SET_NEXT 2 --# define SSL_CERT_SET_SERVER 3 --# define DTLSv1_get_timeout(ssl, arg) \ -- SSL_ctrl(ssl,DTLS_CTRL_GET_TIMEOUT,0, (void *)(arg)) --# define DTLSv1_handle_timeout(ssl) \ -- SSL_ctrl(ssl,DTLS_CTRL_HANDLE_TIMEOUT,0, NULL) --# define SSL_num_renegotiations(ssl) \ -- SSL_ctrl((ssl),SSL_CTRL_GET_NUM_RENEGOTIATIONS,0,NULL) --# define SSL_clear_num_renegotiations(ssl) \ -- SSL_ctrl((ssl),SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS,0,NULL) --# define SSL_total_renegotiations(ssl) \ -- SSL_ctrl((ssl),SSL_CTRL_GET_TOTAL_RENEGOTIATIONS,0,NULL) --# define SSL_CTX_set_tmp_dh(ctx,dh) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH,0,(char *)(dh)) --# define SSL_CTX_set_tmp_ecdh(ctx,ecdh) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_ECDH,0,(char *)(ecdh)) --# define SSL_CTX_set_dh_auto(ctx, onoff) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_DH_AUTO,onoff,NULL) --# define SSL_set_dh_auto(s, onoff) \ -- SSL_ctrl(s,SSL_CTRL_SET_DH_AUTO,onoff,NULL) --# define SSL_set_tmp_dh(ssl,dh) \ -- SSL_ctrl(ssl,SSL_CTRL_SET_TMP_DH,0,(char *)(dh)) --# define SSL_set_tmp_ecdh(ssl,ecdh) \ -- SSL_ctrl(ssl,SSL_CTRL_SET_TMP_ECDH,0,(char *)(ecdh)) --# define SSL_CTX_add_extra_chain_cert(ctx,x509) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)(x509)) --# define SSL_CTX_get_extra_chain_certs(ctx,px509) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_GET_EXTRA_CHAIN_CERTS,0,px509) --# define SSL_CTX_get_extra_chain_certs_only(ctx,px509) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_GET_EXTRA_CHAIN_CERTS,1,px509) --# define SSL_CTX_clear_extra_chain_certs(ctx) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS,0,NULL) --# define SSL_CTX_set0_chain(ctx,sk) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN,0,(char *)(sk)) --# define SSL_CTX_set1_chain(ctx,sk) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN,1,(char *)(sk)) --# define SSL_CTX_add0_chain_cert(ctx,x509) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN_CERT,0,(char *)(x509)) --# define SSL_CTX_add1_chain_cert(ctx,x509) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN_CERT,1,(char *)(x509)) --# define SSL_CTX_get0_chain_certs(ctx,px509) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_GET_CHAIN_CERTS,0,px509) --# define SSL_CTX_clear_chain_certs(ctx) \ -- SSL_CTX_set0_chain(ctx,NULL) --# define SSL_CTX_build_cert_chain(ctx, flags) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL) --# define SSL_CTX_select_current_cert(ctx,x509) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SELECT_CURRENT_CERT,0,(char *)(x509)) --# define SSL_CTX_set_current_cert(ctx, op) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CURRENT_CERT, op, NULL) --# define SSL_CTX_set0_verify_cert_store(ctx,st) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_VERIFY_CERT_STORE,0,(char *)(st)) --# define SSL_CTX_set1_verify_cert_store(ctx,st) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_VERIFY_CERT_STORE,1,(char *)(st)) --# define SSL_CTX_set0_chain_cert_store(ctx,st) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CHAIN_CERT_STORE,0,(char *)(st)) --# define SSL_CTX_set1_chain_cert_store(ctx,st) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CHAIN_CERT_STORE,1,(char *)(st)) --# define SSL_set0_chain(s,sk) \ -- SSL_ctrl(s,SSL_CTRL_CHAIN,0,(char *)(sk)) --# define SSL_set1_chain(s,sk) \ -- SSL_ctrl(s,SSL_CTRL_CHAIN,1,(char *)(sk)) --# define SSL_add0_chain_cert(s,x509) \ -- SSL_ctrl(s,SSL_CTRL_CHAIN_CERT,0,(char *)(x509)) --# define SSL_add1_chain_cert(s,x509) \ -- SSL_ctrl(s,SSL_CTRL_CHAIN_CERT,1,(char *)(x509)) --# define SSL_get0_chain_certs(s,px509) \ -- SSL_ctrl(s,SSL_CTRL_GET_CHAIN_CERTS,0,px509) --# define SSL_clear_chain_certs(s) \ -- SSL_set0_chain(s,NULL) --# define SSL_build_cert_chain(s, flags) \ -- SSL_ctrl(s,SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL) --# define SSL_select_current_cert(s,x509) \ -- SSL_ctrl(s,SSL_CTRL_SELECT_CURRENT_CERT,0,(char *)(x509)) --# define SSL_set_current_cert(s,op) \ -- SSL_ctrl(s,SSL_CTRL_SET_CURRENT_CERT, op, NULL) --# define SSL_set0_verify_cert_store(s,st) \ -- SSL_ctrl(s,SSL_CTRL_SET_VERIFY_CERT_STORE,0,(char *)(st)) --# define SSL_set1_verify_cert_store(s,st) \ -- SSL_ctrl(s,SSL_CTRL_SET_VERIFY_CERT_STORE,1,(char *)(st)) --# define SSL_set0_chain_cert_store(s,st) \ -- SSL_ctrl(s,SSL_CTRL_SET_CHAIN_CERT_STORE,0,(char *)(st)) --# define SSL_set1_chain_cert_store(s,st) \ -- SSL_ctrl(s,SSL_CTRL_SET_CHAIN_CERT_STORE,1,(char *)(st)) --# define SSL_get1_groups(s, glist) \ -- SSL_ctrl(s,SSL_CTRL_GET_GROUPS,0,(int*)(glist)) --# define SSL_CTX_set1_groups(ctx, glist, glistlen) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_GROUPS,glistlen,(int *)(glist)) --# define SSL_CTX_set1_groups_list(ctx, s) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_GROUPS_LIST,0,(char *)(s)) --# define SSL_set1_groups(s, glist, glistlen) \ -- SSL_ctrl(s,SSL_CTRL_SET_GROUPS,glistlen,(char *)(glist)) --# define SSL_set1_groups_list(s, str) \ -- SSL_ctrl(s,SSL_CTRL_SET_GROUPS_LIST,0,(char *)(str)) --# define SSL_get_shared_group(s, n) \ -- SSL_ctrl(s,SSL_CTRL_GET_SHARED_GROUP,n,NULL) --# define SSL_CTX_set1_sigalgs(ctx, slist, slistlen) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SIGALGS,slistlen,(int *)(slist)) --# define SSL_CTX_set1_sigalgs_list(ctx, s) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SIGALGS_LIST,0,(char *)(s)) --# define SSL_set1_sigalgs(s, slist, slistlen) \ -- SSL_ctrl(s,SSL_CTRL_SET_SIGALGS,slistlen,(int *)(slist)) --# define SSL_set1_sigalgs_list(s, str) \ -- SSL_ctrl(s,SSL_CTRL_SET_SIGALGS_LIST,0,(char *)(str)) --# define SSL_CTX_set1_client_sigalgs(ctx, slist, slistlen) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS,slistlen,(int *)(slist)) --# define SSL_CTX_set1_client_sigalgs_list(ctx, s) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS_LIST,0,(char *)(s)) --# define SSL_set1_client_sigalgs(s, slist, slistlen) \ -- SSL_ctrl(s,SSL_CTRL_SET_CLIENT_SIGALGS,slistlen,(int *)(slist)) --# define SSL_set1_client_sigalgs_list(s, str) \ -- SSL_ctrl(s,SSL_CTRL_SET_CLIENT_SIGALGS_LIST,0,(char *)(str)) --# define SSL_get0_certificate_types(s, clist) \ -- SSL_ctrl(s, SSL_CTRL_GET_CLIENT_CERT_TYPES, 0, (char *)(clist)) --# define SSL_CTX_set1_client_certificate_types(ctx, clist, clistlen) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_CERT_TYPES,clistlen, \ -- (char *)(clist)) --# define SSL_set1_client_certificate_types(s, clist, clistlen) \ -- SSL_ctrl(s,SSL_CTRL_SET_CLIENT_CERT_TYPES,clistlen,(char *)(clist)) --# define SSL_get_signature_nid(s, pn) \ -- SSL_ctrl(s,SSL_CTRL_GET_SIGNATURE_NID,0,pn) --# define SSL_get_peer_signature_nid(s, pn) \ -- SSL_ctrl(s,SSL_CTRL_GET_PEER_SIGNATURE_NID,0,pn) --# define SSL_get_peer_tmp_key(s, pk) \ -- SSL_ctrl(s,SSL_CTRL_GET_PEER_TMP_KEY,0,pk) --# define SSL_get_tmp_key(s, pk) \ -- SSL_ctrl(s,SSL_CTRL_GET_TMP_KEY,0,pk) --# define SSL_get0_raw_cipherlist(s, plst) \ -- SSL_ctrl(s,SSL_CTRL_GET_RAW_CIPHERLIST,0,plst) --# define SSL_get0_ec_point_formats(s, plst) \ -- SSL_ctrl(s,SSL_CTRL_GET_EC_POINT_FORMATS,0,plst) --# define SSL_CTX_set_min_proto_version(ctx, version) \ -- SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MIN_PROTO_VERSION, version, NULL) --# define SSL_CTX_set_max_proto_version(ctx, version) \ -- SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_PROTO_VERSION, version, NULL) --# define SSL_CTX_get_min_proto_version(ctx) \ -- SSL_CTX_ctrl(ctx, SSL_CTRL_GET_MIN_PROTO_VERSION, 0, NULL) --# define SSL_CTX_get_max_proto_version(ctx) \ -- SSL_CTX_ctrl(ctx, SSL_CTRL_GET_MAX_PROTO_VERSION, 0, NULL) --# define SSL_set_min_proto_version(s, version) \ -- SSL_ctrl(s, SSL_CTRL_SET_MIN_PROTO_VERSION, version, NULL) --# define SSL_set_max_proto_version(s, version) \ -- SSL_ctrl(s, SSL_CTRL_SET_MAX_PROTO_VERSION, version, NULL) --# define SSL_get_min_proto_version(s) \ -- SSL_ctrl(s, SSL_CTRL_GET_MIN_PROTO_VERSION, 0, NULL) --# define SSL_get_max_proto_version(s) \ -- SSL_ctrl(s, SSL_CTRL_GET_MAX_PROTO_VERSION, 0, NULL) -- --/* Backwards compatibility, original 1.1.0 names */ --# define SSL_CTRL_GET_SERVER_TMP_KEY \ -- SSL_CTRL_GET_PEER_TMP_KEY --# define SSL_get_server_tmp_key(s, pk) \ -- SSL_get_peer_tmp_key(s, pk) -- --/* -- * The following symbol names are old and obsolete. They are kept -- * for compatibility reasons only and should not be used anymore. -- */ --# define SSL_CTRL_GET_CURVES SSL_CTRL_GET_GROUPS --# define SSL_CTRL_SET_CURVES SSL_CTRL_SET_GROUPS --# define SSL_CTRL_SET_CURVES_LIST SSL_CTRL_SET_GROUPS_LIST --# define SSL_CTRL_GET_SHARED_CURVE SSL_CTRL_GET_SHARED_GROUP -- --# define SSL_get1_curves SSL_get1_groups --# define SSL_CTX_set1_curves SSL_CTX_set1_groups --# define SSL_CTX_set1_curves_list SSL_CTX_set1_groups_list --# define SSL_set1_curves SSL_set1_groups --# define SSL_set1_curves_list SSL_set1_groups_list --# define SSL_get_shared_curve SSL_get_shared_group -- -- --# if OPENSSL_API_COMPAT < 0x10100000L --/* Provide some compatibility macros for removed functionality. */ --# define SSL_CTX_need_tmp_RSA(ctx) 0 --# define SSL_CTX_set_tmp_rsa(ctx,rsa) 1 --# define SSL_need_tmp_RSA(ssl) 0 --# define SSL_set_tmp_rsa(ssl,rsa) 1 --# define SSL_CTX_set_ecdh_auto(dummy, onoff) ((onoff) != 0) --# define SSL_set_ecdh_auto(dummy, onoff) ((onoff) != 0) --/* -- * We "pretend" to call the callback to avoid warnings about unused static -- * functions. -- */ --# define SSL_CTX_set_tmp_rsa_callback(ctx, cb) while(0) (cb)(NULL, 0, 0) --# define SSL_set_tmp_rsa_callback(ssl, cb) while(0) (cb)(NULL, 0, 0) --# endif --__owur const BIO_METHOD *BIO_f_ssl(void); --__owur BIO *BIO_new_ssl(SSL_CTX *ctx, int client); --__owur BIO *BIO_new_ssl_connect(SSL_CTX *ctx); --__owur BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx); --__owur int BIO_ssl_copy_session_id(BIO *to, BIO *from); --void BIO_ssl_shutdown(BIO *ssl_bio); -- --__owur int SSL_CTX_set_cipher_list(SSL_CTX *, const char *str); --__owur SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth); --int SSL_CTX_up_ref(SSL_CTX *ctx); --void SSL_CTX_free(SSL_CTX *); --__owur long SSL_CTX_set_timeout(SSL_CTX *ctx, long t); --__owur long SSL_CTX_get_timeout(const SSL_CTX *ctx); --__owur X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *); --void SSL_CTX_set_cert_store(SSL_CTX *, X509_STORE *); --void SSL_CTX_set1_cert_store(SSL_CTX *, X509_STORE *); --__owur int SSL_want(const SSL *s); --__owur int SSL_clear(SSL *s); -- --void SSL_CTX_flush_sessions(SSL_CTX *ctx, long tm); -- --__owur const SSL_CIPHER *SSL_get_current_cipher(const SSL *s); --__owur const SSL_CIPHER *SSL_get_pending_cipher(const SSL *s); --__owur int SSL_CIPHER_get_bits(const SSL_CIPHER *c, int *alg_bits); --__owur const char *SSL_CIPHER_get_version(const SSL_CIPHER *c); --__owur const char *SSL_CIPHER_get_name(const SSL_CIPHER *c); --__owur const char *SSL_CIPHER_standard_name(const SSL_CIPHER *c); --__owur const char *OPENSSL_cipher_name(const char *rfc_name); --__owur uint32_t SSL_CIPHER_get_id(const SSL_CIPHER *c); --__owur uint16_t SSL_CIPHER_get_protocol_id(const SSL_CIPHER *c); --__owur int SSL_CIPHER_get_kx_nid(const SSL_CIPHER *c); --__owur int SSL_CIPHER_get_auth_nid(const SSL_CIPHER *c); --__owur const EVP_MD *SSL_CIPHER_get_handshake_digest(const SSL_CIPHER *c); --__owur int SSL_CIPHER_is_aead(const SSL_CIPHER *c); -- --__owur int SSL_get_fd(const SSL *s); --__owur int SSL_get_rfd(const SSL *s); --__owur int SSL_get_wfd(const SSL *s); --__owur const char *SSL_get_cipher_list(const SSL *s, int n); --__owur char *SSL_get_shared_ciphers(const SSL *s, char *buf, int size); --__owur int SSL_get_read_ahead(const SSL *s); --__owur int SSL_pending(const SSL *s); --__owur int SSL_has_pending(const SSL *s); --# ifndef OPENSSL_NO_SOCK --__owur int SSL_set_fd(SSL *s, int fd); --__owur int SSL_set_rfd(SSL *s, int fd); --__owur int SSL_set_wfd(SSL *s, int fd); --# endif --void SSL_set0_rbio(SSL *s, BIO *rbio); --void SSL_set0_wbio(SSL *s, BIO *wbio); --void SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio); --__owur BIO *SSL_get_rbio(const SSL *s); --__owur BIO *SSL_get_wbio(const SSL *s); --__owur int SSL_set_cipher_list(SSL *s, const char *str); --__owur int SSL_CTX_set_ciphersuites(SSL_CTX *ctx, const char *str); --__owur int SSL_set_ciphersuites(SSL *s, const char *str); --void SSL_set_read_ahead(SSL *s, int yes); --__owur int SSL_get_verify_mode(const SSL *s); --__owur int SSL_get_verify_depth(const SSL *s); --__owur SSL_verify_cb SSL_get_verify_callback(const SSL *s); --void SSL_set_verify(SSL *s, int mode, SSL_verify_cb callback); --void SSL_set_verify_depth(SSL *s, int depth); --void SSL_set_cert_cb(SSL *s, int (*cb) (SSL *ssl, void *arg), void *arg); --# ifndef OPENSSL_NO_RSA --__owur int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa); --__owur int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, const unsigned char *d, -- long len); --# endif --__owur int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey); --__owur int SSL_use_PrivateKey_ASN1(int pk, SSL *ssl, const unsigned char *d, -- long len); --__owur int SSL_use_certificate(SSL *ssl, X509 *x); --__owur int SSL_use_certificate_ASN1(SSL *ssl, const unsigned char *d, int len); --__owur int SSL_use_cert_and_key(SSL *ssl, X509 *x509, EVP_PKEY *privatekey, -- STACK_OF(X509) *chain, int override); -- -- --/* serverinfo file format versions */ --# define SSL_SERVERINFOV1 1 --# define SSL_SERVERINFOV2 2 -- --/* Set serverinfo data for the current active cert. */ --__owur int SSL_CTX_use_serverinfo(SSL_CTX *ctx, const unsigned char *serverinfo, -- size_t serverinfo_length); --__owur int SSL_CTX_use_serverinfo_ex(SSL_CTX *ctx, unsigned int version, -- const unsigned char *serverinfo, -- size_t serverinfo_length); --__owur int SSL_CTX_use_serverinfo_file(SSL_CTX *ctx, const char *file); -- --#ifndef OPENSSL_NO_RSA --__owur int SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type); --#endif -- --__owur int SSL_use_PrivateKey_file(SSL *ssl, const char *file, int type); --__owur int SSL_use_certificate_file(SSL *ssl, const char *file, int type); -- --#ifndef OPENSSL_NO_RSA --__owur int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file, -- int type); --#endif --__owur int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, -- int type); --__owur int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, -- int type); --/* PEM type */ --__owur int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file); --__owur int SSL_use_certificate_chain_file(SSL *ssl, const char *file); --__owur STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file); --__owur int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, -- const char *file); --int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, -- const char *dir); -- --# if OPENSSL_API_COMPAT < 0x10100000L --# define SSL_load_error_strings() \ -- OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS \ -- | OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL) --# endif -- --__owur const char *SSL_state_string(const SSL *s); --__owur const char *SSL_rstate_string(const SSL *s); --__owur const char *SSL_state_string_long(const SSL *s); --__owur const char *SSL_rstate_string_long(const SSL *s); --__owur long SSL_SESSION_get_time(const SSL_SESSION *s); --__owur long SSL_SESSION_set_time(SSL_SESSION *s, long t); --__owur long SSL_SESSION_get_timeout(const SSL_SESSION *s); --__owur long SSL_SESSION_set_timeout(SSL_SESSION *s, long t); --__owur int SSL_SESSION_get_protocol_version(const SSL_SESSION *s); --__owur int SSL_SESSION_set_protocol_version(SSL_SESSION *s, int version); -- --__owur const char *SSL_SESSION_get0_hostname(const SSL_SESSION *s); --__owur int SSL_SESSION_set1_hostname(SSL_SESSION *s, const char *hostname); --void SSL_SESSION_get0_alpn_selected(const SSL_SESSION *s, -- const unsigned char **alpn, -- size_t *len); --__owur int SSL_SESSION_set1_alpn_selected(SSL_SESSION *s, -- const unsigned char *alpn, -- size_t len); --__owur const SSL_CIPHER *SSL_SESSION_get0_cipher(const SSL_SESSION *s); --__owur int SSL_SESSION_set_cipher(SSL_SESSION *s, const SSL_CIPHER *cipher); --__owur int SSL_SESSION_has_ticket(const SSL_SESSION *s); --__owur unsigned long SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *s); --void SSL_SESSION_get0_ticket(const SSL_SESSION *s, const unsigned char **tick, -- size_t *len); --__owur uint32_t SSL_SESSION_get_max_early_data(const SSL_SESSION *s); --__owur int SSL_SESSION_set_max_early_data(SSL_SESSION *s, -- uint32_t max_early_data); --__owur int SSL_copy_session_id(SSL *to, const SSL *from); --__owur X509 *SSL_SESSION_get0_peer(SSL_SESSION *s); --__owur int SSL_SESSION_set1_id_context(SSL_SESSION *s, -- const unsigned char *sid_ctx, -- unsigned int sid_ctx_len); --__owur int SSL_SESSION_set1_id(SSL_SESSION *s, const unsigned char *sid, -- unsigned int sid_len); --__owur int SSL_SESSION_is_resumable(const SSL_SESSION *s); -- --__owur SSL_SESSION *SSL_SESSION_new(void); --__owur SSL_SESSION *SSL_SESSION_dup(SSL_SESSION *src); --const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s, -- unsigned int *len); --const unsigned char *SSL_SESSION_get0_id_context(const SSL_SESSION *s, -- unsigned int *len); --__owur unsigned int SSL_SESSION_get_compress_id(const SSL_SESSION *s); --# ifndef OPENSSL_NO_STDIO --int SSL_SESSION_print_fp(FILE *fp, const SSL_SESSION *ses); --# endif --int SSL_SESSION_print(BIO *fp, const SSL_SESSION *ses); --int SSL_SESSION_print_keylog(BIO *bp, const SSL_SESSION *x); --int SSL_SESSION_up_ref(SSL_SESSION *ses); --void SSL_SESSION_free(SSL_SESSION *ses); --__owur int i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp); --__owur int SSL_set_session(SSL *to, SSL_SESSION *session); --int SSL_CTX_add_session(SSL_CTX *ctx, SSL_SESSION *session); --int SSL_CTX_remove_session(SSL_CTX *ctx, SSL_SESSION *session); --__owur int SSL_CTX_set_generate_session_id(SSL_CTX *ctx, GEN_SESSION_CB cb); --__owur int SSL_set_generate_session_id(SSL *s, GEN_SESSION_CB cb); --__owur int SSL_has_matching_session_id(const SSL *s, -- const unsigned char *id, -- unsigned int id_len); --SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp, -- long length); -- --# ifdef HEADER_X509_H --__owur X509 *SSL_get_peer_certificate(const SSL *s); --# endif -- --__owur STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *s); -- --__owur int SSL_CTX_get_verify_mode(const SSL_CTX *ctx); --__owur int SSL_CTX_get_verify_depth(const SSL_CTX *ctx); --__owur SSL_verify_cb SSL_CTX_get_verify_callback(const SSL_CTX *ctx); --void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, SSL_verify_cb callback); --void SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth); --void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, -- int (*cb) (X509_STORE_CTX *, void *), -- void *arg); --void SSL_CTX_set_cert_cb(SSL_CTX *c, int (*cb) (SSL *ssl, void *arg), -- void *arg); --# ifndef OPENSSL_NO_RSA --__owur int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa); --__owur int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const unsigned char *d, -- long len); --# endif --__owur int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey); --__owur int SSL_CTX_use_PrivateKey_ASN1(int pk, SSL_CTX *ctx, -- const unsigned char *d, long len); --__owur int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x); --__owur int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, -- const unsigned char *d); --__owur int SSL_CTX_use_cert_and_key(SSL_CTX *ctx, X509 *x509, EVP_PKEY *privatekey, -- STACK_OF(X509) *chain, int override); -- --void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb); --void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u); --pem_password_cb *SSL_CTX_get_default_passwd_cb(SSL_CTX *ctx); --void *SSL_CTX_get_default_passwd_cb_userdata(SSL_CTX *ctx); --void SSL_set_default_passwd_cb(SSL *s, pem_password_cb *cb); --void SSL_set_default_passwd_cb_userdata(SSL *s, void *u); --pem_password_cb *SSL_get_default_passwd_cb(SSL *s); --void *SSL_get_default_passwd_cb_userdata(SSL *s); -- --__owur int SSL_CTX_check_private_key(const SSL_CTX *ctx); --__owur int SSL_check_private_key(const SSL *ctx); -- --__owur int SSL_CTX_set_session_id_context(SSL_CTX *ctx, -- const unsigned char *sid_ctx, -- unsigned int sid_ctx_len); -- --SSL *SSL_new(SSL_CTX *ctx); --int SSL_up_ref(SSL *s); --int SSL_is_dtls(const SSL *s); --__owur int SSL_set_session_id_context(SSL *ssl, const unsigned char *sid_ctx, -- unsigned int sid_ctx_len); -- --__owur int SSL_CTX_set_purpose(SSL_CTX *ctx, int purpose); --__owur int SSL_set_purpose(SSL *ssl, int purpose); --__owur int SSL_CTX_set_trust(SSL_CTX *ctx, int trust); --__owur int SSL_set_trust(SSL *ssl, int trust); -- --__owur int SSL_set1_host(SSL *s, const char *hostname); --__owur int SSL_add1_host(SSL *s, const char *hostname); --__owur const char *SSL_get0_peername(SSL *s); --void SSL_set_hostflags(SSL *s, unsigned int flags); -- --__owur int SSL_CTX_dane_enable(SSL_CTX *ctx); --__owur int SSL_CTX_dane_mtype_set(SSL_CTX *ctx, const EVP_MD *md, -- uint8_t mtype, uint8_t ord); --__owur int SSL_dane_enable(SSL *s, const char *basedomain); --__owur int SSL_dane_tlsa_add(SSL *s, uint8_t usage, uint8_t selector, -- uint8_t mtype, unsigned const char *data, size_t dlen); --__owur int SSL_get0_dane_authority(SSL *s, X509 **mcert, EVP_PKEY **mspki); --__owur int SSL_get0_dane_tlsa(SSL *s, uint8_t *usage, uint8_t *selector, -- uint8_t *mtype, unsigned const char **data, -- size_t *dlen); --/* -- * Bridge opacity barrier between libcrypt and libssl, also needed to support -- * offline testing in test/danetest.c -- */ --SSL_DANE *SSL_get0_dane(SSL *ssl); --/* -- * DANE flags -- */ --unsigned long SSL_CTX_dane_set_flags(SSL_CTX *ctx, unsigned long flags); --unsigned long SSL_CTX_dane_clear_flags(SSL_CTX *ctx, unsigned long flags); --unsigned long SSL_dane_set_flags(SSL *ssl, unsigned long flags); --unsigned long SSL_dane_clear_flags(SSL *ssl, unsigned long flags); -- --__owur int SSL_CTX_set1_param(SSL_CTX *ctx, X509_VERIFY_PARAM *vpm); --__owur int SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm); -- --__owur X509_VERIFY_PARAM *SSL_CTX_get0_param(SSL_CTX *ctx); --__owur X509_VERIFY_PARAM *SSL_get0_param(SSL *ssl); -- --# ifndef OPENSSL_NO_SRP --int SSL_CTX_set_srp_username(SSL_CTX *ctx, char *name); --int SSL_CTX_set_srp_password(SSL_CTX *ctx, char *password); --int SSL_CTX_set_srp_strength(SSL_CTX *ctx, int strength); --int SSL_CTX_set_srp_client_pwd_callback(SSL_CTX *ctx, -- char *(*cb) (SSL *, void *)); --int SSL_CTX_set_srp_verify_param_callback(SSL_CTX *ctx, -- int (*cb) (SSL *, void *)); --int SSL_CTX_set_srp_username_callback(SSL_CTX *ctx, -- int (*cb) (SSL *, int *, void *)); --int SSL_CTX_set_srp_cb_arg(SSL_CTX *ctx, void *arg); -- --int SSL_set_srp_server_param(SSL *s, const BIGNUM *N, const BIGNUM *g, -- BIGNUM *sa, BIGNUM *v, char *info); --int SSL_set_srp_server_param_pw(SSL *s, const char *user, const char *pass, -- const char *grp); -- --__owur BIGNUM *SSL_get_srp_g(SSL *s); --__owur BIGNUM *SSL_get_srp_N(SSL *s); -- --__owur char *SSL_get_srp_username(SSL *s); --__owur char *SSL_get_srp_userinfo(SSL *s); --# endif -- --/* -- * ClientHello callback and helpers. -- */ -- --# define SSL_CLIENT_HELLO_SUCCESS 1 --# define SSL_CLIENT_HELLO_ERROR 0 --# define SSL_CLIENT_HELLO_RETRY (-1) -- --typedef int (*SSL_client_hello_cb_fn) (SSL *s, int *al, void *arg); --void SSL_CTX_set_client_hello_cb(SSL_CTX *c, SSL_client_hello_cb_fn cb, -- void *arg); --int SSL_client_hello_isv2(SSL *s); --unsigned int SSL_client_hello_get0_legacy_version(SSL *s); --size_t SSL_client_hello_get0_random(SSL *s, const unsigned char **out); --size_t SSL_client_hello_get0_session_id(SSL *s, const unsigned char **out); --size_t SSL_client_hello_get0_ciphers(SSL *s, const unsigned char **out); --size_t SSL_client_hello_get0_compression_methods(SSL *s, -- const unsigned char **out); --int SSL_client_hello_get1_extensions_present(SSL *s, int **out, size_t *outlen); --int SSL_client_hello_get0_ext(SSL *s, unsigned int type, -- const unsigned char **out, size_t *outlen); -- --void SSL_certs_clear(SSL *s); --void SSL_free(SSL *ssl); --# ifdef OSSL_ASYNC_FD --/* -- * Windows application developer has to include windows.h to use these. -- */ --__owur int SSL_waiting_for_async(SSL *s); --__owur int SSL_get_all_async_fds(SSL *s, OSSL_ASYNC_FD *fds, size_t *numfds); --__owur int SSL_get_changed_async_fds(SSL *s, OSSL_ASYNC_FD *addfd, -- size_t *numaddfds, OSSL_ASYNC_FD *delfd, -- size_t *numdelfds); --# endif --__owur int SSL_accept(SSL *ssl); --__owur int SSL_stateless(SSL *s); --__owur int SSL_connect(SSL *ssl); --__owur int SSL_read(SSL *ssl, void *buf, int num); --__owur int SSL_read_ex(SSL *ssl, void *buf, size_t num, size_t *readbytes); -- --# define SSL_READ_EARLY_DATA_ERROR 0 --# define SSL_READ_EARLY_DATA_SUCCESS 1 --# define SSL_READ_EARLY_DATA_FINISH 2 -- --__owur int SSL_read_early_data(SSL *s, void *buf, size_t num, -- size_t *readbytes); --__owur int SSL_peek(SSL *ssl, void *buf, int num); --__owur int SSL_peek_ex(SSL *ssl, void *buf, size_t num, size_t *readbytes); --__owur int SSL_write(SSL *ssl, const void *buf, int num); --__owur int SSL_write_ex(SSL *s, const void *buf, size_t num, size_t *written); --__owur int SSL_write_early_data(SSL *s, const void *buf, size_t num, -- size_t *written); --long SSL_ctrl(SSL *ssl, int cmd, long larg, void *parg); --long SSL_callback_ctrl(SSL *, int, void (*)(void)); --long SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg); --long SSL_CTX_callback_ctrl(SSL_CTX *, int, void (*)(void)); -- --# define SSL_EARLY_DATA_NOT_SENT 0 --# define SSL_EARLY_DATA_REJECTED 1 --# define SSL_EARLY_DATA_ACCEPTED 2 -- --__owur int SSL_get_early_data_status(const SSL *s); -- --__owur int SSL_get_error(const SSL *s, int ret_code); --__owur const char *SSL_get_version(const SSL *s); -- --/* This sets the 'default' SSL version that SSL_new() will create */ --__owur int SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth); -- --# ifndef OPENSSL_NO_SSL3_METHOD --DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *SSLv3_method(void)) /* SSLv3 */ --DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *SSLv3_server_method(void)) --DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *SSLv3_client_method(void)) --# endif -- --#define SSLv23_method TLS_method --#define SSLv23_server_method TLS_server_method --#define SSLv23_client_method TLS_client_method -- --/* Negotiate highest available SSL/TLS version */ --__owur const SSL_METHOD *TLS_method(void); --__owur const SSL_METHOD *TLS_server_method(void); --__owur const SSL_METHOD *TLS_client_method(void); -- --# ifndef OPENSSL_NO_TLS1_METHOD --DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_method(void)) /* TLSv1.0 */ --DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_server_method(void)) --DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_client_method(void)) --# endif -- --# ifndef OPENSSL_NO_TLS1_1_METHOD --DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_1_method(void)) /* TLSv1.1 */ --DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_1_server_method(void)) --DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_1_client_method(void)) --# endif -- --# ifndef OPENSSL_NO_TLS1_2_METHOD --DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_2_method(void)) /* TLSv1.2 */ --DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_2_server_method(void)) --DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_2_client_method(void)) --# endif -- --# ifndef OPENSSL_NO_DTLS1_METHOD --DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *DTLSv1_method(void)) /* DTLSv1.0 */ --DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *DTLSv1_server_method(void)) --DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *DTLSv1_client_method(void)) --# endif -- --# ifndef OPENSSL_NO_DTLS1_2_METHOD --/* DTLSv1.2 */ --DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *DTLSv1_2_method(void)) --DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *DTLSv1_2_server_method(void)) --DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *DTLSv1_2_client_method(void)) --# endif -- --__owur const SSL_METHOD *DTLS_method(void); /* DTLS 1.0 and 1.2 */ --__owur const SSL_METHOD *DTLS_server_method(void); /* DTLS 1.0 and 1.2 */ --__owur const SSL_METHOD *DTLS_client_method(void); /* DTLS 1.0 and 1.2 */ -- --__owur size_t DTLS_get_data_mtu(const SSL *s); -- --__owur STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL *s); --__owur STACK_OF(SSL_CIPHER) *SSL_CTX_get_ciphers(const SSL_CTX *ctx); --__owur STACK_OF(SSL_CIPHER) *SSL_get_client_ciphers(const SSL *s); --__owur STACK_OF(SSL_CIPHER) *SSL_get1_supported_ciphers(SSL *s); -- --__owur int SSL_do_handshake(SSL *s); --int SSL_key_update(SSL *s, int updatetype); --int SSL_get_key_update_type(const SSL *s); --int SSL_renegotiate(SSL *s); --int SSL_renegotiate_abbreviated(SSL *s); --__owur int SSL_renegotiate_pending(const SSL *s); --int SSL_shutdown(SSL *s); --__owur int SSL_verify_client_post_handshake(SSL *s); --void SSL_CTX_set_post_handshake_auth(SSL_CTX *ctx, int val); --void SSL_set_post_handshake_auth(SSL *s, int val); -- --__owur const SSL_METHOD *SSL_CTX_get_ssl_method(const SSL_CTX *ctx); --__owur const SSL_METHOD *SSL_get_ssl_method(const SSL *s); --__owur int SSL_set_ssl_method(SSL *s, const SSL_METHOD *method); --__owur const char *SSL_alert_type_string_long(int value); --__owur const char *SSL_alert_type_string(int value); --__owur const char *SSL_alert_desc_string_long(int value); --__owur const char *SSL_alert_desc_string(int value); -- --void SSL_set0_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list); --void SSL_CTX_set0_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list); --__owur const STACK_OF(X509_NAME) *SSL_get0_CA_list(const SSL *s); --__owur const STACK_OF(X509_NAME) *SSL_CTX_get0_CA_list(const SSL_CTX *ctx); --__owur int SSL_add1_to_CA_list(SSL *ssl, const X509 *x); --__owur int SSL_CTX_add1_to_CA_list(SSL_CTX *ctx, const X509 *x); --__owur const STACK_OF(X509_NAME) *SSL_get0_peer_CA_list(const SSL *s); -- --void SSL_set_client_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list); --void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list); --__owur STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *s); --__owur STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *s); --__owur int SSL_add_client_CA(SSL *ssl, X509 *x); --__owur int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x); -- --void SSL_set_connect_state(SSL *s); --void SSL_set_accept_state(SSL *s); -- --__owur long SSL_get_default_timeout(const SSL *s); -- --# if OPENSSL_API_COMPAT < 0x10100000L --# define SSL_library_init() OPENSSL_init_ssl(0, NULL) --# endif -- --__owur char *SSL_CIPHER_description(const SSL_CIPHER *, char *buf, int size); --__owur STACK_OF(X509_NAME) *SSL_dup_CA_list(const STACK_OF(X509_NAME) *sk); -- --__owur SSL *SSL_dup(SSL *ssl); -- --__owur X509 *SSL_get_certificate(const SSL *ssl); --/* -- * EVP_PKEY -- */ --struct evp_pkey_st *SSL_get_privatekey(const SSL *ssl); -- --__owur X509 *SSL_CTX_get0_certificate(const SSL_CTX *ctx); --__owur EVP_PKEY *SSL_CTX_get0_privatekey(const SSL_CTX *ctx); -- --void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx, int mode); --__owur int SSL_CTX_get_quiet_shutdown(const SSL_CTX *ctx); --void SSL_set_quiet_shutdown(SSL *ssl, int mode); --__owur int SSL_get_quiet_shutdown(const SSL *ssl); --void SSL_set_shutdown(SSL *ssl, int mode); --__owur int SSL_get_shutdown(const SSL *ssl); --__owur int SSL_version(const SSL *ssl); --__owur int SSL_client_version(const SSL *s); --__owur int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx); --__owur int SSL_CTX_set_default_verify_dir(SSL_CTX *ctx); --__owur int SSL_CTX_set_default_verify_file(SSL_CTX *ctx); --__owur int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, -- const char *CApath); --# define SSL_get0_session SSL_get_session/* just peek at pointer */ --__owur SSL_SESSION *SSL_get_session(const SSL *ssl); --__owur SSL_SESSION *SSL_get1_session(SSL *ssl); /* obtain a reference count */ --__owur SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl); --SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX *ctx); --void SSL_set_info_callback(SSL *ssl, -- void (*cb) (const SSL *ssl, int type, int val)); --void (*SSL_get_info_callback(const SSL *ssl)) (const SSL *ssl, int type, -- int val); --__owur OSSL_HANDSHAKE_STATE SSL_get_state(const SSL *ssl); -- --void SSL_set_verify_result(SSL *ssl, long v); --__owur long SSL_get_verify_result(const SSL *ssl); --__owur STACK_OF(X509) *SSL_get0_verified_chain(const SSL *s); -- --__owur size_t SSL_get_client_random(const SSL *ssl, unsigned char *out, -- size_t outlen); --__owur size_t SSL_get_server_random(const SSL *ssl, unsigned char *out, -- size_t outlen); --__owur size_t SSL_SESSION_get_master_key(const SSL_SESSION *sess, -- unsigned char *out, size_t outlen); --__owur int SSL_SESSION_set1_master_key(SSL_SESSION *sess, -- const unsigned char *in, size_t len); --uint8_t SSL_SESSION_get_max_fragment_length(const SSL_SESSION *sess); -- --#define SSL_get_ex_new_index(l, p, newf, dupf, freef) \ -- CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL, l, p, newf, dupf, freef) --__owur int SSL_set_ex_data(SSL *ssl, int idx, void *data); --void *SSL_get_ex_data(const SSL *ssl, int idx); --#define SSL_SESSION_get_ex_new_index(l, p, newf, dupf, freef) \ -- CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_SESSION, l, p, newf, dupf, freef) --__owur int SSL_SESSION_set_ex_data(SSL_SESSION *ss, int idx, void *data); --void *SSL_SESSION_get_ex_data(const SSL_SESSION *ss, int idx); --#define SSL_CTX_get_ex_new_index(l, p, newf, dupf, freef) \ -- CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_CTX, l, p, newf, dupf, freef) --__owur int SSL_CTX_set_ex_data(SSL_CTX *ssl, int idx, void *data); --void *SSL_CTX_get_ex_data(const SSL_CTX *ssl, int idx); -- --__owur int SSL_get_ex_data_X509_STORE_CTX_idx(void); -- --# define SSL_CTX_sess_set_cache_size(ctx,t) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_SIZE,t,NULL) --# define SSL_CTX_sess_get_cache_size(ctx) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_SIZE,0,NULL) --# define SSL_CTX_set_session_cache_mode(ctx,m) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_MODE,m,NULL) --# define SSL_CTX_get_session_cache_mode(ctx) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_MODE,0,NULL) -- --# define SSL_CTX_get_default_read_ahead(ctx) SSL_CTX_get_read_ahead(ctx) --# define SSL_CTX_set_default_read_ahead(ctx,m) SSL_CTX_set_read_ahead(ctx,m) --# define SSL_CTX_get_read_ahead(ctx) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_GET_READ_AHEAD,0,NULL) --# define SSL_CTX_set_read_ahead(ctx,m) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_READ_AHEAD,m,NULL) --# define SSL_CTX_get_max_cert_list(ctx) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL) --# define SSL_CTX_set_max_cert_list(ctx,m) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL) --# define SSL_get_max_cert_list(ssl) \ -- SSL_ctrl(ssl,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL) --# define SSL_set_max_cert_list(ssl,m) \ -- SSL_ctrl(ssl,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL) -- --# define SSL_CTX_set_max_send_fragment(ctx,m) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_SEND_FRAGMENT,m,NULL) --# define SSL_set_max_send_fragment(ssl,m) \ -- SSL_ctrl(ssl,SSL_CTRL_SET_MAX_SEND_FRAGMENT,m,NULL) --# define SSL_CTX_set_split_send_fragment(ctx,m) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SPLIT_SEND_FRAGMENT,m,NULL) --# define SSL_set_split_send_fragment(ssl,m) \ -- SSL_ctrl(ssl,SSL_CTRL_SET_SPLIT_SEND_FRAGMENT,m,NULL) --# define SSL_CTX_set_max_pipelines(ctx,m) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_PIPELINES,m,NULL) --# define SSL_set_max_pipelines(ssl,m) \ -- SSL_ctrl(ssl,SSL_CTRL_SET_MAX_PIPELINES,m,NULL) -- --void SSL_CTX_set_default_read_buffer_len(SSL_CTX *ctx, size_t len); --void SSL_set_default_read_buffer_len(SSL *s, size_t len); -- --# ifndef OPENSSL_NO_DH --/* NB: the |keylength| is only applicable when is_export is true */ --void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx, -- DH *(*dh) (SSL *ssl, int is_export, -- int keylength)); --void SSL_set_tmp_dh_callback(SSL *ssl, -- DH *(*dh) (SSL *ssl, int is_export, -- int keylength)); --# endif -- --__owur const COMP_METHOD *SSL_get_current_compression(const SSL *s); --__owur const COMP_METHOD *SSL_get_current_expansion(const SSL *s); --__owur const char *SSL_COMP_get_name(const COMP_METHOD *comp); --__owur const char *SSL_COMP_get0_name(const SSL_COMP *comp); --__owur int SSL_COMP_get_id(const SSL_COMP *comp); --STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void); --__owur STACK_OF(SSL_COMP) *SSL_COMP_set0_compression_methods(STACK_OF(SSL_COMP) -- *meths); --# if OPENSSL_API_COMPAT < 0x10100000L --# define SSL_COMP_free_compression_methods() while(0) continue --# endif --__owur int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm); -- --const SSL_CIPHER *SSL_CIPHER_find(SSL *ssl, const unsigned char *ptr); --int SSL_CIPHER_get_cipher_nid(const SSL_CIPHER *c); --int SSL_CIPHER_get_digest_nid(const SSL_CIPHER *c); --int SSL_bytes_to_cipher_list(SSL *s, const unsigned char *bytes, size_t len, -- int isv2format, STACK_OF(SSL_CIPHER) **sk, -- STACK_OF(SSL_CIPHER) **scsvs); -- --/* TLS extensions functions */ --__owur int SSL_set_session_ticket_ext(SSL *s, void *ext_data, int ext_len); -- --__owur int SSL_set_session_ticket_ext_cb(SSL *s, -- tls_session_ticket_ext_cb_fn cb, -- void *arg); -- --/* Pre-shared secret session resumption functions */ --__owur int SSL_set_session_secret_cb(SSL *s, -- tls_session_secret_cb_fn session_secret_cb, -- void *arg); -- --void SSL_CTX_set_not_resumable_session_callback(SSL_CTX *ctx, -- int (*cb) (SSL *ssl, -- int -- is_forward_secure)); -- --void SSL_set_not_resumable_session_callback(SSL *ssl, -- int (*cb) (SSL *ssl, -- int is_forward_secure)); -- --void SSL_CTX_set_record_padding_callback(SSL_CTX *ctx, -- size_t (*cb) (SSL *ssl, int type, -- size_t len, void *arg)); --void SSL_CTX_set_record_padding_callback_arg(SSL_CTX *ctx, void *arg); --void *SSL_CTX_get_record_padding_callback_arg(const SSL_CTX *ctx); --int SSL_CTX_set_block_padding(SSL_CTX *ctx, size_t block_size); -- --void SSL_set_record_padding_callback(SSL *ssl, -- size_t (*cb) (SSL *ssl, int type, -- size_t len, void *arg)); --void SSL_set_record_padding_callback_arg(SSL *ssl, void *arg); --void *SSL_get_record_padding_callback_arg(const SSL *ssl); --int SSL_set_block_padding(SSL *ssl, size_t block_size); -- --int SSL_set_num_tickets(SSL *s, size_t num_tickets); --size_t SSL_get_num_tickets(const SSL *s); --int SSL_CTX_set_num_tickets(SSL_CTX *ctx, size_t num_tickets); --size_t SSL_CTX_get_num_tickets(const SSL_CTX *ctx); -- --# if OPENSSL_API_COMPAT < 0x10100000L --# define SSL_cache_hit(s) SSL_session_reused(s) --# endif -- --__owur int SSL_session_reused(const SSL *s); --__owur int SSL_is_server(const SSL *s); -- --__owur __owur SSL_CONF_CTX *SSL_CONF_CTX_new(void); --int SSL_CONF_CTX_finish(SSL_CONF_CTX *cctx); --void SSL_CONF_CTX_free(SSL_CONF_CTX *cctx); --unsigned int SSL_CONF_CTX_set_flags(SSL_CONF_CTX *cctx, unsigned int flags); --__owur unsigned int SSL_CONF_CTX_clear_flags(SSL_CONF_CTX *cctx, -- unsigned int flags); --__owur int SSL_CONF_CTX_set1_prefix(SSL_CONF_CTX *cctx, const char *pre); -- --void SSL_CONF_CTX_set_ssl(SSL_CONF_CTX *cctx, SSL *ssl); --void SSL_CONF_CTX_set_ssl_ctx(SSL_CONF_CTX *cctx, SSL_CTX *ctx); -- --__owur int SSL_CONF_cmd(SSL_CONF_CTX *cctx, const char *cmd, const char *value); --__owur int SSL_CONF_cmd_argv(SSL_CONF_CTX *cctx, int *pargc, char ***pargv); --__owur int SSL_CONF_cmd_value_type(SSL_CONF_CTX *cctx, const char *cmd); -- --void SSL_add_ssl_module(void); --int SSL_config(SSL *s, const char *name); --int SSL_CTX_config(SSL_CTX *ctx, const char *name); -- --# ifndef OPENSSL_NO_SSL_TRACE --void SSL_trace(int write_p, int version, int content_type, -- const void *buf, size_t len, SSL *ssl, void *arg); --# endif -- --# ifndef OPENSSL_NO_SOCK --int DTLSv1_listen(SSL *s, BIO_ADDR *client); --# endif -- --# ifndef OPENSSL_NO_CT -- --/* -- * A callback for verifying that the received SCTs are sufficient. -- * Expected to return 1 if they are sufficient, otherwise 0. -- * May return a negative integer if an error occurs. -- * A connection should be aborted if the SCTs are deemed insufficient. -- */ --typedef int (*ssl_ct_validation_cb)(const CT_POLICY_EVAL_CTX *ctx, -- const STACK_OF(SCT) *scts, void *arg); -- --/* -- * Sets a |callback| that is invoked upon receipt of ServerHelloDone to validate -- * the received SCTs. -- * If the callback returns a non-positive result, the connection is terminated. -- * Call this function before beginning a handshake. -- * If a NULL |callback| is provided, SCT validation is disabled. -- * |arg| is arbitrary userdata that will be passed to the callback whenever it -- * is invoked. Ownership of |arg| remains with the caller. -- * -- * NOTE: A side-effect of setting a CT callback is that an OCSP stapled response -- * will be requested. -- */ --int SSL_set_ct_validation_callback(SSL *s, ssl_ct_validation_cb callback, -- void *arg); --int SSL_CTX_set_ct_validation_callback(SSL_CTX *ctx, -- ssl_ct_validation_cb callback, -- void *arg); --#define SSL_disable_ct(s) \ -- ((void) SSL_set_validation_callback((s), NULL, NULL)) --#define SSL_CTX_disable_ct(ctx) \ -- ((void) SSL_CTX_set_validation_callback((ctx), NULL, NULL)) -- --/* -- * The validation type enumerates the available behaviours of the built-in SSL -- * CT validation callback selected via SSL_enable_ct() and SSL_CTX_enable_ct(). -- * The underlying callback is a static function in libssl. -- */ --enum { -- SSL_CT_VALIDATION_PERMISSIVE = 0, -- SSL_CT_VALIDATION_STRICT --}; -- --/* -- * Enable CT by setting up a callback that implements one of the built-in -- * validation variants. The SSL_CT_VALIDATION_PERMISSIVE variant always -- * continues the handshake, the application can make appropriate decisions at -- * handshake completion. The SSL_CT_VALIDATION_STRICT variant requires at -- * least one valid SCT, or else handshake termination will be requested. The -- * handshake may continue anyway if SSL_VERIFY_NONE is in effect. -- */ --int SSL_enable_ct(SSL *s, int validation_mode); --int SSL_CTX_enable_ct(SSL_CTX *ctx, int validation_mode); -- --/* -- * Report whether a non-NULL callback is enabled. -- */ --int SSL_ct_is_enabled(const SSL *s); --int SSL_CTX_ct_is_enabled(const SSL_CTX *ctx); -- --/* Gets the SCTs received from a connection */ --const STACK_OF(SCT) *SSL_get0_peer_scts(SSL *s); -- --/* -- * Loads the CT log list from the default location. -- * If a CTLOG_STORE has previously been set using SSL_CTX_set_ctlog_store, -- * the log information loaded from this file will be appended to the -- * CTLOG_STORE. -- * Returns 1 on success, 0 otherwise. -- */ --int SSL_CTX_set_default_ctlog_list_file(SSL_CTX *ctx); -- --/* -- * Loads the CT log list from the specified file path. -- * If a CTLOG_STORE has previously been set using SSL_CTX_set_ctlog_store, -- * the log information loaded from this file will be appended to the -- * CTLOG_STORE. -- * Returns 1 on success, 0 otherwise. -- */ --int SSL_CTX_set_ctlog_list_file(SSL_CTX *ctx, const char *path); -- --/* -- * Sets the CT log list used by all SSL connections created from this SSL_CTX. -- * Ownership of the CTLOG_STORE is transferred to the SSL_CTX. -- */ --void SSL_CTX_set0_ctlog_store(SSL_CTX *ctx, CTLOG_STORE *logs); -- --/* -- * Gets the CT log list used by all SSL connections created from this SSL_CTX. -- * This will be NULL unless one of the following functions has been called: -- * - SSL_CTX_set_default_ctlog_list_file -- * - SSL_CTX_set_ctlog_list_file -- * - SSL_CTX_set_ctlog_store -- */ --const CTLOG_STORE *SSL_CTX_get0_ctlog_store(const SSL_CTX *ctx); -- --# endif /* OPENSSL_NO_CT */ -- --/* What the "other" parameter contains in security callback */ --/* Mask for type */ --# define SSL_SECOP_OTHER_TYPE 0xffff0000 --# define SSL_SECOP_OTHER_NONE 0 --# define SSL_SECOP_OTHER_CIPHER (1 << 16) --# define SSL_SECOP_OTHER_CURVE (2 << 16) --# define SSL_SECOP_OTHER_DH (3 << 16) --# define SSL_SECOP_OTHER_PKEY (4 << 16) --# define SSL_SECOP_OTHER_SIGALG (5 << 16) --# define SSL_SECOP_OTHER_CERT (6 << 16) -- --/* Indicated operation refers to peer key or certificate */ --# define SSL_SECOP_PEER 0x1000 -- --/* Values for "op" parameter in security callback */ -- --/* Called to filter ciphers */ --/* Ciphers client supports */ --# define SSL_SECOP_CIPHER_SUPPORTED (1 | SSL_SECOP_OTHER_CIPHER) --/* Cipher shared by client/server */ --# define SSL_SECOP_CIPHER_SHARED (2 | SSL_SECOP_OTHER_CIPHER) --/* Sanity check of cipher server selects */ --# define SSL_SECOP_CIPHER_CHECK (3 | SSL_SECOP_OTHER_CIPHER) --/* Curves supported by client */ --# define SSL_SECOP_CURVE_SUPPORTED (4 | SSL_SECOP_OTHER_CURVE) --/* Curves shared by client/server */ --# define SSL_SECOP_CURVE_SHARED (5 | SSL_SECOP_OTHER_CURVE) --/* Sanity check of curve server selects */ --# define SSL_SECOP_CURVE_CHECK (6 | SSL_SECOP_OTHER_CURVE) --/* Temporary DH key */ --# define SSL_SECOP_TMP_DH (7 | SSL_SECOP_OTHER_PKEY) --/* SSL/TLS version */ --# define SSL_SECOP_VERSION (9 | SSL_SECOP_OTHER_NONE) --/* Session tickets */ --# define SSL_SECOP_TICKET (10 | SSL_SECOP_OTHER_NONE) --/* Supported signature algorithms sent to peer */ --# define SSL_SECOP_SIGALG_SUPPORTED (11 | SSL_SECOP_OTHER_SIGALG) --/* Shared signature algorithm */ --# define SSL_SECOP_SIGALG_SHARED (12 | SSL_SECOP_OTHER_SIGALG) --/* Sanity check signature algorithm allowed */ --# define SSL_SECOP_SIGALG_CHECK (13 | SSL_SECOP_OTHER_SIGALG) --/* Used to get mask of supported public key signature algorithms */ --# define SSL_SECOP_SIGALG_MASK (14 | SSL_SECOP_OTHER_SIGALG) --/* Use to see if compression is allowed */ --# define SSL_SECOP_COMPRESSION (15 | SSL_SECOP_OTHER_NONE) --/* EE key in certificate */ --# define SSL_SECOP_EE_KEY (16 | SSL_SECOP_OTHER_CERT) --/* CA key in certificate */ --# define SSL_SECOP_CA_KEY (17 | SSL_SECOP_OTHER_CERT) --/* CA digest algorithm in certificate */ --# define SSL_SECOP_CA_MD (18 | SSL_SECOP_OTHER_CERT) --/* Peer EE key in certificate */ --# define SSL_SECOP_PEER_EE_KEY (SSL_SECOP_EE_KEY | SSL_SECOP_PEER) --/* Peer CA key in certificate */ --# define SSL_SECOP_PEER_CA_KEY (SSL_SECOP_CA_KEY | SSL_SECOP_PEER) --/* Peer CA digest algorithm in certificate */ --# define SSL_SECOP_PEER_CA_MD (SSL_SECOP_CA_MD | SSL_SECOP_PEER) -- --void SSL_set_security_level(SSL *s, int level); --__owur int SSL_get_security_level(const SSL *s); --void SSL_set_security_callback(SSL *s, -- int (*cb) (const SSL *s, const SSL_CTX *ctx, -- int op, int bits, int nid, -- void *other, void *ex)); --int (*SSL_get_security_callback(const SSL *s)) (const SSL *s, -- const SSL_CTX *ctx, int op, -- int bits, int nid, void *other, -- void *ex); --void SSL_set0_security_ex_data(SSL *s, void *ex); --__owur void *SSL_get0_security_ex_data(const SSL *s); -- --void SSL_CTX_set_security_level(SSL_CTX *ctx, int level); --__owur int SSL_CTX_get_security_level(const SSL_CTX *ctx); --void SSL_CTX_set_security_callback(SSL_CTX *ctx, -- int (*cb) (const SSL *s, const SSL_CTX *ctx, -- int op, int bits, int nid, -- void *other, void *ex)); --int (*SSL_CTX_get_security_callback(const SSL_CTX *ctx)) (const SSL *s, -- const SSL_CTX *ctx, -- int op, int bits, -- int nid, -- void *other, -- void *ex); --void SSL_CTX_set0_security_ex_data(SSL_CTX *ctx, void *ex); --__owur void *SSL_CTX_get0_security_ex_data(const SSL_CTX *ctx); -- --/* OPENSSL_INIT flag 0x010000 reserved for internal use */ --# define OPENSSL_INIT_NO_LOAD_SSL_STRINGS 0x00100000L --# define OPENSSL_INIT_LOAD_SSL_STRINGS 0x00200000L -- --# define OPENSSL_INIT_SSL_DEFAULT \ -- (OPENSSL_INIT_LOAD_SSL_STRINGS | OPENSSL_INIT_LOAD_CRYPTO_STRINGS) -- --int OPENSSL_init_ssl(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings); -- --# ifndef OPENSSL_NO_UNIT_TEST --__owur const struct openssl_ssl_test_functions *SSL_test_functions(void); --# endif -- --__owur int SSL_free_buffers(SSL *ssl); --__owur int SSL_alloc_buffers(SSL *ssl); -- --/* Status codes passed to the decrypt session ticket callback. Some of these -- * are for internal use only and are never passed to the callback. */ --typedef int SSL_TICKET_STATUS; -- --/* Support for ticket appdata */ --/* fatal error, malloc failure */ --# define SSL_TICKET_FATAL_ERR_MALLOC 0 --/* fatal error, either from parsing or decrypting the ticket */ --# define SSL_TICKET_FATAL_ERR_OTHER 1 --/* No ticket present */ --# define SSL_TICKET_NONE 2 --/* Empty ticket present */ --# define SSL_TICKET_EMPTY 3 --/* the ticket couldn't be decrypted */ --# define SSL_TICKET_NO_DECRYPT 4 --/* a ticket was successfully decrypted */ --# define SSL_TICKET_SUCCESS 5 --/* same as above but the ticket needs to be renewed */ --# define SSL_TICKET_SUCCESS_RENEW 6 -- --/* Return codes for the decrypt session ticket callback */ --typedef int SSL_TICKET_RETURN; -- --/* An error occurred */ --#define SSL_TICKET_RETURN_ABORT 0 --/* Do not use the ticket, do not send a renewed ticket to the client */ --#define SSL_TICKET_RETURN_IGNORE 1 --/* Do not use the ticket, send a renewed ticket to the client */ --#define SSL_TICKET_RETURN_IGNORE_RENEW 2 --/* Use the ticket, do not send a renewed ticket to the client */ --#define SSL_TICKET_RETURN_USE 3 --/* Use the ticket, send a renewed ticket to the client */ --#define SSL_TICKET_RETURN_USE_RENEW 4 -- --typedef int (*SSL_CTX_generate_session_ticket_fn)(SSL *s, void *arg); --typedef SSL_TICKET_RETURN (*SSL_CTX_decrypt_session_ticket_fn)(SSL *s, SSL_SESSION *ss, -- const unsigned char *keyname, -- size_t keyname_length, -- SSL_TICKET_STATUS status, -- void *arg); --int SSL_CTX_set_session_ticket_cb(SSL_CTX *ctx, -- SSL_CTX_generate_session_ticket_fn gen_cb, -- SSL_CTX_decrypt_session_ticket_fn dec_cb, -- void *arg); --int SSL_SESSION_set1_ticket_appdata(SSL_SESSION *ss, const void *data, size_t len); --int SSL_SESSION_get0_ticket_appdata(SSL_SESSION *ss, void **data, size_t *len); -- --extern const char SSL_version_str[]; -- --typedef unsigned int (*DTLS_timer_cb)(SSL *s, unsigned int timer_us); -- --void DTLS_set_timer_cb(SSL *s, DTLS_timer_cb cb); -- -- --typedef int (*SSL_allow_early_data_cb_fn)(SSL *s, void *arg); --void SSL_CTX_set_allow_early_data_cb(SSL_CTX *ctx, -- SSL_allow_early_data_cb_fn cb, -- void *arg); --void SSL_set_allow_early_data_cb(SSL *s, -- SSL_allow_early_data_cb_fn cb, -- void *arg); -- --# ifdef __cplusplus --} --# endif --#endif -diff --git a/uadk_tool/include/openssl/ssl2.h b/uadk_tool/include/openssl/ssl2.h -deleted file mode 100644 -index 5321bd2..0000000 ---- a/uadk_tool/include/openssl/ssl2.h -+++ /dev/null -@@ -1,24 +0,0 @@ --/* -- * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_SSL2_H --# define HEADER_SSL2_H -- --#ifdef __cplusplus --extern "C" { --#endif -- --# define SSL2_VERSION 0x0002 -- --# define SSL2_MT_CLIENT_HELLO 1 -- --#ifdef __cplusplus --} --#endif --#endif -diff --git a/uadk_tool/include/openssl/ssl3.h b/uadk_tool/include/openssl/ssl3.h -deleted file mode 100644 -index 07effba..0000000 ---- a/uadk_tool/include/openssl/ssl3.h -+++ /dev/null -@@ -1,342 +0,0 @@ --/* -- * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. -- * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_SSL3_H --# define HEADER_SSL3_H -- --# include --# include --# include --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --/* -- * Signalling cipher suite value from RFC 5746 -- * (TLS_EMPTY_RENEGOTIATION_INFO_SCSV) -- */ --# define SSL3_CK_SCSV 0x030000FF -- --/* -- * Signalling cipher suite value from draft-ietf-tls-downgrade-scsv-00 -- * (TLS_FALLBACK_SCSV) -- */ --# define SSL3_CK_FALLBACK_SCSV 0x03005600 -- --# define SSL3_CK_RSA_NULL_MD5 0x03000001 --# define SSL3_CK_RSA_NULL_SHA 0x03000002 --# define SSL3_CK_RSA_RC4_40_MD5 0x03000003 --# define SSL3_CK_RSA_RC4_128_MD5 0x03000004 --# define SSL3_CK_RSA_RC4_128_SHA 0x03000005 --# define SSL3_CK_RSA_RC2_40_MD5 0x03000006 --# define SSL3_CK_RSA_IDEA_128_SHA 0x03000007 --# define SSL3_CK_RSA_DES_40_CBC_SHA 0x03000008 --# define SSL3_CK_RSA_DES_64_CBC_SHA 0x03000009 --# define SSL3_CK_RSA_DES_192_CBC3_SHA 0x0300000A -- --# define SSL3_CK_DH_DSS_DES_40_CBC_SHA 0x0300000B --# define SSL3_CK_DH_DSS_DES_64_CBC_SHA 0x0300000C --# define SSL3_CK_DH_DSS_DES_192_CBC3_SHA 0x0300000D --# define SSL3_CK_DH_RSA_DES_40_CBC_SHA 0x0300000E --# define SSL3_CK_DH_RSA_DES_64_CBC_SHA 0x0300000F --# define SSL3_CK_DH_RSA_DES_192_CBC3_SHA 0x03000010 -- --# define SSL3_CK_DHE_DSS_DES_40_CBC_SHA 0x03000011 --# define SSL3_CK_EDH_DSS_DES_40_CBC_SHA SSL3_CK_DHE_DSS_DES_40_CBC_SHA --# define SSL3_CK_DHE_DSS_DES_64_CBC_SHA 0x03000012 --# define SSL3_CK_EDH_DSS_DES_64_CBC_SHA SSL3_CK_DHE_DSS_DES_64_CBC_SHA --# define SSL3_CK_DHE_DSS_DES_192_CBC3_SHA 0x03000013 --# define SSL3_CK_EDH_DSS_DES_192_CBC3_SHA SSL3_CK_DHE_DSS_DES_192_CBC3_SHA --# define SSL3_CK_DHE_RSA_DES_40_CBC_SHA 0x03000014 --# define SSL3_CK_EDH_RSA_DES_40_CBC_SHA SSL3_CK_DHE_RSA_DES_40_CBC_SHA --# define SSL3_CK_DHE_RSA_DES_64_CBC_SHA 0x03000015 --# define SSL3_CK_EDH_RSA_DES_64_CBC_SHA SSL3_CK_DHE_RSA_DES_64_CBC_SHA --# define SSL3_CK_DHE_RSA_DES_192_CBC3_SHA 0x03000016 --# define SSL3_CK_EDH_RSA_DES_192_CBC3_SHA SSL3_CK_DHE_RSA_DES_192_CBC3_SHA -- --# define SSL3_CK_ADH_RC4_40_MD5 0x03000017 --# define SSL3_CK_ADH_RC4_128_MD5 0x03000018 --# define SSL3_CK_ADH_DES_40_CBC_SHA 0x03000019 --# define SSL3_CK_ADH_DES_64_CBC_SHA 0x0300001A --# define SSL3_CK_ADH_DES_192_CBC_SHA 0x0300001B -- --/* a bundle of RFC standard cipher names, generated from ssl3_ciphers[] */ --# define SSL3_RFC_RSA_NULL_MD5 "TLS_RSA_WITH_NULL_MD5" --# define SSL3_RFC_RSA_NULL_SHA "TLS_RSA_WITH_NULL_SHA" --# define SSL3_RFC_RSA_DES_192_CBC3_SHA "TLS_RSA_WITH_3DES_EDE_CBC_SHA" --# define SSL3_RFC_DHE_DSS_DES_192_CBC3_SHA "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA" --# define SSL3_RFC_DHE_RSA_DES_192_CBC3_SHA "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA" --# define SSL3_RFC_ADH_DES_192_CBC_SHA "TLS_DH_anon_WITH_3DES_EDE_CBC_SHA" --# define SSL3_RFC_RSA_IDEA_128_SHA "TLS_RSA_WITH_IDEA_CBC_SHA" --# define SSL3_RFC_RSA_RC4_128_MD5 "TLS_RSA_WITH_RC4_128_MD5" --# define SSL3_RFC_RSA_RC4_128_SHA "TLS_RSA_WITH_RC4_128_SHA" --# define SSL3_RFC_ADH_RC4_128_MD5 "TLS_DH_anon_WITH_RC4_128_MD5" -- --# define SSL3_TXT_RSA_NULL_MD5 "NULL-MD5" --# define SSL3_TXT_RSA_NULL_SHA "NULL-SHA" --# define SSL3_TXT_RSA_RC4_40_MD5 "EXP-RC4-MD5" --# define SSL3_TXT_RSA_RC4_128_MD5 "RC4-MD5" --# define SSL3_TXT_RSA_RC4_128_SHA "RC4-SHA" --# define SSL3_TXT_RSA_RC2_40_MD5 "EXP-RC2-CBC-MD5" --# define SSL3_TXT_RSA_IDEA_128_SHA "IDEA-CBC-SHA" --# define SSL3_TXT_RSA_DES_40_CBC_SHA "EXP-DES-CBC-SHA" --# define SSL3_TXT_RSA_DES_64_CBC_SHA "DES-CBC-SHA" --# define SSL3_TXT_RSA_DES_192_CBC3_SHA "DES-CBC3-SHA" -- --# define SSL3_TXT_DH_DSS_DES_40_CBC_SHA "EXP-DH-DSS-DES-CBC-SHA" --# define SSL3_TXT_DH_DSS_DES_64_CBC_SHA "DH-DSS-DES-CBC-SHA" --# define SSL3_TXT_DH_DSS_DES_192_CBC3_SHA "DH-DSS-DES-CBC3-SHA" --# define SSL3_TXT_DH_RSA_DES_40_CBC_SHA "EXP-DH-RSA-DES-CBC-SHA" --# define SSL3_TXT_DH_RSA_DES_64_CBC_SHA "DH-RSA-DES-CBC-SHA" --# define SSL3_TXT_DH_RSA_DES_192_CBC3_SHA "DH-RSA-DES-CBC3-SHA" -- --# define SSL3_TXT_DHE_DSS_DES_40_CBC_SHA "EXP-DHE-DSS-DES-CBC-SHA" --# define SSL3_TXT_DHE_DSS_DES_64_CBC_SHA "DHE-DSS-DES-CBC-SHA" --# define SSL3_TXT_DHE_DSS_DES_192_CBC3_SHA "DHE-DSS-DES-CBC3-SHA" --# define SSL3_TXT_DHE_RSA_DES_40_CBC_SHA "EXP-DHE-RSA-DES-CBC-SHA" --# define SSL3_TXT_DHE_RSA_DES_64_CBC_SHA "DHE-RSA-DES-CBC-SHA" --# define SSL3_TXT_DHE_RSA_DES_192_CBC3_SHA "DHE-RSA-DES-CBC3-SHA" -- --/* -- * This next block of six "EDH" labels is for backward compatibility with -- * older versions of OpenSSL. New code should use the six "DHE" labels above -- * instead: -- */ --# define SSL3_TXT_EDH_DSS_DES_40_CBC_SHA "EXP-EDH-DSS-DES-CBC-SHA" --# define SSL3_TXT_EDH_DSS_DES_64_CBC_SHA "EDH-DSS-DES-CBC-SHA" --# define SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA "EDH-DSS-DES-CBC3-SHA" --# define SSL3_TXT_EDH_RSA_DES_40_CBC_SHA "EXP-EDH-RSA-DES-CBC-SHA" --# define SSL3_TXT_EDH_RSA_DES_64_CBC_SHA "EDH-RSA-DES-CBC-SHA" --# define SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA "EDH-RSA-DES-CBC3-SHA" -- --# define SSL3_TXT_ADH_RC4_40_MD5 "EXP-ADH-RC4-MD5" --# define SSL3_TXT_ADH_RC4_128_MD5 "ADH-RC4-MD5" --# define SSL3_TXT_ADH_DES_40_CBC_SHA "EXP-ADH-DES-CBC-SHA" --# define SSL3_TXT_ADH_DES_64_CBC_SHA "ADH-DES-CBC-SHA" --# define SSL3_TXT_ADH_DES_192_CBC_SHA "ADH-DES-CBC3-SHA" -- --# define SSL3_SSL_SESSION_ID_LENGTH 32 --# define SSL3_MAX_SSL_SESSION_ID_LENGTH 32 -- --# define SSL3_MASTER_SECRET_SIZE 48 --# define SSL3_RANDOM_SIZE 32 --# define SSL3_SESSION_ID_SIZE 32 --# define SSL3_RT_HEADER_LENGTH 5 -- --# define SSL3_HM_HEADER_LENGTH 4 -- --# ifndef SSL3_ALIGN_PAYLOAD -- /* -- * Some will argue that this increases memory footprint, but it's not -- * actually true. Point is that malloc has to return at least 64-bit aligned -- * pointers, meaning that allocating 5 bytes wastes 3 bytes in either case. -- * Suggested pre-gaping simply moves these wasted bytes from the end of -- * allocated region to its front, but makes data payload aligned, which -- * improves performance:-) -- */ --# define SSL3_ALIGN_PAYLOAD 8 --# else --# if (SSL3_ALIGN_PAYLOAD&(SSL3_ALIGN_PAYLOAD-1))!=0 --# error "insane SSL3_ALIGN_PAYLOAD" --# undef SSL3_ALIGN_PAYLOAD --# endif --# endif -- --/* -- * This is the maximum MAC (digest) size used by the SSL library. Currently -- * maximum of 20 is used by SHA1, but we reserve for future extension for -- * 512-bit hashes. -- */ -- --# define SSL3_RT_MAX_MD_SIZE 64 -- --/* -- * Maximum block size used in all ciphersuites. Currently 16 for AES. -- */ -- --# define SSL_RT_MAX_CIPHER_BLOCK_SIZE 16 -- --# define SSL3_RT_MAX_EXTRA (16384) -- --/* Maximum plaintext length: defined by SSL/TLS standards */ --# define SSL3_RT_MAX_PLAIN_LENGTH 16384 --/* Maximum compression overhead: defined by SSL/TLS standards */ --# define SSL3_RT_MAX_COMPRESSED_OVERHEAD 1024 -- --/* -- * The standards give a maximum encryption overhead of 1024 bytes. In -- * practice the value is lower than this. The overhead is the maximum number -- * of padding bytes (256) plus the mac size. -- */ --# define SSL3_RT_MAX_ENCRYPTED_OVERHEAD (256 + SSL3_RT_MAX_MD_SIZE) --# define SSL3_RT_MAX_TLS13_ENCRYPTED_OVERHEAD 256 -- --/* -- * OpenSSL currently only uses a padding length of at most one block so the -- * send overhead is smaller. -- */ -- --# define SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD \ -- (SSL_RT_MAX_CIPHER_BLOCK_SIZE + SSL3_RT_MAX_MD_SIZE) -- --/* If compression isn't used don't include the compression overhead */ -- --# ifdef OPENSSL_NO_COMP --# define SSL3_RT_MAX_COMPRESSED_LENGTH SSL3_RT_MAX_PLAIN_LENGTH --# else --# define SSL3_RT_MAX_COMPRESSED_LENGTH \ -- (SSL3_RT_MAX_PLAIN_LENGTH+SSL3_RT_MAX_COMPRESSED_OVERHEAD) --# endif --# define SSL3_RT_MAX_ENCRYPTED_LENGTH \ -- (SSL3_RT_MAX_ENCRYPTED_OVERHEAD+SSL3_RT_MAX_COMPRESSED_LENGTH) --# define SSL3_RT_MAX_TLS13_ENCRYPTED_LENGTH \ -- (SSL3_RT_MAX_PLAIN_LENGTH + SSL3_RT_MAX_TLS13_ENCRYPTED_OVERHEAD) --# define SSL3_RT_MAX_PACKET_SIZE \ -- (SSL3_RT_MAX_ENCRYPTED_LENGTH+SSL3_RT_HEADER_LENGTH) -- --# define SSL3_MD_CLIENT_FINISHED_CONST "\x43\x4C\x4E\x54" --# define SSL3_MD_SERVER_FINISHED_CONST "\x53\x52\x56\x52" -- --# define SSL3_VERSION 0x0300 --# define SSL3_VERSION_MAJOR 0x03 --# define SSL3_VERSION_MINOR 0x00 -- --# define SSL3_RT_CHANGE_CIPHER_SPEC 20 --# define SSL3_RT_ALERT 21 --# define SSL3_RT_HANDSHAKE 22 --# define SSL3_RT_APPLICATION_DATA 23 --# define DTLS1_RT_HEARTBEAT 24 -- --/* Pseudo content types to indicate additional parameters */ --# define TLS1_RT_CRYPTO 0x1000 --# define TLS1_RT_CRYPTO_PREMASTER (TLS1_RT_CRYPTO | 0x1) --# define TLS1_RT_CRYPTO_CLIENT_RANDOM (TLS1_RT_CRYPTO | 0x2) --# define TLS1_RT_CRYPTO_SERVER_RANDOM (TLS1_RT_CRYPTO | 0x3) --# define TLS1_RT_CRYPTO_MASTER (TLS1_RT_CRYPTO | 0x4) -- --# define TLS1_RT_CRYPTO_READ 0x0000 --# define TLS1_RT_CRYPTO_WRITE 0x0100 --# define TLS1_RT_CRYPTO_MAC (TLS1_RT_CRYPTO | 0x5) --# define TLS1_RT_CRYPTO_KEY (TLS1_RT_CRYPTO | 0x6) --# define TLS1_RT_CRYPTO_IV (TLS1_RT_CRYPTO | 0x7) --# define TLS1_RT_CRYPTO_FIXED_IV (TLS1_RT_CRYPTO | 0x8) -- --/* Pseudo content types for SSL/TLS header info */ --# define SSL3_RT_HEADER 0x100 --# define SSL3_RT_INNER_CONTENT_TYPE 0x101 -- --# define SSL3_AL_WARNING 1 --# define SSL3_AL_FATAL 2 -- --# define SSL3_AD_CLOSE_NOTIFY 0 --# define SSL3_AD_UNEXPECTED_MESSAGE 10/* fatal */ --# define SSL3_AD_BAD_RECORD_MAC 20/* fatal */ --# define SSL3_AD_DECOMPRESSION_FAILURE 30/* fatal */ --# define SSL3_AD_HANDSHAKE_FAILURE 40/* fatal */ --# define SSL3_AD_NO_CERTIFICATE 41 --# define SSL3_AD_BAD_CERTIFICATE 42 --# define SSL3_AD_UNSUPPORTED_CERTIFICATE 43 --# define SSL3_AD_CERTIFICATE_REVOKED 44 --# define SSL3_AD_CERTIFICATE_EXPIRED 45 --# define SSL3_AD_CERTIFICATE_UNKNOWN 46 --# define SSL3_AD_ILLEGAL_PARAMETER 47/* fatal */ -- --# define TLS1_HB_REQUEST 1 --# define TLS1_HB_RESPONSE 2 -- -- --# define SSL3_CT_RSA_SIGN 1 --# define SSL3_CT_DSS_SIGN 2 --# define SSL3_CT_RSA_FIXED_DH 3 --# define SSL3_CT_DSS_FIXED_DH 4 --# define SSL3_CT_RSA_EPHEMERAL_DH 5 --# define SSL3_CT_DSS_EPHEMERAL_DH 6 --# define SSL3_CT_FORTEZZA_DMS 20 --/* -- * SSL3_CT_NUMBER is used to size arrays and it must be large enough to -- * contain all of the cert types defined for *either* SSLv3 and TLSv1. -- */ --# define SSL3_CT_NUMBER 10 -- --# if defined(TLS_CT_NUMBER) --# if TLS_CT_NUMBER != SSL3_CT_NUMBER --# error "SSL/TLS CT_NUMBER values do not match" --# endif --# endif -- --/* No longer used as of OpenSSL 1.1.1 */ --# define SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS 0x0001 -- --/* Removed from OpenSSL 1.1.0 */ --# define TLS1_FLAGS_TLS_PADDING_BUG 0x0 -- --# define TLS1_FLAGS_SKIP_CERT_VERIFY 0x0010 -- --/* Set if we encrypt then mac instead of usual mac then encrypt */ --# define TLS1_FLAGS_ENCRYPT_THEN_MAC_READ 0x0100 --# define TLS1_FLAGS_ENCRYPT_THEN_MAC TLS1_FLAGS_ENCRYPT_THEN_MAC_READ -- --/* Set if extended master secret extension received from peer */ --# define TLS1_FLAGS_RECEIVED_EXTMS 0x0200 -- --# define TLS1_FLAGS_ENCRYPT_THEN_MAC_WRITE 0x0400 -- --# define TLS1_FLAGS_STATELESS 0x0800 -- --/* Set if extended master secret extension required on renegotiation */ --# define TLS1_FLAGS_REQUIRED_EXTMS 0x1000 -- --# define SSL3_MT_HELLO_REQUEST 0 --# define SSL3_MT_CLIENT_HELLO 1 --# define SSL3_MT_SERVER_HELLO 2 --# define SSL3_MT_NEWSESSION_TICKET 4 --# define SSL3_MT_END_OF_EARLY_DATA 5 --# define SSL3_MT_ENCRYPTED_EXTENSIONS 8 --# define SSL3_MT_CERTIFICATE 11 --# define SSL3_MT_SERVER_KEY_EXCHANGE 12 --# define SSL3_MT_CERTIFICATE_REQUEST 13 --# define SSL3_MT_SERVER_DONE 14 --# define SSL3_MT_CERTIFICATE_VERIFY 15 --# define SSL3_MT_CLIENT_KEY_EXCHANGE 16 --# define SSL3_MT_FINISHED 20 --# define SSL3_MT_CERTIFICATE_URL 21 --# define SSL3_MT_CERTIFICATE_STATUS 22 --# define SSL3_MT_SUPPLEMENTAL_DATA 23 --# define SSL3_MT_KEY_UPDATE 24 --# ifndef OPENSSL_NO_NEXTPROTONEG --# define SSL3_MT_NEXT_PROTO 67 --# endif --# define SSL3_MT_MESSAGE_HASH 254 --# define DTLS1_MT_HELLO_VERIFY_REQUEST 3 -- --/* Dummy message type for handling CCS like a normal handshake message */ --# define SSL3_MT_CHANGE_CIPHER_SPEC 0x0101 -- --# define SSL3_MT_CCS 1 -- --/* These are used when changing over to a new cipher */ --# define SSL3_CC_READ 0x001 --# define SSL3_CC_WRITE 0x002 --# define SSL3_CC_CLIENT 0x010 --# define SSL3_CC_SERVER 0x020 --# define SSL3_CC_EARLY 0x040 --# define SSL3_CC_HANDSHAKE 0x080 --# define SSL3_CC_APPLICATION 0x100 --# define SSL3_CHANGE_CIPHER_CLIENT_WRITE (SSL3_CC_CLIENT|SSL3_CC_WRITE) --# define SSL3_CHANGE_CIPHER_SERVER_READ (SSL3_CC_SERVER|SSL3_CC_READ) --# define SSL3_CHANGE_CIPHER_CLIENT_READ (SSL3_CC_CLIENT|SSL3_CC_READ) --# define SSL3_CHANGE_CIPHER_SERVER_WRITE (SSL3_CC_SERVER|SSL3_CC_WRITE) -- --#ifdef __cplusplus --} --#endif --#endif -diff --git a/uadk_tool/include/openssl/sslerr.h b/uadk_tool/include/openssl/sslerr.h -deleted file mode 100644 -index 701d61c..0000000 ---- a/uadk_tool/include/openssl/sslerr.h -+++ /dev/null -@@ -1,776 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_SSLERR_H --# define HEADER_SSLERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_SSL_strings(void); -- --/* -- * SSL function codes. -- */ --# define SSL_F_ADD_CLIENT_KEY_SHARE_EXT 438 --# define SSL_F_ADD_KEY_SHARE 512 --# define SSL_F_BYTES_TO_CIPHER_LIST 519 --# define SSL_F_CHECK_SUITEB_CIPHER_LIST 331 --# define SSL_F_CIPHERSUITE_CB 622 --# define SSL_F_CONSTRUCT_CA_NAMES 552 --# define SSL_F_CONSTRUCT_KEY_EXCHANGE_TBS 553 --# define SSL_F_CONSTRUCT_STATEFUL_TICKET 636 --# define SSL_F_CONSTRUCT_STATELESS_TICKET 637 --# define SSL_F_CREATE_SYNTHETIC_MESSAGE_HASH 539 --# define SSL_F_CREATE_TICKET_PREQUEL 638 --# define SSL_F_CT_MOVE_SCTS 345 --# define SSL_F_CT_STRICT 349 --# define SSL_F_CUSTOM_EXT_ADD 554 --# define SSL_F_CUSTOM_EXT_PARSE 555 --# define SSL_F_D2I_SSL_SESSION 103 --# define SSL_F_DANE_CTX_ENABLE 347 --# define SSL_F_DANE_MTYPE_SET 393 --# define SSL_F_DANE_TLSA_ADD 394 --# define SSL_F_DERIVE_SECRET_KEY_AND_IV 514 --# define SSL_F_DO_DTLS1_WRITE 245 --# define SSL_F_DO_SSL3_WRITE 104 --# define SSL_F_DTLS1_BUFFER_RECORD 247 --# define SSL_F_DTLS1_CHECK_TIMEOUT_NUM 318 --# define SSL_F_DTLS1_HEARTBEAT 305 --# define SSL_F_DTLS1_HM_FRAGMENT_NEW 623 --# define SSL_F_DTLS1_PREPROCESS_FRAGMENT 288 --# define SSL_F_DTLS1_PROCESS_BUFFERED_RECORDS 424 --# define SSL_F_DTLS1_PROCESS_RECORD 257 --# define SSL_F_DTLS1_READ_BYTES 258 --# define SSL_F_DTLS1_READ_FAILED 339 --# define SSL_F_DTLS1_RETRANSMIT_MESSAGE 390 --# define SSL_F_DTLS1_WRITE_APP_DATA_BYTES 268 --# define SSL_F_DTLS1_WRITE_BYTES 545 --# define SSL_F_DTLSV1_LISTEN 350 --# define SSL_F_DTLS_CONSTRUCT_CHANGE_CIPHER_SPEC 371 --# define SSL_F_DTLS_CONSTRUCT_HELLO_VERIFY_REQUEST 385 --# define SSL_F_DTLS_GET_REASSEMBLED_MESSAGE 370 --# define SSL_F_DTLS_PROCESS_HELLO_VERIFY 386 --# define SSL_F_DTLS_RECORD_LAYER_NEW 635 --# define SSL_F_DTLS_WAIT_FOR_DRY 592 --# define SSL_F_EARLY_DATA_COUNT_OK 532 --# define SSL_F_FINAL_EARLY_DATA 556 --# define SSL_F_FINAL_EC_PT_FORMATS 485 --# define SSL_F_FINAL_EMS 486 --# define SSL_F_FINAL_KEY_SHARE 503 --# define SSL_F_FINAL_MAXFRAGMENTLEN 557 --# define SSL_F_FINAL_PSK 639 --# define SSL_F_FINAL_RENEGOTIATE 483 --# define SSL_F_FINAL_SERVER_NAME 558 --# define SSL_F_FINAL_SIG_ALGS 497 --# define SSL_F_GET_CERT_VERIFY_TBS_DATA 588 --# define SSL_F_NSS_KEYLOG_INT 500 --# define SSL_F_OPENSSL_INIT_SSL 342 --# define SSL_F_OSSL_STATEM_CLIENT13_READ_TRANSITION 436 --# define SSL_F_OSSL_STATEM_CLIENT13_WRITE_TRANSITION 598 --# define SSL_F_OSSL_STATEM_CLIENT_CONSTRUCT_MESSAGE 430 --# define SSL_F_OSSL_STATEM_CLIENT_POST_PROCESS_MESSAGE 593 --# define SSL_F_OSSL_STATEM_CLIENT_PROCESS_MESSAGE 594 --# define SSL_F_OSSL_STATEM_CLIENT_READ_TRANSITION 417 --# define SSL_F_OSSL_STATEM_CLIENT_WRITE_TRANSITION 599 --# define SSL_F_OSSL_STATEM_SERVER13_READ_TRANSITION 437 --# define SSL_F_OSSL_STATEM_SERVER13_WRITE_TRANSITION 600 --# define SSL_F_OSSL_STATEM_SERVER_CONSTRUCT_MESSAGE 431 --# define SSL_F_OSSL_STATEM_SERVER_POST_PROCESS_MESSAGE 601 --# define SSL_F_OSSL_STATEM_SERVER_POST_WORK 602 --# define SSL_F_OSSL_STATEM_SERVER_PRE_WORK 640 --# define SSL_F_OSSL_STATEM_SERVER_PROCESS_MESSAGE 603 --# define SSL_F_OSSL_STATEM_SERVER_READ_TRANSITION 418 --# define SSL_F_OSSL_STATEM_SERVER_WRITE_TRANSITION 604 --# define SSL_F_PARSE_CA_NAMES 541 --# define SSL_F_PITEM_NEW 624 --# define SSL_F_PQUEUE_NEW 625 --# define SSL_F_PROCESS_KEY_SHARE_EXT 439 --# define SSL_F_READ_STATE_MACHINE 352 --# define SSL_F_SET_CLIENT_CIPHERSUITE 540 --# define SSL_F_SRP_GENERATE_CLIENT_MASTER_SECRET 595 --# define SSL_F_SRP_GENERATE_SERVER_MASTER_SECRET 589 --# define SSL_F_SRP_VERIFY_SERVER_PARAM 596 --# define SSL_F_SSL3_CHANGE_CIPHER_STATE 129 --# define SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM 130 --# define SSL_F_SSL3_CTRL 213 --# define SSL_F_SSL3_CTX_CTRL 133 --# define SSL_F_SSL3_DIGEST_CACHED_RECORDS 293 --# define SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC 292 --# define SSL_F_SSL3_ENC 608 --# define SSL_F_SSL3_FINAL_FINISH_MAC 285 --# define SSL_F_SSL3_FINISH_MAC 587 --# define SSL_F_SSL3_GENERATE_KEY_BLOCK 238 --# define SSL_F_SSL3_GENERATE_MASTER_SECRET 388 --# define SSL_F_SSL3_GET_RECORD 143 --# define SSL_F_SSL3_INIT_FINISHED_MAC 397 --# define SSL_F_SSL3_OUTPUT_CERT_CHAIN 147 --# define SSL_F_SSL3_READ_BYTES 148 --# define SSL_F_SSL3_READ_N 149 --# define SSL_F_SSL3_SETUP_KEY_BLOCK 157 --# define SSL_F_SSL3_SETUP_READ_BUFFER 156 --# define SSL_F_SSL3_SETUP_WRITE_BUFFER 291 --# define SSL_F_SSL3_WRITE_BYTES 158 --# define SSL_F_SSL3_WRITE_PENDING 159 --# define SSL_F_SSL_ADD_CERT_CHAIN 316 --# define SSL_F_SSL_ADD_CERT_TO_BUF 319 --# define SSL_F_SSL_ADD_CERT_TO_WPACKET 493 --# define SSL_F_SSL_ADD_CLIENTHELLO_RENEGOTIATE_EXT 298 --# define SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT 277 --# define SSL_F_SSL_ADD_CLIENTHELLO_USE_SRTP_EXT 307 --# define SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK 215 --# define SSL_F_SSL_ADD_FILE_CERT_SUBJECTS_TO_STACK 216 --# define SSL_F_SSL_ADD_SERVERHELLO_RENEGOTIATE_EXT 299 --# define SSL_F_SSL_ADD_SERVERHELLO_TLSEXT 278 --# define SSL_F_SSL_ADD_SERVERHELLO_USE_SRTP_EXT 308 --# define SSL_F_SSL_BAD_METHOD 160 --# define SSL_F_SSL_BUILD_CERT_CHAIN 332 --# define SSL_F_SSL_BYTES_TO_CIPHER_LIST 161 --# define SSL_F_SSL_CACHE_CIPHERLIST 520 --# define SSL_F_SSL_CERT_ADD0_CHAIN_CERT 346 --# define SSL_F_SSL_CERT_DUP 221 --# define SSL_F_SSL_CERT_NEW 162 --# define SSL_F_SSL_CERT_SET0_CHAIN 340 --# define SSL_F_SSL_CHECK_PRIVATE_KEY 163 --# define SSL_F_SSL_CHECK_SERVERHELLO_TLSEXT 280 --# define SSL_F_SSL_CHECK_SRP_EXT_CLIENTHELLO 606 --# define SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG 279 --# define SSL_F_SSL_CHOOSE_CLIENT_VERSION 607 --# define SSL_F_SSL_CIPHER_DESCRIPTION 626 --# define SSL_F_SSL_CIPHER_LIST_TO_BYTES 425 --# define SSL_F_SSL_CIPHER_PROCESS_RULESTR 230 --# define SSL_F_SSL_CIPHER_STRENGTH_SORT 231 --# define SSL_F_SSL_CLEAR 164 --# define SSL_F_SSL_CLIENT_HELLO_GET1_EXTENSIONS_PRESENT 627 --# define SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD 165 --# define SSL_F_SSL_CONF_CMD 334 --# define SSL_F_SSL_CREATE_CIPHER_LIST 166 --# define SSL_F_SSL_CTRL 232 --# define SSL_F_SSL_CTX_CHECK_PRIVATE_KEY 168 --# define SSL_F_SSL_CTX_ENABLE_CT 398 --# define SSL_F_SSL_CTX_MAKE_PROFILES 309 --# define SSL_F_SSL_CTX_NEW 169 --# define SSL_F_SSL_CTX_SET_ALPN_PROTOS 343 --# define SSL_F_SSL_CTX_SET_CIPHER_LIST 269 --# define SSL_F_SSL_CTX_SET_CLIENT_CERT_ENGINE 290 --# define SSL_F_SSL_CTX_SET_CT_VALIDATION_CALLBACK 396 --# define SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT 219 --# define SSL_F_SSL_CTX_SET_SSL_VERSION 170 --# define SSL_F_SSL_CTX_SET_TLSEXT_MAX_FRAGMENT_LENGTH 551 --# define SSL_F_SSL_CTX_USE_CERTIFICATE 171 --# define SSL_F_SSL_CTX_USE_CERTIFICATE_ASN1 172 --# define SSL_F_SSL_CTX_USE_CERTIFICATE_FILE 173 --# define SSL_F_SSL_CTX_USE_PRIVATEKEY 174 --# define SSL_F_SSL_CTX_USE_PRIVATEKEY_ASN1 175 --# define SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE 176 --# define SSL_F_SSL_CTX_USE_PSK_IDENTITY_HINT 272 --# define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY 177 --# define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_ASN1 178 --# define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE 179 --# define SSL_F_SSL_CTX_USE_SERVERINFO 336 --# define SSL_F_SSL_CTX_USE_SERVERINFO_EX 543 --# define SSL_F_SSL_CTX_USE_SERVERINFO_FILE 337 --# define SSL_F_SSL_DANE_DUP 403 --# define SSL_F_SSL_DANE_ENABLE 395 --# define SSL_F_SSL_DERIVE 590 --# define SSL_F_SSL_DO_CONFIG 391 --# define SSL_F_SSL_DO_HANDSHAKE 180 --# define SSL_F_SSL_DUP_CA_LIST 408 --# define SSL_F_SSL_ENABLE_CT 402 --# define SSL_F_SSL_GENERATE_PKEY_GROUP 559 --# define SSL_F_SSL_GENERATE_SESSION_ID 547 --# define SSL_F_SSL_GET_NEW_SESSION 181 --# define SSL_F_SSL_GET_PREV_SESSION 217 --# define SSL_F_SSL_GET_SERVER_CERT_INDEX 322 --# define SSL_F_SSL_GET_SIGN_PKEY 183 --# define SSL_F_SSL_HANDSHAKE_HASH 560 --# define SSL_F_SSL_INIT_WBIO_BUFFER 184 --# define SSL_F_SSL_KEY_UPDATE 515 --# define SSL_F_SSL_LOAD_CLIENT_CA_FILE 185 --# define SSL_F_SSL_LOG_MASTER_SECRET 498 --# define SSL_F_SSL_LOG_RSA_CLIENT_KEY_EXCHANGE 499 --# define SSL_F_SSL_MODULE_INIT 392 --# define SSL_F_SSL_NEW 186 --# define SSL_F_SSL_NEXT_PROTO_VALIDATE 565 --# define SSL_F_SSL_PARSE_CLIENTHELLO_RENEGOTIATE_EXT 300 --# define SSL_F_SSL_PARSE_CLIENTHELLO_TLSEXT 302 --# define SSL_F_SSL_PARSE_CLIENTHELLO_USE_SRTP_EXT 310 --# define SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT 301 --# define SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT 303 --# define SSL_F_SSL_PARSE_SERVERHELLO_USE_SRTP_EXT 311 --# define SSL_F_SSL_PEEK 270 --# define SSL_F_SSL_PEEK_EX 432 --# define SSL_F_SSL_PEEK_INTERNAL 522 --# define SSL_F_SSL_READ 223 --# define SSL_F_SSL_READ_EARLY_DATA 529 --# define SSL_F_SSL_READ_EX 434 --# define SSL_F_SSL_READ_INTERNAL 523 --# define SSL_F_SSL_RENEGOTIATE 516 --# define SSL_F_SSL_RENEGOTIATE_ABBREVIATED 546 --# define SSL_F_SSL_SCAN_CLIENTHELLO_TLSEXT 320 --# define SSL_F_SSL_SCAN_SERVERHELLO_TLSEXT 321 --# define SSL_F_SSL_SESSION_DUP 348 --# define SSL_F_SSL_SESSION_NEW 189 --# define SSL_F_SSL_SESSION_PRINT_FP 190 --# define SSL_F_SSL_SESSION_SET1_ID 423 --# define SSL_F_SSL_SESSION_SET1_ID_CONTEXT 312 --# define SSL_F_SSL_SET_ALPN_PROTOS 344 --# define SSL_F_SSL_SET_CERT 191 --# define SSL_F_SSL_SET_CERT_AND_KEY 621 --# define SSL_F_SSL_SET_CIPHER_LIST 271 --# define SSL_F_SSL_SET_CT_VALIDATION_CALLBACK 399 --# define SSL_F_SSL_SET_FD 192 --# define SSL_F_SSL_SET_PKEY 193 --# define SSL_F_SSL_SET_RFD 194 --# define SSL_F_SSL_SET_SESSION 195 --# define SSL_F_SSL_SET_SESSION_ID_CONTEXT 218 --# define SSL_F_SSL_SET_SESSION_TICKET_EXT 294 --# define SSL_F_SSL_SET_TLSEXT_MAX_FRAGMENT_LENGTH 550 --# define SSL_F_SSL_SET_WFD 196 --# define SSL_F_SSL_SHUTDOWN 224 --# define SSL_F_SSL_SRP_CTX_INIT 313 --# define SSL_F_SSL_START_ASYNC_JOB 389 --# define SSL_F_SSL_UNDEFINED_FUNCTION 197 --# define SSL_F_SSL_UNDEFINED_VOID_FUNCTION 244 --# define SSL_F_SSL_USE_CERTIFICATE 198 --# define SSL_F_SSL_USE_CERTIFICATE_ASN1 199 --# define SSL_F_SSL_USE_CERTIFICATE_FILE 200 --# define SSL_F_SSL_USE_PRIVATEKEY 201 --# define SSL_F_SSL_USE_PRIVATEKEY_ASN1 202 --# define SSL_F_SSL_USE_PRIVATEKEY_FILE 203 --# define SSL_F_SSL_USE_PSK_IDENTITY_HINT 273 --# define SSL_F_SSL_USE_RSAPRIVATEKEY 204 --# define SSL_F_SSL_USE_RSAPRIVATEKEY_ASN1 205 --# define SSL_F_SSL_USE_RSAPRIVATEKEY_FILE 206 --# define SSL_F_SSL_VALIDATE_CT 400 --# define SSL_F_SSL_VERIFY_CERT_CHAIN 207 --# define SSL_F_SSL_VERIFY_CLIENT_POST_HANDSHAKE 616 --# define SSL_F_SSL_WRITE 208 --# define SSL_F_SSL_WRITE_EARLY_DATA 526 --# define SSL_F_SSL_WRITE_EARLY_FINISH 527 --# define SSL_F_SSL_WRITE_EX 433 --# define SSL_F_SSL_WRITE_INTERNAL 524 --# define SSL_F_STATE_MACHINE 353 --# define SSL_F_TLS12_CHECK_PEER_SIGALG 333 --# define SSL_F_TLS12_COPY_SIGALGS 533 --# define SSL_F_TLS13_CHANGE_CIPHER_STATE 440 --# define SSL_F_TLS13_ENC 609 --# define SSL_F_TLS13_FINAL_FINISH_MAC 605 --# define SSL_F_TLS13_GENERATE_SECRET 591 --# define SSL_F_TLS13_HKDF_EXPAND 561 --# define SSL_F_TLS13_RESTORE_HANDSHAKE_DIGEST_FOR_PHA 617 --# define SSL_F_TLS13_SAVE_HANDSHAKE_DIGEST_FOR_PHA 618 --# define SSL_F_TLS13_SETUP_KEY_BLOCK 441 --# define SSL_F_TLS1_CHANGE_CIPHER_STATE 209 --# define SSL_F_TLS1_CHECK_DUPLICATE_EXTENSIONS 341 --# define SSL_F_TLS1_ENC 401 --# define SSL_F_TLS1_EXPORT_KEYING_MATERIAL 314 --# define SSL_F_TLS1_GET_CURVELIST 338 --# define SSL_F_TLS1_PRF 284 --# define SSL_F_TLS1_SAVE_U16 628 --# define SSL_F_TLS1_SETUP_KEY_BLOCK 211 --# define SSL_F_TLS1_SET_GROUPS 629 --# define SSL_F_TLS1_SET_RAW_SIGALGS 630 --# define SSL_F_TLS1_SET_SERVER_SIGALGS 335 --# define SSL_F_TLS1_SET_SHARED_SIGALGS 631 --# define SSL_F_TLS1_SET_SIGALGS 632 --# define SSL_F_TLS_CHOOSE_SIGALG 513 --# define SSL_F_TLS_CLIENT_KEY_EXCHANGE_POST_WORK 354 --# define SSL_F_TLS_COLLECT_EXTENSIONS 435 --# define SSL_F_TLS_CONSTRUCT_CERTIFICATE_AUTHORITIES 542 --# define SSL_F_TLS_CONSTRUCT_CERTIFICATE_REQUEST 372 --# define SSL_F_TLS_CONSTRUCT_CERT_STATUS 429 --# define SSL_F_TLS_CONSTRUCT_CERT_STATUS_BODY 494 --# define SSL_F_TLS_CONSTRUCT_CERT_VERIFY 496 --# define SSL_F_TLS_CONSTRUCT_CHANGE_CIPHER_SPEC 427 --# define SSL_F_TLS_CONSTRUCT_CKE_DHE 404 --# define SSL_F_TLS_CONSTRUCT_CKE_ECDHE 405 --# define SSL_F_TLS_CONSTRUCT_CKE_GOST 406 --# define SSL_F_TLS_CONSTRUCT_CKE_PSK_PREAMBLE 407 --# define SSL_F_TLS_CONSTRUCT_CKE_RSA 409 --# define SSL_F_TLS_CONSTRUCT_CKE_SRP 410 --# define SSL_F_TLS_CONSTRUCT_CLIENT_CERTIFICATE 484 --# define SSL_F_TLS_CONSTRUCT_CLIENT_HELLO 487 --# define SSL_F_TLS_CONSTRUCT_CLIENT_KEY_EXCHANGE 488 --# define SSL_F_TLS_CONSTRUCT_CLIENT_VERIFY 489 --# define SSL_F_TLS_CONSTRUCT_CTOS_ALPN 466 --# define SSL_F_TLS_CONSTRUCT_CTOS_CERTIFICATE 355 --# define SSL_F_TLS_CONSTRUCT_CTOS_COOKIE 535 --# define SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA 530 --# define SSL_F_TLS_CONSTRUCT_CTOS_EC_PT_FORMATS 467 --# define SSL_F_TLS_CONSTRUCT_CTOS_EMS 468 --# define SSL_F_TLS_CONSTRUCT_CTOS_ETM 469 --# define SSL_F_TLS_CONSTRUCT_CTOS_HELLO 356 --# define SSL_F_TLS_CONSTRUCT_CTOS_KEY_EXCHANGE 357 --# define SSL_F_TLS_CONSTRUCT_CTOS_KEY_SHARE 470 --# define SSL_F_TLS_CONSTRUCT_CTOS_MAXFRAGMENTLEN 549 --# define SSL_F_TLS_CONSTRUCT_CTOS_NPN 471 --# define SSL_F_TLS_CONSTRUCT_CTOS_PADDING 472 --# define SSL_F_TLS_CONSTRUCT_CTOS_POST_HANDSHAKE_AUTH 619 --# define SSL_F_TLS_CONSTRUCT_CTOS_PSK 501 --# define SSL_F_TLS_CONSTRUCT_CTOS_PSK_KEX_MODES 509 --# define SSL_F_TLS_CONSTRUCT_CTOS_RENEGOTIATE 473 --# define SSL_F_TLS_CONSTRUCT_CTOS_SCT 474 --# define SSL_F_TLS_CONSTRUCT_CTOS_SERVER_NAME 475 --# define SSL_F_TLS_CONSTRUCT_CTOS_SESSION_TICKET 476 --# define SSL_F_TLS_CONSTRUCT_CTOS_SIG_ALGS 477 --# define SSL_F_TLS_CONSTRUCT_CTOS_SRP 478 --# define SSL_F_TLS_CONSTRUCT_CTOS_STATUS_REQUEST 479 --# define SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_GROUPS 480 --# define SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_VERSIONS 481 --# define SSL_F_TLS_CONSTRUCT_CTOS_USE_SRTP 482 --# define SSL_F_TLS_CONSTRUCT_CTOS_VERIFY 358 --# define SSL_F_TLS_CONSTRUCT_ENCRYPTED_EXTENSIONS 443 --# define SSL_F_TLS_CONSTRUCT_END_OF_EARLY_DATA 536 --# define SSL_F_TLS_CONSTRUCT_EXTENSIONS 447 --# define SSL_F_TLS_CONSTRUCT_FINISHED 359 --# define SSL_F_TLS_CONSTRUCT_HELLO_REQUEST 373 --# define SSL_F_TLS_CONSTRUCT_HELLO_RETRY_REQUEST 510 --# define SSL_F_TLS_CONSTRUCT_KEY_UPDATE 517 --# define SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET 428 --# define SSL_F_TLS_CONSTRUCT_NEXT_PROTO 426 --# define SSL_F_TLS_CONSTRUCT_SERVER_CERTIFICATE 490 --# define SSL_F_TLS_CONSTRUCT_SERVER_HELLO 491 --# define SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE 492 --# define SSL_F_TLS_CONSTRUCT_STOC_ALPN 451 --# define SSL_F_TLS_CONSTRUCT_STOC_CERTIFICATE 374 --# define SSL_F_TLS_CONSTRUCT_STOC_COOKIE 613 --# define SSL_F_TLS_CONSTRUCT_STOC_CRYPTOPRO_BUG 452 --# define SSL_F_TLS_CONSTRUCT_STOC_DONE 375 --# define SSL_F_TLS_CONSTRUCT_STOC_EARLY_DATA 531 --# define SSL_F_TLS_CONSTRUCT_STOC_EARLY_DATA_INFO 525 --# define SSL_F_TLS_CONSTRUCT_STOC_EC_PT_FORMATS 453 --# define SSL_F_TLS_CONSTRUCT_STOC_EMS 454 --# define SSL_F_TLS_CONSTRUCT_STOC_ETM 455 --# define SSL_F_TLS_CONSTRUCT_STOC_HELLO 376 --# define SSL_F_TLS_CONSTRUCT_STOC_KEY_EXCHANGE 377 --# define SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE 456 --# define SSL_F_TLS_CONSTRUCT_STOC_MAXFRAGMENTLEN 548 --# define SSL_F_TLS_CONSTRUCT_STOC_NEXT_PROTO_NEG 457 --# define SSL_F_TLS_CONSTRUCT_STOC_PSK 504 --# define SSL_F_TLS_CONSTRUCT_STOC_RENEGOTIATE 458 --# define SSL_F_TLS_CONSTRUCT_STOC_SERVER_NAME 459 --# define SSL_F_TLS_CONSTRUCT_STOC_SESSION_TICKET 460 --# define SSL_F_TLS_CONSTRUCT_STOC_STATUS_REQUEST 461 --# define SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_GROUPS 544 --# define SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_VERSIONS 611 --# define SSL_F_TLS_CONSTRUCT_STOC_USE_SRTP 462 --# define SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO 521 --# define SSL_F_TLS_FINISH_HANDSHAKE 597 --# define SSL_F_TLS_GET_MESSAGE_BODY 351 --# define SSL_F_TLS_GET_MESSAGE_HEADER 387 --# define SSL_F_TLS_HANDLE_ALPN 562 --# define SSL_F_TLS_HANDLE_STATUS_REQUEST 563 --# define SSL_F_TLS_PARSE_CERTIFICATE_AUTHORITIES 566 --# define SSL_F_TLS_PARSE_CLIENTHELLO_TLSEXT 449 --# define SSL_F_TLS_PARSE_CTOS_ALPN 567 --# define SSL_F_TLS_PARSE_CTOS_COOKIE 614 --# define SSL_F_TLS_PARSE_CTOS_EARLY_DATA 568 --# define SSL_F_TLS_PARSE_CTOS_EC_PT_FORMATS 569 --# define SSL_F_TLS_PARSE_CTOS_EMS 570 --# define SSL_F_TLS_PARSE_CTOS_KEY_SHARE 463 --# define SSL_F_TLS_PARSE_CTOS_MAXFRAGMENTLEN 571 --# define SSL_F_TLS_PARSE_CTOS_POST_HANDSHAKE_AUTH 620 --# define SSL_F_TLS_PARSE_CTOS_PSK 505 --# define SSL_F_TLS_PARSE_CTOS_PSK_KEX_MODES 572 --# define SSL_F_TLS_PARSE_CTOS_RENEGOTIATE 464 --# define SSL_F_TLS_PARSE_CTOS_SERVER_NAME 573 --# define SSL_F_TLS_PARSE_CTOS_SESSION_TICKET 574 --# define SSL_F_TLS_PARSE_CTOS_SIG_ALGS 575 --# define SSL_F_TLS_PARSE_CTOS_SIG_ALGS_CERT 615 --# define SSL_F_TLS_PARSE_CTOS_SRP 576 --# define SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST 577 --# define SSL_F_TLS_PARSE_CTOS_SUPPORTED_GROUPS 578 --# define SSL_F_TLS_PARSE_CTOS_USE_SRTP 465 --# define SSL_F_TLS_PARSE_STOC_ALPN 579 --# define SSL_F_TLS_PARSE_STOC_COOKIE 534 --# define SSL_F_TLS_PARSE_STOC_EARLY_DATA 538 --# define SSL_F_TLS_PARSE_STOC_EARLY_DATA_INFO 528 --# define SSL_F_TLS_PARSE_STOC_EC_PT_FORMATS 580 --# define SSL_F_TLS_PARSE_STOC_KEY_SHARE 445 --# define SSL_F_TLS_PARSE_STOC_MAXFRAGMENTLEN 581 --# define SSL_F_TLS_PARSE_STOC_NPN 582 --# define SSL_F_TLS_PARSE_STOC_PSK 502 --# define SSL_F_TLS_PARSE_STOC_RENEGOTIATE 448 --# define SSL_F_TLS_PARSE_STOC_SCT 564 --# define SSL_F_TLS_PARSE_STOC_SERVER_NAME 583 --# define SSL_F_TLS_PARSE_STOC_SESSION_TICKET 584 --# define SSL_F_TLS_PARSE_STOC_STATUS_REQUEST 585 --# define SSL_F_TLS_PARSE_STOC_SUPPORTED_VERSIONS 612 --# define SSL_F_TLS_PARSE_STOC_USE_SRTP 446 --# define SSL_F_TLS_POST_PROCESS_CLIENT_HELLO 378 --# define SSL_F_TLS_POST_PROCESS_CLIENT_KEY_EXCHANGE 384 --# define SSL_F_TLS_PREPARE_CLIENT_CERTIFICATE 360 --# define SSL_F_TLS_PROCESS_AS_HELLO_RETRY_REQUEST 610 --# define SSL_F_TLS_PROCESS_CERTIFICATE_REQUEST 361 --# define SSL_F_TLS_PROCESS_CERT_STATUS 362 --# define SSL_F_TLS_PROCESS_CERT_STATUS_BODY 495 --# define SSL_F_TLS_PROCESS_CERT_VERIFY 379 --# define SSL_F_TLS_PROCESS_CHANGE_CIPHER_SPEC 363 --# define SSL_F_TLS_PROCESS_CKE_DHE 411 --# define SSL_F_TLS_PROCESS_CKE_ECDHE 412 --# define SSL_F_TLS_PROCESS_CKE_GOST 413 --# define SSL_F_TLS_PROCESS_CKE_PSK_PREAMBLE 414 --# define SSL_F_TLS_PROCESS_CKE_RSA 415 --# define SSL_F_TLS_PROCESS_CKE_SRP 416 --# define SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE 380 --# define SSL_F_TLS_PROCESS_CLIENT_HELLO 381 --# define SSL_F_TLS_PROCESS_CLIENT_KEY_EXCHANGE 382 --# define SSL_F_TLS_PROCESS_ENCRYPTED_EXTENSIONS 444 --# define SSL_F_TLS_PROCESS_END_OF_EARLY_DATA 537 --# define SSL_F_TLS_PROCESS_FINISHED 364 --# define SSL_F_TLS_PROCESS_HELLO_REQ 507 --# define SSL_F_TLS_PROCESS_HELLO_RETRY_REQUEST 511 --# define SSL_F_TLS_PROCESS_INITIAL_SERVER_FLIGHT 442 --# define SSL_F_TLS_PROCESS_KEY_EXCHANGE 365 --# define SSL_F_TLS_PROCESS_KEY_UPDATE 518 --# define SSL_F_TLS_PROCESS_NEW_SESSION_TICKET 366 --# define SSL_F_TLS_PROCESS_NEXT_PROTO 383 --# define SSL_F_TLS_PROCESS_SERVER_CERTIFICATE 367 --# define SSL_F_TLS_PROCESS_SERVER_DONE 368 --# define SSL_F_TLS_PROCESS_SERVER_HELLO 369 --# define SSL_F_TLS_PROCESS_SKE_DHE 419 --# define SSL_F_TLS_PROCESS_SKE_ECDHE 420 --# define SSL_F_TLS_PROCESS_SKE_PSK_PREAMBLE 421 --# define SSL_F_TLS_PROCESS_SKE_SRP 422 --# define SSL_F_TLS_PSK_DO_BINDER 506 --# define SSL_F_TLS_SCAN_CLIENTHELLO_TLSEXT 450 --# define SSL_F_TLS_SETUP_HANDSHAKE 508 --# define SSL_F_USE_CERTIFICATE_CHAIN_FILE 220 --# define SSL_F_WPACKET_INTERN_INIT_LEN 633 --# define SSL_F_WPACKET_START_SUB_PACKET_LEN__ 634 --# define SSL_F_WRITE_STATE_MACHINE 586 -- --/* -- * SSL reason codes. -- */ --# define SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY 291 --# define SSL_R_APP_DATA_IN_HANDSHAKE 100 --# define SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT 272 --# define SSL_R_AT_LEAST_TLS_1_0_NEEDED_IN_FIPS_MODE 143 --# define SSL_R_AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE 158 --# define SSL_R_BAD_CHANGE_CIPHER_SPEC 103 --# define SSL_R_BAD_CIPHER 186 --# define SSL_R_BAD_DATA 390 --# define SSL_R_BAD_DATA_RETURNED_BY_CALLBACK 106 --# define SSL_R_BAD_DECOMPRESSION 107 --# define SSL_R_BAD_DH_VALUE 102 --# define SSL_R_BAD_DIGEST_LENGTH 111 --# define SSL_R_BAD_EARLY_DATA 233 --# define SSL_R_BAD_ECC_CERT 304 --# define SSL_R_BAD_ECPOINT 306 --# define SSL_R_BAD_EXTENSION 110 --# define SSL_R_BAD_HANDSHAKE_LENGTH 332 --# define SSL_R_BAD_HANDSHAKE_STATE 236 --# define SSL_R_BAD_HELLO_REQUEST 105 --# define SSL_R_BAD_HRR_VERSION 263 --# define SSL_R_BAD_KEY_SHARE 108 --# define SSL_R_BAD_KEY_UPDATE 122 --# define SSL_R_BAD_LEGACY_VERSION 292 --# define SSL_R_BAD_LENGTH 271 --# define SSL_R_BAD_PACKET 240 --# define SSL_R_BAD_PACKET_LENGTH 115 --# define SSL_R_BAD_PROTOCOL_VERSION_NUMBER 116 --# define SSL_R_BAD_PSK 219 --# define SSL_R_BAD_PSK_IDENTITY 114 --# define SSL_R_BAD_RECORD_TYPE 443 --# define SSL_R_BAD_RSA_ENCRYPT 119 --# define SSL_R_BAD_SIGNATURE 123 --# define SSL_R_BAD_SRP_A_LENGTH 347 --# define SSL_R_BAD_SRP_PARAMETERS 371 --# define SSL_R_BAD_SRTP_MKI_VALUE 352 --# define SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST 353 --# define SSL_R_BAD_SSL_FILETYPE 124 --# define SSL_R_BAD_VALUE 384 --# define SSL_R_BAD_WRITE_RETRY 127 --# define SSL_R_BINDER_DOES_NOT_VERIFY 253 --# define SSL_R_BIO_NOT_SET 128 --# define SSL_R_BLOCK_CIPHER_PAD_IS_WRONG 129 --# define SSL_R_BN_LIB 130 --# define SSL_R_CALLBACK_FAILED 234 --# define SSL_R_CANNOT_CHANGE_CIPHER 109 --# define SSL_R_CA_DN_LENGTH_MISMATCH 131 --# define SSL_R_CA_KEY_TOO_SMALL 397 --# define SSL_R_CA_MD_TOO_WEAK 398 --# define SSL_R_CCS_RECEIVED_EARLY 133 --# define SSL_R_CERTIFICATE_VERIFY_FAILED 134 --# define SSL_R_CERT_CB_ERROR 377 --# define SSL_R_CERT_LENGTH_MISMATCH 135 --# define SSL_R_CIPHERSUITE_DIGEST_HAS_CHANGED 218 --# define SSL_R_CIPHER_CODE_WRONG_LENGTH 137 --# define SSL_R_CIPHER_OR_HASH_UNAVAILABLE 138 --# define SSL_R_CLIENTHELLO_TLSEXT 226 --# define SSL_R_COMPRESSED_LENGTH_TOO_LONG 140 --# define SSL_R_COMPRESSION_DISABLED 343 --# define SSL_R_COMPRESSION_FAILURE 141 --# define SSL_R_COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE 307 --# define SSL_R_COMPRESSION_LIBRARY_ERROR 142 --# define SSL_R_CONNECTION_TYPE_NOT_SET 144 --# define SSL_R_CONTEXT_NOT_DANE_ENABLED 167 --# define SSL_R_COOKIE_GEN_CALLBACK_FAILURE 400 --# define SSL_R_COOKIE_MISMATCH 308 --# define SSL_R_CUSTOM_EXT_HANDLER_ALREADY_INSTALLED 206 --# define SSL_R_DANE_ALREADY_ENABLED 172 --# define SSL_R_DANE_CANNOT_OVERRIDE_MTYPE_FULL 173 --# define SSL_R_DANE_NOT_ENABLED 175 --# define SSL_R_DANE_TLSA_BAD_CERTIFICATE 180 --# define SSL_R_DANE_TLSA_BAD_CERTIFICATE_USAGE 184 --# define SSL_R_DANE_TLSA_BAD_DATA_LENGTH 189 --# define SSL_R_DANE_TLSA_BAD_DIGEST_LENGTH 192 --# define SSL_R_DANE_TLSA_BAD_MATCHING_TYPE 200 --# define SSL_R_DANE_TLSA_BAD_PUBLIC_KEY 201 --# define SSL_R_DANE_TLSA_BAD_SELECTOR 202 --# define SSL_R_DANE_TLSA_NULL_DATA 203 --# define SSL_R_DATA_BETWEEN_CCS_AND_FINISHED 145 --# define SSL_R_DATA_LENGTH_TOO_LONG 146 --# define SSL_R_DECRYPTION_FAILED 147 --# define SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC 281 --# define SSL_R_DH_KEY_TOO_SMALL 394 --# define SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG 148 --# define SSL_R_DIGEST_CHECK_FAILED 149 --# define SSL_R_DTLS_MESSAGE_TOO_BIG 334 --# define SSL_R_DUPLICATE_COMPRESSION_ID 309 --# define SSL_R_ECC_CERT_NOT_FOR_SIGNING 318 --# define SSL_R_ECDH_REQUIRED_FOR_SUITEB_MODE 374 --# define SSL_R_EE_KEY_TOO_SMALL 399 --# define SSL_R_EMPTY_SRTP_PROTECTION_PROFILE_LIST 354 --# define SSL_R_ENCRYPTED_LENGTH_TOO_LONG 150 --# define SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST 151 --# define SSL_R_ERROR_SETTING_TLSA_BASE_DOMAIN 204 --# define SSL_R_EXCEEDS_MAX_FRAGMENT_SIZE 194 --# define SSL_R_EXCESSIVE_MESSAGE_SIZE 152 --# define SSL_R_EXTENSION_NOT_RECEIVED 279 --# define SSL_R_EXTRA_DATA_IN_MESSAGE 153 --# define SSL_R_EXT_LENGTH_MISMATCH 163 --# define SSL_R_FAILED_TO_INIT_ASYNC 405 --# define SSL_R_FRAGMENTED_CLIENT_HELLO 401 --# define SSL_R_GOT_A_FIN_BEFORE_A_CCS 154 --# define SSL_R_HTTPS_PROXY_REQUEST 155 --# define SSL_R_HTTP_REQUEST 156 --# define SSL_R_ILLEGAL_POINT_COMPRESSION 162 --# define SSL_R_ILLEGAL_SUITEB_DIGEST 380 --# define SSL_R_INAPPROPRIATE_FALLBACK 373 --# define SSL_R_INCONSISTENT_COMPRESSION 340 --# define SSL_R_INCONSISTENT_EARLY_DATA_ALPN 222 --# define SSL_R_INCONSISTENT_EARLY_DATA_SNI 231 --# define SSL_R_INCONSISTENT_EXTMS 104 --# define SSL_R_INSUFFICIENT_SECURITY 241 --# define SSL_R_INVALID_ALERT 205 --# define SSL_R_INVALID_CCS_MESSAGE 260 --# define SSL_R_INVALID_CERTIFICATE_OR_ALG 238 --# define SSL_R_INVALID_COMMAND 280 --# define SSL_R_INVALID_COMPRESSION_ALGORITHM 341 --# define SSL_R_INVALID_CONFIG 283 --# define SSL_R_INVALID_CONFIGURATION_NAME 113 --# define SSL_R_INVALID_CONTEXT 282 --# define SSL_R_INVALID_CT_VALIDATION_TYPE 212 --# define SSL_R_INVALID_KEY_UPDATE_TYPE 120 --# define SSL_R_INVALID_MAX_EARLY_DATA 174 --# define SSL_R_INVALID_NULL_CMD_NAME 385 --# define SSL_R_INVALID_SEQUENCE_NUMBER 402 --# define SSL_R_INVALID_SERVERINFO_DATA 388 --# define SSL_R_INVALID_SESSION_ID 999 --# define SSL_R_INVALID_SRP_USERNAME 357 --# define SSL_R_INVALID_STATUS_RESPONSE 328 --# define SSL_R_INVALID_TICKET_KEYS_LENGTH 325 --# define SSL_R_LENGTH_MISMATCH 159 --# define SSL_R_LENGTH_TOO_LONG 404 --# define SSL_R_LENGTH_TOO_SHORT 160 --# define SSL_R_LIBRARY_BUG 274 --# define SSL_R_LIBRARY_HAS_NO_CIPHERS 161 --# define SSL_R_MISSING_DSA_SIGNING_CERT 165 --# define SSL_R_MISSING_ECDSA_SIGNING_CERT 381 --# define SSL_R_MISSING_FATAL 256 --# define SSL_R_MISSING_PARAMETERS 290 --# define SSL_R_MISSING_PSK_KEX_MODES_EXTENSION 310 --# define SSL_R_MISSING_RSA_CERTIFICATE 168 --# define SSL_R_MISSING_RSA_ENCRYPTING_CERT 169 --# define SSL_R_MISSING_RSA_SIGNING_CERT 170 --# define SSL_R_MISSING_SIGALGS_EXTENSION 112 --# define SSL_R_MISSING_SIGNING_CERT 221 --# define SSL_R_MISSING_SRP_PARAM 358 --# define SSL_R_MISSING_SUPPORTED_GROUPS_EXTENSION 209 --# define SSL_R_MISSING_TMP_DH_KEY 171 --# define SSL_R_MISSING_TMP_ECDH_KEY 311 --# define SSL_R_MIXED_HANDSHAKE_AND_NON_HANDSHAKE_DATA 293 --# define SSL_R_NOT_ON_RECORD_BOUNDARY 182 --# define SSL_R_NOT_REPLACING_CERTIFICATE 289 --# define SSL_R_NOT_SERVER 284 --# define SSL_R_NO_APPLICATION_PROTOCOL 235 --# define SSL_R_NO_CERTIFICATES_RETURNED 176 --# define SSL_R_NO_CERTIFICATE_ASSIGNED 177 --# define SSL_R_NO_CERTIFICATE_SET 179 --# define SSL_R_NO_CHANGE_FOLLOWING_HRR 214 --# define SSL_R_NO_CIPHERS_AVAILABLE 181 --# define SSL_R_NO_CIPHERS_SPECIFIED 183 --# define SSL_R_NO_CIPHER_MATCH 185 --# define SSL_R_NO_CLIENT_CERT_METHOD 331 --# define SSL_R_NO_COMPRESSION_SPECIFIED 187 --# define SSL_R_NO_COOKIE_CALLBACK_SET 287 --# define SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER 330 --# define SSL_R_NO_METHOD_SPECIFIED 188 --# define SSL_R_NO_PEM_EXTENSIONS 389 --# define SSL_R_NO_PRIVATE_KEY_ASSIGNED 190 --# define SSL_R_NO_PROTOCOLS_AVAILABLE 191 --# define SSL_R_NO_RENEGOTIATION 339 --# define SSL_R_NO_REQUIRED_DIGEST 324 --# define SSL_R_NO_SHARED_CIPHER 193 --# define SSL_R_NO_SHARED_GROUPS 410 --# define SSL_R_NO_SHARED_SIGNATURE_ALGORITHMS 376 --# define SSL_R_NO_SRTP_PROFILES 359 --# define SSL_R_NO_SUITABLE_KEY_SHARE 101 --# define SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM 118 --# define SSL_R_NO_VALID_SCTS 216 --# define SSL_R_NO_VERIFY_COOKIE_CALLBACK 403 --# define SSL_R_NULL_SSL_CTX 195 --# define SSL_R_NULL_SSL_METHOD_PASSED 196 --# define SSL_R_OCSP_CALLBACK_FAILURE 294 --# define SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED 197 --# define SSL_R_OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED 344 --# define SSL_R_OVERFLOW_ERROR 237 --# define SSL_R_PACKET_LENGTH_TOO_LONG 198 --# define SSL_R_PARSE_TLSEXT 227 --# define SSL_R_PATH_TOO_LONG 270 --# define SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE 199 --# define SSL_R_PEM_NAME_BAD_PREFIX 391 --# define SSL_R_PEM_NAME_TOO_SHORT 392 --# define SSL_R_PIPELINE_FAILURE 406 --# define SSL_R_POST_HANDSHAKE_AUTH_ENCODING_ERR 278 --# define SSL_R_PRIVATE_KEY_MISMATCH 288 --# define SSL_R_PROTOCOL_IS_SHUTDOWN 207 --# define SSL_R_PSK_IDENTITY_NOT_FOUND 223 --# define SSL_R_PSK_NO_CLIENT_CB 224 --# define SSL_R_PSK_NO_SERVER_CB 225 --# define SSL_R_READ_BIO_NOT_SET 211 --# define SSL_R_READ_TIMEOUT_EXPIRED 312 --# define SSL_R_RECORD_LENGTH_MISMATCH 213 --# define SSL_R_RECORD_TOO_SMALL 298 --# define SSL_R_RENEGOTIATE_EXT_TOO_LONG 335 --# define SSL_R_RENEGOTIATION_ENCODING_ERR 336 --# define SSL_R_RENEGOTIATION_MISMATCH 337 --# define SSL_R_REQUEST_PENDING 285 --# define SSL_R_REQUEST_SENT 286 --# define SSL_R_REQUIRED_CIPHER_MISSING 215 --# define SSL_R_REQUIRED_COMPRESSION_ALGORITHM_MISSING 342 --# define SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING 345 --# define SSL_R_SCT_VERIFICATION_FAILED 208 --# define SSL_R_SERVERHELLO_TLSEXT 275 --# define SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED 277 --# define SSL_R_SHUTDOWN_WHILE_IN_INIT 407 --# define SSL_R_SIGNATURE_ALGORITHMS_ERROR 360 --# define SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE 220 --# define SSL_R_SRP_A_CALC 361 --# define SSL_R_SRTP_COULD_NOT_ALLOCATE_PROFILES 362 --# define SSL_R_SRTP_PROTECTION_PROFILE_LIST_TOO_LONG 363 --# define SSL_R_SRTP_UNKNOWN_PROTECTION_PROFILE 364 --# define SSL_R_SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH 232 --# define SSL_R_SSL3_EXT_INVALID_SERVERNAME 319 --# define SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE 320 --# define SSL_R_SSL3_SESSION_ID_TOO_LONG 300 --# define SSL_R_SSLV3_ALERT_BAD_CERTIFICATE 1042 --# define SSL_R_SSLV3_ALERT_BAD_RECORD_MAC 1020 --# define SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED 1045 --# define SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED 1044 --# define SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN 1046 --# define SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE 1030 --# define SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE 1040 --# define SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER 1047 --# define SSL_R_SSLV3_ALERT_NO_CERTIFICATE 1041 --# define SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE 1010 --# define SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE 1043 --# define SSL_R_SSL_COMMAND_SECTION_EMPTY 117 --# define SSL_R_SSL_COMMAND_SECTION_NOT_FOUND 125 --# define SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION 228 --# define SSL_R_SSL_HANDSHAKE_FAILURE 229 --# define SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS 230 --# define SSL_R_SSL_NEGATIVE_LENGTH 372 --# define SSL_R_SSL_SECTION_EMPTY 126 --# define SSL_R_SSL_SECTION_NOT_FOUND 136 --# define SSL_R_SSL_SESSION_ID_CALLBACK_FAILED 301 --# define SSL_R_SSL_SESSION_ID_CONFLICT 302 --# define SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG 273 --# define SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH 303 --# define SSL_R_SSL_SESSION_ID_TOO_LONG 408 --# define SSL_R_SSL_SESSION_VERSION_MISMATCH 210 --# define SSL_R_STILL_IN_INIT 121 --# define SSL_R_TLSV13_ALERT_CERTIFICATE_REQUIRED 1116 --# define SSL_R_TLSV13_ALERT_MISSING_EXTENSION 1109 --# define SSL_R_TLSV1_ALERT_ACCESS_DENIED 1049 --# define SSL_R_TLSV1_ALERT_DECODE_ERROR 1050 --# define SSL_R_TLSV1_ALERT_DECRYPTION_FAILED 1021 --# define SSL_R_TLSV1_ALERT_DECRYPT_ERROR 1051 --# define SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION 1060 --# define SSL_R_TLSV1_ALERT_INAPPROPRIATE_FALLBACK 1086 --# define SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY 1071 --# define SSL_R_TLSV1_ALERT_INTERNAL_ERROR 1080 --# define SSL_R_TLSV1_ALERT_NO_RENEGOTIATION 1100 --# define SSL_R_TLSV1_ALERT_PROTOCOL_VERSION 1070 --# define SSL_R_TLSV1_ALERT_RECORD_OVERFLOW 1022 --# define SSL_R_TLSV1_ALERT_UNKNOWN_CA 1048 --# define SSL_R_TLSV1_ALERT_USER_CANCELLED 1090 --# define SSL_R_TLSV1_BAD_CERTIFICATE_HASH_VALUE 1114 --# define SSL_R_TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE 1113 --# define SSL_R_TLSV1_CERTIFICATE_UNOBTAINABLE 1111 --# define SSL_R_TLSV1_UNRECOGNIZED_NAME 1112 --# define SSL_R_TLSV1_UNSUPPORTED_EXTENSION 1110 --# define SSL_R_TLS_HEARTBEAT_PEER_DOESNT_ACCEPT 365 --# define SSL_R_TLS_HEARTBEAT_PENDING 366 --# define SSL_R_TLS_ILLEGAL_EXPORTER_LABEL 367 --# define SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST 157 --# define SSL_R_TOO_MANY_KEY_UPDATES 132 --# define SSL_R_TOO_MANY_WARN_ALERTS 409 --# define SSL_R_TOO_MUCH_EARLY_DATA 164 --# define SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS 314 --# define SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS 239 --# define SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES 242 --# define SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES 243 --# define SSL_R_UNEXPECTED_CCS_MESSAGE 262 --# define SSL_R_UNEXPECTED_END_OF_EARLY_DATA 178 --# define SSL_R_UNEXPECTED_MESSAGE 244 --# define SSL_R_UNEXPECTED_RECORD 245 --# define SSL_R_UNINITIALIZED 276 --# define SSL_R_UNKNOWN_ALERT_TYPE 246 --# define SSL_R_UNKNOWN_CERTIFICATE_TYPE 247 --# define SSL_R_UNKNOWN_CIPHER_RETURNED 248 --# define SSL_R_UNKNOWN_CIPHER_TYPE 249 --# define SSL_R_UNKNOWN_CMD_NAME 386 --# define SSL_R_UNKNOWN_COMMAND 139 --# define SSL_R_UNKNOWN_DIGEST 368 --# define SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE 250 --# define SSL_R_UNKNOWN_PKEY_TYPE 251 --# define SSL_R_UNKNOWN_PROTOCOL 252 --# define SSL_R_UNKNOWN_SSL_VERSION 254 --# define SSL_R_UNKNOWN_STATE 255 --# define SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED 338 --# define SSL_R_UNSOLICITED_EXTENSION 217 --# define SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM 257 --# define SSL_R_UNSUPPORTED_ELLIPTIC_CURVE 315 --# define SSL_R_UNSUPPORTED_PROTOCOL 258 --# define SSL_R_UNSUPPORTED_SSL_VERSION 259 --# define SSL_R_UNSUPPORTED_STATUS_TYPE 329 --# define SSL_R_USE_SRTP_NOT_NEGOTIATED 369 --# define SSL_R_VERSION_TOO_HIGH 166 --# define SSL_R_VERSION_TOO_LOW 396 --# define SSL_R_WRONG_CERTIFICATE_TYPE 383 --# define SSL_R_WRONG_CIPHER_RETURNED 261 --# define SSL_R_WRONG_CURVE 378 --# define SSL_R_WRONG_SIGNATURE_LENGTH 264 --# define SSL_R_WRONG_SIGNATURE_SIZE 265 --# define SSL_R_WRONG_SIGNATURE_TYPE 370 --# define SSL_R_WRONG_SSL_VERSION 266 --# define SSL_R_WRONG_VERSION_NUMBER 267 --# define SSL_R_X509_LIB 268 --# define SSL_R_X509_VERIFICATION_SETUP_PROBLEMS 269 -- --#endif -diff --git a/uadk_tool/include/openssl/stack.h b/uadk_tool/include/openssl/stack.h -deleted file mode 100644 -index cfc0750..0000000 ---- a/uadk_tool/include/openssl/stack.h -+++ /dev/null -@@ -1,83 +0,0 @@ --/* -- * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_STACK_H --# define HEADER_STACK_H -- --#ifdef __cplusplus --extern "C" { --#endif -- --typedef struct stack_st OPENSSL_STACK; /* Use STACK_OF(...) instead */ -- --typedef int (*OPENSSL_sk_compfunc)(const void *, const void *); --typedef void (*OPENSSL_sk_freefunc)(void *); --typedef void *(*OPENSSL_sk_copyfunc)(const void *); -- --int OPENSSL_sk_num(const OPENSSL_STACK *); --void *OPENSSL_sk_value(const OPENSSL_STACK *, int); -- --void *OPENSSL_sk_set(OPENSSL_STACK *st, int i, const void *data); -- --OPENSSL_STACK *OPENSSL_sk_new(OPENSSL_sk_compfunc cmp); --OPENSSL_STACK *OPENSSL_sk_new_null(void); --OPENSSL_STACK *OPENSSL_sk_new_reserve(OPENSSL_sk_compfunc c, int n); --int OPENSSL_sk_reserve(OPENSSL_STACK *st, int n); --void OPENSSL_sk_free(OPENSSL_STACK *); --void OPENSSL_sk_pop_free(OPENSSL_STACK *st, void (*func) (void *)); --OPENSSL_STACK *OPENSSL_sk_deep_copy(const OPENSSL_STACK *, -- OPENSSL_sk_copyfunc c, -- OPENSSL_sk_freefunc f); --int OPENSSL_sk_insert(OPENSSL_STACK *sk, const void *data, int where); --void *OPENSSL_sk_delete(OPENSSL_STACK *st, int loc); --void *OPENSSL_sk_delete_ptr(OPENSSL_STACK *st, const void *p); --int OPENSSL_sk_find(OPENSSL_STACK *st, const void *data); --int OPENSSL_sk_find_ex(OPENSSL_STACK *st, const void *data); --int OPENSSL_sk_push(OPENSSL_STACK *st, const void *data); --int OPENSSL_sk_unshift(OPENSSL_STACK *st, const void *data); --void *OPENSSL_sk_shift(OPENSSL_STACK *st); --void *OPENSSL_sk_pop(OPENSSL_STACK *st); --void OPENSSL_sk_zero(OPENSSL_STACK *st); --OPENSSL_sk_compfunc OPENSSL_sk_set_cmp_func(OPENSSL_STACK *sk, -- OPENSSL_sk_compfunc cmp); --OPENSSL_STACK *OPENSSL_sk_dup(const OPENSSL_STACK *st); --void OPENSSL_sk_sort(OPENSSL_STACK *st); --int OPENSSL_sk_is_sorted(const OPENSSL_STACK *st); -- --# if OPENSSL_API_COMPAT < 0x10100000L --# define _STACK OPENSSL_STACK --# define sk_num OPENSSL_sk_num --# define sk_value OPENSSL_sk_value --# define sk_set OPENSSL_sk_set --# define sk_new OPENSSL_sk_new --# define sk_new_null OPENSSL_sk_new_null --# define sk_free OPENSSL_sk_free --# define sk_pop_free OPENSSL_sk_pop_free --# define sk_deep_copy OPENSSL_sk_deep_copy --# define sk_insert OPENSSL_sk_insert --# define sk_delete OPENSSL_sk_delete --# define sk_delete_ptr OPENSSL_sk_delete_ptr --# define sk_find OPENSSL_sk_find --# define sk_find_ex OPENSSL_sk_find_ex --# define sk_push OPENSSL_sk_push --# define sk_unshift OPENSSL_sk_unshift --# define sk_shift OPENSSL_sk_shift --# define sk_pop OPENSSL_sk_pop --# define sk_zero OPENSSL_sk_zero --# define sk_set_cmp_func OPENSSL_sk_set_cmp_func --# define sk_dup OPENSSL_sk_dup --# define sk_sort OPENSSL_sk_sort --# define sk_is_sorted OPENSSL_sk_is_sorted --# endif -- --#ifdef __cplusplus --} --#endif -- --#endif -diff --git a/uadk_tool/include/openssl/store.h b/uadk_tool/include/openssl/store.h -deleted file mode 100644 -index a40a733..0000000 ---- a/uadk_tool/include/openssl/store.h -+++ /dev/null -@@ -1,266 +0,0 @@ --/* -- * Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_OSSL_STORE_H --# define HEADER_OSSL_STORE_H -- --# include --# include --# include --# include -- --# ifdef __cplusplus --extern "C" { --# endif -- --/*- -- * The main OSSL_STORE functions. -- * ------------------------------ -- * -- * These allow applications to open a channel to a resource with supported -- * data (keys, certs, crls, ...), read the data a piece at a time and decide -- * what to do with it, and finally close. -- */ -- --typedef struct ossl_store_ctx_st OSSL_STORE_CTX; -- --/* -- * Typedef for the OSSL_STORE_INFO post processing callback. This can be used -- * to massage the given OSSL_STORE_INFO, or to drop it entirely (by returning -- * NULL). -- */ --typedef OSSL_STORE_INFO *(*OSSL_STORE_post_process_info_fn)(OSSL_STORE_INFO *, -- void *); -- --/* -- * Open a channel given a URI. The given UI method will be used any time the -- * loader needs extra input, for example when a password or pin is needed, and -- * will be passed the same user data every time it's needed in this context. -- * -- * Returns a context reference which represents the channel to communicate -- * through. -- */ --OSSL_STORE_CTX *OSSL_STORE_open(const char *uri, const UI_METHOD *ui_method, -- void *ui_data, -- OSSL_STORE_post_process_info_fn post_process, -- void *post_process_data); -- --/* -- * Control / fine tune the OSSL_STORE channel. |cmd| determines what is to be -- * done, and depends on the underlying loader (use OSSL_STORE_get0_scheme to -- * determine which loader is used), except for common commands (see below). -- * Each command takes different arguments. -- */ --int OSSL_STORE_ctrl(OSSL_STORE_CTX *ctx, int cmd, ... /* args */); --int OSSL_STORE_vctrl(OSSL_STORE_CTX *ctx, int cmd, va_list args); -- --/* -- * Common ctrl commands that different loaders may choose to support. -- */ --/* int on = 0 or 1; STORE_ctrl(ctx, STORE_C_USE_SECMEM, &on); */ --# define OSSL_STORE_C_USE_SECMEM 1 --/* Where custom commands start */ --# define OSSL_STORE_C_CUSTOM_START 100 -- --/* -- * Read one data item (a key, a cert, a CRL) that is supported by the OSSL_STORE -- * functionality, given a context. -- * Returns a OSSL_STORE_INFO pointer, from which OpenSSL typed data can be -- * extracted with OSSL_STORE_INFO_get0_PKEY(), OSSL_STORE_INFO_get0_CERT(), ... -- * NULL is returned on error, which may include that the data found at the URI -- * can't be figured out for certain or is ambiguous. -- */ --OSSL_STORE_INFO *OSSL_STORE_load(OSSL_STORE_CTX *ctx); -- --/* -- * Check if end of data (end of file) is reached -- * Returns 1 on end, 0 otherwise. -- */ --int OSSL_STORE_eof(OSSL_STORE_CTX *ctx); -- --/* -- * Check if an error occurred -- * Returns 1 if it did, 0 otherwise. -- */ --int OSSL_STORE_error(OSSL_STORE_CTX *ctx); -- --/* -- * Close the channel -- * Returns 1 on success, 0 on error. -- */ --int OSSL_STORE_close(OSSL_STORE_CTX *ctx); -- -- --/*- -- * Extracting OpenSSL types from and creating new OSSL_STORE_INFOs -- * --------------------------------------------------------------- -- */ -- --/* -- * Types of data that can be ossl_stored in a OSSL_STORE_INFO. -- * OSSL_STORE_INFO_NAME is typically found when getting a listing of -- * available "files" / "tokens" / what have you. -- */ --# define OSSL_STORE_INFO_NAME 1 /* char * */ --# define OSSL_STORE_INFO_PARAMS 2 /* EVP_PKEY * */ --# define OSSL_STORE_INFO_PKEY 3 /* EVP_PKEY * */ --# define OSSL_STORE_INFO_CERT 4 /* X509 * */ --# define OSSL_STORE_INFO_CRL 5 /* X509_CRL * */ -- --/* -- * Functions to generate OSSL_STORE_INFOs, one function for each type we -- * support having in them, as well as a generic constructor. -- * -- * In all cases, ownership of the object is transferred to the OSSL_STORE_INFO -- * and will therefore be freed when the OSSL_STORE_INFO is freed. -- */ --OSSL_STORE_INFO *OSSL_STORE_INFO_new_NAME(char *name); --int OSSL_STORE_INFO_set0_NAME_description(OSSL_STORE_INFO *info, char *desc); --OSSL_STORE_INFO *OSSL_STORE_INFO_new_PARAMS(EVP_PKEY *params); --OSSL_STORE_INFO *OSSL_STORE_INFO_new_PKEY(EVP_PKEY *pkey); --OSSL_STORE_INFO *OSSL_STORE_INFO_new_CERT(X509 *x509); --OSSL_STORE_INFO *OSSL_STORE_INFO_new_CRL(X509_CRL *crl); -- --/* -- * Functions to try to extract data from a OSSL_STORE_INFO. -- */ --int OSSL_STORE_INFO_get_type(const OSSL_STORE_INFO *info); --const char *OSSL_STORE_INFO_get0_NAME(const OSSL_STORE_INFO *info); --char *OSSL_STORE_INFO_get1_NAME(const OSSL_STORE_INFO *info); --const char *OSSL_STORE_INFO_get0_NAME_description(const OSSL_STORE_INFO *info); --char *OSSL_STORE_INFO_get1_NAME_description(const OSSL_STORE_INFO *info); --EVP_PKEY *OSSL_STORE_INFO_get0_PARAMS(const OSSL_STORE_INFO *info); --EVP_PKEY *OSSL_STORE_INFO_get1_PARAMS(const OSSL_STORE_INFO *info); --EVP_PKEY *OSSL_STORE_INFO_get0_PKEY(const OSSL_STORE_INFO *info); --EVP_PKEY *OSSL_STORE_INFO_get1_PKEY(const OSSL_STORE_INFO *info); --X509 *OSSL_STORE_INFO_get0_CERT(const OSSL_STORE_INFO *info); --X509 *OSSL_STORE_INFO_get1_CERT(const OSSL_STORE_INFO *info); --X509_CRL *OSSL_STORE_INFO_get0_CRL(const OSSL_STORE_INFO *info); --X509_CRL *OSSL_STORE_INFO_get1_CRL(const OSSL_STORE_INFO *info); -- --const char *OSSL_STORE_INFO_type_string(int type); -- --/* -- * Free the OSSL_STORE_INFO -- */ --void OSSL_STORE_INFO_free(OSSL_STORE_INFO *info); -- -- --/*- -- * Functions to construct a search URI from a base URI and search criteria -- * ----------------------------------------------------------------------- -- */ -- --/* OSSL_STORE search types */ --# define OSSL_STORE_SEARCH_BY_NAME 1 /* subject in certs, issuer in CRLs */ --# define OSSL_STORE_SEARCH_BY_ISSUER_SERIAL 2 --# define OSSL_STORE_SEARCH_BY_KEY_FINGERPRINT 3 --# define OSSL_STORE_SEARCH_BY_ALIAS 4 -- --/* To check what search types the scheme handler supports */ --int OSSL_STORE_supports_search(OSSL_STORE_CTX *ctx, int search_type); -- --/* Search term constructors */ --/* -- * The input is considered to be owned by the caller, and must therefore -- * remain present throughout the lifetime of the returned OSSL_STORE_SEARCH -- */ --OSSL_STORE_SEARCH *OSSL_STORE_SEARCH_by_name(X509_NAME *name); --OSSL_STORE_SEARCH *OSSL_STORE_SEARCH_by_issuer_serial(X509_NAME *name, -- const ASN1_INTEGER -- *serial); --OSSL_STORE_SEARCH *OSSL_STORE_SEARCH_by_key_fingerprint(const EVP_MD *digest, -- const unsigned char -- *bytes, size_t len); --OSSL_STORE_SEARCH *OSSL_STORE_SEARCH_by_alias(const char *alias); -- --/* Search term destructor */ --void OSSL_STORE_SEARCH_free(OSSL_STORE_SEARCH *search); -- --/* Search term accessors */ --int OSSL_STORE_SEARCH_get_type(const OSSL_STORE_SEARCH *criterion); --X509_NAME *OSSL_STORE_SEARCH_get0_name(OSSL_STORE_SEARCH *criterion); --const ASN1_INTEGER *OSSL_STORE_SEARCH_get0_serial(const OSSL_STORE_SEARCH -- *criterion); --const unsigned char *OSSL_STORE_SEARCH_get0_bytes(const OSSL_STORE_SEARCH -- *criterion, size_t *length); --const char *OSSL_STORE_SEARCH_get0_string(const OSSL_STORE_SEARCH *criterion); --const EVP_MD *OSSL_STORE_SEARCH_get0_digest(const OSSL_STORE_SEARCH *criterion); -- --/* -- * Add search criterion and expected return type (which can be unspecified) -- * to the loading channel. This MUST happen before the first OSSL_STORE_load(). -- */ --int OSSL_STORE_expect(OSSL_STORE_CTX *ctx, int expected_type); --int OSSL_STORE_find(OSSL_STORE_CTX *ctx, OSSL_STORE_SEARCH *search); -- -- --/*- -- * Function to register a loader for the given URI scheme. -- * ------------------------------------------------------- -- * -- * The loader receives all the main components of an URI except for the -- * scheme. -- */ -- --typedef struct ossl_store_loader_st OSSL_STORE_LOADER; --OSSL_STORE_LOADER *OSSL_STORE_LOADER_new(ENGINE *e, const char *scheme); --const ENGINE *OSSL_STORE_LOADER_get0_engine(const OSSL_STORE_LOADER *loader); --const char *OSSL_STORE_LOADER_get0_scheme(const OSSL_STORE_LOADER *loader); --/* struct ossl_store_loader_ctx_st is defined differently by each loader */ --typedef struct ossl_store_loader_ctx_st OSSL_STORE_LOADER_CTX; --typedef OSSL_STORE_LOADER_CTX *(*OSSL_STORE_open_fn)(const OSSL_STORE_LOADER -- *loader, -- const char *uri, -- const UI_METHOD *ui_method, -- void *ui_data); --int OSSL_STORE_LOADER_set_open(OSSL_STORE_LOADER *loader, -- OSSL_STORE_open_fn open_function); --typedef int (*OSSL_STORE_ctrl_fn)(OSSL_STORE_LOADER_CTX *ctx, int cmd, -- va_list args); --int OSSL_STORE_LOADER_set_ctrl(OSSL_STORE_LOADER *loader, -- OSSL_STORE_ctrl_fn ctrl_function); --typedef int (*OSSL_STORE_expect_fn)(OSSL_STORE_LOADER_CTX *ctx, int expected); --int OSSL_STORE_LOADER_set_expect(OSSL_STORE_LOADER *loader, -- OSSL_STORE_expect_fn expect_function); --typedef int (*OSSL_STORE_find_fn)(OSSL_STORE_LOADER_CTX *ctx, -- OSSL_STORE_SEARCH *criteria); --int OSSL_STORE_LOADER_set_find(OSSL_STORE_LOADER *loader, -- OSSL_STORE_find_fn find_function); --typedef OSSL_STORE_INFO *(*OSSL_STORE_load_fn)(OSSL_STORE_LOADER_CTX *ctx, -- const UI_METHOD *ui_method, -- void *ui_data); --int OSSL_STORE_LOADER_set_load(OSSL_STORE_LOADER *loader, -- OSSL_STORE_load_fn load_function); --typedef int (*OSSL_STORE_eof_fn)(OSSL_STORE_LOADER_CTX *ctx); --int OSSL_STORE_LOADER_set_eof(OSSL_STORE_LOADER *loader, -- OSSL_STORE_eof_fn eof_function); --typedef int (*OSSL_STORE_error_fn)(OSSL_STORE_LOADER_CTX *ctx); --int OSSL_STORE_LOADER_set_error(OSSL_STORE_LOADER *loader, -- OSSL_STORE_error_fn error_function); --typedef int (*OSSL_STORE_close_fn)(OSSL_STORE_LOADER_CTX *ctx); --int OSSL_STORE_LOADER_set_close(OSSL_STORE_LOADER *loader, -- OSSL_STORE_close_fn close_function); --void OSSL_STORE_LOADER_free(OSSL_STORE_LOADER *loader); -- --int OSSL_STORE_register_loader(OSSL_STORE_LOADER *loader); --OSSL_STORE_LOADER *OSSL_STORE_unregister_loader(const char *scheme); -- --/*- -- * Functions to list STORE loaders -- * ------------------------------- -- */ --int OSSL_STORE_do_all_loaders(void (*do_function) (const OSSL_STORE_LOADER -- *loader, void *do_arg), -- void *do_arg); -- --# ifdef __cplusplus --} --# endif --#endif -diff --git a/uadk_tool/include/openssl/storeerr.h b/uadk_tool/include/openssl/storeerr.h -deleted file mode 100644 -index 190eab0..0000000 ---- a/uadk_tool/include/openssl/storeerr.h -+++ /dev/null -@@ -1,91 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_OSSL_STOREERR_H --# define HEADER_OSSL_STOREERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_OSSL_STORE_strings(void); -- --/* -- * OSSL_STORE function codes. -- */ --# define OSSL_STORE_F_FILE_CTRL 129 --# define OSSL_STORE_F_FILE_FIND 138 --# define OSSL_STORE_F_FILE_GET_PASS 118 --# define OSSL_STORE_F_FILE_LOAD 119 --# define OSSL_STORE_F_FILE_LOAD_TRY_DECODE 124 --# define OSSL_STORE_F_FILE_NAME_TO_URI 126 --# define OSSL_STORE_F_FILE_OPEN 120 --# define OSSL_STORE_F_OSSL_STORE_ATTACH_PEM_BIO 127 --# define OSSL_STORE_F_OSSL_STORE_EXPECT 130 --# define OSSL_STORE_F_OSSL_STORE_FILE_ATTACH_PEM_BIO_INT 128 --# define OSSL_STORE_F_OSSL_STORE_FIND 131 --# define OSSL_STORE_F_OSSL_STORE_GET0_LOADER_INT 100 --# define OSSL_STORE_F_OSSL_STORE_INFO_GET1_CERT 101 --# define OSSL_STORE_F_OSSL_STORE_INFO_GET1_CRL 102 --# define OSSL_STORE_F_OSSL_STORE_INFO_GET1_NAME 103 --# define OSSL_STORE_F_OSSL_STORE_INFO_GET1_NAME_DESCRIPTION 135 --# define OSSL_STORE_F_OSSL_STORE_INFO_GET1_PARAMS 104 --# define OSSL_STORE_F_OSSL_STORE_INFO_GET1_PKEY 105 --# define OSSL_STORE_F_OSSL_STORE_INFO_NEW_CERT 106 --# define OSSL_STORE_F_OSSL_STORE_INFO_NEW_CRL 107 --# define OSSL_STORE_F_OSSL_STORE_INFO_NEW_EMBEDDED 123 --# define OSSL_STORE_F_OSSL_STORE_INFO_NEW_NAME 109 --# define OSSL_STORE_F_OSSL_STORE_INFO_NEW_PARAMS 110 --# define OSSL_STORE_F_OSSL_STORE_INFO_NEW_PKEY 111 --# define OSSL_STORE_F_OSSL_STORE_INFO_SET0_NAME_DESCRIPTION 134 --# define OSSL_STORE_F_OSSL_STORE_INIT_ONCE 112 --# define OSSL_STORE_F_OSSL_STORE_LOADER_NEW 113 --# define OSSL_STORE_F_OSSL_STORE_OPEN 114 --# define OSSL_STORE_F_OSSL_STORE_OPEN_INT 115 --# define OSSL_STORE_F_OSSL_STORE_REGISTER_LOADER_INT 117 --# define OSSL_STORE_F_OSSL_STORE_SEARCH_BY_ALIAS 132 --# define OSSL_STORE_F_OSSL_STORE_SEARCH_BY_ISSUER_SERIAL 133 --# define OSSL_STORE_F_OSSL_STORE_SEARCH_BY_KEY_FINGERPRINT 136 --# define OSSL_STORE_F_OSSL_STORE_SEARCH_BY_NAME 137 --# define OSSL_STORE_F_OSSL_STORE_UNREGISTER_LOADER_INT 116 --# define OSSL_STORE_F_TRY_DECODE_PARAMS 121 --# define OSSL_STORE_F_TRY_DECODE_PKCS12 122 --# define OSSL_STORE_F_TRY_DECODE_PKCS8ENCRYPTED 125 -- --/* -- * OSSL_STORE reason codes. -- */ --# define OSSL_STORE_R_AMBIGUOUS_CONTENT_TYPE 107 --# define OSSL_STORE_R_BAD_PASSWORD_READ 115 --# define OSSL_STORE_R_ERROR_VERIFYING_PKCS12_MAC 113 --# define OSSL_STORE_R_FINGERPRINT_SIZE_DOES_NOT_MATCH_DIGEST 121 --# define OSSL_STORE_R_INVALID_SCHEME 106 --# define OSSL_STORE_R_IS_NOT_A 112 --# define OSSL_STORE_R_LOADER_INCOMPLETE 116 --# define OSSL_STORE_R_LOADING_STARTED 117 --# define OSSL_STORE_R_NOT_A_CERTIFICATE 100 --# define OSSL_STORE_R_NOT_A_CRL 101 --# define OSSL_STORE_R_NOT_A_KEY 102 --# define OSSL_STORE_R_NOT_A_NAME 103 --# define OSSL_STORE_R_NOT_PARAMETERS 104 --# define OSSL_STORE_R_PASSPHRASE_CALLBACK_ERROR 114 --# define OSSL_STORE_R_PATH_MUST_BE_ABSOLUTE 108 --# define OSSL_STORE_R_SEARCH_ONLY_SUPPORTED_FOR_DIRECTORIES 119 --# define OSSL_STORE_R_UI_PROCESS_INTERRUPTED_OR_CANCELLED 109 --# define OSSL_STORE_R_UNREGISTERED_SCHEME 105 --# define OSSL_STORE_R_UNSUPPORTED_CONTENT_TYPE 110 --# define OSSL_STORE_R_UNSUPPORTED_OPERATION 118 --# define OSSL_STORE_R_UNSUPPORTED_SEARCH_TYPE 120 --# define OSSL_STORE_R_URI_AUTHORITY_UNSUPPORTED 111 -- --#endif -diff --git a/uadk_tool/include/openssl/symhacks.h b/uadk_tool/include/openssl/symhacks.h -deleted file mode 100644 -index 156ea6e..0000000 ---- a/uadk_tool/include/openssl/symhacks.h -+++ /dev/null -@@ -1,37 +0,0 @@ --/* -- * Copyright 1999-2018 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_SYMHACKS_H --# define HEADER_SYMHACKS_H -- --# include -- --/* Case insensitive linking causes problems.... */ --# if defined(OPENSSL_SYS_VMS) --# undef ERR_load_CRYPTO_strings --# define ERR_load_CRYPTO_strings ERR_load_CRYPTOlib_strings --# undef OCSP_crlID_new --# define OCSP_crlID_new OCSP_crlID2_new -- --# undef d2i_ECPARAMETERS --# define d2i_ECPARAMETERS d2i_UC_ECPARAMETERS --# undef i2d_ECPARAMETERS --# define i2d_ECPARAMETERS i2d_UC_ECPARAMETERS --# undef d2i_ECPKPARAMETERS --# define d2i_ECPKPARAMETERS d2i_UC_ECPKPARAMETERS --# undef i2d_ECPKPARAMETERS --# define i2d_ECPKPARAMETERS i2d_UC_ECPKPARAMETERS -- --/* This one clashes with CMS_data_create */ --# undef cms_Data_create --# define cms_Data_create priv_cms_Data_create -- --# endif -- --#endif /* ! defined HEADER_VMS_IDHACKS_H */ -diff --git a/uadk_tool/include/openssl/tls1.h b/uadk_tool/include/openssl/tls1.h -deleted file mode 100644 -index 76d9fda..0000000 ---- a/uadk_tool/include/openssl/tls1.h -+++ /dev/null -@@ -1,1237 +0,0 @@ --/* -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved -- * Copyright 2005 Nokia. All rights reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_TLS1_H --# define HEADER_TLS1_H -- --# include --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --/* Default security level if not overridden at config time */ --# ifndef OPENSSL_TLS_SECURITY_LEVEL --# define OPENSSL_TLS_SECURITY_LEVEL 1 --# endif -- --# define TLS1_VERSION 0x0301 --# define TLS1_1_VERSION 0x0302 --# define TLS1_2_VERSION 0x0303 --# define TLS1_3_VERSION 0x0304 --# define TLS_MAX_VERSION TLS1_3_VERSION -- --/* Special value for method supporting multiple versions */ --# define TLS_ANY_VERSION 0x10000 -- --# define TLS1_VERSION_MAJOR 0x03 --# define TLS1_VERSION_MINOR 0x01 -- --# define TLS1_1_VERSION_MAJOR 0x03 --# define TLS1_1_VERSION_MINOR 0x02 -- --# define TLS1_2_VERSION_MAJOR 0x03 --# define TLS1_2_VERSION_MINOR 0x03 -- --# define TLS1_get_version(s) \ -- ((SSL_version(s) >> 8) == TLS1_VERSION_MAJOR ? SSL_version(s) : 0) -- --# define TLS1_get_client_version(s) \ -- ((SSL_client_version(s) >> 8) == TLS1_VERSION_MAJOR ? SSL_client_version(s) : 0) -- --# define TLS1_AD_DECRYPTION_FAILED 21 --# define TLS1_AD_RECORD_OVERFLOW 22 --# define TLS1_AD_UNKNOWN_CA 48/* fatal */ --# define TLS1_AD_ACCESS_DENIED 49/* fatal */ --# define TLS1_AD_DECODE_ERROR 50/* fatal */ --# define TLS1_AD_DECRYPT_ERROR 51 --# define TLS1_AD_EXPORT_RESTRICTION 60/* fatal */ --# define TLS1_AD_PROTOCOL_VERSION 70/* fatal */ --# define TLS1_AD_INSUFFICIENT_SECURITY 71/* fatal */ --# define TLS1_AD_INTERNAL_ERROR 80/* fatal */ --# define TLS1_AD_INAPPROPRIATE_FALLBACK 86/* fatal */ --# define TLS1_AD_USER_CANCELLED 90 --# define TLS1_AD_NO_RENEGOTIATION 100 --/* TLSv1.3 alerts */ --# define TLS13_AD_MISSING_EXTENSION 109 /* fatal */ --# define TLS13_AD_CERTIFICATE_REQUIRED 116 /* fatal */ --/* codes 110-114 are from RFC3546 */ --# define TLS1_AD_UNSUPPORTED_EXTENSION 110 --# define TLS1_AD_CERTIFICATE_UNOBTAINABLE 111 --# define TLS1_AD_UNRECOGNIZED_NAME 112 --# define TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE 113 --# define TLS1_AD_BAD_CERTIFICATE_HASH_VALUE 114 --# define TLS1_AD_UNKNOWN_PSK_IDENTITY 115/* fatal */ --# define TLS1_AD_NO_APPLICATION_PROTOCOL 120 /* fatal */ -- --/* ExtensionType values from RFC3546 / RFC4366 / RFC6066 */ --# define TLSEXT_TYPE_server_name 0 --# define TLSEXT_TYPE_max_fragment_length 1 --# define TLSEXT_TYPE_client_certificate_url 2 --# define TLSEXT_TYPE_trusted_ca_keys 3 --# define TLSEXT_TYPE_truncated_hmac 4 --# define TLSEXT_TYPE_status_request 5 --/* ExtensionType values from RFC4681 */ --# define TLSEXT_TYPE_user_mapping 6 --/* ExtensionType values from RFC5878 */ --# define TLSEXT_TYPE_client_authz 7 --# define TLSEXT_TYPE_server_authz 8 --/* ExtensionType values from RFC6091 */ --# define TLSEXT_TYPE_cert_type 9 -- --/* ExtensionType values from RFC4492 */ --/* -- * Prior to TLSv1.3 the supported_groups extension was known as -- * elliptic_curves -- */ --# define TLSEXT_TYPE_supported_groups 10 --# define TLSEXT_TYPE_elliptic_curves TLSEXT_TYPE_supported_groups --# define TLSEXT_TYPE_ec_point_formats 11 -- -- --/* ExtensionType value from RFC5054 */ --# define TLSEXT_TYPE_srp 12 -- --/* ExtensionType values from RFC5246 */ --# define TLSEXT_TYPE_signature_algorithms 13 -- --/* ExtensionType value from RFC5764 */ --# define TLSEXT_TYPE_use_srtp 14 -- --/* ExtensionType value from RFC5620 */ --# define TLSEXT_TYPE_heartbeat 15 -- --/* ExtensionType value from RFC7301 */ --# define TLSEXT_TYPE_application_layer_protocol_negotiation 16 -- --/* -- * Extension type for Certificate Transparency -- * https://tools.ietf.org/html/rfc6962#section-3.3.1 -- */ --# define TLSEXT_TYPE_signed_certificate_timestamp 18 -- --/* -- * ExtensionType value for TLS padding extension. -- * http://tools.ietf.org/html/draft-agl-tls-padding -- */ --# define TLSEXT_TYPE_padding 21 -- --/* ExtensionType value from RFC7366 */ --# define TLSEXT_TYPE_encrypt_then_mac 22 -- --/* ExtensionType value from RFC7627 */ --# define TLSEXT_TYPE_extended_master_secret 23 -- --/* ExtensionType value from RFC4507 */ --# define TLSEXT_TYPE_session_ticket 35 -- --/* As defined for TLS1.3 */ --# define TLSEXT_TYPE_psk 41 --# define TLSEXT_TYPE_early_data 42 --# define TLSEXT_TYPE_supported_versions 43 --# define TLSEXT_TYPE_cookie 44 --# define TLSEXT_TYPE_psk_kex_modes 45 --# define TLSEXT_TYPE_certificate_authorities 47 --# define TLSEXT_TYPE_post_handshake_auth 49 --# define TLSEXT_TYPE_signature_algorithms_cert 50 --# define TLSEXT_TYPE_key_share 51 -- --/* Temporary extension type */ --# define TLSEXT_TYPE_renegotiate 0xff01 -- --# ifndef OPENSSL_NO_NEXTPROTONEG --/* This is not an IANA defined extension number */ --# define TLSEXT_TYPE_next_proto_neg 13172 --# endif -- --/* NameType value from RFC3546 */ --# define TLSEXT_NAMETYPE_host_name 0 --/* status request value from RFC3546 */ --# define TLSEXT_STATUSTYPE_ocsp 1 -- --/* ECPointFormat values from RFC4492 */ --# define TLSEXT_ECPOINTFORMAT_first 0 --# define TLSEXT_ECPOINTFORMAT_uncompressed 0 --# define TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime 1 --# define TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2 2 --# define TLSEXT_ECPOINTFORMAT_last 2 -- --/* Signature and hash algorithms from RFC5246 */ --# define TLSEXT_signature_anonymous 0 --# define TLSEXT_signature_rsa 1 --# define TLSEXT_signature_dsa 2 --# define TLSEXT_signature_ecdsa 3 --# define TLSEXT_signature_gostr34102001 237 --# define TLSEXT_signature_gostr34102012_256 238 --# define TLSEXT_signature_gostr34102012_512 239 -- --/* Total number of different signature algorithms */ --# define TLSEXT_signature_num 7 -- --# define TLSEXT_hash_none 0 --# define TLSEXT_hash_md5 1 --# define TLSEXT_hash_sha1 2 --# define TLSEXT_hash_sha224 3 --# define TLSEXT_hash_sha256 4 --# define TLSEXT_hash_sha384 5 --# define TLSEXT_hash_sha512 6 --# define TLSEXT_hash_gostr3411 237 --# define TLSEXT_hash_gostr34112012_256 238 --# define TLSEXT_hash_gostr34112012_512 239 -- --/* Total number of different digest algorithms */ -- --# define TLSEXT_hash_num 10 -- --/* Flag set for unrecognised algorithms */ --# define TLSEXT_nid_unknown 0x1000000 -- --/* ECC curves */ -- --# define TLSEXT_curve_P_256 23 --# define TLSEXT_curve_P_384 24 -- --/* OpenSSL value to disable maximum fragment length extension */ --# define TLSEXT_max_fragment_length_DISABLED 0 --/* Allowed values for max fragment length extension */ --# define TLSEXT_max_fragment_length_512 1 --# define TLSEXT_max_fragment_length_1024 2 --# define TLSEXT_max_fragment_length_2048 3 --# define TLSEXT_max_fragment_length_4096 4 -- --int SSL_CTX_set_tlsext_max_fragment_length(SSL_CTX *ctx, uint8_t mode); --int SSL_set_tlsext_max_fragment_length(SSL *ssl, uint8_t mode); -- --# define TLSEXT_MAXLEN_host_name 255 -- --__owur const char *SSL_get_servername(const SSL *s, const int type); --__owur int SSL_get_servername_type(const SSL *s); --/* -- * SSL_export_keying_material exports a value derived from the master secret, -- * as specified in RFC 5705. It writes |olen| bytes to |out| given a label and -- * optional context. (Since a zero length context is allowed, the |use_context| -- * flag controls whether a context is included.) It returns 1 on success and -- * 0 or -1 otherwise. -- */ --__owur int SSL_export_keying_material(SSL *s, unsigned char *out, size_t olen, -- const char *label, size_t llen, -- const unsigned char *context, -- size_t contextlen, int use_context); -- --/* -- * SSL_export_keying_material_early exports a value derived from the -- * early exporter master secret, as specified in -- * https://tools.ietf.org/html/draft-ietf-tls-tls13-23. It writes -- * |olen| bytes to |out| given a label and optional context. It -- * returns 1 on success and 0 otherwise. -- */ --__owur int SSL_export_keying_material_early(SSL *s, unsigned char *out, -- size_t olen, const char *label, -- size_t llen, -- const unsigned char *context, -- size_t contextlen); -- --int SSL_get_peer_signature_type_nid(const SSL *s, int *pnid); --int SSL_get_signature_type_nid(const SSL *s, int *pnid); -- --int SSL_get_sigalgs(SSL *s, int idx, -- int *psign, int *phash, int *psignandhash, -- unsigned char *rsig, unsigned char *rhash); -- --int SSL_get_shared_sigalgs(SSL *s, int idx, -- int *psign, int *phash, int *psignandhash, -- unsigned char *rsig, unsigned char *rhash); -- --__owur int SSL_check_chain(SSL *s, X509 *x, EVP_PKEY *pk, STACK_OF(X509) *chain); -- --# define SSL_set_tlsext_host_name(s,name) \ -- SSL_ctrl(s,SSL_CTRL_SET_TLSEXT_HOSTNAME,TLSEXT_NAMETYPE_host_name,\ -- (void *)name) -- --# define SSL_set_tlsext_debug_callback(ssl, cb) \ -- SSL_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_DEBUG_CB,\ -- (void (*)(void))cb) -- --# define SSL_set_tlsext_debug_arg(ssl, arg) \ -- SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_DEBUG_ARG,0,arg) -- --# define SSL_get_tlsext_status_type(ssl) \ -- SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_TYPE,0,NULL) -- --# define SSL_set_tlsext_status_type(ssl, type) \ -- SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE,type,NULL) -- --# define SSL_get_tlsext_status_exts(ssl, arg) \ -- SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS,0,arg) -- --# define SSL_set_tlsext_status_exts(ssl, arg) \ -- SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS,0,arg) -- --# define SSL_get_tlsext_status_ids(ssl, arg) \ -- SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS,0,arg) -- --# define SSL_set_tlsext_status_ids(ssl, arg) \ -- SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS,0,arg) -- --# define SSL_get_tlsext_status_ocsp_resp(ssl, arg) \ -- SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP,0,arg) -- --# define SSL_set_tlsext_status_ocsp_resp(ssl, arg, arglen) \ -- SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP,arglen,arg) -- --# define SSL_CTX_set_tlsext_servername_callback(ctx, cb) \ -- SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TLSEXT_SERVERNAME_CB,\ -- (void (*)(void))cb) -- --# define SSL_TLSEXT_ERR_OK 0 --# define SSL_TLSEXT_ERR_ALERT_WARNING 1 --# define SSL_TLSEXT_ERR_ALERT_FATAL 2 --# define SSL_TLSEXT_ERR_NOACK 3 -- --# define SSL_CTX_set_tlsext_servername_arg(ctx, arg) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG,0,arg) -- --# define SSL_CTX_get_tlsext_ticket_keys(ctx, keys, keylen) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_GET_TLSEXT_TICKET_KEYS,keylen,keys) --# define SSL_CTX_set_tlsext_ticket_keys(ctx, keys, keylen) \ -- SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TLSEXT_TICKET_KEYS,keylen,keys) -- --# define SSL_CTX_get_tlsext_status_cb(ssl, cb) \ -- SSL_CTX_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB,0,(void *)cb) --# define SSL_CTX_set_tlsext_status_cb(ssl, cb) \ -- SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB,\ -- (void (*)(void))cb) -- --# define SSL_CTX_get_tlsext_status_arg(ssl, arg) \ -- SSL_CTX_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG,0,arg) --# define SSL_CTX_set_tlsext_status_arg(ssl, arg) \ -- SSL_CTX_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG,0,arg) -- --# define SSL_CTX_set_tlsext_status_type(ssl, type) \ -- SSL_CTX_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE,type,NULL) -- --# define SSL_CTX_get_tlsext_status_type(ssl) \ -- SSL_CTX_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_TYPE,0,NULL) -- --# define SSL_CTX_set_tlsext_ticket_key_cb(ssl, cb) \ -- SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB,\ -- (void (*)(void))cb) -- --# ifndef OPENSSL_NO_HEARTBEATS --# define SSL_DTLSEXT_HB_ENABLED 0x01 --# define SSL_DTLSEXT_HB_DONT_SEND_REQUESTS 0x02 --# define SSL_DTLSEXT_HB_DONT_RECV_REQUESTS 0x04 --# define SSL_get_dtlsext_heartbeat_pending(ssl) \ -- SSL_ctrl(ssl,SSL_CTRL_GET_DTLS_EXT_HEARTBEAT_PENDING,0,NULL) --# define SSL_set_dtlsext_heartbeat_no_requests(ssl, arg) \ -- SSL_ctrl(ssl,SSL_CTRL_SET_DTLS_EXT_HEARTBEAT_NO_REQUESTS,arg,NULL) -- --# if OPENSSL_API_COMPAT < 0x10100000L --# define SSL_CTRL_TLS_EXT_SEND_HEARTBEAT \ -- SSL_CTRL_DTLS_EXT_SEND_HEARTBEAT --# define SSL_CTRL_GET_TLS_EXT_HEARTBEAT_PENDING \ -- SSL_CTRL_GET_DTLS_EXT_HEARTBEAT_PENDING --# define SSL_CTRL_SET_TLS_EXT_HEARTBEAT_NO_REQUESTS \ -- SSL_CTRL_SET_DTLS_EXT_HEARTBEAT_NO_REQUESTS --# define SSL_TLSEXT_HB_ENABLED \ -- SSL_DTLSEXT_HB_ENABLED --# define SSL_TLSEXT_HB_DONT_SEND_REQUESTS \ -- SSL_DTLSEXT_HB_DONT_SEND_REQUESTS --# define SSL_TLSEXT_HB_DONT_RECV_REQUESTS \ -- SSL_DTLSEXT_HB_DONT_RECV_REQUESTS --# define SSL_get_tlsext_heartbeat_pending(ssl) \ -- SSL_get_dtlsext_heartbeat_pending(ssl) --# define SSL_set_tlsext_heartbeat_no_requests(ssl, arg) \ -- SSL_set_dtlsext_heartbeat_no_requests(ssl,arg) --# endif --# endif -- --/* PSK ciphersuites from 4279 */ --# define TLS1_CK_PSK_WITH_RC4_128_SHA 0x0300008A --# define TLS1_CK_PSK_WITH_3DES_EDE_CBC_SHA 0x0300008B --# define TLS1_CK_PSK_WITH_AES_128_CBC_SHA 0x0300008C --# define TLS1_CK_PSK_WITH_AES_256_CBC_SHA 0x0300008D --# define TLS1_CK_DHE_PSK_WITH_RC4_128_SHA 0x0300008E --# define TLS1_CK_DHE_PSK_WITH_3DES_EDE_CBC_SHA 0x0300008F --# define TLS1_CK_DHE_PSK_WITH_AES_128_CBC_SHA 0x03000090 --# define TLS1_CK_DHE_PSK_WITH_AES_256_CBC_SHA 0x03000091 --# define TLS1_CK_RSA_PSK_WITH_RC4_128_SHA 0x03000092 --# define TLS1_CK_RSA_PSK_WITH_3DES_EDE_CBC_SHA 0x03000093 --# define TLS1_CK_RSA_PSK_WITH_AES_128_CBC_SHA 0x03000094 --# define TLS1_CK_RSA_PSK_WITH_AES_256_CBC_SHA 0x03000095 -- --/* PSK ciphersuites from 5487 */ --# define TLS1_CK_PSK_WITH_AES_128_GCM_SHA256 0x030000A8 --# define TLS1_CK_PSK_WITH_AES_256_GCM_SHA384 0x030000A9 --# define TLS1_CK_DHE_PSK_WITH_AES_128_GCM_SHA256 0x030000AA --# define TLS1_CK_DHE_PSK_WITH_AES_256_GCM_SHA384 0x030000AB --# define TLS1_CK_RSA_PSK_WITH_AES_128_GCM_SHA256 0x030000AC --# define TLS1_CK_RSA_PSK_WITH_AES_256_GCM_SHA384 0x030000AD --# define TLS1_CK_PSK_WITH_AES_128_CBC_SHA256 0x030000AE --# define TLS1_CK_PSK_WITH_AES_256_CBC_SHA384 0x030000AF --# define TLS1_CK_PSK_WITH_NULL_SHA256 0x030000B0 --# define TLS1_CK_PSK_WITH_NULL_SHA384 0x030000B1 --# define TLS1_CK_DHE_PSK_WITH_AES_128_CBC_SHA256 0x030000B2 --# define TLS1_CK_DHE_PSK_WITH_AES_256_CBC_SHA384 0x030000B3 --# define TLS1_CK_DHE_PSK_WITH_NULL_SHA256 0x030000B4 --# define TLS1_CK_DHE_PSK_WITH_NULL_SHA384 0x030000B5 --# define TLS1_CK_RSA_PSK_WITH_AES_128_CBC_SHA256 0x030000B6 --# define TLS1_CK_RSA_PSK_WITH_AES_256_CBC_SHA384 0x030000B7 --# define TLS1_CK_RSA_PSK_WITH_NULL_SHA256 0x030000B8 --# define TLS1_CK_RSA_PSK_WITH_NULL_SHA384 0x030000B9 -- --/* NULL PSK ciphersuites from RFC4785 */ --# define TLS1_CK_PSK_WITH_NULL_SHA 0x0300002C --# define TLS1_CK_DHE_PSK_WITH_NULL_SHA 0x0300002D --# define TLS1_CK_RSA_PSK_WITH_NULL_SHA 0x0300002E -- --/* AES ciphersuites from RFC3268 */ --# define TLS1_CK_RSA_WITH_AES_128_SHA 0x0300002F --# define TLS1_CK_DH_DSS_WITH_AES_128_SHA 0x03000030 --# define TLS1_CK_DH_RSA_WITH_AES_128_SHA 0x03000031 --# define TLS1_CK_DHE_DSS_WITH_AES_128_SHA 0x03000032 --# define TLS1_CK_DHE_RSA_WITH_AES_128_SHA 0x03000033 --# define TLS1_CK_ADH_WITH_AES_128_SHA 0x03000034 --# define TLS1_CK_RSA_WITH_AES_256_SHA 0x03000035 --# define TLS1_CK_DH_DSS_WITH_AES_256_SHA 0x03000036 --# define TLS1_CK_DH_RSA_WITH_AES_256_SHA 0x03000037 --# define TLS1_CK_DHE_DSS_WITH_AES_256_SHA 0x03000038 --# define TLS1_CK_DHE_RSA_WITH_AES_256_SHA 0x03000039 --# define TLS1_CK_ADH_WITH_AES_256_SHA 0x0300003A -- --/* TLS v1.2 ciphersuites */ --# define TLS1_CK_RSA_WITH_NULL_SHA256 0x0300003B --# define TLS1_CK_RSA_WITH_AES_128_SHA256 0x0300003C --# define TLS1_CK_RSA_WITH_AES_256_SHA256 0x0300003D --# define TLS1_CK_DH_DSS_WITH_AES_128_SHA256 0x0300003E --# define TLS1_CK_DH_RSA_WITH_AES_128_SHA256 0x0300003F --# define TLS1_CK_DHE_DSS_WITH_AES_128_SHA256 0x03000040 -- --/* Camellia ciphersuites from RFC4132 */ --# define TLS1_CK_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000041 --# define TLS1_CK_DH_DSS_WITH_CAMELLIA_128_CBC_SHA 0x03000042 --# define TLS1_CK_DH_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000043 --# define TLS1_CK_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA 0x03000044 --# define TLS1_CK_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000045 --# define TLS1_CK_ADH_WITH_CAMELLIA_128_CBC_SHA 0x03000046 -- --/* TLS v1.2 ciphersuites */ --# define TLS1_CK_DHE_RSA_WITH_AES_128_SHA256 0x03000067 --# define TLS1_CK_DH_DSS_WITH_AES_256_SHA256 0x03000068 --# define TLS1_CK_DH_RSA_WITH_AES_256_SHA256 0x03000069 --# define TLS1_CK_DHE_DSS_WITH_AES_256_SHA256 0x0300006A --# define TLS1_CK_DHE_RSA_WITH_AES_256_SHA256 0x0300006B --# define TLS1_CK_ADH_WITH_AES_128_SHA256 0x0300006C --# define TLS1_CK_ADH_WITH_AES_256_SHA256 0x0300006D -- --/* Camellia ciphersuites from RFC4132 */ --# define TLS1_CK_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000084 --# define TLS1_CK_DH_DSS_WITH_CAMELLIA_256_CBC_SHA 0x03000085 --# define TLS1_CK_DH_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000086 --# define TLS1_CK_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA 0x03000087 --# define TLS1_CK_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000088 --# define TLS1_CK_ADH_WITH_CAMELLIA_256_CBC_SHA 0x03000089 -- --/* SEED ciphersuites from RFC4162 */ --# define TLS1_CK_RSA_WITH_SEED_SHA 0x03000096 --# define TLS1_CK_DH_DSS_WITH_SEED_SHA 0x03000097 --# define TLS1_CK_DH_RSA_WITH_SEED_SHA 0x03000098 --# define TLS1_CK_DHE_DSS_WITH_SEED_SHA 0x03000099 --# define TLS1_CK_DHE_RSA_WITH_SEED_SHA 0x0300009A --# define TLS1_CK_ADH_WITH_SEED_SHA 0x0300009B -- --/* TLS v1.2 GCM ciphersuites from RFC5288 */ --# define TLS1_CK_RSA_WITH_AES_128_GCM_SHA256 0x0300009C --# define TLS1_CK_RSA_WITH_AES_256_GCM_SHA384 0x0300009D --# define TLS1_CK_DHE_RSA_WITH_AES_128_GCM_SHA256 0x0300009E --# define TLS1_CK_DHE_RSA_WITH_AES_256_GCM_SHA384 0x0300009F --# define TLS1_CK_DH_RSA_WITH_AES_128_GCM_SHA256 0x030000A0 --# define TLS1_CK_DH_RSA_WITH_AES_256_GCM_SHA384 0x030000A1 --# define TLS1_CK_DHE_DSS_WITH_AES_128_GCM_SHA256 0x030000A2 --# define TLS1_CK_DHE_DSS_WITH_AES_256_GCM_SHA384 0x030000A3 --# define TLS1_CK_DH_DSS_WITH_AES_128_GCM_SHA256 0x030000A4 --# define TLS1_CK_DH_DSS_WITH_AES_256_GCM_SHA384 0x030000A5 --# define TLS1_CK_ADH_WITH_AES_128_GCM_SHA256 0x030000A6 --# define TLS1_CK_ADH_WITH_AES_256_GCM_SHA384 0x030000A7 -- --/* CCM ciphersuites from RFC6655 */ --# define TLS1_CK_RSA_WITH_AES_128_CCM 0x0300C09C --# define TLS1_CK_RSA_WITH_AES_256_CCM 0x0300C09D --# define TLS1_CK_DHE_RSA_WITH_AES_128_CCM 0x0300C09E --# define TLS1_CK_DHE_RSA_WITH_AES_256_CCM 0x0300C09F --# define TLS1_CK_RSA_WITH_AES_128_CCM_8 0x0300C0A0 --# define TLS1_CK_RSA_WITH_AES_256_CCM_8 0x0300C0A1 --# define TLS1_CK_DHE_RSA_WITH_AES_128_CCM_8 0x0300C0A2 --# define TLS1_CK_DHE_RSA_WITH_AES_256_CCM_8 0x0300C0A3 --# define TLS1_CK_PSK_WITH_AES_128_CCM 0x0300C0A4 --# define TLS1_CK_PSK_WITH_AES_256_CCM 0x0300C0A5 --# define TLS1_CK_DHE_PSK_WITH_AES_128_CCM 0x0300C0A6 --# define TLS1_CK_DHE_PSK_WITH_AES_256_CCM 0x0300C0A7 --# define TLS1_CK_PSK_WITH_AES_128_CCM_8 0x0300C0A8 --# define TLS1_CK_PSK_WITH_AES_256_CCM_8 0x0300C0A9 --# define TLS1_CK_DHE_PSK_WITH_AES_128_CCM_8 0x0300C0AA --# define TLS1_CK_DHE_PSK_WITH_AES_256_CCM_8 0x0300C0AB -- --/* CCM ciphersuites from RFC7251 */ --# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CCM 0x0300C0AC --# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CCM 0x0300C0AD --# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CCM_8 0x0300C0AE --# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CCM_8 0x0300C0AF -- --/* TLS 1.2 Camellia SHA-256 ciphersuites from RFC5932 */ --# define TLS1_CK_RSA_WITH_CAMELLIA_128_CBC_SHA256 0x030000BA --# define TLS1_CK_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256 0x030000BB --# define TLS1_CK_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256 0x030000BC --# define TLS1_CK_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 0x030000BD --# define TLS1_CK_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 0x030000BE --# define TLS1_CK_ADH_WITH_CAMELLIA_128_CBC_SHA256 0x030000BF -- --# define TLS1_CK_RSA_WITH_CAMELLIA_256_CBC_SHA256 0x030000C0 --# define TLS1_CK_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256 0x030000C1 --# define TLS1_CK_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256 0x030000C2 --# define TLS1_CK_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 0x030000C3 --# define TLS1_CK_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 0x030000C4 --# define TLS1_CK_ADH_WITH_CAMELLIA_256_CBC_SHA256 0x030000C5 -- --/* ECC ciphersuites from RFC4492 */ --# define TLS1_CK_ECDH_ECDSA_WITH_NULL_SHA 0x0300C001 --# define TLS1_CK_ECDH_ECDSA_WITH_RC4_128_SHA 0x0300C002 --# define TLS1_CK_ECDH_ECDSA_WITH_DES_192_CBC3_SHA 0x0300C003 --# define TLS1_CK_ECDH_ECDSA_WITH_AES_128_CBC_SHA 0x0300C004 --# define TLS1_CK_ECDH_ECDSA_WITH_AES_256_CBC_SHA 0x0300C005 -- --# define TLS1_CK_ECDHE_ECDSA_WITH_NULL_SHA 0x0300C006 --# define TLS1_CK_ECDHE_ECDSA_WITH_RC4_128_SHA 0x0300C007 --# define TLS1_CK_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA 0x0300C008 --# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 0x0300C009 --# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 0x0300C00A -- --# define TLS1_CK_ECDH_RSA_WITH_NULL_SHA 0x0300C00B --# define TLS1_CK_ECDH_RSA_WITH_RC4_128_SHA 0x0300C00C --# define TLS1_CK_ECDH_RSA_WITH_DES_192_CBC3_SHA 0x0300C00D --# define TLS1_CK_ECDH_RSA_WITH_AES_128_CBC_SHA 0x0300C00E --# define TLS1_CK_ECDH_RSA_WITH_AES_256_CBC_SHA 0x0300C00F -- --# define TLS1_CK_ECDHE_RSA_WITH_NULL_SHA 0x0300C010 --# define TLS1_CK_ECDHE_RSA_WITH_RC4_128_SHA 0x0300C011 --# define TLS1_CK_ECDHE_RSA_WITH_DES_192_CBC3_SHA 0x0300C012 --# define TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA 0x0300C013 --# define TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA 0x0300C014 -- --# define TLS1_CK_ECDH_anon_WITH_NULL_SHA 0x0300C015 --# define TLS1_CK_ECDH_anon_WITH_RC4_128_SHA 0x0300C016 --# define TLS1_CK_ECDH_anon_WITH_DES_192_CBC3_SHA 0x0300C017 --# define TLS1_CK_ECDH_anon_WITH_AES_128_CBC_SHA 0x0300C018 --# define TLS1_CK_ECDH_anon_WITH_AES_256_CBC_SHA 0x0300C019 -- --/* SRP ciphersuites from RFC 5054 */ --# define TLS1_CK_SRP_SHA_WITH_3DES_EDE_CBC_SHA 0x0300C01A --# define TLS1_CK_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA 0x0300C01B --# define TLS1_CK_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA 0x0300C01C --# define TLS1_CK_SRP_SHA_WITH_AES_128_CBC_SHA 0x0300C01D --# define TLS1_CK_SRP_SHA_RSA_WITH_AES_128_CBC_SHA 0x0300C01E --# define TLS1_CK_SRP_SHA_DSS_WITH_AES_128_CBC_SHA 0x0300C01F --# define TLS1_CK_SRP_SHA_WITH_AES_256_CBC_SHA 0x0300C020 --# define TLS1_CK_SRP_SHA_RSA_WITH_AES_256_CBC_SHA 0x0300C021 --# define TLS1_CK_SRP_SHA_DSS_WITH_AES_256_CBC_SHA 0x0300C022 -- --/* ECDH HMAC based ciphersuites from RFC5289 */ --# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_SHA256 0x0300C023 --# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_SHA384 0x0300C024 --# define TLS1_CK_ECDH_ECDSA_WITH_AES_128_SHA256 0x0300C025 --# define TLS1_CK_ECDH_ECDSA_WITH_AES_256_SHA384 0x0300C026 --# define TLS1_CK_ECDHE_RSA_WITH_AES_128_SHA256 0x0300C027 --# define TLS1_CK_ECDHE_RSA_WITH_AES_256_SHA384 0x0300C028 --# define TLS1_CK_ECDH_RSA_WITH_AES_128_SHA256 0x0300C029 --# define TLS1_CK_ECDH_RSA_WITH_AES_256_SHA384 0x0300C02A -- --/* ECDH GCM based ciphersuites from RFC5289 */ --# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 0x0300C02B --# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 0x0300C02C --# define TLS1_CK_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 0x0300C02D --# define TLS1_CK_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 0x0300C02E --# define TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256 0x0300C02F --# define TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384 0x0300C030 --# define TLS1_CK_ECDH_RSA_WITH_AES_128_GCM_SHA256 0x0300C031 --# define TLS1_CK_ECDH_RSA_WITH_AES_256_GCM_SHA384 0x0300C032 -- --/* ECDHE PSK ciphersuites from RFC5489 */ --# define TLS1_CK_ECDHE_PSK_WITH_RC4_128_SHA 0x0300C033 --# define TLS1_CK_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA 0x0300C034 --# define TLS1_CK_ECDHE_PSK_WITH_AES_128_CBC_SHA 0x0300C035 --# define TLS1_CK_ECDHE_PSK_WITH_AES_256_CBC_SHA 0x0300C036 -- --# define TLS1_CK_ECDHE_PSK_WITH_AES_128_CBC_SHA256 0x0300C037 --# define TLS1_CK_ECDHE_PSK_WITH_AES_256_CBC_SHA384 0x0300C038 -- --/* NULL PSK ciphersuites from RFC4785 */ --# define TLS1_CK_ECDHE_PSK_WITH_NULL_SHA 0x0300C039 --# define TLS1_CK_ECDHE_PSK_WITH_NULL_SHA256 0x0300C03A --# define TLS1_CK_ECDHE_PSK_WITH_NULL_SHA384 0x0300C03B -- --/* Camellia-CBC ciphersuites from RFC6367 */ --# define TLS1_CK_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 0x0300C072 --# define TLS1_CK_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 0x0300C073 --# define TLS1_CK_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 0x0300C074 --# define TLS1_CK_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 0x0300C075 --# define TLS1_CK_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 0x0300C076 --# define TLS1_CK_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 0x0300C077 --# define TLS1_CK_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 0x0300C078 --# define TLS1_CK_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 0x0300C079 -- --# define TLS1_CK_PSK_WITH_CAMELLIA_128_CBC_SHA256 0x0300C094 --# define TLS1_CK_PSK_WITH_CAMELLIA_256_CBC_SHA384 0x0300C095 --# define TLS1_CK_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 0x0300C096 --# define TLS1_CK_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 0x0300C097 --# define TLS1_CK_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 0x0300C098 --# define TLS1_CK_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 0x0300C099 --# define TLS1_CK_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 0x0300C09A --# define TLS1_CK_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 0x0300C09B -- --/* draft-ietf-tls-chacha20-poly1305-03 */ --# define TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305 0x0300CCA8 --# define TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 0x0300CCA9 --# define TLS1_CK_DHE_RSA_WITH_CHACHA20_POLY1305 0x0300CCAA --# define TLS1_CK_PSK_WITH_CHACHA20_POLY1305 0x0300CCAB --# define TLS1_CK_ECDHE_PSK_WITH_CHACHA20_POLY1305 0x0300CCAC --# define TLS1_CK_DHE_PSK_WITH_CHACHA20_POLY1305 0x0300CCAD --# define TLS1_CK_RSA_PSK_WITH_CHACHA20_POLY1305 0x0300CCAE -- --/* TLS v1.3 ciphersuites */ --# define TLS1_3_CK_AES_128_GCM_SHA256 0x03001301 --# define TLS1_3_CK_AES_256_GCM_SHA384 0x03001302 --# define TLS1_3_CK_CHACHA20_POLY1305_SHA256 0x03001303 --# define TLS1_3_CK_AES_128_CCM_SHA256 0x03001304 --# define TLS1_3_CK_AES_128_CCM_8_SHA256 0x03001305 -- --/* Aria ciphersuites from RFC6209 */ --# define TLS1_CK_RSA_WITH_ARIA_128_GCM_SHA256 0x0300C050 --# define TLS1_CK_RSA_WITH_ARIA_256_GCM_SHA384 0x0300C051 --# define TLS1_CK_DHE_RSA_WITH_ARIA_128_GCM_SHA256 0x0300C052 --# define TLS1_CK_DHE_RSA_WITH_ARIA_256_GCM_SHA384 0x0300C053 --# define TLS1_CK_DH_RSA_WITH_ARIA_128_GCM_SHA256 0x0300C054 --# define TLS1_CK_DH_RSA_WITH_ARIA_256_GCM_SHA384 0x0300C055 --# define TLS1_CK_DHE_DSS_WITH_ARIA_128_GCM_SHA256 0x0300C056 --# define TLS1_CK_DHE_DSS_WITH_ARIA_256_GCM_SHA384 0x0300C057 --# define TLS1_CK_DH_DSS_WITH_ARIA_128_GCM_SHA256 0x0300C058 --# define TLS1_CK_DH_DSS_WITH_ARIA_256_GCM_SHA384 0x0300C059 --# define TLS1_CK_DH_anon_WITH_ARIA_128_GCM_SHA256 0x0300C05A --# define TLS1_CK_DH_anon_WITH_ARIA_256_GCM_SHA384 0x0300C05B --# define TLS1_CK_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 0x0300C05C --# define TLS1_CK_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 0x0300C05D --# define TLS1_CK_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 0x0300C05E --# define TLS1_CK_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 0x0300C05F --# define TLS1_CK_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 0x0300C060 --# define TLS1_CK_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 0x0300C061 --# define TLS1_CK_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 0x0300C062 --# define TLS1_CK_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 0x0300C063 --# define TLS1_CK_PSK_WITH_ARIA_128_GCM_SHA256 0x0300C06A --# define TLS1_CK_PSK_WITH_ARIA_256_GCM_SHA384 0x0300C06B --# define TLS1_CK_DHE_PSK_WITH_ARIA_128_GCM_SHA256 0x0300C06C --# define TLS1_CK_DHE_PSK_WITH_ARIA_256_GCM_SHA384 0x0300C06D --# define TLS1_CK_RSA_PSK_WITH_ARIA_128_GCM_SHA256 0x0300C06E --# define TLS1_CK_RSA_PSK_WITH_ARIA_256_GCM_SHA384 0x0300C06F -- --/* a bundle of RFC standard cipher names, generated from ssl3_ciphers[] */ --# define TLS1_RFC_RSA_WITH_AES_128_SHA "TLS_RSA_WITH_AES_128_CBC_SHA" --# define TLS1_RFC_DHE_DSS_WITH_AES_128_SHA "TLS_DHE_DSS_WITH_AES_128_CBC_SHA" --# define TLS1_RFC_DHE_RSA_WITH_AES_128_SHA "TLS_DHE_RSA_WITH_AES_128_CBC_SHA" --# define TLS1_RFC_ADH_WITH_AES_128_SHA "TLS_DH_anon_WITH_AES_128_CBC_SHA" --# define TLS1_RFC_RSA_WITH_AES_256_SHA "TLS_RSA_WITH_AES_256_CBC_SHA" --# define TLS1_RFC_DHE_DSS_WITH_AES_256_SHA "TLS_DHE_DSS_WITH_AES_256_CBC_SHA" --# define TLS1_RFC_DHE_RSA_WITH_AES_256_SHA "TLS_DHE_RSA_WITH_AES_256_CBC_SHA" --# define TLS1_RFC_ADH_WITH_AES_256_SHA "TLS_DH_anon_WITH_AES_256_CBC_SHA" --# define TLS1_RFC_RSA_WITH_NULL_SHA256 "TLS_RSA_WITH_NULL_SHA256" --# define TLS1_RFC_RSA_WITH_AES_128_SHA256 "TLS_RSA_WITH_AES_128_CBC_SHA256" --# define TLS1_RFC_RSA_WITH_AES_256_SHA256 "TLS_RSA_WITH_AES_256_CBC_SHA256" --# define TLS1_RFC_DHE_DSS_WITH_AES_128_SHA256 "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256" --# define TLS1_RFC_DHE_RSA_WITH_AES_128_SHA256 "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256" --# define TLS1_RFC_DHE_DSS_WITH_AES_256_SHA256 "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256" --# define TLS1_RFC_DHE_RSA_WITH_AES_256_SHA256 "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256" --# define TLS1_RFC_ADH_WITH_AES_128_SHA256 "TLS_DH_anon_WITH_AES_128_CBC_SHA256" --# define TLS1_RFC_ADH_WITH_AES_256_SHA256 "TLS_DH_anon_WITH_AES_256_CBC_SHA256" --# define TLS1_RFC_RSA_WITH_AES_128_GCM_SHA256 "TLS_RSA_WITH_AES_128_GCM_SHA256" --# define TLS1_RFC_RSA_WITH_AES_256_GCM_SHA384 "TLS_RSA_WITH_AES_256_GCM_SHA384" --# define TLS1_RFC_DHE_RSA_WITH_AES_128_GCM_SHA256 "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256" --# define TLS1_RFC_DHE_RSA_WITH_AES_256_GCM_SHA384 "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384" --# define TLS1_RFC_DHE_DSS_WITH_AES_128_GCM_SHA256 "TLS_DHE_DSS_WITH_AES_128_GCM_SHA256" --# define TLS1_RFC_DHE_DSS_WITH_AES_256_GCM_SHA384 "TLS_DHE_DSS_WITH_AES_256_GCM_SHA384" --# define TLS1_RFC_ADH_WITH_AES_128_GCM_SHA256 "TLS_DH_anon_WITH_AES_128_GCM_SHA256" --# define TLS1_RFC_ADH_WITH_AES_256_GCM_SHA384 "TLS_DH_anon_WITH_AES_256_GCM_SHA384" --# define TLS1_RFC_RSA_WITH_AES_128_CCM "TLS_RSA_WITH_AES_128_CCM" --# define TLS1_RFC_RSA_WITH_AES_256_CCM "TLS_RSA_WITH_AES_256_CCM" --# define TLS1_RFC_DHE_RSA_WITH_AES_128_CCM "TLS_DHE_RSA_WITH_AES_128_CCM" --# define TLS1_RFC_DHE_RSA_WITH_AES_256_CCM "TLS_DHE_RSA_WITH_AES_256_CCM" --# define TLS1_RFC_RSA_WITH_AES_128_CCM_8 "TLS_RSA_WITH_AES_128_CCM_8" --# define TLS1_RFC_RSA_WITH_AES_256_CCM_8 "TLS_RSA_WITH_AES_256_CCM_8" --# define TLS1_RFC_DHE_RSA_WITH_AES_128_CCM_8 "TLS_DHE_RSA_WITH_AES_128_CCM_8" --# define TLS1_RFC_DHE_RSA_WITH_AES_256_CCM_8 "TLS_DHE_RSA_WITH_AES_256_CCM_8" --# define TLS1_RFC_PSK_WITH_AES_128_CCM "TLS_PSK_WITH_AES_128_CCM" --# define TLS1_RFC_PSK_WITH_AES_256_CCM "TLS_PSK_WITH_AES_256_CCM" --# define TLS1_RFC_DHE_PSK_WITH_AES_128_CCM "TLS_DHE_PSK_WITH_AES_128_CCM" --# define TLS1_RFC_DHE_PSK_WITH_AES_256_CCM "TLS_DHE_PSK_WITH_AES_256_CCM" --# define TLS1_RFC_PSK_WITH_AES_128_CCM_8 "TLS_PSK_WITH_AES_128_CCM_8" --# define TLS1_RFC_PSK_WITH_AES_256_CCM_8 "TLS_PSK_WITH_AES_256_CCM_8" --# define TLS1_RFC_DHE_PSK_WITH_AES_128_CCM_8 "TLS_PSK_DHE_WITH_AES_128_CCM_8" --# define TLS1_RFC_DHE_PSK_WITH_AES_256_CCM_8 "TLS_PSK_DHE_WITH_AES_256_CCM_8" --# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_128_CCM "TLS_ECDHE_ECDSA_WITH_AES_128_CCM" --# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_256_CCM "TLS_ECDHE_ECDSA_WITH_AES_256_CCM" --# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_128_CCM_8 "TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8" --# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_256_CCM_8 "TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8" --# define TLS1_3_RFC_AES_128_GCM_SHA256 "TLS_AES_128_GCM_SHA256" --# define TLS1_3_RFC_AES_256_GCM_SHA384 "TLS_AES_256_GCM_SHA384" --# define TLS1_3_RFC_CHACHA20_POLY1305_SHA256 "TLS_CHACHA20_POLY1305_SHA256" --# define TLS1_3_RFC_AES_128_CCM_SHA256 "TLS_AES_128_CCM_SHA256" --# define TLS1_3_RFC_AES_128_CCM_8_SHA256 "TLS_AES_128_CCM_8_SHA256" --# define TLS1_RFC_ECDHE_ECDSA_WITH_NULL_SHA "TLS_ECDHE_ECDSA_WITH_NULL_SHA" --# define TLS1_RFC_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA" --# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_128_CBC_SHA "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA" --# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_256_CBC_SHA "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA" --# define TLS1_RFC_ECDHE_RSA_WITH_NULL_SHA "TLS_ECDHE_RSA_WITH_NULL_SHA" --# define TLS1_RFC_ECDHE_RSA_WITH_DES_192_CBC3_SHA "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA" --# define TLS1_RFC_ECDHE_RSA_WITH_AES_128_CBC_SHA "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA" --# define TLS1_RFC_ECDHE_RSA_WITH_AES_256_CBC_SHA "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA" --# define TLS1_RFC_ECDH_anon_WITH_NULL_SHA "TLS_ECDH_anon_WITH_NULL_SHA" --# define TLS1_RFC_ECDH_anon_WITH_DES_192_CBC3_SHA "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA" --# define TLS1_RFC_ECDH_anon_WITH_AES_128_CBC_SHA "TLS_ECDH_anon_WITH_AES_128_CBC_SHA" --# define TLS1_RFC_ECDH_anon_WITH_AES_256_CBC_SHA "TLS_ECDH_anon_WITH_AES_256_CBC_SHA" --# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_128_SHA256 "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256" --# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_256_SHA384 "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384" --# define TLS1_RFC_ECDHE_RSA_WITH_AES_128_SHA256 "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256" --# define TLS1_RFC_ECDHE_RSA_WITH_AES_256_SHA384 "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384" --# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256" --# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384" --# define TLS1_RFC_ECDHE_RSA_WITH_AES_128_GCM_SHA256 "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256" --# define TLS1_RFC_ECDHE_RSA_WITH_AES_256_GCM_SHA384 "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384" --# define TLS1_RFC_PSK_WITH_NULL_SHA "TLS_PSK_WITH_NULL_SHA" --# define TLS1_RFC_DHE_PSK_WITH_NULL_SHA "TLS_DHE_PSK_WITH_NULL_SHA" --# define TLS1_RFC_RSA_PSK_WITH_NULL_SHA "TLS_RSA_PSK_WITH_NULL_SHA" --# define TLS1_RFC_PSK_WITH_3DES_EDE_CBC_SHA "TLS_PSK_WITH_3DES_EDE_CBC_SHA" --# define TLS1_RFC_PSK_WITH_AES_128_CBC_SHA "TLS_PSK_WITH_AES_128_CBC_SHA" --# define TLS1_RFC_PSK_WITH_AES_256_CBC_SHA "TLS_PSK_WITH_AES_256_CBC_SHA" --# define TLS1_RFC_DHE_PSK_WITH_3DES_EDE_CBC_SHA "TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA" --# define TLS1_RFC_DHE_PSK_WITH_AES_128_CBC_SHA "TLS_DHE_PSK_WITH_AES_128_CBC_SHA" --# define TLS1_RFC_DHE_PSK_WITH_AES_256_CBC_SHA "TLS_DHE_PSK_WITH_AES_256_CBC_SHA" --# define TLS1_RFC_RSA_PSK_WITH_3DES_EDE_CBC_SHA "TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA" --# define TLS1_RFC_RSA_PSK_WITH_AES_128_CBC_SHA "TLS_RSA_PSK_WITH_AES_128_CBC_SHA" --# define TLS1_RFC_RSA_PSK_WITH_AES_256_CBC_SHA "TLS_RSA_PSK_WITH_AES_256_CBC_SHA" --# define TLS1_RFC_PSK_WITH_AES_128_GCM_SHA256 "TLS_PSK_WITH_AES_128_GCM_SHA256" --# define TLS1_RFC_PSK_WITH_AES_256_GCM_SHA384 "TLS_PSK_WITH_AES_256_GCM_SHA384" --# define TLS1_RFC_DHE_PSK_WITH_AES_128_GCM_SHA256 "TLS_DHE_PSK_WITH_AES_128_GCM_SHA256" --# define TLS1_RFC_DHE_PSK_WITH_AES_256_GCM_SHA384 "TLS_DHE_PSK_WITH_AES_256_GCM_SHA384" --# define TLS1_RFC_RSA_PSK_WITH_AES_128_GCM_SHA256 "TLS_RSA_PSK_WITH_AES_128_GCM_SHA256" --# define TLS1_RFC_RSA_PSK_WITH_AES_256_GCM_SHA384 "TLS_RSA_PSK_WITH_AES_256_GCM_SHA384" --# define TLS1_RFC_PSK_WITH_AES_128_CBC_SHA256 "TLS_PSK_WITH_AES_128_CBC_SHA256" --# define TLS1_RFC_PSK_WITH_AES_256_CBC_SHA384 "TLS_PSK_WITH_AES_256_CBC_SHA384" --# define TLS1_RFC_PSK_WITH_NULL_SHA256 "TLS_PSK_WITH_NULL_SHA256" --# define TLS1_RFC_PSK_WITH_NULL_SHA384 "TLS_PSK_WITH_NULL_SHA384" --# define TLS1_RFC_DHE_PSK_WITH_AES_128_CBC_SHA256 "TLS_DHE_PSK_WITH_AES_128_CBC_SHA256" --# define TLS1_RFC_DHE_PSK_WITH_AES_256_CBC_SHA384 "TLS_DHE_PSK_WITH_AES_256_CBC_SHA384" --# define TLS1_RFC_DHE_PSK_WITH_NULL_SHA256 "TLS_DHE_PSK_WITH_NULL_SHA256" --# define TLS1_RFC_DHE_PSK_WITH_NULL_SHA384 "TLS_DHE_PSK_WITH_NULL_SHA384" --# define TLS1_RFC_RSA_PSK_WITH_AES_128_CBC_SHA256 "TLS_RSA_PSK_WITH_AES_128_CBC_SHA256" --# define TLS1_RFC_RSA_PSK_WITH_AES_256_CBC_SHA384 "TLS_RSA_PSK_WITH_AES_256_CBC_SHA384" --# define TLS1_RFC_RSA_PSK_WITH_NULL_SHA256 "TLS_RSA_PSK_WITH_NULL_SHA256" --# define TLS1_RFC_RSA_PSK_WITH_NULL_SHA384 "TLS_RSA_PSK_WITH_NULL_SHA384" --# define TLS1_RFC_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA "TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA" --# define TLS1_RFC_ECDHE_PSK_WITH_AES_128_CBC_SHA "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA" --# define TLS1_RFC_ECDHE_PSK_WITH_AES_256_CBC_SHA "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA" --# define TLS1_RFC_ECDHE_PSK_WITH_AES_128_CBC_SHA256 "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256" --# define TLS1_RFC_ECDHE_PSK_WITH_AES_256_CBC_SHA384 "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384" --# define TLS1_RFC_ECDHE_PSK_WITH_NULL_SHA "TLS_ECDHE_PSK_WITH_NULL_SHA" --# define TLS1_RFC_ECDHE_PSK_WITH_NULL_SHA256 "TLS_ECDHE_PSK_WITH_NULL_SHA256" --# define TLS1_RFC_ECDHE_PSK_WITH_NULL_SHA384 "TLS_ECDHE_PSK_WITH_NULL_SHA384" --# define TLS1_RFC_SRP_SHA_WITH_3DES_EDE_CBC_SHA "TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA" --# define TLS1_RFC_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA "TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA" --# define TLS1_RFC_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA "TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA" --# define TLS1_RFC_SRP_SHA_WITH_AES_128_CBC_SHA "TLS_SRP_SHA_WITH_AES_128_CBC_SHA" --# define TLS1_RFC_SRP_SHA_RSA_WITH_AES_128_CBC_SHA "TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA" --# define TLS1_RFC_SRP_SHA_DSS_WITH_AES_128_CBC_SHA "TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA" --# define TLS1_RFC_SRP_SHA_WITH_AES_256_CBC_SHA "TLS_SRP_SHA_WITH_AES_256_CBC_SHA" --# define TLS1_RFC_SRP_SHA_RSA_WITH_AES_256_CBC_SHA "TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA" --# define TLS1_RFC_SRP_SHA_DSS_WITH_AES_256_CBC_SHA "TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA" --# define TLS1_RFC_DHE_RSA_WITH_CHACHA20_POLY1305 "TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256" --# define TLS1_RFC_ECDHE_RSA_WITH_CHACHA20_POLY1305 "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256" --# define TLS1_RFC_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256" --# define TLS1_RFC_PSK_WITH_CHACHA20_POLY1305 "TLS_PSK_WITH_CHACHA20_POLY1305_SHA256" --# define TLS1_RFC_ECDHE_PSK_WITH_CHACHA20_POLY1305 "TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256" --# define TLS1_RFC_DHE_PSK_WITH_CHACHA20_POLY1305 "TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256" --# define TLS1_RFC_RSA_PSK_WITH_CHACHA20_POLY1305 "TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256" --# define TLS1_RFC_RSA_WITH_CAMELLIA_128_CBC_SHA256 "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256" --# define TLS1_RFC_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256" --# define TLS1_RFC_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256" --# define TLS1_RFC_ADH_WITH_CAMELLIA_128_CBC_SHA256 "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256" --# define TLS1_RFC_RSA_WITH_CAMELLIA_256_CBC_SHA256 "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256" --# define TLS1_RFC_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256" --# define TLS1_RFC_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256" --# define TLS1_RFC_ADH_WITH_CAMELLIA_256_CBC_SHA256 "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256" --# define TLS1_RFC_RSA_WITH_CAMELLIA_256_CBC_SHA "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA" --# define TLS1_RFC_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA" --# define TLS1_RFC_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA" --# define TLS1_RFC_ADH_WITH_CAMELLIA_256_CBC_SHA "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA" --# define TLS1_RFC_RSA_WITH_CAMELLIA_128_CBC_SHA "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA" --# define TLS1_RFC_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA" --# define TLS1_RFC_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA" --# define TLS1_RFC_ADH_WITH_CAMELLIA_128_CBC_SHA "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA" --# define TLS1_RFC_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 "TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256" --# define TLS1_RFC_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 "TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384" --# define TLS1_RFC_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 "TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256" --# define TLS1_RFC_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 "TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384" --# define TLS1_RFC_PSK_WITH_CAMELLIA_128_CBC_SHA256 "TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256" --# define TLS1_RFC_PSK_WITH_CAMELLIA_256_CBC_SHA384 "TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384" --# define TLS1_RFC_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 "TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256" --# define TLS1_RFC_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 "TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384" --# define TLS1_RFC_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 "TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256" --# define TLS1_RFC_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 "TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384" --# define TLS1_RFC_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 "TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256" --# define TLS1_RFC_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 "TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384" --# define TLS1_RFC_RSA_WITH_SEED_SHA "TLS_RSA_WITH_SEED_CBC_SHA" --# define TLS1_RFC_DHE_DSS_WITH_SEED_SHA "TLS_DHE_DSS_WITH_SEED_CBC_SHA" --# define TLS1_RFC_DHE_RSA_WITH_SEED_SHA "TLS_DHE_RSA_WITH_SEED_CBC_SHA" --# define TLS1_RFC_ADH_WITH_SEED_SHA "TLS_DH_anon_WITH_SEED_CBC_SHA" --# define TLS1_RFC_ECDHE_PSK_WITH_RC4_128_SHA "TLS_ECDHE_PSK_WITH_RC4_128_SHA" --# define TLS1_RFC_ECDH_anon_WITH_RC4_128_SHA "TLS_ECDH_anon_WITH_RC4_128_SHA" --# define TLS1_RFC_ECDHE_ECDSA_WITH_RC4_128_SHA "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA" --# define TLS1_RFC_ECDHE_RSA_WITH_RC4_128_SHA "TLS_ECDHE_RSA_WITH_RC4_128_SHA" --# define TLS1_RFC_PSK_WITH_RC4_128_SHA "TLS_PSK_WITH_RC4_128_SHA" --# define TLS1_RFC_RSA_PSK_WITH_RC4_128_SHA "TLS_RSA_PSK_WITH_RC4_128_SHA" --# define TLS1_RFC_DHE_PSK_WITH_RC4_128_SHA "TLS_DHE_PSK_WITH_RC4_128_SHA" --# define TLS1_RFC_RSA_WITH_ARIA_128_GCM_SHA256 "TLS_RSA_WITH_ARIA_128_GCM_SHA256" --# define TLS1_RFC_RSA_WITH_ARIA_256_GCM_SHA384 "TLS_RSA_WITH_ARIA_256_GCM_SHA384" --# define TLS1_RFC_DHE_RSA_WITH_ARIA_128_GCM_SHA256 "TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256" --# define TLS1_RFC_DHE_RSA_WITH_ARIA_256_GCM_SHA384 "TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384" --# define TLS1_RFC_DH_RSA_WITH_ARIA_128_GCM_SHA256 "TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256" --# define TLS1_RFC_DH_RSA_WITH_ARIA_256_GCM_SHA384 "TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384" --# define TLS1_RFC_DHE_DSS_WITH_ARIA_128_GCM_SHA256 "TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256" --# define TLS1_RFC_DHE_DSS_WITH_ARIA_256_GCM_SHA384 "TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384" --# define TLS1_RFC_DH_DSS_WITH_ARIA_128_GCM_SHA256 "TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256" --# define TLS1_RFC_DH_DSS_WITH_ARIA_256_GCM_SHA384 "TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384" --# define TLS1_RFC_DH_anon_WITH_ARIA_128_GCM_SHA256 "TLS_DH_anon_WITH_ARIA_128_GCM_SHA256" --# define TLS1_RFC_DH_anon_WITH_ARIA_256_GCM_SHA384 "TLS_DH_anon_WITH_ARIA_256_GCM_SHA384" --# define TLS1_RFC_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 "TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256" --# define TLS1_RFC_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 "TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384" --# define TLS1_RFC_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 "TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256" --# define TLS1_RFC_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 "TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384" --# define TLS1_RFC_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 "TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256" --# define TLS1_RFC_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 "TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384" --# define TLS1_RFC_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 "TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256" --# define TLS1_RFC_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 "TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384" --# define TLS1_RFC_PSK_WITH_ARIA_128_GCM_SHA256 "TLS_PSK_WITH_ARIA_128_GCM_SHA256" --# define TLS1_RFC_PSK_WITH_ARIA_256_GCM_SHA384 "TLS_PSK_WITH_ARIA_256_GCM_SHA384" --# define TLS1_RFC_DHE_PSK_WITH_ARIA_128_GCM_SHA256 "TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256" --# define TLS1_RFC_DHE_PSK_WITH_ARIA_256_GCM_SHA384 "TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384" --# define TLS1_RFC_RSA_PSK_WITH_ARIA_128_GCM_SHA256 "TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256" --# define TLS1_RFC_RSA_PSK_WITH_ARIA_256_GCM_SHA384 "TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384" -- -- --/* -- * XXX Backward compatibility alert: Older versions of OpenSSL gave some DHE -- * ciphers names with "EDH" instead of "DHE". Going forward, we should be -- * using DHE everywhere, though we may indefinitely maintain aliases for -- * users or configurations that used "EDH" -- */ --# define TLS1_TXT_DHE_DSS_WITH_RC4_128_SHA "DHE-DSS-RC4-SHA" -- --# define TLS1_TXT_PSK_WITH_NULL_SHA "PSK-NULL-SHA" --# define TLS1_TXT_DHE_PSK_WITH_NULL_SHA "DHE-PSK-NULL-SHA" --# define TLS1_TXT_RSA_PSK_WITH_NULL_SHA "RSA-PSK-NULL-SHA" -- --/* AES ciphersuites from RFC3268 */ --# define TLS1_TXT_RSA_WITH_AES_128_SHA "AES128-SHA" --# define TLS1_TXT_DH_DSS_WITH_AES_128_SHA "DH-DSS-AES128-SHA" --# define TLS1_TXT_DH_RSA_WITH_AES_128_SHA "DH-RSA-AES128-SHA" --# define TLS1_TXT_DHE_DSS_WITH_AES_128_SHA "DHE-DSS-AES128-SHA" --# define TLS1_TXT_DHE_RSA_WITH_AES_128_SHA "DHE-RSA-AES128-SHA" --# define TLS1_TXT_ADH_WITH_AES_128_SHA "ADH-AES128-SHA" -- --# define TLS1_TXT_RSA_WITH_AES_256_SHA "AES256-SHA" --# define TLS1_TXT_DH_DSS_WITH_AES_256_SHA "DH-DSS-AES256-SHA" --# define TLS1_TXT_DH_RSA_WITH_AES_256_SHA "DH-RSA-AES256-SHA" --# define TLS1_TXT_DHE_DSS_WITH_AES_256_SHA "DHE-DSS-AES256-SHA" --# define TLS1_TXT_DHE_RSA_WITH_AES_256_SHA "DHE-RSA-AES256-SHA" --# define TLS1_TXT_ADH_WITH_AES_256_SHA "ADH-AES256-SHA" -- --/* ECC ciphersuites from RFC4492 */ --# define TLS1_TXT_ECDH_ECDSA_WITH_NULL_SHA "ECDH-ECDSA-NULL-SHA" --# define TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA "ECDH-ECDSA-RC4-SHA" --# define TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA "ECDH-ECDSA-DES-CBC3-SHA" --# define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA "ECDH-ECDSA-AES128-SHA" --# define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA "ECDH-ECDSA-AES256-SHA" -- --# define TLS1_TXT_ECDHE_ECDSA_WITH_NULL_SHA "ECDHE-ECDSA-NULL-SHA" --# define TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA "ECDHE-ECDSA-RC4-SHA" --# define TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA "ECDHE-ECDSA-DES-CBC3-SHA" --# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA "ECDHE-ECDSA-AES128-SHA" --# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA "ECDHE-ECDSA-AES256-SHA" -- --# define TLS1_TXT_ECDH_RSA_WITH_NULL_SHA "ECDH-RSA-NULL-SHA" --# define TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA "ECDH-RSA-RC4-SHA" --# define TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA "ECDH-RSA-DES-CBC3-SHA" --# define TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA "ECDH-RSA-AES128-SHA" --# define TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA "ECDH-RSA-AES256-SHA" -- --# define TLS1_TXT_ECDHE_RSA_WITH_NULL_SHA "ECDHE-RSA-NULL-SHA" --# define TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA "ECDHE-RSA-RC4-SHA" --# define TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA "ECDHE-RSA-DES-CBC3-SHA" --# define TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA "ECDHE-RSA-AES128-SHA" --# define TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA "ECDHE-RSA-AES256-SHA" -- --# define TLS1_TXT_ECDH_anon_WITH_NULL_SHA "AECDH-NULL-SHA" --# define TLS1_TXT_ECDH_anon_WITH_RC4_128_SHA "AECDH-RC4-SHA" --# define TLS1_TXT_ECDH_anon_WITH_DES_192_CBC3_SHA "AECDH-DES-CBC3-SHA" --# define TLS1_TXT_ECDH_anon_WITH_AES_128_CBC_SHA "AECDH-AES128-SHA" --# define TLS1_TXT_ECDH_anon_WITH_AES_256_CBC_SHA "AECDH-AES256-SHA" -- --/* PSK ciphersuites from RFC 4279 */ --# define TLS1_TXT_PSK_WITH_RC4_128_SHA "PSK-RC4-SHA" --# define TLS1_TXT_PSK_WITH_3DES_EDE_CBC_SHA "PSK-3DES-EDE-CBC-SHA" --# define TLS1_TXT_PSK_WITH_AES_128_CBC_SHA "PSK-AES128-CBC-SHA" --# define TLS1_TXT_PSK_WITH_AES_256_CBC_SHA "PSK-AES256-CBC-SHA" -- --# define TLS1_TXT_DHE_PSK_WITH_RC4_128_SHA "DHE-PSK-RC4-SHA" --# define TLS1_TXT_DHE_PSK_WITH_3DES_EDE_CBC_SHA "DHE-PSK-3DES-EDE-CBC-SHA" --# define TLS1_TXT_DHE_PSK_WITH_AES_128_CBC_SHA "DHE-PSK-AES128-CBC-SHA" --# define TLS1_TXT_DHE_PSK_WITH_AES_256_CBC_SHA "DHE-PSK-AES256-CBC-SHA" --# define TLS1_TXT_RSA_PSK_WITH_RC4_128_SHA "RSA-PSK-RC4-SHA" --# define TLS1_TXT_RSA_PSK_WITH_3DES_EDE_CBC_SHA "RSA-PSK-3DES-EDE-CBC-SHA" --# define TLS1_TXT_RSA_PSK_WITH_AES_128_CBC_SHA "RSA-PSK-AES128-CBC-SHA" --# define TLS1_TXT_RSA_PSK_WITH_AES_256_CBC_SHA "RSA-PSK-AES256-CBC-SHA" -- --/* PSK ciphersuites from RFC 5487 */ --# define TLS1_TXT_PSK_WITH_AES_128_GCM_SHA256 "PSK-AES128-GCM-SHA256" --# define TLS1_TXT_PSK_WITH_AES_256_GCM_SHA384 "PSK-AES256-GCM-SHA384" --# define TLS1_TXT_DHE_PSK_WITH_AES_128_GCM_SHA256 "DHE-PSK-AES128-GCM-SHA256" --# define TLS1_TXT_DHE_PSK_WITH_AES_256_GCM_SHA384 "DHE-PSK-AES256-GCM-SHA384" --# define TLS1_TXT_RSA_PSK_WITH_AES_128_GCM_SHA256 "RSA-PSK-AES128-GCM-SHA256" --# define TLS1_TXT_RSA_PSK_WITH_AES_256_GCM_SHA384 "RSA-PSK-AES256-GCM-SHA384" -- --# define TLS1_TXT_PSK_WITH_AES_128_CBC_SHA256 "PSK-AES128-CBC-SHA256" --# define TLS1_TXT_PSK_WITH_AES_256_CBC_SHA384 "PSK-AES256-CBC-SHA384" --# define TLS1_TXT_PSK_WITH_NULL_SHA256 "PSK-NULL-SHA256" --# define TLS1_TXT_PSK_WITH_NULL_SHA384 "PSK-NULL-SHA384" -- --# define TLS1_TXT_DHE_PSK_WITH_AES_128_CBC_SHA256 "DHE-PSK-AES128-CBC-SHA256" --# define TLS1_TXT_DHE_PSK_WITH_AES_256_CBC_SHA384 "DHE-PSK-AES256-CBC-SHA384" --# define TLS1_TXT_DHE_PSK_WITH_NULL_SHA256 "DHE-PSK-NULL-SHA256" --# define TLS1_TXT_DHE_PSK_WITH_NULL_SHA384 "DHE-PSK-NULL-SHA384" -- --# define TLS1_TXT_RSA_PSK_WITH_AES_128_CBC_SHA256 "RSA-PSK-AES128-CBC-SHA256" --# define TLS1_TXT_RSA_PSK_WITH_AES_256_CBC_SHA384 "RSA-PSK-AES256-CBC-SHA384" --# define TLS1_TXT_RSA_PSK_WITH_NULL_SHA256 "RSA-PSK-NULL-SHA256" --# define TLS1_TXT_RSA_PSK_WITH_NULL_SHA384 "RSA-PSK-NULL-SHA384" -- --/* SRP ciphersuite from RFC 5054 */ --# define TLS1_TXT_SRP_SHA_WITH_3DES_EDE_CBC_SHA "SRP-3DES-EDE-CBC-SHA" --# define TLS1_TXT_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA "SRP-RSA-3DES-EDE-CBC-SHA" --# define TLS1_TXT_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA "SRP-DSS-3DES-EDE-CBC-SHA" --# define TLS1_TXT_SRP_SHA_WITH_AES_128_CBC_SHA "SRP-AES-128-CBC-SHA" --# define TLS1_TXT_SRP_SHA_RSA_WITH_AES_128_CBC_SHA "SRP-RSA-AES-128-CBC-SHA" --# define TLS1_TXT_SRP_SHA_DSS_WITH_AES_128_CBC_SHA "SRP-DSS-AES-128-CBC-SHA" --# define TLS1_TXT_SRP_SHA_WITH_AES_256_CBC_SHA "SRP-AES-256-CBC-SHA" --# define TLS1_TXT_SRP_SHA_RSA_WITH_AES_256_CBC_SHA "SRP-RSA-AES-256-CBC-SHA" --# define TLS1_TXT_SRP_SHA_DSS_WITH_AES_256_CBC_SHA "SRP-DSS-AES-256-CBC-SHA" -- --/* Camellia ciphersuites from RFC4132 */ --# define TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA "CAMELLIA128-SHA" --# define TLS1_TXT_DH_DSS_WITH_CAMELLIA_128_CBC_SHA "DH-DSS-CAMELLIA128-SHA" --# define TLS1_TXT_DH_RSA_WITH_CAMELLIA_128_CBC_SHA "DH-RSA-CAMELLIA128-SHA" --# define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA "DHE-DSS-CAMELLIA128-SHA" --# define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA "DHE-RSA-CAMELLIA128-SHA" --# define TLS1_TXT_ADH_WITH_CAMELLIA_128_CBC_SHA "ADH-CAMELLIA128-SHA" -- --# define TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA "CAMELLIA256-SHA" --# define TLS1_TXT_DH_DSS_WITH_CAMELLIA_256_CBC_SHA "DH-DSS-CAMELLIA256-SHA" --# define TLS1_TXT_DH_RSA_WITH_CAMELLIA_256_CBC_SHA "DH-RSA-CAMELLIA256-SHA" --# define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA "DHE-DSS-CAMELLIA256-SHA" --# define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA "DHE-RSA-CAMELLIA256-SHA" --# define TLS1_TXT_ADH_WITH_CAMELLIA_256_CBC_SHA "ADH-CAMELLIA256-SHA" -- --/* TLS 1.2 Camellia SHA-256 ciphersuites from RFC5932 */ --# define TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA256 "CAMELLIA128-SHA256" --# define TLS1_TXT_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256 "DH-DSS-CAMELLIA128-SHA256" --# define TLS1_TXT_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256 "DH-RSA-CAMELLIA128-SHA256" --# define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 "DHE-DSS-CAMELLIA128-SHA256" --# define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 "DHE-RSA-CAMELLIA128-SHA256" --# define TLS1_TXT_ADH_WITH_CAMELLIA_128_CBC_SHA256 "ADH-CAMELLIA128-SHA256" -- --# define TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA256 "CAMELLIA256-SHA256" --# define TLS1_TXT_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256 "DH-DSS-CAMELLIA256-SHA256" --# define TLS1_TXT_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256 "DH-RSA-CAMELLIA256-SHA256" --# define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 "DHE-DSS-CAMELLIA256-SHA256" --# define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 "DHE-RSA-CAMELLIA256-SHA256" --# define TLS1_TXT_ADH_WITH_CAMELLIA_256_CBC_SHA256 "ADH-CAMELLIA256-SHA256" -- --# define TLS1_TXT_PSK_WITH_CAMELLIA_128_CBC_SHA256 "PSK-CAMELLIA128-SHA256" --# define TLS1_TXT_PSK_WITH_CAMELLIA_256_CBC_SHA384 "PSK-CAMELLIA256-SHA384" --# define TLS1_TXT_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 "DHE-PSK-CAMELLIA128-SHA256" --# define TLS1_TXT_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 "DHE-PSK-CAMELLIA256-SHA384" --# define TLS1_TXT_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 "RSA-PSK-CAMELLIA128-SHA256" --# define TLS1_TXT_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 "RSA-PSK-CAMELLIA256-SHA384" --# define TLS1_TXT_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 "ECDHE-PSK-CAMELLIA128-SHA256" --# define TLS1_TXT_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 "ECDHE-PSK-CAMELLIA256-SHA384" -- --/* SEED ciphersuites from RFC4162 */ --# define TLS1_TXT_RSA_WITH_SEED_SHA "SEED-SHA" --# define TLS1_TXT_DH_DSS_WITH_SEED_SHA "DH-DSS-SEED-SHA" --# define TLS1_TXT_DH_RSA_WITH_SEED_SHA "DH-RSA-SEED-SHA" --# define TLS1_TXT_DHE_DSS_WITH_SEED_SHA "DHE-DSS-SEED-SHA" --# define TLS1_TXT_DHE_RSA_WITH_SEED_SHA "DHE-RSA-SEED-SHA" --# define TLS1_TXT_ADH_WITH_SEED_SHA "ADH-SEED-SHA" -- --/* TLS v1.2 ciphersuites */ --# define TLS1_TXT_RSA_WITH_NULL_SHA256 "NULL-SHA256" --# define TLS1_TXT_RSA_WITH_AES_128_SHA256 "AES128-SHA256" --# define TLS1_TXT_RSA_WITH_AES_256_SHA256 "AES256-SHA256" --# define TLS1_TXT_DH_DSS_WITH_AES_128_SHA256 "DH-DSS-AES128-SHA256" --# define TLS1_TXT_DH_RSA_WITH_AES_128_SHA256 "DH-RSA-AES128-SHA256" --# define TLS1_TXT_DHE_DSS_WITH_AES_128_SHA256 "DHE-DSS-AES128-SHA256" --# define TLS1_TXT_DHE_RSA_WITH_AES_128_SHA256 "DHE-RSA-AES128-SHA256" --# define TLS1_TXT_DH_DSS_WITH_AES_256_SHA256 "DH-DSS-AES256-SHA256" --# define TLS1_TXT_DH_RSA_WITH_AES_256_SHA256 "DH-RSA-AES256-SHA256" --# define TLS1_TXT_DHE_DSS_WITH_AES_256_SHA256 "DHE-DSS-AES256-SHA256" --# define TLS1_TXT_DHE_RSA_WITH_AES_256_SHA256 "DHE-RSA-AES256-SHA256" --# define TLS1_TXT_ADH_WITH_AES_128_SHA256 "ADH-AES128-SHA256" --# define TLS1_TXT_ADH_WITH_AES_256_SHA256 "ADH-AES256-SHA256" -- --/* TLS v1.2 GCM ciphersuites from RFC5288 */ --# define TLS1_TXT_RSA_WITH_AES_128_GCM_SHA256 "AES128-GCM-SHA256" --# define TLS1_TXT_RSA_WITH_AES_256_GCM_SHA384 "AES256-GCM-SHA384" --# define TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256 "DHE-RSA-AES128-GCM-SHA256" --# define TLS1_TXT_DHE_RSA_WITH_AES_256_GCM_SHA384 "DHE-RSA-AES256-GCM-SHA384" --# define TLS1_TXT_DH_RSA_WITH_AES_128_GCM_SHA256 "DH-RSA-AES128-GCM-SHA256" --# define TLS1_TXT_DH_RSA_WITH_AES_256_GCM_SHA384 "DH-RSA-AES256-GCM-SHA384" --# define TLS1_TXT_DHE_DSS_WITH_AES_128_GCM_SHA256 "DHE-DSS-AES128-GCM-SHA256" --# define TLS1_TXT_DHE_DSS_WITH_AES_256_GCM_SHA384 "DHE-DSS-AES256-GCM-SHA384" --# define TLS1_TXT_DH_DSS_WITH_AES_128_GCM_SHA256 "DH-DSS-AES128-GCM-SHA256" --# define TLS1_TXT_DH_DSS_WITH_AES_256_GCM_SHA384 "DH-DSS-AES256-GCM-SHA384" --# define TLS1_TXT_ADH_WITH_AES_128_GCM_SHA256 "ADH-AES128-GCM-SHA256" --# define TLS1_TXT_ADH_WITH_AES_256_GCM_SHA384 "ADH-AES256-GCM-SHA384" -- --/* CCM ciphersuites from RFC6655 */ --# define TLS1_TXT_RSA_WITH_AES_128_CCM "AES128-CCM" --# define TLS1_TXT_RSA_WITH_AES_256_CCM "AES256-CCM" --# define TLS1_TXT_DHE_RSA_WITH_AES_128_CCM "DHE-RSA-AES128-CCM" --# define TLS1_TXT_DHE_RSA_WITH_AES_256_CCM "DHE-RSA-AES256-CCM" -- --# define TLS1_TXT_RSA_WITH_AES_128_CCM_8 "AES128-CCM8" --# define TLS1_TXT_RSA_WITH_AES_256_CCM_8 "AES256-CCM8" --# define TLS1_TXT_DHE_RSA_WITH_AES_128_CCM_8 "DHE-RSA-AES128-CCM8" --# define TLS1_TXT_DHE_RSA_WITH_AES_256_CCM_8 "DHE-RSA-AES256-CCM8" -- --# define TLS1_TXT_PSK_WITH_AES_128_CCM "PSK-AES128-CCM" --# define TLS1_TXT_PSK_WITH_AES_256_CCM "PSK-AES256-CCM" --# define TLS1_TXT_DHE_PSK_WITH_AES_128_CCM "DHE-PSK-AES128-CCM" --# define TLS1_TXT_DHE_PSK_WITH_AES_256_CCM "DHE-PSK-AES256-CCM" -- --# define TLS1_TXT_PSK_WITH_AES_128_CCM_8 "PSK-AES128-CCM8" --# define TLS1_TXT_PSK_WITH_AES_256_CCM_8 "PSK-AES256-CCM8" --# define TLS1_TXT_DHE_PSK_WITH_AES_128_CCM_8 "DHE-PSK-AES128-CCM8" --# define TLS1_TXT_DHE_PSK_WITH_AES_256_CCM_8 "DHE-PSK-AES256-CCM8" -- --/* CCM ciphersuites from RFC7251 */ --# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CCM "ECDHE-ECDSA-AES128-CCM" --# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CCM "ECDHE-ECDSA-AES256-CCM" --# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CCM_8 "ECDHE-ECDSA-AES128-CCM8" --# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CCM_8 "ECDHE-ECDSA-AES256-CCM8" -- --/* ECDH HMAC based ciphersuites from RFC5289 */ --# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_SHA256 "ECDHE-ECDSA-AES128-SHA256" --# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_SHA384 "ECDHE-ECDSA-AES256-SHA384" --# define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_SHA256 "ECDH-ECDSA-AES128-SHA256" --# define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_SHA384 "ECDH-ECDSA-AES256-SHA384" --# define TLS1_TXT_ECDHE_RSA_WITH_AES_128_SHA256 "ECDHE-RSA-AES128-SHA256" --# define TLS1_TXT_ECDHE_RSA_WITH_AES_256_SHA384 "ECDHE-RSA-AES256-SHA384" --# define TLS1_TXT_ECDH_RSA_WITH_AES_128_SHA256 "ECDH-RSA-AES128-SHA256" --# define TLS1_TXT_ECDH_RSA_WITH_AES_256_SHA384 "ECDH-RSA-AES256-SHA384" -- --/* ECDH GCM based ciphersuites from RFC5289 */ --# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 "ECDHE-ECDSA-AES128-GCM-SHA256" --# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 "ECDHE-ECDSA-AES256-GCM-SHA384" --# define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 "ECDH-ECDSA-AES128-GCM-SHA256" --# define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 "ECDH-ECDSA-AES256-GCM-SHA384" --# define TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 "ECDHE-RSA-AES128-GCM-SHA256" --# define TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384 "ECDHE-RSA-AES256-GCM-SHA384" --# define TLS1_TXT_ECDH_RSA_WITH_AES_128_GCM_SHA256 "ECDH-RSA-AES128-GCM-SHA256" --# define TLS1_TXT_ECDH_RSA_WITH_AES_256_GCM_SHA384 "ECDH-RSA-AES256-GCM-SHA384" -- --/* TLS v1.2 PSK GCM ciphersuites from RFC5487 */ --# define TLS1_TXT_PSK_WITH_AES_128_GCM_SHA256 "PSK-AES128-GCM-SHA256" --# define TLS1_TXT_PSK_WITH_AES_256_GCM_SHA384 "PSK-AES256-GCM-SHA384" -- --/* ECDHE PSK ciphersuites from RFC 5489 */ --# define TLS1_TXT_ECDHE_PSK_WITH_RC4_128_SHA "ECDHE-PSK-RC4-SHA" --# define TLS1_TXT_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA "ECDHE-PSK-3DES-EDE-CBC-SHA" --# define TLS1_TXT_ECDHE_PSK_WITH_AES_128_CBC_SHA "ECDHE-PSK-AES128-CBC-SHA" --# define TLS1_TXT_ECDHE_PSK_WITH_AES_256_CBC_SHA "ECDHE-PSK-AES256-CBC-SHA" -- --# define TLS1_TXT_ECDHE_PSK_WITH_AES_128_CBC_SHA256 "ECDHE-PSK-AES128-CBC-SHA256" --# define TLS1_TXT_ECDHE_PSK_WITH_AES_256_CBC_SHA384 "ECDHE-PSK-AES256-CBC-SHA384" -- --# define TLS1_TXT_ECDHE_PSK_WITH_NULL_SHA "ECDHE-PSK-NULL-SHA" --# define TLS1_TXT_ECDHE_PSK_WITH_NULL_SHA256 "ECDHE-PSK-NULL-SHA256" --# define TLS1_TXT_ECDHE_PSK_WITH_NULL_SHA384 "ECDHE-PSK-NULL-SHA384" -- --/* Camellia-CBC ciphersuites from RFC6367 */ --# define TLS1_TXT_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 "ECDHE-ECDSA-CAMELLIA128-SHA256" --# define TLS1_TXT_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 "ECDHE-ECDSA-CAMELLIA256-SHA384" --# define TLS1_TXT_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 "ECDH-ECDSA-CAMELLIA128-SHA256" --# define TLS1_TXT_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 "ECDH-ECDSA-CAMELLIA256-SHA384" --# define TLS1_TXT_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 "ECDHE-RSA-CAMELLIA128-SHA256" --# define TLS1_TXT_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 "ECDHE-RSA-CAMELLIA256-SHA384" --# define TLS1_TXT_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 "ECDH-RSA-CAMELLIA128-SHA256" --# define TLS1_TXT_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 "ECDH-RSA-CAMELLIA256-SHA384" -- --/* draft-ietf-tls-chacha20-poly1305-03 */ --# define TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305 "ECDHE-RSA-CHACHA20-POLY1305" --# define TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 "ECDHE-ECDSA-CHACHA20-POLY1305" --# define TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305 "DHE-RSA-CHACHA20-POLY1305" --# define TLS1_TXT_PSK_WITH_CHACHA20_POLY1305 "PSK-CHACHA20-POLY1305" --# define TLS1_TXT_ECDHE_PSK_WITH_CHACHA20_POLY1305 "ECDHE-PSK-CHACHA20-POLY1305" --# define TLS1_TXT_DHE_PSK_WITH_CHACHA20_POLY1305 "DHE-PSK-CHACHA20-POLY1305" --# define TLS1_TXT_RSA_PSK_WITH_CHACHA20_POLY1305 "RSA-PSK-CHACHA20-POLY1305" -- --/* Aria ciphersuites from RFC6209 */ --# define TLS1_TXT_RSA_WITH_ARIA_128_GCM_SHA256 "ARIA128-GCM-SHA256" --# define TLS1_TXT_RSA_WITH_ARIA_256_GCM_SHA384 "ARIA256-GCM-SHA384" --# define TLS1_TXT_DHE_RSA_WITH_ARIA_128_GCM_SHA256 "DHE-RSA-ARIA128-GCM-SHA256" --# define TLS1_TXT_DHE_RSA_WITH_ARIA_256_GCM_SHA384 "DHE-RSA-ARIA256-GCM-SHA384" --# define TLS1_TXT_DH_RSA_WITH_ARIA_128_GCM_SHA256 "DH-RSA-ARIA128-GCM-SHA256" --# define TLS1_TXT_DH_RSA_WITH_ARIA_256_GCM_SHA384 "DH-RSA-ARIA256-GCM-SHA384" --# define TLS1_TXT_DHE_DSS_WITH_ARIA_128_GCM_SHA256 "DHE-DSS-ARIA128-GCM-SHA256" --# define TLS1_TXT_DHE_DSS_WITH_ARIA_256_GCM_SHA384 "DHE-DSS-ARIA256-GCM-SHA384" --# define TLS1_TXT_DH_DSS_WITH_ARIA_128_GCM_SHA256 "DH-DSS-ARIA128-GCM-SHA256" --# define TLS1_TXT_DH_DSS_WITH_ARIA_256_GCM_SHA384 "DH-DSS-ARIA256-GCM-SHA384" --# define TLS1_TXT_DH_anon_WITH_ARIA_128_GCM_SHA256 "ADH-ARIA128-GCM-SHA256" --# define TLS1_TXT_DH_anon_WITH_ARIA_256_GCM_SHA384 "ADH-ARIA256-GCM-SHA384" --# define TLS1_TXT_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 "ECDHE-ECDSA-ARIA128-GCM-SHA256" --# define TLS1_TXT_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 "ECDHE-ECDSA-ARIA256-GCM-SHA384" --# define TLS1_TXT_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 "ECDH-ECDSA-ARIA128-GCM-SHA256" --# define TLS1_TXT_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 "ECDH-ECDSA-ARIA256-GCM-SHA384" --# define TLS1_TXT_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 "ECDHE-ARIA128-GCM-SHA256" --# define TLS1_TXT_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 "ECDHE-ARIA256-GCM-SHA384" --# define TLS1_TXT_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 "ECDH-ARIA128-GCM-SHA256" --# define TLS1_TXT_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 "ECDH-ARIA256-GCM-SHA384" --# define TLS1_TXT_PSK_WITH_ARIA_128_GCM_SHA256 "PSK-ARIA128-GCM-SHA256" --# define TLS1_TXT_PSK_WITH_ARIA_256_GCM_SHA384 "PSK-ARIA256-GCM-SHA384" --# define TLS1_TXT_DHE_PSK_WITH_ARIA_128_GCM_SHA256 "DHE-PSK-ARIA128-GCM-SHA256" --# define TLS1_TXT_DHE_PSK_WITH_ARIA_256_GCM_SHA384 "DHE-PSK-ARIA256-GCM-SHA384" --# define TLS1_TXT_RSA_PSK_WITH_ARIA_128_GCM_SHA256 "RSA-PSK-ARIA128-GCM-SHA256" --# define TLS1_TXT_RSA_PSK_WITH_ARIA_256_GCM_SHA384 "RSA-PSK-ARIA256-GCM-SHA384" -- --# define TLS_CT_RSA_SIGN 1 --# define TLS_CT_DSS_SIGN 2 --# define TLS_CT_RSA_FIXED_DH 3 --# define TLS_CT_DSS_FIXED_DH 4 --# define TLS_CT_ECDSA_SIGN 64 --# define TLS_CT_RSA_FIXED_ECDH 65 --# define TLS_CT_ECDSA_FIXED_ECDH 66 --# define TLS_CT_GOST01_SIGN 22 --# define TLS_CT_GOST12_SIGN 238 --# define TLS_CT_GOST12_512_SIGN 239 -- --/* -- * when correcting this number, correct also SSL3_CT_NUMBER in ssl3.h (see -- * comment there) -- */ --# define TLS_CT_NUMBER 10 -- --# if defined(SSL3_CT_NUMBER) --# if TLS_CT_NUMBER != SSL3_CT_NUMBER --# error "SSL/TLS CT_NUMBER values do not match" --# endif --# endif -- --# define TLS1_FINISH_MAC_LENGTH 12 -- --# define TLS_MD_MAX_CONST_SIZE 22 --# define TLS_MD_CLIENT_FINISH_CONST "client finished" --# define TLS_MD_CLIENT_FINISH_CONST_SIZE 15 --# define TLS_MD_SERVER_FINISH_CONST "server finished" --# define TLS_MD_SERVER_FINISH_CONST_SIZE 15 --# define TLS_MD_KEY_EXPANSION_CONST "key expansion" --# define TLS_MD_KEY_EXPANSION_CONST_SIZE 13 --# define TLS_MD_CLIENT_WRITE_KEY_CONST "client write key" --# define TLS_MD_CLIENT_WRITE_KEY_CONST_SIZE 16 --# define TLS_MD_SERVER_WRITE_KEY_CONST "server write key" --# define TLS_MD_SERVER_WRITE_KEY_CONST_SIZE 16 --# define TLS_MD_IV_BLOCK_CONST "IV block" --# define TLS_MD_IV_BLOCK_CONST_SIZE 8 --# define TLS_MD_MASTER_SECRET_CONST "master secret" --# define TLS_MD_MASTER_SECRET_CONST_SIZE 13 --# define TLS_MD_EXTENDED_MASTER_SECRET_CONST "extended master secret" --# define TLS_MD_EXTENDED_MASTER_SECRET_CONST_SIZE 22 -- --# ifdef CHARSET_EBCDIC --# undef TLS_MD_CLIENT_FINISH_CONST --/* -- * client finished -- */ --# define TLS_MD_CLIENT_FINISH_CONST "\x63\x6c\x69\x65\x6e\x74\x20\x66\x69\x6e\x69\x73\x68\x65\x64" -- --# undef TLS_MD_SERVER_FINISH_CONST --/* -- * server finished -- */ --# define TLS_MD_SERVER_FINISH_CONST "\x73\x65\x72\x76\x65\x72\x20\x66\x69\x6e\x69\x73\x68\x65\x64" -- --# undef TLS_MD_SERVER_WRITE_KEY_CONST --/* -- * server write key -- */ --# define TLS_MD_SERVER_WRITE_KEY_CONST "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" -- --# undef TLS_MD_KEY_EXPANSION_CONST --/* -- * key expansion -- */ --# define TLS_MD_KEY_EXPANSION_CONST "\x6b\x65\x79\x20\x65\x78\x70\x61\x6e\x73\x69\x6f\x6e" -- --# undef TLS_MD_CLIENT_WRITE_KEY_CONST --/* -- * client write key -- */ --# define TLS_MD_CLIENT_WRITE_KEY_CONST "\x63\x6c\x69\x65\x6e\x74\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" -- --# undef TLS_MD_SERVER_WRITE_KEY_CONST --/* -- * server write key -- */ --# define TLS_MD_SERVER_WRITE_KEY_CONST "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" -- --# undef TLS_MD_IV_BLOCK_CONST --/* -- * IV block -- */ --# define TLS_MD_IV_BLOCK_CONST "\x49\x56\x20\x62\x6c\x6f\x63\x6b" -- --# undef TLS_MD_MASTER_SECRET_CONST --/* -- * master secret -- */ --# define TLS_MD_MASTER_SECRET_CONST "\x6d\x61\x73\x74\x65\x72\x20\x73\x65\x63\x72\x65\x74" --# undef TLS_MD_EXTENDED_MASTER_SECRET_CONST --/* -- * extended master secret -- */ --# define TLS_MD_EXTENDED_MASTER_SECRET_CONST "\x65\x78\x74\x65\x6e\x64\x65\x64\x20\x6d\x61\x73\x74\x65\x72\x20\x73\x65\x63\x72\x65\x74" --# endif -- --/* TLS Session Ticket extension struct */ --struct tls_session_ticket_ext_st { -- unsigned short length; -- void *data; --}; -- --#ifdef __cplusplus --} --#endif --#endif -diff --git a/uadk_tool/include/openssl/ts.h b/uadk_tool/include/openssl/ts.h -deleted file mode 100644 -index 3b58aa5..0000000 ---- a/uadk_tool/include/openssl/ts.h -+++ /dev/null -@@ -1,559 +0,0 @@ --/* -- * Copyright 2006-2018 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_TS_H --# define HEADER_TS_H -- --# include -- --# ifndef OPENSSL_NO_TS --# include --# include --# include --# include --# include --# include --# include --# include --# include --# include --# ifdef __cplusplus --extern "C" { --# endif -- --# include --# include -- --typedef struct TS_msg_imprint_st TS_MSG_IMPRINT; --typedef struct TS_req_st TS_REQ; --typedef struct TS_accuracy_st TS_ACCURACY; --typedef struct TS_tst_info_st TS_TST_INFO; -- --/* Possible values for status. */ --# define TS_STATUS_GRANTED 0 --# define TS_STATUS_GRANTED_WITH_MODS 1 --# define TS_STATUS_REJECTION 2 --# define TS_STATUS_WAITING 3 --# define TS_STATUS_REVOCATION_WARNING 4 --# define TS_STATUS_REVOCATION_NOTIFICATION 5 -- --/* Possible values for failure_info. */ --# define TS_INFO_BAD_ALG 0 --# define TS_INFO_BAD_REQUEST 2 --# define TS_INFO_BAD_DATA_FORMAT 5 --# define TS_INFO_TIME_NOT_AVAILABLE 14 --# define TS_INFO_UNACCEPTED_POLICY 15 --# define TS_INFO_UNACCEPTED_EXTENSION 16 --# define TS_INFO_ADD_INFO_NOT_AVAILABLE 17 --# define TS_INFO_SYSTEM_FAILURE 25 -- -- --typedef struct TS_status_info_st TS_STATUS_INFO; --typedef struct ESS_issuer_serial ESS_ISSUER_SERIAL; --typedef struct ESS_cert_id ESS_CERT_ID; --typedef struct ESS_signing_cert ESS_SIGNING_CERT; -- --DEFINE_STACK_OF(ESS_CERT_ID) -- --typedef struct ESS_cert_id_v2_st ESS_CERT_ID_V2; --typedef struct ESS_signing_cert_v2_st ESS_SIGNING_CERT_V2; -- --DEFINE_STACK_OF(ESS_CERT_ID_V2) -- --typedef struct TS_resp_st TS_RESP; -- --TS_REQ *TS_REQ_new(void); --void TS_REQ_free(TS_REQ *a); --int i2d_TS_REQ(const TS_REQ *a, unsigned char **pp); --TS_REQ *d2i_TS_REQ(TS_REQ **a, const unsigned char **pp, long length); -- --TS_REQ *TS_REQ_dup(TS_REQ *a); -- --#ifndef OPENSSL_NO_STDIO --TS_REQ *d2i_TS_REQ_fp(FILE *fp, TS_REQ **a); --int i2d_TS_REQ_fp(FILE *fp, TS_REQ *a); --#endif --TS_REQ *d2i_TS_REQ_bio(BIO *fp, TS_REQ **a); --int i2d_TS_REQ_bio(BIO *fp, TS_REQ *a); -- --TS_MSG_IMPRINT *TS_MSG_IMPRINT_new(void); --void TS_MSG_IMPRINT_free(TS_MSG_IMPRINT *a); --int i2d_TS_MSG_IMPRINT(const TS_MSG_IMPRINT *a, unsigned char **pp); --TS_MSG_IMPRINT *d2i_TS_MSG_IMPRINT(TS_MSG_IMPRINT **a, -- const unsigned char **pp, long length); -- --TS_MSG_IMPRINT *TS_MSG_IMPRINT_dup(TS_MSG_IMPRINT *a); -- --#ifndef OPENSSL_NO_STDIO --TS_MSG_IMPRINT *d2i_TS_MSG_IMPRINT_fp(FILE *fp, TS_MSG_IMPRINT **a); --int i2d_TS_MSG_IMPRINT_fp(FILE *fp, TS_MSG_IMPRINT *a); --#endif --TS_MSG_IMPRINT *d2i_TS_MSG_IMPRINT_bio(BIO *bio, TS_MSG_IMPRINT **a); --int i2d_TS_MSG_IMPRINT_bio(BIO *bio, TS_MSG_IMPRINT *a); -- --TS_RESP *TS_RESP_new(void); --void TS_RESP_free(TS_RESP *a); --int i2d_TS_RESP(const TS_RESP *a, unsigned char **pp); --TS_RESP *d2i_TS_RESP(TS_RESP **a, const unsigned char **pp, long length); --TS_TST_INFO *PKCS7_to_TS_TST_INFO(PKCS7 *token); --TS_RESP *TS_RESP_dup(TS_RESP *a); -- --#ifndef OPENSSL_NO_STDIO --TS_RESP *d2i_TS_RESP_fp(FILE *fp, TS_RESP **a); --int i2d_TS_RESP_fp(FILE *fp, TS_RESP *a); --#endif --TS_RESP *d2i_TS_RESP_bio(BIO *bio, TS_RESP **a); --int i2d_TS_RESP_bio(BIO *bio, TS_RESP *a); -- --TS_STATUS_INFO *TS_STATUS_INFO_new(void); --void TS_STATUS_INFO_free(TS_STATUS_INFO *a); --int i2d_TS_STATUS_INFO(const TS_STATUS_INFO *a, unsigned char **pp); --TS_STATUS_INFO *d2i_TS_STATUS_INFO(TS_STATUS_INFO **a, -- const unsigned char **pp, long length); --TS_STATUS_INFO *TS_STATUS_INFO_dup(TS_STATUS_INFO *a); -- --TS_TST_INFO *TS_TST_INFO_new(void); --void TS_TST_INFO_free(TS_TST_INFO *a); --int i2d_TS_TST_INFO(const TS_TST_INFO *a, unsigned char **pp); --TS_TST_INFO *d2i_TS_TST_INFO(TS_TST_INFO **a, const unsigned char **pp, -- long length); --TS_TST_INFO *TS_TST_INFO_dup(TS_TST_INFO *a); -- --#ifndef OPENSSL_NO_STDIO --TS_TST_INFO *d2i_TS_TST_INFO_fp(FILE *fp, TS_TST_INFO **a); --int i2d_TS_TST_INFO_fp(FILE *fp, TS_TST_INFO *a); --#endif --TS_TST_INFO *d2i_TS_TST_INFO_bio(BIO *bio, TS_TST_INFO **a); --int i2d_TS_TST_INFO_bio(BIO *bio, TS_TST_INFO *a); -- --TS_ACCURACY *TS_ACCURACY_new(void); --void TS_ACCURACY_free(TS_ACCURACY *a); --int i2d_TS_ACCURACY(const TS_ACCURACY *a, unsigned char **pp); --TS_ACCURACY *d2i_TS_ACCURACY(TS_ACCURACY **a, const unsigned char **pp, -- long length); --TS_ACCURACY *TS_ACCURACY_dup(TS_ACCURACY *a); -- --ESS_ISSUER_SERIAL *ESS_ISSUER_SERIAL_new(void); --void ESS_ISSUER_SERIAL_free(ESS_ISSUER_SERIAL *a); --int i2d_ESS_ISSUER_SERIAL(const ESS_ISSUER_SERIAL *a, unsigned char **pp); --ESS_ISSUER_SERIAL *d2i_ESS_ISSUER_SERIAL(ESS_ISSUER_SERIAL **a, -- const unsigned char **pp, -- long length); --ESS_ISSUER_SERIAL *ESS_ISSUER_SERIAL_dup(ESS_ISSUER_SERIAL *a); -- --ESS_CERT_ID *ESS_CERT_ID_new(void); --void ESS_CERT_ID_free(ESS_CERT_ID *a); --int i2d_ESS_CERT_ID(const ESS_CERT_ID *a, unsigned char **pp); --ESS_CERT_ID *d2i_ESS_CERT_ID(ESS_CERT_ID **a, const unsigned char **pp, -- long length); --ESS_CERT_ID *ESS_CERT_ID_dup(ESS_CERT_ID *a); -- --ESS_SIGNING_CERT *ESS_SIGNING_CERT_new(void); --void ESS_SIGNING_CERT_free(ESS_SIGNING_CERT *a); --int i2d_ESS_SIGNING_CERT(const ESS_SIGNING_CERT *a, unsigned char **pp); --ESS_SIGNING_CERT *d2i_ESS_SIGNING_CERT(ESS_SIGNING_CERT **a, -- const unsigned char **pp, long length); --ESS_SIGNING_CERT *ESS_SIGNING_CERT_dup(ESS_SIGNING_CERT *a); -- --ESS_CERT_ID_V2 *ESS_CERT_ID_V2_new(void); --void ESS_CERT_ID_V2_free(ESS_CERT_ID_V2 *a); --int i2d_ESS_CERT_ID_V2(const ESS_CERT_ID_V2 *a, unsigned char **pp); --ESS_CERT_ID_V2 *d2i_ESS_CERT_ID_V2(ESS_CERT_ID_V2 **a, -- const unsigned char **pp, long length); --ESS_CERT_ID_V2 *ESS_CERT_ID_V2_dup(ESS_CERT_ID_V2 *a); -- --ESS_SIGNING_CERT_V2 *ESS_SIGNING_CERT_V2_new(void); --void ESS_SIGNING_CERT_V2_free(ESS_SIGNING_CERT_V2 *a); --int i2d_ESS_SIGNING_CERT_V2(const ESS_SIGNING_CERT_V2 *a, unsigned char **pp); --ESS_SIGNING_CERT_V2 *d2i_ESS_SIGNING_CERT_V2(ESS_SIGNING_CERT_V2 **a, -- const unsigned char **pp, -- long length); --ESS_SIGNING_CERT_V2 *ESS_SIGNING_CERT_V2_dup(ESS_SIGNING_CERT_V2 *a); -- --int TS_REQ_set_version(TS_REQ *a, long version); --long TS_REQ_get_version(const TS_REQ *a); -- --int TS_STATUS_INFO_set_status(TS_STATUS_INFO *a, int i); --const ASN1_INTEGER *TS_STATUS_INFO_get0_status(const TS_STATUS_INFO *a); -- --const STACK_OF(ASN1_UTF8STRING) * --TS_STATUS_INFO_get0_text(const TS_STATUS_INFO *a); -- --const ASN1_BIT_STRING * --TS_STATUS_INFO_get0_failure_info(const TS_STATUS_INFO *a); -- --int TS_REQ_set_msg_imprint(TS_REQ *a, TS_MSG_IMPRINT *msg_imprint); --TS_MSG_IMPRINT *TS_REQ_get_msg_imprint(TS_REQ *a); -- --int TS_MSG_IMPRINT_set_algo(TS_MSG_IMPRINT *a, X509_ALGOR *alg); --X509_ALGOR *TS_MSG_IMPRINT_get_algo(TS_MSG_IMPRINT *a); -- --int TS_MSG_IMPRINT_set_msg(TS_MSG_IMPRINT *a, unsigned char *d, int len); --ASN1_OCTET_STRING *TS_MSG_IMPRINT_get_msg(TS_MSG_IMPRINT *a); -- --int TS_REQ_set_policy_id(TS_REQ *a, const ASN1_OBJECT *policy); --ASN1_OBJECT *TS_REQ_get_policy_id(TS_REQ *a); -- --int TS_REQ_set_nonce(TS_REQ *a, const ASN1_INTEGER *nonce); --const ASN1_INTEGER *TS_REQ_get_nonce(const TS_REQ *a); -- --int TS_REQ_set_cert_req(TS_REQ *a, int cert_req); --int TS_REQ_get_cert_req(const TS_REQ *a); -- --STACK_OF(X509_EXTENSION) *TS_REQ_get_exts(TS_REQ *a); --void TS_REQ_ext_free(TS_REQ *a); --int TS_REQ_get_ext_count(TS_REQ *a); --int TS_REQ_get_ext_by_NID(TS_REQ *a, int nid, int lastpos); --int TS_REQ_get_ext_by_OBJ(TS_REQ *a, const ASN1_OBJECT *obj, int lastpos); --int TS_REQ_get_ext_by_critical(TS_REQ *a, int crit, int lastpos); --X509_EXTENSION *TS_REQ_get_ext(TS_REQ *a, int loc); --X509_EXTENSION *TS_REQ_delete_ext(TS_REQ *a, int loc); --int TS_REQ_add_ext(TS_REQ *a, X509_EXTENSION *ex, int loc); --void *TS_REQ_get_ext_d2i(TS_REQ *a, int nid, int *crit, int *idx); -- --/* Function declarations for TS_REQ defined in ts/ts_req_print.c */ -- --int TS_REQ_print_bio(BIO *bio, TS_REQ *a); -- --/* Function declarations for TS_RESP defined in ts/ts_resp_utils.c */ -- --int TS_RESP_set_status_info(TS_RESP *a, TS_STATUS_INFO *info); --TS_STATUS_INFO *TS_RESP_get_status_info(TS_RESP *a); -- --/* Caller loses ownership of PKCS7 and TS_TST_INFO objects. */ --void TS_RESP_set_tst_info(TS_RESP *a, PKCS7 *p7, TS_TST_INFO *tst_info); --PKCS7 *TS_RESP_get_token(TS_RESP *a); --TS_TST_INFO *TS_RESP_get_tst_info(TS_RESP *a); -- --int TS_TST_INFO_set_version(TS_TST_INFO *a, long version); --long TS_TST_INFO_get_version(const TS_TST_INFO *a); -- --int TS_TST_INFO_set_policy_id(TS_TST_INFO *a, ASN1_OBJECT *policy_id); --ASN1_OBJECT *TS_TST_INFO_get_policy_id(TS_TST_INFO *a); -- --int TS_TST_INFO_set_msg_imprint(TS_TST_INFO *a, TS_MSG_IMPRINT *msg_imprint); --TS_MSG_IMPRINT *TS_TST_INFO_get_msg_imprint(TS_TST_INFO *a); -- --int TS_TST_INFO_set_serial(TS_TST_INFO *a, const ASN1_INTEGER *serial); --const ASN1_INTEGER *TS_TST_INFO_get_serial(const TS_TST_INFO *a); -- --int TS_TST_INFO_set_time(TS_TST_INFO *a, const ASN1_GENERALIZEDTIME *gtime); --const ASN1_GENERALIZEDTIME *TS_TST_INFO_get_time(const TS_TST_INFO *a); -- --int TS_TST_INFO_set_accuracy(TS_TST_INFO *a, TS_ACCURACY *accuracy); --TS_ACCURACY *TS_TST_INFO_get_accuracy(TS_TST_INFO *a); -- --int TS_ACCURACY_set_seconds(TS_ACCURACY *a, const ASN1_INTEGER *seconds); --const ASN1_INTEGER *TS_ACCURACY_get_seconds(const TS_ACCURACY *a); -- --int TS_ACCURACY_set_millis(TS_ACCURACY *a, const ASN1_INTEGER *millis); --const ASN1_INTEGER *TS_ACCURACY_get_millis(const TS_ACCURACY *a); -- --int TS_ACCURACY_set_micros(TS_ACCURACY *a, const ASN1_INTEGER *micros); --const ASN1_INTEGER *TS_ACCURACY_get_micros(const TS_ACCURACY *a); -- --int TS_TST_INFO_set_ordering(TS_TST_INFO *a, int ordering); --int TS_TST_INFO_get_ordering(const TS_TST_INFO *a); -- --int TS_TST_INFO_set_nonce(TS_TST_INFO *a, const ASN1_INTEGER *nonce); --const ASN1_INTEGER *TS_TST_INFO_get_nonce(const TS_TST_INFO *a); -- --int TS_TST_INFO_set_tsa(TS_TST_INFO *a, GENERAL_NAME *tsa); --GENERAL_NAME *TS_TST_INFO_get_tsa(TS_TST_INFO *a); -- --STACK_OF(X509_EXTENSION) *TS_TST_INFO_get_exts(TS_TST_INFO *a); --void TS_TST_INFO_ext_free(TS_TST_INFO *a); --int TS_TST_INFO_get_ext_count(TS_TST_INFO *a); --int TS_TST_INFO_get_ext_by_NID(TS_TST_INFO *a, int nid, int lastpos); --int TS_TST_INFO_get_ext_by_OBJ(TS_TST_INFO *a, const ASN1_OBJECT *obj, -- int lastpos); --int TS_TST_INFO_get_ext_by_critical(TS_TST_INFO *a, int crit, int lastpos); --X509_EXTENSION *TS_TST_INFO_get_ext(TS_TST_INFO *a, int loc); --X509_EXTENSION *TS_TST_INFO_delete_ext(TS_TST_INFO *a, int loc); --int TS_TST_INFO_add_ext(TS_TST_INFO *a, X509_EXTENSION *ex, int loc); --void *TS_TST_INFO_get_ext_d2i(TS_TST_INFO *a, int nid, int *crit, int *idx); -- --/* -- * Declarations related to response generation, defined in ts/ts_resp_sign.c. -- */ -- --/* Optional flags for response generation. */ -- --/* Don't include the TSA name in response. */ --# define TS_TSA_NAME 0x01 -- --/* Set ordering to true in response. */ --# define TS_ORDERING 0x02 -- --/* -- * Include the signer certificate and the other specified certificates in -- * the ESS signing certificate attribute beside the PKCS7 signed data. -- * Only the signer certificates is included by default. -- */ --# define TS_ESS_CERT_ID_CHAIN 0x04 -- --/* Forward declaration. */ --struct TS_resp_ctx; -- --/* This must return a unique number less than 160 bits long. */ --typedef ASN1_INTEGER *(*TS_serial_cb) (struct TS_resp_ctx *, void *); -- --/* -- * This must return the seconds and microseconds since Jan 1, 1970 in the sec -- * and usec variables allocated by the caller. Return non-zero for success -- * and zero for failure. -- */ --typedef int (*TS_time_cb) (struct TS_resp_ctx *, void *, long *sec, -- long *usec); -- --/* -- * This must process the given extension. It can modify the TS_TST_INFO -- * object of the context. Return values: !0 (processed), 0 (error, it must -- * set the status info/failure info of the response). -- */ --typedef int (*TS_extension_cb) (struct TS_resp_ctx *, X509_EXTENSION *, -- void *); -- --typedef struct TS_resp_ctx TS_RESP_CTX; -- --DEFINE_STACK_OF_CONST(EVP_MD) -- --/* Creates a response context that can be used for generating responses. */ --TS_RESP_CTX *TS_RESP_CTX_new(void); --void TS_RESP_CTX_free(TS_RESP_CTX *ctx); -- --/* This parameter must be set. */ --int TS_RESP_CTX_set_signer_cert(TS_RESP_CTX *ctx, X509 *signer); -- --/* This parameter must be set. */ --int TS_RESP_CTX_set_signer_key(TS_RESP_CTX *ctx, EVP_PKEY *key); -- --int TS_RESP_CTX_set_signer_digest(TS_RESP_CTX *ctx, -- const EVP_MD *signer_digest); --int TS_RESP_CTX_set_ess_cert_id_digest(TS_RESP_CTX *ctx, const EVP_MD *md); -- --/* This parameter must be set. */ --int TS_RESP_CTX_set_def_policy(TS_RESP_CTX *ctx, const ASN1_OBJECT *def_policy); -- --/* No additional certs are included in the response by default. */ --int TS_RESP_CTX_set_certs(TS_RESP_CTX *ctx, STACK_OF(X509) *certs); -- --/* -- * Adds a new acceptable policy, only the default policy is accepted by -- * default. -- */ --int TS_RESP_CTX_add_policy(TS_RESP_CTX *ctx, const ASN1_OBJECT *policy); -- --/* -- * Adds a new acceptable message digest. Note that no message digests are -- * accepted by default. The md argument is shared with the caller. -- */ --int TS_RESP_CTX_add_md(TS_RESP_CTX *ctx, const EVP_MD *md); -- --/* Accuracy is not included by default. */ --int TS_RESP_CTX_set_accuracy(TS_RESP_CTX *ctx, -- int secs, int millis, int micros); -- --/* -- * Clock precision digits, i.e. the number of decimal digits: '0' means sec, -- * '3' msec, '6' usec, and so on. Default is 0. -- */ --int TS_RESP_CTX_set_clock_precision_digits(TS_RESP_CTX *ctx, -- unsigned clock_precision_digits); --/* At most we accept usec precision. */ --# define TS_MAX_CLOCK_PRECISION_DIGITS 6 -- --/* Maximum status message length */ --# define TS_MAX_STATUS_LENGTH (1024 * 1024) -- --/* No flags are set by default. */ --void TS_RESP_CTX_add_flags(TS_RESP_CTX *ctx, int flags); -- --/* Default callback always returns a constant. */ --void TS_RESP_CTX_set_serial_cb(TS_RESP_CTX *ctx, TS_serial_cb cb, void *data); -- --/* Default callback uses the gettimeofday() and gmtime() system calls. */ --void TS_RESP_CTX_set_time_cb(TS_RESP_CTX *ctx, TS_time_cb cb, void *data); -- --/* -- * Default callback rejects all extensions. The extension callback is called -- * when the TS_TST_INFO object is already set up and not signed yet. -- */ --/* FIXME: extension handling is not tested yet. */ --void TS_RESP_CTX_set_extension_cb(TS_RESP_CTX *ctx, -- TS_extension_cb cb, void *data); -- --/* The following methods can be used in the callbacks. */ --int TS_RESP_CTX_set_status_info(TS_RESP_CTX *ctx, -- int status, const char *text); -- --/* Sets the status info only if it is still TS_STATUS_GRANTED. */ --int TS_RESP_CTX_set_status_info_cond(TS_RESP_CTX *ctx, -- int status, const char *text); -- --int TS_RESP_CTX_add_failure_info(TS_RESP_CTX *ctx, int failure); -- --/* The get methods below can be used in the extension callback. */ --TS_REQ *TS_RESP_CTX_get_request(TS_RESP_CTX *ctx); -- --TS_TST_INFO *TS_RESP_CTX_get_tst_info(TS_RESP_CTX *ctx); -- --/* -- * Creates the signed TS_TST_INFO and puts it in TS_RESP. -- * In case of errors it sets the status info properly. -- * Returns NULL only in case of memory allocation/fatal error. -- */ --TS_RESP *TS_RESP_create_response(TS_RESP_CTX *ctx, BIO *req_bio); -- --/* -- * Declarations related to response verification, -- * they are defined in ts/ts_resp_verify.c. -- */ -- --int TS_RESP_verify_signature(PKCS7 *token, STACK_OF(X509) *certs, -- X509_STORE *store, X509 **signer_out); -- --/* Context structure for the generic verify method. */ -- --/* Verify the signer's certificate and the signature of the response. */ --# define TS_VFY_SIGNATURE (1u << 0) --/* Verify the version number of the response. */ --# define TS_VFY_VERSION (1u << 1) --/* Verify if the policy supplied by the user matches the policy of the TSA. */ --# define TS_VFY_POLICY (1u << 2) --/* -- * Verify the message imprint provided by the user. This flag should not be -- * specified with TS_VFY_DATA. -- */ --# define TS_VFY_IMPRINT (1u << 3) --/* -- * Verify the message imprint computed by the verify method from the user -- * provided data and the MD algorithm of the response. This flag should not -- * be specified with TS_VFY_IMPRINT. -- */ --# define TS_VFY_DATA (1u << 4) --/* Verify the nonce value. */ --# define TS_VFY_NONCE (1u << 5) --/* Verify if the TSA name field matches the signer certificate. */ --# define TS_VFY_SIGNER (1u << 6) --/* Verify if the TSA name field equals to the user provided name. */ --# define TS_VFY_TSA_NAME (1u << 7) -- --/* You can use the following convenience constants. */ --# define TS_VFY_ALL_IMPRINT (TS_VFY_SIGNATURE \ -- | TS_VFY_VERSION \ -- | TS_VFY_POLICY \ -- | TS_VFY_IMPRINT \ -- | TS_VFY_NONCE \ -- | TS_VFY_SIGNER \ -- | TS_VFY_TSA_NAME) --# define TS_VFY_ALL_DATA (TS_VFY_SIGNATURE \ -- | TS_VFY_VERSION \ -- | TS_VFY_POLICY \ -- | TS_VFY_DATA \ -- | TS_VFY_NONCE \ -- | TS_VFY_SIGNER \ -- | TS_VFY_TSA_NAME) -- --typedef struct TS_verify_ctx TS_VERIFY_CTX; -- --int TS_RESP_verify_response(TS_VERIFY_CTX *ctx, TS_RESP *response); --int TS_RESP_verify_token(TS_VERIFY_CTX *ctx, PKCS7 *token); -- --/* -- * Declarations related to response verification context, -- */ --TS_VERIFY_CTX *TS_VERIFY_CTX_new(void); --void TS_VERIFY_CTX_init(TS_VERIFY_CTX *ctx); --void TS_VERIFY_CTX_free(TS_VERIFY_CTX *ctx); --void TS_VERIFY_CTX_cleanup(TS_VERIFY_CTX *ctx); --int TS_VERIFY_CTX_set_flags(TS_VERIFY_CTX *ctx, int f); --int TS_VERIFY_CTX_add_flags(TS_VERIFY_CTX *ctx, int f); --BIO *TS_VERIFY_CTX_set_data(TS_VERIFY_CTX *ctx, BIO *b); --unsigned char *TS_VERIFY_CTX_set_imprint(TS_VERIFY_CTX *ctx, -- unsigned char *hexstr, long len); --X509_STORE *TS_VERIFY_CTX_set_store(TS_VERIFY_CTX *ctx, X509_STORE *s); --STACK_OF(X509) *TS_VERIFY_CTS_set_certs(TS_VERIFY_CTX *ctx, STACK_OF(X509) *certs); -- --/*- -- * If ctx is NULL, it allocates and returns a new object, otherwise -- * it returns ctx. It initialises all the members as follows: -- * flags = TS_VFY_ALL_IMPRINT & ~(TS_VFY_TSA_NAME | TS_VFY_SIGNATURE) -- * certs = NULL -- * store = NULL -- * policy = policy from the request or NULL if absent (in this case -- * TS_VFY_POLICY is cleared from flags as well) -- * md_alg = MD algorithm from request -- * imprint, imprint_len = imprint from request -- * data = NULL -- * nonce, nonce_len = nonce from the request or NULL if absent (in this case -- * TS_VFY_NONCE is cleared from flags as well) -- * tsa_name = NULL -- * Important: after calling this method TS_VFY_SIGNATURE should be added! -- */ --TS_VERIFY_CTX *TS_REQ_to_TS_VERIFY_CTX(TS_REQ *req, TS_VERIFY_CTX *ctx); -- --/* Function declarations for TS_RESP defined in ts/ts_resp_print.c */ -- --int TS_RESP_print_bio(BIO *bio, TS_RESP *a); --int TS_STATUS_INFO_print_bio(BIO *bio, TS_STATUS_INFO *a); --int TS_TST_INFO_print_bio(BIO *bio, TS_TST_INFO *a); -- --/* Common utility functions defined in ts/ts_lib.c */ -- --int TS_ASN1_INTEGER_print_bio(BIO *bio, const ASN1_INTEGER *num); --int TS_OBJ_print_bio(BIO *bio, const ASN1_OBJECT *obj); --int TS_ext_print_bio(BIO *bio, const STACK_OF(X509_EXTENSION) *extensions); --int TS_X509_ALGOR_print_bio(BIO *bio, const X509_ALGOR *alg); --int TS_MSG_IMPRINT_print_bio(BIO *bio, TS_MSG_IMPRINT *msg); -- --/* -- * Function declarations for handling configuration options, defined in -- * ts/ts_conf.c -- */ -- --X509 *TS_CONF_load_cert(const char *file); --STACK_OF(X509) *TS_CONF_load_certs(const char *file); --EVP_PKEY *TS_CONF_load_key(const char *file, const char *pass); --const char *TS_CONF_get_tsa_section(CONF *conf, const char *section); --int TS_CONF_set_serial(CONF *conf, const char *section, TS_serial_cb cb, -- TS_RESP_CTX *ctx); --#ifndef OPENSSL_NO_ENGINE --int TS_CONF_set_crypto_device(CONF *conf, const char *section, -- const char *device); --int TS_CONF_set_default_engine(const char *name); --#endif --int TS_CONF_set_signer_cert(CONF *conf, const char *section, -- const char *cert, TS_RESP_CTX *ctx); --int TS_CONF_set_certs(CONF *conf, const char *section, const char *certs, -- TS_RESP_CTX *ctx); --int TS_CONF_set_signer_key(CONF *conf, const char *section, -- const char *key, const char *pass, -- TS_RESP_CTX *ctx); --int TS_CONF_set_signer_digest(CONF *conf, const char *section, -- const char *md, TS_RESP_CTX *ctx); --int TS_CONF_set_def_policy(CONF *conf, const char *section, -- const char *policy, TS_RESP_CTX *ctx); --int TS_CONF_set_policies(CONF *conf, const char *section, TS_RESP_CTX *ctx); --int TS_CONF_set_digests(CONF *conf, const char *section, TS_RESP_CTX *ctx); --int TS_CONF_set_accuracy(CONF *conf, const char *section, TS_RESP_CTX *ctx); --int TS_CONF_set_clock_precision_digits(CONF *conf, const char *section, -- TS_RESP_CTX *ctx); --int TS_CONF_set_ordering(CONF *conf, const char *section, TS_RESP_CTX *ctx); --int TS_CONF_set_tsa_name(CONF *conf, const char *section, TS_RESP_CTX *ctx); --int TS_CONF_set_ess_cert_id_chain(CONF *conf, const char *section, -- TS_RESP_CTX *ctx); --int TS_CONF_set_ess_cert_id_digest(CONF *conf, const char *section, -- TS_RESP_CTX *ctx); -- --# ifdef __cplusplus --} --# endif --# endif --#endif -diff --git a/uadk_tool/include/openssl/tserr.h b/uadk_tool/include/openssl/tserr.h -deleted file mode 100644 -index 07f2333..0000000 ---- a/uadk_tool/include/openssl/tserr.h -+++ /dev/null -@@ -1,132 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_TSERR_H --# define HEADER_TSERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# include -- --# ifndef OPENSSL_NO_TS -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_TS_strings(void); -- --/* -- * TS function codes. -- */ --# define TS_F_DEF_SERIAL_CB 110 --# define TS_F_DEF_TIME_CB 111 --# define TS_F_ESS_ADD_SIGNING_CERT 112 --# define TS_F_ESS_ADD_SIGNING_CERT_V2 147 --# define TS_F_ESS_CERT_ID_NEW_INIT 113 --# define TS_F_ESS_CERT_ID_V2_NEW_INIT 156 --# define TS_F_ESS_SIGNING_CERT_NEW_INIT 114 --# define TS_F_ESS_SIGNING_CERT_V2_NEW_INIT 157 --# define TS_F_INT_TS_RESP_VERIFY_TOKEN 149 --# define TS_F_PKCS7_TO_TS_TST_INFO 148 --# define TS_F_TS_ACCURACY_SET_MICROS 115 --# define TS_F_TS_ACCURACY_SET_MILLIS 116 --# define TS_F_TS_ACCURACY_SET_SECONDS 117 --# define TS_F_TS_CHECK_IMPRINTS 100 --# define TS_F_TS_CHECK_NONCES 101 --# define TS_F_TS_CHECK_POLICY 102 --# define TS_F_TS_CHECK_SIGNING_CERTS 103 --# define TS_F_TS_CHECK_STATUS_INFO 104 --# define TS_F_TS_COMPUTE_IMPRINT 145 --# define TS_F_TS_CONF_INVALID 151 --# define TS_F_TS_CONF_LOAD_CERT 153 --# define TS_F_TS_CONF_LOAD_CERTS 154 --# define TS_F_TS_CONF_LOAD_KEY 155 --# define TS_F_TS_CONF_LOOKUP_FAIL 152 --# define TS_F_TS_CONF_SET_DEFAULT_ENGINE 146 --# define TS_F_TS_GET_STATUS_TEXT 105 --# define TS_F_TS_MSG_IMPRINT_SET_ALGO 118 --# define TS_F_TS_REQ_SET_MSG_IMPRINT 119 --# define TS_F_TS_REQ_SET_NONCE 120 --# define TS_F_TS_REQ_SET_POLICY_ID 121 --# define TS_F_TS_RESP_CREATE_RESPONSE 122 --# define TS_F_TS_RESP_CREATE_TST_INFO 123 --# define TS_F_TS_RESP_CTX_ADD_FAILURE_INFO 124 --# define TS_F_TS_RESP_CTX_ADD_MD 125 --# define TS_F_TS_RESP_CTX_ADD_POLICY 126 --# define TS_F_TS_RESP_CTX_NEW 127 --# define TS_F_TS_RESP_CTX_SET_ACCURACY 128 --# define TS_F_TS_RESP_CTX_SET_CERTS 129 --# define TS_F_TS_RESP_CTX_SET_DEF_POLICY 130 --# define TS_F_TS_RESP_CTX_SET_SIGNER_CERT 131 --# define TS_F_TS_RESP_CTX_SET_STATUS_INFO 132 --# define TS_F_TS_RESP_GET_POLICY 133 --# define TS_F_TS_RESP_SET_GENTIME_WITH_PRECISION 134 --# define TS_F_TS_RESP_SET_STATUS_INFO 135 --# define TS_F_TS_RESP_SET_TST_INFO 150 --# define TS_F_TS_RESP_SIGN 136 --# define TS_F_TS_RESP_VERIFY_SIGNATURE 106 --# define TS_F_TS_TST_INFO_SET_ACCURACY 137 --# define TS_F_TS_TST_INFO_SET_MSG_IMPRINT 138 --# define TS_F_TS_TST_INFO_SET_NONCE 139 --# define TS_F_TS_TST_INFO_SET_POLICY_ID 140 --# define TS_F_TS_TST_INFO_SET_SERIAL 141 --# define TS_F_TS_TST_INFO_SET_TIME 142 --# define TS_F_TS_TST_INFO_SET_TSA 143 --# define TS_F_TS_VERIFY 108 --# define TS_F_TS_VERIFY_CERT 109 --# define TS_F_TS_VERIFY_CTX_NEW 144 -- --/* -- * TS reason codes. -- */ --# define TS_R_BAD_PKCS7_TYPE 132 --# define TS_R_BAD_TYPE 133 --# define TS_R_CANNOT_LOAD_CERT 137 --# define TS_R_CANNOT_LOAD_KEY 138 --# define TS_R_CERTIFICATE_VERIFY_ERROR 100 --# define TS_R_COULD_NOT_SET_ENGINE 127 --# define TS_R_COULD_NOT_SET_TIME 115 --# define TS_R_DETACHED_CONTENT 134 --# define TS_R_ESS_ADD_SIGNING_CERT_ERROR 116 --# define TS_R_ESS_ADD_SIGNING_CERT_V2_ERROR 139 --# define TS_R_ESS_SIGNING_CERTIFICATE_ERROR 101 --# define TS_R_INVALID_NULL_POINTER 102 --# define TS_R_INVALID_SIGNER_CERTIFICATE_PURPOSE 117 --# define TS_R_MESSAGE_IMPRINT_MISMATCH 103 --# define TS_R_NONCE_MISMATCH 104 --# define TS_R_NONCE_NOT_RETURNED 105 --# define TS_R_NO_CONTENT 106 --# define TS_R_NO_TIME_STAMP_TOKEN 107 --# define TS_R_PKCS7_ADD_SIGNATURE_ERROR 118 --# define TS_R_PKCS7_ADD_SIGNED_ATTR_ERROR 119 --# define TS_R_PKCS7_TO_TS_TST_INFO_FAILED 129 --# define TS_R_POLICY_MISMATCH 108 --# define TS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 120 --# define TS_R_RESPONSE_SETUP_ERROR 121 --# define TS_R_SIGNATURE_FAILURE 109 --# define TS_R_THERE_MUST_BE_ONE_SIGNER 110 --# define TS_R_TIME_SYSCALL_ERROR 122 --# define TS_R_TOKEN_NOT_PRESENT 130 --# define TS_R_TOKEN_PRESENT 131 --# define TS_R_TSA_NAME_MISMATCH 111 --# define TS_R_TSA_UNTRUSTED 112 --# define TS_R_TST_INFO_SETUP_ERROR 123 --# define TS_R_TS_DATASIGN 124 --# define TS_R_UNACCEPTABLE_POLICY 125 --# define TS_R_UNSUPPORTED_MD_ALGORITHM 126 --# define TS_R_UNSUPPORTED_VERSION 113 --# define TS_R_VAR_BAD_VALUE 135 --# define TS_R_VAR_LOOKUP_FAILURE 136 --# define TS_R_WRONG_CONTENT_TYPE 114 -- --# endif --#endif -diff --git a/uadk_tool/include/openssl/txt_db.h b/uadk_tool/include/openssl/txt_db.h -deleted file mode 100644 -index ec981a4..0000000 ---- a/uadk_tool/include/openssl/txt_db.h -+++ /dev/null -@@ -1,57 +0,0 @@ --/* -- * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_TXT_DB_H --# define HEADER_TXT_DB_H -- --# include --# include --# include --# include -- --# define DB_ERROR_OK 0 --# define DB_ERROR_MALLOC 1 --# define DB_ERROR_INDEX_CLASH 2 --# define DB_ERROR_INDEX_OUT_OF_RANGE 3 --# define DB_ERROR_NO_INDEX 4 --# define DB_ERROR_INSERT_INDEX_CLASH 5 --# define DB_ERROR_WRONG_NUM_FIELDS 6 -- --#ifdef __cplusplus --extern "C" { --#endif -- --typedef OPENSSL_STRING *OPENSSL_PSTRING; --DEFINE_SPECIAL_STACK_OF(OPENSSL_PSTRING, OPENSSL_STRING) -- --typedef struct txt_db_st { -- int num_fields; -- STACK_OF(OPENSSL_PSTRING) *data; -- LHASH_OF(OPENSSL_STRING) **index; -- int (**qual) (OPENSSL_STRING *); -- long error; -- long arg1; -- long arg2; -- OPENSSL_STRING *arg_row; --} TXT_DB; -- --TXT_DB *TXT_DB_read(BIO *in, int num); --long TXT_DB_write(BIO *out, TXT_DB *db); --int TXT_DB_create_index(TXT_DB *db, int field, int (*qual) (OPENSSL_STRING *), -- OPENSSL_LH_HASHFUNC hash, OPENSSL_LH_COMPFUNC cmp); --void TXT_DB_free(TXT_DB *db); --OPENSSL_STRING *TXT_DB_get_by_index(TXT_DB *db, int idx, -- OPENSSL_STRING *value); --int TXT_DB_insert(TXT_DB *db, OPENSSL_STRING *value); -- --#ifdef __cplusplus --} --#endif -- --#endif -diff --git a/uadk_tool/include/openssl/ui.h b/uadk_tool/include/openssl/ui.h -deleted file mode 100644 -index 7c721ec..0000000 ---- a/uadk_tool/include/openssl/ui.h -+++ /dev/null -@@ -1,368 +0,0 @@ --/* -- * Copyright 2001-2018 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_UI_H --# define HEADER_UI_H -- --# include -- --# if OPENSSL_API_COMPAT < 0x10100000L --# include --# endif --# include --# include --# include --# include -- --/* For compatibility reasons, the macro OPENSSL_NO_UI is currently retained */ --# if OPENSSL_API_COMPAT < 0x10200000L --# ifdef OPENSSL_NO_UI_CONSOLE --# define OPENSSL_NO_UI --# endif --# endif -- --# ifdef __cplusplus --extern "C" { --# endif -- --/* -- * All the following functions return -1 or NULL on error and in some cases -- * (UI_process()) -2 if interrupted or in some other way cancelled. When -- * everything is fine, they return 0, a positive value or a non-NULL pointer, -- * all depending on their purpose. -- */ -- --/* Creators and destructor. */ --UI *UI_new(void); --UI *UI_new_method(const UI_METHOD *method); --void UI_free(UI *ui); -- --/*- -- The following functions are used to add strings to be printed and prompt -- strings to prompt for data. The names are UI_{add,dup}__string -- and UI_{add,dup}_input_boolean. -- -- UI_{add,dup}__string have the following meanings: -- add add a text or prompt string. The pointers given to these -- functions are used verbatim, no copying is done. -- dup make a copy of the text or prompt string, then add the copy -- to the collection of strings in the user interface. -- -- The function is a name for the functionality that the given -- string shall be used for. It can be one of: -- input use the string as data prompt. -- verify use the string as verification prompt. This -- is used to verify a previous input. -- info use the string for informational output. -- error use the string for error output. -- Honestly, there's currently no difference between info and error for the -- moment. -- -- UI_{add,dup}_input_boolean have the same semantics for "add" and "dup", -- and are typically used when one wants to prompt for a yes/no response. -- -- All of the functions in this group take a UI and a prompt string. -- The string input and verify addition functions also take a flag argument, -- a buffer for the result to end up with, a minimum input size and a maximum -- input size (the result buffer MUST be large enough to be able to contain -- the maximum number of characters). Additionally, the verify addition -- functions takes another buffer to compare the result against. -- The boolean input functions take an action description string (which should -- be safe to ignore if the expected user action is obvious, for example with -- a dialog box with an OK button and a Cancel button), a string of acceptable -- characters to mean OK and to mean Cancel. The two last strings are checked -- to make sure they don't have common characters. Additionally, the same -- flag argument as for the string input is taken, as well as a result buffer. -- The result buffer is required to be at least one byte long. Depending on -- the answer, the first character from the OK or the Cancel character strings -- will be stored in the first byte of the result buffer. No NUL will be -- added, so the result is *not* a string. -- -- On success, the all return an index of the added information. That index -- is useful when retrieving results with UI_get0_result(). */ --int UI_add_input_string(UI *ui, const char *prompt, int flags, -- char *result_buf, int minsize, int maxsize); --int UI_dup_input_string(UI *ui, const char *prompt, int flags, -- char *result_buf, int minsize, int maxsize); --int UI_add_verify_string(UI *ui, const char *prompt, int flags, -- char *result_buf, int minsize, int maxsize, -- const char *test_buf); --int UI_dup_verify_string(UI *ui, const char *prompt, int flags, -- char *result_buf, int minsize, int maxsize, -- const char *test_buf); --int UI_add_input_boolean(UI *ui, const char *prompt, const char *action_desc, -- const char *ok_chars, const char *cancel_chars, -- int flags, char *result_buf); --int UI_dup_input_boolean(UI *ui, const char *prompt, const char *action_desc, -- const char *ok_chars, const char *cancel_chars, -- int flags, char *result_buf); --int UI_add_info_string(UI *ui, const char *text); --int UI_dup_info_string(UI *ui, const char *text); --int UI_add_error_string(UI *ui, const char *text); --int UI_dup_error_string(UI *ui, const char *text); -- --/* These are the possible flags. They can be or'ed together. */ --/* Use to have echoing of input */ --# define UI_INPUT_FLAG_ECHO 0x01 --/* -- * Use a default password. Where that password is found is completely up to -- * the application, it might for example be in the user data set with -- * UI_add_user_data(). It is not recommended to have more than one input in -- * each UI being marked with this flag, or the application might get -- * confused. -- */ --# define UI_INPUT_FLAG_DEFAULT_PWD 0x02 -- --/*- -- * The user of these routines may want to define flags of their own. The core -- * UI won't look at those, but will pass them on to the method routines. They -- * must use higher bits so they don't get confused with the UI bits above. -- * UI_INPUT_FLAG_USER_BASE tells which is the lowest bit to use. A good -- * example of use is this: -- * -- * #define MY_UI_FLAG1 (0x01 << UI_INPUT_FLAG_USER_BASE) -- * --*/ --# define UI_INPUT_FLAG_USER_BASE 16 -- --/*- -- * The following function helps construct a prompt. object_desc is a -- * textual short description of the object, for example "pass phrase", -- * and object_name is the name of the object (might be a card name or -- * a file name. -- * The returned string shall always be allocated on the heap with -- * OPENSSL_malloc(), and need to be free'd with OPENSSL_free(). -- * -- * If the ui_method doesn't contain a pointer to a user-defined prompt -- * constructor, a default string is built, looking like this: -- * -- * "Enter {object_desc} for {object_name}:" -- * -- * So, if object_desc has the value "pass phrase" and object_name has -- * the value "foo.key", the resulting string is: -- * -- * "Enter pass phrase for foo.key:" --*/ --char *UI_construct_prompt(UI *ui_method, -- const char *object_desc, const char *object_name); -- --/* -- * The following function is used to store a pointer to user-specific data. -- * Any previous such pointer will be returned and replaced. -- * -- * For callback purposes, this function makes a lot more sense than using -- * ex_data, since the latter requires that different parts of OpenSSL or -- * applications share the same ex_data index. -- * -- * Note that the UI_OpenSSL() method completely ignores the user data. Other -- * methods may not, however. -- */ --void *UI_add_user_data(UI *ui, void *user_data); --/* -- * Alternatively, this function is used to duplicate the user data. -- * This uses the duplicator method function. The destroy function will -- * be used to free the user data in this case. -- */ --int UI_dup_user_data(UI *ui, void *user_data); --/* We need a user data retrieving function as well. */ --void *UI_get0_user_data(UI *ui); -- --/* Return the result associated with a prompt given with the index i. */ --const char *UI_get0_result(UI *ui, int i); --int UI_get_result_length(UI *ui, int i); -- --/* When all strings have been added, process the whole thing. */ --int UI_process(UI *ui); -- --/* -- * Give a user interface parameterised control commands. This can be used to -- * send down an integer, a data pointer or a function pointer, as well as be -- * used to get information from a UI. -- */ --int UI_ctrl(UI *ui, int cmd, long i, void *p, void (*f) (void)); -- --/* The commands */ --/* -- * Use UI_CONTROL_PRINT_ERRORS with the value 1 to have UI_process print the -- * OpenSSL error stack before printing any info or added error messages and -- * before any prompting. -- */ --# define UI_CTRL_PRINT_ERRORS 1 --/* -- * Check if a UI_process() is possible to do again with the same instance of -- * a user interface. This makes UI_ctrl() return 1 if it is redoable, and 0 -- * if not. -- */ --# define UI_CTRL_IS_REDOABLE 2 -- --/* Some methods may use extra data */ --# define UI_set_app_data(s,arg) UI_set_ex_data(s,0,arg) --# define UI_get_app_data(s) UI_get_ex_data(s,0) -- --# define UI_get_ex_new_index(l, p, newf, dupf, freef) \ -- CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_UI, l, p, newf, dupf, freef) --int UI_set_ex_data(UI *r, int idx, void *arg); --void *UI_get_ex_data(UI *r, int idx); -- --/* Use specific methods instead of the built-in one */ --void UI_set_default_method(const UI_METHOD *meth); --const UI_METHOD *UI_get_default_method(void); --const UI_METHOD *UI_get_method(UI *ui); --const UI_METHOD *UI_set_method(UI *ui, const UI_METHOD *meth); -- --# ifndef OPENSSL_NO_UI_CONSOLE -- --/* The method with all the built-in thingies */ --UI_METHOD *UI_OpenSSL(void); -- --# endif -- --/* -- * NULL method. Literally does nothing, but may serve as a placeholder -- * to avoid internal default. -- */ --const UI_METHOD *UI_null(void); -- --/* ---------- For method writers ---------- */ --/*- -- A method contains a number of functions that implement the low level -- of the User Interface. The functions are: -- -- an opener This function starts a session, maybe by opening -- a channel to a tty, or by opening a window. -- a writer This function is called to write a given string, -- maybe to the tty, maybe as a field label in a -- window. -- a flusher This function is called to flush everything that -- has been output so far. It can be used to actually -- display a dialog box after it has been built. -- a reader This function is called to read a given prompt, -- maybe from the tty, maybe from a field in a -- window. Note that it's called with all string -- structures, not only the prompt ones, so it must -- check such things itself. -- a closer This function closes the session, maybe by closing -- the channel to the tty, or closing the window. -- -- All these functions are expected to return: -- -- 0 on error. -- 1 on success. -- -1 on out-of-band events, for example if some prompting has -- been canceled (by pressing Ctrl-C, for example). This is -- only checked when returned by the flusher or the reader. -- -- The way this is used, the opener is first called, then the writer for all -- strings, then the flusher, then the reader for all strings and finally the -- closer. Note that if you want to prompt from a terminal or other command -- line interface, the best is to have the reader also write the prompts -- instead of having the writer do it. If you want to prompt from a dialog -- box, the writer can be used to build up the contents of the box, and the -- flusher to actually display the box and run the event loop until all data -- has been given, after which the reader only grabs the given data and puts -- them back into the UI strings. -- -- All method functions take a UI as argument. Additionally, the writer and -- the reader take a UI_STRING. --*/ -- --/* -- * The UI_STRING type is the data structure that contains all the needed info -- * about a string or a prompt, including test data for a verification prompt. -- */ --typedef struct ui_string_st UI_STRING; --DEFINE_STACK_OF(UI_STRING) -- --/* -- * The different types of strings that are currently supported. This is only -- * needed by method authors. -- */ --enum UI_string_types { -- UIT_NONE = 0, -- UIT_PROMPT, /* Prompt for a string */ -- UIT_VERIFY, /* Prompt for a string and verify */ -- UIT_BOOLEAN, /* Prompt for a yes/no response */ -- UIT_INFO, /* Send info to the user */ -- UIT_ERROR /* Send an error message to the user */ --}; -- --/* Create and manipulate methods */ --UI_METHOD *UI_create_method(const char *name); --void UI_destroy_method(UI_METHOD *ui_method); --int UI_method_set_opener(UI_METHOD *method, int (*opener) (UI *ui)); --int UI_method_set_writer(UI_METHOD *method, -- int (*writer) (UI *ui, UI_STRING *uis)); --int UI_method_set_flusher(UI_METHOD *method, int (*flusher) (UI *ui)); --int UI_method_set_reader(UI_METHOD *method, -- int (*reader) (UI *ui, UI_STRING *uis)); --int UI_method_set_closer(UI_METHOD *method, int (*closer) (UI *ui)); --int UI_method_set_data_duplicator(UI_METHOD *method, -- void *(*duplicator) (UI *ui, void *ui_data), -- void (*destructor)(UI *ui, void *ui_data)); --int UI_method_set_prompt_constructor(UI_METHOD *method, -- char *(*prompt_constructor) (UI *ui, -- const char -- *object_desc, -- const char -- *object_name)); --int UI_method_set_ex_data(UI_METHOD *method, int idx, void *data); --int (*UI_method_get_opener(const UI_METHOD *method)) (UI *); --int (*UI_method_get_writer(const UI_METHOD *method)) (UI *, UI_STRING *); --int (*UI_method_get_flusher(const UI_METHOD *method)) (UI *); --int (*UI_method_get_reader(const UI_METHOD *method)) (UI *, UI_STRING *); --int (*UI_method_get_closer(const UI_METHOD *method)) (UI *); --char *(*UI_method_get_prompt_constructor(const UI_METHOD *method)) -- (UI *, const char *, const char *); --void *(*UI_method_get_data_duplicator(const UI_METHOD *method)) (UI *, void *); --void (*UI_method_get_data_destructor(const UI_METHOD *method)) (UI *, void *); --const void *UI_method_get_ex_data(const UI_METHOD *method, int idx); -- --/* -- * The following functions are helpers for method writers to access relevant -- * data from a UI_STRING. -- */ -- --/* Return type of the UI_STRING */ --enum UI_string_types UI_get_string_type(UI_STRING *uis); --/* Return input flags of the UI_STRING */ --int UI_get_input_flags(UI_STRING *uis); --/* Return the actual string to output (the prompt, info or error) */ --const char *UI_get0_output_string(UI_STRING *uis); --/* -- * Return the optional action string to output (the boolean prompt -- * instruction) -- */ --const char *UI_get0_action_string(UI_STRING *uis); --/* Return the result of a prompt */ --const char *UI_get0_result_string(UI_STRING *uis); --int UI_get_result_string_length(UI_STRING *uis); --/* -- * Return the string to test the result against. Only useful with verifies. -- */ --const char *UI_get0_test_string(UI_STRING *uis); --/* Return the required minimum size of the result */ --int UI_get_result_minsize(UI_STRING *uis); --/* Return the required maximum size of the result */ --int UI_get_result_maxsize(UI_STRING *uis); --/* Set the result of a UI_STRING. */ --int UI_set_result(UI *ui, UI_STRING *uis, const char *result); --int UI_set_result_ex(UI *ui, UI_STRING *uis, const char *result, int len); -- --/* A couple of popular utility functions */ --int UI_UTIL_read_pw_string(char *buf, int length, const char *prompt, -- int verify); --int UI_UTIL_read_pw(char *buf, char *buff, int size, const char *prompt, -- int verify); --UI_METHOD *UI_UTIL_wrap_read_pem_callback(pem_password_cb *cb, int rwflag); -- -- --# ifdef __cplusplus --} --# endif --#endif -diff --git a/uadk_tool/include/openssl/uierr.h b/uadk_tool/include/openssl/uierr.h -deleted file mode 100644 -index bd68864..0000000 ---- a/uadk_tool/include/openssl/uierr.h -+++ /dev/null -@@ -1,65 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_UIERR_H --# define HEADER_UIERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_UI_strings(void); -- --/* -- * UI function codes. -- */ --# define UI_F_CLOSE_CONSOLE 115 --# define UI_F_ECHO_CONSOLE 116 --# define UI_F_GENERAL_ALLOCATE_BOOLEAN 108 --# define UI_F_GENERAL_ALLOCATE_PROMPT 109 --# define UI_F_NOECHO_CONSOLE 117 --# define UI_F_OPEN_CONSOLE 114 --# define UI_F_UI_CONSTRUCT_PROMPT 121 --# define UI_F_UI_CREATE_METHOD 112 --# define UI_F_UI_CTRL 111 --# define UI_F_UI_DUP_ERROR_STRING 101 --# define UI_F_UI_DUP_INFO_STRING 102 --# define UI_F_UI_DUP_INPUT_BOOLEAN 110 --# define UI_F_UI_DUP_INPUT_STRING 103 --# define UI_F_UI_DUP_USER_DATA 118 --# define UI_F_UI_DUP_VERIFY_STRING 106 --# define UI_F_UI_GET0_RESULT 107 --# define UI_F_UI_GET_RESULT_LENGTH 119 --# define UI_F_UI_NEW_METHOD 104 --# define UI_F_UI_PROCESS 113 --# define UI_F_UI_SET_RESULT 105 --# define UI_F_UI_SET_RESULT_EX 120 -- --/* -- * UI reason codes. -- */ --# define UI_R_COMMON_OK_AND_CANCEL_CHARACTERS 104 --# define UI_R_INDEX_TOO_LARGE 102 --# define UI_R_INDEX_TOO_SMALL 103 --# define UI_R_NO_RESULT_BUFFER 105 --# define UI_R_PROCESSING_ERROR 107 --# define UI_R_RESULT_TOO_LARGE 100 --# define UI_R_RESULT_TOO_SMALL 101 --# define UI_R_SYSASSIGN_ERROR 109 --# define UI_R_SYSDASSGN_ERROR 110 --# define UI_R_SYSQIOW_ERROR 111 --# define UI_R_UNKNOWN_CONTROL_COMMAND 106 --# define UI_R_UNKNOWN_TTYGET_ERRNO_VALUE 108 --# define UI_R_USER_DATA_DUPLICATION_UNSUPPORTED 112 -- --#endif -diff --git a/uadk_tool/include/openssl/whrlpool.h b/uadk_tool/include/openssl/whrlpool.h -deleted file mode 100644 -index 20ea350..0000000 ---- a/uadk_tool/include/openssl/whrlpool.h -+++ /dev/null -@@ -1,48 +0,0 @@ --/* -- * Copyright 2005-2016 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_WHRLPOOL_H --# define HEADER_WHRLPOOL_H -- --#include -- --# ifndef OPENSSL_NO_WHIRLPOOL --# include --# include --# ifdef __cplusplus --extern "C" { --# endif -- --# define WHIRLPOOL_DIGEST_LENGTH (512/8) --# define WHIRLPOOL_BBLOCK 512 --# define WHIRLPOOL_COUNTER (256/8) -- --typedef struct { -- union { -- unsigned char c[WHIRLPOOL_DIGEST_LENGTH]; -- /* double q is here to ensure 64-bit alignment */ -- double q[WHIRLPOOL_DIGEST_LENGTH / sizeof(double)]; -- } H; -- unsigned char data[WHIRLPOOL_BBLOCK / 8]; -- unsigned int bitoff; -- size_t bitlen[WHIRLPOOL_COUNTER / sizeof(size_t)]; --} WHIRLPOOL_CTX; -- --int WHIRLPOOL_Init(WHIRLPOOL_CTX *c); --int WHIRLPOOL_Update(WHIRLPOOL_CTX *c, const void *inp, size_t bytes); --void WHIRLPOOL_BitUpdate(WHIRLPOOL_CTX *c, const void *inp, size_t bits); --int WHIRLPOOL_Final(unsigned char *md, WHIRLPOOL_CTX *c); --unsigned char *WHIRLPOOL(const void *inp, size_t bytes, unsigned char *md); -- --# ifdef __cplusplus --} --# endif --# endif -- --#endif -diff --git a/uadk_tool/include/openssl/x509.h b/uadk_tool/include/openssl/x509.h -deleted file mode 100644 -index 3ff86ec..0000000 ---- a/uadk_tool/include/openssl/x509.h -+++ /dev/null -@@ -1,1050 +0,0 @@ --/* -- * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. -- * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_X509_H --# define HEADER_X509_H -- --# include --# include --# include --# include --# include --# include --# include --# include --# include -- --# if OPENSSL_API_COMPAT < 0x10100000L --# include --# include --# include --# endif -- --# include --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- -- --/* Flags for X509_get_signature_info() */ --/* Signature info is valid */ --# define X509_SIG_INFO_VALID 0x1 --/* Signature is suitable for TLS use */ --# define X509_SIG_INFO_TLS 0x2 -- --# define X509_FILETYPE_PEM 1 --# define X509_FILETYPE_ASN1 2 --# define X509_FILETYPE_DEFAULT 3 -- --# define X509v3_KU_DIGITAL_SIGNATURE 0x0080 --# define X509v3_KU_NON_REPUDIATION 0x0040 --# define X509v3_KU_KEY_ENCIPHERMENT 0x0020 --# define X509v3_KU_DATA_ENCIPHERMENT 0x0010 --# define X509v3_KU_KEY_AGREEMENT 0x0008 --# define X509v3_KU_KEY_CERT_SIGN 0x0004 --# define X509v3_KU_CRL_SIGN 0x0002 --# define X509v3_KU_ENCIPHER_ONLY 0x0001 --# define X509v3_KU_DECIPHER_ONLY 0x8000 --# define X509v3_KU_UNDEF 0xffff -- --struct X509_algor_st { -- ASN1_OBJECT *algorithm; -- ASN1_TYPE *parameter; --} /* X509_ALGOR */ ; -- --typedef STACK_OF(X509_ALGOR) X509_ALGORS; -- --typedef struct X509_val_st { -- ASN1_TIME *notBefore; -- ASN1_TIME *notAfter; --} X509_VAL; -- --typedef struct X509_sig_st X509_SIG; -- --typedef struct X509_name_entry_st X509_NAME_ENTRY; -- --DEFINE_STACK_OF(X509_NAME_ENTRY) -- --DEFINE_STACK_OF(X509_NAME) -- --# define X509_EX_V_NETSCAPE_HACK 0x8000 --# define X509_EX_V_INIT 0x0001 --typedef struct X509_extension_st X509_EXTENSION; -- --typedef STACK_OF(X509_EXTENSION) X509_EXTENSIONS; -- --DEFINE_STACK_OF(X509_EXTENSION) -- --typedef struct x509_attributes_st X509_ATTRIBUTE; -- --DEFINE_STACK_OF(X509_ATTRIBUTE) -- --typedef struct X509_req_info_st X509_REQ_INFO; -- --typedef struct X509_req_st X509_REQ; -- --typedef struct x509_cert_aux_st X509_CERT_AUX; -- --typedef struct x509_cinf_st X509_CINF; -- --DEFINE_STACK_OF(X509) -- --/* This is used for a table of trust checking functions */ -- --typedef struct x509_trust_st { -- int trust; -- int flags; -- int (*check_trust) (struct x509_trust_st *, X509 *, int); -- char *name; -- int arg1; -- void *arg2; --} X509_TRUST; -- --DEFINE_STACK_OF(X509_TRUST) -- --/* standard trust ids */ -- --# define X509_TRUST_DEFAULT 0 /* Only valid in purpose settings */ -- --# define X509_TRUST_COMPAT 1 --# define X509_TRUST_SSL_CLIENT 2 --# define X509_TRUST_SSL_SERVER 3 --# define X509_TRUST_EMAIL 4 --# define X509_TRUST_OBJECT_SIGN 5 --# define X509_TRUST_OCSP_SIGN 6 --# define X509_TRUST_OCSP_REQUEST 7 --# define X509_TRUST_TSA 8 -- --/* Keep these up to date! */ --# define X509_TRUST_MIN 1 --# define X509_TRUST_MAX 8 -- --/* trust_flags values */ --# define X509_TRUST_DYNAMIC (1U << 0) --# define X509_TRUST_DYNAMIC_NAME (1U << 1) --/* No compat trust if self-signed, preempts "DO_SS" */ --# define X509_TRUST_NO_SS_COMPAT (1U << 2) --/* Compat trust if no explicit accepted trust EKUs */ --# define X509_TRUST_DO_SS_COMPAT (1U << 3) --/* Accept "anyEKU" as a wildcard trust OID */ --# define X509_TRUST_OK_ANY_EKU (1U << 4) -- --/* check_trust return codes */ -- --# define X509_TRUST_TRUSTED 1 --# define X509_TRUST_REJECTED 2 --# define X509_TRUST_UNTRUSTED 3 -- --/* Flags for X509_print_ex() */ -- --# define X509_FLAG_COMPAT 0 --# define X509_FLAG_NO_HEADER 1L --# define X509_FLAG_NO_VERSION (1L << 1) --# define X509_FLAG_NO_SERIAL (1L << 2) --# define X509_FLAG_NO_SIGNAME (1L << 3) --# define X509_FLAG_NO_ISSUER (1L << 4) --# define X509_FLAG_NO_VALIDITY (1L << 5) --# define X509_FLAG_NO_SUBJECT (1L << 6) --# define X509_FLAG_NO_PUBKEY (1L << 7) --# define X509_FLAG_NO_EXTENSIONS (1L << 8) --# define X509_FLAG_NO_SIGDUMP (1L << 9) --# define X509_FLAG_NO_AUX (1L << 10) --# define X509_FLAG_NO_ATTRIBUTES (1L << 11) --# define X509_FLAG_NO_IDS (1L << 12) -- --/* Flags specific to X509_NAME_print_ex() */ -- --/* The field separator information */ -- --# define XN_FLAG_SEP_MASK (0xf << 16) -- --# define XN_FLAG_COMPAT 0/* Traditional; use old X509_NAME_print */ --# define XN_FLAG_SEP_COMMA_PLUS (1 << 16)/* RFC2253 ,+ */ --# define XN_FLAG_SEP_CPLUS_SPC (2 << 16)/* ,+ spaced: more readable */ --# define XN_FLAG_SEP_SPLUS_SPC (3 << 16)/* ;+ spaced */ --# define XN_FLAG_SEP_MULTILINE (4 << 16)/* One line per field */ -- --# define XN_FLAG_DN_REV (1 << 20)/* Reverse DN order */ -- --/* How the field name is shown */ -- --# define XN_FLAG_FN_MASK (0x3 << 21) -- --# define XN_FLAG_FN_SN 0/* Object short name */ --# define XN_FLAG_FN_LN (1 << 21)/* Object long name */ --# define XN_FLAG_FN_OID (2 << 21)/* Always use OIDs */ --# define XN_FLAG_FN_NONE (3 << 21)/* No field names */ -- --# define XN_FLAG_SPC_EQ (1 << 23)/* Put spaces round '=' */ -- --/* -- * This determines if we dump fields we don't recognise: RFC2253 requires -- * this. -- */ -- --# define XN_FLAG_DUMP_UNKNOWN_FIELDS (1 << 24) -- --# define XN_FLAG_FN_ALIGN (1 << 25)/* Align field names to 20 -- * characters */ -- --/* Complete set of RFC2253 flags */ -- --# define XN_FLAG_RFC2253 (ASN1_STRFLGS_RFC2253 | \ -- XN_FLAG_SEP_COMMA_PLUS | \ -- XN_FLAG_DN_REV | \ -- XN_FLAG_FN_SN | \ -- XN_FLAG_DUMP_UNKNOWN_FIELDS) -- --/* readable oneline form */ -- --# define XN_FLAG_ONELINE (ASN1_STRFLGS_RFC2253 | \ -- ASN1_STRFLGS_ESC_QUOTE | \ -- XN_FLAG_SEP_CPLUS_SPC | \ -- XN_FLAG_SPC_EQ | \ -- XN_FLAG_FN_SN) -- --/* readable multiline form */ -- --# define XN_FLAG_MULTILINE (ASN1_STRFLGS_ESC_CTRL | \ -- ASN1_STRFLGS_ESC_MSB | \ -- XN_FLAG_SEP_MULTILINE | \ -- XN_FLAG_SPC_EQ | \ -- XN_FLAG_FN_LN | \ -- XN_FLAG_FN_ALIGN) -- --DEFINE_STACK_OF(X509_REVOKED) -- --typedef struct X509_crl_info_st X509_CRL_INFO; -- --DEFINE_STACK_OF(X509_CRL) -- --typedef struct private_key_st { -- int version; -- /* The PKCS#8 data types */ -- X509_ALGOR *enc_algor; -- ASN1_OCTET_STRING *enc_pkey; /* encrypted pub key */ -- /* When decrypted, the following will not be NULL */ -- EVP_PKEY *dec_pkey; -- /* used to encrypt and decrypt */ -- int key_length; -- char *key_data; -- int key_free; /* true if we should auto free key_data */ -- /* expanded version of 'enc_algor' */ -- EVP_CIPHER_INFO cipher; --} X509_PKEY; -- --typedef struct X509_info_st { -- X509 *x509; -- X509_CRL *crl; -- X509_PKEY *x_pkey; -- EVP_CIPHER_INFO enc_cipher; -- int enc_len; -- char *enc_data; --} X509_INFO; -- --DEFINE_STACK_OF(X509_INFO) -- --/* -- * The next 2 structures and their 8 routines are used to manipulate Netscape's -- * spki structures - useful if you are writing a CA web page -- */ --typedef struct Netscape_spkac_st { -- X509_PUBKEY *pubkey; -- ASN1_IA5STRING *challenge; /* challenge sent in atlas >= PR2 */ --} NETSCAPE_SPKAC; -- --typedef struct Netscape_spki_st { -- NETSCAPE_SPKAC *spkac; /* signed public key and challenge */ -- X509_ALGOR sig_algor; -- ASN1_BIT_STRING *signature; --} NETSCAPE_SPKI; -- --/* Netscape certificate sequence structure */ --typedef struct Netscape_certificate_sequence { -- ASN1_OBJECT *type; -- STACK_OF(X509) *certs; --} NETSCAPE_CERT_SEQUENCE; -- --/*- Unused (and iv length is wrong) --typedef struct CBCParameter_st -- { -- unsigned char iv[8]; -- } CBC_PARAM; --*/ -- --/* Password based encryption structure */ -- --typedef struct PBEPARAM_st { -- ASN1_OCTET_STRING *salt; -- ASN1_INTEGER *iter; --} PBEPARAM; -- --/* Password based encryption V2 structures */ -- --typedef struct PBE2PARAM_st { -- X509_ALGOR *keyfunc; -- X509_ALGOR *encryption; --} PBE2PARAM; -- --typedef struct PBKDF2PARAM_st { --/* Usually OCTET STRING but could be anything */ -- ASN1_TYPE *salt; -- ASN1_INTEGER *iter; -- ASN1_INTEGER *keylength; -- X509_ALGOR *prf; --} PBKDF2PARAM; -- --#ifndef OPENSSL_NO_SCRYPT --typedef struct SCRYPT_PARAMS_st { -- ASN1_OCTET_STRING *salt; -- ASN1_INTEGER *costParameter; -- ASN1_INTEGER *blockSize; -- ASN1_INTEGER *parallelizationParameter; -- ASN1_INTEGER *keyLength; --} SCRYPT_PARAMS; --#endif -- --#ifdef __cplusplus --} --#endif -- --# include --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --# define X509_EXT_PACK_UNKNOWN 1 --# define X509_EXT_PACK_STRING 2 -- --# define X509_extract_key(x) X509_get_pubkey(x)/*****/ --# define X509_REQ_extract_key(a) X509_REQ_get_pubkey(a) --# define X509_name_cmp(a,b) X509_NAME_cmp((a),(b)) -- --void X509_CRL_set_default_method(const X509_CRL_METHOD *meth); --X509_CRL_METHOD *X509_CRL_METHOD_new(int (*crl_init) (X509_CRL *crl), -- int (*crl_free) (X509_CRL *crl), -- int (*crl_lookup) (X509_CRL *crl, -- X509_REVOKED **ret, -- ASN1_INTEGER *ser, -- X509_NAME *issuer), -- int (*crl_verify) (X509_CRL *crl, -- EVP_PKEY *pk)); --void X509_CRL_METHOD_free(X509_CRL_METHOD *m); -- --void X509_CRL_set_meth_data(X509_CRL *crl, void *dat); --void *X509_CRL_get_meth_data(X509_CRL *crl); -- --const char *X509_verify_cert_error_string(long n); -- --int X509_verify(X509 *a, EVP_PKEY *r); -- --int X509_REQ_verify(X509_REQ *a, EVP_PKEY *r); --int X509_CRL_verify(X509_CRL *a, EVP_PKEY *r); --int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r); -- --NETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *str, int len); --char *NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *x); --EVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *x); --int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey); -- --int NETSCAPE_SPKI_print(BIO *out, NETSCAPE_SPKI *spki); -- --int X509_signature_dump(BIO *bp, const ASN1_STRING *sig, int indent); --int X509_signature_print(BIO *bp, const X509_ALGOR *alg, -- const ASN1_STRING *sig); -- --int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md); --int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx); --# ifndef OPENSSL_NO_OCSP --int X509_http_nbio(OCSP_REQ_CTX *rctx, X509 **pcert); --# endif --int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md); --int X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx); --int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md); --int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx); --# ifndef OPENSSL_NO_OCSP --int X509_CRL_http_nbio(OCSP_REQ_CTX *rctx, X509_CRL **pcrl); --# endif --int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md); -- --int X509_pubkey_digest(const X509 *data, const EVP_MD *type, -- unsigned char *md, unsigned int *len); --int X509_digest(const X509 *data, const EVP_MD *type, -- unsigned char *md, unsigned int *len); --int X509_CRL_digest(const X509_CRL *data, const EVP_MD *type, -- unsigned char *md, unsigned int *len); --int X509_REQ_digest(const X509_REQ *data, const EVP_MD *type, -- unsigned char *md, unsigned int *len); --int X509_NAME_digest(const X509_NAME *data, const EVP_MD *type, -- unsigned char *md, unsigned int *len); -- --# ifndef OPENSSL_NO_STDIO --X509 *d2i_X509_fp(FILE *fp, X509 **x509); --int i2d_X509_fp(FILE *fp, X509 *x509); --X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl); --int i2d_X509_CRL_fp(FILE *fp, X509_CRL *crl); --X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req); --int i2d_X509_REQ_fp(FILE *fp, X509_REQ *req); --# ifndef OPENSSL_NO_RSA --RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa); --int i2d_RSAPrivateKey_fp(FILE *fp, RSA *rsa); --RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa); --int i2d_RSAPublicKey_fp(FILE *fp, RSA *rsa); --RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa); --int i2d_RSA_PUBKEY_fp(FILE *fp, RSA *rsa); --# endif --# ifndef OPENSSL_NO_DSA --DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa); --int i2d_DSA_PUBKEY_fp(FILE *fp, DSA *dsa); --DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa); --int i2d_DSAPrivateKey_fp(FILE *fp, DSA *dsa); --# endif --# ifndef OPENSSL_NO_EC --EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey); --int i2d_EC_PUBKEY_fp(FILE *fp, EC_KEY *eckey); --EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey); --int i2d_ECPrivateKey_fp(FILE *fp, EC_KEY *eckey); --# endif --X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8); --int i2d_PKCS8_fp(FILE *fp, X509_SIG *p8); --PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, -- PKCS8_PRIV_KEY_INFO **p8inf); --int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, PKCS8_PRIV_KEY_INFO *p8inf); --int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, EVP_PKEY *key); --int i2d_PrivateKey_fp(FILE *fp, EVP_PKEY *pkey); --EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a); --int i2d_PUBKEY_fp(FILE *fp, EVP_PKEY *pkey); --EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a); --# endif -- --X509 *d2i_X509_bio(BIO *bp, X509 **x509); --int i2d_X509_bio(BIO *bp, X509 *x509); --X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl); --int i2d_X509_CRL_bio(BIO *bp, X509_CRL *crl); --X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req); --int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req); --# ifndef OPENSSL_NO_RSA --RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa); --int i2d_RSAPrivateKey_bio(BIO *bp, RSA *rsa); --RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa); --int i2d_RSAPublicKey_bio(BIO *bp, RSA *rsa); --RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa); --int i2d_RSA_PUBKEY_bio(BIO *bp, RSA *rsa); --# endif --# ifndef OPENSSL_NO_DSA --DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa); --int i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa); --DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa); --int i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa); --# endif --# ifndef OPENSSL_NO_EC --EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey); --int i2d_EC_PUBKEY_bio(BIO *bp, EC_KEY *eckey); --EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey); --int i2d_ECPrivateKey_bio(BIO *bp, EC_KEY *eckey); --# endif --X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8); --int i2d_PKCS8_bio(BIO *bp, X509_SIG *p8); --PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, -- PKCS8_PRIV_KEY_INFO **p8inf); --int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, PKCS8_PRIV_KEY_INFO *p8inf); --int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key); --int i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey); --EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a); --int i2d_PUBKEY_bio(BIO *bp, EVP_PKEY *pkey); --EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a); -- --X509 *X509_dup(X509 *x509); --X509_ATTRIBUTE *X509_ATTRIBUTE_dup(X509_ATTRIBUTE *xa); --X509_EXTENSION *X509_EXTENSION_dup(X509_EXTENSION *ex); --X509_CRL *X509_CRL_dup(X509_CRL *crl); --X509_REVOKED *X509_REVOKED_dup(X509_REVOKED *rev); --X509_REQ *X509_REQ_dup(X509_REQ *req); --X509_ALGOR *X509_ALGOR_dup(X509_ALGOR *xn); --int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, -- void *pval); --void X509_ALGOR_get0(const ASN1_OBJECT **paobj, int *pptype, -- const void **ppval, const X509_ALGOR *algor); --void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md); --int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b); --int X509_ALGOR_copy(X509_ALGOR *dest, const X509_ALGOR *src); -- --X509_NAME *X509_NAME_dup(X509_NAME *xn); --X509_NAME_ENTRY *X509_NAME_ENTRY_dup(X509_NAME_ENTRY *ne); -- --int X509_cmp_time(const ASN1_TIME *s, time_t *t); --int X509_cmp_current_time(const ASN1_TIME *s); --ASN1_TIME *X509_time_adj(ASN1_TIME *s, long adj, time_t *t); --ASN1_TIME *X509_time_adj_ex(ASN1_TIME *s, -- int offset_day, long offset_sec, time_t *t); --ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long adj); -- --const char *X509_get_default_cert_area(void); --const char *X509_get_default_cert_dir(void); --const char *X509_get_default_cert_file(void); --const char *X509_get_default_cert_dir_env(void); --const char *X509_get_default_cert_file_env(void); --const char *X509_get_default_private_dir(void); -- --X509_REQ *X509_to_X509_REQ(X509 *x, EVP_PKEY *pkey, const EVP_MD *md); --X509 *X509_REQ_to_X509(X509_REQ *r, int days, EVP_PKEY *pkey); -- --DECLARE_ASN1_FUNCTIONS(X509_ALGOR) --DECLARE_ASN1_ENCODE_FUNCTIONS(X509_ALGORS, X509_ALGORS, X509_ALGORS) --DECLARE_ASN1_FUNCTIONS(X509_VAL) -- --DECLARE_ASN1_FUNCTIONS(X509_PUBKEY) -- --int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey); --EVP_PKEY *X509_PUBKEY_get0(X509_PUBKEY *key); --EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key); --int X509_get_pubkey_parameters(EVP_PKEY *pkey, STACK_OF(X509) *chain); --long X509_get_pathlen(X509 *x); --int i2d_PUBKEY(EVP_PKEY *a, unsigned char **pp); --EVP_PKEY *d2i_PUBKEY(EVP_PKEY **a, const unsigned char **pp, long length); --# ifndef OPENSSL_NO_RSA --int i2d_RSA_PUBKEY(RSA *a, unsigned char **pp); --RSA *d2i_RSA_PUBKEY(RSA **a, const unsigned char **pp, long length); --# endif --# ifndef OPENSSL_NO_DSA --int i2d_DSA_PUBKEY(DSA *a, unsigned char **pp); --DSA *d2i_DSA_PUBKEY(DSA **a, const unsigned char **pp, long length); --# endif --# ifndef OPENSSL_NO_EC --int i2d_EC_PUBKEY(EC_KEY *a, unsigned char **pp); --EC_KEY *d2i_EC_PUBKEY(EC_KEY **a, const unsigned char **pp, long length); --# endif -- --DECLARE_ASN1_FUNCTIONS(X509_SIG) --void X509_SIG_get0(const X509_SIG *sig, const X509_ALGOR **palg, -- const ASN1_OCTET_STRING **pdigest); --void X509_SIG_getm(X509_SIG *sig, X509_ALGOR **palg, -- ASN1_OCTET_STRING **pdigest); -- --DECLARE_ASN1_FUNCTIONS(X509_REQ_INFO) --DECLARE_ASN1_FUNCTIONS(X509_REQ) -- --DECLARE_ASN1_FUNCTIONS(X509_ATTRIBUTE) --X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value); -- --DECLARE_ASN1_FUNCTIONS(X509_EXTENSION) --DECLARE_ASN1_ENCODE_FUNCTIONS(X509_EXTENSIONS, X509_EXTENSIONS, X509_EXTENSIONS) -- --DECLARE_ASN1_FUNCTIONS(X509_NAME_ENTRY) -- --DECLARE_ASN1_FUNCTIONS(X509_NAME) -- --int X509_NAME_set(X509_NAME **xn, X509_NAME *name); -- --DECLARE_ASN1_FUNCTIONS(X509_CINF) -- --DECLARE_ASN1_FUNCTIONS(X509) --DECLARE_ASN1_FUNCTIONS(X509_CERT_AUX) -- --#define X509_get_ex_new_index(l, p, newf, dupf, freef) \ -- CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509, l, p, newf, dupf, freef) --int X509_set_ex_data(X509 *r, int idx, void *arg); --void *X509_get_ex_data(X509 *r, int idx); --int i2d_X509_AUX(X509 *a, unsigned char **pp); --X509 *d2i_X509_AUX(X509 **a, const unsigned char **pp, long length); -- --int i2d_re_X509_tbs(X509 *x, unsigned char **pp); -- --int X509_SIG_INFO_get(const X509_SIG_INFO *siginf, int *mdnid, int *pknid, -- int *secbits, uint32_t *flags); --void X509_SIG_INFO_set(X509_SIG_INFO *siginf, int mdnid, int pknid, -- int secbits, uint32_t flags); -- --int X509_get_signature_info(X509 *x, int *mdnid, int *pknid, int *secbits, -- uint32_t *flags); -- --void X509_get0_signature(const ASN1_BIT_STRING **psig, -- const X509_ALGOR **palg, const X509 *x); --int X509_get_signature_nid(const X509 *x); -- --int X509_trusted(const X509 *x); --int X509_alias_set1(X509 *x, const unsigned char *name, int len); --int X509_keyid_set1(X509 *x, const unsigned char *id, int len); --unsigned char *X509_alias_get0(X509 *x, int *len); --unsigned char *X509_keyid_get0(X509 *x, int *len); --int (*X509_TRUST_set_default(int (*trust) (int, X509 *, int))) (int, X509 *, -- int); --int X509_TRUST_set(int *t, int trust); --int X509_add1_trust_object(X509 *x, const ASN1_OBJECT *obj); --int X509_add1_reject_object(X509 *x, const ASN1_OBJECT *obj); --void X509_trust_clear(X509 *x); --void X509_reject_clear(X509 *x); -- --STACK_OF(ASN1_OBJECT) *X509_get0_trust_objects(X509 *x); --STACK_OF(ASN1_OBJECT) *X509_get0_reject_objects(X509 *x); -- --DECLARE_ASN1_FUNCTIONS(X509_REVOKED) --DECLARE_ASN1_FUNCTIONS(X509_CRL_INFO) --DECLARE_ASN1_FUNCTIONS(X509_CRL) -- --int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev); --int X509_CRL_get0_by_serial(X509_CRL *crl, -- X509_REVOKED **ret, ASN1_INTEGER *serial); --int X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **ret, X509 *x); -- --X509_PKEY *X509_PKEY_new(void); --void X509_PKEY_free(X509_PKEY *a); -- --DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKI) --DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKAC) --DECLARE_ASN1_FUNCTIONS(NETSCAPE_CERT_SEQUENCE) -- --X509_INFO *X509_INFO_new(void); --void X509_INFO_free(X509_INFO *a); --char *X509_NAME_oneline(const X509_NAME *a, char *buf, int size); -- --int ASN1_verify(i2d_of_void *i2d, X509_ALGOR *algor1, -- ASN1_BIT_STRING *signature, char *data, EVP_PKEY *pkey); -- --int ASN1_digest(i2d_of_void *i2d, const EVP_MD *type, char *data, -- unsigned char *md, unsigned int *len); -- --int ASN1_sign(i2d_of_void *i2d, X509_ALGOR *algor1, -- X509_ALGOR *algor2, ASN1_BIT_STRING *signature, -- char *data, EVP_PKEY *pkey, const EVP_MD *type); -- --int ASN1_item_digest(const ASN1_ITEM *it, const EVP_MD *type, void *data, -- unsigned char *md, unsigned int *len); -- --int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *algor1, -- ASN1_BIT_STRING *signature, void *data, EVP_PKEY *pkey); -- --int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, -- X509_ALGOR *algor2, ASN1_BIT_STRING *signature, void *data, -- EVP_PKEY *pkey, const EVP_MD *type); --int ASN1_item_sign_ctx(const ASN1_ITEM *it, X509_ALGOR *algor1, -- X509_ALGOR *algor2, ASN1_BIT_STRING *signature, -- void *asn, EVP_MD_CTX *ctx); -- --long X509_get_version(const X509 *x); --int X509_set_version(X509 *x, long version); --int X509_set_serialNumber(X509 *x, ASN1_INTEGER *serial); --ASN1_INTEGER *X509_get_serialNumber(X509 *x); --const ASN1_INTEGER *X509_get0_serialNumber(const X509 *x); --int X509_set_issuer_name(X509 *x, X509_NAME *name); --X509_NAME *X509_get_issuer_name(const X509 *a); --int X509_set_subject_name(X509 *x, X509_NAME *name); --X509_NAME *X509_get_subject_name(const X509 *a); --const ASN1_TIME * X509_get0_notBefore(const X509 *x); --ASN1_TIME *X509_getm_notBefore(const X509 *x); --int X509_set1_notBefore(X509 *x, const ASN1_TIME *tm); --const ASN1_TIME *X509_get0_notAfter(const X509 *x); --ASN1_TIME *X509_getm_notAfter(const X509 *x); --int X509_set1_notAfter(X509 *x, const ASN1_TIME *tm); --int X509_set_pubkey(X509 *x, EVP_PKEY *pkey); --int X509_up_ref(X509 *x); --int X509_get_signature_type(const X509 *x); -- --# if OPENSSL_API_COMPAT < 0x10100000L --# define X509_get_notBefore X509_getm_notBefore --# define X509_get_notAfter X509_getm_notAfter --# define X509_set_notBefore X509_set1_notBefore --# define X509_set_notAfter X509_set1_notAfter --#endif -- -- --/* -- * This one is only used so that a binary form can output, as in -- * i2d_X509_PUBKEY(X509_get_X509_PUBKEY(x), &buf) -- */ --X509_PUBKEY *X509_get_X509_PUBKEY(const X509 *x); --const STACK_OF(X509_EXTENSION) *X509_get0_extensions(const X509 *x); --void X509_get0_uids(const X509 *x, const ASN1_BIT_STRING **piuid, -- const ASN1_BIT_STRING **psuid); --const X509_ALGOR *X509_get0_tbs_sigalg(const X509 *x); -- --EVP_PKEY *X509_get0_pubkey(const X509 *x); --EVP_PKEY *X509_get_pubkey(X509 *x); --ASN1_BIT_STRING *X509_get0_pubkey_bitstr(const X509 *x); --int X509_certificate_type(const X509 *x, const EVP_PKEY *pubkey); -- --long X509_REQ_get_version(const X509_REQ *req); --int X509_REQ_set_version(X509_REQ *x, long version); --X509_NAME *X509_REQ_get_subject_name(const X509_REQ *req); --int X509_REQ_set_subject_name(X509_REQ *req, X509_NAME *name); --void X509_REQ_get0_signature(const X509_REQ *req, const ASN1_BIT_STRING **psig, -- const X509_ALGOR **palg); --void X509_REQ_set0_signature(X509_REQ *req, ASN1_BIT_STRING *psig); --int X509_REQ_set1_signature_algo(X509_REQ *req, X509_ALGOR *palg); --int X509_REQ_get_signature_nid(const X509_REQ *req); --int i2d_re_X509_REQ_tbs(X509_REQ *req, unsigned char **pp); --int X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey); --EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *req); --EVP_PKEY *X509_REQ_get0_pubkey(X509_REQ *req); --X509_PUBKEY *X509_REQ_get_X509_PUBKEY(X509_REQ *req); --int X509_REQ_extension_nid(int nid); --int *X509_REQ_get_extension_nids(void); --void X509_REQ_set_extension_nids(int *nids); --STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(X509_REQ *req); --int X509_REQ_add_extensions_nid(X509_REQ *req, STACK_OF(X509_EXTENSION) *exts, -- int nid); --int X509_REQ_add_extensions(X509_REQ *req, STACK_OF(X509_EXTENSION) *exts); --int X509_REQ_get_attr_count(const X509_REQ *req); --int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, int lastpos); --int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, const ASN1_OBJECT *obj, -- int lastpos); --X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc); --X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc); --int X509_REQ_add1_attr(X509_REQ *req, X509_ATTRIBUTE *attr); --int X509_REQ_add1_attr_by_OBJ(X509_REQ *req, -- const ASN1_OBJECT *obj, int type, -- const unsigned char *bytes, int len); --int X509_REQ_add1_attr_by_NID(X509_REQ *req, -- int nid, int type, -- const unsigned char *bytes, int len); --int X509_REQ_add1_attr_by_txt(X509_REQ *req, -- const char *attrname, int type, -- const unsigned char *bytes, int len); -- --int X509_CRL_set_version(X509_CRL *x, long version); --int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name); --int X509_CRL_set1_lastUpdate(X509_CRL *x, const ASN1_TIME *tm); --int X509_CRL_set1_nextUpdate(X509_CRL *x, const ASN1_TIME *tm); --int X509_CRL_sort(X509_CRL *crl); --int X509_CRL_up_ref(X509_CRL *crl); -- --# if OPENSSL_API_COMPAT < 0x10100000L --# define X509_CRL_set_lastUpdate X509_CRL_set1_lastUpdate --# define X509_CRL_set_nextUpdate X509_CRL_set1_nextUpdate --#endif -- --long X509_CRL_get_version(const X509_CRL *crl); --const ASN1_TIME *X509_CRL_get0_lastUpdate(const X509_CRL *crl); --const ASN1_TIME *X509_CRL_get0_nextUpdate(const X509_CRL *crl); --DEPRECATEDIN_1_1_0(ASN1_TIME *X509_CRL_get_lastUpdate(X509_CRL *crl)) --DEPRECATEDIN_1_1_0(ASN1_TIME *X509_CRL_get_nextUpdate(X509_CRL *crl)) --X509_NAME *X509_CRL_get_issuer(const X509_CRL *crl); --const STACK_OF(X509_EXTENSION) *X509_CRL_get0_extensions(const X509_CRL *crl); --STACK_OF(X509_REVOKED) *X509_CRL_get_REVOKED(X509_CRL *crl); --void X509_CRL_get0_signature(const X509_CRL *crl, const ASN1_BIT_STRING **psig, -- const X509_ALGOR **palg); --int X509_CRL_get_signature_nid(const X509_CRL *crl); --int i2d_re_X509_CRL_tbs(X509_CRL *req, unsigned char **pp); -- --const ASN1_INTEGER *X509_REVOKED_get0_serialNumber(const X509_REVOKED *x); --int X509_REVOKED_set_serialNumber(X509_REVOKED *x, ASN1_INTEGER *serial); --const ASN1_TIME *X509_REVOKED_get0_revocationDate(const X509_REVOKED *x); --int X509_REVOKED_set_revocationDate(X509_REVOKED *r, ASN1_TIME *tm); --const STACK_OF(X509_EXTENSION) * --X509_REVOKED_get0_extensions(const X509_REVOKED *r); -- --X509_CRL *X509_CRL_diff(X509_CRL *base, X509_CRL *newer, -- EVP_PKEY *skey, const EVP_MD *md, unsigned int flags); -- --int X509_REQ_check_private_key(X509_REQ *x509, EVP_PKEY *pkey); -- --int X509_check_private_key(const X509 *x509, const EVP_PKEY *pkey); --int X509_chain_check_suiteb(int *perror_depth, -- X509 *x, STACK_OF(X509) *chain, -- unsigned long flags); --int X509_CRL_check_suiteb(X509_CRL *crl, EVP_PKEY *pk, unsigned long flags); --STACK_OF(X509) *X509_chain_up_ref(STACK_OF(X509) *chain); -- --int X509_issuer_and_serial_cmp(const X509 *a, const X509 *b); --unsigned long X509_issuer_and_serial_hash(X509 *a); -- --int X509_issuer_name_cmp(const X509 *a, const X509 *b); --unsigned long X509_issuer_name_hash(X509 *a); -- --int X509_subject_name_cmp(const X509 *a, const X509 *b); --unsigned long X509_subject_name_hash(X509 *x); -- --# ifndef OPENSSL_NO_MD5 --unsigned long X509_issuer_name_hash_old(X509 *a); --unsigned long X509_subject_name_hash_old(X509 *x); --# endif -- --int X509_cmp(const X509 *a, const X509 *b); --int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b); --unsigned long X509_NAME_hash(X509_NAME *x); --unsigned long X509_NAME_hash_old(X509_NAME *x); -- --int X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b); --int X509_CRL_match(const X509_CRL *a, const X509_CRL *b); --int X509_aux_print(BIO *out, X509 *x, int indent); --# ifndef OPENSSL_NO_STDIO --int X509_print_ex_fp(FILE *bp, X509 *x, unsigned long nmflag, -- unsigned long cflag); --int X509_print_fp(FILE *bp, X509 *x); --int X509_CRL_print_fp(FILE *bp, X509_CRL *x); --int X509_REQ_print_fp(FILE *bp, X509_REQ *req); --int X509_NAME_print_ex_fp(FILE *fp, const X509_NAME *nm, int indent, -- unsigned long flags); --# endif -- --int X509_NAME_print(BIO *bp, const X509_NAME *name, int obase); --int X509_NAME_print_ex(BIO *out, const X509_NAME *nm, int indent, -- unsigned long flags); --int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflag, -- unsigned long cflag); --int X509_print(BIO *bp, X509 *x); --int X509_ocspid_print(BIO *bp, X509 *x); --int X509_CRL_print_ex(BIO *out, X509_CRL *x, unsigned long nmflag); --int X509_CRL_print(BIO *bp, X509_CRL *x); --int X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflag, -- unsigned long cflag); --int X509_REQ_print(BIO *bp, X509_REQ *req); -- --int X509_NAME_entry_count(const X509_NAME *name); --int X509_NAME_get_text_by_NID(X509_NAME *name, int nid, char *buf, int len); --int X509_NAME_get_text_by_OBJ(X509_NAME *name, const ASN1_OBJECT *obj, -- char *buf, int len); -- --/* -- * NOTE: you should be passing -1, not 0 as lastpos. The functions that use -- * lastpos, search after that position on. -- */ --int X509_NAME_get_index_by_NID(X509_NAME *name, int nid, int lastpos); --int X509_NAME_get_index_by_OBJ(X509_NAME *name, const ASN1_OBJECT *obj, -- int lastpos); --X509_NAME_ENTRY *X509_NAME_get_entry(const X509_NAME *name, int loc); --X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, int loc); --int X509_NAME_add_entry(X509_NAME *name, const X509_NAME_ENTRY *ne, -- int loc, int set); --int X509_NAME_add_entry_by_OBJ(X509_NAME *name, const ASN1_OBJECT *obj, int type, -- const unsigned char *bytes, int len, int loc, -- int set); --int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type, -- const unsigned char *bytes, int len, int loc, -- int set); --X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne, -- const char *field, int type, -- const unsigned char *bytes, -- int len); --X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid, -- int type, -- const unsigned char *bytes, -- int len); --int X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type, -- const unsigned char *bytes, int len, int loc, -- int set); --X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne, -- const ASN1_OBJECT *obj, int type, -- const unsigned char *bytes, -- int len); --int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, const ASN1_OBJECT *obj); --int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type, -- const unsigned char *bytes, int len); --ASN1_OBJECT *X509_NAME_ENTRY_get_object(const X509_NAME_ENTRY *ne); --ASN1_STRING * X509_NAME_ENTRY_get_data(const X509_NAME_ENTRY *ne); --int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne); -- --int X509_NAME_get0_der(X509_NAME *nm, const unsigned char **pder, -- size_t *pderlen); -- --int X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x); --int X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x, -- int nid, int lastpos); --int X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *x, -- const ASN1_OBJECT *obj, int lastpos); --int X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *x, -- int crit, int lastpos); --X509_EXTENSION *X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x, int loc); --X509_EXTENSION *X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x, int loc); --STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x, -- X509_EXTENSION *ex, int loc); -- --int X509_get_ext_count(const X509 *x); --int X509_get_ext_by_NID(const X509 *x, int nid, int lastpos); --int X509_get_ext_by_OBJ(const X509 *x, const ASN1_OBJECT *obj, int lastpos); --int X509_get_ext_by_critical(const X509 *x, int crit, int lastpos); --X509_EXTENSION *X509_get_ext(const X509 *x, int loc); --X509_EXTENSION *X509_delete_ext(X509 *x, int loc); --int X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc); --void *X509_get_ext_d2i(const X509 *x, int nid, int *crit, int *idx); --int X509_add1_ext_i2d(X509 *x, int nid, void *value, int crit, -- unsigned long flags); -- --int X509_CRL_get_ext_count(const X509_CRL *x); --int X509_CRL_get_ext_by_NID(const X509_CRL *x, int nid, int lastpos); --int X509_CRL_get_ext_by_OBJ(const X509_CRL *x, const ASN1_OBJECT *obj, -- int lastpos); --int X509_CRL_get_ext_by_critical(const X509_CRL *x, int crit, int lastpos); --X509_EXTENSION *X509_CRL_get_ext(const X509_CRL *x, int loc); --X509_EXTENSION *X509_CRL_delete_ext(X509_CRL *x, int loc); --int X509_CRL_add_ext(X509_CRL *x, X509_EXTENSION *ex, int loc); --void *X509_CRL_get_ext_d2i(const X509_CRL *x, int nid, int *crit, int *idx); --int X509_CRL_add1_ext_i2d(X509_CRL *x, int nid, void *value, int crit, -- unsigned long flags); -- --int X509_REVOKED_get_ext_count(const X509_REVOKED *x); --int X509_REVOKED_get_ext_by_NID(const X509_REVOKED *x, int nid, int lastpos); --int X509_REVOKED_get_ext_by_OBJ(const X509_REVOKED *x, const ASN1_OBJECT *obj, -- int lastpos); --int X509_REVOKED_get_ext_by_critical(const X509_REVOKED *x, int crit, -- int lastpos); --X509_EXTENSION *X509_REVOKED_get_ext(const X509_REVOKED *x, int loc); --X509_EXTENSION *X509_REVOKED_delete_ext(X509_REVOKED *x, int loc); --int X509_REVOKED_add_ext(X509_REVOKED *x, X509_EXTENSION *ex, int loc); --void *X509_REVOKED_get_ext_d2i(const X509_REVOKED *x, int nid, int *crit, -- int *idx); --int X509_REVOKED_add1_ext_i2d(X509_REVOKED *x, int nid, void *value, int crit, -- unsigned long flags); -- --X509_EXTENSION *X509_EXTENSION_create_by_NID(X509_EXTENSION **ex, -- int nid, int crit, -- ASN1_OCTET_STRING *data); --X509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex, -- const ASN1_OBJECT *obj, int crit, -- ASN1_OCTET_STRING *data); --int X509_EXTENSION_set_object(X509_EXTENSION *ex, const ASN1_OBJECT *obj); --int X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit); --int X509_EXTENSION_set_data(X509_EXTENSION *ex, ASN1_OCTET_STRING *data); --ASN1_OBJECT *X509_EXTENSION_get_object(X509_EXTENSION *ex); --ASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *ne); --int X509_EXTENSION_get_critical(const X509_EXTENSION *ex); -- --int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x); --int X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid, -- int lastpos); --int X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk, -- const ASN1_OBJECT *obj, int lastpos); --X509_ATTRIBUTE *X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc); --X509_ATTRIBUTE *X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc); --STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x, -- X509_ATTRIBUTE *attr); --STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE) -- **x, const ASN1_OBJECT *obj, -- int type, -- const unsigned char *bytes, -- int len); --STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE) -- **x, int nid, int type, -- const unsigned char *bytes, -- int len); --STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE) -- **x, const char *attrname, -- int type, -- const unsigned char *bytes, -- int len); --void *X509at_get0_data_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *x, -- const ASN1_OBJECT *obj, int lastpos, int type); --X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid, -- int atrtype, const void *data, -- int len); --X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr, -- const ASN1_OBJECT *obj, -- int atrtype, const void *data, -- int len); --X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr, -- const char *atrname, int type, -- const unsigned char *bytes, -- int len); --int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj); --int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, -- const void *data, int len); --void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx, int atrtype, -- void *data); --int X509_ATTRIBUTE_count(const X509_ATTRIBUTE *attr); --ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr); --ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx); -- --int EVP_PKEY_get_attr_count(const EVP_PKEY *key); --int EVP_PKEY_get_attr_by_NID(const EVP_PKEY *key, int nid, int lastpos); --int EVP_PKEY_get_attr_by_OBJ(const EVP_PKEY *key, const ASN1_OBJECT *obj, -- int lastpos); --X509_ATTRIBUTE *EVP_PKEY_get_attr(const EVP_PKEY *key, int loc); --X509_ATTRIBUTE *EVP_PKEY_delete_attr(EVP_PKEY *key, int loc); --int EVP_PKEY_add1_attr(EVP_PKEY *key, X509_ATTRIBUTE *attr); --int EVP_PKEY_add1_attr_by_OBJ(EVP_PKEY *key, -- const ASN1_OBJECT *obj, int type, -- const unsigned char *bytes, int len); --int EVP_PKEY_add1_attr_by_NID(EVP_PKEY *key, -- int nid, int type, -- const unsigned char *bytes, int len); --int EVP_PKEY_add1_attr_by_txt(EVP_PKEY *key, -- const char *attrname, int type, -- const unsigned char *bytes, int len); -- --int X509_verify_cert(X509_STORE_CTX *ctx); -- --/* lookup a cert from a X509 STACK */ --X509 *X509_find_by_issuer_and_serial(STACK_OF(X509) *sk, X509_NAME *name, -- ASN1_INTEGER *serial); --X509 *X509_find_by_subject(STACK_OF(X509) *sk, X509_NAME *name); -- --DECLARE_ASN1_FUNCTIONS(PBEPARAM) --DECLARE_ASN1_FUNCTIONS(PBE2PARAM) --DECLARE_ASN1_FUNCTIONS(PBKDF2PARAM) --#ifndef OPENSSL_NO_SCRYPT --DECLARE_ASN1_FUNCTIONS(SCRYPT_PARAMS) --#endif -- --int PKCS5_pbe_set0_algor(X509_ALGOR *algor, int alg, int iter, -- const unsigned char *salt, int saltlen); -- --X509_ALGOR *PKCS5_pbe_set(int alg, int iter, -- const unsigned char *salt, int saltlen); --X509_ALGOR *PKCS5_pbe2_set(const EVP_CIPHER *cipher, int iter, -- unsigned char *salt, int saltlen); --X509_ALGOR *PKCS5_pbe2_set_iv(const EVP_CIPHER *cipher, int iter, -- unsigned char *salt, int saltlen, -- unsigned char *aiv, int prf_nid); -- --#ifndef OPENSSL_NO_SCRYPT --X509_ALGOR *PKCS5_pbe2_set_scrypt(const EVP_CIPHER *cipher, -- const unsigned char *salt, int saltlen, -- unsigned char *aiv, uint64_t N, uint64_t r, -- uint64_t p); --#endif -- --X509_ALGOR *PKCS5_pbkdf2_set(int iter, unsigned char *salt, int saltlen, -- int prf_nid, int keylen); -- --/* PKCS#8 utilities */ -- --DECLARE_ASN1_FUNCTIONS(PKCS8_PRIV_KEY_INFO) -- --EVP_PKEY *EVP_PKCS82PKEY(const PKCS8_PRIV_KEY_INFO *p8); --PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey); -- --int PKCS8_pkey_set0(PKCS8_PRIV_KEY_INFO *priv, ASN1_OBJECT *aobj, -- int version, int ptype, void *pval, -- unsigned char *penc, int penclen); --int PKCS8_pkey_get0(const ASN1_OBJECT **ppkalg, -- const unsigned char **pk, int *ppklen, -- const X509_ALGOR **pa, const PKCS8_PRIV_KEY_INFO *p8); -- --const STACK_OF(X509_ATTRIBUTE) * --PKCS8_pkey_get0_attrs(const PKCS8_PRIV_KEY_INFO *p8); --int PKCS8_pkey_add1_attr_by_NID(PKCS8_PRIV_KEY_INFO *p8, int nid, int type, -- const unsigned char *bytes, int len); -- --int X509_PUBKEY_set0_param(X509_PUBKEY *pub, ASN1_OBJECT *aobj, -- int ptype, void *pval, -- unsigned char *penc, int penclen); --int X509_PUBKEY_get0_param(ASN1_OBJECT **ppkalg, -- const unsigned char **pk, int *ppklen, -- X509_ALGOR **pa, X509_PUBKEY *pub); -- --int X509_check_trust(X509 *x, int id, int flags); --int X509_TRUST_get_count(void); --X509_TRUST *X509_TRUST_get0(int idx); --int X509_TRUST_get_by_id(int id); --int X509_TRUST_add(int id, int flags, int (*ck) (X509_TRUST *, X509 *, int), -- const char *name, int arg1, void *arg2); --void X509_TRUST_cleanup(void); --int X509_TRUST_get_flags(const X509_TRUST *xp); --char *X509_TRUST_get0_name(const X509_TRUST *xp); --int X509_TRUST_get_trust(const X509_TRUST *xp); -- --# ifdef __cplusplus --} --# endif --#endif -diff --git a/uadk_tool/include/openssl/x509_vfy.h b/uadk_tool/include/openssl/x509_vfy.h -deleted file mode 100644 -index 25c79f1..0000000 ---- a/uadk_tool/include/openssl/x509_vfy.h -+++ /dev/null -@@ -1,632 +0,0 @@ --/* -- * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_X509_VFY_H --# define HEADER_X509_VFY_H -- --/* -- * Protect against recursion, x509.h and x509_vfy.h each include the other. -- */ --# ifndef HEADER_X509_H --# include --# endif -- --# include --# include --# include --# include --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --/*- --SSL_CTX -> X509_STORE -- -> X509_LOOKUP -- ->X509_LOOKUP_METHOD -- -> X509_LOOKUP -- ->X509_LOOKUP_METHOD -- --SSL -> X509_STORE_CTX -- ->X509_STORE -- --The X509_STORE holds the tables etc for verification stuff. --A X509_STORE_CTX is used while validating a single certificate. --The X509_STORE has X509_LOOKUPs for looking up certs. --The X509_STORE then calls a function to actually verify the --certificate chain. --*/ -- --typedef enum { -- X509_LU_NONE = 0, -- X509_LU_X509, X509_LU_CRL --} X509_LOOKUP_TYPE; -- --#if OPENSSL_API_COMPAT < 0x10100000L --#define X509_LU_RETRY -1 --#define X509_LU_FAIL 0 --#endif -- --DEFINE_STACK_OF(X509_LOOKUP) --DEFINE_STACK_OF(X509_OBJECT) --DEFINE_STACK_OF(X509_VERIFY_PARAM) -- --int X509_STORE_set_depth(X509_STORE *store, int depth); -- --typedef int (*X509_STORE_CTX_verify_cb)(int, X509_STORE_CTX *); --typedef int (*X509_STORE_CTX_verify_fn)(X509_STORE_CTX *); --typedef int (*X509_STORE_CTX_get_issuer_fn)(X509 **issuer, -- X509_STORE_CTX *ctx, X509 *x); --typedef int (*X509_STORE_CTX_check_issued_fn)(X509_STORE_CTX *ctx, -- X509 *x, X509 *issuer); --typedef int (*X509_STORE_CTX_check_revocation_fn)(X509_STORE_CTX *ctx); --typedef int (*X509_STORE_CTX_get_crl_fn)(X509_STORE_CTX *ctx, -- X509_CRL **crl, X509 *x); --typedef int (*X509_STORE_CTX_check_crl_fn)(X509_STORE_CTX *ctx, X509_CRL *crl); --typedef int (*X509_STORE_CTX_cert_crl_fn)(X509_STORE_CTX *ctx, -- X509_CRL *crl, X509 *x); --typedef int (*X509_STORE_CTX_check_policy_fn)(X509_STORE_CTX *ctx); --typedef STACK_OF(X509) *(*X509_STORE_CTX_lookup_certs_fn)(X509_STORE_CTX *ctx, -- X509_NAME *nm); --typedef STACK_OF(X509_CRL) *(*X509_STORE_CTX_lookup_crls_fn)(X509_STORE_CTX *ctx, -- X509_NAME *nm); --typedef int (*X509_STORE_CTX_cleanup_fn)(X509_STORE_CTX *ctx); -- -- --void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth); -- --# define X509_STORE_CTX_set_app_data(ctx,data) \ -- X509_STORE_CTX_set_ex_data(ctx,0,data) --# define X509_STORE_CTX_get_app_data(ctx) \ -- X509_STORE_CTX_get_ex_data(ctx,0) -- --# define X509_L_FILE_LOAD 1 --# define X509_L_ADD_DIR 2 -- --# define X509_LOOKUP_load_file(x,name,type) \ -- X509_LOOKUP_ctrl((x),X509_L_FILE_LOAD,(name),(long)(type),NULL) -- --# define X509_LOOKUP_add_dir(x,name,type) \ -- X509_LOOKUP_ctrl((x),X509_L_ADD_DIR,(name),(long)(type),NULL) -- --# define X509_V_OK 0 --# define X509_V_ERR_UNSPECIFIED 1 --# define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT 2 --# define X509_V_ERR_UNABLE_TO_GET_CRL 3 --# define X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE 4 --# define X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE 5 --# define X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY 6 --# define X509_V_ERR_CERT_SIGNATURE_FAILURE 7 --# define X509_V_ERR_CRL_SIGNATURE_FAILURE 8 --# define X509_V_ERR_CERT_NOT_YET_VALID 9 --# define X509_V_ERR_CERT_HAS_EXPIRED 10 --# define X509_V_ERR_CRL_NOT_YET_VALID 11 --# define X509_V_ERR_CRL_HAS_EXPIRED 12 --# define X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD 13 --# define X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD 14 --# define X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD 15 --# define X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD 16 --# define X509_V_ERR_OUT_OF_MEM 17 --# define X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT 18 --# define X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN 19 --# define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY 20 --# define X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE 21 --# define X509_V_ERR_CERT_CHAIN_TOO_LONG 22 --# define X509_V_ERR_CERT_REVOKED 23 --# define X509_V_ERR_INVALID_CA 24 --# define X509_V_ERR_PATH_LENGTH_EXCEEDED 25 --# define X509_V_ERR_INVALID_PURPOSE 26 --# define X509_V_ERR_CERT_UNTRUSTED 27 --# define X509_V_ERR_CERT_REJECTED 28 --/* These are 'informational' when looking for issuer cert */ --# define X509_V_ERR_SUBJECT_ISSUER_MISMATCH 29 --# define X509_V_ERR_AKID_SKID_MISMATCH 30 --# define X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH 31 --# define X509_V_ERR_KEYUSAGE_NO_CERTSIGN 32 --# define X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER 33 --# define X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION 34 --# define X509_V_ERR_KEYUSAGE_NO_CRL_SIGN 35 --# define X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION 36 --# define X509_V_ERR_INVALID_NON_CA 37 --# define X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED 38 --# define X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE 39 --# define X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED 40 --# define X509_V_ERR_INVALID_EXTENSION 41 --# define X509_V_ERR_INVALID_POLICY_EXTENSION 42 --# define X509_V_ERR_NO_EXPLICIT_POLICY 43 --# define X509_V_ERR_DIFFERENT_CRL_SCOPE 44 --# define X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE 45 --# define X509_V_ERR_UNNESTED_RESOURCE 46 --# define X509_V_ERR_PERMITTED_VIOLATION 47 --# define X509_V_ERR_EXCLUDED_VIOLATION 48 --# define X509_V_ERR_SUBTREE_MINMAX 49 --/* The application is not happy */ --# define X509_V_ERR_APPLICATION_VERIFICATION 50 --# define X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE 51 --# define X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX 52 --# define X509_V_ERR_UNSUPPORTED_NAME_SYNTAX 53 --# define X509_V_ERR_CRL_PATH_VALIDATION_ERROR 54 --/* Another issuer check debug option */ --# define X509_V_ERR_PATH_LOOP 55 --/* Suite B mode algorithm violation */ --# define X509_V_ERR_SUITE_B_INVALID_VERSION 56 --# define X509_V_ERR_SUITE_B_INVALID_ALGORITHM 57 --# define X509_V_ERR_SUITE_B_INVALID_CURVE 58 --# define X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM 59 --# define X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED 60 --# define X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256 61 --/* Host, email and IP check errors */ --# define X509_V_ERR_HOSTNAME_MISMATCH 62 --# define X509_V_ERR_EMAIL_MISMATCH 63 --# define X509_V_ERR_IP_ADDRESS_MISMATCH 64 --/* DANE TLSA errors */ --# define X509_V_ERR_DANE_NO_MATCH 65 --/* security level errors */ --# define X509_V_ERR_EE_KEY_TOO_SMALL 66 --# define X509_V_ERR_CA_KEY_TOO_SMALL 67 --# define X509_V_ERR_CA_MD_TOO_WEAK 68 --/* Caller error */ --# define X509_V_ERR_INVALID_CALL 69 --/* Issuer lookup error */ --# define X509_V_ERR_STORE_LOOKUP 70 --/* Certificate transparency */ --# define X509_V_ERR_NO_VALID_SCTS 71 -- --# define X509_V_ERR_PROXY_SUBJECT_NAME_VIOLATION 72 --/* OCSP status errors */ --# define X509_V_ERR_OCSP_VERIFY_NEEDED 73 /* Need OCSP verification */ --# define X509_V_ERR_OCSP_VERIFY_FAILED 74 /* Couldn't verify cert through OCSP */ --# define X509_V_ERR_OCSP_CERT_UNKNOWN 75 /* Certificate wasn't recognized by the OCSP responder */ --# define X509_V_ERR_SIGNATURE_ALGORITHM_MISMATCH 76 --# define X509_V_ERR_NO_ISSUER_PUBLIC_KEY 77 --# define X509_V_ERR_UNSUPPORTED_SIGNATURE_ALGORITHM 78 --# define X509_V_ERR_EC_KEY_EXPLICIT_PARAMS 79 -- --/* Certificate verify flags */ -- --# if OPENSSL_API_COMPAT < 0x10100000L --# define X509_V_FLAG_CB_ISSUER_CHECK 0x0 /* Deprecated */ --# endif --/* Use check time instead of current time */ --# define X509_V_FLAG_USE_CHECK_TIME 0x2 --/* Lookup CRLs */ --# define X509_V_FLAG_CRL_CHECK 0x4 --/* Lookup CRLs for whole chain */ --# define X509_V_FLAG_CRL_CHECK_ALL 0x8 --/* Ignore unhandled critical extensions */ --# define X509_V_FLAG_IGNORE_CRITICAL 0x10 --/* Disable workarounds for broken certificates */ --# define X509_V_FLAG_X509_STRICT 0x20 --/* Enable proxy certificate validation */ --# define X509_V_FLAG_ALLOW_PROXY_CERTS 0x40 --/* Enable policy checking */ --# define X509_V_FLAG_POLICY_CHECK 0x80 --/* Policy variable require-explicit-policy */ --# define X509_V_FLAG_EXPLICIT_POLICY 0x100 --/* Policy variable inhibit-any-policy */ --# define X509_V_FLAG_INHIBIT_ANY 0x200 --/* Policy variable inhibit-policy-mapping */ --# define X509_V_FLAG_INHIBIT_MAP 0x400 --/* Notify callback that policy is OK */ --# define X509_V_FLAG_NOTIFY_POLICY 0x800 --/* Extended CRL features such as indirect CRLs, alternate CRL signing keys */ --# define X509_V_FLAG_EXTENDED_CRL_SUPPORT 0x1000 --/* Delta CRL support */ --# define X509_V_FLAG_USE_DELTAS 0x2000 --/* Check self-signed CA signature */ --# define X509_V_FLAG_CHECK_SS_SIGNATURE 0x4000 --/* Use trusted store first */ --# define X509_V_FLAG_TRUSTED_FIRST 0x8000 --/* Suite B 128 bit only mode: not normally used */ --# define X509_V_FLAG_SUITEB_128_LOS_ONLY 0x10000 --/* Suite B 192 bit only mode */ --# define X509_V_FLAG_SUITEB_192_LOS 0x20000 --/* Suite B 128 bit mode allowing 192 bit algorithms */ --# define X509_V_FLAG_SUITEB_128_LOS 0x30000 --/* Allow partial chains if at least one certificate is in trusted store */ --# define X509_V_FLAG_PARTIAL_CHAIN 0x80000 --/* -- * If the initial chain is not trusted, do not attempt to build an alternative -- * chain. Alternate chain checking was introduced in 1.1.0. Setting this flag -- * will force the behaviour to match that of previous versions. -- */ --# define X509_V_FLAG_NO_ALT_CHAINS 0x100000 --/* Do not check certificate/CRL validity against current time */ --# define X509_V_FLAG_NO_CHECK_TIME 0x200000 -- --# define X509_VP_FLAG_DEFAULT 0x1 --# define X509_VP_FLAG_OVERWRITE 0x2 --# define X509_VP_FLAG_RESET_FLAGS 0x4 --# define X509_VP_FLAG_LOCKED 0x8 --# define X509_VP_FLAG_ONCE 0x10 -- --/* Internal use: mask of policy related options */ --# define X509_V_FLAG_POLICY_MASK (X509_V_FLAG_POLICY_CHECK \ -- | X509_V_FLAG_EXPLICIT_POLICY \ -- | X509_V_FLAG_INHIBIT_ANY \ -- | X509_V_FLAG_INHIBIT_MAP) -- --int X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, X509_LOOKUP_TYPE type, -- X509_NAME *name); --X509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h, -- X509_LOOKUP_TYPE type, -- X509_NAME *name); --X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h, -- X509_OBJECT *x); --int X509_OBJECT_up_ref_count(X509_OBJECT *a); --X509_OBJECT *X509_OBJECT_new(void); --void X509_OBJECT_free(X509_OBJECT *a); --X509_LOOKUP_TYPE X509_OBJECT_get_type(const X509_OBJECT *a); --X509 *X509_OBJECT_get0_X509(const X509_OBJECT *a); --int X509_OBJECT_set1_X509(X509_OBJECT *a, X509 *obj); --X509_CRL *X509_OBJECT_get0_X509_CRL(X509_OBJECT *a); --int X509_OBJECT_set1_X509_CRL(X509_OBJECT *a, X509_CRL *obj); --X509_STORE *X509_STORE_new(void); --void X509_STORE_free(X509_STORE *v); --int X509_STORE_lock(X509_STORE *ctx); --int X509_STORE_unlock(X509_STORE *ctx); --int X509_STORE_up_ref(X509_STORE *v); --STACK_OF(X509_OBJECT) *X509_STORE_get0_objects(X509_STORE *v); -- --STACK_OF(X509) *X509_STORE_CTX_get1_certs(X509_STORE_CTX *st, X509_NAME *nm); --STACK_OF(X509_CRL) *X509_STORE_CTX_get1_crls(X509_STORE_CTX *st, X509_NAME *nm); --int X509_STORE_set_flags(X509_STORE *ctx, unsigned long flags); --int X509_STORE_set_purpose(X509_STORE *ctx, int purpose); --int X509_STORE_set_trust(X509_STORE *ctx, int trust); --int X509_STORE_set1_param(X509_STORE *ctx, X509_VERIFY_PARAM *pm); --X509_VERIFY_PARAM *X509_STORE_get0_param(X509_STORE *ctx); -- --void X509_STORE_set_verify(X509_STORE *ctx, X509_STORE_CTX_verify_fn verify); --#define X509_STORE_set_verify_func(ctx, func) \ -- X509_STORE_set_verify((ctx),(func)) --void X509_STORE_CTX_set_verify(X509_STORE_CTX *ctx, -- X509_STORE_CTX_verify_fn verify); --X509_STORE_CTX_verify_fn X509_STORE_get_verify(X509_STORE *ctx); --void X509_STORE_set_verify_cb(X509_STORE *ctx, -- X509_STORE_CTX_verify_cb verify_cb); --# define X509_STORE_set_verify_cb_func(ctx,func) \ -- X509_STORE_set_verify_cb((ctx),(func)) --X509_STORE_CTX_verify_cb X509_STORE_get_verify_cb(X509_STORE *ctx); --void X509_STORE_set_get_issuer(X509_STORE *ctx, -- X509_STORE_CTX_get_issuer_fn get_issuer); --X509_STORE_CTX_get_issuer_fn X509_STORE_get_get_issuer(X509_STORE *ctx); --void X509_STORE_set_check_issued(X509_STORE *ctx, -- X509_STORE_CTX_check_issued_fn check_issued); --X509_STORE_CTX_check_issued_fn X509_STORE_get_check_issued(X509_STORE *ctx); --void X509_STORE_set_check_revocation(X509_STORE *ctx, -- X509_STORE_CTX_check_revocation_fn check_revocation); --X509_STORE_CTX_check_revocation_fn X509_STORE_get_check_revocation(X509_STORE *ctx); --void X509_STORE_set_get_crl(X509_STORE *ctx, -- X509_STORE_CTX_get_crl_fn get_crl); --X509_STORE_CTX_get_crl_fn X509_STORE_get_get_crl(X509_STORE *ctx); --void X509_STORE_set_check_crl(X509_STORE *ctx, -- X509_STORE_CTX_check_crl_fn check_crl); --X509_STORE_CTX_check_crl_fn X509_STORE_get_check_crl(X509_STORE *ctx); --void X509_STORE_set_cert_crl(X509_STORE *ctx, -- X509_STORE_CTX_cert_crl_fn cert_crl); --X509_STORE_CTX_cert_crl_fn X509_STORE_get_cert_crl(X509_STORE *ctx); --void X509_STORE_set_check_policy(X509_STORE *ctx, -- X509_STORE_CTX_check_policy_fn check_policy); --X509_STORE_CTX_check_policy_fn X509_STORE_get_check_policy(X509_STORE *ctx); --void X509_STORE_set_lookup_certs(X509_STORE *ctx, -- X509_STORE_CTX_lookup_certs_fn lookup_certs); --X509_STORE_CTX_lookup_certs_fn X509_STORE_get_lookup_certs(X509_STORE *ctx); --void X509_STORE_set_lookup_crls(X509_STORE *ctx, -- X509_STORE_CTX_lookup_crls_fn lookup_crls); --#define X509_STORE_set_lookup_crls_cb(ctx, func) \ -- X509_STORE_set_lookup_crls((ctx), (func)) --X509_STORE_CTX_lookup_crls_fn X509_STORE_get_lookup_crls(X509_STORE *ctx); --void X509_STORE_set_cleanup(X509_STORE *ctx, -- X509_STORE_CTX_cleanup_fn cleanup); --X509_STORE_CTX_cleanup_fn X509_STORE_get_cleanup(X509_STORE *ctx); -- --#define X509_STORE_get_ex_new_index(l, p, newf, dupf, freef) \ -- CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509_STORE, l, p, newf, dupf, freef) --int X509_STORE_set_ex_data(X509_STORE *ctx, int idx, void *data); --void *X509_STORE_get_ex_data(X509_STORE *ctx, int idx); -- --X509_STORE_CTX *X509_STORE_CTX_new(void); -- --int X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x); -- --void X509_STORE_CTX_free(X509_STORE_CTX *ctx); --int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, -- X509 *x509, STACK_OF(X509) *chain); --void X509_STORE_CTX_set0_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk); --void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx); -- --X509_STORE *X509_STORE_CTX_get0_store(X509_STORE_CTX *ctx); --X509 *X509_STORE_CTX_get0_cert(X509_STORE_CTX *ctx); --STACK_OF(X509)* X509_STORE_CTX_get0_untrusted(X509_STORE_CTX *ctx); --void X509_STORE_CTX_set0_untrusted(X509_STORE_CTX *ctx, STACK_OF(X509) *sk); --void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx, -- X509_STORE_CTX_verify_cb verify); --X509_STORE_CTX_verify_cb X509_STORE_CTX_get_verify_cb(X509_STORE_CTX *ctx); --X509_STORE_CTX_verify_fn X509_STORE_CTX_get_verify(X509_STORE_CTX *ctx); --X509_STORE_CTX_get_issuer_fn X509_STORE_CTX_get_get_issuer(X509_STORE_CTX *ctx); --X509_STORE_CTX_check_issued_fn X509_STORE_CTX_get_check_issued(X509_STORE_CTX *ctx); --X509_STORE_CTX_check_revocation_fn X509_STORE_CTX_get_check_revocation(X509_STORE_CTX *ctx); --X509_STORE_CTX_get_crl_fn X509_STORE_CTX_get_get_crl(X509_STORE_CTX *ctx); --X509_STORE_CTX_check_crl_fn X509_STORE_CTX_get_check_crl(X509_STORE_CTX *ctx); --X509_STORE_CTX_cert_crl_fn X509_STORE_CTX_get_cert_crl(X509_STORE_CTX *ctx); --X509_STORE_CTX_check_policy_fn X509_STORE_CTX_get_check_policy(X509_STORE_CTX *ctx); --X509_STORE_CTX_lookup_certs_fn X509_STORE_CTX_get_lookup_certs(X509_STORE_CTX *ctx); --X509_STORE_CTX_lookup_crls_fn X509_STORE_CTX_get_lookup_crls(X509_STORE_CTX *ctx); --X509_STORE_CTX_cleanup_fn X509_STORE_CTX_get_cleanup(X509_STORE_CTX *ctx); -- --#if OPENSSL_API_COMPAT < 0x10100000L --# define X509_STORE_CTX_get_chain X509_STORE_CTX_get0_chain --# define X509_STORE_CTX_set_chain X509_STORE_CTX_set0_untrusted --# define X509_STORE_CTX_trusted_stack X509_STORE_CTX_set0_trusted_stack --# define X509_STORE_get_by_subject X509_STORE_CTX_get_by_subject --# define X509_STORE_get1_certs X509_STORE_CTX_get1_certs --# define X509_STORE_get1_crls X509_STORE_CTX_get1_crls --/* the following macro is misspelled; use X509_STORE_get1_certs instead */ --# define X509_STORE_get1_cert X509_STORE_CTX_get1_certs --/* the following macro is misspelled; use X509_STORE_get1_crls instead */ --# define X509_STORE_get1_crl X509_STORE_CTX_get1_crls --#endif -- --X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m); --X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void); --X509_LOOKUP_METHOD *X509_LOOKUP_file(void); -- --typedef int (*X509_LOOKUP_ctrl_fn)(X509_LOOKUP *ctx, int cmd, const char *argc, -- long argl, char **ret); --typedef int (*X509_LOOKUP_get_by_subject_fn)(X509_LOOKUP *ctx, -- X509_LOOKUP_TYPE type, -- X509_NAME *name, -- X509_OBJECT *ret); --typedef int (*X509_LOOKUP_get_by_issuer_serial_fn)(X509_LOOKUP *ctx, -- X509_LOOKUP_TYPE type, -- X509_NAME *name, -- ASN1_INTEGER *serial, -- X509_OBJECT *ret); --typedef int (*X509_LOOKUP_get_by_fingerprint_fn)(X509_LOOKUP *ctx, -- X509_LOOKUP_TYPE type, -- const unsigned char* bytes, -- int len, -- X509_OBJECT *ret); --typedef int (*X509_LOOKUP_get_by_alias_fn)(X509_LOOKUP *ctx, -- X509_LOOKUP_TYPE type, -- const char *str, -- int len, -- X509_OBJECT *ret); -- --X509_LOOKUP_METHOD *X509_LOOKUP_meth_new(const char *name); --void X509_LOOKUP_meth_free(X509_LOOKUP_METHOD *method); -- --int X509_LOOKUP_meth_set_new_item(X509_LOOKUP_METHOD *method, -- int (*new_item) (X509_LOOKUP *ctx)); --int (*X509_LOOKUP_meth_get_new_item(const X509_LOOKUP_METHOD* method)) -- (X509_LOOKUP *ctx); -- --int X509_LOOKUP_meth_set_free(X509_LOOKUP_METHOD *method, -- void (*free_fn) (X509_LOOKUP *ctx)); --void (*X509_LOOKUP_meth_get_free(const X509_LOOKUP_METHOD* method)) -- (X509_LOOKUP *ctx); -- --int X509_LOOKUP_meth_set_init(X509_LOOKUP_METHOD *method, -- int (*init) (X509_LOOKUP *ctx)); --int (*X509_LOOKUP_meth_get_init(const X509_LOOKUP_METHOD* method)) -- (X509_LOOKUP *ctx); -- --int X509_LOOKUP_meth_set_shutdown(X509_LOOKUP_METHOD *method, -- int (*shutdown) (X509_LOOKUP *ctx)); --int (*X509_LOOKUP_meth_get_shutdown(const X509_LOOKUP_METHOD* method)) -- (X509_LOOKUP *ctx); -- --int X509_LOOKUP_meth_set_ctrl(X509_LOOKUP_METHOD *method, -- X509_LOOKUP_ctrl_fn ctrl_fn); --X509_LOOKUP_ctrl_fn X509_LOOKUP_meth_get_ctrl(const X509_LOOKUP_METHOD *method); -- --int X509_LOOKUP_meth_set_get_by_subject(X509_LOOKUP_METHOD *method, -- X509_LOOKUP_get_by_subject_fn fn); --X509_LOOKUP_get_by_subject_fn X509_LOOKUP_meth_get_get_by_subject( -- const X509_LOOKUP_METHOD *method); -- --int X509_LOOKUP_meth_set_get_by_issuer_serial(X509_LOOKUP_METHOD *method, -- X509_LOOKUP_get_by_issuer_serial_fn fn); --X509_LOOKUP_get_by_issuer_serial_fn X509_LOOKUP_meth_get_get_by_issuer_serial( -- const X509_LOOKUP_METHOD *method); -- --int X509_LOOKUP_meth_set_get_by_fingerprint(X509_LOOKUP_METHOD *method, -- X509_LOOKUP_get_by_fingerprint_fn fn); --X509_LOOKUP_get_by_fingerprint_fn X509_LOOKUP_meth_get_get_by_fingerprint( -- const X509_LOOKUP_METHOD *method); -- --int X509_LOOKUP_meth_set_get_by_alias(X509_LOOKUP_METHOD *method, -- X509_LOOKUP_get_by_alias_fn fn); --X509_LOOKUP_get_by_alias_fn X509_LOOKUP_meth_get_get_by_alias( -- const X509_LOOKUP_METHOD *method); -- -- --int X509_STORE_add_cert(X509_STORE *ctx, X509 *x); --int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x); -- --int X509_STORE_CTX_get_by_subject(X509_STORE_CTX *vs, X509_LOOKUP_TYPE type, -- X509_NAME *name, X509_OBJECT *ret); --X509_OBJECT *X509_STORE_CTX_get_obj_by_subject(X509_STORE_CTX *vs, -- X509_LOOKUP_TYPE type, -- X509_NAME *name); -- --int X509_LOOKUP_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, -- long argl, char **ret); -- --int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type); --int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type); --int X509_load_cert_crl_file(X509_LOOKUP *ctx, const char *file, int type); -- --X509_LOOKUP *X509_LOOKUP_new(X509_LOOKUP_METHOD *method); --void X509_LOOKUP_free(X509_LOOKUP *ctx); --int X509_LOOKUP_init(X509_LOOKUP *ctx); --int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type, -- X509_NAME *name, X509_OBJECT *ret); --int X509_LOOKUP_by_issuer_serial(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type, -- X509_NAME *name, ASN1_INTEGER *serial, -- X509_OBJECT *ret); --int X509_LOOKUP_by_fingerprint(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type, -- const unsigned char *bytes, int len, -- X509_OBJECT *ret); --int X509_LOOKUP_by_alias(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type, -- const char *str, int len, X509_OBJECT *ret); --int X509_LOOKUP_set_method_data(X509_LOOKUP *ctx, void *data); --void *X509_LOOKUP_get_method_data(const X509_LOOKUP *ctx); --X509_STORE *X509_LOOKUP_get_store(const X509_LOOKUP *ctx); --int X509_LOOKUP_shutdown(X509_LOOKUP *ctx); -- --int X509_STORE_load_locations(X509_STORE *ctx, -- const char *file, const char *dir); --int X509_STORE_set_default_paths(X509_STORE *ctx); -- --#define X509_STORE_CTX_get_ex_new_index(l, p, newf, dupf, freef) \ -- CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509_STORE_CTX, l, p, newf, dupf, freef) --int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx, int idx, void *data); --void *X509_STORE_CTX_get_ex_data(X509_STORE_CTX *ctx, int idx); --int X509_STORE_CTX_get_error(X509_STORE_CTX *ctx); --void X509_STORE_CTX_set_error(X509_STORE_CTX *ctx, int s); --int X509_STORE_CTX_get_error_depth(X509_STORE_CTX *ctx); --void X509_STORE_CTX_set_error_depth(X509_STORE_CTX *ctx, int depth); --X509 *X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx); --void X509_STORE_CTX_set_current_cert(X509_STORE_CTX *ctx, X509 *x); --X509 *X509_STORE_CTX_get0_current_issuer(X509_STORE_CTX *ctx); --X509_CRL *X509_STORE_CTX_get0_current_crl(X509_STORE_CTX *ctx); --X509_STORE_CTX *X509_STORE_CTX_get0_parent_ctx(X509_STORE_CTX *ctx); --STACK_OF(X509) *X509_STORE_CTX_get0_chain(X509_STORE_CTX *ctx); --STACK_OF(X509) *X509_STORE_CTX_get1_chain(X509_STORE_CTX *ctx); --void X509_STORE_CTX_set_cert(X509_STORE_CTX *c, X509 *x); --void X509_STORE_CTX_set0_verified_chain(X509_STORE_CTX *c, STACK_OF(X509) *sk); --void X509_STORE_CTX_set0_crls(X509_STORE_CTX *c, STACK_OF(X509_CRL) *sk); --int X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose); --int X509_STORE_CTX_set_trust(X509_STORE_CTX *ctx, int trust); --int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX *ctx, int def_purpose, -- int purpose, int trust); --void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, unsigned long flags); --void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx, unsigned long flags, -- time_t t); -- --X509_POLICY_TREE *X509_STORE_CTX_get0_policy_tree(X509_STORE_CTX *ctx); --int X509_STORE_CTX_get_explicit_policy(X509_STORE_CTX *ctx); --int X509_STORE_CTX_get_num_untrusted(X509_STORE_CTX *ctx); -- --X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(X509_STORE_CTX *ctx); --void X509_STORE_CTX_set0_param(X509_STORE_CTX *ctx, X509_VERIFY_PARAM *param); --int X509_STORE_CTX_set_default(X509_STORE_CTX *ctx, const char *name); -- --/* -- * Bridge opacity barrier between libcrypt and libssl, also needed to support -- * offline testing in test/danetest.c -- */ --void X509_STORE_CTX_set0_dane(X509_STORE_CTX *ctx, SSL_DANE *dane); --#define DANE_FLAG_NO_DANE_EE_NAMECHECKS (1L << 0) -- --/* X509_VERIFY_PARAM functions */ -- --X509_VERIFY_PARAM *X509_VERIFY_PARAM_new(void); --void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param); --int X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *to, -- const X509_VERIFY_PARAM *from); --int X509_VERIFY_PARAM_set1(X509_VERIFY_PARAM *to, -- const X509_VERIFY_PARAM *from); --int X509_VERIFY_PARAM_set1_name(X509_VERIFY_PARAM *param, const char *name); --int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param, -- unsigned long flags); --int X509_VERIFY_PARAM_clear_flags(X509_VERIFY_PARAM *param, -- unsigned long flags); --unsigned long X509_VERIFY_PARAM_get_flags(X509_VERIFY_PARAM *param); --int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *param, int purpose); --int X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM *param, int trust); --void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, int depth); --void X509_VERIFY_PARAM_set_auth_level(X509_VERIFY_PARAM *param, int auth_level); --time_t X509_VERIFY_PARAM_get_time(const X509_VERIFY_PARAM *param); --void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t); --int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param, -- ASN1_OBJECT *policy); --int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param, -- STACK_OF(ASN1_OBJECT) *policies); -- --int X509_VERIFY_PARAM_set_inh_flags(X509_VERIFY_PARAM *param, -- uint32_t flags); --uint32_t X509_VERIFY_PARAM_get_inh_flags(const X509_VERIFY_PARAM *param); -- --int X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *param, -- const char *name, size_t namelen); --int X509_VERIFY_PARAM_add1_host(X509_VERIFY_PARAM *param, -- const char *name, size_t namelen); --void X509_VERIFY_PARAM_set_hostflags(X509_VERIFY_PARAM *param, -- unsigned int flags); --unsigned int X509_VERIFY_PARAM_get_hostflags(const X509_VERIFY_PARAM *param); --char *X509_VERIFY_PARAM_get0_peername(X509_VERIFY_PARAM *); --void X509_VERIFY_PARAM_move_peername(X509_VERIFY_PARAM *, X509_VERIFY_PARAM *); --int X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *param, -- const char *email, size_t emaillen); --int X509_VERIFY_PARAM_set1_ip(X509_VERIFY_PARAM *param, -- const unsigned char *ip, size_t iplen); --int X509_VERIFY_PARAM_set1_ip_asc(X509_VERIFY_PARAM *param, -- const char *ipasc); -- --int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *param); --int X509_VERIFY_PARAM_get_auth_level(const X509_VERIFY_PARAM *param); --const char *X509_VERIFY_PARAM_get0_name(const X509_VERIFY_PARAM *param); -- --int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param); --int X509_VERIFY_PARAM_get_count(void); --const X509_VERIFY_PARAM *X509_VERIFY_PARAM_get0(int id); --const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name); --void X509_VERIFY_PARAM_table_cleanup(void); -- --/* Non positive return values are errors */ --#define X509_PCY_TREE_FAILURE -2 /* Failure to satisfy explicit policy */ --#define X509_PCY_TREE_INVALID -1 /* Inconsistent or invalid extensions */ --#define X509_PCY_TREE_INTERNAL 0 /* Internal error, most likely malloc */ -- --/* -- * Positive return values form a bit mask, all but the first are internal to -- * the library and don't appear in results from X509_policy_check(). -- */ --#define X509_PCY_TREE_VALID 1 /* The policy tree is valid */ --#define X509_PCY_TREE_EMPTY 2 /* The policy tree is empty */ --#define X509_PCY_TREE_EXPLICIT 4 /* Explicit policy required */ -- --int X509_policy_check(X509_POLICY_TREE **ptree, int *pexplicit_policy, -- STACK_OF(X509) *certs, -- STACK_OF(ASN1_OBJECT) *policy_oids, unsigned int flags); -- --void X509_policy_tree_free(X509_POLICY_TREE *tree); -- --int X509_policy_tree_level_count(const X509_POLICY_TREE *tree); --X509_POLICY_LEVEL *X509_policy_tree_get0_level(const X509_POLICY_TREE *tree, -- int i); -- --STACK_OF(X509_POLICY_NODE) *X509_policy_tree_get0_policies(const -- X509_POLICY_TREE -- *tree); -- --STACK_OF(X509_POLICY_NODE) *X509_policy_tree_get0_user_policies(const -- X509_POLICY_TREE -- *tree); -- --int X509_policy_level_node_count(X509_POLICY_LEVEL *level); -- --X509_POLICY_NODE *X509_policy_level_get0_node(X509_POLICY_LEVEL *level, -- int i); -- --const ASN1_OBJECT *X509_policy_node_get0_policy(const X509_POLICY_NODE *node); -- --STACK_OF(POLICYQUALINFO) *X509_policy_node_get0_qualifiers(const -- X509_POLICY_NODE -- *node); --const X509_POLICY_NODE *X509_policy_node_get0_parent(const X509_POLICY_NODE -- *node); -- --#ifdef __cplusplus --} --#endif --#endif -diff --git a/uadk_tool/include/openssl/x509err.h b/uadk_tool/include/openssl/x509err.h -deleted file mode 100644 -index cd08673..0000000 ---- a/uadk_tool/include/openssl/x509err.h -+++ /dev/null -@@ -1,129 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_X509ERR_H --# define HEADER_X509ERR_H -- --# include -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_X509_strings(void); -- --/* -- * X509 function codes. -- */ --# define X509_F_ADD_CERT_DIR 100 --# define X509_F_BUILD_CHAIN 106 --# define X509_F_BY_FILE_CTRL 101 --# define X509_F_CHECK_NAME_CONSTRAINTS 149 --# define X509_F_CHECK_POLICY 145 --# define X509_F_DANE_I2D 107 --# define X509_F_DIR_CTRL 102 --# define X509_F_GET_CERT_BY_SUBJECT 103 --# define X509_F_I2D_X509_AUX 151 --# define X509_F_LOOKUP_CERTS_SK 152 --# define X509_F_NETSCAPE_SPKI_B64_DECODE 129 --# define X509_F_NETSCAPE_SPKI_B64_ENCODE 130 --# define X509_F_NEW_DIR 153 --# define X509_F_X509AT_ADD1_ATTR 135 --# define X509_F_X509V3_ADD_EXT 104 --# define X509_F_X509_ATTRIBUTE_CREATE_BY_NID 136 --# define X509_F_X509_ATTRIBUTE_CREATE_BY_OBJ 137 --# define X509_F_X509_ATTRIBUTE_CREATE_BY_TXT 140 --# define X509_F_X509_ATTRIBUTE_GET0_DATA 139 --# define X509_F_X509_ATTRIBUTE_SET1_DATA 138 --# define X509_F_X509_CHECK_PRIVATE_KEY 128 --# define X509_F_X509_CRL_DIFF 105 --# define X509_F_X509_CRL_METHOD_NEW 154 --# define X509_F_X509_CRL_PRINT_FP 147 --# define X509_F_X509_EXTENSION_CREATE_BY_NID 108 --# define X509_F_X509_EXTENSION_CREATE_BY_OBJ 109 --# define X509_F_X509_GET_PUBKEY_PARAMETERS 110 --# define X509_F_X509_LOAD_CERT_CRL_FILE 132 --# define X509_F_X509_LOAD_CERT_FILE 111 --# define X509_F_X509_LOAD_CRL_FILE 112 --# define X509_F_X509_LOOKUP_METH_NEW 160 --# define X509_F_X509_LOOKUP_NEW 155 --# define X509_F_X509_NAME_ADD_ENTRY 113 --# define X509_F_X509_NAME_CANON 156 --# define X509_F_X509_NAME_ENTRY_CREATE_BY_NID 114 --# define X509_F_X509_NAME_ENTRY_CREATE_BY_TXT 131 --# define X509_F_X509_NAME_ENTRY_SET_OBJECT 115 --# define X509_F_X509_NAME_ONELINE 116 --# define X509_F_X509_NAME_PRINT 117 --# define X509_F_X509_OBJECT_NEW 150 --# define X509_F_X509_PRINT_EX_FP 118 --# define X509_F_X509_PUBKEY_DECODE 148 --# define X509_F_X509_PUBKEY_GET 161 --# define X509_F_X509_PUBKEY_GET0 119 --# define X509_F_X509_PUBKEY_SET 120 --# define X509_F_X509_REQ_CHECK_PRIVATE_KEY 144 --# define X509_F_X509_REQ_PRINT_EX 121 --# define X509_F_X509_REQ_PRINT_FP 122 --# define X509_F_X509_REQ_TO_X509 123 --# define X509_F_X509_STORE_ADD_CERT 124 --# define X509_F_X509_STORE_ADD_CRL 125 --# define X509_F_X509_STORE_ADD_LOOKUP 157 --# define X509_F_X509_STORE_CTX_GET1_ISSUER 146 --# define X509_F_X509_STORE_CTX_INIT 143 --# define X509_F_X509_STORE_CTX_NEW 142 --# define X509_F_X509_STORE_CTX_PURPOSE_INHERIT 134 --# define X509_F_X509_STORE_NEW 158 --# define X509_F_X509_TO_X509_REQ 126 --# define X509_F_X509_TRUST_ADD 133 --# define X509_F_X509_TRUST_SET 141 --# define X509_F_X509_VERIFY_CERT 127 --# define X509_F_X509_VERIFY_PARAM_NEW 159 -- --/* -- * X509 reason codes. -- */ --# define X509_R_AKID_MISMATCH 110 --# define X509_R_BAD_SELECTOR 133 --# define X509_R_BAD_X509_FILETYPE 100 --# define X509_R_BASE64_DECODE_ERROR 118 --# define X509_R_CANT_CHECK_DH_KEY 114 --# define X509_R_CERT_ALREADY_IN_HASH_TABLE 101 --# define X509_R_CRL_ALREADY_DELTA 127 --# define X509_R_CRL_VERIFY_FAILURE 131 --# define X509_R_IDP_MISMATCH 128 --# define X509_R_INVALID_ATTRIBUTES 138 --# define X509_R_INVALID_DIRECTORY 113 --# define X509_R_INVALID_FIELD_NAME 119 --# define X509_R_INVALID_TRUST 123 --# define X509_R_ISSUER_MISMATCH 129 --# define X509_R_KEY_TYPE_MISMATCH 115 --# define X509_R_KEY_VALUES_MISMATCH 116 --# define X509_R_LOADING_CERT_DIR 103 --# define X509_R_LOADING_DEFAULTS 104 --# define X509_R_METHOD_NOT_SUPPORTED 124 --# define X509_R_NAME_TOO_LONG 134 --# define X509_R_NEWER_CRL_NOT_NEWER 132 --# define X509_R_NO_CERTIFICATE_FOUND 135 --# define X509_R_NO_CERTIFICATE_OR_CRL_FOUND 136 --# define X509_R_NO_CERT_SET_FOR_US_TO_VERIFY 105 --# define X509_R_NO_CRL_FOUND 137 --# define X509_R_NO_CRL_NUMBER 130 --# define X509_R_PUBLIC_KEY_DECODE_ERROR 125 --# define X509_R_PUBLIC_KEY_ENCODE_ERROR 126 --# define X509_R_SHOULD_RETRY 106 --# define X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN 107 --# define X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY 108 --# define X509_R_UNKNOWN_KEY_TYPE 117 --# define X509_R_UNKNOWN_NID 109 --# define X509_R_UNKNOWN_PURPOSE_ID 121 --# define X509_R_UNKNOWN_TRUST_ID 120 --# define X509_R_UNSUPPORTED_ALGORITHM 111 --# define X509_R_WRONG_LOOKUP_TYPE 112 --# define X509_R_WRONG_TYPE 122 -- --#endif -diff --git a/uadk_tool/include/openssl/x509v3.h b/uadk_tool/include/openssl/x509v3.h -deleted file mode 100644 -index 90fa359..0000000 ---- a/uadk_tool/include/openssl/x509v3.h -+++ /dev/null -@@ -1,938 +0,0 @@ --/* -- * Copyright 1999-2021 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_X509V3_H --# define HEADER_X509V3_H -- --# include --# include --# include --# include -- --#ifdef __cplusplus --extern "C" { --#endif -- --/* Forward reference */ --struct v3_ext_method; --struct v3_ext_ctx; -- --/* Useful typedefs */ -- --typedef void *(*X509V3_EXT_NEW)(void); --typedef void (*X509V3_EXT_FREE) (void *); --typedef void *(*X509V3_EXT_D2I)(void *, const unsigned char **, long); --typedef int (*X509V3_EXT_I2D) (void *, unsigned char **); --typedef STACK_OF(CONF_VALUE) * -- (*X509V3_EXT_I2V) (const struct v3_ext_method *method, void *ext, -- STACK_OF(CONF_VALUE) *extlist); --typedef void *(*X509V3_EXT_V2I)(const struct v3_ext_method *method, -- struct v3_ext_ctx *ctx, -- STACK_OF(CONF_VALUE) *values); --typedef char *(*X509V3_EXT_I2S)(const struct v3_ext_method *method, -- void *ext); --typedef void *(*X509V3_EXT_S2I)(const struct v3_ext_method *method, -- struct v3_ext_ctx *ctx, const char *str); --typedef int (*X509V3_EXT_I2R) (const struct v3_ext_method *method, void *ext, -- BIO *out, int indent); --typedef void *(*X509V3_EXT_R2I)(const struct v3_ext_method *method, -- struct v3_ext_ctx *ctx, const char *str); -- --/* V3 extension structure */ -- --struct v3_ext_method { -- int ext_nid; -- int ext_flags; --/* If this is set the following four fields are ignored */ -- ASN1_ITEM_EXP *it; --/* Old style ASN1 calls */ -- X509V3_EXT_NEW ext_new; -- X509V3_EXT_FREE ext_free; -- X509V3_EXT_D2I d2i; -- X509V3_EXT_I2D i2d; --/* The following pair is used for string extensions */ -- X509V3_EXT_I2S i2s; -- X509V3_EXT_S2I s2i; --/* The following pair is used for multi-valued extensions */ -- X509V3_EXT_I2V i2v; -- X509V3_EXT_V2I v2i; --/* The following are used for raw extensions */ -- X509V3_EXT_I2R i2r; -- X509V3_EXT_R2I r2i; -- void *usr_data; /* Any extension specific data */ --}; -- --typedef struct X509V3_CONF_METHOD_st { -- char *(*get_string) (void *db, const char *section, const char *value); -- STACK_OF(CONF_VALUE) *(*get_section) (void *db, const char *section); -- void (*free_string) (void *db, char *string); -- void (*free_section) (void *db, STACK_OF(CONF_VALUE) *section); --} X509V3_CONF_METHOD; -- --/* Context specific info */ --struct v3_ext_ctx { --# define CTX_TEST 0x1 --# define X509V3_CTX_REPLACE 0x2 -- int flags; -- X509 *issuer_cert; -- X509 *subject_cert; -- X509_REQ *subject_req; -- X509_CRL *crl; -- X509V3_CONF_METHOD *db_meth; -- void *db; --/* Maybe more here */ --}; -- --typedef struct v3_ext_method X509V3_EXT_METHOD; -- --DEFINE_STACK_OF(X509V3_EXT_METHOD) -- --/* ext_flags values */ --# define X509V3_EXT_DYNAMIC 0x1 --# define X509V3_EXT_CTX_DEP 0x2 --# define X509V3_EXT_MULTILINE 0x4 -- --typedef BIT_STRING_BITNAME ENUMERATED_NAMES; -- --typedef struct BASIC_CONSTRAINTS_st { -- int ca; -- ASN1_INTEGER *pathlen; --} BASIC_CONSTRAINTS; -- --typedef struct PKEY_USAGE_PERIOD_st { -- ASN1_GENERALIZEDTIME *notBefore; -- ASN1_GENERALIZEDTIME *notAfter; --} PKEY_USAGE_PERIOD; -- --typedef struct otherName_st { -- ASN1_OBJECT *type_id; -- ASN1_TYPE *value; --} OTHERNAME; -- --typedef struct EDIPartyName_st { -- ASN1_STRING *nameAssigner; -- ASN1_STRING *partyName; --} EDIPARTYNAME; -- --typedef struct GENERAL_NAME_st { --# define GEN_OTHERNAME 0 --# define GEN_EMAIL 1 --# define GEN_DNS 2 --# define GEN_X400 3 --# define GEN_DIRNAME 4 --# define GEN_EDIPARTY 5 --# define GEN_URI 6 --# define GEN_IPADD 7 --# define GEN_RID 8 -- int type; -- union { -- char *ptr; -- OTHERNAME *otherName; /* otherName */ -- ASN1_IA5STRING *rfc822Name; -- ASN1_IA5STRING *dNSName; -- ASN1_TYPE *x400Address; -- X509_NAME *directoryName; -- EDIPARTYNAME *ediPartyName; -- ASN1_IA5STRING *uniformResourceIdentifier; -- ASN1_OCTET_STRING *iPAddress; -- ASN1_OBJECT *registeredID; -- /* Old names */ -- ASN1_OCTET_STRING *ip; /* iPAddress */ -- X509_NAME *dirn; /* dirn */ -- ASN1_IA5STRING *ia5; /* rfc822Name, dNSName, -- * uniformResourceIdentifier */ -- ASN1_OBJECT *rid; /* registeredID */ -- ASN1_TYPE *other; /* x400Address */ -- } d; --} GENERAL_NAME; -- --typedef struct ACCESS_DESCRIPTION_st { -- ASN1_OBJECT *method; -- GENERAL_NAME *location; --} ACCESS_DESCRIPTION; -- --typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS; -- --typedef STACK_OF(ASN1_OBJECT) EXTENDED_KEY_USAGE; -- --typedef STACK_OF(ASN1_INTEGER) TLS_FEATURE; -- --DEFINE_STACK_OF(GENERAL_NAME) --typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES; --DEFINE_STACK_OF(GENERAL_NAMES) -- --DEFINE_STACK_OF(ACCESS_DESCRIPTION) -- --typedef struct DIST_POINT_NAME_st { -- int type; -- union { -- GENERAL_NAMES *fullname; -- STACK_OF(X509_NAME_ENTRY) *relativename; -- } name; --/* If relativename then this contains the full distribution point name */ -- X509_NAME *dpname; --} DIST_POINT_NAME; --/* All existing reasons */ --# define CRLDP_ALL_REASONS 0x807f -- --# define CRL_REASON_NONE -1 --# define CRL_REASON_UNSPECIFIED 0 --# define CRL_REASON_KEY_COMPROMISE 1 --# define CRL_REASON_CA_COMPROMISE 2 --# define CRL_REASON_AFFILIATION_CHANGED 3 --# define CRL_REASON_SUPERSEDED 4 --# define CRL_REASON_CESSATION_OF_OPERATION 5 --# define CRL_REASON_CERTIFICATE_HOLD 6 --# define CRL_REASON_REMOVE_FROM_CRL 8 --# define CRL_REASON_PRIVILEGE_WITHDRAWN 9 --# define CRL_REASON_AA_COMPROMISE 10 -- --struct DIST_POINT_st { -- DIST_POINT_NAME *distpoint; -- ASN1_BIT_STRING *reasons; -- GENERAL_NAMES *CRLissuer; -- int dp_reasons; --}; -- --typedef STACK_OF(DIST_POINT) CRL_DIST_POINTS; -- --DEFINE_STACK_OF(DIST_POINT) -- --struct AUTHORITY_KEYID_st { -- ASN1_OCTET_STRING *keyid; -- GENERAL_NAMES *issuer; -- ASN1_INTEGER *serial; --}; -- --/* Strong extranet structures */ -- --typedef struct SXNET_ID_st { -- ASN1_INTEGER *zone; -- ASN1_OCTET_STRING *user; --} SXNETID; -- --DEFINE_STACK_OF(SXNETID) -- --typedef struct SXNET_st { -- ASN1_INTEGER *version; -- STACK_OF(SXNETID) *ids; --} SXNET; -- --typedef struct NOTICEREF_st { -- ASN1_STRING *organization; -- STACK_OF(ASN1_INTEGER) *noticenos; --} NOTICEREF; -- --typedef struct USERNOTICE_st { -- NOTICEREF *noticeref; -- ASN1_STRING *exptext; --} USERNOTICE; -- --typedef struct POLICYQUALINFO_st { -- ASN1_OBJECT *pqualid; -- union { -- ASN1_IA5STRING *cpsuri; -- USERNOTICE *usernotice; -- ASN1_TYPE *other; -- } d; --} POLICYQUALINFO; -- --DEFINE_STACK_OF(POLICYQUALINFO) -- --typedef struct POLICYINFO_st { -- ASN1_OBJECT *policyid; -- STACK_OF(POLICYQUALINFO) *qualifiers; --} POLICYINFO; -- --typedef STACK_OF(POLICYINFO) CERTIFICATEPOLICIES; -- --DEFINE_STACK_OF(POLICYINFO) -- --typedef struct POLICY_MAPPING_st { -- ASN1_OBJECT *issuerDomainPolicy; -- ASN1_OBJECT *subjectDomainPolicy; --} POLICY_MAPPING; -- --DEFINE_STACK_OF(POLICY_MAPPING) -- --typedef STACK_OF(POLICY_MAPPING) POLICY_MAPPINGS; -- --typedef struct GENERAL_SUBTREE_st { -- GENERAL_NAME *base; -- ASN1_INTEGER *minimum; -- ASN1_INTEGER *maximum; --} GENERAL_SUBTREE; -- --DEFINE_STACK_OF(GENERAL_SUBTREE) -- --struct NAME_CONSTRAINTS_st { -- STACK_OF(GENERAL_SUBTREE) *permittedSubtrees; -- STACK_OF(GENERAL_SUBTREE) *excludedSubtrees; --}; -- --typedef struct POLICY_CONSTRAINTS_st { -- ASN1_INTEGER *requireExplicitPolicy; -- ASN1_INTEGER *inhibitPolicyMapping; --} POLICY_CONSTRAINTS; -- --/* Proxy certificate structures, see RFC 3820 */ --typedef struct PROXY_POLICY_st { -- ASN1_OBJECT *policyLanguage; -- ASN1_OCTET_STRING *policy; --} PROXY_POLICY; -- --typedef struct PROXY_CERT_INFO_EXTENSION_st { -- ASN1_INTEGER *pcPathLengthConstraint; -- PROXY_POLICY *proxyPolicy; --} PROXY_CERT_INFO_EXTENSION; -- --DECLARE_ASN1_FUNCTIONS(PROXY_POLICY) --DECLARE_ASN1_FUNCTIONS(PROXY_CERT_INFO_EXTENSION) -- --struct ISSUING_DIST_POINT_st { -- DIST_POINT_NAME *distpoint; -- int onlyuser; -- int onlyCA; -- ASN1_BIT_STRING *onlysomereasons; -- int indirectCRL; -- int onlyattr; --}; -- --/* Values in idp_flags field */ --/* IDP present */ --# define IDP_PRESENT 0x1 --/* IDP values inconsistent */ --# define IDP_INVALID 0x2 --/* onlyuser true */ --# define IDP_ONLYUSER 0x4 --/* onlyCA true */ --# define IDP_ONLYCA 0x8 --/* onlyattr true */ --# define IDP_ONLYATTR 0x10 --/* indirectCRL true */ --# define IDP_INDIRECT 0x20 --/* onlysomereasons present */ --# define IDP_REASONS 0x40 -- --# define X509V3_conf_err(val) ERR_add_error_data(6, \ -- "section:", (val)->section, \ -- ",name:", (val)->name, ",value:", (val)->value) -- --# define X509V3_set_ctx_test(ctx) \ -- X509V3_set_ctx(ctx, NULL, NULL, NULL, NULL, CTX_TEST) --# define X509V3_set_ctx_nodb(ctx) (ctx)->db = NULL; -- --# define EXT_BITSTRING(nid, table) { nid, 0, ASN1_ITEM_ref(ASN1_BIT_STRING), \ -- 0,0,0,0, \ -- 0,0, \ -- (X509V3_EXT_I2V)i2v_ASN1_BIT_STRING, \ -- (X509V3_EXT_V2I)v2i_ASN1_BIT_STRING, \ -- NULL, NULL, \ -- table} -- --# define EXT_IA5STRING(nid) { nid, 0, ASN1_ITEM_ref(ASN1_IA5STRING), \ -- 0,0,0,0, \ -- (X509V3_EXT_I2S)i2s_ASN1_IA5STRING, \ -- (X509V3_EXT_S2I)s2i_ASN1_IA5STRING, \ -- 0,0,0,0, \ -- NULL} -- --# define EXT_END { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} -- --/* X509_PURPOSE stuff */ -- --# define EXFLAG_BCONS 0x1 --# define EXFLAG_KUSAGE 0x2 --# define EXFLAG_XKUSAGE 0x4 --# define EXFLAG_NSCERT 0x8 -- --# define EXFLAG_CA 0x10 --/* Really self issued not necessarily self signed */ --# define EXFLAG_SI 0x20 --# define EXFLAG_V1 0x40 --# define EXFLAG_INVALID 0x80 --/* EXFLAG_SET is set to indicate that some values have been precomputed */ --# define EXFLAG_SET 0x100 --# define EXFLAG_CRITICAL 0x200 --# define EXFLAG_PROXY 0x400 -- --# define EXFLAG_INVALID_POLICY 0x800 --# define EXFLAG_FRESHEST 0x1000 --# define EXFLAG_SS 0x2000 /* cert is apparently self-signed */ -- --# define EXFLAG_NO_FINGERPRINT 0x100000 -- --# define KU_DIGITAL_SIGNATURE 0x0080 --# define KU_NON_REPUDIATION 0x0040 --# define KU_KEY_ENCIPHERMENT 0x0020 --# define KU_DATA_ENCIPHERMENT 0x0010 --# define KU_KEY_AGREEMENT 0x0008 --# define KU_KEY_CERT_SIGN 0x0004 --# define KU_CRL_SIGN 0x0002 --# define KU_ENCIPHER_ONLY 0x0001 --# define KU_DECIPHER_ONLY 0x8000 -- --# define NS_SSL_CLIENT 0x80 --# define NS_SSL_SERVER 0x40 --# define NS_SMIME 0x20 --# define NS_OBJSIGN 0x10 --# define NS_SSL_CA 0x04 --# define NS_SMIME_CA 0x02 --# define NS_OBJSIGN_CA 0x01 --# define NS_ANY_CA (NS_SSL_CA|NS_SMIME_CA|NS_OBJSIGN_CA) -- --# define XKU_SSL_SERVER 0x1 --# define XKU_SSL_CLIENT 0x2 --# define XKU_SMIME 0x4 --# define XKU_CODE_SIGN 0x8 --# define XKU_SGC 0x10 --# define XKU_OCSP_SIGN 0x20 --# define XKU_TIMESTAMP 0x40 --# define XKU_DVCS 0x80 --# define XKU_ANYEKU 0x100 -- --# define X509_PURPOSE_DYNAMIC 0x1 --# define X509_PURPOSE_DYNAMIC_NAME 0x2 -- --typedef struct x509_purpose_st { -- int purpose; -- int trust; /* Default trust ID */ -- int flags; -- int (*check_purpose) (const struct x509_purpose_st *, const X509 *, int); -- char *name; -- char *sname; -- void *usr_data; --} X509_PURPOSE; -- --# define X509_PURPOSE_SSL_CLIENT 1 --# define X509_PURPOSE_SSL_SERVER 2 --# define X509_PURPOSE_NS_SSL_SERVER 3 --# define X509_PURPOSE_SMIME_SIGN 4 --# define X509_PURPOSE_SMIME_ENCRYPT 5 --# define X509_PURPOSE_CRL_SIGN 6 --# define X509_PURPOSE_ANY 7 --# define X509_PURPOSE_OCSP_HELPER 8 --# define X509_PURPOSE_TIMESTAMP_SIGN 9 -- --# define X509_PURPOSE_MIN 1 --# define X509_PURPOSE_MAX 9 -- --/* Flags for X509V3_EXT_print() */ -- --# define X509V3_EXT_UNKNOWN_MASK (0xfL << 16) --/* Return error for unknown extensions */ --# define X509V3_EXT_DEFAULT 0 --/* Print error for unknown extensions */ --# define X509V3_EXT_ERROR_UNKNOWN (1L << 16) --/* ASN1 parse unknown extensions */ --# define X509V3_EXT_PARSE_UNKNOWN (2L << 16) --/* BIO_dump unknown extensions */ --# define X509V3_EXT_DUMP_UNKNOWN (3L << 16) -- --/* Flags for X509V3_add1_i2d */ -- --# define X509V3_ADD_OP_MASK 0xfL --# define X509V3_ADD_DEFAULT 0L --# define X509V3_ADD_APPEND 1L --# define X509V3_ADD_REPLACE 2L --# define X509V3_ADD_REPLACE_EXISTING 3L --# define X509V3_ADD_KEEP_EXISTING 4L --# define X509V3_ADD_DELETE 5L --# define X509V3_ADD_SILENT 0x10 -- --DEFINE_STACK_OF(X509_PURPOSE) -- --DECLARE_ASN1_FUNCTIONS(BASIC_CONSTRAINTS) -- --DECLARE_ASN1_FUNCTIONS(SXNET) --DECLARE_ASN1_FUNCTIONS(SXNETID) -- --int SXNET_add_id_asc(SXNET **psx, const char *zone, const char *user, int userlen); --int SXNET_add_id_ulong(SXNET **psx, unsigned long lzone, const char *user, -- int userlen); --int SXNET_add_id_INTEGER(SXNET **psx, ASN1_INTEGER *izone, const char *user, -- int userlen); -- --ASN1_OCTET_STRING *SXNET_get_id_asc(SXNET *sx, const char *zone); --ASN1_OCTET_STRING *SXNET_get_id_ulong(SXNET *sx, unsigned long lzone); --ASN1_OCTET_STRING *SXNET_get_id_INTEGER(SXNET *sx, ASN1_INTEGER *zone); -- --DECLARE_ASN1_FUNCTIONS(AUTHORITY_KEYID) -- --DECLARE_ASN1_FUNCTIONS(PKEY_USAGE_PERIOD) -- --DECLARE_ASN1_FUNCTIONS(GENERAL_NAME) --GENERAL_NAME *GENERAL_NAME_dup(GENERAL_NAME *a); --int GENERAL_NAME_cmp(GENERAL_NAME *a, GENERAL_NAME *b); -- --ASN1_BIT_STRING *v2i_ASN1_BIT_STRING(X509V3_EXT_METHOD *method, -- X509V3_CTX *ctx, -- STACK_OF(CONF_VALUE) *nval); --STACK_OF(CONF_VALUE) *i2v_ASN1_BIT_STRING(X509V3_EXT_METHOD *method, -- ASN1_BIT_STRING *bits, -- STACK_OF(CONF_VALUE) *extlist); --char *i2s_ASN1_IA5STRING(X509V3_EXT_METHOD *method, ASN1_IA5STRING *ia5); --ASN1_IA5STRING *s2i_ASN1_IA5STRING(X509V3_EXT_METHOD *method, -- X509V3_CTX *ctx, const char *str); -- --STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method, -- GENERAL_NAME *gen, -- STACK_OF(CONF_VALUE) *ret); --int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen); -- --DECLARE_ASN1_FUNCTIONS(GENERAL_NAMES) -- --STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method, -- GENERAL_NAMES *gen, -- STACK_OF(CONF_VALUE) *extlist); --GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method, -- X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); -- --DECLARE_ASN1_FUNCTIONS(OTHERNAME) --DECLARE_ASN1_FUNCTIONS(EDIPARTYNAME) --int OTHERNAME_cmp(OTHERNAME *a, OTHERNAME *b); --void GENERAL_NAME_set0_value(GENERAL_NAME *a, int type, void *value); --void *GENERAL_NAME_get0_value(const GENERAL_NAME *a, int *ptype); --int GENERAL_NAME_set0_othername(GENERAL_NAME *gen, -- ASN1_OBJECT *oid, ASN1_TYPE *value); --int GENERAL_NAME_get0_otherName(const GENERAL_NAME *gen, -- ASN1_OBJECT **poid, ASN1_TYPE **pvalue); -- --char *i2s_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, -- const ASN1_OCTET_STRING *ia5); --ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, -- X509V3_CTX *ctx, const char *str); -- --DECLARE_ASN1_FUNCTIONS(EXTENDED_KEY_USAGE) --int i2a_ACCESS_DESCRIPTION(BIO *bp, const ACCESS_DESCRIPTION *a); -- --DECLARE_ASN1_ALLOC_FUNCTIONS(TLS_FEATURE) -- --DECLARE_ASN1_FUNCTIONS(CERTIFICATEPOLICIES) --DECLARE_ASN1_FUNCTIONS(POLICYINFO) --DECLARE_ASN1_FUNCTIONS(POLICYQUALINFO) --DECLARE_ASN1_FUNCTIONS(USERNOTICE) --DECLARE_ASN1_FUNCTIONS(NOTICEREF) -- --DECLARE_ASN1_FUNCTIONS(CRL_DIST_POINTS) --DECLARE_ASN1_FUNCTIONS(DIST_POINT) --DECLARE_ASN1_FUNCTIONS(DIST_POINT_NAME) --DECLARE_ASN1_FUNCTIONS(ISSUING_DIST_POINT) -- --int DIST_POINT_set_dpname(DIST_POINT_NAME *dpn, X509_NAME *iname); -- --int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc); --int NAME_CONSTRAINTS_check_CN(X509 *x, NAME_CONSTRAINTS *nc); -- --DECLARE_ASN1_FUNCTIONS(ACCESS_DESCRIPTION) --DECLARE_ASN1_FUNCTIONS(AUTHORITY_INFO_ACCESS) -- --DECLARE_ASN1_ITEM(POLICY_MAPPING) --DECLARE_ASN1_ALLOC_FUNCTIONS(POLICY_MAPPING) --DECLARE_ASN1_ITEM(POLICY_MAPPINGS) -- --DECLARE_ASN1_ITEM(GENERAL_SUBTREE) --DECLARE_ASN1_ALLOC_FUNCTIONS(GENERAL_SUBTREE) -- --DECLARE_ASN1_ITEM(NAME_CONSTRAINTS) --DECLARE_ASN1_ALLOC_FUNCTIONS(NAME_CONSTRAINTS) -- --DECLARE_ASN1_ALLOC_FUNCTIONS(POLICY_CONSTRAINTS) --DECLARE_ASN1_ITEM(POLICY_CONSTRAINTS) -- --GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, -- const X509V3_EXT_METHOD *method, -- X509V3_CTX *ctx, int gen_type, -- const char *value, int is_nc); -- --# ifdef HEADER_CONF_H --GENERAL_NAME *v2i_GENERAL_NAME(const X509V3_EXT_METHOD *method, -- X509V3_CTX *ctx, CONF_VALUE *cnf); --GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out, -- const X509V3_EXT_METHOD *method, -- X509V3_CTX *ctx, CONF_VALUE *cnf, -- int is_nc); --void X509V3_conf_free(CONF_VALUE *val); -- --X509_EXTENSION *X509V3_EXT_nconf_nid(CONF *conf, X509V3_CTX *ctx, int ext_nid, -- const char *value); --X509_EXTENSION *X509V3_EXT_nconf(CONF *conf, X509V3_CTX *ctx, const char *name, -- const char *value); --int X509V3_EXT_add_nconf_sk(CONF *conf, X509V3_CTX *ctx, const char *section, -- STACK_OF(X509_EXTENSION) **sk); --int X509V3_EXT_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section, -- X509 *cert); --int X509V3_EXT_REQ_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section, -- X509_REQ *req); --int X509V3_EXT_CRL_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section, -- X509_CRL *crl); -- --X509_EXTENSION *X509V3_EXT_conf_nid(LHASH_OF(CONF_VALUE) *conf, -- X509V3_CTX *ctx, int ext_nid, -- const char *value); --X509_EXTENSION *X509V3_EXT_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, -- const char *name, const char *value); --int X509V3_EXT_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, -- const char *section, X509 *cert); --int X509V3_EXT_REQ_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, -- const char *section, X509_REQ *req); --int X509V3_EXT_CRL_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, -- const char *section, X509_CRL *crl); -- --int X509V3_add_value_bool_nf(const char *name, int asn1_bool, -- STACK_OF(CONF_VALUE) **extlist); --int X509V3_get_value_bool(const CONF_VALUE *value, int *asn1_bool); --int X509V3_get_value_int(const CONF_VALUE *value, ASN1_INTEGER **aint); --void X509V3_set_nconf(X509V3_CTX *ctx, CONF *conf); --void X509V3_set_conf_lhash(X509V3_CTX *ctx, LHASH_OF(CONF_VALUE) *lhash); --# endif -- --char *X509V3_get_string(X509V3_CTX *ctx, const char *name, const char *section); --STACK_OF(CONF_VALUE) *X509V3_get_section(X509V3_CTX *ctx, const char *section); --void X509V3_string_free(X509V3_CTX *ctx, char *str); --void X509V3_section_free(X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *section); --void X509V3_set_ctx(X509V3_CTX *ctx, X509 *issuer, X509 *subject, -- X509_REQ *req, X509_CRL *crl, int flags); -- --int X509V3_add_value(const char *name, const char *value, -- STACK_OF(CONF_VALUE) **extlist); --int X509V3_add_value_uchar(const char *name, const unsigned char *value, -- STACK_OF(CONF_VALUE) **extlist); --int X509V3_add_value_bool(const char *name, int asn1_bool, -- STACK_OF(CONF_VALUE) **extlist); --int X509V3_add_value_int(const char *name, const ASN1_INTEGER *aint, -- STACK_OF(CONF_VALUE) **extlist); --char *i2s_ASN1_INTEGER(X509V3_EXT_METHOD *meth, const ASN1_INTEGER *aint); --ASN1_INTEGER *s2i_ASN1_INTEGER(X509V3_EXT_METHOD *meth, const char *value); --char *i2s_ASN1_ENUMERATED(X509V3_EXT_METHOD *meth, const ASN1_ENUMERATED *aint); --char *i2s_ASN1_ENUMERATED_TABLE(X509V3_EXT_METHOD *meth, -- const ASN1_ENUMERATED *aint); --int X509V3_EXT_add(X509V3_EXT_METHOD *ext); --int X509V3_EXT_add_list(X509V3_EXT_METHOD *extlist); --int X509V3_EXT_add_alias(int nid_to, int nid_from); --void X509V3_EXT_cleanup(void); -- --const X509V3_EXT_METHOD *X509V3_EXT_get(X509_EXTENSION *ext); --const X509V3_EXT_METHOD *X509V3_EXT_get_nid(int nid); --int X509V3_add_standard_extensions(void); --STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line); --void *X509V3_EXT_d2i(X509_EXTENSION *ext); --void *X509V3_get_d2i(const STACK_OF(X509_EXTENSION) *x, int nid, int *crit, -- int *idx); -- --X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc); --int X509V3_add1_i2d(STACK_OF(X509_EXTENSION) **x, int nid, void *value, -- int crit, unsigned long flags); -- --#if OPENSSL_API_COMPAT < 0x10100000L --/* The new declarations are in crypto.h, but the old ones were here. */ --# define hex_to_string OPENSSL_buf2hexstr --# define string_to_hex OPENSSL_hexstr2buf --#endif -- --void X509V3_EXT_val_prn(BIO *out, STACK_OF(CONF_VALUE) *val, int indent, -- int ml); --int X509V3_EXT_print(BIO *out, X509_EXTENSION *ext, unsigned long flag, -- int indent); --#ifndef OPENSSL_NO_STDIO --int X509V3_EXT_print_fp(FILE *out, X509_EXTENSION *ext, int flag, int indent); --#endif --int X509V3_extensions_print(BIO *out, const char *title, -- const STACK_OF(X509_EXTENSION) *exts, -- unsigned long flag, int indent); -- --int X509_check_ca(X509 *x); --int X509_check_purpose(X509 *x, int id, int ca); --int X509_supported_extension(X509_EXTENSION *ex); --int X509_PURPOSE_set(int *p, int purpose); --int X509_check_issued(X509 *issuer, X509 *subject); --int X509_check_akid(X509 *issuer, AUTHORITY_KEYID *akid); --void X509_set_proxy_flag(X509 *x); --void X509_set_proxy_pathlen(X509 *x, long l); --long X509_get_proxy_pathlen(X509 *x); -- --uint32_t X509_get_extension_flags(X509 *x); --uint32_t X509_get_key_usage(X509 *x); --uint32_t X509_get_extended_key_usage(X509 *x); --const ASN1_OCTET_STRING *X509_get0_subject_key_id(X509 *x); --const ASN1_OCTET_STRING *X509_get0_authority_key_id(X509 *x); --const GENERAL_NAMES *X509_get0_authority_issuer(X509 *x); --const ASN1_INTEGER *X509_get0_authority_serial(X509 *x); -- --int X509_PURPOSE_get_count(void); --X509_PURPOSE *X509_PURPOSE_get0(int idx); --int X509_PURPOSE_get_by_sname(const char *sname); --int X509_PURPOSE_get_by_id(int id); --int X509_PURPOSE_add(int id, int trust, int flags, -- int (*ck) (const X509_PURPOSE *, const X509 *, int), -- const char *name, const char *sname, void *arg); --char *X509_PURPOSE_get0_name(const X509_PURPOSE *xp); --char *X509_PURPOSE_get0_sname(const X509_PURPOSE *xp); --int X509_PURPOSE_get_trust(const X509_PURPOSE *xp); --void X509_PURPOSE_cleanup(void); --int X509_PURPOSE_get_id(const X509_PURPOSE *); -- --STACK_OF(OPENSSL_STRING) *X509_get1_email(X509 *x); --STACK_OF(OPENSSL_STRING) *X509_REQ_get1_email(X509_REQ *x); --void X509_email_free(STACK_OF(OPENSSL_STRING) *sk); --STACK_OF(OPENSSL_STRING) *X509_get1_ocsp(X509 *x); --/* Flags for X509_check_* functions */ -- --/* -- * Always check subject name for host match even if subject alt names present -- */ --# define X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT 0x1 --/* Disable wildcard matching for dnsName fields and common name. */ --# define X509_CHECK_FLAG_NO_WILDCARDS 0x2 --/* Wildcards must not match a partial label. */ --# define X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS 0x4 --/* Allow (non-partial) wildcards to match multiple labels. */ --# define X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS 0x8 --/* Constraint verifier subdomain patterns to match a single labels. */ --# define X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS 0x10 --/* Never check the subject CN */ --# define X509_CHECK_FLAG_NEVER_CHECK_SUBJECT 0x20 --/* -- * Match reference identifiers starting with "." to any sub-domain. -- * This is a non-public flag, turned on implicitly when the subject -- * reference identity is a DNS name. -- */ --# define _X509_CHECK_FLAG_DOT_SUBDOMAINS 0x8000 -- --int X509_check_host(X509 *x, const char *chk, size_t chklen, -- unsigned int flags, char **peername); --int X509_check_email(X509 *x, const char *chk, size_t chklen, -- unsigned int flags); --int X509_check_ip(X509 *x, const unsigned char *chk, size_t chklen, -- unsigned int flags); --int X509_check_ip_asc(X509 *x, const char *ipasc, unsigned int flags); -- --ASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc); --ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc); --int X509V3_NAME_from_section(X509_NAME *nm, STACK_OF(CONF_VALUE) *dn_sk, -- unsigned long chtype); -- --void X509_POLICY_NODE_print(BIO *out, X509_POLICY_NODE *node, int indent); --DEFINE_STACK_OF(X509_POLICY_NODE) -- --#ifndef OPENSSL_NO_RFC3779 --typedef struct ASRange_st { -- ASN1_INTEGER *min, *max; --} ASRange; -- --# define ASIdOrRange_id 0 --# define ASIdOrRange_range 1 -- --typedef struct ASIdOrRange_st { -- int type; -- union { -- ASN1_INTEGER *id; -- ASRange *range; -- } u; --} ASIdOrRange; -- --typedef STACK_OF(ASIdOrRange) ASIdOrRanges; --DEFINE_STACK_OF(ASIdOrRange) -- --# define ASIdentifierChoice_inherit 0 --# define ASIdentifierChoice_asIdsOrRanges 1 -- --typedef struct ASIdentifierChoice_st { -- int type; -- union { -- ASN1_NULL *inherit; -- ASIdOrRanges *asIdsOrRanges; -- } u; --} ASIdentifierChoice; -- --typedef struct ASIdentifiers_st { -- ASIdentifierChoice *asnum, *rdi; --} ASIdentifiers; -- --DECLARE_ASN1_FUNCTIONS(ASRange) --DECLARE_ASN1_FUNCTIONS(ASIdOrRange) --DECLARE_ASN1_FUNCTIONS(ASIdentifierChoice) --DECLARE_ASN1_FUNCTIONS(ASIdentifiers) -- --typedef struct IPAddressRange_st { -- ASN1_BIT_STRING *min, *max; --} IPAddressRange; -- --# define IPAddressOrRange_addressPrefix 0 --# define IPAddressOrRange_addressRange 1 -- --typedef struct IPAddressOrRange_st { -- int type; -- union { -- ASN1_BIT_STRING *addressPrefix; -- IPAddressRange *addressRange; -- } u; --} IPAddressOrRange; -- --typedef STACK_OF(IPAddressOrRange) IPAddressOrRanges; --DEFINE_STACK_OF(IPAddressOrRange) -- --# define IPAddressChoice_inherit 0 --# define IPAddressChoice_addressesOrRanges 1 -- --typedef struct IPAddressChoice_st { -- int type; -- union { -- ASN1_NULL *inherit; -- IPAddressOrRanges *addressesOrRanges; -- } u; --} IPAddressChoice; -- --typedef struct IPAddressFamily_st { -- ASN1_OCTET_STRING *addressFamily; -- IPAddressChoice *ipAddressChoice; --} IPAddressFamily; -- --typedef STACK_OF(IPAddressFamily) IPAddrBlocks; --DEFINE_STACK_OF(IPAddressFamily) -- --DECLARE_ASN1_FUNCTIONS(IPAddressRange) --DECLARE_ASN1_FUNCTIONS(IPAddressOrRange) --DECLARE_ASN1_FUNCTIONS(IPAddressChoice) --DECLARE_ASN1_FUNCTIONS(IPAddressFamily) -- --/* -- * API tag for elements of the ASIdentifer SEQUENCE. -- */ --# define V3_ASID_ASNUM 0 --# define V3_ASID_RDI 1 -- --/* -- * AFI values, assigned by IANA. It'd be nice to make the AFI -- * handling code totally generic, but there are too many little things -- * that would need to be defined for other address families for it to -- * be worth the trouble. -- */ --# define IANA_AFI_IPV4 1 --# define IANA_AFI_IPV6 2 -- --/* -- * Utilities to construct and extract values from RFC3779 extensions, -- * since some of the encodings (particularly for IP address prefixes -- * and ranges) are a bit tedious to work with directly. -- */ --int X509v3_asid_add_inherit(ASIdentifiers *asid, int which); --int X509v3_asid_add_id_or_range(ASIdentifiers *asid, int which, -- ASN1_INTEGER *min, ASN1_INTEGER *max); --int X509v3_addr_add_inherit(IPAddrBlocks *addr, -- const unsigned afi, const unsigned *safi); --int X509v3_addr_add_prefix(IPAddrBlocks *addr, -- const unsigned afi, const unsigned *safi, -- unsigned char *a, const int prefixlen); --int X509v3_addr_add_range(IPAddrBlocks *addr, -- const unsigned afi, const unsigned *safi, -- unsigned char *min, unsigned char *max); --unsigned X509v3_addr_get_afi(const IPAddressFamily *f); --int X509v3_addr_get_range(IPAddressOrRange *aor, const unsigned afi, -- unsigned char *min, unsigned char *max, -- const int length); -- --/* -- * Canonical forms. -- */ --int X509v3_asid_is_canonical(ASIdentifiers *asid); --int X509v3_addr_is_canonical(IPAddrBlocks *addr); --int X509v3_asid_canonize(ASIdentifiers *asid); --int X509v3_addr_canonize(IPAddrBlocks *addr); -- --/* -- * Tests for inheritance and containment. -- */ --int X509v3_asid_inherits(ASIdentifiers *asid); --int X509v3_addr_inherits(IPAddrBlocks *addr); --int X509v3_asid_subset(ASIdentifiers *a, ASIdentifiers *b); --int X509v3_addr_subset(IPAddrBlocks *a, IPAddrBlocks *b); -- --/* -- * Check whether RFC 3779 extensions nest properly in chains. -- */ --int X509v3_asid_validate_path(X509_STORE_CTX *); --int X509v3_addr_validate_path(X509_STORE_CTX *); --int X509v3_asid_validate_resource_set(STACK_OF(X509) *chain, -- ASIdentifiers *ext, -- int allow_inheritance); --int X509v3_addr_validate_resource_set(STACK_OF(X509) *chain, -- IPAddrBlocks *ext, int allow_inheritance); -- --#endif /* OPENSSL_NO_RFC3779 */ -- --DEFINE_STACK_OF(ASN1_STRING) -- --/* -- * Admission Syntax -- */ --typedef struct NamingAuthority_st NAMING_AUTHORITY; --typedef struct ProfessionInfo_st PROFESSION_INFO; --typedef struct Admissions_st ADMISSIONS; --typedef struct AdmissionSyntax_st ADMISSION_SYNTAX; --DECLARE_ASN1_FUNCTIONS(NAMING_AUTHORITY) --DECLARE_ASN1_FUNCTIONS(PROFESSION_INFO) --DECLARE_ASN1_FUNCTIONS(ADMISSIONS) --DECLARE_ASN1_FUNCTIONS(ADMISSION_SYNTAX) --DEFINE_STACK_OF(ADMISSIONS) --DEFINE_STACK_OF(PROFESSION_INFO) --typedef STACK_OF(PROFESSION_INFO) PROFESSION_INFOS; -- --const ASN1_OBJECT *NAMING_AUTHORITY_get0_authorityId( -- const NAMING_AUTHORITY *n); --const ASN1_IA5STRING *NAMING_AUTHORITY_get0_authorityURL( -- const NAMING_AUTHORITY *n); --const ASN1_STRING *NAMING_AUTHORITY_get0_authorityText( -- const NAMING_AUTHORITY *n); --void NAMING_AUTHORITY_set0_authorityId(NAMING_AUTHORITY *n, -- ASN1_OBJECT* namingAuthorityId); --void NAMING_AUTHORITY_set0_authorityURL(NAMING_AUTHORITY *n, -- ASN1_IA5STRING* namingAuthorityUrl); --void NAMING_AUTHORITY_set0_authorityText(NAMING_AUTHORITY *n, -- ASN1_STRING* namingAuthorityText); -- --const GENERAL_NAME *ADMISSION_SYNTAX_get0_admissionAuthority( -- const ADMISSION_SYNTAX *as); --void ADMISSION_SYNTAX_set0_admissionAuthority( -- ADMISSION_SYNTAX *as, GENERAL_NAME *aa); --const STACK_OF(ADMISSIONS) *ADMISSION_SYNTAX_get0_contentsOfAdmissions( -- const ADMISSION_SYNTAX *as); --void ADMISSION_SYNTAX_set0_contentsOfAdmissions( -- ADMISSION_SYNTAX *as, STACK_OF(ADMISSIONS) *a); --const GENERAL_NAME *ADMISSIONS_get0_admissionAuthority(const ADMISSIONS *a); --void ADMISSIONS_set0_admissionAuthority(ADMISSIONS *a, GENERAL_NAME *aa); --const NAMING_AUTHORITY *ADMISSIONS_get0_namingAuthority(const ADMISSIONS *a); --void ADMISSIONS_set0_namingAuthority(ADMISSIONS *a, NAMING_AUTHORITY *na); --const PROFESSION_INFOS *ADMISSIONS_get0_professionInfos(const ADMISSIONS *a); --void ADMISSIONS_set0_professionInfos(ADMISSIONS *a, PROFESSION_INFOS *pi); --const ASN1_OCTET_STRING *PROFESSION_INFO_get0_addProfessionInfo( -- const PROFESSION_INFO *pi); --void PROFESSION_INFO_set0_addProfessionInfo( -- PROFESSION_INFO *pi, ASN1_OCTET_STRING *aos); --const NAMING_AUTHORITY *PROFESSION_INFO_get0_namingAuthority( -- const PROFESSION_INFO *pi); --void PROFESSION_INFO_set0_namingAuthority( -- PROFESSION_INFO *pi, NAMING_AUTHORITY *na); --const STACK_OF(ASN1_STRING) *PROFESSION_INFO_get0_professionItems( -- const PROFESSION_INFO *pi); --void PROFESSION_INFO_set0_professionItems( -- PROFESSION_INFO *pi, STACK_OF(ASN1_STRING) *as); --const STACK_OF(ASN1_OBJECT) *PROFESSION_INFO_get0_professionOIDs( -- const PROFESSION_INFO *pi); --void PROFESSION_INFO_set0_professionOIDs( -- PROFESSION_INFO *pi, STACK_OF(ASN1_OBJECT) *po); --const ASN1_PRINTABLESTRING *PROFESSION_INFO_get0_registrationNumber( -- const PROFESSION_INFO *pi); --void PROFESSION_INFO_set0_registrationNumber( -- PROFESSION_INFO *pi, ASN1_PRINTABLESTRING *rn); -- --# ifdef __cplusplus --} --# endif --#endif -diff --git a/uadk_tool/include/openssl/x509v3err.h b/uadk_tool/include/openssl/x509v3err.h -deleted file mode 100644 -index 3b9f713..0000000 ---- a/uadk_tool/include/openssl/x509v3err.h -+++ /dev/null -@@ -1,164 +0,0 @@ --/* -- * Generated by util/mkerr.pl DO NOT EDIT -- * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. -- * -- * Licensed under the OpenSSL license (the "License"). You may not use -- * this file except in compliance with the License. You can obtain a copy -- * in the file LICENSE in the source distribution or at -- * https://www.openssl.org/source/license.html -- */ -- --#ifndef HEADER_X509V3ERR_H --# define HEADER_X509V3ERR_H -- --# ifndef HEADER_SYMHACKS_H --# include --# endif -- --# ifdef __cplusplus --extern "C" --# endif --int ERR_load_X509V3_strings(void); -- --/* -- * X509V3 function codes. -- */ --# define X509V3_F_A2I_GENERAL_NAME 164 --# define X509V3_F_ADDR_VALIDATE_PATH_INTERNAL 166 --# define X509V3_F_ASIDENTIFIERCHOICE_CANONIZE 161 --# define X509V3_F_ASIDENTIFIERCHOICE_IS_CANONICAL 162 --# define X509V3_F_BIGNUM_TO_STRING 167 --# define X509V3_F_COPY_EMAIL 122 --# define X509V3_F_COPY_ISSUER 123 --# define X509V3_F_DO_DIRNAME 144 --# define X509V3_F_DO_EXT_I2D 135 --# define X509V3_F_DO_EXT_NCONF 151 --# define X509V3_F_GNAMES_FROM_SECTNAME 156 --# define X509V3_F_I2S_ASN1_ENUMERATED 121 --# define X509V3_F_I2S_ASN1_IA5STRING 149 --# define X509V3_F_I2S_ASN1_INTEGER 120 --# define X509V3_F_I2V_AUTHORITY_INFO_ACCESS 138 --# define X509V3_F_I2V_AUTHORITY_KEYID 173 --# define X509V3_F_LEVEL_ADD_NODE 168 --# define X509V3_F_NOTICE_SECTION 132 --# define X509V3_F_NREF_NOS 133 --# define X509V3_F_POLICY_CACHE_CREATE 169 --# define X509V3_F_POLICY_CACHE_NEW 170 --# define X509V3_F_POLICY_DATA_NEW 171 --# define X509V3_F_POLICY_SECTION 131 --# define X509V3_F_PROCESS_PCI_VALUE 150 --# define X509V3_F_R2I_CERTPOL 130 --# define X509V3_F_R2I_PCI 155 --# define X509V3_F_S2I_ASN1_IA5STRING 100 --# define X509V3_F_S2I_ASN1_INTEGER 108 --# define X509V3_F_S2I_ASN1_OCTET_STRING 112 --# define X509V3_F_S2I_SKEY_ID 115 --# define X509V3_F_SET_DIST_POINT_NAME 158 --# define X509V3_F_SXNET_ADD_ID_ASC 125 --# define X509V3_F_SXNET_ADD_ID_INTEGER 126 --# define X509V3_F_SXNET_ADD_ID_ULONG 127 --# define X509V3_F_SXNET_GET_ID_ASC 128 --# define X509V3_F_SXNET_GET_ID_ULONG 129 --# define X509V3_F_TREE_INIT 172 --# define X509V3_F_V2I_ASIDENTIFIERS 163 --# define X509V3_F_V2I_ASN1_BIT_STRING 101 --# define X509V3_F_V2I_AUTHORITY_INFO_ACCESS 139 --# define X509V3_F_V2I_AUTHORITY_KEYID 119 --# define X509V3_F_V2I_BASIC_CONSTRAINTS 102 --# define X509V3_F_V2I_CRLD 134 --# define X509V3_F_V2I_EXTENDED_KEY_USAGE 103 --# define X509V3_F_V2I_GENERAL_NAMES 118 --# define X509V3_F_V2I_GENERAL_NAME_EX 117 --# define X509V3_F_V2I_IDP 157 --# define X509V3_F_V2I_IPADDRBLOCKS 159 --# define X509V3_F_V2I_ISSUER_ALT 153 --# define X509V3_F_V2I_NAME_CONSTRAINTS 147 --# define X509V3_F_V2I_POLICY_CONSTRAINTS 146 --# define X509V3_F_V2I_POLICY_MAPPINGS 145 --# define X509V3_F_V2I_SUBJECT_ALT 154 --# define X509V3_F_V2I_TLS_FEATURE 165 --# define X509V3_F_V3_GENERIC_EXTENSION 116 --# define X509V3_F_X509V3_ADD1_I2D 140 --# define X509V3_F_X509V3_ADD_LEN_VALUE 174 --# define X509V3_F_X509V3_ADD_VALUE 105 --# define X509V3_F_X509V3_EXT_ADD 104 --# define X509V3_F_X509V3_EXT_ADD_ALIAS 106 --# define X509V3_F_X509V3_EXT_I2D 136 --# define X509V3_F_X509V3_EXT_NCONF 152 --# define X509V3_F_X509V3_GET_SECTION 142 --# define X509V3_F_X509V3_GET_STRING 143 --# define X509V3_F_X509V3_GET_VALUE_BOOL 110 --# define X509V3_F_X509V3_PARSE_LIST 109 --# define X509V3_F_X509_PURPOSE_ADD 137 --# define X509V3_F_X509_PURPOSE_SET 141 -- --/* -- * X509V3 reason codes. -- */ --# define X509V3_R_BAD_IP_ADDRESS 118 --# define X509V3_R_BAD_OBJECT 119 --# define X509V3_R_BN_DEC2BN_ERROR 100 --# define X509V3_R_BN_TO_ASN1_INTEGER_ERROR 101 --# define X509V3_R_DIRNAME_ERROR 149 --# define X509V3_R_DISTPOINT_ALREADY_SET 160 --# define X509V3_R_DUPLICATE_ZONE_ID 133 --# define X509V3_R_ERROR_CONVERTING_ZONE 131 --# define X509V3_R_ERROR_CREATING_EXTENSION 144 --# define X509V3_R_ERROR_IN_EXTENSION 128 --# define X509V3_R_EXPECTED_A_SECTION_NAME 137 --# define X509V3_R_EXTENSION_EXISTS 145 --# define X509V3_R_EXTENSION_NAME_ERROR 115 --# define X509V3_R_EXTENSION_NOT_FOUND 102 --# define X509V3_R_EXTENSION_SETTING_NOT_SUPPORTED 103 --# define X509V3_R_EXTENSION_VALUE_ERROR 116 --# define X509V3_R_ILLEGAL_EMPTY_EXTENSION 151 --# define X509V3_R_INCORRECT_POLICY_SYNTAX_TAG 152 --# define X509V3_R_INVALID_ASNUMBER 162 --# define X509V3_R_INVALID_ASRANGE 163 --# define X509V3_R_INVALID_BOOLEAN_STRING 104 --# define X509V3_R_INVALID_EXTENSION_STRING 105 --# define X509V3_R_INVALID_INHERITANCE 165 --# define X509V3_R_INVALID_IPADDRESS 166 --# define X509V3_R_INVALID_MULTIPLE_RDNS 161 --# define X509V3_R_INVALID_NAME 106 --# define X509V3_R_INVALID_NULL_ARGUMENT 107 --# define X509V3_R_INVALID_NULL_NAME 108 --# define X509V3_R_INVALID_NULL_VALUE 109 --# define X509V3_R_INVALID_NUMBER 140 --# define X509V3_R_INVALID_NUMBERS 141 --# define X509V3_R_INVALID_OBJECT_IDENTIFIER 110 --# define X509V3_R_INVALID_OPTION 138 --# define X509V3_R_INVALID_POLICY_IDENTIFIER 134 --# define X509V3_R_INVALID_PROXY_POLICY_SETTING 153 --# define X509V3_R_INVALID_PURPOSE 146 --# define X509V3_R_INVALID_SAFI 164 --# define X509V3_R_INVALID_SECTION 135 --# define X509V3_R_INVALID_SYNTAX 143 --# define X509V3_R_ISSUER_DECODE_ERROR 126 --# define X509V3_R_MISSING_VALUE 124 --# define X509V3_R_NEED_ORGANIZATION_AND_NUMBERS 142 --# define X509V3_R_NO_CONFIG_DATABASE 136 --# define X509V3_R_NO_ISSUER_CERTIFICATE 121 --# define X509V3_R_NO_ISSUER_DETAILS 127 --# define X509V3_R_NO_POLICY_IDENTIFIER 139 --# define X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED 154 --# define X509V3_R_NO_PUBLIC_KEY 114 --# define X509V3_R_NO_SUBJECT_DETAILS 125 --# define X509V3_R_OPERATION_NOT_DEFINED 148 --# define X509V3_R_OTHERNAME_ERROR 147 --# define X509V3_R_POLICY_LANGUAGE_ALREADY_DEFINED 155 --# define X509V3_R_POLICY_PATH_LENGTH 156 --# define X509V3_R_POLICY_PATH_LENGTH_ALREADY_DEFINED 157 --# define X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY 159 --# define X509V3_R_SECTION_NOT_FOUND 150 --# define X509V3_R_UNABLE_TO_GET_ISSUER_DETAILS 122 --# define X509V3_R_UNABLE_TO_GET_ISSUER_KEYID 123 --# define X509V3_R_UNKNOWN_BIT_STRING_ARGUMENT 111 --# define X509V3_R_UNKNOWN_EXTENSION 129 --# define X509V3_R_UNKNOWN_EXTENSION_NAME 130 --# define X509V3_R_UNKNOWN_OPTION 120 --# define X509V3_R_UNSUPPORTED_OPTION 117 --# define X509V3_R_UNSUPPORTED_TYPE 167 --# define X509V3_R_USER_TOO_LONG 132 -- --#endif -diff --git a/uadk_tool/uadk_benchmark.c b/uadk_tool/uadk_benchmark.c -index 8067ed7..0d7fc71 100644 ---- a/uadk_tool/uadk_benchmark.c -+++ b/uadk_tool/uadk_benchmark.c -@@ -419,9 +419,11 @@ static int benchmark_run(struct acc_option *option) - ret = sec_wd_benchmark(option); - } - usleep(20000); -+ #ifdef WITH_OPENSSL_DIR - if (option->modetype & SOFT_MODE) { - ret = sec_soft_benchmark(option); - } -+ #endif - break; - case HPRE_TYPE: - break; --- -2.25.1 - diff --git a/0047-uadk-fix-for-wd_env_config-numa_num.patch b/0047-uadk-fix-for-wd_env_config-numa_num.patch deleted file mode 100644 index 973a10b..0000000 --- a/0047-uadk-fix-for-wd_env_config-numa_num.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 4491fd2e4fb1c1d101e4c2d45998b484ce946443 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Wed, 19 Jan 2022 11:25:34 +0800 -Subject: [PATCH 51/53] uadk: fix for wd_env_config numa_num - -numa number should be updated synchronously -with config_per_numa, so set it to zero when -free numa. - -Signed-off-by: Wenkai Lin ---- - include/wd_util.h | 2 +- - wd_util.c | 2 ++ - 2 files changed, 3 insertions(+), 1 deletion(-) - -diff --git a/include/wd_util.h b/include/wd_util.h -index c07ecce..2d3c1e4 100644 ---- a/include/wd_util.h -+++ b/include/wd_util.h -@@ -16,7 +16,7 @@ extern "C" { - - #define FOREACH_NUMA(i, config, config_numa) \ - for (i = 0, config_numa = config->config_per_numa; \ -- config_numa && i < config->numa_num; config_numa++, i++) -+ i < config->numa_num; config_numa++, i++) - - struct wd_async_msg_pool { - struct msg_pool *pools; -diff --git a/wd_util.c b/wd_util.c -index 7fa688d..44c8909 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -356,6 +356,7 @@ static void wd_free_numa(struct wd_env_config *config) - - free(config->config_per_numa); - config->config_per_numa = NULL; -+ config->numa_num = 0; - } - - /** -@@ -484,6 +485,7 @@ static int wd_alloc_numa(struct wd_env_config *config, - return 0; - - free_list: -+ config->numa_num = 0; - wd_free_list_accels(head); - free_numa_dev_num: - free(numa_dev_num); --- -2.25.1 - diff --git a/0048-hisi-sec-add-some-dfx-information-in-comments.patch b/0048-hisi-sec-add-some-dfx-information-in-comments.patch deleted file mode 100644 index 40c33ea..0000000 --- a/0048-hisi-sec-add-some-dfx-information-in-comments.patch +++ /dev/null @@ -1,588 +0,0 @@ -From 92364a0a3a38a02d64cca10d3153e94ee01c3969 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Tue, 25 Jan 2022 14:33:48 +0800 -Subject: [PATCH 52/53] hisi-sec: add some dfx information in comments - -Add some dfx information in comments to improves locating -efficiency. - -Signed-off-by: Kai Ye ---- - drv/hisi_sec.c | 86 ++++++++++++++++++++++++++++++-------------------- - wd_aead.c | 39 ++++++++++++++--------- - wd_cipher.c | 21 +++++++----- - wd_digest.c | 12 ++++--- - 4 files changed, 97 insertions(+), 61 deletions(-) - -diff --git a/drv/hisi_sec.c b/drv/hisi_sec.c -index f5db7eb..14656c8 100644 ---- a/drv/hisi_sec.c -+++ b/drv/hisi_sec.c -@@ -576,7 +576,7 @@ static int get_3des_c_key_len(struct wd_cipher_msg *msg, __u8 *c_key_len) - } else if (msg->key_bytes == SEC_3DES_3KEY_SIZE) { - *c_key_len = CKEY_LEN_3DES_3KEY; - } else { -- WD_ERR("invalid 3des key size!\n"); -+ WD_ERR("invalid 3des key size, size = %u\n", msg->key_bytes); - return -WD_EINVAL; - } - -@@ -602,7 +602,7 @@ static int get_aes_c_key_len(struct wd_cipher_msg *msg, __u8 *c_key_len) - *c_key_len = CKEY_LEN_256BIT; - break; - default: -- WD_ERR("invalid AES key size!\n"); -+ WD_ERR("invalid AES key size, size = %u\n", len); - return -WD_EINVAL; - } - -@@ -634,7 +634,7 @@ static int fill_cipher_bd2_alg(struct wd_cipher_msg *msg, struct hisi_sec_sqe *s - sqe->type2.icvw_kmode = (__u16)c_key_len << SEC_CKEY_OFFSET; - break; - default: -- WD_ERR("invalid cipher type!\n"); -+ WD_ERR("invalid cipher alg type, alg = %u\n", msg->alg); - return -WD_EINVAL; - } - -@@ -660,7 +660,7 @@ static int fill_cipher_bd2_mode(struct wd_cipher_msg *msg, struct hisi_sec_sqe * - c_mode = C_MODE_XTS; - break; - default: -- WD_ERR("invalid cipher mode type!\n"); -+ WD_ERR("invalid cipher mode type, mode = %u\n", msg->mode); - return -WD_EINVAL; - } - sqe->type2.icvw_kmode |= (__u16)(c_mode) << SEC_CMODE_OFFSET; -@@ -719,7 +719,8 @@ static int cipher_len_check(struct wd_cipher_msg *msg) - { - if (msg->in_bytes > MAX_INPUT_DATA_LEN || - !msg->in_bytes) { -- WD_ERR("input cipher length is error!\n"); -+ WD_ERR("input cipher length is error, size = %u\n", -+ msg->in_bytes); - return -WD_EINVAL; - } - -@@ -730,7 +731,8 @@ static int cipher_len_check(struct wd_cipher_msg *msg) - - if (msg->mode == WD_CIPHER_XTS) { - if (msg->in_bytes < AES_BLOCK_SIZE) { -- WD_ERR("input cipher length is too small!\n"); -+ WD_ERR("input cipher length is too small, size = %u\n", -+ msg->in_bytes); - return -WD_EINVAL; - } - return 0; -@@ -738,13 +740,15 @@ static int cipher_len_check(struct wd_cipher_msg *msg) - - if (msg->alg == WD_CIPHER_3DES || msg->alg == WD_CIPHER_DES) { - if (msg->in_bytes & (DES3_BLOCK_SIZE - 1)) { -- WD_ERR("input 3DES or DES cipher parameter is error!\n"); -+ WD_ERR("input 3DES or DES cipher parameter is error, size = %u\n", -+ msg->in_bytes); - return -WD_EINVAL; - } - return 0; - } else if (msg->alg == WD_CIPHER_AES || msg->alg == WD_CIPHER_SM4) { - if (msg->in_bytes & (AES_BLOCK_SIZE - 1)) { -- WD_ERR("input AES or SM4 cipher parameter is error!\n"); -+ WD_ERR("input AES or SM4 cipher parameter is error, size = %u\n", -+ msg->in_bytes); - return -WD_EINVAL; - } - return 0; -@@ -1006,7 +1010,7 @@ static int fill_cipher_bd3_alg(struct wd_cipher_msg *msg, - sqe->c_icv_key |= (__u16)c_key_len << SEC_CKEY_OFFSET_V3; - break; - default: -- WD_ERR("invalid cipher type!\n"); -+ WD_ERR("invalid cipher alg type, alg = %u\n", msg->alg); - return -WD_EINVAL; - } - -@@ -1041,7 +1045,7 @@ static int fill_cipher_bd3_mode(struct wd_cipher_msg *msg, - c_mode = C_MODE_CFB; - break; - default: -- WD_ERR("invalid cipher mode type!\n"); -+ WD_ERR("invalid cipher mode type, mode = %u\n", msg->mode); - return -WD_EINVAL; - } - sqe->c_mode_alg |= (__u16)c_mode; -@@ -1201,7 +1205,7 @@ static int fill_digest_bd2_alg(struct wd_digest_msg *msg, - struct hisi_sec_sqe *sqe) - { - if (msg->alg >= WD_DIGEST_TYPE_MAX) { -- WD_ERR("invalid digest type!\n"); -+ WD_ERR("invalid digest alg type, alg = %u\n", msg->alg); - return -WD_EINVAL; - } - -@@ -1211,7 +1215,8 @@ static int fill_digest_bd2_alg(struct wd_digest_msg *msg, - (__u32)g_digest_a_alg[msg->alg] << AUTH_ALG_OFFSET; - else if (msg->mode == WD_DIGEST_HMAC) { - if (msg->key_bytes & WORD_ALIGNMENT_MASK) { -- WD_ERR("invalid digest key_bytes!\n"); -+ WD_ERR("invalid digest key_bytes, size = %u\n", -+ msg->key_bytes); - return -WD_EINVAL; - } - sqe->type2.mac_key_alg |= (__u32)(msg->key_bytes / -@@ -1221,7 +1226,7 @@ static int fill_digest_bd2_alg(struct wd_digest_msg *msg, - sqe->type2.mac_key_alg |= - (__u32)g_hmac_a_alg[msg->alg] << AUTH_ALG_OFFSET; - } else { -- WD_ERR("invalid digest mode!\n"); -+ WD_ERR("invalid digest mode, mode = %u\n", msg->mode); - return -WD_EINVAL; - } - -@@ -1298,19 +1303,22 @@ static int digest_len_check(struct wd_digest_msg *msg, enum sec_bd_type type) - } - - if (unlikely(msg->in_bytes > MAX_INPUT_DATA_LEN)) { -- WD_ERR("digest input length is too long, size:%u!\n", msg->in_bytes); -+ WD_ERR("digest input length is too long, size = %u\n", -+ msg->in_bytes); - return -WD_EINVAL; - } - - if (unlikely(msg->out_bytes & WORD_ALIGNMENT_MASK)) { -- WD_ERR("digest out length is error, size:%u!\n", msg->out_bytes); -+ WD_ERR("digest out length is error, size = %u\n", -+ msg->out_bytes); - return -WD_EINVAL; - } - - if (msg->has_next) { - ret = digest_long_bd_check(msg); - if (ret) { -- WD_ERR("input data isn't aligned, size:%u!\n", msg->in_bytes); -+ WD_ERR("input data isn't aligned, size = %u\n", -+ msg->in_bytes); - return -WD_EINVAL; - } - } -@@ -1421,7 +1429,7 @@ static int fill_digest_bd3_alg(struct wd_digest_msg *msg, - struct hisi_sec_sqe3 *sqe) - { - if (msg->alg >= WD_DIGEST_TYPE_MAX) { -- WD_ERR("Invalid digest type!\n"); -+ WD_ERR("invalid digest type, alg = %u\n", msg->alg); - return -WD_EINVAL; - } - -@@ -1432,7 +1440,8 @@ static int fill_digest_bd3_alg(struct wd_digest_msg *msg, - (__u32)g_digest_a_alg[msg->alg] << SEC_AUTH_ALG_OFFSET_V3; - } else if (msg->mode == WD_DIGEST_HMAC) { - if (msg->key_bytes & WORD_ALIGNMENT_MASK) { -- WD_ERR("Invalid digest key_bytes!\n"); -+ WD_ERR("invalid digest key_bytes, size = %u\n", -+ msg->key_bytes); - return -WD_EINVAL; - } - sqe->auth_mac_key |= (__u32)(msg->key_bytes / -@@ -1441,7 +1450,7 @@ static int fill_digest_bd3_alg(struct wd_digest_msg *msg, - sqe->auth_mac_key |= - (__u32)g_hmac_a_alg[msg->alg] << SEC_AUTH_ALG_OFFSET_V3; - } else { -- WD_ERR("Invalid digest mode!\n"); -+ WD_ERR("invalid digest mode, mode = %u\n", msg->mode); - return -WD_EINVAL; - } - -@@ -1601,7 +1610,8 @@ static int aead_get_aes_key_len(struct wd_aead_msg *msg, __u8 *key_len) - *key_len = CKEY_LEN_256BIT; - break; - default: -- WD_ERR("failed to check AES key size!\n"); -+ WD_ERR("failed to check AES key size, size = %u\n", -+ msg->ckey_bytes); - return -WD_EINVAL; - } - -@@ -1622,7 +1632,7 @@ static int fill_aead_bd2_alg(struct wd_aead_msg *msg, - sqe->type2.icvw_kmode = (__u16)c_key_len << SEC_CKEY_OFFSET; - break; - default: -- WD_ERR("failed to check aead calg type!\n"); -+ WD_ERR("failed to check aead calg type, calg = %u\n", msg->calg); - ret = -WD_EINVAL; - } - -@@ -1632,13 +1642,15 @@ static int fill_aead_bd2_alg(struct wd_aead_msg *msg, - return ret; - - if (unlikely(msg->auth_bytes & WORD_ALIGNMENT_MASK)) { -- WD_ERR("failed to check aead auth_bytes!\n"); -+ WD_ERR("failed to check aead auth_bytes, size = %u\n", -+ msg->auth_bytes); - return -WD_EINVAL; - } - sqe->type2.mac_key_alg = msg->auth_bytes / WORD_BYTES; - - if (unlikely(msg->akey_bytes & WORD_ALIGNMENT_MASK)) { -- WD_ERR("failed to check aead auth key bytes!\n"); -+ WD_ERR("failed to check aead auth key bytes, size = %u\n", -+ msg->akey_bytes); - return -WD_EINVAL; - } - sqe->type2.mac_key_alg |= (__u32)(msg->akey_bytes / -@@ -1655,7 +1667,7 @@ static int fill_aead_bd2_alg(struct wd_aead_msg *msg, - d_alg = A_ALG_HMAC_SHA512 << AUTH_ALG_OFFSET; - break; - default: -- WD_ERR("failed to check aead dalg type!\n"); -+ WD_ERR("failed to check aead dalg type, dalg = %u\n", msg->dalg); - ret = -WD_EINVAL; - } - sqe->type2.mac_key_alg |= d_alg; -@@ -1685,7 +1697,8 @@ static int fill_aead_bd2_mode(struct wd_aead_msg *msg, - sqe->type2.icvw_kmode |= msg->auth_bytes; - break; - default: -- WD_ERR("failed to check aead cmode type!\n"); -+ WD_ERR("failed to check aead cmode type, cmode = %u\n", -+ msg->cmode); - return -WD_EINVAL; - } - sqe->type2.icvw_kmode |= (__u16)(c_mode) << SEC_CMODE_OFFSET; -@@ -1758,13 +1771,15 @@ static void fill_aead_bd2_addr(struct wd_aead_msg *msg, - static int aead_len_check(struct wd_aead_msg *msg) - { - if (unlikely(msg->in_bytes + msg->assoc_bytes > MAX_INPUT_DATA_LEN)) { -- WD_ERR("aead input data length is too long!\n"); -+ WD_ERR("aead input data length is too long, size = %u\n", -+ msg->in_bytes + msg->assoc_bytes); - return -WD_EINVAL; - } - - if (unlikely(msg->cmode == WD_CIPHER_CCM && - msg->assoc_bytes > MAX_CCM_AAD_LEN)) { -- WD_ERR("failed to check ccm aad len, input is too long!\n"); -+ WD_ERR("failed to check ccm aad len, input is too long, size = %u\n", -+ msg->assoc_bytes); - return -WD_EINVAL; - } - -@@ -1793,7 +1808,7 @@ static int fill_aead_bd2(struct wd_aead_msg *msg, struct hisi_sec_sqe *sqe) - sqe->type_auth_cipher |= AUTH_MAC_VERIFY << - SEC_AUTH_OFFSET; - } else { -- WD_ERR("failed to check aead op type!\n"); -+ WD_ERR("failed to check aead op type, op = %u\n", msg->op_type); - return -WD_EINVAL; - } - sqe->sds_sa_type |= (__u8)(de | scene); -@@ -1950,12 +1965,14 @@ static int aead_bd3_msg_check(struct wd_aead_msg *msg) - } - - if (unlikely(msg->auth_bytes & WORD_ALIGNMENT_MASK)) { -- WD_ERR("failed to check aead auth_bytes!\n"); -+ WD_ERR("failed to check aead auth_bytes, size = %u\n", -+ msg->auth_bytes); - return -WD_EINVAL; - } - - if (unlikely(msg->akey_bytes & WORD_ALIGNMENT_MASK)) { -- WD_ERR("failed to check aead auth key bytes!\n"); -+ WD_ERR("failed to check aead auth key bytes, size = %u\n", -+ msg->akey_bytes); - return -WD_EINVAL; - } - -@@ -1980,7 +1997,7 @@ static int fill_aead_bd3_alg(struct wd_aead_msg *msg, - sqe->c_icv_key |= (__u16)c_key_len << SEC_CKEY_OFFSET_V3; - break; - default: -- WD_ERR("failed to check aead calg type!\n"); -+ WD_ERR("failed to check aead calg type, calg = %u\n", msg->calg); - ret = -WD_EINVAL; - } - -@@ -2009,7 +2026,7 @@ static int fill_aead_bd3_alg(struct wd_aead_msg *msg, - d_alg = A_ALG_HMAC_SHA512 << SEC_AUTH_ALG_OFFSET_V3; - break; - default: -- WD_ERR("failed to check aead dalg type!\n"); -+ WD_ERR("failed to check aead dalg type, dalg = %u\n", msg->dalg); - ret = -WD_EINVAL; - } - sqe->auth_mac_key |= d_alg; -@@ -2037,7 +2054,8 @@ static int fill_aead_bd3_mode(struct wd_aead_msg *msg, - sqe->c_icv_key |= msg->auth_bytes << SEC_MAC_OFFSET_V3; - break; - default: -- WD_ERR("failed to check aead cmode type!\n"); -+ WD_ERR("failed to check aead cmode type, cmode = %u\n", -+ msg->cmode); - return -WD_EINVAL; - } - -@@ -2082,7 +2100,7 @@ static int fill_aead_bd3(struct wd_aead_msg *msg, struct hisi_sec_sqe3 *sqe) - sqe->auth_mac_key = AUTH_MAC_VERIFY; - sqe->huk_iv_seq = WD_DIGEST_THEN_CIPHER << SEC_SEQ_OFFSET_V3; - } else { -- WD_ERR("failed to check aead op type!\n"); -+ WD_ERR("failed to check aead op type, op = %u\n", msg->op_type); - return -WD_EINVAL; - } - sqe->bd_param |= (__u16)(de | scene); -diff --git a/wd_aead.c b/wd_aead.c -index 32d06ec..82a1f97 100644 ---- a/wd_aead.c -+++ b/wd_aead.c -@@ -110,7 +110,7 @@ static int cipher_key_len_check(enum wd_cipher_alg alg, __u16 length) - ret = aes_key_len_check(length); - break; - default: -- WD_ERR("failed to check cipher key!\n"); -+ WD_ERR("failed to set the cipher alg, alg = %d\n", alg); - return -WD_EINVAL; - } - -@@ -143,7 +143,7 @@ int wd_aead_set_ckey(handle_t h_sess, const __u8 *key, __u16 key_len) - int ret; - - if (unlikely(!key || !sess)) { -- WD_ERR("failed to check cipher key inpupt param!\n"); -+ WD_ERR("failed to check cipher key input param!\n"); - return -WD_EINVAL; - } - -@@ -189,7 +189,7 @@ int wd_aead_set_akey(handle_t h_sess, const __u8 *key, __u16 key_len) - return 0; - - err_key_len: -- WD_ERR("failed to check authenticate key length!\n"); -+ WD_ERR("failed to check authenticate key length, size = %u\n", key_len); - return -WD_EINVAL; - } - -@@ -206,20 +206,23 @@ int wd_aead_set_authsize(handle_t h_sess, __u16 authsize) - if (authsize < WD_AEAD_CCM_GCM_MIN || - authsize > WD_AEAD_CCM_GCM_MAX || - authsize % (WD_AEAD_CCM_GCM_MIN >> 1)) { -- WD_ERR("failed to check aead CCM authsize!\n"); -+ WD_ERR("failed to check aead CCM authsize, size = %u\n", -+ authsize); - return -WD_EINVAL; - } - } else if (sess->cmode == WD_CIPHER_GCM) { - if (authsize < WD_AEAD_CCM_GCM_MIN << 1 || - authsize > WD_AEAD_CCM_GCM_MAX) { -- WD_ERR("failed to check aead GCM authsize!\n"); -+ WD_ERR("failed to check aead GCM authsize, size = %u\n", -+ authsize); - return -WD_EINVAL; - } - } else { - if (sess->dalg >= WD_DIGEST_TYPE_MAX || - authsize & (WD_AEAD_CCM_GCM_MAX - 1) || - authsize > g_aead_mac_len[sess->dalg]) { -- WD_ERR("failed to check aead mac authsize!\n"); -+ WD_ERR("failed to check aead mac authsize, size = %u\n", -+ authsize); - return -WD_EINVAL; - } - } -@@ -313,20 +316,22 @@ static int aead_mac_param_check(struct wd_aead_sess *sess, - switch (sess->cmode) { - case WD_CIPHER_CBC: - if (req->mac_bytes < g_aead_mac_len[sess->dalg]) { -- WD_ERR("failed to check cbc-hmac mac buffer length!\n"); -+ WD_ERR("failed to check cbc-hmac mac buffer length, size = %u\n", -+ req->mac_bytes); - ret = -WD_EINVAL; - } - break; - case WD_CIPHER_CCM: - case WD_CIPHER_GCM: - if (req->mac_bytes < WD_AEAD_CCM_GCM_MAX) { -- WD_ERR("failed to check CCM or GCM mac buffer length!\n"); -+ WD_ERR("failed to check CCM or GCM mac buffer length, size = %u\n", -+ req->mac_bytes); - ret = -WD_EINVAL; - } - break; - default: - ret = -WD_EINVAL; -- WD_ERR("set the aead cmode is error!\n"); -+ WD_ERR("set the aead cmode is error, cmode = %d\n", sess->cmode); - } - - return ret; -@@ -350,12 +355,14 @@ static int aead_param_check(struct wd_aead_sess *sess, - - if (unlikely(sess->cmode == WD_CIPHER_CBC && - (req->in_bytes & (AES_BLOCK_SIZE - 1)))) { -- WD_ERR("failed to check aead input data length!\n"); -+ WD_ERR("failed to check aead input data length, size = %u\n", -+ req->in_bytes); - return -WD_EINVAL; - } - - if (unlikely(req->iv_bytes != get_iv_block_size(sess->cmode))) { -- WD_ERR("failed to check aead IV length, size:%u\n", req->iv_bytes); -+ WD_ERR("failed to check aead IV length, size = %u\n", -+ req->iv_bytes); - return -WD_EINVAL; - } - -@@ -367,13 +374,15 @@ static int aead_param_check(struct wd_aead_sess *sess, - len = req->in_bytes + req->assoc_bytes; - ret = wd_check_datalist(req->list_src, len); - if (unlikely(ret)) { -- WD_ERR("failed to check the src datalist!\n"); -+ WD_ERR("failed to check the src datalist, size = %u\n", -+ len); - return -WD_EINVAL; - } - - ret = wd_check_datalist(req->list_dst, req->out_bytes); - if (unlikely(ret)) { -- WD_ERR("failed to check the dst datalist!\n"); -+ WD_ERR("failed to check the dst datalist, size = %u\n", -+ req->out_bytes); - return -WD_EINVAL; - } - } -@@ -407,13 +416,13 @@ int wd_aead_init(struct wd_ctx_config *config, struct wd_sched *sched) - - ret = wd_init_ctx_config(&wd_aead_setting.config, config); - if (ret) { -- WD_ERR("failed to set config, ret = %d!\n", ret); -+ WD_ERR("failed to set config, ret = %d\n", ret); - return ret; - } - - ret = wd_init_sched(&wd_aead_setting.sched, sched); - if (ret < 0) { -- WD_ERR("failed to set sched, ret = %d!\n", ret); -+ WD_ERR("failed to set sched, ret = %d\n", ret); - goto out; - } - -diff --git a/wd_cipher.c b/wd_cipher.c -index 5be3123..0b29fb5 100644 ---- a/wd_cipher.c -+++ b/wd_cipher.c -@@ -126,7 +126,7 @@ static int cipher_key_len_check(struct wd_cipher_sess *sess, __u32 length) - int ret = 0; - - if (sess->mode == WD_CIPHER_XTS && length == AES_KEYSIZE_192) { -- WD_ERR("unsupported XTS key length, length = %u.\n", length); -+ WD_ERR("unsupported XTS key length, length = %u\n", length); - return -WD_EINVAL; - } - -@@ -147,7 +147,7 @@ static int cipher_key_len_check(struct wd_cipher_sess *sess, __u32 length) - ret = -WD_EINVAL; - break; - default: -- WD_ERR("cipher input alg err, alg is %d.\n", sess->alg); -+ WD_ERR("cipher input alg err, alg = %d\n", sess->alg); - return -WD_EINVAL; - } - -@@ -358,14 +358,16 @@ static int cipher_iv_len_check(struct wd_cipher_req *req, - case WD_CIPHER_AES: - case WD_CIPHER_SM4: - if (req->iv_bytes != AES_BLOCK_SIZE) { -- WD_ERR("AES or SM4 input iv bytes is err!\n"); -+ WD_ERR("AES or SM4 input iv bytes is err, size = %u\n", -+ req->iv_bytes); - ret = -WD_EINVAL; - } - break; - case WD_CIPHER_3DES: - case WD_CIPHER_DES: - if (req->iv_bytes != DES3_BLOCK_SIZE) { -- WD_ERR("3DES or DES input iv bytes is err!\n"); -+ WD_ERR("3DES or DES input iv bytes is err, size = %u\n", -+ req->iv_bytes); - ret = -WD_EINVAL; - } - break; -@@ -384,7 +386,7 @@ static int wd_cipher_check_params(handle_t h_sess, - int ret = 0; - - if (unlikely(!h_sess || !req)) { -- WD_ERR("cipher input sess or req is NULL.\n"); -+ WD_ERR("cipher input sess or req is NULL!\n"); - return -WD_EINVAL; - } - -@@ -394,21 +396,24 @@ static int wd_cipher_check_params(handle_t h_sess, - } - - if (unlikely(req->out_buf_bytes < req->in_bytes)) { -- WD_ERR("cipher set out_buf_bytes is error!\n"); -+ WD_ERR("cipher set out_buf_bytes is error, size = %u\n", -+ req->out_buf_bytes); - return -WD_EINVAL; - } - - if (req->data_fmt == WD_SGL_BUF) { - ret = wd_check_datalist(req->list_src, req->in_bytes); - if (unlikely(ret)) { -- WD_ERR("failed to check the src datalist!\n"); -+ WD_ERR("failed to check the src datalist, len = %u\n", -+ req->in_bytes); - return -WD_EINVAL; - } - - /* cipher dst len is equal to src len */ - ret = wd_check_datalist(req->list_dst, req->in_bytes); - if (unlikely(ret)) { -- WD_ERR("failed to check the dst datalist!\n"); -+ WD_ERR("failed to check the dst datalist, len = %u\n", -+ req->in_bytes); - return -WD_EINVAL; - } - } -diff --git a/wd_digest.c b/wd_digest.c -index 525d6a9..d4e710d 100644 ---- a/wd_digest.c -+++ b/wd_digest.c -@@ -98,7 +98,8 @@ int wd_digest_set_key(handle_t h_sess, const __u8 *key, __u32 key_len) - if ((sess->alg <= WD_DIGEST_SHA224 && key_len > - MAX_HMAC_KEY_SIZE >> 1) || key_len == 0 || - key_len > MAX_HMAC_KEY_SIZE) { -- WD_ERR("failed to check digest key length!\n"); -+ WD_ERR("failed to check digest key length, size = %u\n", -+ key_len); - return -WD_EINVAL; - } - -@@ -258,20 +259,23 @@ static int digest_param_check(struct wd_digest_sess *sess, - } - - if (unlikely(req->out_buf_bytes < req->out_bytes)) { -- WD_ERR("failed to check digest out buffer length!\n"); -+ WD_ERR("failed to check digest out buffer length, size = %u\n", -+ req->out_buf_bytes); - return -WD_EINVAL; - } - - if (unlikely(sess->alg >= WD_DIGEST_TYPE_MAX || req->out_bytes == 0 || - req->out_bytes > g_digest_mac_len[sess->alg])) { -- WD_ERR("failed to check digest type or mac length!\n"); -+ WD_ERR("failed to check digest type or mac length, alg = %d, out_bytes = %u\n", -+ sess->alg, req->out_bytes); - return -WD_EINVAL; - } - - if (req->data_fmt == WD_SGL_BUF) { - ret = wd_check_datalist(req->list_in, req->in_bytes); - if (unlikely(ret)) { -- WD_ERR("failed to check the src datalist!\n"); -+ WD_ERR("failed to check the src datalist, size = %u\n", -+ req->in_bytes); - return -WD_EINVAL; - } - } --- -2.25.1 - diff --git a/0049-hisi-sec-delete-some-dummy-parameter-checking.patch b/0049-hisi-sec-delete-some-dummy-parameter-checking.patch deleted file mode 100644 index f935289..0000000 --- a/0049-hisi-sec-delete-some-dummy-parameter-checking.patch +++ /dev/null @@ -1,119 +0,0 @@ -From 7d208baa2ea3b3adb161683e9e2446dd01ae14a0 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Thu, 27 Jan 2022 10:16:59 +0800 -Subject: [PATCH 53/53] hisi-sec: delete some dummy parameter checking - -1. If an error is detected, the system exits rather than - continues. here is fix it. -2. Due to the auth length checking logic same as the api -layer. So this code is reduntant and needs to be deleted. - -Signed-off-by: Kai Ye ---- - drv/hisi_sec.c | 56 +++++++++++++++++--------------------------------- - 1 file changed, 19 insertions(+), 37 deletions(-) - -diff --git a/drv/hisi_sec.c b/drv/hisi_sec.c -index 14656c8..61e0698 100644 ---- a/drv/hisi_sec.c -+++ b/drv/hisi_sec.c -@@ -1618,6 +1618,17 @@ static int aead_get_aes_key_len(struct wd_aead_msg *msg, __u8 *key_len) - return 0; - } - -+static int aead_bd_msg_check(struct wd_aead_msg *msg) -+{ -+ if (unlikely(msg->akey_bytes & WORD_ALIGNMENT_MASK)) { -+ WD_ERR("failed to check aead auth key bytes, size = %u\n", -+ msg->akey_bytes); -+ return -WD_EINVAL; -+ } -+ -+ return 0; -+} -+ - static int fill_aead_bd2_alg(struct wd_aead_msg *msg, - struct hisi_sec_sqe *sqe) - { -@@ -1633,26 +1644,19 @@ static int fill_aead_bd2_alg(struct wd_aead_msg *msg, - break; - default: - WD_ERR("failed to check aead calg type, calg = %u\n", msg->calg); -- ret = -WD_EINVAL; -+ return -WD_EINVAL; - } - - /* CCM/GCM this region is set to 0 */ -- if (msg->cmode == WD_CIPHER_CCM || -- msg->cmode == WD_CIPHER_GCM) -+ if (msg->cmode == WD_CIPHER_CCM || msg->cmode == WD_CIPHER_GCM) - return ret; - -- if (unlikely(msg->auth_bytes & WORD_ALIGNMENT_MASK)) { -- WD_ERR("failed to check aead auth_bytes, size = %u\n", -- msg->auth_bytes); -- return -WD_EINVAL; -- } - sqe->type2.mac_key_alg = msg->auth_bytes / WORD_BYTES; - -- if (unlikely(msg->akey_bytes & WORD_ALIGNMENT_MASK)) { -- WD_ERR("failed to check aead auth key bytes, size = %u\n", -- msg->akey_bytes); -- return -WD_EINVAL; -- } -+ ret = aead_bd_msg_check(msg); -+ if (ret) -+ return ret; -+ - sqe->type2.mac_key_alg |= (__u32)(msg->akey_bytes / - WORD_BYTES) << MAC_LEN_OFFSET; - -@@ -1957,28 +1961,6 @@ static struct wd_aead_driver hisi_aead_driver = { - - WD_AEAD_SET_DRIVER(hisi_aead_driver); - --static int aead_bd3_msg_check(struct wd_aead_msg *msg) --{ -- if (unlikely(!msg->in_bytes)) { -- WD_ERR("failed to check aead in_bytes 0 length!\n"); -- return -WD_EINVAL; -- } -- -- if (unlikely(msg->auth_bytes & WORD_ALIGNMENT_MASK)) { -- WD_ERR("failed to check aead auth_bytes, size = %u\n", -- msg->auth_bytes); -- return -WD_EINVAL; -- } -- -- if (unlikely(msg->akey_bytes & WORD_ALIGNMENT_MASK)) { -- WD_ERR("failed to check aead auth key bytes, size = %u\n", -- msg->akey_bytes); -- return -WD_EINVAL; -- } -- -- return 0; --} -- - static int fill_aead_bd3_alg(struct wd_aead_msg *msg, - struct hisi_sec_sqe3 *sqe) - { -@@ -1998,14 +1980,14 @@ static int fill_aead_bd3_alg(struct wd_aead_msg *msg, - break; - default: - WD_ERR("failed to check aead calg type, calg = %u\n", msg->calg); -- ret = -WD_EINVAL; -+ return -WD_EINVAL; - } - - /* CCM/GCM this region is set to 0 */ - if (msg->cmode == WD_CIPHER_CCM || msg->cmode == WD_CIPHER_GCM) - return ret; - -- ret = aead_bd3_msg_check(msg); -+ ret = aead_bd_msg_check(msg); - if (ret) - return ret; - --- -2.25.1 - diff --git a/0050-hisi-qm-udrv-v1-deleted-a-dummy-branch.patch b/0050-hisi-qm-udrv-v1-deleted-a-dummy-branch.patch deleted file mode 100644 index 6d9fdaf..0000000 --- a/0050-hisi-qm-udrv-v1-deleted-a-dummy-branch.patch +++ /dev/null @@ -1,45 +0,0 @@ -From bbdb8e4337270cbc1125f9e5fa3b004e98a543d1 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Thu, 10 Feb 2022 14:55:43 +0800 -Subject: [PATCH 54/64] hisi-qm-udrv/v1: deleted a dummy branch - -Deleted an invalid branch in qm_set_queue_alg_info. the software -won't go to that line of code. - -Signed-off-by: Kai Ye ---- - v1/drv/hisi_qm_udrv.c | 18 ++++-------------- - 1 file changed, 4 insertions(+), 14 deletions(-) - -diff --git a/v1/drv/hisi_qm_udrv.c b/v1/drv/hisi_qm_udrv.c -index 63f346b..b457efd 100644 ---- a/v1/drv/hisi_qm_udrv.c -+++ b/v1/drv/hisi_qm_udrv.c -@@ -423,20 +423,10 @@ static int qm_set_queue_alg_info(struct wd_queue *q) - } else if (!strcmp(alg, "xts(aes)") || - !strcmp(alg, "xts(sm4)")) { - qinfo->atype = WCRYPTO_CIPHER; -- if (strstr(q->dev_path, "zip")) { -- info->sqe_size = QM_ZIP_BD_SIZE; -- info->sqe_fill[WCRYPTO_CIPHER] = qm_fill_zip_cipher_sqe; -- info->sqe_parse[WCRYPTO_CIPHER] = qm_parse_zip_cipher_sqe; -- ret = WD_SUCCESS; -- } else if (strstr(q->dev_path, "sec")) { -- priv->direction = 0; -- info->sqe_size = QM_SEC_BD_SIZE; -- info->sqe_fill[WCRYPTO_CIPHER] = qm_fill_cipher_sqe; -- info->sqe_parse[WCRYPTO_CIPHER] = qm_parse_cipher_sqe; -- ret = WD_SUCCESS; -- } else { /* To be extended */ -- WD_ERR("queue xts alg engine err!\n"); -- } -+ info->sqe_size = QM_ZIP_BD_SIZE; -+ info->sqe_fill[WCRYPTO_CIPHER] = qm_fill_zip_cipher_sqe; -+ info->sqe_parse[WCRYPTO_CIPHER] = qm_parse_zip_cipher_sqe; -+ ret = WD_SUCCESS; - } else { /* To be extended */ - WD_ERR("queue alg err!\n"); - } --- -2.25.1 - diff --git a/0051-hisi-sec-v1-update-the-SEC-BD1-mode-configuration.patch b/0051-hisi-sec-v1-update-the-SEC-BD1-mode-configuration.patch deleted file mode 100644 index df58841..0000000 --- a/0051-hisi-sec-v1-update-the-SEC-BD1-mode-configuration.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 124472212b51781c8ab8ad26131d8442cd049380 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Thu, 10 Feb 2022 14:55:44 +0800 -Subject: [PATCH 55/64] hisi-sec/v1: update the SEC BD1 mode configuration - -Update SEC BD1 XTS mode CI_GEN config from 3 to 0, because -ZIP XTS LBA hardware accomplish is different from SEC XTS LBA. -So we config SEC BD1 XTS ci_gen=0, which means cipher_ivin_addr -mode. - -Signed-off-by: Kai Ye ---- - v1/drv/hisi_sec_udrv.c | 15 +++++++++++---- - 1 file changed, 11 insertions(+), 4 deletions(-) - -diff --git a/v1/drv/hisi_sec_udrv.c b/v1/drv/hisi_sec_udrv.c -index 2d06bd7..7345baf 100644 ---- a/v1/drv/hisi_sec_udrv.c -+++ b/v1/drv/hisi_sec_udrv.c -@@ -298,10 +298,11 @@ static int fill_cipher_bd1_type(struct wcrypto_cipher_msg *msg, - - fill_bd_addr_type(msg->data_fmt, sqe); - -- if (msg->mode == WCRYPTO_CIPHER_XTS) -- sqe->type1.ci_gen = CI_GEN_BY_LBA; -- else -- sqe->type1.ci_gen = CI_GEN_BY_ADDR; -+ /* -+ * BD1 cipher only provides ci_gen=0 for compatibility, so user -+ * should prepare iv[gran_num] and iv_bytes is sum of all grans -+ */ -+ sqe->type1.ci_gen = CI_GEN_BY_ADDR; - - return WD_SUCCESS; - } -@@ -1453,6 +1454,12 @@ static void parse_cipher_bd1(struct wd_queue *q, struct hisi_sec_sqe *sqe, - sqe->type1.c_key_addr_l); - drv_iova_unmap(q, cipher_msg->key, (void *)(uintptr_t)dma_addr, - cipher_msg->key_bytes); -+ if (cipher_msg->iv) { -+ dma_addr = DMA_ADDR(sqe->type1.c_ivin_addr_h, -+ sqe->type1.c_ivin_addr_l); -+ drv_iova_unmap(q, cipher_msg->iv, (void *)(uintptr_t)dma_addr, -+ cipher_msg->iv_bytes); -+ } - } - - static void cipher_ofb_data_handle(struct wcrypto_cipher_msg *msg) --- -2.25.1 - diff --git a/0052-uadk-optimize-algorithm-initialization.patch b/0052-uadk-optimize-algorithm-initialization.patch deleted file mode 100644 index 0d9ec37..0000000 --- a/0052-uadk-optimize-algorithm-initialization.patch +++ /dev/null @@ -1,116 +0,0 @@ -From a1d263fc8bc5aa87a9287b7d5a5fb717a1556bc5 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Tue, 15 Feb 2022 11:49:49 +0800 -Subject: [PATCH 56/64] uadk: optimize algorithm initialization - -malloc and memset can be replaced by calloc. - -Signed-off-by: Wenkai Lin ---- - wd_aead.c | 3 +-- - wd_dh.c | 4 +--- - wd_digest.c | 4 +--- - wd_ecc.c | 4 +--- - wd_rsa.c | 4 +--- - 5 files changed, 5 insertions(+), 14 deletions(-) - -diff --git a/wd_aead.c b/wd_aead.c -index 82a1f97..d8581db 100644 ---- a/wd_aead.c -+++ b/wd_aead.c -@@ -441,12 +441,11 @@ int wd_aead_init(struct wd_ctx_config *config, struct wd_sched *sched) - } - - /* init ctx related resources in specific driver */ -- priv = malloc(wd_aead_setting.driver->drv_ctx_size); -+ priv = calloc(1, wd_aead_setting.driver->drv_ctx_size); - if (!priv) { - ret = -WD_ENOMEM; - goto out_priv; - } -- memset(priv, 0, wd_aead_setting.driver->drv_ctx_size); - wd_aead_setting.priv = priv; - - ret = wd_aead_setting.driver->init(&wd_aead_setting.config, priv); -diff --git a/wd_dh.c b/wd_dh.c -index 1784099..b361d5d 100644 ---- a/wd_dh.c -+++ b/wd_dh.c -@@ -127,14 +127,12 @@ int wd_dh_init(struct wd_ctx_config *config, struct wd_sched *sched) - } - - /* initialize ctx related resources in specific driver */ -- priv = malloc(wd_dh_setting.driver->drv_ctx_size); -+ priv = calloc(1, wd_dh_setting.driver->drv_ctx_size); - if (!priv) { -- WD_ERR("failed to calloc drv ctx\n"); - ret = -WD_ENOMEM; - goto out_priv; - } - -- memset(priv, 0, wd_dh_setting.driver->drv_ctx_size); - wd_dh_setting.priv = priv; - ret = wd_dh_setting.driver->init(&wd_dh_setting.config, priv, - wd_dh_setting.driver->alg_name); -diff --git a/wd_digest.c b/wd_digest.c -index d4e710d..1c05851 100644 ---- a/wd_digest.c -+++ b/wd_digest.c -@@ -203,13 +203,11 @@ int wd_digest_init(struct wd_ctx_config *config, struct wd_sched *sched) - } - - /* init ctx related resources in specific driver */ -- priv = malloc(wd_digest_setting.driver->drv_ctx_size); -+ priv = calloc(1, wd_digest_setting.driver->drv_ctx_size); - if (!priv) { -- WD_ERR("failed to alloc digest driver ctx!\n"); - ret = -WD_ENOMEM; - goto out_priv; - } -- memset(priv, 0, wd_digest_setting.driver->drv_ctx_size); - wd_digest_setting.priv = priv; - - ret = wd_digest_setting.driver->init(&wd_digest_setting.config, priv); -diff --git a/wd_ecc.c b/wd_ecc.c -index e324473..89566ea 100644 ---- a/wd_ecc.c -+++ b/wd_ecc.c -@@ -181,14 +181,12 @@ int wd_ecc_init(struct wd_ctx_config *config, struct wd_sched *sched) - } - - /* initialize ctx related resources in specific driver */ -- priv = malloc(wd_ecc_setting.driver->drv_ctx_size); -+ priv = calloc(1, wd_ecc_setting.driver->drv_ctx_size); - if (!priv) { -- WD_ERR("failed to calloc drv ctx\n"); - ret = -WD_ENOMEM; - goto out_priv; - } - -- memset(priv, 0, wd_ecc_setting.driver->drv_ctx_size); - wd_ecc_setting.priv = priv; - ret = wd_ecc_setting.driver->init(&wd_ecc_setting.config, priv, - wd_ecc_setting.driver->alg_name); -diff --git a/wd_rsa.c b/wd_rsa.c -index 1f911b4..2e61927 100644 ---- a/wd_rsa.c -+++ b/wd_rsa.c -@@ -167,14 +167,12 @@ int wd_rsa_init(struct wd_ctx_config *config, struct wd_sched *sched) - } - - /* initialize ctx related resources in specific driver */ -- priv = malloc(wd_rsa_setting.driver->drv_ctx_size); -+ priv = calloc(1, wd_rsa_setting.driver->drv_ctx_size); - if (!priv) { -- WD_ERR("failed to calloc drv ctx\n"); - ret = -WD_ENOMEM; - goto out_priv; - } - -- memset(priv, 0, wd_rsa_setting.driver->drv_ctx_size); - wd_rsa_setting.priv = priv; - ret = wd_rsa_setting.driver->init(&wd_rsa_setting.config, priv, - wd_rsa_setting.driver->alg_name); --- -2.25.1 - diff --git a/0053-uadk-fix-send-exception-handling.patch b/0053-uadk-fix-send-exception-handling.patch deleted file mode 100644 index 89a1106..0000000 --- a/0053-uadk-fix-send-exception-handling.patch +++ /dev/null @@ -1,135 +0,0 @@ -From b2bcc88b513328491a0f02700b926678e63c944b Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Tue, 15 Feb 2022 11:49:50 +0800 -Subject: [PATCH 57/64] uadk: fix send exception handling - -when qm send message failed, uadk should return immediately -instead of enable interrupt. - -Signed-off-by: Wenkai Lin ---- - drv/hisi_comp.c | 10 +++++++--- - drv/hisi_sec.c | 24 ++++++++++++++++++------ - 2 files changed, 25 insertions(+), 9 deletions(-) - -diff --git a/drv/hisi_comp.c b/drv/hisi_comp.c -index e0e913d..5ea5dc3 100644 ---- a/drv/hisi_comp.c -+++ b/drv/hisi_comp.c -@@ -945,12 +945,16 @@ static int hisi_zip_comp_send(handle_t ctx, struct wd_comp_msg *msg, void *priv) - return ret; - } - ret = hisi_qm_send(h_qp, &sqe, 1, &count); -- if (ret < 0 && ret != -WD_EBUSY) -- WD_ERR("qm send is err(%d)!\n", ret); -+ if (ret < 0) { -+ if (ret != -WD_EBUSY) -+ WD_ERR("qm send is err(%d)!\n", ret); -+ -+ return ret; -+ } - - hisi_qm_enable_interrupt(ctx, msg->is_polled); - -- return ret; -+ return 0; - } - - static int get_alg_type(__u32 type) -diff --git a/drv/hisi_sec.c b/drv/hisi_sec.c -index 61e0698..338823b 100644 ---- a/drv/hisi_sec.c -+++ b/drv/hisi_sec.c -@@ -946,11 +946,13 @@ int hisi_sec_cipher_send(handle_t ctx, struct wd_cipher_msg *msg) - - if (msg->data_fmt == WD_SGL_BUF) - hisi_sec_put_sgl(h_qp, msg->alg_type, msg->in, msg->out); -+ -+ return ret; - } - - hisi_qm_enable_interrupt(ctx, msg->is_polled); - -- return ret; -+ return 0; - } - - int hisi_sec_cipher_recv(handle_t ctx, struct wd_cipher_msg *recv_msg) -@@ -1147,11 +1149,13 @@ int hisi_sec_cipher_send_v3(handle_t ctx, struct wd_cipher_msg *msg) - - if (msg->data_fmt == WD_SGL_BUF) - hisi_sec_put_sgl(h_qp, msg->alg_type, msg->in, msg->out); -+ -+ return ret; - } - - hisi_qm_enable_interrupt(ctx, msg->is_polled); - -- return ret; -+ return 0; - } - - static void parse_cipher_bd3(struct hisi_sec_sqe3 *sqe, struct wd_cipher_msg *recv_msg) -@@ -1388,11 +1392,13 @@ int hisi_sec_digest_send(handle_t ctx, struct wd_digest_msg *msg) - - if (msg->data_fmt == WD_SGL_BUF) - hisi_sec_put_sgl(h_qp, msg->alg_type, msg->in, msg->out); -+ -+ return ret; - } - - hisi_qm_enable_interrupt(ctx, msg->is_polled); - -- return ret; -+ return 0; - } - - int hisi_sec_digest_recv(handle_t ctx, struct wd_digest_msg *recv_msg) -@@ -1544,11 +1550,13 @@ int hisi_sec_digest_send_v3(handle_t ctx, struct wd_digest_msg *msg) - - if (msg->data_fmt == WD_SGL_BUF) - hisi_sec_put_sgl(h_qp, msg->alg_type, msg->in, msg->out); -+ -+ return ret; - } - - hisi_qm_enable_interrupt(ctx, msg->is_polled); - -- return ret; -+ return 0; - } - - static void parse_digest_bd3(struct hisi_sec_sqe3 *sqe, -@@ -1887,11 +1895,13 @@ int hisi_sec_aead_send(handle_t ctx, struct wd_aead_msg *msg) - - if (msg->data_fmt == WD_SGL_BUF) - hisi_sec_put_sgl(h_qp, msg->alg_type, msg->in, msg->out); -+ -+ return ret; - } - - hisi_qm_enable_interrupt(ctx, msg->is_polled); - -- return ret; -+ return 0; - } - - static void parse_aead_bd2(struct hisi_sec_sqe *sqe, -@@ -2152,11 +2162,13 @@ int hisi_sec_aead_send_v3(handle_t ctx, struct wd_aead_msg *msg) - - if (msg->data_fmt == WD_SGL_BUF) - hisi_sec_put_sgl(h_qp, msg->alg_type, msg->in, msg->out); -+ -+ return ret; - } - - hisi_qm_enable_interrupt(ctx, msg->is_polled); - -- return ret; -+ return 0; - } - - static void parse_aead_bd3(struct hisi_sec_sqe3 *sqe, --- -2.25.1 - diff --git a/0054-uadk-sec-fix-hisi_sec_digest_send.patch b/0054-uadk-sec-fix-hisi_sec_digest_send.patch deleted file mode 100644 index d73fd6f..0000000 --- a/0054-uadk-sec-fix-hisi_sec_digest_send.patch +++ /dev/null @@ -1,165 +0,0 @@ -From c7d657b037cb9a37daaa3df79ac806e6ac1d4fa2 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Tue, 15 Feb 2022 11:49:51 +0800 -Subject: [PATCH 58/64] uadk: sec: fix hisi_sec_digest_send - -When digest send a sgl format message, it will use -hisi_sec_fill_sgl to get sgl memory from sgl memory pool, -when send message exit abnormally, sgl should be put back. - -Signed-off-by: Wenkai Lin ---- - drv/hisi_sec.c | 58 +++++++++++++++++++++----------------------------- - 1 file changed, 24 insertions(+), 34 deletions(-) - -diff --git a/drv/hisi_sec.c b/drv/hisi_sec.c -index 338823b..7f5aae2 100644 ---- a/drv/hisi_sec.c -+++ b/drv/hisi_sec.c -@@ -929,10 +929,8 @@ int hisi_sec_cipher_send(handle_t ctx, struct wd_cipher_msg *msg) - if (msg->data_fmt == WD_SGL_BUF) { - ret = hisi_sec_fill_sgl(h_qp, &msg->in, &msg->out, &sqe, - msg->alg_type); -- if (ret) { -- WD_ERR("failed to get sgl!\n"); -+ if (ret) - return ret; -- } - } - - sqe.type2.clen_ivhlen |= (__u32)msg->in_bytes; -@@ -1132,10 +1130,8 @@ int hisi_sec_cipher_send_v3(handle_t ctx, struct wd_cipher_msg *msg) - if (msg->data_fmt == WD_SGL_BUF) { - ret = hisi_sec_fill_sgl_v3(h_qp, &msg->in, &msg->out, &sqe, - msg->alg_type); -- if (ret) { -- WD_ERR("failed to get sgl!\n"); -+ if (ret) - return ret; -- } - } - - sqe.c_len_ivin = (__u32)msg->in_bytes; -@@ -1360,10 +1356,8 @@ int hisi_sec_digest_send(handle_t ctx, struct wd_digest_msg *msg) - if (msg->data_fmt == WD_SGL_BUF) { - ret = hisi_sec_fill_sgl(h_qp, &msg->in, &msg->out, &sqe, - msg->alg_type); -- if (ret) { -- WD_ERR("failed to get sgl!\n"); -+ if (ret) - return ret; -- } - } - - sqe.sds_sa_type |= (__u8)(de | scene); -@@ -1372,10 +1366,8 @@ int hisi_sec_digest_send(handle_t ctx, struct wd_digest_msg *msg) - sqe.type2.mac_addr = (__u64)(uintptr_t)msg->out; - - ret = fill_digest_bd2_alg(msg, &sqe); -- if (ret) { -- WD_ERR("failed to fill digest bd alg!\n"); -- return ret; -- } -+ if (ret) -+ goto put_sgl; - - qm_fill_digest_long_bd(msg, &sqe); - -@@ -1390,15 +1382,18 @@ int hisi_sec_digest_send(handle_t ctx, struct wd_digest_msg *msg) - if (ret != -WD_EBUSY) - WD_ERR("digest send sqe is err(%d)!\n", ret); - -- if (msg->data_fmt == WD_SGL_BUF) -- hisi_sec_put_sgl(h_qp, msg->alg_type, msg->in, msg->out); -- -- return ret; -+ goto put_sgl; - } - - hisi_qm_enable_interrupt(ctx, msg->is_polled); - - return 0; -+ -+put_sgl: -+ if (msg->data_fmt == WD_SGL_BUF) -+ hisi_sec_put_sgl(h_qp, msg->alg_type, msg->in, msg->out); -+ -+ return ret; - } - - int hisi_sec_digest_recv(handle_t ctx, struct wd_digest_msg *recv_msg) -@@ -1517,10 +1512,8 @@ int hisi_sec_digest_send_v3(handle_t ctx, struct wd_digest_msg *msg) - if (msg->data_fmt == WD_SGL_BUF) { - ret = hisi_sec_fill_sgl_v3(h_qp, &msg->in, &msg->out, &sqe, - msg->alg_type); -- if (ret) { -- WD_ERR("failed to get sgl!\n"); -+ if (ret) - return ret; -- } - } - - sqe.bd_param |= (__u16)(de | scene); -@@ -1529,10 +1522,8 @@ int hisi_sec_digest_send_v3(handle_t ctx, struct wd_digest_msg *msg) - sqe.mac_addr = (__u64)(uintptr_t)msg->out; - - ret = fill_digest_bd3_alg(msg, &sqe); -- if (ret) { -- WD_ERR("failed to fill digest bd alg!\n"); -- return ret; -- } -+ if (ret) -+ goto put_sgl; - - qm_fill_digest_long_bd3(msg, &sqe); - -@@ -1548,15 +1539,18 @@ int hisi_sec_digest_send_v3(handle_t ctx, struct wd_digest_msg *msg) - if (ret != -WD_EBUSY) - WD_ERR("digest send sqe is err(%d)!\n", ret); - -- if (msg->data_fmt == WD_SGL_BUF) -- hisi_sec_put_sgl(h_qp, msg->alg_type, msg->in, msg->out); -- -- return ret; -+ goto put_sgl; - } - - hisi_qm_enable_interrupt(ctx, msg->is_polled); - - return 0; -+ -+put_sgl: -+ if (msg->data_fmt == WD_SGL_BUF) -+ hisi_sec_put_sgl(h_qp, msg->alg_type, msg->in, msg->out); -+ -+ return ret; - } - - static void parse_digest_bd3(struct hisi_sec_sqe3 *sqe, -@@ -1873,10 +1867,8 @@ int hisi_sec_aead_send(handle_t ctx, struct wd_aead_msg *msg) - - if (msg->data_fmt == WD_SGL_BUF) { - ret = hisi_sec_fill_sgl(h_qp, &msg->in, &msg->out, &sqe, msg->alg_type); -- if (ret) { -- WD_ERR("failed to get sgl!\n"); -+ if (ret) - return ret; -- } - } - - fill_aead_bd2_addr(msg, &sqe); -@@ -2141,10 +2133,8 @@ int hisi_sec_aead_send_v3(handle_t ctx, struct wd_aead_msg *msg) - if (msg->data_fmt == WD_SGL_BUF) { - ret = hisi_sec_fill_sgl_v3(h_qp, &msg->in, &msg->out, &sqe, - msg->alg_type); -- if (ret) { -- WD_ERR("failed to get sgl!\n"); -+ if (ret) - return ret; -- } - } - - fill_aead_bd3_addr(msg, &sqe); --- -2.25.1 - diff --git a/0055-uadk-sec-some-clean-code.patch b/0055-uadk-sec-some-clean-code.patch deleted file mode 100644 index f205a3f..0000000 --- a/0055-uadk-sec-some-clean-code.patch +++ /dev/null @@ -1,606 +0,0 @@ -From 42055f42381b51428be8138042f2a7b6b9964c10 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Tue, 15 Feb 2022 11:49:52 +0800 -Subject: [PATCH 59/64] uadk: sec: some clean code - -The number of characters in a single line exceeds 80 and -WD_ERR's line change is not aligned. - -Signed-off-by: Wenkai Lin ---- - drv/hisi_sec.c | 175 ++++++++++++++++++++++++++++--------------------- - 1 file changed, 102 insertions(+), 73 deletions(-) - -diff --git a/drv/hisi_sec.c b/drv/hisi_sec.c -index 7f5aae2..264d850 100644 ---- a/drv/hisi_sec.c -+++ b/drv/hisi_sec.c -@@ -547,18 +547,24 @@ static void update_iv_sgl(struct wd_cipher_msg *msg) - case WD_CIPHER_CBC: - if (msg->op_type == WD_CIPHER_ENCRYPTION && - msg->out_bytes >= msg->iv_bytes) -- hisi_qm_sgl_copy(msg->iv, msg->out, msg->out_bytes - -- msg->iv_bytes, msg->iv_bytes, COPY_SGL_TO_PBUFF); -+ hisi_qm_sgl_copy(msg->iv, msg->out, -+ msg->out_bytes - msg->iv_bytes, -+ msg->iv_bytes, COPY_SGL_TO_PBUFF); -+ - if (msg->op_type == WD_CIPHER_DECRYPTION && - msg->in_bytes >= msg->iv_bytes) -- hisi_qm_sgl_copy(msg->iv, msg->in, msg->in_bytes - -- msg->iv_bytes, msg->iv_bytes, COPY_SGL_TO_PBUFF); -+ hisi_qm_sgl_copy(msg->iv, msg->in, -+ msg->in_bytes - msg->iv_bytes, -+ msg->iv_bytes, COPY_SGL_TO_PBUFF); -+ - break; - case WD_CIPHER_OFB: - case WD_CIPHER_CFB: - if (msg->out_bytes >= msg->iv_bytes) -- hisi_qm_sgl_copy(msg->iv, msg->out, msg->out_bytes - -- msg->iv_bytes, msg->iv_bytes, COPY_SGL_TO_PBUFF); -+ hisi_qm_sgl_copy(msg->iv, msg->out, -+ msg->out_bytes - msg->iv_bytes, -+ msg->iv_bytes, COPY_SGL_TO_PBUFF); -+ - break; - case WD_CIPHER_CTR: - ctr_iv_inc(msg->iv, msg->iv_bytes >> -@@ -576,7 +582,8 @@ static int get_3des_c_key_len(struct wd_cipher_msg *msg, __u8 *c_key_len) - } else if (msg->key_bytes == SEC_3DES_3KEY_SIZE) { - *c_key_len = CKEY_LEN_3DES_3KEY; - } else { -- WD_ERR("invalid 3des key size, size = %u\n", msg->key_bytes); -+ WD_ERR("failed to check 3des key size, size = %u\n", -+ msg->key_bytes); - return -WD_EINVAL; - } - -@@ -602,14 +609,15 @@ static int get_aes_c_key_len(struct wd_cipher_msg *msg, __u8 *c_key_len) - *c_key_len = CKEY_LEN_256BIT; - break; - default: -- WD_ERR("invalid AES key size, size = %u\n", len); -+ WD_ERR("failed to check AES key size, size = %u\n", len); - return -WD_EINVAL; - } - - return 0; - } - --static int fill_cipher_bd2_alg(struct wd_cipher_msg *msg, struct hisi_sec_sqe *sqe) -+static int fill_cipher_bd2_alg(struct wd_cipher_msg *msg, -+ struct hisi_sec_sqe *sqe) - { - __u8 c_key_len = 0; - int ret = 0; -@@ -634,14 +642,15 @@ static int fill_cipher_bd2_alg(struct wd_cipher_msg *msg, struct hisi_sec_sqe *s - sqe->type2.icvw_kmode = (__u16)c_key_len << SEC_CKEY_OFFSET; - break; - default: -- WD_ERR("invalid cipher alg type, alg = %u\n", msg->alg); -+ WD_ERR("failed to check cipher alg type, alg = %u\n", msg->alg); - return -WD_EINVAL; - } - - return ret; - } - --static int fill_cipher_bd2_mode(struct wd_cipher_msg *msg, struct hisi_sec_sqe *sqe) -+static int fill_cipher_bd2_mode(struct wd_cipher_msg *msg, -+ struct hisi_sec_sqe *sqe) - { - __u16 c_mode; - -@@ -660,7 +669,8 @@ static int fill_cipher_bd2_mode(struct wd_cipher_msg *msg, struct hisi_sec_sqe * - c_mode = C_MODE_XTS; - break; - default: -- WD_ERR("invalid cipher mode type, mode = %u\n", msg->mode); -+ WD_ERR("failed to check cipher mode type, mode = %u\n", -+ msg->mode); - return -WD_EINVAL; - } - sqe->type2.icvw_kmode |= (__u16)(c_mode) << SEC_CMODE_OFFSET; -@@ -668,7 +678,8 @@ static int fill_cipher_bd2_mode(struct wd_cipher_msg *msg, struct hisi_sec_sqe * - return 0; - } - --static void fill_cipher_bd2_addr(struct wd_cipher_msg *msg, struct hisi_sec_sqe *sqe) -+static void fill_cipher_bd2_addr(struct wd_cipher_msg *msg, -+ struct hisi_sec_sqe *sqe) - { - sqe->type2.data_src_addr = (__u64)(uintptr_t)msg->in; - sqe->type2.data_dst_addr = (__u64)(uintptr_t)msg->out; -@@ -688,7 +699,8 @@ static void fill_cipher_bd2_addr(struct wd_cipher_msg *msg, struct hisi_sec_sqe - sqe->type2.mac_addr = (__u64)(uintptr_t)msg; - } - --static void parse_cipher_bd2(struct hisi_sec_sqe *sqe, struct wd_cipher_msg *recv_msg) -+static void parse_cipher_bd2(struct hisi_sec_sqe *sqe, -+ struct wd_cipher_msg *recv_msg) - { - struct wd_cipher_msg *rmsg; - __u16 done; -@@ -696,7 +708,7 @@ static void parse_cipher_bd2(struct hisi_sec_sqe *sqe, struct wd_cipher_msg *rec - done = sqe->type2.done_flag & SEC_DONE_MASK; - if (done != SEC_HW_TASK_DONE || sqe->type2.error_type) { - WD_ERR("SEC BD %s fail! done=0x%x, etype=0x%x\n", "cipher", -- done, sqe->type2.error_type); -+ done, sqe->type2.error_type); - recv_msg->result = WD_IN_EPARA; - } else { - recv_msg->result = WD_SUCCESS; -@@ -720,7 +732,7 @@ static int cipher_len_check(struct wd_cipher_msg *msg) - if (msg->in_bytes > MAX_INPUT_DATA_LEN || - !msg->in_bytes) { - WD_ERR("input cipher length is error, size = %u\n", -- msg->in_bytes); -+ msg->in_bytes); - return -WD_EINVAL; - } - -@@ -732,7 +744,7 @@ static int cipher_len_check(struct wd_cipher_msg *msg) - if (msg->mode == WD_CIPHER_XTS) { - if (msg->in_bytes < AES_BLOCK_SIZE) { - WD_ERR("input cipher length is too small, size = %u\n", -- msg->in_bytes); -+ msg->in_bytes); - return -WD_EINVAL; - } - return 0; -@@ -740,15 +752,15 @@ static int cipher_len_check(struct wd_cipher_msg *msg) - - if (msg->alg == WD_CIPHER_3DES || msg->alg == WD_CIPHER_DES) { - if (msg->in_bytes & (DES3_BLOCK_SIZE - 1)) { -- WD_ERR("input 3DES or DES cipher parameter is error, size = %u\n", -- msg->in_bytes); -+ WD_ERR("failed to check input bytes of 3DES or DES, size = %u\n", -+ msg->in_bytes); - return -WD_EINVAL; - } - return 0; - } else if (msg->alg == WD_CIPHER_AES || msg->alg == WD_CIPHER_SM4) { - if (msg->in_bytes & (AES_BLOCK_SIZE - 1)) { -- WD_ERR("input AES or SM4 cipher parameter is error, size = %u\n", -- msg->in_bytes); -+ WD_ERR("failed to check input bytes of AES or SM4, size = %u\n", -+ msg->in_bytes); - return -WD_EINVAL; - } - return 0; -@@ -802,7 +814,7 @@ static int hisi_sec_fill_sgl(handle_t h_qp, __u8 **in, __u8 **out, - return -WD_EINVAL; - } - -- hw_sgl_in = hisi_qm_get_hw_sgl(h_sgl_pool, (struct wd_datalist*)(*in)); -+ hw_sgl_in = hisi_qm_get_hw_sgl(h_sgl_pool, (struct wd_datalist *)(*in)); - if (!hw_sgl_in) { - WD_ERR("failed to get sgl in for hw_v2!\n"); - return -WD_EINVAL; -@@ -811,9 +823,10 @@ static int hisi_sec_fill_sgl(handle_t h_qp, __u8 **in, __u8 **out, - if (type == WD_DIGEST) { - hw_sgl_out = *out; - } else { -- hw_sgl_out = hisi_qm_get_hw_sgl(h_sgl_pool, (struct wd_datalist*)(*out)); -+ hw_sgl_out = hisi_qm_get_hw_sgl(h_sgl_pool, -+ (struct wd_datalist *)(*out)); - if (!hw_sgl_out) { -- WD_ERR("failed to get hw sgl out!\n"); -+ WD_ERR("failed to get hw sgl out for hw_v2!\n"); - hisi_qm_put_hw_sgl(h_sgl_pool, hw_sgl_in); - return -WD_EINVAL; - } -@@ -841,7 +854,7 @@ static int hisi_sec_fill_sgl_v3(handle_t h_qp, __u8 **in, __u8 **out, - return -WD_EINVAL; - } - -- hw_sgl_in = hisi_qm_get_hw_sgl(h_sgl_pool, (struct wd_datalist*)(*in)); -+ hw_sgl_in = hisi_qm_get_hw_sgl(h_sgl_pool, (struct wd_datalist *)(*in)); - if (!hw_sgl_in) { - WD_ERR("failed to get sgl in for hw_v3!\n"); - return -WD_EINVAL; -@@ -851,9 +864,10 @@ static int hisi_sec_fill_sgl_v3(handle_t h_qp, __u8 **in, __u8 **out, - hw_sgl_out = *out; - sqe->bd_param |= SEC_PBUFF_MODE_MASK_V3; - } else { -- hw_sgl_out = hisi_qm_get_hw_sgl(h_sgl_pool, (struct wd_datalist*)(*out)); -+ hw_sgl_out = hisi_qm_get_hw_sgl(h_sgl_pool, -+ (struct wd_datalist *)(*out)); - if (!hw_sgl_out) { -- WD_ERR("failed to get hw sgl out!\n"); -+ WD_ERR("failed to get hw sgl out for hw_v3!\n"); - hisi_qm_put_hw_sgl(h_sgl_pool, hw_sgl_in); - return -WD_EINVAL; - } -@@ -943,7 +957,8 @@ int hisi_sec_cipher_send(handle_t ctx, struct wd_cipher_msg *msg) - WD_ERR("cipher send sqe is err(%d)!\n", ret); - - if (msg->data_fmt == WD_SGL_BUF) -- hisi_sec_put_sgl(h_qp, msg->alg_type, msg->in, msg->out); -+ hisi_sec_put_sgl(h_qp, msg->alg_type, msg->in, -+ msg->out); - - return ret; - } -@@ -969,7 +984,7 @@ int hisi_sec_cipher_recv(handle_t ctx, struct wd_cipher_msg *recv_msg) - - if (recv_msg->data_fmt == WD_SGL_BUF) - hisi_sec_put_sgl(h_qp, recv_msg->alg_type, recv_msg->in, -- recv_msg->out); -+ recv_msg->out); - - return 0; - } -@@ -1010,7 +1025,7 @@ static int fill_cipher_bd3_alg(struct wd_cipher_msg *msg, - sqe->c_icv_key |= (__u16)c_key_len << SEC_CKEY_OFFSET_V3; - break; - default: -- WD_ERR("invalid cipher alg type, alg = %u\n", msg->alg); -+ WD_ERR("failed to check cipher alg type, alg = %u\n", msg->alg); - return -WD_EINVAL; - } - -@@ -1045,7 +1060,8 @@ static int fill_cipher_bd3_mode(struct wd_cipher_msg *msg, - c_mode = C_MODE_CFB; - break; - default: -- WD_ERR("invalid cipher mode type, mode = %u\n", msg->mode); -+ WD_ERR("failed to check cipher mode type, mode = %u\n", -+ msg->mode); - return -WD_EINVAL; - } - sqe->c_mode_alg |= (__u16)c_mode; -@@ -1144,7 +1160,8 @@ int hisi_sec_cipher_send_v3(handle_t ctx, struct wd_cipher_msg *msg) - WD_ERR("cipher send sqe is err(%d)!\n", ret); - - if (msg->data_fmt == WD_SGL_BUF) -- hisi_sec_put_sgl(h_qp, msg->alg_type, msg->in, msg->out); -+ hisi_sec_put_sgl(h_qp, msg->alg_type, msg->in, -+ msg->out); - - return ret; - } -@@ -1154,7 +1171,8 @@ int hisi_sec_cipher_send_v3(handle_t ctx, struct wd_cipher_msg *msg) - return 0; - } - --static void parse_cipher_bd3(struct hisi_sec_sqe3 *sqe, struct wd_cipher_msg *recv_msg) -+static void parse_cipher_bd3(struct hisi_sec_sqe3 *sqe, -+ struct wd_cipher_msg *recv_msg) - { - struct wd_cipher_msg *rmsg; - __u16 done; -@@ -1162,7 +1180,7 @@ static void parse_cipher_bd3(struct hisi_sec_sqe3 *sqe, struct wd_cipher_msg *re - done = sqe->done_flag & SEC_DONE_MASK; - if (done != SEC_HW_TASK_DONE || sqe->error_type) { - WD_ERR("SEC BD3 %s fail! done=0x%x, etype=0x%x\n", "cipher", -- done, sqe->error_type); -+ done, sqe->error_type); - recv_msg->result = WD_IN_EPARA; - } else { - recv_msg->result = WD_SUCCESS; -@@ -1205,7 +1223,7 @@ static int fill_digest_bd2_alg(struct wd_digest_msg *msg, - struct hisi_sec_sqe *sqe) - { - if (msg->alg >= WD_DIGEST_TYPE_MAX) { -- WD_ERR("invalid digest alg type, alg = %u\n", msg->alg); -+ WD_ERR("failed to check digest alg type, alg = %u\n", msg->alg); - return -WD_EINVAL; - } - -@@ -1215,8 +1233,8 @@ static int fill_digest_bd2_alg(struct wd_digest_msg *msg, - (__u32)g_digest_a_alg[msg->alg] << AUTH_ALG_OFFSET; - else if (msg->mode == WD_DIGEST_HMAC) { - if (msg->key_bytes & WORD_ALIGNMENT_MASK) { -- WD_ERR("invalid digest key_bytes, size = %u\n", -- msg->key_bytes); -+ WD_ERR("failed to check digest key_bytes, size = %u\n", -+ msg->key_bytes); - return -WD_EINVAL; - } - sqe->type2.mac_key_alg |= (__u32)(msg->key_bytes / -@@ -1226,7 +1244,7 @@ static int fill_digest_bd2_alg(struct wd_digest_msg *msg, - sqe->type2.mac_key_alg |= - (__u32)g_hmac_a_alg[msg->alg] << AUTH_ALG_OFFSET; - } else { -- WD_ERR("invalid digest mode, mode = %u\n", msg->mode); -+ WD_ERR("failed to check digest mode, mode = %u\n", msg->mode); - return -WD_EINVAL; - } - -@@ -1238,7 +1256,7 @@ static void qm_fill_digest_long_bd(struct wd_digest_msg *msg, - { - __u64 total_bits; - -- if (msg->has_next && (msg->iv_bytes == 0)) { -+ if (msg->has_next && !msg->iv_bytes) { - /* LONG BD FIRST */ - sqe->ai_apd_cs = AI_GEN_INNER; - sqe->ai_apd_cs |= AUTHPAD_NOPAD << AUTHPAD_OFFSET; -@@ -1257,14 +1275,15 @@ static void qm_fill_digest_long_bd(struct wd_digest_msg *msg, - } - } - --static void parse_digest_bd2(struct hisi_sec_sqe *sqe, struct wd_digest_msg *recv_msg) -+static void parse_digest_bd2(struct hisi_sec_sqe *sqe, -+ struct wd_digest_msg *recv_msg) - { - __u16 done; - - done = sqe->type2.done_flag & SEC_DONE_MASK; - if (done != SEC_HW_TASK_DONE || sqe->type2.error_type) { - WD_ERR("SEC BD %s fail! done=0x%x, etype=0x%x\n", "digest", -- done, sqe->type2.error_type); -+ done, sqe->type2.error_type); - recv_msg->result = WD_IN_EPARA; - } else { - recv_msg->result = WD_SUCCESS; -@@ -1284,9 +1303,12 @@ static void parse_digest_bd2(struct hisi_sec_sqe *sqe, struct wd_digest_msg *rec - - static int digest_long_bd_check(struct wd_digest_msg *msg) - { -- if (msg->alg >= WD_DIGEST_SHA512 && msg->in_bytes & (SHA512_ALIGN_SZ - 1)) -- return -WD_EINVAL; -- else if (msg->in_bytes & (SHA1_ALIGN_SZ - 1)) -+ __u32 alg_align_sz; -+ -+ alg_align_sz = msg->alg >= WD_DIGEST_SHA512 ? -+ SHA512_ALIGN_SZ - 1 : SHA1_ALIGN_SZ - 1; -+ -+ if (msg->in_bytes & alg_align_sz) - return -WD_EINVAL; - - return 0; -@@ -1297,20 +1319,20 @@ static int digest_len_check(struct wd_digest_msg *msg, enum sec_bd_type type) - int ret; - - /* End BD not need to check the input zero bytes */ -- if (unlikely(type == BD_TYPE2 && (!msg->has_next && msg->in_bytes == 0))) { -+ if (unlikely(type == BD_TYPE2 && !msg->has_next && !msg->in_bytes)) { - WD_ERR("kunpeng 920, digest mode not support 0 size!\n"); - return -WD_EINVAL; - } - - if (unlikely(msg->in_bytes > MAX_INPUT_DATA_LEN)) { - WD_ERR("digest input length is too long, size = %u\n", -- msg->in_bytes); -+ msg->in_bytes); - return -WD_EINVAL; - } - - if (unlikely(msg->out_bytes & WORD_ALIGNMENT_MASK)) { - WD_ERR("digest out length is error, size = %u\n", -- msg->out_bytes); -+ msg->out_bytes); - return -WD_EINVAL; - } - -@@ -1318,7 +1340,7 @@ static int digest_len_check(struct wd_digest_msg *msg, enum sec_bd_type type) - ret = digest_long_bd_check(msg); - if (ret) { - WD_ERR("input data isn't aligned, size = %u\n", -- msg->in_bytes); -+ msg->in_bytes); - return -WD_EINVAL; - } - } -@@ -1430,7 +1452,7 @@ static int fill_digest_bd3_alg(struct wd_digest_msg *msg, - struct hisi_sec_sqe3 *sqe) - { - if (msg->alg >= WD_DIGEST_TYPE_MAX) { -- WD_ERR("invalid digest type, alg = %u\n", msg->alg); -+ WD_ERR("failed to check digest type, alg = %u\n", msg->alg); - return -WD_EINVAL; - } - -@@ -1441,8 +1463,8 @@ static int fill_digest_bd3_alg(struct wd_digest_msg *msg, - (__u32)g_digest_a_alg[msg->alg] << SEC_AUTH_ALG_OFFSET_V3; - } else if (msg->mode == WD_DIGEST_HMAC) { - if (msg->key_bytes & WORD_ALIGNMENT_MASK) { -- WD_ERR("invalid digest key_bytes, size = %u\n", -- msg->key_bytes); -+ WD_ERR("failed to check digest key bytes, size = %u\n", -+ msg->key_bytes); - return -WD_EINVAL; - } - sqe->auth_mac_key |= (__u32)(msg->key_bytes / -@@ -1451,7 +1473,7 @@ static int fill_digest_bd3_alg(struct wd_digest_msg *msg, - sqe->auth_mac_key |= - (__u32)g_hmac_a_alg[msg->alg] << SEC_AUTH_ALG_OFFSET_V3; - } else { -- WD_ERR("invalid digest mode, mode = %u\n", msg->mode); -+ WD_ERR("failed to check digest mode, mode = %u\n", msg->mode); - return -WD_EINVAL; - } - -@@ -1463,7 +1485,7 @@ static void qm_fill_digest_long_bd3(struct wd_digest_msg *msg, - { - __u64 total_bits; - -- if (msg->has_next && (msg->iv_bytes == 0)) { -+ if (msg->has_next && !msg->iv_bytes) { - /* LONG BD FIRST */ - sqe->auth_mac_key |= AI_GEN_INNER << SEC_AI_GEN_OFFSET_V3; - sqe->stream_scene.stream_auth_pad = AUTHPAD_NOPAD; -@@ -1561,7 +1583,7 @@ static void parse_digest_bd3(struct hisi_sec_sqe3 *sqe, - done = sqe->done_flag & SEC_DONE_MASK; - if (done != SEC_HW_TASK_DONE || sqe->error_type) { - WD_ERR("SEC BD3 %s fail! done=0x%x, etype=0x%x\n", "digest", -- done, sqe->error_type); -+ done, sqe->error_type); - recv_msg->result = WD_IN_EPARA; - } else { - recv_msg->result = WD_SUCCESS; -@@ -1613,7 +1635,7 @@ static int aead_get_aes_key_len(struct wd_aead_msg *msg, __u8 *key_len) - break; - default: - WD_ERR("failed to check AES key size, size = %u\n", -- msg->ckey_bytes); -+ msg->ckey_bytes); - return -WD_EINVAL; - } - -@@ -1624,7 +1646,7 @@ static int aead_bd_msg_check(struct wd_aead_msg *msg) - { - if (unlikely(msg->akey_bytes & WORD_ALIGNMENT_MASK)) { - WD_ERR("failed to check aead auth key bytes, size = %u\n", -- msg->akey_bytes); -+ msg->akey_bytes); - return -WD_EINVAL; - } - -@@ -1645,7 +1667,8 @@ static int fill_aead_bd2_alg(struct wd_aead_msg *msg, - sqe->type2.icvw_kmode = (__u16)c_key_len << SEC_CKEY_OFFSET; - break; - default: -- WD_ERR("failed to check aead calg type, calg = %u\n", msg->calg); -+ WD_ERR("failed to check aead calg type, calg = %u\n", -+ msg->calg); - return -WD_EINVAL; - } - -@@ -1673,7 +1696,8 @@ static int fill_aead_bd2_alg(struct wd_aead_msg *msg, - d_alg = A_ALG_HMAC_SHA512 << AUTH_ALG_OFFSET; - break; - default: -- WD_ERR("failed to check aead dalg type, dalg = %u\n", msg->dalg); -+ WD_ERR("failed to check aead dalg type, dalg = %u\n", -+ msg->dalg); - ret = -WD_EINVAL; - } - sqe->type2.mac_key_alg |= d_alg; -@@ -1704,7 +1728,7 @@ static int fill_aead_bd2_mode(struct wd_aead_msg *msg, - break; - default: - WD_ERR("failed to check aead cmode type, cmode = %u\n", -- msg->cmode); -+ msg->cmode); - return -WD_EINVAL; - } - sqe->type2.icvw_kmode |= (__u16)(c_mode) << SEC_CMODE_OFFSET; -@@ -1778,14 +1802,14 @@ static int aead_len_check(struct wd_aead_msg *msg) - { - if (unlikely(msg->in_bytes + msg->assoc_bytes > MAX_INPUT_DATA_LEN)) { - WD_ERR("aead input data length is too long, size = %u\n", -- msg->in_bytes + msg->assoc_bytes); -+ msg->in_bytes + msg->assoc_bytes); - return -WD_EINVAL; - } - - if (unlikely(msg->cmode == WD_CIPHER_CCM && - msg->assoc_bytes > MAX_CCM_AAD_LEN)) { -- WD_ERR("failed to check ccm aad len, input is too long, size = %u\n", -- msg->assoc_bytes); -+ WD_ERR("aead ccm aad length is too long, size = %u\n", -+ msg->assoc_bytes); - return -WD_EINVAL; - } - -@@ -1851,7 +1875,7 @@ int hisi_sec_aead_send(handle_t ctx, struct wd_aead_msg *msg) - return -WD_EINVAL; - } - -- if (unlikely(msg->cmode != WD_CIPHER_CBC && msg->in_bytes == 0)) { -+ if (unlikely(msg->cmode != WD_CIPHER_CBC && !msg->in_bytes)) { - WD_ERR("ccm or gcm not supports 0 packet size at hw_v2!\n"); - return -WD_EINVAL; - } -@@ -1866,7 +1890,8 @@ int hisi_sec_aead_send(handle_t ctx, struct wd_aead_msg *msg) - return ret; - - if (msg->data_fmt == WD_SGL_BUF) { -- ret = hisi_sec_fill_sgl(h_qp, &msg->in, &msg->out, &sqe, msg->alg_type); -+ ret = hisi_sec_fill_sgl(h_qp, &msg->in, &msg->out, -+ &sqe, msg->alg_type); - if (ret) - return ret; - } -@@ -1886,7 +1911,8 @@ int hisi_sec_aead_send(handle_t ctx, struct wd_aead_msg *msg) - WD_ERR("aead send sqe is err(%d)!\n", ret); - - if (msg->data_fmt == WD_SGL_BUF) -- hisi_sec_put_sgl(h_qp, msg->alg_type, msg->in, msg->out); -+ hisi_sec_put_sgl(h_qp, msg->alg_type, msg->in, -+ msg->out); - - return ret; - } -@@ -1906,7 +1932,7 @@ static void parse_aead_bd2(struct hisi_sec_sqe *sqe, - if (done != SEC_HW_TASK_DONE || sqe->type2.error_type || - icv == SEC_HW_ICV_ERR) { - WD_ERR("SEC BD aead fail! done=0x%x, etype=0x%x, icv=0x%x\n", -- done, sqe->type2.error_type, icv); -+ done, sqe->type2.error_type, icv); - recv_msg->result = WD_IN_EPARA; - } else { - recv_msg->result = WD_SUCCESS; -@@ -1921,7 +1947,7 @@ static void parse_aead_bd2(struct hisi_sec_sqe *sqe, - recv_msg->mac = (__u8 *)(uintptr_t)sqe->type2.mac_addr; - recv_msg->auth_bytes = (sqe->type2.mac_key_alg & - SEC_MAC_LEN_MASK) * WORD_BYTES; -- if (recv_msg->auth_bytes == 0) -+ if (!recv_msg->auth_bytes) - recv_msg->auth_bytes = sqe->type2.icvw_kmode & - SEC_AUTH_LEN_MASK; - recv_msg->out_bytes = sqe->type2.clen_ivhlen + -@@ -1981,7 +2007,8 @@ static int fill_aead_bd3_alg(struct wd_aead_msg *msg, - sqe->c_icv_key |= (__u16)c_key_len << SEC_CKEY_OFFSET_V3; - break; - default: -- WD_ERR("failed to check aead calg type, calg = %u\n", msg->calg); -+ WD_ERR("failed to check aead calg type, calg = %u\n", -+ msg->calg); - return -WD_EINVAL; - } - -@@ -2010,7 +2037,8 @@ static int fill_aead_bd3_alg(struct wd_aead_msg *msg, - d_alg = A_ALG_HMAC_SHA512 << SEC_AUTH_ALG_OFFSET_V3; - break; - default: -- WD_ERR("failed to check aead dalg type, dalg = %u\n", msg->dalg); -+ WD_ERR("failed to check aead dalg type, dalg = %u\n", -+ msg->dalg); - ret = -WD_EINVAL; - } - sqe->auth_mac_key |= d_alg; -@@ -2039,7 +2067,7 @@ static int fill_aead_bd3_mode(struct wd_aead_msg *msg, - break; - default: - WD_ERR("failed to check aead cmode type, cmode = %u\n", -- msg->cmode); -+ msg->cmode); - return -WD_EINVAL; - } - -@@ -2151,7 +2179,8 @@ int hisi_sec_aead_send_v3(handle_t ctx, struct wd_aead_msg *msg) - WD_ERR("aead send sqe is err(%d)!\n", ret); - - if (msg->data_fmt == WD_SGL_BUF) -- hisi_sec_put_sgl(h_qp, msg->alg_type, msg->in, msg->out); -+ hisi_sec_put_sgl(h_qp, msg->alg_type, msg->in, -+ msg->out); - - return ret; - } -@@ -2171,7 +2200,7 @@ static void parse_aead_bd3(struct hisi_sec_sqe3 *sqe, - if (done != SEC_HW_TASK_DONE || sqe->error_type || - icv == SEC_HW_ICV_ERR) { - WD_ERR("SEC BD3 aead fail! done=0x%x, etype=0x%x, icv=0x%x\n", -- done, sqe->error_type, icv); -+ done, sqe->error_type, icv); - recv_msg->result = WD_IN_EPARA; - } else { - recv_msg->result = WD_SUCCESS; -@@ -2186,7 +2215,7 @@ static void parse_aead_bd3(struct hisi_sec_sqe3 *sqe, - recv_msg->mac = (__u8 *)(uintptr_t)sqe->mac_addr; - recv_msg->auth_bytes = ((sqe->auth_mac_key >> SEC_MAC_OFFSET_V3) & - SEC_MAC_LEN_MASK) * WORD_BYTES; -- if (recv_msg->auth_bytes == 0) -+ if (!recv_msg->auth_bytes) - recv_msg->auth_bytes = (sqe->c_icv_key >> SEC_MAC_OFFSET_V3) & - SEC_MAC_LEN_MASK; - recv_msg->out_bytes = sqe->c_len_ivin + --- -2.25.1 - diff --git a/0056-uadk-optimize-wd_ctx_qfr_mmap.patch b/0056-uadk-optimize-wd_ctx_qfr_mmap.patch deleted file mode 100644 index 1eb1d75..0000000 --- a/0056-uadk-optimize-wd_ctx_qfr_mmap.patch +++ /dev/null @@ -1,59 +0,0 @@ -From b9b1cb826756b2a27ed99745a5fb9be338abd09f Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Tue, 15 Feb 2022 11:49:53 +0800 -Subject: [PATCH 60/64] uadk: optimize wd_ctx_qfr_mmap - -wd_ctx_qfr_mmap may return NULL when user input wrong parameters -or mmap failed, so detail information should be printed. - -Signed-off-by: Wenkai Lin ---- - wd.c | 12 ++++++++---- - 1 file changed, 8 insertions(+), 4 deletions(-) - -diff --git a/wd.c b/wd.c -index 6bbf677..d1652dd 100644 ---- a/wd.c -+++ b/wd.c -@@ -386,7 +386,7 @@ int wd_ctx_start(handle_t h_ctx) - - ret = wd_ctx_set_io_cmd(h_ctx, UACCE_CMD_START, NULL); - if (ret) -- WD_ERR("Fail to start on %s (%d), ret = %d!\n", -+ WD_ERR("failed to start on %s (%d), ret = %d!\n", - ctx->dev_path, -errno, ret); - - return ret; -@@ -402,7 +402,7 @@ int wd_release_ctx_force(handle_t h_ctx) - - ret = wd_ctx_set_io_cmd(h_ctx, UACCE_CMD_PUT_Q, NULL); - if (ret) -- WD_ERR("Fail to stop on %s (%d), ret = %d!\n", -+ WD_ERR("failed to stop on %s (%d), ret = %d!\n", - ctx->dev_path, -errno, ret); - - return ret; -@@ -415,14 +415,18 @@ void *wd_ctx_mmap_qfr(handle_t h_ctx, enum uacce_qfrt qfrt) - size_t size; - void *addr; - -- if (!ctx || qfrt >= UACCE_QFRT_MAX || !ctx->qfrs_offs[qfrt]) -+ if (!ctx || qfrt >= UACCE_QFRT_MAX || !ctx->qfrs_offs[qfrt]) { -+ WD_ERR("failed to check input ctx or qfrt!\n"); - return NULL; -+ } - - size = ctx->qfrs_offs[qfrt]; - - addr = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, ctx->fd, off); -- if (addr == MAP_FAILED) -+ if (addr == MAP_FAILED) { -+ WD_ERR("failed to mmap, qfrt = %d, err = %d!\n", qfrt, -errno); - return NULL; -+ } - - ctx->qfrs_base[qfrt] = addr; - --- -2.25.1 - diff --git a/0057-uadk-optimize-wd_sched_rr_instance.patch b/0057-uadk-optimize-wd_sched_rr_instance.patch deleted file mode 100644 index 142d519..0000000 --- a/0057-uadk-optimize-wd_sched_rr_instance.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 1da22fb07ffeabe82310b8619563fd5971214e18 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Tue, 15 Feb 2022 11:49:54 +0800 -Subject: [PATCH 61/64] uadk: optimize wd_sched_rr_instance - -Schedule ctx numa number and schedule type number should -also be printed, the error information is more usefull -if when it has a comparison. - -Signed-off-by: Wenkai Lin ---- - wd_sched.c | 24 +++++++++++++++++------- - 1 file changed, 17 insertions(+), 7 deletions(-) - -diff --git a/wd_sched.c b/wd_sched.c -index aeaf11b..ef90233 100644 ---- a/wd_sched.c -+++ b/wd_sched.c -@@ -129,7 +129,7 @@ static bool sched_key_valid(struct wd_sched_ctx *ctx, - { - if (key->numa_id >= ctx->numa_num || key->mode >= SCHED_MODE_BUTT || - key->type >= ctx->type_num) { -- WD_ERR("ERROR: %s key error - numa:%d, mode:%u, type%u!\n", -+ WD_ERR("ERROR: %s key error - numa: %d, mode: %u, type: %u!\n", - __FUNCTION__, key->numa_id, key->mode, key->type); - return false; - } -@@ -372,18 +372,28 @@ int wd_sched_rr_instance(const struct wd_sched *sched, - mode = param->mode; - sched_ctx = (struct wd_sched_ctx *)sched->h_sched_ctx; - -- if ((numa_id >= sched_ctx->numa_num) || (numa_id < 0) || -- (mode >= SCHED_MODE_BUTT) || -- (type >= sched_ctx->type_num)) { -- WD_ERR("ERROR: %s para err: numa_id=%d, mode=%u, type=%u!\n", -- __FUNCTION__, numa_id, mode, type); -+ if (numa_id >= sched_ctx->numa_num || numa_id < 0) { -+ WD_ERR("ERROR: %s para err: numa_id = %d, numa_num = %u\n", -+ __FUNCTION__, numa_id, sched_ctx->numa_num); -+ return -WD_EINVAL; -+ } -+ -+ if (type >= sched_ctx->type_num) { -+ WD_ERR("ERROR: %s para err: type = %u, type_num = %u\n", -+ __FUNCTION__, type, sched_ctx->type_num); -+ return -WD_EINVAL; -+ } -+ -+ if (mode >= SCHED_MODE_BUTT) { -+ WD_ERR("ERROR: %s para err: mode = %u, mode_num = %d!\n", -+ __FUNCTION__, mode, SCHED_MODE_BUTT); - return -WD_EINVAL; - } - - sched_info = sched_ctx->sched_info; - - if (!sched_info[numa_id].ctx_region[mode]) { -- WD_ERR("ERROR: %s para err: ctx_region:numa_id=%d, mode=%u is NULL!\n", -+ WD_ERR("ERROR: %s ctx_region of numa_id = %d, mode = %u is NULL!\n", - __FUNCTION__, numa_id, mode); - return -WD_EINVAL; - } --- -2.25.1 - diff --git a/0058-uadk-optimize-wd_get_accel_list.patch b/0058-uadk-optimize-wd_get_accel_list.patch deleted file mode 100644 index 164f954..0000000 --- a/0058-uadk-optimize-wd_get_accel_list.patch +++ /dev/null @@ -1,127 +0,0 @@ -From b670d346baac3be4b3b55a481c196abbdaf36bd3 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Tue, 15 Feb 2022 11:49:55 +0800 -Subject: [PATCH 62/64] uadk: optimize wd_get_accel_list - -wd_get_accel_list should skip nosva device, -so add a step to check sva flags, get_dev_info -should not print error info when device is nosva. - -Signed-off-by: Wenkai Lin ---- - wd.c | 39 +++++++++++++++++++++------------------ - 1 file changed, 21 insertions(+), 18 deletions(-) - -diff --git a/wd.c b/wd.c -index d1652dd..afcf134 100644 ---- a/wd.c -+++ b/wd.c -@@ -44,16 +44,18 @@ static int get_raw_attr(const char *dev_root, const char *attr, char *buf, - ssize_t size; - int fd; - -- if (!dev_root || !attr || !buf || !sz) -- return -WD_EINVAL; -- - size = snprintf(attr_file, PATH_STR_SIZE, "%s/%s", dev_root, attr); -- if (size < 0) -+ if (size < 0) { -+ WD_ERR("failed to snprintf, dev_root: %s, attr: %s!\n", -+ dev_root, attr); - return -WD_EINVAL; -+ } - - ptrRet = realpath(attr_file, attr_path); -- if (ptrRet == NULL) -+ if (ptrRet == NULL) { -+ WD_ERR("failed to resolve path, attr_file: %s!\n", attr_file); - return -WD_ENODEV; -+ } - - fd = open(attr_path, O_RDONLY, 0); - if (fd < 0) { -@@ -78,16 +80,15 @@ static int get_int_attr(struct uacce_dev *dev, const char *attr, int *val) - char buf[MAX_ATTR_STR_SIZE] = {0}; - int ret; - -- if (!dev || !val) -- return -WD_EINVAL; -- - ret = get_raw_attr(dev->dev_root, attr, buf, MAX_ATTR_STR_SIZE - 1); - if (ret < 0) - return ret; - - *val = strtol(buf, NULL, 10); -- if (errno == ERANGE) -+ if (errno == ERANGE) { -+ WD_ERR("failed to strtol %s, out of range!\n", buf); - return -errno; -+ } - - return 0; - } -@@ -97,9 +98,6 @@ static int get_str_attr(struct uacce_dev *dev, const char *attr, char *buf, - { - int ret; - -- if (!dev) -- return -WD_EINVAL; -- - ret = get_raw_attr(dev->dev_root, attr, buf, buf_sz); - if (ret < 0) { - buf[0] = '\0'; -@@ -143,13 +141,19 @@ static int get_dev_info(struct uacce_dev *dev) - ret = get_int_attr(dev, "isolate", &value); - if (ret < 0) - return ret; -- else if (value == 1) -+ else if (value == 1) { -+ WD_ERR("skip isolated uacce device!\n"); - return -ENODEV; -+ } - } - - ret = get_int_attr(dev, "flags", &dev->flags); - if (ret < 0) - return ret; -+ else if (!(dev->flags & UACCE_DEV_SVA)) { -+ WD_ERR("skip none sva uacce device!\n"); -+ return -ENODEV; -+ } - - ret = get_int_attr(dev, "region_mmio_size", &value); - if (ret < 0) -@@ -211,10 +215,8 @@ static struct uacce_dev *read_uacce_sysfs(const char *dev_name) - goto out_dir; - - ret = get_dev_info(dev); -- if (ret < 0) { -- WD_ERR("failed to get dev info: ret = %d!\n", ret); -+ if (ret < 0) - goto out_dir; -- } - - break; - } -@@ -529,6 +531,9 @@ int wd_get_avail_ctx(struct uacce_dev *dev) - { - int avail_ctx, ret; - -+ if (!dev) -+ return -WD_EINVAL; -+ - ret = get_int_attr(dev, "available_instances", &avail_ctx); - if (ret < 0) - return ret; -@@ -551,8 +556,6 @@ static int get_dev_alg_name(const char *d_name, char *dev_alg_name, size_t sz) - ret = get_raw_attr(dev_path, "algorithms", dev_alg_name, sz); - if (ret < 0) { - dev_alg_name[0] = '\0'; -- WD_ERR("failed to get alg for %s, ret = %d\n", -- dev_path, ret); - return ret; - } - --- -2.25.1 - diff --git a/0059-uadk-fix-staic-check-warning.patch b/0059-uadk-fix-staic-check-warning.patch deleted file mode 100644 index 6db3794..0000000 --- a/0059-uadk-fix-staic-check-warning.patch +++ /dev/null @@ -1,38 +0,0 @@ -From f266f7920f0f58b71f2755a8cbad284f1848316c Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Tue, 15 Feb 2022 11:49:56 +0800 -Subject: [PATCH 63/64] uadk: fix staic check warning - -1.fix unterminated string. -2.fix bit operation of int data. - -Signed-off-by: Wenkai Lin ---- - wd.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/wd.c b/wd.c -index afcf134..565c173 100644 ---- a/wd.c -+++ b/wd.c -@@ -77,7 +77,7 @@ static int get_raw_attr(const char *dev_root, const char *attr, char *buf, - - static int get_int_attr(struct uacce_dev *dev, const char *attr, int *val) - { -- char buf[MAX_ATTR_STR_SIZE] = {0}; -+ char buf[MAX_ATTR_STR_SIZE] = {'\0'}; - int ret; - - ret = get_raw_attr(dev->dev_root, attr, buf, MAX_ATTR_STR_SIZE - 1); -@@ -150,7 +150,7 @@ static int get_dev_info(struct uacce_dev *dev) - ret = get_int_attr(dev, "flags", &dev->flags); - if (ret < 0) - return ret; -- else if (!(dev->flags & UACCE_DEV_SVA)) { -+ else if (!((unsigned int)dev->flags & UACCE_DEV_SVA)) { - WD_ERR("skip none sva uacce device!\n"); - return -ENODEV; - } --- -2.25.1 - diff --git a/0060-uadk-v1-fix-the-waiting-time-for-receiving-task.patch b/0060-uadk-v1-fix-the-waiting-time-for-receiving-task.patch deleted file mode 100644 index 0d5d734..0000000 --- a/0060-uadk-v1-fix-the-waiting-time-for-receiving-task.patch +++ /dev/null @@ -1,134 +0,0 @@ -From 2b4923b7290eba36bc2fefc517129fb30a3d207d Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Mon, 21 Feb 2022 09:14:17 +0800 -Subject: [PATCH 64/64] uadk/v1: fix the waiting time for receiving task - -SEC device processes tasks quickly. If 'usleep' is used to -wait for the hardware to process tasks, CPU scheduling will -reduce performance. Therefore, increase the number of cycles -to replace 'usleep'. - -Signed-off-by: Weili Qian ---- - v1/wd_aead.c | 15 ++++++++------- - v1/wd_cipher.c | 15 ++++++++------- - v1/wd_digest.c | 15 ++++++++------- - 3 files changed, 24 insertions(+), 21 deletions(-) - -diff --git a/v1/wd_aead.c b/v1/wd_aead.c -index 181b971..ad22426 100644 ---- a/v1/wd_aead.c -+++ b/v1/wd_aead.c -@@ -35,8 +35,7 @@ - #define MAX_AEAD_AUTH_SIZE 64 - #define MAX_AEAD_ASSOC_SIZE 65536 - #define MAX_HMAC_KEY_SIZE 128 --#define MAX_AEAD_RETRY_CNT 2000000 --#define AEAD_SLEEP_INTERVAL 0xf -+#define MAX_AEAD_RETRY_CNT 20000000 - - #define DES_KEY_SIZE 8 - #define SM4_KEY_SIZE 16 -@@ -509,16 +508,18 @@ static int aead_recv_sync(struct wcrypto_aead_ctx *a_ctx, - while (true) { - ret = wd_burst_recv(a_ctx->q, (void **)(resp + recv_count), - num - recv_count); -- if (ret >= 0) { -+ if (ret > 0) { - recv_count += ret; - if (recv_count == num) - break; - -- if (++rx_cnt > MAX_AEAD_RETRY_CNT) -+ rx_cnt = 0; -+ } else if (ret == 0) { -+ if (++rx_cnt > MAX_AEAD_RETRY_CNT) { -+ WD_ERR("%s:wcrypto_recv timeout, num = %u, recv_count = %u!\n", -+ __func__, num, recv_count); - break; -- -- if (!(rx_cnt & AEAD_SLEEP_INTERVAL)) -- usleep(1); -+ } - } else { - WD_ERR("do aead wcrypto_recv error!\n"); - return ret; -diff --git a/v1/wd_cipher.c b/v1/wd_cipher.c -index 7df44e7..8bf71be 100644 ---- a/v1/wd_cipher.c -+++ b/v1/wd_cipher.c -@@ -30,8 +30,7 @@ - #include "v1/wd_util.h" - - #define MAX_CIPHER_KEY_SIZE 64 --#define MAX_CIPHER_RETRY_CNT 2000000 --#define CIPHER_SLEEP_INTERVAL 0xf -+#define MAX_CIPHER_RETRY_CNT 20000000 - - #define DES_KEY_SIZE 8 - #define SM4_KEY_SIZE 16 -@@ -379,16 +378,18 @@ static int cipher_recv_sync(struct wcrypto_cipher_ctx *c_ctx, - while (true) { - ret = wd_burst_recv(c_ctx->q, (void **)(resp + recv_count), - num - recv_count); -- if (ret >= 0) { -+ if (ret > 0) { - recv_count += ret; - if (recv_count == num) - break; - -- if (++rx_cnt > MAX_CIPHER_RETRY_CNT) -+ rx_cnt = 0; -+ } else if (ret == 0) { -+ if (++rx_cnt > MAX_CIPHER_RETRY_CNT) { -+ WD_ERR("%s:wcrypto_recv timeout, num = %u, recv_count = %u!\n", -+ __func__, num, recv_count); - break; -- -- if (!(rx_cnt & CIPHER_SLEEP_INTERVAL)) -- usleep(1); -+ } - } else { - WD_ERR("do cipher wcrypto_recv error!\n"); - return ret; -diff --git a/v1/wd_digest.c b/v1/wd_digest.c -index aae4823..2179415 100644 ---- a/v1/wd_digest.c -+++ b/v1/wd_digest.c -@@ -30,8 +30,7 @@ - #include "wd_util.h" - - #define MAX_HMAC_KEY_SIZE 128 --#define MAX_DIGEST_RETRY_CNT 2000000 --#define DIGEST_SLEEP_INTERVAL 0xf -+#define MAX_DIGEST_RETRY_CNT 20000000 - #define SEC_SHA1_ALIGN_SZ 64 - #define SEC_SHA512_ALIGN_SZ 128 - -@@ -275,16 +274,18 @@ static int digest_recv_sync(struct wcrypto_digest_ctx *d_ctx, - while (true) { - ret = wd_burst_recv(d_ctx->q, (void **)(resp + recv_count), - num - recv_count); -- if (ret >= 0) { -+ if (ret > 0) { - recv_count += ret; - if (recv_count == num) - break; - -- if (++rx_cnt > MAX_DIGEST_RETRY_CNT) -+ rx_cnt = 0; -+ } else if (ret == 0) { -+ if (++rx_cnt > MAX_DIGEST_RETRY_CNT) { -+ WD_ERR("%s:wcrypto_recv timeout, num = %u, recv_count = %u!\n", -+ __func__, num, recv_count); - break; -- -- if (!(rx_cnt & DIGEST_SLEEP_INTERVAL)) -- usleep(1); -+ } - } else { - WD_ERR("do digest wcrypto_recv error!\n"); - return ret; --- -2.25.1 - diff --git a/0061-uadk-comp-optimize-for-spin-lock.patch b/0061-uadk-comp-optimize-for-spin-lock.patch deleted file mode 100644 index de3617d..0000000 --- a/0061-uadk-comp-optimize-for-spin-lock.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 12afca7c245a7003c7d9e8e4445426794346940e Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Mon, 21 Feb 2022 20:09:51 +0800 -Subject: [PATCH 67/76] uadk: comp: optimize for spin lock - -Printf should be outside of the lock region. - -Signed-off-by: Wenkai Lin ---- - wd_comp.c | 10 ++++++++-- - 1 file changed, 8 insertions(+), 2 deletions(-) - -diff --git a/wd_comp.c b/wd_comp.c -index 7868551..4a97f06 100644 ---- a/wd_comp.c -+++ b/wd_comp.c -@@ -718,15 +718,21 @@ int wd_do_comp_async(handle_t h_sess, struct wd_comp_req *req) - - ret = wd_comp_setting.driver->comp_send(ctx->ctx, msg, priv); - if (ret < 0) { -+ pthread_spin_unlock(&ctx->lock); - WD_ERR("wd comp send err(%d)!\n", ret); -- wd_put_msg_to_pool(&wd_comp_setting.pool, idx, msg->tag); -+ goto fail_with_msg; - } - - pthread_spin_unlock(&ctx->lock); - - ret = wd_add_task_to_async_queue(&wd_comp_env_config, idx); - if (ret) -- wd_put_msg_to_pool(&wd_comp_setting.pool, idx, msg->tag); -+ goto fail_with_msg; -+ -+ return 0; -+ -+fail_with_msg: -+ wd_put_msg_to_pool(&wd_comp_setting.pool, idx, msg->tag); - - return ret; - } --- -2.25.1 - diff --git a/0062-hisi-comp-cleanup-for-duplication-code.patch b/0062-hisi-comp-cleanup-for-duplication-code.patch deleted file mode 100644 index 22430a9..0000000 --- a/0062-hisi-comp-cleanup-for-duplication-code.patch +++ /dev/null @@ -1,239 +0,0 @@ -From e4758e80e2dc38ff018cd561636860121603b93f Mon Sep 17 00:00:00 2001 -From: Yang Shen -Date: Wed, 16 Feb 2022 15:05:11 +0800 -Subject: [PATCH 68/76] hisi-comp: cleanup for duplication code - -The algorithms zlib/gzip/deflate have same process. The only difference is -the protocol. So move the generic logic into a function and the difference -into the parameters. - -Signed-off-by: Yang Shen ---- - drv/hisi_comp.c | 161 ++++++++++++++---------------------------------- - 1 file changed, 45 insertions(+), 116 deletions(-) - -diff --git a/drv/hisi_comp.c b/drv/hisi_comp.c -index 5ea5dc3..0760908 100644 ---- a/drv/hisi_comp.c -+++ b/drv/hisi_comp.c -@@ -223,33 +223,9 @@ static void fill_buf_addr_deflate(struct hisi_zip_sqe *sqe, void *src, - sqe->stream_ctx_addr_h = upper_32_bits(ctx_buf); - } - --static int fill_buf_deflate(handle_t h_qp, struct hisi_zip_sqe *sqe, -- struct wd_comp_msg *msg) --{ -- struct wd_comp_req *req = &msg->req; -- __u32 out_size = msg->avail_out; -- __u32 in_size = req->src_len; -- void *ctx_buf; -- int ret; -- -- ret = buf_size_check_deflate(&in_size, &out_size); -- if (ret) -- return ret; -- -- fill_buf_size_deflate(sqe, in_size, out_size); -- -- if (msg->ctx_buf) -- ctx_buf = msg->ctx_buf + RSV_OFFSET; -- else -- ctx_buf = NULL; -- -- fill_buf_addr_deflate(sqe, req->src, req->dst, ctx_buf); -- -- return 0; --} -- --static int fill_buf_zlib(handle_t h_qp, struct hisi_zip_sqe *sqe, -- struct wd_comp_msg *msg) -+static int fill_buf_deflate_generic(struct hisi_zip_sqe *sqe, -+ struct wd_comp_msg *msg, -+ const char *head, int head_size) - { - __u32 in_size = msg->req.src_len; - __u32 out_size = msg->avail_out; -@@ -258,14 +234,14 @@ static int fill_buf_zlib(handle_t h_qp, struct hisi_zip_sqe *sqe, - void *ctx_buf = NULL; - int ret; - -- if (msg->stream_pos == WD_COMP_STREAM_NEW) { -+ if (msg->stream_pos == WD_COMP_STREAM_NEW && head != NULL) { - if (msg->req.op_type == WD_DIR_COMPRESS) { -- memcpy(dst, ZLIB_HEADER, ZLIB_HEADER_SZ); -- dst += ZLIB_HEADER_SZ; -- out_size -= ZLIB_HEADER_SZ; -+ memcpy(dst, head, head_size); -+ dst += head_size; -+ out_size -= head_size; - } else { -- src += ZLIB_HEADER_SZ; -- in_size -= ZLIB_HEADER_SZ; -+ src += head_size; -+ in_size -= head_size; - } - } - -@@ -283,39 +259,22 @@ static int fill_buf_zlib(handle_t h_qp, struct hisi_zip_sqe *sqe, - return 0; - } - --static int fill_buf_gzip(handle_t h_qp, struct hisi_zip_sqe *sqe, -- struct wd_comp_msg *msg) -+static int fill_buf_deflate(handle_t h_qp, struct hisi_zip_sqe *sqe, -+ struct wd_comp_msg *msg) - { -- __u32 in_size = msg->req.src_len; -- __u32 out_size = msg->avail_out; -- void *src = msg->req.src; -- void *dst = msg->req.dst; -- void *ctx_buf = NULL; -- int ret; -- -- if (msg->stream_pos == WD_COMP_STREAM_NEW) { -- if (msg->req.op_type == WD_DIR_COMPRESS) { -- memcpy(dst, GZIP_HEADER, GZIP_HEADER_SZ); -- dst += GZIP_HEADER_SZ; -- out_size -= GZIP_HEADER_SZ; -- } else { -- src += GZIP_HEADER_SZ; -- in_size -= GZIP_HEADER_SZ; -- } -- } -- -- ret = buf_size_check_deflate(&in_size, &out_size); -- if (ret) -- return ret; -- -- fill_buf_size_deflate(sqe, in_size, out_size); -- -- if (msg->ctx_buf) -- ctx_buf = msg->ctx_buf + RSV_OFFSET; -+ return fill_buf_deflate_generic(sqe, msg, NULL, 0); -+} - -- fill_buf_addr_deflate(sqe, src, dst, ctx_buf); -+static int fill_buf_zlib(handle_t h_qp, struct hisi_zip_sqe *sqe, -+ struct wd_comp_msg *msg) -+{ -+ return fill_buf_deflate_generic(sqe, msg, ZLIB_HEADER, ZLIB_HEADER_SZ); -+} - -- return 0; -+static int fill_buf_gzip(handle_t h_qp, struct hisi_zip_sqe *sqe, -+ struct wd_comp_msg *msg) -+{ -+ return fill_buf_deflate_generic(sqe, msg, GZIP_HEADER, GZIP_HEADER_SZ); - } - - static void fill_buf_type_sgl(struct hisi_zip_sqe *sqe) -@@ -358,23 +317,6 @@ static int fill_buf_addr_deflate_sgl(handle_t h_qp, struct hisi_zip_sqe *sqe, - return 0; - } - --static int fill_buf_deflate_sgl(handle_t h_qp, struct hisi_zip_sqe *sqe, -- struct wd_comp_msg *msg) --{ -- struct wd_comp_req *req = &msg->req; -- int ret; -- -- fill_buf_type_sgl(sqe); -- -- ret = fill_buf_addr_deflate_sgl(h_qp, sqe, msg); -- if (ret) -- return ret; -- -- fill_buf_size_deflate(sqe, req->src_len, msg->avail_out); -- -- return 0; --} -- - static void fill_buf_sgl_skip(struct hisi_zip_sqe *sqe, __u32 src_skip, - __u32 dst_skip) - { -@@ -389,8 +331,9 @@ static void fill_buf_sgl_skip(struct hisi_zip_sqe *sqe, __u32 src_skip, - sqe->dw8 = val; - } - --static int fill_buf_zlib_sgl(handle_t h_qp, struct hisi_zip_sqe *sqe, -- struct wd_comp_msg *msg) -+static int fill_buf_deflate_slg_generic(handle_t h_qp, struct hisi_zip_sqe *sqe, -+ struct wd_comp_msg *msg, const char *head, -+ int head_size) - { - struct wd_comp_req *req = &msg->req; - __u32 out_size = msg->avail_out; -@@ -405,13 +348,13 @@ static int fill_buf_zlib_sgl(handle_t h_qp, struct hisi_zip_sqe *sqe, - if (ret) - return ret; - -- if (msg->req.op_type == WD_DIR_COMPRESS) { -- memcpy(req->list_dst->data, ZLIB_HEADER, ZLIB_HEADER_SZ); -- dst_skip = ZLIB_HEADER_SZ; -- out_size -= ZLIB_HEADER_SZ; -- } else { -- src_skip = ZLIB_HEADER_SZ; -- in_size -= ZLIB_HEADER_SZ; -+ if (head != NULL && msg->req.op_type == WD_DIR_COMPRESS) { -+ memcpy(req->list_dst->data, head, head_size); -+ dst_skip = head_size; -+ out_size -= head_size; -+ } else if (head != NULL && msg->req.op_type == WD_DIR_DECOMPRESS) { -+ src_skip = head_size; -+ in_size -= head_size; - } - - fill_buf_sgl_skip(sqe, src_skip, dst_skip); -@@ -421,36 +364,22 @@ static int fill_buf_zlib_sgl(handle_t h_qp, struct hisi_zip_sqe *sqe, - return 0; - } - --static int fill_buf_gzip_sgl(handle_t h_qp, struct hisi_zip_sqe *sqe, -- struct wd_comp_msg *msg) -+static int fill_buf_deflate_sgl(handle_t h_qp, struct hisi_zip_sqe *sqe, -+ struct wd_comp_msg *msg) - { -- struct wd_comp_req *req = &msg->req; -- __u32 out_size = msg->avail_out; -- __u32 in_size = req->src_len; -- __u32 src_skip = 0; -- __u32 dst_skip = 0; -- int ret; -- -- fill_buf_type_sgl(sqe); -- -- ret = fill_buf_addr_deflate_sgl(h_qp, sqe, msg); -- if (ret) -- return ret; -- -- if (msg->req.op_type == WD_DIR_COMPRESS) { -- memcpy(req->list_dst->data, GZIP_HEADER, GZIP_HEADER_SZ); -- dst_skip = GZIP_HEADER_SZ; -- out_size -= GZIP_HEADER_SZ; -- } else { -- src_skip = GZIP_HEADER_SZ; -- in_size -= GZIP_HEADER_SZ; -- } -- -- fill_buf_sgl_skip(sqe, src_skip, dst_skip); -+ return fill_buf_deflate_slg_generic(h_qp, sqe, msg, NULL, 0); -+} - -- fill_buf_size_deflate(sqe, in_size, out_size); -+static int fill_buf_zlib_sgl(handle_t h_qp, struct hisi_zip_sqe *sqe, -+ struct wd_comp_msg *msg) -+{ -+ return fill_buf_deflate_slg_generic(h_qp, sqe, msg, ZLIB_HEADER, ZLIB_HEADER_SZ); -+} - -- return 0; -+static int fill_buf_gzip_sgl(handle_t h_qp, struct hisi_zip_sqe *sqe, -+ struct wd_comp_msg *msg) -+{ -+ return fill_buf_deflate_slg_generic(h_qp, sqe, msg, GZIP_HEADER, GZIP_HEADER_SZ); - } - - static void fill_buf_size_lz77_zstd(struct hisi_zip_sqe *sqe, __u32 in_size, --- -2.25.1 - diff --git a/0063-wd_comp-remove-some-useless-printf.patch b/0063-wd_comp-remove-some-useless-printf.patch deleted file mode 100644 index d3e6472..0000000 --- a/0063-wd_comp-remove-some-useless-printf.patch +++ /dev/null @@ -1,80 +0,0 @@ -From fb0abcd7e3d0afdad015193e7e220b6597e0c606 Mon Sep 17 00:00:00 2001 -From: Yang Shen -Date: Wed, 16 Feb 2022 15:05:12 +0800 -Subject: [PATCH 69/76] wd_comp: remove some useless printf - -Due to the called function has print the error reason, the call function -has no need to add printf. - -Signed-off-by: Yang Shen ---- - wd_comp.c | 20 +++++--------------- - 1 file changed, 5 insertions(+), 15 deletions(-) - -diff --git a/wd_comp.c b/wd_comp.c -index 4a97f06..722666d 100644 ---- a/wd_comp.c -+++ b/wd_comp.c -@@ -459,10 +459,8 @@ int wd_do_comp_sync(handle_t h_sess, struct wd_comp_req *req) - int ret; - - ret = wd_comp_check_params(sess, req, CTX_MODE_SYNC); -- if (ret) { -- WD_ERR("fail to check params!\n"); -+ if (ret) - return ret; -- } - - if (!req->src_len) { - WD_ERR("invalid: req src_len is 0!\n"); -@@ -477,10 +475,8 @@ int wd_do_comp_sync(handle_t h_sess, struct wd_comp_req *req) - msg.stream_mode = WD_COMP_STATELESS; - - ret = wd_comp_sync_job(sess, req, &msg); -- if (ret) { -- WD_ERR("fail to check params!\n"); -+ if (ret) - return ret; -- } - - req->src_len = msg.in_cons; - req->dst_len = msg.produced; -@@ -499,10 +495,8 @@ int wd_do_comp_sync2(handle_t h_sess, struct wd_comp_req *req) - int ret; - - ret = wd_comp_check_params(sess, req, CTX_MODE_SYNC); -- if (ret) { -- WD_ERR("fail to check params!\n"); -+ if (ret) - return ret; -- } - - if (!req->src_len) { - WD_ERR("invalid: req src_len is 0!\n"); -@@ -655,10 +649,8 @@ int wd_do_comp_strm(handle_t h_sess, struct wd_comp_req *req) - src_len = req->src_len; - - ret = wd_comp_sync_job(sess, req, &msg); -- if (ret) { -- WD_ERR("fail to check params!\n"); -+ if (ret) - return ret; -- } - - req->src_len = msg.in_cons; - req->dst_len = msg.produced; -@@ -685,10 +677,8 @@ int wd_do_comp_async(handle_t h_sess, struct wd_comp_req *req) - __u32 idx; - - ret = wd_comp_check_params(sess, req, CTX_MODE_ASYNC); -- if (ret) { -- WD_ERR("fail to check params!\n"); -+ if (ret) - return ret; -- } - - if (!req->src_len) { - WD_ERR("invalid: req src_len is 0!\n"); --- -2.25.1 - diff --git a/0064-sample-add-a-demo-for-comp.patch b/0064-sample-add-a-demo-for-comp.patch deleted file mode 100644 index 52cf7bb..0000000 --- a/0064-sample-add-a-demo-for-comp.patch +++ /dev/null @@ -1,639 +0,0 @@ -From 471df047de19c8ec5a111e8c39a17f4240f6dead Mon Sep 17 00:00:00 2001 -From: Yang Shen -Date: Wed, 16 Feb 2022 15:05:13 +0800 -Subject: [PATCH 70/76] sample: add a demo for comp - -Add the sample for uadk comp which is aimed to support test of -compression/decompression and provide users with API reference. - -Signed-off-by: Yang Shen ---- - sample/Makefile.am | 10 +- - sample/uadk_comp.c | 505 +++++++++++++++++++++++++++++++++++++++++++ - sample/uadk_sample.c | 76 ------- - 3 files changed, 510 insertions(+), 81 deletions(-) - create mode 100644 sample/uadk_comp.c - delete mode 100644 sample/uadk_sample.c - -diff --git a/sample/Makefile.am b/sample/Makefile.am -index 62ab902..eb8d71b 100644 ---- a/sample/Makefile.am -+++ b/sample/Makefile.am -@@ -1,16 +1,16 @@ - ACLOCAL_AMFLAGS = -I m4 -I./include - AM_CFLAGS=-Wall -fno-strict-aliasing -I$(top_srcdir) -I$(top_srcdir)/include - --bin_PROGRAMS=uadk_sample -+bin_PROGRAMS=uadk_comp - --uadk_sample_SOURCES=uadk_sample.c -+uadk_comp_SOURCES=uadk_comp.c - - if WD_STATIC_DRV - AM_CFLAGS+=-Bstatic --uadk_sample_LDADD=../.libs/libwd.a \ -+uadk_comp_LDADD=../.libs/libwd.a \ - ../.libs/libwd_comp.a \ - ../.libs/libhisi_zip.a -lpthread -lnuma - else --uadk_sample_LDADD=-L../.libs -l:libwd.so.2 -l:libwd_comp.so.2 -lpthread -lnuma -+uadk_comp_LDADD=-L../.libs -l:libwd.so.2 -l:libwd_comp.so.2 -lpthread -lnuma - endif --uadk_sample_LDFLAGS=-Wl,-rpath,'/usr/local/lib' -+uadk_comp_LDFLAGS=-Wl,-rpath,'/usr/local/lib' -diff --git a/sample/uadk_comp.c b/sample/uadk_comp.c -new file mode 100644 -index 0000000..908c7bc ---- /dev/null -+++ b/sample/uadk_comp.c -@@ -0,0 +1,505 @@ -+#include -+#include -+#include -+#include -+#include -+ -+#include "wd_alg_common.h" -+#include "wd_comp.h" -+#include "wd_sched.h" -+ -+#define SCHED_RR_NAME "sched_rr" -+ -+#define CTX_SET_NUM 1 -+#define CTX_SET_SIZE 4 -+#define MAX_ALG_LEN 32 -+#define MAX_THREAD 1024 -+ -+#define no_argument 0 -+#define required_argument 1 -+#define optional_argument 2 -+ -+struct request_config { -+ char algname[MAX_ALG_LEN]; -+ enum wd_comp_alg_type alg; -+ enum wd_comp_level complv; -+ enum wd_comp_op_type optype; -+ enum wd_comp_winsz_type winsize; -+ enum wd_ctx_mode request_mode; -+ enum wd_buff_type buftype; -+ struct wd_ctx_config ctx; -+ struct wd_sched *sched; -+ struct uacce_dev_list *list; -+}; -+ -+struct request_data { -+ handle_t h_sess; -+ struct wd_comp_req req; -+}; -+ -+struct acc_alg_item { -+ char *name; -+ int alg; -+}; -+ -+static struct request_config config = { -+ .complv = WD_COMP_L8, -+ .optype = WD_DIR_COMPRESS, -+ .winsize = WD_COMP_WS_8K, -+ .request_mode = CTX_MODE_SYNC, -+ .buftype = WD_FLAT_BUF, -+}; -+ -+static struct request_data data; -+ -+static struct acc_alg_item alg_options[] = { -+ {"zlib", WD_ZLIB}, -+ {"gzip", WD_GZIP}, -+ {"deflate", WD_DEFLATE}, -+ {"lz77_zstd", WD_LZ77_ZSTD}, -+ {"", WD_COMP_ALG_MAX} -+}; -+ -+static void cowfail(char *s) -+{ -+ fprintf(stderr, "" -+ "__________________________________\n\n" -+ "%s" -+ "\n----------------------------------\n" -+ "\t \\ ^__^\n" -+ "\t \\ (oo)\\_______\n" -+ "\t (__)\\ )\\\\\n" -+ "\t ||----w |\n" -+ "\t || ||\n" -+ "\n", s); -+} -+ -+static struct uacce_dev_list* get_dev_list(char *alg_name) -+{ -+ struct uacce_dev_list *list, *p, *head = NULL, *prev = NULL; -+ int ctx_set_num = CTX_SET_NUM; -+ int max_ctx_num; -+ int i; -+ -+ for (i = 0; i < ARRAY_SIZE(alg_options); i++) -+ if (!strcmp(alg_name, alg_options[i].name)) -+ config.alg = alg_options[i].alg; -+ -+ list = wd_get_accel_list(alg_name); -+ if (!list) -+ return NULL; -+ -+ p = list; -+ /* Find one device matching the requested contexts. */ -+ while (p) { -+ max_ctx_num = wd_get_avail_ctx(p->dev); -+ /* -+ * Check whether there's enough contexts. -+ * There may be multiple taskes running together. -+ * The number of multiple taskes is specified in children. -+ */ -+ if (max_ctx_num < ctx_set_num * CTX_SET_SIZE) { -+ if (!head) -+ head = p; -+ prev = p; -+ p = p->next; -+ } else -+ break; -+ } -+ -+ if (!p) { -+ fprintf(stderr, "%s request too much contexts: %d.\n", -+ __func__, ctx_set_num); -+ goto out; -+ } -+ -+ /* Adjust p to the head of list if p is in the middle. */ -+ if (p && (p != list)) { -+ prev->next = p->next; -+ p->next = head; -+ return p; -+ } -+ -+ return list; -+ -+out: -+ wd_free_list_accels(list); -+ return NULL; -+} -+ -+static int lib_poll_func(__u32 pos, __u32 expect, __u32 *count) -+{ -+ int ret; -+ -+ ret = wd_comp_poll_ctx(pos, expect, count); -+ if (ret < 0) -+ return ret; -+ -+ return 0; -+} -+ -+static struct wd_sched *uadk_comp_sched_init(void) -+{ -+ int ctx_set_num = CTX_SET_NUM; -+ struct sched_params param; -+ struct wd_sched *sched; -+ int i, j, ret; -+ -+ sched = wd_sched_rr_alloc(SCHED_POLICY_RR, 2, 2, lib_poll_func); -+ if (!sched) { -+ printf("%s fail to alloc sched.\n", __func__); -+ return NULL; -+ } -+ sched->name = SCHED_RR_NAME; -+ -+ /* -+ * All contexts for 2 modes & 2 types. -+ * The test only uses one kind of contexts at the same time. -+ */ -+ for (i = 0; i < CTX_SET_SIZE; i++) { -+ for (j = ctx_set_num * i; j < ctx_set_num * (i + 1); j++) { -+ param.mode = i / 2; -+ param.type = i % 2; -+ param.numa_id = 0; -+ param.begin = ctx_set_num * i; -+ param.end = ctx_set_num * (i + 1) - 1; -+ ret = wd_sched_rr_instance(sched, ¶m); -+ if (ret < 0) { -+ fprintf(stderr, "%s fail to fill sched region.\n", -+ __func__); -+ goto out_free_sched; -+ } -+ } -+ } -+ -+ return sched; -+ -+out_free_sched: -+ wd_sched_rr_release(sched); -+ -+ return NULL; -+} -+ -+static int uadk_comp_ctx_init(void) -+{ -+ struct wd_ctx_config *ctx = &config.ctx; -+ int ctx_set_num = CTX_SET_NUM; -+ struct wd_sched *sched; -+ int i, j, ret; -+ -+ memset(ctx, 0, sizeof(struct wd_ctx_config)); -+ ctx->ctx_num = ctx_set_num * CTX_SET_SIZE; -+ ctx->ctxs = calloc(ctx_set_num * CTX_SET_SIZE, sizeof(struct wd_ctx)); -+ if (!ctx->ctxs) { -+ fprintf(stderr, "%s fail to allocate contexts.\n", __func__); -+ return -WD_ENOMEM; -+ } -+ -+ for (i = 0; i < CTX_SET_SIZE; i++) { -+ for (j = ctx_set_num * i; j < ctx_set_num * (i + 1); j++) { -+ ctx->ctxs[j].ctx = wd_request_ctx(config.list->dev); -+ if (!ctx->ctxs[j].ctx) { -+ fprintf(stderr, "%s fail to request context #%d.\n", -+ __func__, i); -+ ret = -WD_EINVAL; -+ goto out_free_ctx; -+ } -+ ctx->ctxs[j].ctx_mode = i / 2; -+ ctx->ctxs[j].op_type = i % 2; -+ } -+ } -+ -+ sched = uadk_comp_sched_init(); -+ if (!sched) { -+ ret = -WD_EINVAL; -+ goto out_free_ctx; -+ } -+ -+ config.sched = sched; -+ -+ ret = wd_comp_init(ctx, sched); -+ if (ret) { -+ fprintf(stderr, "%s fail to init comp.\n", __func__); -+ goto out_free_sched; -+ } -+ -+ return 0; -+ -+out_free_sched: -+ wd_sched_rr_release(sched); -+ -+out_free_ctx: -+ for (i = 0; i < ctx->ctx_num; i++) -+ if (ctx->ctxs[i].ctx) -+ wd_release_ctx(ctx->ctxs[i].ctx); -+ free(ctx->ctxs); -+ -+ return ret; -+} -+ -+static void uadk_comp_ctx_uninit(void) -+{ -+ struct wd_ctx_config *ctx = &config.ctx; -+ int i; -+ -+ wd_comp_uninit(); -+ -+ for (i = 0; i < ctx->ctx_num; i++) -+ wd_release_ctx(ctx->ctxs[i].ctx); -+ -+ wd_free_list_accels(config.list); -+ wd_sched_rr_release(config.sched); -+} -+ -+static int uadk_comp_sess_init(void) -+{ -+ struct wd_comp_sess_setup setup = {0}; -+ struct sched_params param = {0}; -+ handle_t h_sess; -+ int ret = 0; -+ -+ setup.alg_type = config.alg; -+ setup.op_type = config.optype; -+ setup.comp_lv = config.complv; -+ setup.win_sz = config.winsize; -+ param.type = config.optype; -+ setup.sched_param = ¶m; -+ -+ h_sess = wd_comp_alloc_sess(&setup); -+ if (!h_sess) { -+ fprintf(stderr, "%s fail to alloc comp sess.\n", __func__); -+ ret = -WD_EINVAL; -+ goto out_free_sess; -+ } -+ data.h_sess = h_sess; -+ -+ return 0; -+ -+out_free_sess: -+ wd_comp_free_sess(data.h_sess); -+ -+ return ret; -+} -+ -+static void uadk_comp_sess_uninit(void) -+{ -+ wd_comp_free_sess(data.h_sess); -+} -+ -+static int uadk_req_buf_init(struct wd_comp_req *req, FILE *source) -+{ -+ int src_len = req->src_len; -+ int dst_len = req->dst_len; -+ void *src, *dst; -+ int ret; -+ -+ src = malloc(src_len); -+ if (!src) { -+ fprintf(stderr, "%s fail to alloc src.\n", __func__); -+ return -WD_ENOMEM; -+ } -+ -+ dst = malloc(dst_len); -+ if (!dst) { -+ fprintf(stderr, "%s fail to alloc dst.\n", __func__); -+ ret = -WD_ENOMEM; -+ goto out_free_src; -+ } -+ -+ ret = fread(src, 1, src_len, source); -+ if (ret != src_len) { -+ fprintf(stderr, "%s fail to read stdin.\n", __func__); -+ ret = -WD_ENOMEM; -+ goto out_free_dst; -+ } -+ -+ req->src = src; -+ req->dst = dst; -+ -+ return 0; -+ -+out_free_dst: -+ free(dst); -+ -+out_free_src: -+ free(src); -+ -+ return ret; -+} -+ -+static void uadk_req_buf_uninit(void) -+{ -+ free(data.req.src); -+ free(data.req.dst); -+} -+ -+static int uadk_comp_request_init(FILE *source) -+{ -+ struct wd_comp_req *req; -+ struct stat fs; -+ int fd, ret; -+ -+ fd = fileno(source); -+ ret = fstat(fd, &fs); -+ if (ret < 0) { -+ fprintf(stderr, "%s fstat error.\n", __func__); -+ return ret; -+ } -+ -+ req = &data.req; -+ req->op_type = config.optype; -+ req->data_fmt = WD_FLAT_BUF; -+ req->src_len = fs.st_size; -+ req->dst_len = fs.st_size * 4; -+ -+ return uadk_req_buf_init(req, source); -+} -+ -+static void uadk_comp_request_uninit(void) -+{ -+ uadk_req_buf_uninit(); -+} -+ -+static int uadk_do_comp(void) -+{ -+ int ret; -+ -+ ret = wd_do_comp_sync2(data.h_sess, &data.req); -+ if (ret < 0) -+ fprintf(stderr, "%s fail to do comp sync(ret = %d).\n", __func__, ret); -+ -+ return ret; -+} -+ -+static int uadk_comp_write_file(FILE *dest) -+{ -+ int size; -+ -+ size = fwrite(data.req.dst, 1, data.req.dst_len, dest); -+ if (size < 0) -+ return size; -+ -+ return 0; -+} -+ -+static int operation(FILE *source, FILE *dest) -+{ -+ int ret; -+ -+ ret = uadk_comp_ctx_init(); -+ if (ret) { -+ fprintf(stderr, "%s fail to init ctx!\n", __func__); -+ return ret; -+ } -+ -+ ret = uadk_comp_sess_init(); -+ if (ret) { -+ fprintf(stderr, "%s fail to init sess!\n", __func__); -+ goto out_ctx_uninit; -+ } -+ -+ ret = uadk_comp_request_init(source); -+ if (ret) { -+ fprintf(stderr, "%s fail to init request!\n", __func__); -+ goto out_sess_uninit; -+ } -+ -+ ret = uadk_do_comp(); -+ if (ret) { -+ fprintf(stderr, "%s fail to do request!\n", __func__); -+ goto out_sess_uninit; -+ } -+ -+ ret = uadk_comp_write_file(dest); -+ if (ret) -+ fprintf(stderr, "%s fail to write result!\n", __func__); -+ -+ uadk_comp_request_uninit(); -+ -+out_sess_uninit: -+ uadk_comp_sess_uninit(); -+ -+out_ctx_uninit: -+ uadk_comp_ctx_uninit(); -+ -+ return ret; -+} -+ -+static void print_help(void) -+{ -+ fprintf(stderr, "" -+ "uadk_comp - a tool used to do compress/decompress\n\n" -+ "Arguments:\n" -+ "\t[--alg]: " -+ "The name of the algorithm (can find under .../uacce//algorithms)\n" -+ "\t[--optype]: " -+ "Use 0/1 stand for compression/decompression.\n" -+ "\t[--winsize]: " -+ "The window size for compression(8K as default).\n" -+ "\t[--complv]: " -+ "The compression level(8 as default).\n" -+ "\t[--help] " -+ "Print Help (this message) and exit\n" -+ ""); -+} -+ -+int main(int argc, char *argv[]) -+{ -+ int option_index = 0; -+ int help = 0; -+ int ret, c; -+ -+ static struct option long_options[] = { -+ {"help", no_argument, 0, 0}, -+ {"alg", required_argument, 0, 1}, -+ {"complv", required_argument, 0, 2}, -+ {"optype", required_argument, 0, 3}, -+ {"winsize", required_argument, 0, 4}, -+ {0, 0, 0, 0} -+ }; -+ -+ while (!help) { -+ c = getopt_long(argc, argv, "", long_options, &option_index); -+ if (c == -1) -+ break; -+ -+ switch (c) { -+ case 0: -+ help = 1; -+ break; -+ case 1: -+ config.list = get_dev_list(optarg); -+ if (!config.list) { -+ cowfail("Can't find your algorithm!\n"); -+ help = 1; -+ } else { -+ strcpy(config.algname, optarg); -+ } -+ break; -+ case 2: -+ config.complv = strtol(optarg, NULL, 0); -+ break; -+ case 3: -+ config.optype = strtol(optarg, NULL, 0); -+ break; -+ case 4: -+ config.winsize = strtol(optarg, NULL, 0); -+ break; -+ default: -+ help = 1; -+ cowfail("bad input test parameter!\n"); -+ break; -+ } -+ } -+ -+ if (help) { -+ print_help(); -+ exit(-1); -+ } -+ -+ ret = operation(stdin, stdout); -+ if (ret) -+ cowfail("So sad for we do something wrong!\n"); -+ -+ return ret; -+} -diff --git a/sample/uadk_sample.c b/sample/uadk_sample.c -deleted file mode 100644 -index 3ec2c47..0000000 ---- a/sample/uadk_sample.c -+++ /dev/null -@@ -1,76 +0,0 @@ --#include "wd_comp.h" -- --#define TEST_WORD_LEN 64 -- --int operation(int op_type, void *src, int src_sz, void *dst, int *dst_sz) --{ -- struct wd_comp_sess_setup setup = {0}; -- struct wd_comp_req req = {0}; -- handle_t h_dfl; -- int ret; -- -- if (!src || !dst || !dst_sz || (*dst_sz <= 0)) -- return -EINVAL; -- ret = wd_comp_env_init(NULL); -- if (ret < 0) -- goto out; -- -- setup.alg_type = WD_ZLIB; -- setup.win_sz = WD_COMP_WS_32K; -- setup.comp_lv = WD_COMP_L8; -- setup.op_type = op_type; -- h_dfl = wd_comp_alloc_sess(&setup); -- if (!h_dfl) { -- ret = -EINVAL; -- goto out_sess; -- } -- req.src = src; -- req.src_len = src_sz; -- req.dst = dst; -- req.dst_len = *dst_sz; -- req.op_type = op_type; -- req.data_fmt = WD_FLAT_BUF; -- do { -- ret = wd_do_comp_sync(h_dfl, &req); -- } while (ret == -WD_EBUSY); -- if (ret) -- goto out_comp; -- *dst_sz = req.dst_len; -- wd_comp_free_sess(h_dfl); -- wd_comp_env_uninit(); -- return 0; --out_comp: -- wd_comp_free_sess(h_dfl); --out_sess: -- wd_comp_env_uninit(); --out: -- return ret; --} -- --int main(void) --{ -- char src[TEST_WORD_LEN] = {0}, dst[TEST_WORD_LEN] = {0}; -- char tmp[TEST_WORD_LEN] = {0}; -- int ret, src_sz, dst_sz, tmp_sz; -- -- strcpy(src, "go to test."); -- src_sz = strlen(src); -- dst_sz = tmp_sz = TEST_WORD_LEN; -- ret = operation(WD_DIR_COMPRESS, src, src_sz, tmp, &tmp_sz); -- if (ret < 0) -- goto out; -- ret = operation(WD_DIR_DECOMPRESS, tmp, tmp_sz, dst, &dst_sz); -- if (ret < 0) -- goto out; -- if ((src_sz == dst_sz) && !strcmp(src, dst)) -- printf("Compression verified!\n"); -- else { -- printf("Fail to verify the compression!\n"); -- ret = -EFAULT; -- goto out; -- } -- return 0; --out: -- return ret; --} -- --- -2.25.1 - diff --git a/0065-uadk-tool-modify-uadk_benchmark-toos-code.patch b/0065-uadk-tool-modify-uadk_benchmark-toos-code.patch deleted file mode 100644 index 356ea96..0000000 --- a/0065-uadk-tool-modify-uadk_benchmark-toos-code.patch +++ /dev/null @@ -1,291 +0,0 @@ -From 47705e97580314d97c6ad781b0252a80d8024fc1 Mon Sep 17 00:00:00 2001 -From: Liulongfang -Date: Tue, 22 Feb 2022 11:47:02 +0800 -Subject: [PATCH 71/76] uadk/tool: modify uadk_benchmark toos code - -1.bugfix some alg parameter -2.add multi thread for async mode to poll BD - -Signed-off-by: Liulongfang ---- - uadk_tool/sec_uadk_benchmark.c | 55 +++++++++++++++++-------------- - uadk_tool/sec_wd_benchmark.c | 59 +++++++++++++++++++--------------- - uadk_tool/uadk_benchmark.c | 4 +-- - 3 files changed, 66 insertions(+), 52 deletions(-) - -diff --git a/uadk_tool/sec_uadk_benchmark.c b/uadk_tool/sec_uadk_benchmark.c -index d68ac25..467e621 100644 ---- a/uadk_tool/sec_uadk_benchmark.c -+++ b/uadk_tool/sec_uadk_benchmark.c -@@ -180,13 +180,13 @@ static int sec_uadk_param_parse(thread_data *tddata, struct acc_option *options) - break; - case DES3_128_ECB: - keysize = 16; -- ivsize = 8; -+ ivsize = 0; - mode = WD_CIPHER_ECB; - alg = WD_CIPHER_3DES; - break; - case DES3_192_ECB: - keysize = 24; -- ivsize = 8; -+ ivsize = 0; - mode = WD_CIPHER_ECB; - alg = WD_CIPHER_3DES; - break; -@@ -204,7 +204,7 @@ static int sec_uadk_param_parse(thread_data *tddata, struct acc_option *options) - break; - case SM4_128_ECB: - keysize = 16; -- ivsize = 16; -+ ivsize = 0; - mode = WD_CIPHER_ECB; - alg = WD_CIPHER_SM4; - break; -@@ -233,7 +233,7 @@ static int sec_uadk_param_parse(thread_data *tddata, struct acc_option *options) - alg = WD_CIPHER_SM4; - break; - case SM4_128_XTS: -- keysize = 16; -+ keysize = 32; - ivsize = 16; - mode = WD_CIPHER_XTS; - alg = WD_CIPHER_SM4; -@@ -560,11 +560,14 @@ void *sec_uadk_poll(void *data) - poll_ctx uadk_poll_ctx = NULL; - thread_data *pdata = (thread_data *)data; - u32 expt = ACC_QUEUE_SIZE * g_thread_num; -+ u32 id = pdata->td_id; - u32 last_time = 2; /* poll need one more recv time */ - u32 count = 0; - u32 recv = 0; -- u32 i = 0; -- int ret; -+ int ret; -+ -+ if (id > g_ctxnum) -+ return NULL; - - switch(pdata->subtype) { - case CIPHER_TYPE: -@@ -582,15 +585,13 @@ void *sec_uadk_poll(void *data) - } - - while (last_time) { -- for (i = 0; i < g_ctx_cfg.ctx_num; i++) { -- ret = uadk_poll_ctx(i, expt, &recv); -- // SEC_TST_PRT("expt %u, poll %d recv: %u!\n", expt, i, recv); -- count += recv; -- recv = 0; -- if (unlikely(ret != -WD_EAGAIN && ret < 0)) { -- SEC_TST_PRT("poll ret: %u!\n", ret); -- goto recv_error; -- } -+ ret = uadk_poll_ctx(id, expt, &recv); -+ // SEC_TST_PRT("expt %u, poll %d recv: %u!\n", expt, i, recv); -+ count += recv; -+ recv = 0; -+ if (unlikely(ret != -WD_EAGAIN && ret < 0)) { -+ SEC_TST_PRT("poll ret: %u!\n", ret); -+ goto recv_error; - } - - if (get_run_state() == 0) -@@ -989,7 +990,7 @@ int sec_uadk_async_threads(struct acc_option *options) - thread_data threads_args[THREADS_NUM]; - thread_data threads_option; - pthread_t tdid[THREADS_NUM]; -- pthread_t pollid; -+ pthread_t pollid[THREADS_NUM]; - int i, ret; - - /* alg param parse and set to thread data */ -@@ -998,10 +999,14 @@ int sec_uadk_async_threads(struct acc_option *options) - return ret; - - /* poll thread */ -- ret = pthread_create(&pollid, NULL, sec_uadk_poll, &threads_option); -- if (ret) { -- SEC_TST_PRT("Create poll thread fail!\n"); -- goto async_error; -+ for (i = 0; i < g_ctxnum; i++) { -+ threads_args[i].subtype = threads_option.subtype; -+ threads_args[i].td_id = i; -+ ret = pthread_create(&pollid, NULL, sec_uadk_poll, &threads_args[i]); -+ if (ret) { -+ SEC_TST_PRT("Create poll thread fail!\n"); -+ goto async_error; -+ } - } - - for (i = 0; i < g_thread_num; i++) { -@@ -1028,10 +1033,12 @@ int sec_uadk_async_threads(struct acc_option *options) - } - } - -- ret = pthread_join(pollid, NULL); -- if (ret) { -- SEC_TST_PRT("Join poll thread fail!\n"); -- goto async_error; -+ for (i = 0; i < g_ctxnum; i++) { -+ ret = pthread_join(pollid[i], NULL); -+ if (ret) { -+ SEC_TST_PRT("Join poll thread fail!\n"); -+ goto async_error; -+ } - } - - async_error: -diff --git a/uadk_tool/sec_wd_benchmark.c b/uadk_tool/sec_wd_benchmark.c -index dffd3a7..74b106e 100644 ---- a/uadk_tool/sec_wd_benchmark.c -+++ b/uadk_tool/sec_wd_benchmark.c -@@ -200,13 +200,13 @@ static int sec_wd_param_parse(thread_data *tddata, struct acc_option *options) - break; - case DES3_128_ECB: - keysize = 16; -- ivsize = 8; -+ ivsize = 0; - mode = WCRYPTO_CIPHER_ECB; - alg = WCRYPTO_CIPHER_3DES; - break; - case DES3_192_ECB: - keysize = 24; -- ivsize = 8; -+ ivsize = 0; - mode = WCRYPTO_CIPHER_ECB; - alg = WCRYPTO_CIPHER_3DES; - break; -@@ -224,7 +224,7 @@ static int sec_wd_param_parse(thread_data *tddata, struct acc_option *options) - break; - case SM4_128_ECB: - keysize = 16; -- ivsize = 16; -+ ivsize = 0; - mode = WCRYPTO_CIPHER_ECB; - alg = WCRYPTO_CIPHER_SM4; - break; -@@ -253,7 +253,7 @@ static int sec_wd_param_parse(thread_data *tddata, struct acc_option *options) - alg = WCRYPTO_CIPHER_SM4; - break; - case SM4_128_XTS: -- keysize = 16; -+ keysize = 32; - ivsize = 16; - mode = WCRYPTO_CIPHER_XTS; - alg = WCRYPTO_CIPHER_SM4; -@@ -525,9 +525,9 @@ void *sec_wd_poll(void *data) - poll_ctx uadk_poll_ctx = NULL; - u32 expt = ACC_QUEUE_SIZE * g_thread_num; - u32 last_time = 2; /* poll need one more recv time */ -+ u32 id = pdata->td_id; - u32 count = 0; - u32 recv = 0; -- u32 i = 0; - - switch(pdata->subtype) { - case CIPHER_TYPE: -@@ -544,20 +544,21 @@ void *sec_wd_poll(void *data) - return NULL; - } - -+ if (id > g_thread_num) -+ return NULL; -+ - while (last_time) { -- for (i = 0; i < g_thread_num; i++) { -- recv = uadk_poll_ctx(g_thread_queue.bd_res[i].queue, expt); -- /* -- * warpdrive async mode poll easy to 100% with small package. -- * SEC_TST_PRT("warpdrive poll %d recv: %u!\n", i, recv); -- */ -- if (unlikely(recv < 0)) { -- SEC_TST_PRT("poll ret: %u!\n", recv); -- goto recv_error; -- } -- count += recv; -- recv = 0; -+ recv = uadk_poll_ctx(g_thread_queue.bd_res[id].queue, expt); -+ /* -+ * warpdrive async mode poll easy to 100% with small package. -+ * SEC_TST_PRT("warpdrive poll %d recv: %u!\n", i, recv); -+ */ -+ if (unlikely(recv < 0)) { -+ SEC_TST_PRT("poll ret: %u!\n", recv); -+ goto recv_error; - } -+ count += recv; -+ recv = 0; - - if (get_run_state() == 0) - last_time--; -@@ -1186,7 +1187,7 @@ int sec_wd_async_threads(struct acc_option *options) - thread_data threads_args[THREADS_NUM]; - thread_data threads_option; - pthread_t tdid[THREADS_NUM]; -- pthread_t pollid; -+ pthread_t pollid[THREADS_NUM]; - int i, ret; - - /* alg param parse and set to thread data */ -@@ -1195,10 +1196,14 @@ int sec_wd_async_threads(struct acc_option *options) - return ret; - - /* poll thread */ -- ret = pthread_create(&pollid, NULL, sec_wd_poll, &threads_option); -- if (ret) { -- SEC_TST_PRT("Create poll thread fail!\n"); -- goto async_error; -+ for (i = 0; i < g_thread_num; i++) { -+ threads_args[i].subtype = threads_option.subtype; -+ threads_args[i].td_id = i; -+ ret = pthread_create(&pollid[i], NULL, sec_wd_poll, &threads_args[i]); -+ if (ret) { -+ SEC_TST_PRT("Create poll thread fail!\n"); -+ goto async_error; -+ } - } - - for (i = 0; i < g_thread_num; i++) { -@@ -1225,10 +1230,12 @@ int sec_wd_async_threads(struct acc_option *options) - } - } - -- ret = pthread_join(pollid, NULL); -- if (ret) { -- SEC_TST_PRT("Join poll thread fail!\n"); -- goto async_error; -+ for (i = 0; i < g_thread_num; i++) { -+ ret = pthread_join(pollid[i], NULL); -+ if (ret) { -+ SEC_TST_PRT("Join poll thread fail!\n"); -+ goto async_error; -+ } - } - - async_error: -diff --git a/uadk_tool/uadk_benchmark.c b/uadk_tool/uadk_benchmark.c -index 0d7fc71..8c3c96f 100644 ---- a/uadk_tool/uadk_benchmark.c -+++ b/uadk_tool/uadk_benchmark.c -@@ -271,7 +271,7 @@ int get_rand_int(int range) - ACC_TST_PRT("rand range error!\n"); - return 1; - } -- srand((unsigned) time(NULL) * getpid()); -+ srand((unsigned)time(NULL) * getpid()); - randnum = rand() % range; - - return randnum; -@@ -281,7 +281,7 @@ void get_rand_data(u8 *addr, int size) - { - int i; - -- srand((unsigned) time(NULL) * getpid()); -+ srand((unsigned)time(NULL) * getpid()); - for (i = 0; i < size; i++) { - addr[i] = rand() % 0xFF; - } --- -2.25.1 - diff --git a/0066-uadk-tools-modify-uadk-benchmark-clean-code.patch b/0066-uadk-tools-modify-uadk-benchmark-clean-code.patch deleted file mode 100644 index 2aa139c..0000000 --- a/0066-uadk-tools-modify-uadk-benchmark-clean-code.patch +++ /dev/null @@ -1,28 +0,0 @@ -From a1f58e62ddb6419f50bfb3ae743d6db39533a42c Mon Sep 17 00:00:00 2001 -From: Liulongfang -Date: Wed, 23 Feb 2022 10:36:09 +0800 -Subject: [PATCH 72/76] uadk/tools: modify uadk benchmark clean code - -modify uadk benchmark thread create warning - -Signed-off-by: Liulongfang ---- - uadk_tool/sec_uadk_benchmark.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/uadk_tool/sec_uadk_benchmark.c b/uadk_tool/sec_uadk_benchmark.c -index 467e621..6eeee12 100644 ---- a/uadk_tool/sec_uadk_benchmark.c -+++ b/uadk_tool/sec_uadk_benchmark.c -@@ -1002,7 +1002,7 @@ int sec_uadk_async_threads(struct acc_option *options) - for (i = 0; i < g_ctxnum; i++) { - threads_args[i].subtype = threads_option.subtype; - threads_args[i].td_id = i; -- ret = pthread_create(&pollid, NULL, sec_uadk_poll, &threads_args[i]); -+ ret = pthread_create(&pollid[i], NULL, sec_uadk_poll, &threads_args[i]); - if (ret) { - SEC_TST_PRT("Create poll thread fail!\n"); - goto async_error; --- -2.25.1 - diff --git a/0067-uadk-v1-fix-for-cookie-initialization.patch b/0067-uadk-v1-fix-for-cookie-initialization.patch deleted file mode 100644 index 26e6bbc..0000000 --- a/0067-uadk-v1-fix-for-cookie-initialization.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 4b10036f1504396fd61fac2ada45c8bc84cfd77e Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 24 Feb 2022 11:22:26 +0800 -Subject: [PATCH 73/76] uadk: v1: fix for cookie initialization - -If ctx message number is too big, it takes a lot of time -to initialize each cookies and drag performance, so this -patch reduce it from 1024 to 64. -We also found calloc in wd_init_cookie_pool use to much cpu -when it does memset zero, which is not unnecessary, so -replace it with malloc is better. - -Signed-off-by: Wenkai Lin ---- - v1/wd_util.c | 7 ++++--- - v1/wd_util.h | 2 +- - 2 files changed, 5 insertions(+), 4 deletions(-) - -diff --git a/v1/wd_util.c b/v1/wd_util.c -index 616bf69..715804c 100644 ---- a/v1/wd_util.c -+++ b/v1/wd_util.c -@@ -85,12 +85,13 @@ void wd_free_id(__u8 *buf, __u32 size, __u32 id, __u32 id_max) - int wd_init_cookie_pool(struct wd_cookie_pool *pool, - __u32 cookies_size, __u32 cookies_num) - { -- pool->cookies = calloc(1, cookies_size * cookies_num + cookies_num); -+ __u64 total_size = cookies_size * cookies_num; -+ -+ pool->cookies = malloc(total_size + cookies_num); - if (!pool->cookies) - return -WD_ENOMEM; - -- pool->cstatus = (void *)((uintptr_t)pool->cookies + -- cookies_num * cookies_size); -+ pool->cstatus = (void *)((uintptr_t)pool->cookies + total_size); - pool->cookies_num = cookies_num; - pool->cookies_size = cookies_size; - pool->cid = 0; -diff --git a/v1/wd_util.h b/v1/wd_util.h -index 1ac157e..78b91ee 100644 ---- a/v1/wd_util.h -+++ b/v1/wd_util.h -@@ -36,7 +36,7 @@ - #include "v1/wd_ecc.h" - #include "v1/wd_adapter.h" - --#define WD_CTX_MSG_NUM 1024 -+#define WD_CTX_MSG_NUM 64 - #define WD_HPRE_CTX_MSG_NUM 64 - #define WD_RNG_CTX_MSG_NUM 256 - #define WD_MAX_CTX_NUM 256 --- -2.25.1 - diff --git a/0068-uadk-update-file-permission-on-cleanup.patch b/0068-uadk-update-file-permission-on-cleanup.patch deleted file mode 100644 index 64122bb..0000000 --- a/0068-uadk-update-file-permission-on-cleanup.patch +++ /dev/null @@ -1,19 +0,0 @@ -From f9f3fc6a1de8e20680ef4c5c0efd98c7d503b87b Mon Sep 17 00:00:00 2001 -From: Haojian Zhuang -Date: Wed, 23 Feb 2022 15:36:10 +0800 -Subject: [PATCH 74/76] uadk: update file permission on cleanup - -Set execution permission on cleanup.sh. - -Signed-off-by: Haojian Zhuang ---- - cleanup.sh | 0 - 1 file changed, 0 insertions(+), 0 deletions(-) - mode change 100644 => 100755 cleanup.sh - -diff --git a/cleanup.sh b/cleanup.sh -old mode 100644 -new mode 100755 --- -2.25.1 - diff --git a/0069-uadk_tool-fix-build-warning-of-sec_wd_benchmark.patch b/0069-uadk_tool-fix-build-warning-of-sec_wd_benchmark.patch deleted file mode 100644 index a42e534..0000000 --- a/0069-uadk_tool-fix-build-warning-of-sec_wd_benchmark.patch +++ /dev/null @@ -1,58 +0,0 @@ -From 42a496b15f685a8b3d763fe779cea17346e2116d Mon Sep 17 00:00:00 2001 -From: Zhangfei Gao -Date: Wed, 23 Feb 2022 06:39:14 +0000 -Subject: [PATCH 75/76] uadk_tool: fix build warning of sec_wd_benchmark -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Fix build warning: -In file included from sec_wd_benchmark.c:3: -uadk_benchmark.h:168:31: note: expected ‘u8 *’ {aka ‘unsigned char *’} but argument is of type ‘char *’ - 168 | extern void get_rand_data(u8 *addr, int size); - | ~~~~^~~~ - -sec_wd_benchmark.c: In function ‘sec_wd_async_run’: -sec_wd_benchmark.c:613:16: warning: pointer targets in passing argument 1 of ‘get_rand_data’ differ in signedness [-Wpointer-sign] - 613 | get_rand_data(src_data_buf, g_pktlen); - | ^~~~~~~~~~~~ - | | - | char * - -sec_wd_benchmark.c: In function ‘sec_wd_sync_run’: -sec_wd_benchmark.c:913:16: warning: pointer targets in passing argument 1 of ‘get_rand_data’ differ in signedness [-Wpointer-sign] - 913 | get_rand_data(src_data_buf, g_pktlen); - | ^~~~~~~~~~~~ - | | - | char * - -Signed-off-by: Zhangfei Gao ---- - uadk_tool/sec_wd_benchmark.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/uadk_tool/sec_wd_benchmark.c b/uadk_tool/sec_wd_benchmark.c -index 74b106e..2e9c55d 100644 ---- a/uadk_tool/sec_wd_benchmark.c -+++ b/uadk_tool/sec_wd_benchmark.c -@@ -610,7 +610,7 @@ static void *sec_wd_async_run(void *arg) - if (!src_data_buf) - return NULL; - -- get_rand_data(src_data_buf, g_pktlen); -+ get_rand_data((u8 *)src_data_buf, g_pktlen); - out_data_buf = malloc(g_pktlen * sizeof(char)); - if (!out_data_buf) { - free(src_data_buf); -@@ -910,7 +910,7 @@ static void *sec_wd_sync_run(void *arg) - if (!src_data_buf) - return NULL; - -- get_rand_data(src_data_buf, g_pktlen); -+ get_rand_data((u8 *)src_data_buf, g_pktlen); - out_data_buf = malloc(g_pktlen * sizeof(char)); - if (!out_data_buf) { - free(src_data_buf); --- -2.25.1 - diff --git a/0070-rsa-fix-interface-name-and-log-msg.patch b/0070-rsa-fix-interface-name-and-log-msg.patch deleted file mode 100644 index 8f90bc5..0000000 --- a/0070-rsa-fix-interface-name-and-log-msg.patch +++ /dev/null @@ -1,86 +0,0 @@ -From 0bcb18fc0c90e6e1ad10a457de5765e7ff609be7 Mon Sep 17 00:00:00 2001 -From: Junchong Pan -Date: Wed, 2 Mar 2022 07:15:19 +0000 -Subject: [PATCH 077/109] rsa: fix interface name and log msg - -wd_rsa_key_bits() is used to get key bits, -changing its name to wd_rsa_get_key_bits() -can make the semantics clearer. - -Signed-off-by: Junchong Pan -Signed-off-by: Zhiqi Song ---- - include/wd_rsa.h | 2 +- - test/hisi_hpre_test/test_hisi_hpre.c | 6 +++--- - wd_rsa.c | 4 ++-- - 3 files changed, 6 insertions(+), 6 deletions(-) - -diff --git a/include/wd_rsa.h b/include/wd_rsa.h -index 081bc2a..0978b79 100644 ---- a/include/wd_rsa.h -+++ b/include/wd_rsa.h -@@ -67,7 +67,7 @@ struct wd_rsa_sess_setup { - }; - - bool wd_rsa_is_crt(handle_t sess); --__u32 wd_rsa_key_bits(handle_t sess); -+__u32 wd_rsa_get_key_bits(handle_t sess); - void wd_rsa_get_pubkey(handle_t sess, struct wd_rsa_pubkey **pubkey); - void wd_rsa_get_prikey(handle_t sess, struct wd_rsa_prikey **prikey); - int wd_rsa_set_pubkey_params(handle_t sess, struct wd_dtb *e, struct wd_dtb *n); -diff --git a/test/hisi_hpre_test/test_hisi_hpre.c b/test/hisi_hpre_test/test_hisi_hpre.c -index 924adb7..57d76fd 100644 ---- a/test/hisi_hpre_test/test_hisi_hpre.c -+++ b/test/hisi_hpre_test/test_hisi_hpre.c -@@ -6793,7 +6793,7 @@ static int get_rsa_key_from_test_sample(handle_t sess, char *pubkey_file, - memset(&wd_q, 0, sizeof(wd_q)); - memset(&wd_p, 0, sizeof(wd_p)); - -- bits = wd_rsa_key_bits(sess); -+ bits = wd_rsa_get_key_bits(sess); - if (bits == 1024) { - e = rsa_e_1024; - p = rsa_p_1024; -@@ -7348,7 +7348,7 @@ int hpre_test_result_check(handle_t sess, struct wd_rsa_req *req, void *key) - } - - wd_rsa_get_prikey(sess, &prikey); -- keybits = wd_rsa_key_bits(sess); -+ keybits = wd_rsa_get_key_bits(sess); - key_size = keybits >> 3; - if (req->op_type == WD_RSA_GENKEY) { - if (wd_rsa_is_crt(sess)) { -@@ -7907,7 +7907,7 @@ static void _rsa_cb(void *req_t) - struct test_hpre_pthread_dt *thread_info = tag->thread_info; - - wd_rsa_get_prikey(sess, &prikey); -- keybits = wd_rsa_key_bits(sess); -+ keybits = wd_rsa_get_key_bits(sess); - key_size = keybits >> 3; - - thread_info->recv_task_num++; -diff --git a/wd_rsa.c b/wd_rsa.c -index 2e61927..4c8fd71 100644 ---- a/wd_rsa.c -+++ b/wd_rsa.c -@@ -599,7 +599,7 @@ struct wd_rsa_kg_out *wd_rsa_new_kg_out(handle_t sess) - - kg_out = malloc(kg_out_size + sizeof(*kg_out)); - if (!kg_out) { -- WD_ERR("sess malloc kg_in memory fail!\n"); -+ WD_ERR("sess malloc kg_out memory fail!\n"); - return NULL; - } - -@@ -875,7 +875,7 @@ bool wd_rsa_is_crt(handle_t sess) - return ((struct wd_rsa_sess *)sess)->setup.is_crt; - } - --__u32 wd_rsa_key_bits(handle_t sess) -+__u32 wd_rsa_get_key_bits(handle_t sess) - { - if (!sess) { - WD_ERR("get rsa key bits, sess NULL!\n"); --- -2.27.0 - diff --git a/0071-uadk-modify-param-verification.patch b/0071-uadk-modify-param-verification.patch deleted file mode 100644 index 848ffdf..0000000 --- a/0071-uadk-modify-param-verification.patch +++ /dev/null @@ -1,127 +0,0 @@ -From f15516b66eb92d0c9a90532eb23c96e93a14ee10 Mon Sep 17 00:00:00 2001 -From: Junchong Pan -Date: Wed, 2 Mar 2022 07:25:49 +0000 -Subject: [PATCH 078/109] uadk: modify param verification - -When config->ctxs[0] is NULL, take ctxs[0].ctx -may cause a crash, so check config->ctxs[0] when -performing init param check. - -Signed-off-by: Junchong Pan -Signed-off-by: Zhiqi Song ---- - v1/wd_sgl.c | 4 ++-- - wd_aead.c | 2 +- - wd_cipher.c | 2 +- - wd_comp.c | 5 ++--- - wd_dh.c | 2 +- - wd_digest.c | 2 +- - wd_ecc.c | 2 +- - 7 files changed, 9 insertions(+), 10 deletions(-) - -diff --git a/v1/wd_sgl.c b/v1/wd_sgl.c -index 97edbf4..9995d69 100644 ---- a/v1/wd_sgl.c -+++ b/v1/wd_sgl.c -@@ -516,8 +516,8 @@ void wd_free_sgl(void *pool, struct wd_sgl *sgl) - struct wd_sgl *next; - int i; - -- if (unlikely(!p || !sgl)) { -- WD_ERR("pool or sgl is null!\n"); -+ if (unlikely(!p || !sgl || !p->sgl_pool)) { -+ WD_ERR("pool or sgl or p->sgl_pool is null!\n"); - return; - } - -diff --git a/wd_aead.c b/wd_aead.c -index d8581db..a78f152 100644 ---- a/wd_aead.c -+++ b/wd_aead.c -@@ -392,7 +392,7 @@ static int aead_param_check(struct wd_aead_sess *sess, - - static int aead_init_check(struct wd_ctx_config *config, struct wd_sched *sched) - { -- if (!config || !sched) { -+ if (!config || !config->ctxs || !config->ctxs[0].ctx || !sched) { - WD_ERR("wd aead config or sched is NULL!\n"); - return -WD_EINVAL; - } -diff --git a/wd_cipher.c b/wd_cipher.c -index 0b29fb5..8daac0f 100644 ---- a/wd_cipher.c -+++ b/wd_cipher.c -@@ -157,7 +157,7 @@ static int cipher_key_len_check(struct wd_cipher_sess *sess, __u32 length) - static int cipher_init_check(struct wd_ctx_config *config, - struct wd_sched *sched) - { -- if (!config || !sched) { -+ if (!config || !config->ctxs || !config->ctxs[0].ctx || !sched) { - WD_ERR("wd cipher config or sched is NULL!\n"); - return -WD_EINVAL; - } -diff --git a/wd_comp.c b/wd_comp.c -index 722666d..886e6fc 100644 ---- a/wd_comp.c -+++ b/wd_comp.c -@@ -87,7 +87,7 @@ int wd_comp_init(struct wd_ctx_config *config, struct wd_sched *sched) - void *priv; - int ret; - -- if (!config || !sched) { -+ if (!config || !config->ctxs || !config->ctxs[0].ctx || !sched) { - WD_ERR("invalid params, config or sched is NULL!\n"); - return -WD_EINVAL; - } -@@ -223,8 +223,7 @@ int wd_comp_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - req = &msg->req; - req->src_len = msg->in_cons; - req->dst_len = msg->produced; -- if (req->cb) -- req->cb(req, req->cb_param); -+ req->cb(req, req->cb_param); - - /* free msg cache to msg_pool */ - wd_put_msg_to_pool(&wd_comp_setting.pool, idx, resp_msg.tag); -diff --git a/wd_dh.c b/wd_dh.c -index b361d5d..841a126 100644 ---- a/wd_dh.c -+++ b/wd_dh.c -@@ -80,7 +80,7 @@ void wd_dh_set_driver(struct wd_dh_driver *drv) - - static int param_check(struct wd_ctx_config *config, struct wd_sched *sched) - { -- if (!config || !config->ctxs[0].ctx || !sched) { -+ if (!config || !config->ctxs || !config->ctxs[0].ctx || !sched) { - WD_ERR("config or sched NULL\n"); - return -WD_EINVAL; - } -diff --git a/wd_digest.c b/wd_digest.c -index 1c05851..21c3876 100644 ---- a/wd_digest.c -+++ b/wd_digest.c -@@ -154,7 +154,7 @@ void wd_digest_free_sess(handle_t h_sess) - - static int digest_init_check(struct wd_ctx_config *config, struct wd_sched *sched) - { -- if (!config || !sched) { -+ if (!config || !config->ctxs || !config->ctxs[0].ctx || !sched) { - WD_ERR("failed to check input param!\n"); - return -WD_EINVAL; - } -diff --git a/wd_ecc.c b/wd_ecc.c -index 89566ea..3232e67 100644 ---- a/wd_ecc.c -+++ b/wd_ecc.c -@@ -134,7 +134,7 @@ void wd_ecc_set_driver(struct wd_ecc_driver *drv) - - static int init_param_check(struct wd_ctx_config *config, struct wd_sched *sched) - { -- if (!config || !config->ctxs[0].ctx || !sched) { -+ if (!config || !config->ctxs || !config->ctxs[0].ctx || !sched) { - WD_ERR("config or sched NULL\n"); - return -WD_EINVAL; - } --- -2.27.0 - diff --git a/0072-uadk-v1-cleanup-ret-value.patch b/0072-uadk-v1-cleanup-ret-value.patch deleted file mode 100644 index 58eab88..0000000 --- a/0072-uadk-v1-cleanup-ret-value.patch +++ /dev/null @@ -1,38 +0,0 @@ -From e0451ee34c5d5c258fbb359a89a7a925ace7efa4 Mon Sep 17 00:00:00 2001 -From: Junchong Pan -Date: Fri, 4 Mar 2022 01:56:08 +0000 -Subject: [PATCH 079/109] uadk/v1: cleanup ret value - -It is unnecessary to initialize variable 'ret' and -return it when the function is executed successfully, -so remove 'ret'. - -Signed-off-by: Junchong Pan ---- - v1/wd_aead.c | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/v1/wd_aead.c b/v1/wd_aead.c -index ad22426..6d8c541 100644 ---- a/v1/wd_aead.c -+++ b/v1/wd_aead.c -@@ -263,7 +263,6 @@ free_ctx_id: - int wcrypto_aead_setauthsize(void *ctx, __u16 authsize) - { - struct wcrypto_aead_ctx *ctxt = ctx; -- int ret = WD_SUCCESS; - - if (!ctx) { - WD_ERR("input param is NULL!\n"); -@@ -277,7 +276,7 @@ int wcrypto_aead_setauthsize(void *ctx, __u16 authsize) - - ctxt->auth_size = authsize; - -- return ret; -+ return WD_SUCCESS; - } - - int wcrypto_aead_getauthsize(void *ctx) --- -2.27.0 - diff --git a/0073-uadk-wd-fixup-about-checking-device.patch b/0073-uadk-wd-fixup-about-checking-device.patch deleted file mode 100644 index 47dfcdd..0000000 --- a/0073-uadk-wd-fixup-about-checking-device.patch +++ /dev/null @@ -1,46 +0,0 @@ -From f5f79ed6d426809ef7ad4dc06bbdf7d2ba1bd9bc Mon Sep 17 00:00:00 2001 -From: Junchong Pan -Date: Fri, 4 Mar 2022 02:22:19 +0000 -Subject: [PATCH 080/109] uadk/wd: fixup about checking device - -Add non-empty check for ctx->dev. - -Signed-off-by: Junchong Pan ---- - wd.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/wd.c b/wd.c -index 565c173..b88ee62 100644 ---- a/wd.c -+++ b/wd.c -@@ -480,7 +480,7 @@ char *wd_ctx_get_api(handle_t h_ctx) - { - struct wd_ctx_h *ctx = (struct wd_ctx_h *)h_ctx; - -- if (!ctx) -+ if (!ctx || !ctx->dev) - return NULL; - - return ctx->dev->api; -@@ -508,7 +508,7 @@ int wd_is_sva(handle_t h_ctx) - { - struct wd_ctx_h *ctx = (struct wd_ctx_h *)h_ctx; - -- if (!ctx) -+ if (!ctx || !ctx->dev) - return -WD_EINVAL; - - if ((unsigned int)ctx->dev->flags & UACCE_DEV_SVA) -@@ -521,7 +521,7 @@ int wd_get_numa_id(handle_t h_ctx) - { - struct wd_ctx_h *ctx = (struct wd_ctx_h *)h_ctx; - -- if (!ctx) -+ if (!ctx || !ctx->dev) - return -WD_EINVAL; - - return ctx->dev->numa_id; --- -2.27.0 - diff --git a/0074-uadk-cleanup-hpre-code.patch b/0074-uadk-cleanup-hpre-code.patch deleted file mode 100644 index a7e14bd..0000000 --- a/0074-uadk-cleanup-hpre-code.patch +++ /dev/null @@ -1,347 +0,0 @@ -From 50b68c0405544702181deb9dda28381169b17d09 Mon Sep 17 00:00:00 2001 -From: Junchong Pan -Date: Fri, 4 Mar 2022 02:25:54 +0000 -Subject: [PATCH 081/109] uadk: cleanup hpre code - -Includes: -1.Remove useless interface param. -2.Remove ASSERT. -3.Remove print address. - -Signed-off-by: Junchong Pan ---- - drv/hisi_hpre.c | 26 +++++++++++++++------- - drv/hisi_qm_udrv.c | 2 -- - v1/drv/hisi_hpre_udrv.c | 48 ++++++++++++++++++++++++++++------------- - v1/wd_ecc.c | 24 ++++++++++----------- - wd_ecc.c | 24 ++++++++++----------- - 5 files changed, 75 insertions(+), 49 deletions(-) - -diff --git a/drv/hisi_hpre.c b/drv/hisi_hpre.c -index fbb38e0..f1d7720 100644 ---- a/drv/hisi_hpre.c -+++ b/drv/hisi_hpre.c -@@ -127,7 +127,7 @@ static bool is_hpre_bin_fmt(const char *data, int dsz, int bsz) - } - - static int crypto_bin_to_hpre_bin(char *dst, const char *src, -- int b_size, int d_size, const char *p_name) -+ __u32 b_size, __u32 d_size, const char *p_name) - { - int i = d_size - 1; - bool is_hpre_bin; -@@ -1469,6 +1469,11 @@ static struct wd_ecc_out *create_ecdh_out(struct wd_ecc_msg *msg) - struct wd_ecc_dh_out *dh_out; - struct wd_ecc_out *out; - -+ if (!hsz) { -+ WD_ERR("get msg key size error!\n"); -+ return NULL; -+ } -+ - out = malloc(len); - if (!out) { - WD_ERR("failed to alloc, sz = %u!\n", len); -@@ -1601,6 +1606,11 @@ static int ecc_fill(struct wd_ecc_msg *msg, struct hisi_hpre_sqe *hw_msg) - return -WD_EINVAL; - } - -+ if (!hw_sz) { -+ WD_ERR("get msg key size error!\n"); -+ return -WD_EINVAL; -+ } -+ - memset(hw_msg, 0, sizeof(*hw_msg)); - - /* prepare algorithm */ -@@ -1646,7 +1656,7 @@ static int sm2_enc_send(handle_t ctx, struct wd_ecc_msg *msg) - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); - struct wd_sm2_enc_in *ein = msg->req.src; - struct wd_ecc_msg *msg_dst[2] = {NULL}; -- struct hisi_hpre_sqe hw_msg[2] = {{0}}; -+ struct hisi_hpre_sqe hw_msg[2] = {0}; - struct wd_hash_mt *hash = &msg->hash; - __u16 send_cnt = 0; - int ret; -@@ -1918,7 +1928,7 @@ static __u32 get_hash_bytes(__u8 type) - return val; - } - --static void msg_pack(char *dst, __u64 dst_len, __u64 *out_len, -+static void msg_pack(char *dst, __u64 *out_len, - const void *src, __u32 src_len) - { - if (unlikely(!src || !src_len)) -@@ -1961,8 +1971,8 @@ static int sm2_kdf(struct wd_dtb *out, struct wd_ecc_point *x2y2, - ctr[2] = (i >> 8) & 0xFF; - ctr[1] = (i >> 16) & 0xFF; - ctr[0] = (i >> 24) & 0xFF; -- msg_pack(p_in, lens, &in_len, x2y2->x.data, x2y2_len); -- msg_pack(p_in, lens, &in_len, ctr, sizeof(ctr)); -+ msg_pack(p_in, &in_len, x2y2->x.data, x2y2_len); -+ msg_pack(p_in, &in_len, ctr, sizeof(ctr)); - - t_out = m_len >= h_bytes ? tmp : p_out; - ret = hash->cb(p_in, in_len, t_out, h_bytes, hash->usr); -@@ -2026,9 +2036,9 @@ static int sm2_hash(struct wd_dtb *out, struct wd_ecc_point *x2y2, - if (unlikely(!p_in)) - return -WD_ENOMEM; - -- msg_pack(p_in, lens, &in_len, x2y2->x.data, x2y2->x.dsize); -- msg_pack(p_in, lens, &in_len, msg->data, msg->dsize); -- msg_pack(p_in, lens, &in_len, x2y2->y.data, x2y2->y.dsize); -+ msg_pack(p_in, &in_len, x2y2->x.data, x2y2->x.dsize); -+ msg_pack(p_in, &in_len, msg->data, msg->dsize); -+ msg_pack(p_in, &in_len, x2y2->y.data, x2y2->y.dsize); - ret = hash->cb(p_in, in_len, hash_out, h_bytes, hash->usr); - if (unlikely(ret)) { - WD_ERR("failed to hash cb, ret = %d!\n", ret); -diff --git a/drv/hisi_qm_udrv.c b/drv/hisi_qm_udrv.c -index 845fa46..2e692a1 100644 ---- a/drv/hisi_qm_udrv.c -+++ b/drv/hisi_qm_udrv.c -@@ -896,8 +896,6 @@ void hisi_qm_dump_sgl(void *sgl) - int i; - - while (tmp) { -- WD_ERR("sgl = %p\n", tmp); -- WD_ERR("sgl->next_dma : 0x%lx\n", tmp->next_dma); - WD_ERR("sgl->entry_sum_in_chain : %u\n", - tmp->entry_sum_in_chain); - WD_ERR("sgl->entry_sum_in_sgl : %u\n", -diff --git a/v1/drv/hisi_hpre_udrv.c b/v1/drv/hisi_hpre_udrv.c -index c6ca0ad..ba32114 100644 ---- a/v1/drv/hisi_hpre_udrv.c -+++ b/v1/drv/hisi_hpre_udrv.c -@@ -499,7 +499,6 @@ int qm_fill_rsa_sqe(void *message, struct qm_queue_info *info, __u16 i) - hw_msg->low_tag = tag->ctx_id; - hw_msg->done = 0x1; - hw_msg->etype = 0x0; -- ASSERT(!info->req_cache[i]); - info->req_cache[i] = msg; - - return WD_SUCCESS; -@@ -517,7 +516,10 @@ int qm_parse_rsa_sqe(void *msg, const struct qm_queue_info *info, - __u16 kbytes; - int ret; - -- ASSERT(rsa_msg); -+ if (unlikely(!rsa_msg)) { -+ WD_ERR("info->req_cache is null at index:%hu\n", i); -+ return 0; -+ } - - /* if this hardware message not belong to me, then try again */ - if (usr && LOW_U16(hw_msg->low_tag) != usr) -@@ -700,7 +702,6 @@ int qm_fill_dh_sqe(void *message, struct qm_queue_info *info, __u16 i) - if (unlikely(ret)) - goto map_xp_fail; - } -- ASSERT(!info->req_cache[i]); - info->req_cache[i] = msg; - - ret = qm_final_fill_dh_sqe(q, msg, hw_msg); -@@ -726,7 +727,11 @@ int qm_parse_dh_sqe(void *msg, const struct qm_queue_info *info, - struct wd_queue *q = info->q; - int ret; - -- ASSERT(dh_msg); -+ if (unlikely(!dh_msg)) { -+ WD_ERR("info->req_cache is null at index:%hu\n", i); -+ return 0; -+ } -+ - if (usr && LOW_U16(hw_msg->low_tag) != usr) - return 0; - if (hw_msg->done != HPRE_HW_TASK_DONE || hw_msg->etype) { -@@ -1668,7 +1673,6 @@ static int qm_fill_ecc_sqe_general(void *message, struct qm_queue_info *info, - hw_msg->low_tag = tag->ctx_id; - hw_msg->done = 0x1; - hw_msg->etype = 0x0; -- ASSERT(!info->req_cache[i]); - info->req_cache[i] = msg; - - return WD_SUCCESS; -@@ -1942,6 +1946,7 @@ static int fill_sm2_dec_sqe(void *message, struct qm_queue_info *info, __u16 i) - struct wd_mm_br *br = &qinfo->br; - __u32 ksz = req_src->key_bytes; - struct wcrypto_ecc_msg *dst; -+ int ret; - - /* c2 data lens <= 4096 bit */ - if (din->c2.dsize <= BITS_TO_BYTES(4096) && -@@ -1966,11 +1971,21 @@ static int fill_sm2_dec_sqe(void *message, struct qm_queue_info *info, __u16 i) - dst->in = (void *)&din->c1; - dst->out = br->alloc(br->usr, ECDH_OUT_PARAMS_SZ(ksz)); - if (unlikely(!dst->out)) { -- free(dst); -- return -WD_ENOMEM; -+ ret = -WD_ENOMEM; -+ goto free_dst; - } - -- return qm_fill_ecc_sqe_general(dst, info, i); -+ ret = qm_fill_ecc_sqe_general(dst, info, i); -+ if (ret) -+ goto free_out; -+ -+ return ret; -+ -+free_out: -+ br->free(br->usr, dst->out); -+free_dst: -+ free(dst); -+ return ret; - } - - int qm_fill_ecc_sqe(void *message, struct qm_queue_info *info, __u16 i) -@@ -1997,7 +2012,10 @@ static int qm_parse_ecc_sqe_general(void *msg, const struct qm_queue_info *info, - __u16 kbytes; - int ret; - -- ASSERT(ecc_msg); -+ if (unlikely(!ecc_msg)) { -+ WD_ERR("info->req_cache is null at index:%hu\n", i); -+ return 0; -+ } - - /* if this hw msg not belong to me, then try again */ - if (usr && LOW_U16(hw_msg->low_tag) != usr) -@@ -2146,7 +2164,7 @@ static __u32 get_hash_bytes(__u8 type) - return val; - } - --static void msg_pack(char *dst, __u64 dst_len, __u64 *out_len, -+static void msg_pack(char *dst, __u64 *out_len, - const void *src, __u32 src_len) - { - if (unlikely(!src || !src_len)) -@@ -2191,8 +2209,8 @@ static int sm2_kdf(struct wd_dtb *out, struct wcrypto_ecc_point *x2y2, - ctr[1] = (i >> 16) & 0xFF; - ctr[0] = (i >> 24) & 0xFF; - in_len = 0; -- msg_pack(p_in, lens, &in_len, x2y2->x.data, x2y2_len); -- msg_pack(p_in, lens, &in_len, ctr, sizeof(ctr)); -+ msg_pack(p_in, &in_len, x2y2->x.data, x2y2_len); -+ msg_pack(p_in, &in_len, ctr, sizeof(ctr)); - - t_out = m_len >= h_bytes ? tmp : p_out; - ret = hash->cb(p_in, in_len, t_out, h_bytes, hash->usr); -@@ -2257,9 +2275,9 @@ static int sm2_hash(struct wd_dtb *out, struct wcrypto_ecc_point *x2y2, - if (unlikely(!p_in)) - return -WD_ENOMEM; - -- msg_pack(p_in, lens, &in_len, x2y2->x.data, x2y2->x.dsize); -- msg_pack(p_in, lens, &in_len, msg->data, msg->dsize); -- msg_pack(p_in, lens, &in_len, x2y2->y.data, x2y2->y.dsize); -+ msg_pack(p_in, &in_len, x2y2->x.data, x2y2->x.dsize); -+ msg_pack(p_in, &in_len, msg->data, msg->dsize); -+ msg_pack(p_in, &in_len, x2y2->y.data, x2y2->y.dsize); - ret = hash->cb(p_in, in_len, hash_out, h_bytes, hash->usr); - if (unlikely(ret)) { - WD_ERR("failed to hash cb, ret = %d!\n", ret); -diff --git a/v1/wd_ecc.c b/v1/wd_ecc.c -index c710d8a..2358243 100644 ---- a/v1/wd_ecc.c -+++ b/v1/wd_ecc.c -@@ -1508,7 +1508,7 @@ static int ecc_request_init(struct wcrypto_ecc_msg *req, - return WD_SUCCESS; - } - --static void msg_pack(char *dst, __u64 dst_len, __u64 *out_len, -+static void msg_pack(char *dst, __u64 *out_len, - const void *src, __u32 src_len) - { - if (unlikely(!src || !src_len)) -@@ -1831,17 +1831,17 @@ static int sm2_compute_za_hash(__u8 *za, __u32 *len, struct wd_dtb *id, - - memset(p_in, 0, lens); - temp = id_bits >> 8; -- msg_pack(p_in, lens, &in_len, &temp, sizeof(__u8)); -+ msg_pack(p_in, &in_len, &temp, sizeof(__u8)); - temp = id_bits & 0xFF; -- msg_pack(p_in, lens, &in_len, &temp, sizeof(__u8)); -+ msg_pack(p_in, &in_len, &temp, sizeof(__u8)); - if (id) -- msg_pack(p_in, lens, &in_len, id->data, id_bytes); -- msg_pack(p_in, lens, &in_len, cv->a.data, key_size); -- msg_pack(p_in, lens, &in_len, cv->b.data, key_size); -- msg_pack(p_in, lens, &in_len, cv->g.x.data, key_size); -- msg_pack(p_in, lens, &in_len, cv->g.y.data, key_size); -- msg_pack(p_in, lens, &in_len, pub->x.data, key_size); -- msg_pack(p_in, lens, &in_len, pub->y.data, key_size); -+ msg_pack(p_in, &in_len, id->data, id_bytes); -+ msg_pack(p_in, &in_len, cv->a.data, key_size); -+ msg_pack(p_in, &in_len, cv->b.data, key_size); -+ msg_pack(p_in, &in_len, cv->g.x.data, key_size); -+ msg_pack(p_in, &in_len, cv->g.y.data, key_size); -+ msg_pack(p_in, &in_len, pub->x.data, key_size); -+ msg_pack(p_in, &in_len, pub->y.data, key_size); - - hash_bytes = get_hash_bytes(hash->type); - *len = hash_bytes; -@@ -1885,8 +1885,8 @@ static int sm2_compute_digest(void *ctx, struct wd_dtb *hash_msg, - - /* e = h(ZA || M) */ - memset(p_in, 0, lens); -- msg_pack(p_in, lens, &in_len, za, za_len); -- msg_pack(p_in, lens, &in_len, plaintext->data, plaintext->dsize); -+ msg_pack(p_in, &in_len, za, za_len); -+ msg_pack(p_in, &in_len, plaintext->data, plaintext->dsize); - hash_msg->dsize = hash_bytes; - ret = hash->cb((const char *)p_in, in_len, hash_msg->data, - hash_bytes, hash->usr); -diff --git a/wd_ecc.c b/wd_ecc.c -index 3232e67..a9994b2 100644 ---- a/wd_ecc.c -+++ b/wd_ecc.c -@@ -1396,7 +1396,7 @@ static int fill_ecc_msg(struct wd_ecc_msg *msg, struct wd_ecc_req *req, - return WD_SUCCESS; - } - --static void msg_pack(char *dst, __u64 dst_len, __u64 *out_len, -+static void msg_pack(char *dst, __u64 *out_len, - const void *src, __u32 src_len) - { - if (!src || !src_len) -@@ -1596,17 +1596,17 @@ static int sm2_compute_za_hash(__u8 *za, __u32 *len, struct wd_dtb *id, - - memset(p_in, 0, lens); - temp = id_bits >> 8; -- msg_pack(p_in, lens, &in_len, &temp, sizeof(__u8)); -+ msg_pack(p_in, &in_len, &temp, sizeof(__u8)); - temp = id_bits & 0xFF; -- msg_pack(p_in, lens, &in_len, &temp, sizeof(__u8)); -+ msg_pack(p_in, &in_len, &temp, sizeof(__u8)); - if (id) -- msg_pack(p_in, lens, &in_len, id->data, id_bytes); -- msg_pack(p_in, lens, &in_len, cv->a.data, key_size); -- msg_pack(p_in, lens, &in_len, cv->b.data, key_size); -- msg_pack(p_in, lens, &in_len, cv->g.x.data, key_size); -- msg_pack(p_in, lens, &in_len, cv->g.y.data, key_size); -- msg_pack(p_in, lens, &in_len, pub->x.data, key_size); -- msg_pack(p_in, lens, &in_len, pub->y.data, key_size); -+ msg_pack(p_in, &in_len, id->data, id_bytes); -+ msg_pack(p_in, &in_len, cv->a.data, key_size); -+ msg_pack(p_in, &in_len, cv->b.data, key_size); -+ msg_pack(p_in, &in_len, cv->g.x.data, key_size); -+ msg_pack(p_in, &in_len, cv->g.y.data, key_size); -+ msg_pack(p_in, &in_len, pub->x.data, key_size); -+ msg_pack(p_in, &in_len, pub->y.data, key_size); - hash_bytes = get_hash_bytes(hash->type); - *len = hash_bytes; - ret = hash->cb((const char *)p_in, in_len, -@@ -1649,8 +1649,8 @@ static int sm2_compute_digest(struct wd_ecc_sess *sess, struct wd_dtb *hash_msg, - - /* e = h(ZA || M) */ - memset(p_in, 0, lens); -- msg_pack(p_in, lens, &in_len, za, za_len); -- msg_pack(p_in, lens, &in_len, plaintext->data, plaintext->dsize); -+ msg_pack(p_in, &in_len, za, za_len); -+ msg_pack(p_in, &in_len, plaintext->data, plaintext->dsize); - hash_msg->dsize = hash_bytes; - ret = hash->cb((const char *)p_in, in_len, hash_msg->data, - hash_bytes, hash->usr); --- -2.27.0 - diff --git a/0075-uadk-v1-fix-pool-cstatus-memset-problem.patch b/0075-uadk-v1-fix-pool-cstatus-memset-problem.patch deleted file mode 100644 index 308465d..0000000 --- a/0075-uadk-v1-fix-pool-cstatus-memset-problem.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 1c72d89b848290814601517e73f6a9d8eb6e5caa Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 3 Mar 2022 15:10:04 +0800 -Subject: [PATCH 082/109] uadk: v1: fix pool cstatus memset problem - -wd_alloc_id use __atomic_test_and_set to find -an available cookie with zero status, -it may not find a zero cookie with dirty memory, -so cookie status region should be set to zero. - -Signed-off-by: Wenkai Lin ---- - v1/wd_util.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/v1/wd_util.c b/v1/wd_util.c -index 715804c..112cc16 100644 ---- a/v1/wd_util.c -+++ b/v1/wd_util.c -@@ -92,6 +92,8 @@ int wd_init_cookie_pool(struct wd_cookie_pool *pool, - return -WD_ENOMEM; - - pool->cstatus = (void *)((uintptr_t)pool->cookies + total_size); -+ memset(pool->cstatus, 0, cookies_num); -+ - pool->cookies_num = cookies_num; - pool->cookies_size = cookies_size; - pool->cid = 0; --- -2.27.0 - diff --git a/0076-uadk-bugfix-segment-fault-when-uninitializing.patch b/0076-uadk-bugfix-segment-fault-when-uninitializing.patch deleted file mode 100644 index b05c514..0000000 --- a/0076-uadk-bugfix-segment-fault-when-uninitializing.patch +++ /dev/null @@ -1,108 +0,0 @@ -From 1d20eaf8c0829531ab5cb4fc8ecd4142147b482d Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Wed, 9 Mar 2022 01:30:51 +0000 -Subject: [PATCH 084/109] uadk: bugfix segment fault when uninitializing - -When the initialization of each alg driver failed, -the wd__setting.priv should be set to NULL. -Otherwise there will be segment fault when -uninitializing the alg driver. - -Signed-off-by: Zhiqi Song ---- - wd_aead.c | 1 + - wd_cipher.c | 1 + - wd_comp.c | 1 + - wd_dh.c | 1 + - wd_digest.c | 1 + - wd_ecc.c | 1 + - wd_rsa.c | 1 + - 7 files changed, 7 insertions(+) - -diff --git a/wd_aead.c b/wd_aead.c -index a78f152..7df8e80 100644 ---- a/wd_aead.c -+++ b/wd_aead.c -@@ -458,6 +458,7 @@ int wd_aead_init(struct wd_ctx_config *config, struct wd_sched *sched) - - out_init: - free(priv); -+ wd_aead_setting.priv = NULL; - out_priv: - wd_uninit_async_request_pool(&wd_aead_setting.pool); - out_sched: -diff --git a/wd_cipher.c b/wd_cipher.c -index 8daac0f..afd8c4d 100644 ---- a/wd_cipher.c -+++ b/wd_cipher.c -@@ -299,6 +299,7 @@ int wd_cipher_init(struct wd_ctx_config *config, struct wd_sched *sched) - - out_init: - free(priv); -+ wd_cipher_setting.priv = NULL; - out_priv: - wd_uninit_async_request_pool(&wd_cipher_setting.pool); - out_sched: -diff --git a/wd_comp.c b/wd_comp.c -index 886e6fc..8d0c603 100644 ---- a/wd_comp.c -+++ b/wd_comp.c -@@ -145,6 +145,7 @@ int wd_comp_init(struct wd_ctx_config *config, struct wd_sched *sched) - - out_init: - free(priv); -+ wd_comp_setting.priv = NULL; - out_priv: - wd_uninit_async_request_pool(&wd_comp_setting.pool); - out_sched: -diff --git a/wd_dh.c b/wd_dh.c -index 841a126..f5d70a2 100644 ---- a/wd_dh.c -+++ b/wd_dh.c -@@ -145,6 +145,7 @@ int wd_dh_init(struct wd_ctx_config *config, struct wd_sched *sched) - - out_init: - free(priv); -+ wd_dh_setting.priv = NULL; - out_priv: - wd_uninit_async_request_pool(&wd_dh_setting.pool); - out_sched: -diff --git a/wd_digest.c b/wd_digest.c -index 21c3876..06774be 100644 ---- a/wd_digest.c -+++ b/wd_digest.c -@@ -220,6 +220,7 @@ int wd_digest_init(struct wd_ctx_config *config, struct wd_sched *sched) - - out_init: - free(priv); -+ wd_digest_setting.priv = NULL; - out_priv: - wd_uninit_async_request_pool(&wd_digest_setting.pool); - out_sched: -diff --git a/wd_ecc.c b/wd_ecc.c -index a9994b2..d925bc3 100644 ---- a/wd_ecc.c -+++ b/wd_ecc.c -@@ -199,6 +199,7 @@ int wd_ecc_init(struct wd_ctx_config *config, struct wd_sched *sched) - - out_init: - free(priv); -+ wd_ecc_setting.priv = NULL; - out_priv: - wd_uninit_async_request_pool(&wd_ecc_setting.pool); - out_sched: -diff --git a/wd_rsa.c b/wd_rsa.c -index 4c8fd71..8fc405f 100644 ---- a/wd_rsa.c -+++ b/wd_rsa.c -@@ -185,6 +185,7 @@ int wd_rsa_init(struct wd_ctx_config *config, struct wd_sched *sched) - - out_init: - free(priv); -+ wd_rsa_setting.priv = NULL; - out_priv: - wd_uninit_async_request_pool(&wd_rsa_setting.pool); - out_sched: --- -2.27.0 - diff --git a/0077-drv-sec-support-sm4-ecb-alg-by-new-fs.patch b/0077-drv-sec-support-sm4-ecb-alg-by-new-fs.patch deleted file mode 100644 index bfc3ec6..0000000 --- a/0077-drv-sec-support-sm4-ecb-alg-by-new-fs.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 4e2b91f8079ad1195e20c730cda4e33643918257 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Tue, 8 Mar 2022 16:14:17 +0800 -Subject: [PATCH 085/109] drv/sec: support sm4-ecb alg by new fs - -Kunpeng 920 can supports sm4-ecb by test, and has -been updated the chip fs. - -Signed-off-by: Kai Ye ---- - drv/hisi_sec.c | 4 ---- - v1/drv/hisi_sec_udrv.c | 4 ---- - 2 files changed, 8 deletions(-) - -diff --git a/drv/hisi_sec.c b/drv/hisi_sec.c -index 264d850..16fcb5f 100644 ---- a/drv/hisi_sec.c -+++ b/drv/hisi_sec.c -@@ -656,10 +656,6 @@ static int fill_cipher_bd2_mode(struct wd_cipher_msg *msg, - - switch (msg->mode) { - case WD_CIPHER_ECB: -- if (msg->alg == WD_CIPHER_SM4) { -- WD_ERR("kunpeng 920 not support ECB(SM4)!\n"); -- return -WD_EINVAL; -- } - c_mode = C_MODE_ECB; - break; - case WD_CIPHER_CBC: -diff --git a/v1/drv/hisi_sec_udrv.c b/v1/drv/hisi_sec_udrv.c -index 7345baf..3e1e7d1 100644 ---- a/v1/drv/hisi_sec_udrv.c -+++ b/v1/drv/hisi_sec_udrv.c -@@ -165,10 +165,6 @@ static int fill_cipher_bd2_mode(struct wcrypto_cipher_msg *msg, - - switch (msg->mode) { - case WCRYPTO_CIPHER_ECB: -- if (msg->alg == WCRYPTO_CIPHER_SM4) { -- WD_ERR("kunpeng 920 not support ECB(SM4)!\n"); -- return -WD_EINVAL; -- } - sqe->type2.c_mode = C_MODE_ECB; - break; - case WCRYPTO_CIPHER_CBC: --- -2.27.0 - diff --git a/0078-digest-simplify-the-process-of-represent-BD-state.patch b/0078-digest-simplify-the-process-of-represent-BD-state.patch deleted file mode 100644 index 71c50a3..0000000 --- a/0078-digest-simplify-the-process-of-represent-BD-state.patch +++ /dev/null @@ -1,74 +0,0 @@ -From f83ee120e0dcab4120d65c045787a6bfc58b8c92 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Tue, 8 Mar 2022 18:18:16 +0800 -Subject: [PATCH 086/109] digest: simplify the process of represent BD state - -The value of 'out_bytes' can be expressed the BD state. So not need to -use the marco variable. The BD state is non-zero value when the msg -recived successfully. Otherwise the BD state is zero. - -Signed-off-by: Kai Ye ---- - wd_digest.c | 22 +++++++++++++--------- - 1 file changed, 13 insertions(+), 9 deletions(-) - -diff --git a/wd_digest.c b/wd_digest.c -index 06774be..fb29746 100644 ---- a/wd_digest.c -+++ b/wd_digest.c -@@ -21,7 +21,6 @@ - - #define POLL_SIZE 100000 - #define POLL_TIME 1000 --#define STREAM_MODE_STATE 1 - - static int g_digest_mac_len[WD_DIGEST_TYPE_MAX] = { - WD_DIGEST_SM3_LEN, WD_DIGEST_MD5_LEN, WD_DIGEST_SHA1_LEN, -@@ -48,10 +47,10 @@ struct wd_digest_sess { - __u32 key_bytes; - void *sched_key; - /* -- * Notify the BD state, 1 is final BD or middle BD, -- * 0 is normal mode or first BD, one session only supports one stream. -+ * Notify the BD state, zero is frist BD, non-zero -+ * is middle or final BD. - */ -- int state; -+ int bd_state; - /* Total of data for stream mode */ - __u64 long_data_len; - }; -@@ -301,11 +300,11 @@ static void fill_request_msg(struct wd_digest_msg *msg, - msg->has_next = req->has_next; - sess->long_data_len += req->in_bytes; - msg->long_data_len = sess->long_data_len; -- /* To store the stream bd state, iv_bytes also means bd state */ -- msg->iv_bytes = sess->state; -+ /* To store the stream BD state, iv_bytes also means BD state */ -+ msg->iv_bytes = sess->bd_state; - if (req->has_next == 0) { - sess->long_data_len = 0; -- sess->state = 0; -+ sess->bd_state = 0; - } - } - -@@ -339,8 +338,13 @@ static int send_recv_sync(struct wd_ctx_internal *ctx, struct wd_digest_sess *ds - goto out; - } - } -- if (msg->has_next && msg->result == WD_SUCCESS) -- dsess->state = STREAM_MODE_STATE; -+ -+ /* -+ * 'out_bytes' can be expressed BD state, non-zero is final BD or -+ * middle BD as stream mode. -+ */ -+ if (msg->has_next) -+ dsess->bd_state = msg->out_bytes; - } while (ret < 0); - - out: --- -2.27.0 - diff --git a/0079-uadk-qm_udrv-Modify-goto-err_out.patch b/0079-uadk-qm_udrv-Modify-goto-err_out.patch deleted file mode 100644 index 9f1667a..0000000 --- a/0079-uadk-qm_udrv-Modify-goto-err_out.patch +++ /dev/null @@ -1,45 +0,0 @@ -From d554782317fb25319690c2f6453994494a0396d0 Mon Sep 17 00:00:00 2001 -From: JunchongPan -Date: Thu, 10 Mar 2022 20:58:46 +0800 -Subject: [PATCH 087/109] uadk/qm_udrv: Modify goto err_out - -In setup_region, when mmap_qfr return NULL, don't need -to set sq_base/mmio_base NULL, return ENOMEM direct. - -Signed-off-by: JunchongPan ---- - drv/hisi_qm_udrv.c | 9 ++------- - 1 file changed, 2 insertions(+), 7 deletions(-) - -diff --git a/drv/hisi_qm_udrv.c b/drv/hisi_qm_udrv.c -index 2e692a1..906dfa3 100644 ---- a/drv/hisi_qm_udrv.c -+++ b/drv/hisi_qm_udrv.c -@@ -168,22 +168,17 @@ static int hisi_qm_setup_region(handle_t h_ctx, - q_info->sq_base = wd_ctx_mmap_qfr(h_ctx, UACCE_QFRT_DUS); - if (!q_info->sq_base) { - WD_ERR("mmap dus fail\n"); -- goto err_out; -+ return -WD_ENOMEM; - } - - q_info->mmio_base = wd_ctx_mmap_qfr(h_ctx, UACCE_QFRT_MMIO); - if (!q_info->mmio_base) { - wd_ctx_unmap_qfr(h_ctx, UACCE_QFRT_DUS); - WD_ERR("mmap mmio fail\n"); -- goto err_out; -+ return -WD_ENOMEM; - } - - return 0; -- --err_out: -- q_info->sq_base = NULL; -- q_info->mmio_base = NULL; -- return -WD_ENOMEM; - } - - static void hisi_qm_unset_region(handle_t h_ctx, --- -2.27.0 - diff --git a/0080-uadk-unify-wd-print-format.patch b/0080-uadk-unify-wd-print-format.patch deleted file mode 100644 index bb60085..0000000 --- a/0080-uadk-unify-wd-print-format.patch +++ /dev/null @@ -1,992 +0,0 @@ -From 61912fcfdef3b29e22731b38fbb81dff47102568 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 10 Mar 2022 20:03:18 +0800 -Subject: [PATCH 088/109] uadk: unify wd print format - -Unify print format with following rules: -1. failed to do sth. -2. invalid: sth is NULL. - -Signed-off-by: Wenkai Lin ---- - drv/hisi_qm_udrv.c | 63 ++++++++++++++++++------------------ - wd.c | 6 ++-- - wd_mempool.c | 61 ++++++++++++++++++++-------------- - wd_sched.c | 52 ++++++++++++++--------------- - wd_util.c | 81 ++++++++++++++++++++-------------------------- - 5 files changed, 130 insertions(+), 133 deletions(-) - -diff --git a/drv/hisi_qm_udrv.c b/drv/hisi_qm_udrv.c -index 906dfa3..be06570 100644 ---- a/drv/hisi_qm_udrv.c -+++ b/drv/hisi_qm_udrv.c -@@ -167,14 +167,14 @@ static int hisi_qm_setup_region(handle_t h_ctx, - { - q_info->sq_base = wd_ctx_mmap_qfr(h_ctx, UACCE_QFRT_DUS); - if (!q_info->sq_base) { -- WD_ERR("mmap dus fail\n"); -+ WD_ERR("failed to mmap dus!\n"); - return -WD_ENOMEM; - } - - q_info->mmio_base = wd_ctx_mmap_qfr(h_ctx, UACCE_QFRT_MMIO); - if (!q_info->mmio_base) { - wd_ctx_unmap_qfr(h_ctx, UACCE_QFRT_DUS); -- WD_ERR("mmap mmio fail\n"); -+ WD_ERR("failed to mmap mmio!\n"); - return -WD_ENOMEM; - } - -@@ -197,14 +197,14 @@ static __u32 get_version_id(handle_t h_ctx) - - api_name = wd_ctx_get_api(h_ctx); - if (!api_name || strlen(api_name) <= VERSION_ID_SHIFT) { -- WD_ERR("api name error = %s\n", api_name); -+ WD_ERR("invalid: api name is %s!\n", api_name); - return 0; - } - - id = api_name + VERSION_ID_SHIFT; - ver = strtoul(id, NULL, 10); - if (!ver || ver == ULONG_MAX) { -- WD_ERR("fail to strtoul, ver = %lu\n", ver); -+ WD_ERR("failed to strtoul, ver = %lu!\n", ver); - return 0; - } - -@@ -250,7 +250,7 @@ static int his_qm_set_qp_ctx(handle_t h_ctx, struct hisi_qm_priv *config, - q_info->qc_type = qp_ctx.qc_type; - ret = wd_ctx_set_io_cmd(h_ctx, UACCE_CMD_QM_SET_QP_CTX, &qp_ctx); - if (ret < 0) { -- WD_ERR("HISI QM fail to set qc_type, use default value\n"); -+ WD_ERR("failed to set qc_type, use default value!\n"); - return ret; - } - -@@ -265,13 +265,13 @@ static int hisi_qm_get_qfrs_offs(handle_t h_ctx, - q_info->region_size[UACCE_QFRT_DUS] = wd_ctx_get_region_size(h_ctx, - UACCE_QFRT_DUS); - if (!q_info->region_size[UACCE_QFRT_DUS]) { -- WD_ERR("fail to get DUS qfrs offset.\n"); -+ WD_ERR("failed to get DUS qfrs offset!\n"); - return -WD_EINVAL; - } - q_info->region_size[UACCE_QFRT_MMIO] = wd_ctx_get_region_size(h_ctx, - UACCE_QFRT_MMIO); - if (!q_info->region_size[UACCE_QFRT_MMIO]) { -- WD_ERR("fail to get MMIO qfrs offset.\n"); -+ WD_ERR("failed to get MMIO qfrs offset!\n"); - return -WD_EINVAL; - } - -@@ -286,25 +286,25 @@ static int hisi_qm_setup_info(struct hisi_qp *qp, struct hisi_qm_priv *config) - q_info = &qp->q_info; - ret = hisi_qm_setup_region(qp->h_ctx, q_info); - if (ret) { -- WD_ERR("setup region fail\n"); -+ WD_ERR("failed to setup region!\n"); - return ret; - } - - ret = hisi_qm_get_qfrs_offs(qp->h_ctx, q_info); - if (ret) { -- WD_ERR("get dev qfrs offset fail.\n"); -+ WD_ERR("failed to get dev qfrs offset!\n"); - goto err_out; - } - - ret = hisi_qm_setup_db(qp->h_ctx, q_info); - if (ret) { -- WD_ERR("setup db fail\n"); -+ WD_ERR("failed to setup db!\n"); - goto err_out; - } - - ret = his_qm_set_qp_ctx(qp->h_ctx, config, q_info); - if (ret) { -- WD_ERR("setup io cmd fail\n"); -+ WD_ERR("failed to setup io cmd!\n"); - goto err_out; - } - -@@ -320,7 +320,7 @@ static int hisi_qm_setup_info(struct hisi_qp *qp, struct hisi_qm_priv *config) - - ret = pthread_spin_init(&q_info->lock, PTHREAD_PROCESS_SHARED); - if (ret) { -- WD_ERR("init qinfo lock fail\n"); -+ WD_ERR("failed to init qinfo lock!\n"); - goto err_out; - } - -@@ -352,8 +352,8 @@ handle_t hisi_qm_alloc_qp(struct hisi_qm_priv *config, handle_t ctx) - if (!config) - goto out; - -- if (config->sqe_size <= 0) { -- WD_ERR("invalid sqe size (%u)\n", config->sqe_size); -+ if (!config->sqe_size) { -+ WD_ERR("invalid: sqe size is zero!\n"); - goto out; - } - -@@ -367,7 +367,8 @@ handle_t hisi_qm_alloc_qp(struct hisi_qm_priv *config, handle_t ctx) - if (ret) - goto out_qp; - -- qp->h_sgl_pool = hisi_qm_create_sglpool(HISI_SGL_NUM_IN_BD, HISI_SGE_NUM_IN_SGL); -+ qp->h_sgl_pool = hisi_qm_create_sglpool(HISI_SGL_NUM_IN_BD, -+ HISI_SGE_NUM_IN_SGL); - if (!qp->h_sgl_pool) - goto out_qp; - -@@ -396,7 +397,7 @@ void hisi_qm_free_qp(handle_t h_qp) - struct hisi_qp *qp = (struct hisi_qp *)h_qp; - - if (!qp) { -- WD_ERR("h_qp is NULL.\n"); -+ WD_ERR("invalid: h_qp is NULL!\n"); - return; - } - -@@ -461,7 +462,7 @@ static int hisi_qm_recv_single(struct hisi_qm_queue_info *q_info, void *resp) - j = CQE_SQ_HEAD_INDEX(cqe); - if (j >= QM_Q_DEPTH) { - pthread_spin_unlock(&q_info->lock); -- WD_ERR("CQE_SQ_HEAD_INDEX(%u) error\n", j); -+ WD_ERR("CQE_SQ_HEAD_INDEX(%u) error!\n", j); - return -WD_EIO; - } - memcpy(resp, (void *)((uintptr_t)q_info->sq_base + -@@ -535,7 +536,7 @@ static void *hisi_qm_create_sgl(__u32 sge_num) - sge_num * (sizeof(struct hisi_sge)) + HISI_SGL_ALIGE; - sgl = calloc(1, size); - if (!sgl) { -- WD_ERR("failed to create sgl\n"); -+ WD_ERR("failed to create sgl!\n"); - return NULL; - } - -@@ -562,36 +563,34 @@ handle_t hisi_qm_create_sglpool(__u32 sgl_num, __u32 sge_num) - int i, ret; - - if (!sgl_num || !sge_num || sge_num > HISI_SGE_NUM_IN_SGL) { -- WD_ERR("create sgl_pool failed, sgl_num=%u, sge_num=%u\n", -+ WD_ERR("failed to create sgl_pool, sgl_num=%u, sge_num=%u!\n", - sgl_num, sge_num); - return 0; - } - - sgl_pool = calloc(1, sizeof(struct hisi_sgl_pool)); - if (!sgl_pool) { -- WD_ERR("sgl pool alloc memory failed.\n"); -+ WD_ERR("failed to alloc memory for sgl_pool!\n"); - return 0; - } - - sgl_pool->sgl = calloc(sgl_num, sizeof(void *)); - if (!sgl_pool->sgl) { -- WD_ERR("sgl array alloc memory failed.\n"); -+ WD_ERR("failed to alloc memory for sgl!\n"); - goto err_out; - } - - sgl_pool->sgl_align = calloc(sgl_num, sizeof(void *)); - if (!sgl_pool->sgl_align) { -- WD_ERR("sgl align array alloc memory failed.\n"); -+ WD_ERR("failed to alloc memory for sgl align!\n"); - goto err_out; - } - - /* base the sgl_num create the sgl chain */ - for (i = 0; i < sgl_num; i++) { - sgl_pool->sgl[i] = hisi_qm_create_sgl(sge_num); -- if (!sgl_pool->sgl[i]) { -- WD_ERR("sgl create failed.\n"); -+ if (!sgl_pool->sgl[i]) - goto err_out; -- } - - sgl_pool->sgl_align[i] = hisi_qm_align_sgl(sgl_pool->sgl[i], sge_num); - } -@@ -602,7 +601,7 @@ handle_t hisi_qm_create_sglpool(__u32 sgl_num, __u32 sge_num) - sgl_pool->top = sgl_num; - ret = pthread_spin_init(&sgl_pool->lock, PTHREAD_PROCESS_SHARED); - if (ret) { -- WD_ERR("init sgl pool lock failed.\n"); -+ WD_ERR("failed to init sgl pool lock!\n"); - goto err_out; - } - -@@ -619,7 +618,7 @@ void hisi_qm_destroy_sglpool(handle_t sgl_pool) - int i; - - if (!pool) { -- WD_ERR("sgl_pool is NULL\n"); -+ WD_ERR("invalid: sgl_pool is NULL!\n"); - return; - } - if (pool->sgl) { -@@ -642,7 +641,7 @@ static struct hisi_sgl *hisi_qm_sgl_pop(struct hisi_sgl_pool *pool) - pthread_spin_lock(&pool->lock); - - if (pool->top == 0) { -- WD_ERR("The sgl pool is empty\n"); -+ WD_ERR("invalid: the sgl pool is empty!\n"); - pthread_spin_unlock(&pool->lock); - return NULL; - } -@@ -657,7 +656,7 @@ static int hisi_qm_sgl_push(struct hisi_sgl_pool *pool, struct hisi_sgl *hw_sgl) - { - pthread_spin_lock(&pool->lock); - if (pool->top >= pool->depth) { -- WD_ERR("The sgl pool is full\n"); -+ WD_ERR("invalid: the sgl pool is full!\n"); - pthread_spin_unlock(&pool->lock); - return -WD_EINVAL; - } -@@ -705,7 +704,7 @@ void *hisi_qm_get_hw_sgl(handle_t sgl_pool, struct wd_datalist *sgl) - int i = 0; - - if (!pool || !sgl) { -- WD_ERR("get hw sgl pool or sgl is NULL\n"); -+ WD_ERR("invalid: hw sgl pool or sgl is NULL!\n"); - return NULL; - } - -@@ -723,7 +722,7 @@ void *hisi_qm_get_hw_sgl(handle_t sgl_pool, struct wd_datalist *sgl) - } - - if (tmp->len > HISI_MAX_SIZE_IN_SGE) { -- WD_ERR("the data len is invalid: %u\n", tmp->len); -+ WD_ERR("invalid: the data len is %u!\n", tmp->len); - goto err_out; - } - -@@ -742,7 +741,7 @@ void *hisi_qm_get_hw_sgl(handle_t sgl_pool, struct wd_datalist *sgl) - if (i == pool->sge_num && tmp->next) { - next = hisi_qm_sgl_pop(pool); - if (!next) { -- WD_ERR("the sgl pool is not enough\n"); -+ WD_ERR("invalid: the sgl pool is not enough!\n"); - goto err_out; - } - cur->next_dma = (uintptr_t)next; -diff --git a/wd.c b/wd.c -index b88ee62..0774837 100644 ---- a/wd.c -+++ b/wd.c -@@ -59,14 +59,14 @@ static int get_raw_attr(const char *dev_root, const char *attr, char *buf, - - fd = open(attr_path, O_RDONLY, 0); - if (fd < 0) { -- WD_ERR("open %s fail (%d)!\n", attr_path, -errno); -+ WD_ERR("failed to open %s(%d)!\n", attr_path, -errno); - return -WD_ENODEV; - } - - memset(buf, 0, sz); - size = read(fd, buf, sz); - if (size <= 0) { -- WD_ERR("read nothing at %s!\n", attr_path); -+ WD_ERR("failed to read anything at %s!\n", attr_path); - size = -WD_EIO; - } - -@@ -601,7 +601,7 @@ static int check_alg_name(const char *alg_name) - while (alg_name[i] != '\0') { - i++; - if (i >= MAX_ATTR_STR_SIZE) { -- WD_ERR("get list failed, alg name is too long!\n"); -+ WD_ERR("failed to get list, alg name is too long!\n"); - return -WD_EINVAL; - } - } -diff --git a/wd_mempool.c b/wd_mempool.c -index b6e1088..bfacd28 100644 ---- a/wd_mempool.c -+++ b/wd_mempool.c -@@ -206,12 +206,17 @@ static __always_inline unsigned long wd_ffs(unsigned long word) - - static struct bitmap *create_bitmap(int bits) - { -- struct bitmap *bm = calloc(1, sizeof(*bm)); -- if (!bm) -+ struct bitmap *bm; -+ -+ bm = calloc(1, sizeof(*bm)); -+ if (!bm) { -+ WD_ERR("failed to alloc memory for bitmap!\n"); - return NULL; -+ } - - bm->map = calloc(BITS_TO_LONGS(bits), sizeof(unsigned long)); - if (!bm->map) { -+ WD_ERR("failed to alloc memory for bitmap map!\n"); - free(bm); - return NULL; - } -@@ -346,6 +351,7 @@ static int alloc_memzone(struct blkpool *bp, void *addr, size_t blk_num, - - zone = calloc(1, sizeof(struct memzone)); - if (!zone) { -+ WD_ERR("failed to alloc memory for memzone!\n"); - return -ENOMEM; - } - -@@ -389,7 +395,8 @@ static void free_mem_to_mempool(struct blkpool *bp) - static int check_mempool_real_size(struct mempool *mp, struct blkpool *bp) - { - if (bp->blk_size * bp->depth > mp->real_size) { -- WD_ERR("wd_mempool: mempool too small: %lu\n", mp->real_size); -+ WD_ERR("invalid: mempool size is too small: %lu!\n", -+ mp->real_size); - return -ENOMEM; - } - -@@ -525,8 +532,10 @@ static int init_blkpool_elem(struct blkpool *bp) - int i; - - bp->blk_elem = calloc(bp->depth, sizeof(void *)); -- if (!bp->blk_elem) -+ if (!bp->blk_elem) { -+ WD_ERR("failed to alloc memory for blk_elem!\n"); - return -ENOMEM; -+ } - - TAILQ_FOREACH(iter, &bp->mz_list, node) { - for (i = 0; i < iter->blk_num; i++) -@@ -544,7 +553,7 @@ handle_t wd_blockpool_create(handle_t mempool, size_t block_size, - int ret; - - if (!mp || !block_size || !block_num) { -- WD_ERR("wd_mempool: input parameter is invalid value\n"); -+ WD_ERR("invalid: mempool is NULL or block param is 0!\n"); - return (handle_t)(-WD_EINVAL); - } - -@@ -552,8 +561,10 @@ handle_t wd_blockpool_create(handle_t mempool, size_t block_size, - return (handle_t)(-WD_EBUSY); - - bp = calloc(1, sizeof(struct blkpool)); -- if (!bp) -+ if (!bp) { -+ WD_ERR("failed to alloc memory for blkpool!\n"); - return (handle_t)(-WD_ENOMEM); -+ } - - bp->top = block_num; - bp->depth = block_num; -@@ -563,13 +574,13 @@ handle_t wd_blockpool_create(handle_t mempool, size_t block_size, - - ret = alloc_mem_from_mempool(mp, bp); - if (ret < 0) { -- WD_ERR("wd_mempool: failed to allocate memory from mempool\n"); -+ WD_ERR("failed to allocate memory from mempool!\n"); - goto err_free_bp; - } - - ret = init_blkpool_elem(bp); - if (ret < 0) { -- WD_ERR("wd_mempool: failed to init blkpool\n"); -+ WD_ERR("failed to init blkpool!\n"); - goto err_free_mem; - } - -@@ -590,7 +601,7 @@ void wd_blockpool_destroy(handle_t blkpool) - struct mempool *mp; - - if (!bp) { -- WD_ERR("wd_mempool: blkpool is NULL\n"); -+ WD_ERR("invalid: blkpool is NULL!\n"); - return; - } - -@@ -620,13 +631,13 @@ static int get_value_from_sysfs(const char *path, ssize_t path_size) - - fd = open(dev_path, O_RDONLY, 0); - if (fd < 0) { -- WD_ERR("wd_mempool: failed to open %s\n", dev_path); -+ WD_ERR("failed to open %s!\n", dev_path); - goto err_open; - } - - size = read(fd, buf, sizeof(buf)); - if (size <= 0) { -- WD_ERR("wd_mempool: failed to read %s\n", dev_path); -+ WD_ERR("failed to read %s!\n", dev_path); - goto err_read; - } - -@@ -716,7 +727,7 @@ static int get_hugepage_info(struct mempool *mp) - - dir = opendir(hugepage_path); - if (!dir) { -- WD_ERR("wd_mempool: failed to open %s\n", hugepage_path); -+ WD_ERR("failed to open %s\n!", hugepage_path); - return -errno; - } - -@@ -728,13 +739,13 @@ static int get_hugepage_info(struct mempool *mp) - - tmp = calloc(1, sizeof(*tmp)); - if (!tmp) { -- WD_ERR("wd_mempool: failed to calloc\n"); -+ WD_ERR("failed to calloc for sys_hugepage_config!\n"); - goto err_free_list; - } - ret = get_hugepage_info_per_type(hugepage_path, MAX_HP_STR_SIZE, - hp_dir, tmp); - if (ret < 0) { -- WD_ERR("wd_mempool: failed to get hugepage info\n"); -+ WD_ERR("failed to get hugepage info!\n"); - goto err_free; - } - -@@ -779,7 +790,7 @@ static int mbind_memory(void *addr, size_t size, int node) - node_mask = 1U << (unsigned int)node; - ret = mbind(addr, size, MPOL_BIND, &node_mask, max_node, 0); - if (ret < 0) { -- WD_ERR("wd_mempool: failed to mbind memory, %d\n", ret); -+ WD_ERR("failed to mbind memory, ret is %d!\n", ret); - return ret; - } - -@@ -805,7 +816,7 @@ static int alloc_mem_from_hugepage(struct mempool *mp) - break; - } - if (!iter) { -- WD_ERR("wd_mempool: failed to find proper hugepage\n"); -+ WD_ERR("failed to find proper hugepage!\n"); - ret = -ENOMEM; - goto err_put_info; - } -@@ -826,7 +837,7 @@ static int alloc_mem_from_hugepage(struct mempool *mp) - p = mmap(NULL, real_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | - MAP_ANONYMOUS | MAP_HUGETLB | flags, -1, 0); - if (p == MAP_FAILED) { -- WD_ERR("wd_mempool: failed to allocate huge page\n"); -+ WD_ERR("failed to allocate huge page!\n"); - ret = -ENOMEM; - goto err_put_info; - } -@@ -862,7 +873,7 @@ static int alloc_mempool_memory(struct mempool *mp) - - ret = alloc_mem_from_hugepage(mp); - if (ret) { -- WD_ERR("wd_mempool: failed to alloc memory from hugepage\n"); -+ WD_ERR("failed to alloc memory from hugepage!\n"); - return -ENOMEM; - } - -@@ -908,8 +919,10 @@ handle_t wd_mempool_create(size_t size, int node) - size += WD_MEMPOOL_BLOCK_SIZE - (WD_MEMPOOL_SIZE_MASK & size); - - mp = calloc(1, sizeof(*mp)); -- if (!mp) -+ if (!mp) { -+ WD_ERR("failed to alloc memory for mempool!\n"); - return (handle_t)(-WD_ENOMEM); -+ } - - mp->node = node; - mp->size = size; -@@ -938,7 +951,7 @@ void wd_mempool_destroy(handle_t mempool) - struct mempool *mp = (struct mempool *)mempool; - - if (!mp) { -- WD_ERR("wd_mempool: mempool is NULL\n"); -+ WD_ERR("invalid: mempool is NULL!\n"); - return; - } - -@@ -954,12 +967,12 @@ void wd_mempool_stats(handle_t mempool, struct wd_mempool_stats *stats) - struct mempool *mp = (struct mempool *)mempool; - - if (!mp) { -- WD_ERR("wd_mempool: mempool is NULL\n"); -+ WD_ERR("invalid: mempool is NULL!\n"); - return; - } - - if (!stats) { -- WD_ERR("wd_mempool: mempool stats is NULL\n"); -+ WD_ERR("invalid: mempool stats is NULL!\n"); - return; - } - -@@ -984,7 +997,7 @@ void wd_blockpool_stats(handle_t blkpool, struct wd_blockpool_stats *stats) - struct memzone *iter; - - if (!bp || !stats) { -- WD_ERR("wd_mempool: blkpool or stats is NULL\n"); -+ WD_ERR("invalid: blkpool or stats is NULL!\n"); - return; - } - -@@ -1001,7 +1014,7 @@ void wd_blockpool_stats(handle_t blkpool, struct wd_blockpool_stats *stats) - } - - if (!size) { -- WD_ERR("wd_mempool: blkpool size is zero\n"); -+ WD_ERR("invalid: blkpool size is zero!\n"); - wd_unspinlock(&bp->lock); - return; - } -diff --git a/wd_sched.c b/wd_sched.c -index ef90233..9b1998c 100644 ---- a/wd_sched.c -+++ b/wd_sched.c -@@ -129,8 +129,8 @@ static bool sched_key_valid(struct wd_sched_ctx *ctx, - { - if (key->numa_id >= ctx->numa_num || key->mode >= SCHED_MODE_BUTT || - key->type >= ctx->type_num) { -- WD_ERR("ERROR: %s key error - numa: %d, mode: %u, type: %u!\n", -- __FUNCTION__, key->numa_id, key->mode, key->type); -+ WD_ERR("invalid: sched key's numa: %d, mode: %u, type: %u!\n", -+ key->numa_id, key->mode, key->type); - return false; - } - -@@ -207,13 +207,13 @@ static int session_sched_poll_policy(handle_t sched_ctx, - __u16 i; - int ret; - -- if (!sched_ctx || !count || !ctx) { -- WD_ERR("ERROR: %s the para is NULL!\n", __FUNCTION__); -+ if (!count || !ctx) { -+ WD_ERR("invalid: sched ctx is NULL or count is zero!\n"); - return -WD_EINVAL; - } - - if (ctx->numa_num > NUMA_NUM_NODES) { -- WD_ERR("ERROR: %s ctx numa num is invalid!\n", __FUNCTION__); -+ WD_ERR("invalid: ctx's numa number is %d!\n", ctx->numa_num); - return -WD_EINVAL; - } - -@@ -270,16 +270,14 @@ static __u32 session_sched_init_ctx(handle_t sched_ctx, - bool ret; - - if (!ctx || !key) { -- WD_ERR("ERROR: %s the pointer para is NULL!\n", __FUNCTION__); -+ WD_ERR("invalid: sched ctx or key is NULL!\n"); - return INVALID_POS; - } - - key->mode = sched_mode; - ret = sched_key_valid(ctx, key); -- if (!ret) { -- WD_ERR("ERROR: %s the key is invalid!\n", __FUNCTION__); -+ if (!ret) - return INVALID_POS; -- } - - region = sched_get_ctx_range(ctx, key); - if (!region) -@@ -295,7 +293,7 @@ handle_t session_sched_init(handle_t h_sched_ctx, void *sched_param) - - skey = malloc(sizeof(struct sched_key)); - if (!skey) { -- WD_ERR("fail to alloc session sched key!\n"); -+ WD_ERR("failed to alloc memory for session sched key!\n"); - return (handle_t)(-WD_ENOMEM); - } - -@@ -328,7 +326,7 @@ static __u32 session_sched_pick_next_ctx(handle_t sched_ctx, - struct sched_key *key = (struct sched_key *)sched_key; - - if (unlikely(!sched_ctx || !key)) { -- WD_ERR("ERROR: %s the pointer para is NULL!\n", __FUNCTION__); -+ WD_ERR("invalid: sched ctx or key is NULL!\n"); - return INVALID_POS; - } - -@@ -357,13 +355,12 @@ int wd_sched_rr_instance(const struct wd_sched *sched, - int numa_id; - - if (!sched || !sched->h_sched_ctx || !param) { -- WD_ERR("ERROR: %s para err: sched of h_sched_ctx is NULL!\n", -- __FUNCTION__); -+ WD_ERR("invalid: sched or sched_params is NULL!\n"); - return -WD_EINVAL; - } - - if (param->begin > param->end) { -- WD_ERR("ERROR: sched_params's begin is larger than end!\n"); -+ WD_ERR("invalid: sched_params's begin is larger than end!\n"); - return -WD_EINVAL; - } - -@@ -373,28 +370,28 @@ int wd_sched_rr_instance(const struct wd_sched *sched, - sched_ctx = (struct wd_sched_ctx *)sched->h_sched_ctx; - - if (numa_id >= sched_ctx->numa_num || numa_id < 0) { -- WD_ERR("ERROR: %s para err: numa_id = %d, numa_num = %u\n", -- __FUNCTION__, numa_id, sched_ctx->numa_num); -+ WD_ERR("invalid: sched_ctx's numa_id is %d, numa_num is %u!\n", -+ numa_id, sched_ctx->numa_num); - return -WD_EINVAL; - } - - if (type >= sched_ctx->type_num) { -- WD_ERR("ERROR: %s para err: type = %u, type_num = %u\n", -- __FUNCTION__, type, sched_ctx->type_num); -+ WD_ERR("invalid: sched_ctx's type is %u, type_num is %u!\n", -+ type, sched_ctx->type_num); - return -WD_EINVAL; - } - - if (mode >= SCHED_MODE_BUTT) { -- WD_ERR("ERROR: %s para err: mode = %u, mode_num = %d!\n", -- __FUNCTION__, mode, SCHED_MODE_BUTT); -+ WD_ERR("invalid: sched_ctx's mode is %u, mode_num is %d!\n", -+ mode, SCHED_MODE_BUTT); - return -WD_EINVAL; - } - - sched_info = sched_ctx->sched_info; - - if (!sched_info[numa_id].ctx_region[mode]) { -- WD_ERR("ERROR: %s ctx_region of numa_id = %d, mode = %u is NULL!\n", -- __FUNCTION__, numa_id, mode); -+ WD_ERR("invalid: ctx_region is NULL, numa: %d, mode: %u!\n", -+ numa_id, mode); - return -WD_EINVAL; - } - -@@ -454,27 +451,26 @@ struct wd_sched *wd_sched_rr_alloc(__u8 sched_type, __u8 type_num, - return NULL; - - if (!numa_num || numa_num > max_node) { -- WD_ERR("Error: %s numa number = %u!\n", __FUNCTION__, -- numa_num); -+ WD_ERR("invalid: numa number is %u!\n", numa_num); - return NULL; - } - - if (sched_type >= SCHED_POLICY_BUTT || !type_num) { -- WD_ERR("Error: %s sched_type = %u or type_num = %u is invalid!\n", -- __FUNCTION__, sched_type, type_num); -+ WD_ERR("invalid: sched_type is %u or type_num is %u!\n", -+ sched_type, type_num); - return NULL; - } - - sched = calloc(1, sizeof(struct wd_sched)); - if (!sched) { -- WD_ERR("Error: %s wd_sched alloc error!\n", __FUNCTION__); -+ WD_ERR("failed to alloc memory for wd_sched!\n"); - return NULL; - } - - sched_ctx = calloc(1, sizeof(struct wd_sched_ctx) + - sizeof(struct wd_sched_info) * numa_num); - if (!sched_ctx) { -- WD_ERR("Error: %s sched_ctx alloc error!\n", __FUNCTION__); -+ WD_ERR("failed to alloc memory for sched_ctx!\n"); - goto err_out; - } - -diff --git a/wd_util.c b/wd_util.c -index 44c8909..03316b6 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -74,7 +74,7 @@ int wd_init_ctx_config(struct wd_ctx_config_internal *in, - int i, ret; - - if (!cfg->ctx_num) { -- WD_ERR("invalid parameters, ctx_num is 0!\n"); -+ WD_ERR("invalid: ctx_num is 0!\n"); - return -WD_EINVAL; - } - -@@ -90,7 +90,7 @@ int wd_init_ctx_config(struct wd_ctx_config_internal *in, - - for (i = 0; i < cfg->ctx_num; i++) { - if (!cfg->ctxs[i].ctx) { -- WD_ERR("invalid parameters, ctx is NULL!\n"); -+ WD_ERR("invalid: ctx is NULL!\n"); - free(ctxs); - return -WD_EINVAL; - } -@@ -98,7 +98,7 @@ int wd_init_ctx_config(struct wd_ctx_config_internal *in, - clone_ctx_to_internal(cfg->ctxs + i, ctxs + i); - ret = pthread_spin_init(&ctxs[i].lock, PTHREAD_PROCESS_SHARED); - if (ret) { -- WD_ERR("init ctxs lock failed!\n"); -+ WD_ERR("failed to init ctxs lock!\n"); - free(ctxs); - return ret; - } -@@ -243,7 +243,7 @@ void *wd_find_msg_in_pool(struct wd_async_msg_pool *pool, - - /* tag value start from 1 */ - if (tag == 0 || tag > msg_num) { -- WD_ERR("invalid message cache tag(%u)\n", tag); -+ WD_ERR("invalid: message cache tag is %u!\n", tag); - return NULL; - } - -@@ -279,7 +279,7 @@ void wd_put_msg_to_pool(struct wd_async_msg_pool *pool, int ctx_idx, __u32 tag) - - /* tag value start from 1 */ - if (!tag || tag > msg_num) { -- WD_ERR("invalid message cache idx(%u)\n", tag); -+ WD_ERR("invalid: message cache idx is %u!\n", tag); - return; - } - -@@ -318,14 +318,11 @@ void dump_env_info(struct wd_env_config *config) - config_numa->async_ctx_num); - for (j = 0; j < CTX_MODE_MAX; j++) - for (k = 0; k < config_numa->op_type_num; k++) { -- WD_ERR("-> %s: %d: [%d][%d].begin: %u\n", -- __func__, -+ WD_ERR("-> %d: [%d][%d].begin: %u\n", - i, j, k, ctx_table[j][k].begin); -- WD_ERR("-> %s: %d: [%d][%d].end: %u\n", -- __func__, -+ WD_ERR("-> %d: [%d][%d].end: %u\n", - i, j, k, ctx_table[j][k].end); -- WD_ERR("-> %s: %d: [%d][%d].size: %u\n", -- __func__, -+ WD_ERR("-> %d: [%d][%d].size: %u\n", - i, j, k, ctx_table[j][k].size); - } - } -@@ -340,8 +337,10 @@ static void *wd_get_config_numa(struct wd_env_config *config, int node) - if (config_numa->node == node) - break; - -- if (i == config->numa_num) -+ if (i == config->numa_num) { -+ WD_ERR("invalid: missing numa node is %d!\n", node); - return NULL; -+ } - - return config_numa; - } -@@ -373,7 +372,7 @@ static __u16 wd_get_dev_numa(struct uacce_dev_list *head, - if (list->dev->numa_id < 0) { - list->dev->numa_id = 0; - } else if (list->dev->numa_id >= size) { -- WD_ERR("numa id is wrong(%d)\n", list->dev->numa_id); -+ WD_ERR("invalid: numa id is %d!\n", list->dev->numa_id); - return 0; - } - -@@ -396,10 +395,8 @@ static void wd_set_numa_dev(struct uacce_dev_list *head, - - while (list) { - config_numa = wd_get_config_numa(config, list->dev->numa_id); -- if (!config_numa) { -- WD_ERR("%s got wrong numa node!\n", __func__); -+ if (!config_numa) - break; -- } - - dev = config_numa->dev + config_numa->dev_num; - memcpy(dev, list->dev, sizeof(*list->dev)); -@@ -457,7 +454,7 @@ static int wd_alloc_numa(struct wd_env_config *config, - /* get uacce_dev */ - head = wd_get_accel_list(ops->alg_name); - if (!head) { -- WD_ERR("no device to support %s\n", ops->alg_name); -+ WD_ERR("invalid: no device to support %s\n", ops->alg_name); - ret = -WD_ENODEV; - goto free_numa_dev_num; - } -@@ -465,7 +462,7 @@ static int wd_alloc_numa(struct wd_env_config *config, - /* get numa num and device num of each numa from uacce_dev list */ - config->numa_num = wd_get_dev_numa(head, numa_dev_num, max_node); - if (config->numa_num == 0 || config->numa_num > max_node) { -- WD_ERR("numa num err(%u)!\n", config->numa_num); -+ WD_ERR("invalid: numa number is %u!\n", config->numa_num); - ret = -WD_ENODEV; - goto free_list; - } -@@ -519,13 +516,13 @@ int wd_parse_async_poll_en(struct wd_env_config *config, const char *s) - int tmp; - - if (!is_number(s)) { -- WD_ERR("invalid async poll en flag: %s!\n", s); -+ WD_ERR("invalid: async poll en flag is %s!\n", s); - return -WD_EINVAL; - } - - tmp = strtol(s, NULL, 10); - if (tmp != 0 && tmp != 1) { -- WD_ERR("async poll en flag is not 0 or 1!\n"); -+ WD_ERR("invalid: async poll en flag is not 0 or 1!\n"); - return -WD_EINVAL; - } - -@@ -539,7 +536,7 @@ static int parse_num_on_numa(const char *s, int *num, int *node) - char *sep, *start, *left; - - if (!strlen(s)) { -- WD_ERR("input string length is zero!\n"); -+ WD_ERR("invalid: input string length is zero!\n"); - return -WD_EINVAL; - } - -@@ -560,7 +557,7 @@ static int parse_num_on_numa(const char *s, int *num, int *node) - } - - out: -- WD_ERR("input env format is invalid:%s\n", s); -+ WD_ERR("invalid: input env format is %s!\n", s); - free(start); - return -WD_EINVAL; - } -@@ -658,7 +655,7 @@ static int wd_parse_section(struct wd_env_config *config, char *section) - - ctx_section = index(section, ':'); - if (!ctx_section) { -- WD_ERR("%s got wrong format: %s!\n", __func__, section); -+ WD_ERR("invalid: ctx section got wrong format: %s!\n", section); - return -WD_EINVAL; - } - -@@ -669,10 +666,8 @@ static int wd_parse_section(struct wd_env_config *config, char *section) - return ret; - - config_numa = wd_get_config_numa(config, node); -- if (!config_numa) { -- WD_ERR("%s got wrong numa node: %s!\n", __func__, section); -+ if (!config_numa) - return -WD_EINVAL; -- } - - config_numa->op_type_num = config->op_type_num; - ret = wd_alloc_ctx_table_per_numa(config_numa); -@@ -681,7 +676,8 @@ static int wd_parse_section(struct wd_env_config *config, char *section) - - ret = get_and_fill_ctx_num(config_numa, section, ctx_num); - if (ret) { -- WD_ERR("%s got wrong ctx type: %s!\n", __func__, section); -+ WD_ERR("invalid: ctx section got wrong ctx type: %s!\n", -+ section); - wd_free_ctx_table_per_numa(config_numa); - return ret; - } -@@ -798,8 +794,6 @@ int wd_parse_async_poll_num(struct wd_env_config *config, const char *s) - goto out; - config_numa = wd_get_config_numa(config, node); - if (!config_numa) { -- WD_ERR("%s got wrong numa node: %s!\n", -- __func__, section); - ret = -WD_EINVAL; - goto out; - } -@@ -831,7 +825,7 @@ static int wd_parse_env(struct wd_env_config *config) - - ret = var->parse_fn(config, var_s); - if (ret) { -- WD_ERR("fail to parse %s environment variable!\n", -+ WD_ERR("failed to parse %s environment variable!\n", - var->name); - return -WD_EINVAL; - } -@@ -847,10 +841,8 @@ static int wd_parse_ctx_attr(struct wd_env_config *env_config, - int ret; - - config_numa = wd_get_config_numa(env_config, attr->node); -- if (!config_numa) { -- WD_ERR("%s got wrong numa node!\n", __func__); -+ if (!config_numa) - return -WD_EINVAL; -- } - - config_numa->op_type_num = env_config->op_type_num; - ret = wd_alloc_ctx_table_per_numa(config_numa); -@@ -958,7 +950,7 @@ static int wd_get_wd_ctx(struct wd_env_config_per_numa *config, - h_ctx = request_ctx_on_numa(config); - if (!h_ctx) { - ret = -WD_EBUSY; -- WD_ERR("err: request too many ctxs\n"); -+ WD_ERR("failed to request more ctxs!\n"); - goto free_ctx; - } - -@@ -1149,7 +1141,7 @@ static struct async_task_queue *find_async_queue(struct wd_env_config *config, - } - - if (!config_numa->async_poll_num) { -- WD_ERR("invalid parameter, async_poll_num of numa is zero!\n"); -+ WD_ERR("invalid: async_poll_num of numa is zero!\n"); - return NULL; - } - -@@ -1304,17 +1296,17 @@ static int wd_init_one_task_queue(struct async_task_queue *task_queue, - task_queue->alg_poll_ctx = alg_poll_ctx; - - if (sem_init(&task_queue->empty_sem, 0, depth)) { -- WD_ERR("empty_sem init failed.\n"); -+ WD_ERR("failed to init empty_sem!\n"); - goto err_free_head; - } - - if (sem_init(&task_queue->full_sem, 0, 0)) { -- WD_ERR("full_sem init failed.\n"); -+ WD_ERR("failed to init full_sem!\n"); - goto err_uninit_empty_sem; - } - - if (pthread_mutex_init(&task_queue->lock, NULL)) { -- WD_ERR("mutex init failed.\n"); -+ WD_ERR("failed to init task queue's mutex lock!\n"); - goto err_uninit_full_sem; - } - -@@ -1323,7 +1315,7 @@ static int wd_init_one_task_queue(struct async_task_queue *task_queue, - task_queue->tid = 0; - if (pthread_create(&thread_id, &attr, async_poll_process_func, - task_queue)) { -- WD_ERR("create poll thread failed.\n"); -+ WD_ERR("failed to create poll thread!\n"); - goto err_destory_mutex; - } - -@@ -1547,18 +1539,15 @@ int wd_alg_get_env_param(struct wd_env_config *env_config, - struct wd_env_config_per_numa *config_numa; - - if (!num || !is_enable) { -- WD_ERR("input parameter num or is_enable is NULL!\n"); -+ WD_ERR("invalid: input pointer num or is_enable is NULL!\n"); - return -WD_EINVAL; - } - - *is_enable = env_config->enable_internal_poll; - - config_numa = wd_get_config_numa(env_config, attr.node); -- if (!config_numa) { -- WD_ERR("%s got wrong numa node: %u!\n", -- __func__, attr.node); -+ if (!config_numa) - return -WD_EINVAL; -- } - - *num = (config_numa->ctx_table) ? - config_numa->ctx_table[attr.mode][attr.type].size : 0; -@@ -1570,7 +1559,7 @@ int wd_set_ctx_attr(struct wd_ctx_attr *ctx_attr, - __u32 node, __u32 type, __u8 mode, __u32 num) - { - if (mode >= CTX_MODE_MAX) { -- WD_ERR("wrong ctx mode(%u))!\n", mode); -+ WD_ERR("invalid: ctx mode is %u!\n", mode); - return -WD_EINVAL; - } - -@@ -1594,7 +1583,7 @@ int wd_check_ctx(struct wd_ctx_config_internal *config, __u8 mode, __u32 idx) - - ctx = config->ctxs + idx; - if (ctx->ctx_mode != mode) { -- WD_ERR("ctx %u mode = %hhu error!\n", idx, ctx->ctx_mode); -+ WD_ERR("invalid: ctx(%u) mode is %hhu!\n", idx, ctx->ctx_mode); - return -WD_EINVAL; - } - --- -2.27.0 - diff --git a/0081-uadk-v1-fix-wd_bmm-pool_init.patch b/0081-uadk-v1-fix-wd_bmm-pool_init.patch deleted file mode 100644 index bf6f1cf..0000000 --- a/0081-uadk-v1-fix-wd_bmm-pool_init.patch +++ /dev/null @@ -1,68 +0,0 @@ -From b56736c04686f0611e6b3865dd894cba62a3b0a2 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 10 Mar 2022 20:03:12 +0800 -Subject: [PATCH 089/109] uadk: v1: fix wd_bmm pool_init - -setup br alloc and free should be checked at the same time, -wd_reserve_memory should be rolled back. - -Signed-off-by: Wenkai Lin ---- - v1/wd_bmm.c | 15 +++++---------- - 1 file changed, 5 insertions(+), 10 deletions(-) - -diff --git a/v1/wd_bmm.c b/v1/wd_bmm.c -index af59983..11f2ee8 100644 ---- a/v1/wd_bmm.c -+++ b/v1/wd_bmm.c -@@ -216,7 +216,7 @@ static void *pool_init(struct wd_queue *q, struct wd_blkpool *pool, - void *addr = NULL; - - /* use user's memory, and its br alloc function */ -- if (setup->br.alloc) { -+ if (setup->br.alloc && setup->br.free) { - addr = setup->br.alloc(setup->br.usr, pool->act_mem_sz); - if (!addr) { - WD_ERR("failed to allocate memory in user pool.\n"); -@@ -226,14 +226,15 @@ static void *pool_init(struct wd_queue *q, struct wd_blkpool *pool, - pool->usr_mem_start = addr; - if (usr_pool_init(pool)) { - WD_ERR("failed to initialize user pool.\n"); -- goto err_pool_init; -+ setup->br.free(setup->br.usr, addr); -+ return NULL; - } - } else { - /* use wd to reserve memory */ - addr = wd_reserve_memory(q, pool->act_mem_sz); - if (!addr) { - WD_ERR("wd pool failed to reserve memory.\n"); -- goto err_pool_init; -+ return NULL; - } - - pool->usr_mem_start = addr; -@@ -241,19 +242,13 @@ static void *pool_init(struct wd_queue *q, struct wd_blkpool *pool, - WD_ERR("failed to initialize wd pool.\n"); - - /* release q will free memory */ -- goto err_pool_init; -+ return NULL; - } - setup->block_num = pool->setup.block_num; - pool->q = q; - } - - return pool; -- --err_pool_init: -- if (setup->br.alloc && setup->br.free) -- setup->br.free(setup->br.usr, addr); -- -- return NULL; - } - - void *wd_blkpool_create(struct wd_queue *q, struct wd_blkpool_setup *setup) --- -2.27.0 - diff --git a/0082-uadk-v1-fix-wd-create-ctx-memory-leak.patch b/0082-uadk-v1-fix-wd-create-ctx-memory-leak.patch deleted file mode 100644 index 54c3a35..0000000 --- a/0082-uadk-v1-fix-wd-create-ctx-memory-leak.patch +++ /dev/null @@ -1,116 +0,0 @@ -From 5f9d701e8a56f4b7a0ff9c1b0c24fd130427cf1f Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 10 Mar 2022 20:03:13 +0800 -Subject: [PATCH 090/109] uadk: v1: fix wd create ctx memory leak - -ctx's block memory should be freed if wd fail to create ctx. - -Signed-off-by: Wenkai Lin ---- - v1/wd_aead.c | 12 ++++++++---- - v1/wd_cipher.c | 5 ++++- - v1/wd_dh.c | 4 +++- - v1/wd_digest.c | 6 +++++- - 4 files changed, 20 insertions(+), 7 deletions(-) - -diff --git a/v1/wd_aead.c b/v1/wd_aead.c -index 6d8c541..ec537b3 100644 ---- a/v1/wd_aead.c -+++ b/v1/wd_aead.c -@@ -229,14 +229,13 @@ void *wcrypto_create_aead_ctx(struct wd_queue *q, - ctx->ckey = setup->br.alloc(setup->br.usr, MAX_CIPHER_KEY_SIZE); - if (!ctx->ckey) { - WD_ERR("fail to alloc cipher ctx key!\n"); -- free(ctx); -- goto free_ctx_id; -+ goto free_ctx; - } - ctx->akey = setup->br.alloc(setup->br.usr, MAX_AEAD_KEY_SIZE); - if (!ctx->akey) { - WD_ERR("fail to alloc authenticate ctx key!\n"); - setup->br.free(setup->br.usr, ctx->ckey); -- goto free_ctx; -+ goto free_ctx_ckey; - } - - ctx->iv_blk_size = get_iv_block_size(setup->cmode); -@@ -244,11 +243,16 @@ void *wcrypto_create_aead_ctx(struct wd_queue *q, - sizeof(struct wcrypto_aead_cookie), WD_CTX_MSG_NUM); - if (ret) { - WD_ERR("fail to init cookie pool!\n"); -- goto free_ctx; -+ goto free_ctx_akey; - } - init_aead_cookie(ctx, setup); - - return ctx; -+ -+free_ctx_akey: -+ setup->br.free(setup->br.usr, ctx->akey); -+free_ctx_ckey: -+ setup->br.free(setup->br.usr, ctx->ckey); - free_ctx: - free(ctx); - free_ctx_id: -diff --git a/v1/wd_cipher.c b/v1/wd_cipher.c -index 8bf71be..921c464 100644 ---- a/v1/wd_cipher.c -+++ b/v1/wd_cipher.c -@@ -217,11 +217,14 @@ void *wcrypto_create_cipher_ctx(struct wd_queue *q, - sizeof(struct wcrypto_cipher_cookie), WD_CTX_MSG_NUM); - if (ret) { - WD_ERR("fail to init cookie pool!\n"); -- goto free_ctx; -+ goto free_ctx_key; - } - init_cipher_cookie(ctx, setup); - - return ctx; -+ -+free_ctx_key: -+ setup->br.free(setup->br.usr, ctx->key); - free_ctx: - free(ctx); - free_ctx_id: -diff --git a/v1/wd_dh.c b/v1/wd_dh.c -index f83dd91..66f1081 100644 ---- a/v1/wd_dh.c -+++ b/v1/wd_dh.c -@@ -174,10 +174,12 @@ void *wcrypto_create_dh_ctx(struct wd_queue *q, struct wcrypto_dh_ctx_setup *set - - ret = wcrypto_init_dh_cookie(ctx); - if (ret) -- goto free_ctx; -+ goto free_ctx_gdata; - - return ctx; - -+free_ctx_gdata: -+ setup->br.free(setup->br.usr, ctx->g.data); - free_ctx: - free(ctx); - free_ctx_id: -diff --git a/v1/wd_digest.c b/v1/wd_digest.c -index 2179415..c84e71d 100644 ---- a/v1/wd_digest.c -+++ b/v1/wd_digest.c -@@ -199,11 +199,15 @@ void *wcrypto_create_digest_ctx(struct wd_queue *q, - sizeof(struct wcrypto_digest_cookie), WD_CTX_MSG_NUM); - if (ret) { - WD_ERR("fail to init cookie pool!\n"); -- goto free_ctx; -+ goto free_ctx_key; - } - init_digest_cookie(ctx, setup); - - return ctx; -+ -+free_ctx_key: -+ if (setup->mode == WCRYPTO_DIGEST_HMAC) -+ setup->br.free(setup->br.usr, ctx->key); - free_ctx: - free(ctx); - free_ctx_id: --- -2.27.0 - diff --git a/0083-uadk-mempool-fix-redundant-assignment.patch b/0083-uadk-mempool-fix-redundant-assignment.patch deleted file mode 100644 index b53f1d8..0000000 --- a/0083-uadk-mempool-fix-redundant-assignment.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 00d8dd57f97586658770a258f3e8fb331180f457 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 10 Mar 2022 20:03:15 +0800 -Subject: [PATCH 091/109] uadk: mempool: fix redundant assignment - -1. pos_first is no need to be assinged because it -will get a value later. -2. improve performance by giving other threads or -processes a chance to run - -Signed-off-by: Wenkai Lin ---- - wd_mempool.c | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -diff --git a/wd_mempool.c b/wd_mempool.c -index bfacd28..8467c48 100644 ---- a/wd_mempool.c -+++ b/wd_mempool.c -@@ -14,6 +14,7 @@ - #include - #include - #include -+#include - #include "wd.h" - - #define SYSFS_NODE_PATH "/sys/devices/system/node/node" -@@ -409,8 +410,8 @@ static int alloc_block_from_mempool(struct mempool *mp, - int mem_combined_num, - int mem_splited_num) - { -- int pos_first = pos; - int pos_last = pos; -+ int pos_first; - int i, ret; - - do { -@@ -607,7 +608,9 @@ void wd_blockpool_destroy(handle_t blkpool) - - mp = bp->mp; - wd_atomic_sub(&bp->ref, 1); -- while(wd_atomic_load(&bp->ref)); -+ while (wd_atomic_load(&bp->ref)) -+ sched_yield(); -+ - free_mem_to_mempool(bp); - free(bp->blk_elem); - free(bp); --- -2.27.0 - diff --git a/0084-uadk-v1-fix-del-ctx.patch b/0084-uadk-v1-fix-del-ctx.patch deleted file mode 100644 index 31de3ff..0000000 --- a/0084-uadk-v1-fix-del-ctx.patch +++ /dev/null @@ -1,126 +0,0 @@ -From 26661c4ae49d1c4c6914d8aba4e8d32db609d24b Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 10 Mar 2022 20:03:16 +0800 -Subject: [PATCH 092/109] uadk: v1: fix del ctx - -It is better to check whether the number of CTX -is greater than 0 before del ctx. - -Signed-off-by: Wenkai Lin ---- - v1/wd_aead.c | 11 +++++------ - v1/wd_cipher.c | 12 ++++++------ - v1/wd_comp.c | 13 +++++++------ - v1/wd_digest.c | 11 +++++------ - 4 files changed, 23 insertions(+), 24 deletions(-) - -diff --git a/v1/wd_aead.c b/v1/wd_aead.c -index ec537b3..cf358bf 100644 ---- a/v1/wd_aead.c -+++ b/v1/wd_aead.c -@@ -685,16 +685,15 @@ void wcrypto_del_aead_ctx(void *ctx) - qinfo = ctxt->q->qinfo; - wd_uninit_cookie_pool(&ctxt->pool); - wd_spinlock(&qinfo->qlock); -- wd_free_id(qinfo->ctx_id, WD_MAX_CTX_NUM, ctxt->ctx_id - 1, -- WD_MAX_CTX_NUM); -- qinfo->ctx_num--; -- if (!qinfo->ctx_num) -- memset(&qinfo->br, 0, sizeof(qinfo->br)); -- if (qinfo->ctx_num < 0) { -+ if (qinfo->ctx_num <= 0) { - wd_unspinlock(&qinfo->qlock); - WD_ERR("fail to delete aead ctx!\n"); - return; - } -+ wd_free_id(qinfo->ctx_id, WD_MAX_CTX_NUM, ctxt->ctx_id - 1, -+ WD_MAX_CTX_NUM); -+ if (!(--qinfo->ctx_num)) -+ memset(&qinfo->br, 0, sizeof(qinfo->br)); - wd_unspinlock(&qinfo->qlock); - del_ctx_key(ctxt); - free(ctx); -diff --git a/v1/wd_cipher.c b/v1/wd_cipher.c -index 921c464..8eb6a6f 100644 ---- a/v1/wd_cipher.c -+++ b/v1/wd_cipher.c -@@ -553,16 +553,16 @@ void wcrypto_del_cipher_ctx(void *ctx) - qinfo = c_ctx->q->qinfo; - wd_uninit_cookie_pool(&c_ctx->pool); - wd_spinlock(&qinfo->qlock); -- wd_free_id(qinfo->ctx_id, WD_MAX_CTX_NUM, c_ctx->ctx_id - 1, -- WD_MAX_CTX_NUM); -- qinfo->ctx_num--; -- if (!qinfo->ctx_num) -- memset(&qinfo->br, 0, sizeof(qinfo->br)); -- if (qinfo->ctx_num < 0) { -+ if (qinfo->ctx_num <= 0) { - wd_unspinlock(&qinfo->qlock); - WD_ERR("error:repeat del cipher ctx!\n"); - return; - } -+ wd_free_id(qinfo->ctx_id, WD_MAX_CTX_NUM, c_ctx->ctx_id - 1, -+ WD_MAX_CTX_NUM); -+ if (!(--qinfo->ctx_num)) -+ memset(&qinfo->br, 0, sizeof(qinfo->br)); -+ - wd_unspinlock(&qinfo->qlock); - del_ctx_key(c_ctx); - free(ctx); -diff --git a/v1/wd_comp.c b/v1/wd_comp.c -index 32d89c8..4ce79bd 100644 ---- a/v1/wd_comp.c -+++ b/v1/wd_comp.c -@@ -339,16 +339,17 @@ void wcrypto_del_comp_ctx(void *ctx) - - wd_uninit_cookie_pool(&cctx->pool); - wd_spinlock(&qinfo->qlock); -- wd_free_id(qinfo->ctx_id, WD_MAX_CTX_NUM, cctx->ctx_id -1, -- WD_MAX_CTX_NUM); -- qinfo->ctx_num--; -- if (!qinfo->ctx_num) { -- memset(&qinfo->br, 0, sizeof(qinfo->br)); -- } else if (qinfo->ctx_num < 0) { -+ if (qinfo->ctx_num <= 0) { - wd_unspinlock(&qinfo->qlock); - WD_ERR("error: repeat delete compress ctx!\n"); - return; - } -+ -+ wd_free_id(qinfo->ctx_id, WD_MAX_CTX_NUM, cctx->ctx_id -1, -+ WD_MAX_CTX_NUM); -+ if (!(--qinfo->ctx_num)) -+ memset(&qinfo->br, 0, sizeof(qinfo->br)); -+ - wd_unspinlock(&qinfo->qlock); - - free(cctx); -diff --git a/v1/wd_digest.c b/v1/wd_digest.c -index c84e71d..5acb660 100644 ---- a/v1/wd_digest.c -+++ b/v1/wd_digest.c -@@ -472,16 +472,15 @@ void wcrypto_del_digest_ctx(void *ctx) - qinfo = d_ctx->q->qinfo; - wd_uninit_cookie_pool(&d_ctx->pool); - wd_spinlock(&qinfo->qlock); -- wd_free_id(qinfo->ctx_id, WD_MAX_CTX_NUM, d_ctx->ctx_id - 1, -- WD_MAX_CTX_NUM); -- qinfo->ctx_num--; -- if (!qinfo->ctx_num) -- memset(&qinfo->br, 0, sizeof(qinfo->br)); -- if (qinfo->ctx_num < 0) { -+ if (qinfo->ctx_num <= 0) { - wd_unspinlock(&qinfo->qlock); - WD_ERR("error: repeat del digest ctx!\n"); - return; - } -+ wd_free_id(qinfo->ctx_id, WD_MAX_CTX_NUM, d_ctx->ctx_id - 1, -+ WD_MAX_CTX_NUM); -+ if (!(--qinfo->ctx_num)) -+ memset(&qinfo->br, 0, sizeof(qinfo->br)); - wd_unspinlock(&qinfo->qlock); - del_ctx_key(d_ctx); - free(ctx); --- -2.27.0 - diff --git a/0085-uadk-v1-clean-code-for-wd.patch b/0085-uadk-v1-clean-code-for-wd.patch deleted file mode 100644 index 9164ebe..0000000 --- a/0085-uadk-v1-clean-code-for-wd.patch +++ /dev/null @@ -1,110 +0,0 @@ -From 3b201e8cfc8306e84dc51cbeccd86510e9c0da50 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 10 Mar 2022 20:03:17 +0800 -Subject: [PATCH 093/109] uadk: v1: clean code for wd - -1. get_int_attr should return INT_MAX instead of -INT_MAX_SIZE. -2. qinfo should be set to NULL if memory is freed, -q_info memory should be freed at last. -3. optimize is_alg_support - -Signed-off-by: Wenkai Lin ---- - v1/wd.c | 23 ++++++++++++++++------- - v1/wd.h | 1 - - 2 files changed, 16 insertions(+), 8 deletions(-) - -diff --git a/v1/wd.c b/v1/wd.c -index 26f6692..39c4167 100644 ---- a/v1/wd.c -+++ b/v1/wd.c -@@ -27,6 +27,7 @@ - #include - #include - #include -+#include - - #include "v1/wd.h" - #include "v1/wd_util.h" -@@ -118,8 +119,10 @@ static int get_int_attr(struct dev_info *dinfo, const char *attr) - * When the value is bigger than INT_MAX, it returns INT_MAX - */ - size = get_raw_attr(dinfo->dev_root, attr, buf, MAX_ATTR_STR_SIZE); -- if (size < 0 || size >= INT_MAX_SIZE) -+ if (size < 0) - return size; -+ else if (size >= INT_MAX_SIZE) -+ return INT_MAX; - /* Handing the read string's end tails '\n' to '\0' */ - buf[size] = '\0'; - return atoi((char *)buf); -@@ -186,19 +189,23 @@ static int get_ul_vec_attr(struct dev_info *dinfo, const char *attr, - return 0; - } - --static int is_alg_support(struct dev_info *dinfo, const char *alg) -+static bool is_alg_support(struct dev_info *dinfo, const char *alg) - { -- int alg_support_flag = 0; - char *alg_save = NULL; - char *alg_tmp; - -+ if (!alg) -+ return false; -+ - alg_tmp = strtok_r(dinfo->algs, "\n", &alg_save); - while (alg_tmp != NULL) { -- if (alg && !strcmp(alg_tmp, alg)) -- alg_support_flag++; -+ if (!strcmp(alg_tmp, alg)) -+ return true; -+ - alg_tmp = strtok_r(NULL, "\n", &alg_save); - } -- return alg_support_flag; -+ -+ return false; - } - - static bool is_weight_more(unsigned int new, unsigned int old) -@@ -279,7 +286,7 @@ static int get_str_attr_all(struct dev_info *dinfo, const char *alg) - - /* Add algorithm check to cut later pointless logic */ - ret = is_alg_support(dinfo, alg); -- if (ret == 0) -+ if (!ret) - return -EPFNOSUPPORT; - - ret = get_str_attr(dinfo, "api", dinfo->api, WD_NAME_SIZE); -@@ -605,6 +612,7 @@ err_with_fd: - wd_close_queue(q); - err_with_dev: - free(dinfop); -+ q->qinfo = NULL; - return ret; - } - -@@ -647,6 +655,7 @@ void wd_release_queue(struct wd_queue *q) - - wd_close_queue(q); - free((void *)qinfo->dev_info); -+ q->qinfo = NULL; - } - - int wd_send(struct wd_queue *q, void *req) -diff --git a/v1/wd.h b/v1/wd.h -index 3dd69eb..429c6b6 100644 ---- a/v1/wd.h -+++ b/v1/wd.h -@@ -28,7 +28,6 @@ - #include - #include - #include --#include - #include - #include "uacce.h" - --- -2.27.0 - diff --git a/0086-uadk-v1-fix-drv_reserve_mem-memory-leak.patch b/0086-uadk-v1-fix-drv_reserve_mem-memory-leak.patch deleted file mode 100644 index 0625c62..0000000 --- a/0086-uadk-v1-fix-drv_reserve_mem-memory-leak.patch +++ /dev/null @@ -1,110 +0,0 @@ -From b68986ce59e52b57256eaef90c6e24493822a3ee Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 10 Mar 2022 20:03:19 +0800 -Subject: [PATCH 094/109] uadk: v1: fix drv_reserve_mem memory leak - -share region memory should be freed and -qfr region should be unmaped if drv_reserve_mem fail. - -Signed-off-by: Wenkai Lin ---- - v1/wd.c | 9 +-------- - v1/wd_adapter.c | 24 ++++++++++++++++++++++-- - v1/wd_adapter.h | 1 + - 3 files changed, 24 insertions(+), 10 deletions(-) - -diff --git a/v1/wd.c b/v1/wd.c -index 39c4167..b94ec43 100644 ---- a/v1/wd.c -+++ b/v1/wd.c -@@ -618,7 +618,6 @@ err_with_dev: - - void wd_release_queue(struct wd_queue *q) - { -- struct wd_ss_region *rg; - struct wd_ss_region_list *head; - struct q_info *qinfo, *sqinfo; - -@@ -645,13 +644,7 @@ void wd_release_queue(struct wd_queue *q) - if (qinfo->ss_size) - drv_unmap_reserve_mem(q, qinfo->ss_va, qinfo->ss_size); - -- while (true) { -- rg = TAILQ_FIRST(&qinfo->ss_list); -- if (!rg) -- break; -- TAILQ_REMOVE(&qinfo->ss_list, rg, next); -- free(rg); -- } -+ drv_free_slice(q); - - wd_close_queue(q); - free((void *)qinfo->dev_info); -diff --git a/v1/wd_adapter.c b/v1/wd_adapter.c -index f8bef2b..e53c561 100644 ---- a/v1/wd_adapter.c -+++ b/v1/wd_adapter.c -@@ -150,6 +150,20 @@ int drv_recv(struct wd_queue *q, void **req, __u32 num) - return hw_dio_tbl[qinfo->hw_type_id].recv(q, req, num); - } - -+void drv_free_slice(struct wd_queue *q) -+{ -+ struct q_info *qinfo = q->qinfo; -+ struct wd_ss_region *rgn; -+ -+ while (true) { -+ rgn = TAILQ_FIRST(&qinfo->ss_list); -+ if (!rgn) -+ break; -+ TAILQ_REMOVE(&qinfo->ss_list, rgn, next); -+ free(rgn); -+ } -+} -+ - void drv_add_slice(struct wd_queue *q, struct wd_ss_region *rgn) - { - struct q_info *qinfo = q->qinfo; -@@ -209,12 +223,12 @@ void *drv_reserve_mem(struct wd_queue *q, size_t size) - if (ret < 0) { - drv_show_ss_slices(q); - WD_ERR("get DMA fail!\n"); -- return NULL; -+ goto err_out; - } - rgn = malloc(sizeof(*rgn)); - if (!rgn) { - WD_ERR("alloc ss region fail!\n"); -- return NULL; -+ goto err_out; - } - memset(rgn, 0, sizeof(*rgn)); - -@@ -231,6 +245,12 @@ void *drv_reserve_mem(struct wd_queue *q, size_t size) - } - - return ptr; -+ -+err_out: -+ drv_free_slice(q); -+ drv_unmap_reserve_mem(q, ptr, size); -+ -+ return NULL; - } - - void drv_unmap_reserve_mem(struct wd_queue *q, void *addr, size_t size) -diff --git a/v1/wd_adapter.h b/v1/wd_adapter.h -index e1e1233..a5edd24 100644 ---- a/v1/wd_adapter.h -+++ b/v1/wd_adapter.h -@@ -67,6 +67,7 @@ void drv_close(struct wd_queue *q); - int drv_send(struct wd_queue *q, void **req, __u32 num); - int drv_recv(struct wd_queue *q, void **req, __u32 num); - void drv_flush(struct wd_queue *q); -+void drv_free_slice(struct wd_queue *q); - void *drv_reserve_mem(struct wd_queue *q, size_t size); - void drv_unmap_reserve_mem(struct wd_queue *q, void *addr, size_t size); - int drv_get_sgl_info(struct wd_queue *q, struct hw_sgl_info *info); --- -2.27.0 - diff --git a/0087-uadk-cipher-fix-wd_cipher_check_params.patch b/0087-uadk-cipher-fix-wd_cipher_check_params.patch deleted file mode 100644 index 9dd7f91..0000000 --- a/0087-uadk-cipher-fix-wd_cipher_check_params.patch +++ /dev/null @@ -1,41 +0,0 @@ -From c79a52c5470ada323f3fabcc88d8dd8dc1300658 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Thu, 10 Mar 2022 20:03:14 +0800 -Subject: [PATCH 095/109] uadk: cipher: fix wd_cipher_check_params - -no need to set ret and optimize the return line. - -Signed-off-by: Wenkai Lin ---- - wd_cipher.c | 8 ++------ - 1 file changed, 2 insertions(+), 6 deletions(-) - -diff --git a/wd_cipher.c b/wd_cipher.c -index afd8c4d..88d3b04 100644 ---- a/wd_cipher.c -+++ b/wd_cipher.c -@@ -384,7 +384,7 @@ static int wd_cipher_check_params(handle_t h_sess, - struct wd_cipher_req *req, __u8 mode) - { - struct wd_cipher_sess *sess = (struct wd_cipher_sess *)h_sess; -- int ret = 0; -+ int ret; - - if (unlikely(!h_sess || !req)) { - WD_ERR("cipher input sess or req is NULL!\n"); -@@ -419,11 +419,7 @@ static int wd_cipher_check_params(handle_t h_sess, - } - } - -- ret = cipher_iv_len_check(req, sess); -- if (unlikely(ret)) -- return ret; -- -- return 0; -+ return cipher_iv_len_check(req, sess); - } - - static int send_recv_sync(struct wd_ctx_internal *ctx, --- -2.27.0 - diff --git a/0088-sec-unify-print-format.patch b/0088-sec-unify-print-format.patch deleted file mode 100644 index ca1799e..0000000 --- a/0088-sec-unify-print-format.patch +++ /dev/null @@ -1,308 +0,0 @@ -From 634b2341b94ff972142da89d30f0a4c08586a0b6 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Thu, 10 Mar 2022 20:29:44 +0800 -Subject: [PATCH 096/109] sec: unify print format - -Unify print format with following rules: -1. failed to do sth. -2. invalid: sth is NULL. - -Signed-off-by: Kai Ye ---- - drv/hisi_sec.c | 20 ++++++++++---------- - wd_aead.c | 12 ++++++------ - wd_cipher.c | 20 ++++++++++---------- - wd_digest.c | 10 +++++----- - 4 files changed, 31 insertions(+), 31 deletions(-) - -diff --git a/drv/hisi_sec.c b/drv/hisi_sec.c -index 16fcb5f..aa86a6b 100644 ---- a/drv/hisi_sec.c -+++ b/drv/hisi_sec.c -@@ -703,7 +703,7 @@ static void parse_cipher_bd2(struct hisi_sec_sqe *sqe, - - done = sqe->type2.done_flag & SEC_DONE_MASK; - if (done != SEC_HW_TASK_DONE || sqe->type2.error_type) { -- WD_ERR("SEC BD %s fail! done=0x%x, etype=0x%x\n", "cipher", -+ WD_ERR("failed to parse cipher BD2! done=0x%x, etype=0x%x\n", - done, sqe->type2.error_type); - recv_msg->result = WD_IN_EPARA; - } else { -@@ -927,7 +927,7 @@ int hisi_sec_cipher_send(handle_t ctx, struct wd_cipher_msg *msg) - int ret; - - if (!msg) { -- WD_ERR("input cipher msg is NULL!\n"); -+ WD_ERR("invalid: input cipher msg is NULL!\n"); - return -WD_EINVAL; - } - -@@ -1130,7 +1130,7 @@ int hisi_sec_cipher_send_v3(handle_t ctx, struct wd_cipher_msg *msg) - int ret; - - if (!msg) { -- WD_ERR("input cipher msg is NULL!\n"); -+ WD_ERR("invalid: input cipher msg is NULL!\n"); - return -WD_EINVAL; - } - -@@ -1175,7 +1175,7 @@ static void parse_cipher_bd3(struct hisi_sec_sqe3 *sqe, - - done = sqe->done_flag & SEC_DONE_MASK; - if (done != SEC_HW_TASK_DONE || sqe->error_type) { -- WD_ERR("SEC BD3 %s fail! done=0x%x, etype=0x%x\n", "cipher", -+ WD_ERR("failed to parse cipher BD3! done=0x%x, etype=0x%x\n", - done, sqe->error_type); - recv_msg->result = WD_IN_EPARA; - } else { -@@ -1278,7 +1278,7 @@ static void parse_digest_bd2(struct hisi_sec_sqe *sqe, - - done = sqe->type2.done_flag & SEC_DONE_MASK; - if (done != SEC_HW_TASK_DONE || sqe->type2.error_type) { -- WD_ERR("SEC BD %s fail! done=0x%x, etype=0x%x\n", "digest", -+ WD_ERR("failed to parse digest BD2! done=0x%x, etype=0x%x\n", - done, sqe->type2.error_type); - recv_msg->result = WD_IN_EPARA; - } else { -@@ -1354,7 +1354,7 @@ int hisi_sec_digest_send(handle_t ctx, struct wd_digest_msg *msg) - int ret; - - if (!msg) { -- WD_ERR("input digest msg is NULL!\n"); -+ WD_ERR("invalid: input digest msg is NULL!\n"); - return -WD_EINVAL; - } - -@@ -1510,7 +1510,7 @@ int hisi_sec_digest_send_v3(handle_t ctx, struct wd_digest_msg *msg) - int ret; - - if (!msg) { -- WD_ERR("input digest msg is NULL!\n"); -+ WD_ERR("invalid: input digest msg is NULL!\n"); - return -WD_EINVAL; - } - -@@ -1578,7 +1578,7 @@ static void parse_digest_bd3(struct hisi_sec_sqe3 *sqe, - - done = sqe->done_flag & SEC_DONE_MASK; - if (done != SEC_HW_TASK_DONE || sqe->error_type) { -- WD_ERR("SEC BD3 %s fail! done=0x%x, etype=0x%x\n", "digest", -+ WD_ERR("failed to parse digest BD3! done=0x%x, etype=0x%x\n", - done, sqe->error_type); - recv_msg->result = WD_IN_EPARA; - } else { -@@ -1927,7 +1927,7 @@ static void parse_aead_bd2(struct hisi_sec_sqe *sqe, - icv = (sqe->type2.done_flag & SEC_ICV_MASK) >> 1; - if (done != SEC_HW_TASK_DONE || sqe->type2.error_type || - icv == SEC_HW_ICV_ERR) { -- WD_ERR("SEC BD aead fail! done=0x%x, etype=0x%x, icv=0x%x\n", -+ WD_ERR("failed to parse aead BD2! done=0x%x, etype=0x%x, icv=0x%x\n", - done, sqe->type2.error_type, icv); - recv_msg->result = WD_IN_EPARA; - } else { -@@ -2195,7 +2195,7 @@ static void parse_aead_bd3(struct hisi_sec_sqe3 *sqe, - icv = (sqe->done_flag & SEC_ICV_MASK) >> 1; - if (done != SEC_HW_TASK_DONE || sqe->error_type || - icv == SEC_HW_ICV_ERR) { -- WD_ERR("SEC BD3 aead fail! done=0x%x, etype=0x%x, icv=0x%x\n", -+ WD_ERR("failed to parse aead BD3! done=0x%x, etype=0x%x, icv=0x%x\n", - done, sqe->error_type, icv); - recv_msg->result = WD_IN_EPARA; - } else { -diff --git a/wd_aead.c b/wd_aead.c -index 7df8e80..74047b5 100644 ---- a/wd_aead.c -+++ b/wd_aead.c -@@ -63,14 +63,14 @@ static void wd_aead_set_static_drv(void) - { - wd_aead_setting.driver = wd_aead_get_driver(); - if (!wd_aead_setting.driver) -- WD_ERR("fail to get driver\n"); -+ WD_ERR("failed to get driver!\n"); - } - #else - static void __attribute__((constructor)) wd_aead_open_driver(void) - { - wd_aead_setting.dlhandle = dlopen("libhisi_sec.so", RTLD_NOW); - if (!wd_aead_setting.dlhandle) -- WD_ERR("failed to open libhisi_sec.so\n"); -+ WD_ERR("failed to open libhisi_sec.so!\n"); - } - - static void __attribute__((destructor)) wd_aead_close_driver(void) -@@ -344,7 +344,7 @@ static int aead_param_check(struct wd_aead_sess *sess, - int ret; - - if (unlikely(!sess || !req)) { -- WD_ERR("aead input sess or req is NULL.\n"); -+ WD_ERR("invalid: aead input sess or req is NULL!\n"); - return -WD_EINVAL; - } - -@@ -393,7 +393,7 @@ static int aead_param_check(struct wd_aead_sess *sess, - static int aead_init_check(struct wd_ctx_config *config, struct wd_sched *sched) - { - if (!config || !config->ctxs || !config->ctxs[0].ctx || !sched) { -- WD_ERR("wd aead config or sched is NULL!\n"); -+ WD_ERR("invalid: wd aead config or sched is NULL!\n"); - return -WD_EINVAL; - } - -@@ -594,7 +594,7 @@ int wd_do_aead_async(handle_t h_sess, struct wd_aead_req *req) - return -WD_EINVAL; - - if (unlikely(!req->cb)) { -- WD_ERR("aead input req cb is NULL.\n"); -+ WD_ERR("invalid: aead input req cb is NULL!\n"); - return -WD_EINVAL; - } - -@@ -647,7 +647,7 @@ int wd_aead_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - int ret; - - if (!count) { -- WD_ERR("aead poll ctx input param is NULL!\n"); -+ WD_ERR("invalid: aead poll ctx input param is NULL!\n"); - return -WD_EINVAL; - } - -diff --git a/wd_cipher.c b/wd_cipher.c -index 88d3b04..563eece 100644 ---- a/wd_cipher.c -+++ b/wd_cipher.c -@@ -75,14 +75,14 @@ static void wd_cipher_set_static_drv(void) - { - wd_cipher_setting.driver = wd_cipher_get_driver(); - if (!wd_cipher_setting.driver) -- WD_ERR("fail to get driver\n"); -+ WD_ERR("failed to get driver!\n"); - } - #else - static void __attribute__((constructor)) wd_cipher_open_driver(void) - { - wd_cipher_setting.dlhandle = dlopen("libhisi_sec.so", RTLD_NOW); - if (!wd_cipher_setting.dlhandle) -- WD_ERR("fail to open libhisi_sec.so\n"); -+ WD_ERR("failed to open libhisi_sec.so!\n"); - } - - static void __attribute__((destructor)) wd_cipher_close_driver(void) -@@ -158,7 +158,7 @@ static int cipher_init_check(struct wd_ctx_config *config, - struct wd_sched *sched) - { - if (!config || !config->ctxs || !config->ctxs[0].ctx || !sched) { -- WD_ERR("wd cipher config or sched is NULL!\n"); -+ WD_ERR("invalid: wd cipher config or sched is NULL!\n"); - return -WD_EINVAL; - } - -@@ -177,7 +177,7 @@ int wd_cipher_set_key(handle_t h_sess, const __u8 *key, __u32 key_len) - int ret; - - if (!key || !sess) { -- WD_ERR("cipher set key input param err!\n"); -+ WD_ERR("invalid: cipher set key input param err!\n"); - return -WD_EINVAL; - } - -@@ -205,13 +205,13 @@ handle_t wd_cipher_alloc_sess(struct wd_cipher_sess_setup *setup) - struct wd_cipher_sess *sess = NULL; - - if (unlikely(!setup)) { -- WD_ERR("cipher input setup is NULL!\n"); -+ WD_ERR("invalid: cipher input setup is NULL!\n"); - return (handle_t)0; - } - - sess = malloc(sizeof(struct wd_cipher_sess)); - if (!sess) { -- WD_ERR("fail to alloc session memory!\n"); -+ WD_ERR("failed to alloc session memory!\n"); - return (handle_t)0; - } - memset(sess, 0, sizeof(struct wd_cipher_sess)); -@@ -235,7 +235,7 @@ void wd_cipher_free_sess(handle_t h_sess) - struct wd_cipher_sess *sess = (struct wd_cipher_sess *)h_sess; - - if (unlikely(!sess)) { -- WD_ERR("cipher input h_sess is NULL!\n"); -+ WD_ERR("invalid: cipher input h_sess is NULL!\n"); - return; - } - -@@ -387,12 +387,12 @@ static int wd_cipher_check_params(handle_t h_sess, - int ret; - - if (unlikely(!h_sess || !req)) { -- WD_ERR("cipher input sess or req is NULL!\n"); -+ WD_ERR("invalid: cipher input sess or req is NULL!\n"); - return -WD_EINVAL; - } - - if (unlikely(mode == CTX_MODE_ASYNC && !req->cb)) { -- WD_ERR("cipher req cb is NULL!\n"); -+ WD_ERR("invalid: cipher req cb is NULL!\n"); - return -WD_EINVAL; - } - -@@ -557,7 +557,7 @@ int wd_cipher_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - int ret; - - if (unlikely(!count)) { -- WD_ERR("wd cipher poll ctx input param is NULL!\n"); -+ WD_ERR("invalid: cipher poll ctx input param is NULL!\n"); - return -WD_EINVAL; - } - -diff --git a/wd_digest.c b/wd_digest.c -index fb29746..0ddc074 100644 ---- a/wd_digest.c -+++ b/wd_digest.c -@@ -62,7 +62,7 @@ static void wd_digest_set_static_drv(void) - { - wd_digest_setting.driver = wd_digest_get_driver(); - if (!wd_digest_setting.driver) -- WD_ERR("fail to get driver\n"); -+ WD_ERR("failed to get driver!\n"); - } - #else - static void __attribute__((constructor)) wd_digest_open_driver(void) -@@ -70,7 +70,7 @@ static void __attribute__((constructor)) wd_digest_open_driver(void) - /* Fix me: vendor driver should be put in /usr/lib/wd/ */ - wd_digest_setting.dlhandle = dlopen("libhisi_sec.so", RTLD_NOW); - if (!wd_digest_setting.dlhandle) -- WD_ERR("fail to open libhisi_sec.so\n"); -+ WD_ERR("failed to open libhisi_sec.so!\n"); - } - - static void __attribute__((destructor)) wd_digest_close_driver(void) -@@ -252,7 +252,7 @@ static int digest_param_check(struct wd_digest_sess *sess, - int ret; - - if (unlikely(!sess || !req)) { -- WD_ERR("digest input sess or req is NULL.\n"); -+ WD_ERR("invalid: digest input sess or req is NULL!\n"); - return -WD_EINVAL; - } - -@@ -398,7 +398,7 @@ int wd_do_digest_async(handle_t h_sess, struct wd_digest_req *req) - return -WD_EINVAL; - - if (unlikely(!req->cb)) { -- WD_ERR("digest input req cb is NULL.\n"); -+ WD_ERR("invalid: digest input req cb is NULL!\n"); - return -WD_EINVAL; - } - -@@ -451,7 +451,7 @@ int wd_digest_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - int ret; - - if (unlikely(!count)) { -- WD_ERR("digest count is NULL.\n"); -+ WD_ERR("invalid: digest poll ctx input param is NULL!\n"); - return -WD_EINVAL; - } - --- -2.27.0 - diff --git a/0089-drv-hpre-unify-print-format.patch b/0089-drv-hpre-unify-print-format.patch deleted file mode 100644 index f1042cd..0000000 --- a/0089-drv-hpre-unify-print-format.patch +++ /dev/null @@ -1,514 +0,0 @@ -From 6d87a3c206df306cff533d8aacf40cc5966d8441 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Thu, 10 Mar 2022 20:29:45 +0800 -Subject: [PATCH 097/109] drv/hpre: unify print format - -Unify print format with following rules: -1.failed to do sth. -2.add prefix "invalid: " for check parameters printf -3.add "!" at the end.unify print format - -Signed-off-by: Weili Qian ---- - drv/hisi_hpre.c | 125 +++++++++++++++++++++++------------------------- - 1 file changed, 60 insertions(+), 65 deletions(-) - -diff --git a/drv/hisi_hpre.c b/drv/hisi_hpre.c -index f1d7720..11ef78b 100644 ---- a/drv/hisi_hpre.c -+++ b/drv/hisi_hpre.c -@@ -134,12 +134,12 @@ static int crypto_bin_to_hpre_bin(char *dst, const char *src, - int j; - - if (!dst || !src || b_size <= 0 || d_size <= 0) { -- WD_ERR("%s: trans to hpre bin parameters err!\n", p_name); -+ WD_ERR("invalid: %s trans to hpre bin parameters err!\n", p_name); - return -WD_EINVAL; - } - - if (b_size < d_size) { -- WD_ERR("%s: trans to hpre bin data too long!\n", p_name); -+ WD_ERR("invalid: %s trans to hpre bin data too long!\n", p_name); - return -WD_EINVAL; - } - -@@ -165,7 +165,7 @@ static int hpre_bin_to_crypto_bin(char *dst, const char *src, int b_size, - int k = 0; - - if (!dst || !src || b_size <= 0) { -- WD_ERR("%s trans to crypto bin: parameters err!\n", p_name); -+ WD_ERR("invalid: %s trans to crypto bin parameters err!\n", p_name); - return 0; - } - -@@ -254,10 +254,9 @@ static int fill_rsa_pubkey(struct wd_rsa_pubkey *pubkey, void **data) - wd_rsa_get_pubkey_params(pubkey, &wd_e, &wd_n); - ret = crypto_bin_to_hpre_bin(wd_e->data, (const char *)wd_e->data, - wd_e->bsize, wd_e->dsize, "rsa e"); -- if (ret) { -- WD_ERR("rsa pubkey e format fail!\n"); -+ if (ret) - return ret; -- } -+ - ret = crypto_bin_to_hpre_bin(wd_n->data, (const char *)wd_n->data, - wd_n->bsize, wd_n->dsize, "rsa n"); - if (ret) -@@ -349,7 +348,7 @@ static int rsa_out_transfer(struct wd_rsa_msg *msg, - wd_rsa_get_kg_out_crt_params(key, &qinv, &dq, &dp); - ret = hpre_tri_bin_transfer(&qinv, &dq, &dp); - if (ret) { -- WD_ERR("parse rsa genkey qinv&&dq&&dp format fail!\n"); -+ WD_ERR("failed to parse rsa genkey qinv&&dq&&dp format!\n"); - return ret; - } - -@@ -361,7 +360,7 @@ static int rsa_out_transfer(struct wd_rsa_msg *msg, - wd_rsa_get_kg_out_params(key, &d, &n); - ret = hpre_tri_bin_transfer(&d, &n, NULL); - if (ret) { -- WD_ERR("parse rsa genkey1 d&&n format fail!\n"); -+ WD_ERR("failed to parse rsa genkey1 d&&n format!\n"); - return ret; - } - -@@ -402,7 +401,7 @@ static int rsa_prepare_key(struct wd_rsa_msg *msg, - return ret; - ret = wd_rsa_kg_in_data((void *)msg->key, (char **)&data); - if (ret < 0) { -- WD_ERR("Get rsa gen key data in fail!\n"); -+ WD_ERR("failed to get rsa gen key data!\n"); - return ret; - } - if (hw_msg->alg == HPRE_ALG_NC_CRT) -@@ -410,7 +409,7 @@ static int rsa_prepare_key(struct wd_rsa_msg *msg, - else - hw_msg->alg = HPRE_ALG_KG_STD; - } else { -- WD_ERR("Invalid rsa operatin type!\n"); -+ WD_ERR("invalid: rsa operatin type %u is error!\n", req->op_type); - return -WD_EINVAL; - } - -@@ -546,10 +545,10 @@ static int rsa_recv(handle_t ctx, struct wd_rsa_msg *msg) - - if (hw_msg.done != HPRE_HW_TASK_DONE || - hw_msg.etype || hw_msg.etype1) { -- WD_ERR("HPRE do rsa fail!done=0x%x, etype=0x%x, etype1=0x%x\n", -+ WD_ERR("failed to do rsa task! done=0x%x, etype=0x%x, etype1=0x%x!\n", - hw_msg.done, hw_msg.etype, hw_msg.etype1); - if (hw_msg.etype1 & HPRE_HW_SVA_ERROR) -- WD_ERR("failed to SVA prefetch: status=%u\n", -+ WD_ERR("failed to SVA prefetch: status=%u!\n", - hw_msg.sva_status); - if (hw_msg.done == HPRE_HW_TASK_INIT) - msg->result = WD_EINVAL; -@@ -559,7 +558,7 @@ static int rsa_recv(handle_t ctx, struct wd_rsa_msg *msg) - msg->tag = LW_U16(hw_msg.low_tag); - ret = rsa_out_transfer(msg, &hw_msg); - if (ret) { -- WD_ERR("qm rsa out transfer fail!\n"); -+ WD_ERR("failed to transfer out rsa BD!\n"); - msg->result = WD_OUT_EPARA; - } else { - msg->result = WD_SUCCESS; -@@ -591,14 +590,14 @@ static int fill_dh_xp_params(struct wd_dh_msg *msg, - ret = crypto_bin_to_hpre_bin(x, (const char *)x, - msg->key_bytes, req->xbytes, "dh x"); - if (ret) { -- WD_ERR("dh x para format fail!\n"); -+ WD_ERR("failed to transfer dh x para format to hpre bin!\n"); - return ret; - } - - ret = crypto_bin_to_hpre_bin(p, (const char *)p, - msg->key_bytes, req->pbytes, "dh p"); - if (ret) { -- WD_ERR("dh p para format fail!\n"); -+ WD_ERR("failed to transfer dh p para format to hpre bin!\n"); - return ret; - } - -@@ -654,7 +653,7 @@ static int dh_send(handle_t ctx, struct wd_dh_msg *msg) - (const char *)msg->g, msg->key_bytes, - msg->gbytes, "dh g"); - if (ret) { -- WD_ERR("dh g para format fail!\n"); -+ WD_ERR("failed to transfer dh g para format to hpre bin!\n"); - return ret; - } - -@@ -688,10 +687,10 @@ static int dh_recv(handle_t ctx, struct wd_dh_msg *msg) - - if (hw_msg.done != HPRE_HW_TASK_DONE || - hw_msg.etype || hw_msg.etype1) { -- WD_ERR("HPRE do dh fail!done=0x%x, etype=0x%x, etype1=0x%x\n", -+ WD_ERR("failed to do dh task! done=0x%x, etype=0x%x, etype1=0x%x!\n", - hw_msg.done, hw_msg.etype, hw_msg.etype1); - if (hw_msg.etype1 & HPRE_HW_SVA_ERROR) -- WD_ERR("failed to SVA prefetch: status=%u\n", -+ WD_ERR("failed to SVA prefetch: status=%u!\n", - hw_msg.sva_status); - if (hw_msg.done == HPRE_HW_TASK_INIT) - msg->result = WD_EINVAL; -@@ -701,7 +700,7 @@ static int dh_recv(handle_t ctx, struct wd_dh_msg *msg) - msg->tag = LW_U16(hw_msg.low_tag); - ret = dh_out_transfer(msg, &hw_msg); - if (ret) { -- WD_ERR("dh out transfer fail!\n"); -+ WD_ERR("failed to transfer out dh BD!\n"); - msg->result = WD_OUT_EPARA; - } else { - msg->result = WD_SUCCESS; -@@ -1021,7 +1020,7 @@ static int ecc_prepare_sign_in(struct wd_ecc_msg *msg, - int ret; - - if (!in->dgst_set) { -- WD_ERR("prepare sign_in, hash not set!\n"); -+ WD_ERR("invalid: prepare sign_in, hash not set!\n"); - return -WD_EINVAL; - } - -@@ -1029,17 +1028,17 @@ static int ecc_prepare_sign_in(struct wd_ecc_msg *msg, - k = &in->k; - if (!in->k_set) { - if (msg->req.op_type == WD_ECDSA_SIGN) { -- WD_ERR("random k not set!\n"); -+ WD_ERR("invalid: random k not set!\n"); - return -WD_EINVAL; - } - hw_msg->sm2_ksel = 1; - } else if (is_all_zero(k, msg)) { -- WD_ERR("ecc sign in k all zero!\n"); -+ WD_ERR("invalid: ecc sign in k all zero!\n"); - return -WD_EINVAL; - } - - if (is_all_zero(e, msg)) { -- WD_ERR("ecc sign in e all zero!\n"); -+ WD_ERR("invalid: ecc sign in e all zero!\n"); - return -WD_EINVAL; - } - -@@ -1072,7 +1071,7 @@ static int ecc_prepare_verf_in(struct wd_ecc_msg *msg, - int ret; - - if (!vin->dgst_set) { -- WD_ERR("prepare verf_in, hash not set!\n"); -+ WD_ERR("invalid: prepare verf_in, hash not set!\n"); - return -WD_EINVAL; - } - -@@ -1081,7 +1080,7 @@ static int ecc_prepare_verf_in(struct wd_ecc_msg *msg, - r = &vin->r; - - if (is_all_zero(e, msg)) { -- WD_ERR("ecc verf in e all zero!\n"); -+ WD_ERR("invalid: ecc verf in e all zero!\n"); - return -WD_EINVAL; - } - -@@ -1182,17 +1181,13 @@ static int ecc_prepare_dh_compute_in(struct wd_ecc_msg *msg, - - ret = crypto_bin_to_hpre_bin(pbk->x.data, (const char *)pbk->x.data, - pbk->x.bsize, pbk->x.dsize, "ecdh compute x"); -- if (ret) { -- WD_ERR("ecc dh compute in x format fail!\n"); -+ if (ret) - return ret; -- } - - ret = crypto_bin_to_hpre_bin(pbk->y.data, (const char *)pbk->y.data, - pbk->y.bsize, pbk->y.dsize, "ecdh compute y"); -- if (ret) { -- WD_ERR("ecc dh compute in y format fail!\n"); -+ if (ret) - return ret; -- } - - *data = pbk->x.data; - -@@ -1221,12 +1216,12 @@ static int u_is_in_p(struct wd_ecc_msg *msg) - if (msg->curve_id == WD_X25519) - pbk->x.data[0] &= 0x7f; - if (!less_than_latter(&pbk->x, p)) { -- WD_ERR("ux is out of p!\n"); -+ WD_ERR("invalid: ux is out of p!\n"); - return -WD_EINVAL; - } - - if (is_all_zero(&pbk->x, msg)) { -- WD_ERR("ux is zero!\n"); -+ WD_ERR("invalid: ux is zero!\n"); - return -WD_EINVAL; - } - -@@ -1342,7 +1337,7 @@ static int ecc_prepare_iot(struct wd_ecc_msg *msg, - ecc_get_io_len(hw_msg->alg, kbytes, &i_sz, &o_sz); - ret = ecc_prepare_in(msg, hw_msg, &data); - if (ret) { -- WD_ERR("ecc_prepare_in fail!\n"); -+ WD_ERR("failed to prepare ecc in!\n"); - return ret; - } - hw_msg->low_in = LW_U32((uintptr_t)data); -@@ -1350,7 +1345,7 @@ static int ecc_prepare_iot(struct wd_ecc_msg *msg, - - ret = ecc_prepare_out(msg, &data); - if (ret) { -- WD_ERR("ecc_prepare_out fail!\n"); -+ WD_ERR("failed to prepare ecc out!\n"); - return ret; - } - -@@ -1374,7 +1369,7 @@ static __u32 get_hw_keysz(__u32 ksz) - else if (ksz <= BITS_TO_BYTES(576)) - size = BITS_TO_BYTES(576); - else -- WD_ERR("failed to get hw keysize : ksz = %u.\n", ksz); -+ WD_ERR("invalid: keysize %u is error!\n", ksz); - - return size; - } -@@ -1408,12 +1403,12 @@ static int set_param(struct wd_dtb *dst, const struct wd_dtb *src, - const char *p_name) - { - if (unlikely(!src || !src->data)) { -- WD_ERR("%s: src or data NULL!\n", p_name); -+ WD_ERR("invalid: %s src or data NULL!\n", p_name); - return -WD_EINVAL; - } - - if (unlikely(!src->dsize || src->dsize > dst->bsize)) { -- WD_ERR("%s: src dsz = %u error, dst bsz = %u!\n", -+ WD_ERR("invalid: %s src dsz %u, dst bsz %u is error!\n", - p_name, src->dsize, dst->bsize); - return -WD_EINVAL; - } -@@ -1470,13 +1465,13 @@ static struct wd_ecc_out *create_ecdh_out(struct wd_ecc_msg *msg) - struct wd_ecc_out *out; - - if (!hsz) { -- WD_ERR("get msg key size error!\n"); -+ WD_ERR("failed to get msg key size!\n"); - return NULL; - } - - out = malloc(len); - if (!out) { -- WD_ERR("failed to alloc, sz = %u!\n", len); -+ WD_ERR("failed to alloc out memory, sz = %u!\n", len); - return NULL; - } - -@@ -1527,13 +1522,13 @@ static struct wd_ecc_msg *create_req(struct wd_ecc_msg *src, __u8 req_idx) - - dst = malloc(sizeof(*dst) + sizeof(*src)); - if (unlikely(!dst)) { -- WD_ERR("failed to alloc dst\n"); -+ WD_ERR("failed to alloc dst!\n"); - return NULL; - } - - ecc_key = malloc(sizeof(*ecc_key) + sizeof(*prikey)); - if (unlikely(!ecc_key)) { -- WD_ERR("failed to alloc ecc_key\n"); -+ WD_ERR("failed to alloc ecc_key!\n"); - goto fail_alloc_key; - } - -@@ -1541,7 +1536,7 @@ static struct wd_ecc_msg *create_req(struct wd_ecc_msg *src, __u8 req_idx) - ecc_key->prikey = prikey; - prikey->data = malloc(ECC_PRIKEY_SZ(src->key_bytes)); - if (unlikely(!prikey->data)) { -- WD_ERR("failed to alloc prikey data\n"); -+ WD_ERR("failed to alloc prikey data!\n"); - goto fail_alloc_key_data; - } - init_prikey(prikey, src->key_bytes); -@@ -1551,7 +1546,7 @@ static struct wd_ecc_msg *create_req(struct wd_ecc_msg *src, __u8 req_idx) - - ret = init_req(dst, src, ecc_key, req_idx); - if (unlikely(ret)) { -- WD_ERR("failed to init req, ret = %d\n", ret); -+ WD_ERR("failed to init req, ret = %d!\n", ret); - goto fail_set_prikey; - } - -@@ -1602,12 +1597,12 @@ static int ecc_fill(struct wd_ecc_msg *msg, struct hisi_hpre_sqe *hw_msg) - - if (unlikely(!op_type || (op_type >= WD_EC_OP_MAX && - op_type != HPRE_SM2_ENC && op_type != HPRE_SM2_DEC))) { -- WD_ERR("op_type = %u error!\n", op_type); -+ WD_ERR("invalid: input op_type %u is error!\n", op_type); - return -WD_EINVAL; - } - - if (!hw_sz) { -- WD_ERR("get msg key size error!\n"); -+ WD_ERR("failed to get msg key size!\n"); - return -WD_EINVAL; - } - -@@ -1666,12 +1661,12 @@ static int sm2_enc_send(handle_t ctx, struct wd_ecc_msg *msg) - return ecc_general_send(ctx, msg); - - if (unlikely(!ein->k_set)) { -- WD_ERR("error: k not set\n"); -+ WD_ERR("invalid: k not set!\n"); - return -WD_EINVAL; - } - - if (unlikely(!hash->cb || hash->type >= WD_HASH_MAX)) { -- WD_ERR("hash parameter error, type = %u\n", hash->type); -+ WD_ERR("invalid: input hash type %u is error!\n", hash->type); - return -WD_EINVAL; - } - -@@ -1682,19 +1677,19 @@ static int sm2_enc_send(handle_t ctx, struct wd_ecc_msg *msg) - */ - ret = split_req(msg, msg_dst); - if (unlikely(ret)) { -- WD_ERR("failed to split req, ret = %d\n", ret); -+ WD_ERR("failed to split req, ret = %d!\n", ret); - return ret; - } - - ret = ecc_fill(msg_dst[0], &hw_msg[0]); - if (unlikely(ret)) { -- WD_ERR("failed to fill 1th sqe, ret = %d\n", ret); -+ WD_ERR("failed to fill 1th sqe, ret = %d!\n", ret); - goto fail_fill_sqe; - } - - ret = ecc_fill(msg_dst[1], &hw_msg[1]); - if (unlikely(ret)) { -- WD_ERR("failed to fill 2th sqe, ret = %d\n", ret); -+ WD_ERR("failed to fill 2th sqe, ret = %d!\n", ret); - goto fail_fill_sqe; - } - -@@ -1725,7 +1720,7 @@ static int sm2_dec_send(handle_t ctx, struct wd_ecc_msg *msg) - return ecc_general_send(ctx, msg); - - if (unlikely(!hash->cb || hash->type >= WD_HASH_MAX)) { -- WD_ERR("hash parameter error, type = %u\n", hash->type); -+ WD_ERR("invalid: input hash type %u is error!\n", hash->type); - return -WD_EINVAL; - } - -@@ -1779,7 +1774,7 @@ static int ecdh_out_transfer(struct wd_ecc_msg *msg, struct hisi_hpre_sqe *hw_ms - - ret = hpre_tri_bin_transfer(&key->x, y, NULL); - if (ret) { -- WD_ERR("parse ecdh out format fail!\n"); -+ WD_ERR("failed to transfer ecdh format to crypto bin!\n"); - return ret; - } - -@@ -1889,7 +1884,7 @@ static int ecc_out_transfer(struct wd_ecc_msg *msg, - hw_msg->alg == HPRE_ALG_X_DH_MULTIPLY) - ret = ecdh_out_transfer(msg, hw_msg); - else -- WD_ERR("ecc out trans fail algorithm %u error!\n", hw_msg->alg); -+ WD_ERR("invalid: algorithm type %u is error!\n", hw_msg->alg); - - return ret; - } -@@ -1921,7 +1916,7 @@ static __u32 get_hash_bytes(__u8 type) - val = BITS_TO_BYTES(512); - break; - default: -- WD_ERR("get hash bytes: type %u error!\n", type); -+ WD_ERR("invalid: hash type %u is error!\n", type); - break; - } - -@@ -1977,7 +1972,7 @@ static int sm2_kdf(struct wd_dtb *out, struct wd_ecc_point *x2y2, - t_out = m_len >= h_bytes ? tmp : p_out; - ret = hash->cb(p_in, in_len, t_out, h_bytes, hash->usr); - if (ret) { -- WD_ERR("failed to hash cb, ret = %d!\n", ret); -+ WD_ERR("%s failed to do hash cb, ret = %d!\n", __func__, ret); - break; - } - -@@ -2041,7 +2036,7 @@ static int sm2_hash(struct wd_dtb *out, struct wd_ecc_point *x2y2, - msg_pack(p_in, &in_len, x2y2->y.data, x2y2->y.dsize); - ret = hash->cb(p_in, in_len, hash_out, h_bytes, hash->usr); - if (unlikely(ret)) { -- WD_ERR("failed to hash cb, ret = %d!\n", ret); -+ WD_ERR("%s failed to do hash cb, ret = %d!\n", __func__, ret); - goto fail; - } - -@@ -2088,7 +2083,7 @@ static int sm2_convert_enc_out(struct wd_ecc_msg *src, - /* C3 = hash(x2 || M || y2) */ - ret = sm2_hash(&eout->c3, &x2y2, &ein->plaintext, hash); - if (unlikely(ret)) { -- WD_ERR("failed to sm2 hash, ret = %d!\n", ret); -+ WD_ERR("failed to do sm2 hash, ret = %d!\n", ret); - return ret; - } - -@@ -2096,7 +2091,7 @@ static int sm2_convert_enc_out(struct wd_ecc_msg *src, - kdf_out = &eout->c2; - ret = sm2_kdf(kdf_out, &x2y2, ein->plaintext.dsize, hash); - if (unlikely(ret)) { -- WD_ERR("failed to sm2 kdf, ret = %d!\n", ret); -+ WD_ERR("%s failed to do sm2 kdf, ret = %d!\n", __func__, ret); - return ret; - } - -@@ -2138,7 +2133,7 @@ static int sm2_convert_dec_out(struct wd_ecc_msg *src, - /* t = KDF(x2 || y2, klen) */ - ret = sm2_kdf(&dout->plaintext, &x2y2, din->c2.dsize, &src->hash); - if (unlikely(ret)) { -- WD_ERR("failed to sm2 kdf, ret = %d!\n", ret); -+ WD_ERR("%s failed to do sm2 kdf, ret = %d!\n", __func__, ret); - return ret; - } - -@@ -2166,10 +2161,10 @@ static int ecc_sqe_parse(struct wd_ecc_msg *msg, struct hisi_hpre_sqe *hw_msg) - - if (hw_msg->done != HPRE_HW_TASK_DONE || - hw_msg->etype || hw_msg->etype1) { -- WD_ERR("HPRE do ecc fail!done=0x%x, etype=0x%x, etype1=0x%x\n", -+ WD_ERR("failed to do ecc task! done=0x%x, etype=0x%x, etype1=0x%x!\n", - hw_msg->done, hw_msg->etype, hw_msg->etype1); - if (hw_msg->etype1 & HPRE_HW_SVA_ERROR) -- WD_ERR("failed to SVA prefetch: status=%u\n", -+ WD_ERR("failed to SVA prefetch: status=%u!\n", - hw_msg->sva_status); - - if (hw_msg->done == HPRE_HW_TASK_INIT) -@@ -2181,7 +2176,7 @@ static int ecc_sqe_parse(struct wd_ecc_msg *msg, struct hisi_hpre_sqe *hw_msg) - ret = ecc_out_transfer(msg, hw_msg); - if (ret) { - msg->result = WD_OUT_EPARA; -- WD_ERR("ecc out transfer fail!\n"); -+ WD_ERR("failed to transfer out ecc BD, ret = %d!\n", ret); - } - msg->tag = LW_U16(hw_msg->low_tag); - } -@@ -2247,7 +2242,7 @@ static int sm2_enc_parse(handle_t h_qp, - hw_msg->low_tag = 0; /* use sync mode */ - ret = ecc_sqe_parse(first, hw_msg); - if (ret) { -- WD_ERR("failed to parse first BD, ret = %d\n", ret); -+ WD_ERR("failed to parse first BD, ret = %d!\n", ret); - goto free_first; - } - -@@ -2291,7 +2286,7 @@ static int sm2_dec_parse(handle_t ctx, struct wd_ecc_msg *msg, - hw_msg->low_tag = 0; /* use sync mode */ - ret = ecc_sqe_parse(dst, hw_msg); - if (ret) { -- WD_ERR("failed to parse decode BD, ret = %d\n", ret); -+ WD_ERR("failed to parse decode BD, ret = %d!\n", ret); - goto fail; - } - msg->result = dst->result; --- -2.27.0 - diff --git a/0090-rsa-dh-ecc-unify-print-format.patch b/0090-rsa-dh-ecc-unify-print-format.patch deleted file mode 100644 index f6f7309..0000000 --- a/0090-rsa-dh-ecc-unify-print-format.patch +++ /dev/null @@ -1,1294 +0,0 @@ -From cebc80e528a9eb1cca675b2ea06f02b1760bafb3 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Thu, 10 Mar 2022 20:29:46 +0800 -Subject: [PATCH 098/109] rsa/dh/ecc: unify print format - -Unify print format with following rules: -1.failed to do sth. -2.add prefix "invalid: " for check parameters printf -3.add "!" at the end. - -Signed-off-by: Weili Qian ---- - wd_dh.c | 44 +++++++++--------- - wd_ecc.c | 136 +++++++++++++++++++++++++++---------------------------- - wd_rsa.c | 118 +++++++++++++++++++++++------------------------ - 3 files changed, 149 insertions(+), 149 deletions(-) - -diff --git a/wd_dh.c b/wd_dh.c -index f5d70a2..c0d3e00 100644 ---- a/wd_dh.c -+++ b/wd_dh.c -@@ -51,14 +51,14 @@ static void wd_dh_set_static_drv(void) - { - wd_dh_setting.driver = wd_dh_get_driver(); - if (!wd_dh_setting.driver) -- WD_ERR("fail to get driver\n"); -+ WD_ERR("failed to get dh driver!\n"); - } - #else - static void __attribute__((constructor)) wd_dh_open_driver(void) - { - wd_dh_setting.dlhandle = dlopen("libhisi_hpre.so", RTLD_NOW); - if (!wd_dh_setting.dlhandle) -- WD_ERR("Fail to open libhisi_hpre.so\n"); -+ WD_ERR("failed to open libhisi_hpre.so!\n"); - } - - static void __attribute__((destructor)) wd_dh_close_driver(void) -@@ -71,7 +71,7 @@ static void __attribute__((destructor)) wd_dh_close_driver(void) - void wd_dh_set_driver(struct wd_dh_driver *drv) - { - if (!drv) { -- WD_ERR("drv NULL\n"); -+ WD_ERR("invalid: dh drv is NULL!\n"); - return; - } - -@@ -81,12 +81,12 @@ void wd_dh_set_driver(struct wd_dh_driver *drv) - static int param_check(struct wd_ctx_config *config, struct wd_sched *sched) - { - if (!config || !config->ctxs || !config->ctxs[0].ctx || !sched) { -- WD_ERR("config or sched NULL\n"); -+ WD_ERR("invalid: config or sched is NULL!\n"); - return -WD_EINVAL; - } - - if (!wd_is_sva(config->ctxs[0].ctx)) { -- WD_ERR("no sva, do not dh init\n"); -+ WD_ERR("invalid: the mode is non sva, please check system!\n"); - return -WD_EINVAL; - } - -@@ -103,13 +103,13 @@ int wd_dh_init(struct wd_ctx_config *config, struct wd_sched *sched) - - ret = wd_init_ctx_config(&wd_dh_setting.config, config); - if (ret) { -- WD_ERR("failed to wd initialize ctx config, ret = %d\n", ret); -+ WD_ERR("failed to initialize ctx config, ret = %d!\n", ret); - return ret; - } - - ret = wd_init_sched(&wd_dh_setting.sched, sched); - if (ret) { -- WD_ERR("failed to wd initialize sched, ret = %d\n", ret); -+ WD_ERR("failed to initialize sched, ret = %d!\n", ret); - goto out; - } - -@@ -137,7 +137,7 @@ int wd_dh_init(struct wd_ctx_config *config, struct wd_sched *sched) - ret = wd_dh_setting.driver->init(&wd_dh_setting.config, priv, - wd_dh_setting.driver->alg_name); - if (ret < 0) { -- WD_ERR("failed to drv init, ret= %d\n", ret); -+ WD_ERR("failed to init dh driver, ret= %d!\n", ret); - goto out_init; - } - -@@ -159,7 +159,7 @@ out: - void wd_dh_uninit(void) - { - if (!wd_dh_setting.priv) { -- WD_ERR("repeat uninit dh\n"); -+ WD_ERR("invalid: repeat uninit dh!\n"); - return; - } - -@@ -184,7 +184,7 @@ static int fill_dh_msg(struct wd_dh_msg *msg, struct wd_dh_req *req, - msg->key_bytes = sess->key_size; - - if (unlikely(req->pri_bytes < sess->key_size)) { -- WD_ERR("req pri bytes = %hu error!\n", req->pri_bytes); -+ WD_ERR("invalid: req pri bytes %hu is error!\n", req->pri_bytes); - return -WD_EINVAL; - } - -@@ -195,12 +195,12 @@ static int fill_dh_msg(struct wd_dh_msg *msg, struct wd_dh_req *req, - msg->g = (__u8 *)req->pv; - msg->gbytes = req->pvbytes; - } else { -- WD_ERR("op_type = %hhu error!\n", req->op_type); -+ WD_ERR("invalid: op_type %hhu is error!\n", req->op_type); - return -WD_EINVAL; - } - - if (!msg->g) { -- WD_ERR("request dh g is NULL!\n"); -+ WD_ERR("invalid: request dh g is NULL!\n"); - return -WD_EINVAL; - } - -@@ -268,7 +268,7 @@ int wd_do_dh_sync(handle_t sess, struct wd_dh_req *req) - int ret; - - if (unlikely(!sess || !req)) { -- WD_ERR("input param NULL!\n"); -+ WD_ERR("invalid: input param NULL!\n"); - return -WD_EINVAL; - } - -@@ -310,7 +310,7 @@ int wd_do_dh_async(handle_t sess, struct wd_dh_req *req) - __u32 idx; - - if (unlikely(!req || !sess || !req->cb)) { -- WD_ERR("input param NULL!\n"); -+ WD_ERR("invalid: input param NULL!\n"); - return -WD_EINVAL; - } - -@@ -363,7 +363,7 @@ int wd_dh_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - int ret; - - if (unlikely(!count)) { -- WD_ERR("count is NULL!\n"); -+ WD_ERR("invalid: count is NULL!\n"); - return -WD_EINVAL; - } - -@@ -415,7 +415,7 @@ int wd_dh_poll(__u32 expt, __u32 *count) - int wd_dh_get_mode(handle_t sess, __u8 *alg_mode) - { - if (!sess || !alg_mode) { -- WD_ERR("dh get mode: param NULL!\n"); -+ WD_ERR("invalid: dh get mode, param NULL!\n"); - return -WD_EINVAL; - } - -@@ -427,7 +427,7 @@ int wd_dh_get_mode(handle_t sess, __u8 *alg_mode) - __u32 wd_dh_key_bits(handle_t sess) - { - if (!sess) { -- WD_ERR("get dh key bits, sess NULL!\n"); -+ WD_ERR("invalid: get dh key bits, sess NULL!\n"); - return 0; - } - -@@ -439,7 +439,7 @@ int wd_dh_set_g(handle_t sess, struct wd_dtb *g) - struct wd_dh_sess *sess_t = (struct wd_dh_sess *)sess; - - if (!sess_t || !g) { -- WD_ERR("param NULL!\n"); -+ WD_ERR("invalid: dh set g, param NULL!\n"); - return -WD_EINVAL; - } - -@@ -460,7 +460,7 @@ int wd_dh_set_g(handle_t sess, struct wd_dtb *g) - void wd_dh_get_g(handle_t sess, struct wd_dtb **g) - { - if (!sess || !g) { -- WD_ERR("param NULL!\n"); -+ WD_ERR("invalid: dh get g, param NULL!\n"); - return; - } - -@@ -472,7 +472,7 @@ handle_t wd_dh_alloc_sess(struct wd_dh_sess_setup *setup) - struct wd_dh_sess *sess; - - if (!setup) { -- WD_ERR("alloc dh sess setup NULL!\n"); -+ WD_ERR("invalid: alloc dh sess setup NULL!\n"); - return (handle_t)0; - } - -@@ -483,7 +483,7 @@ handle_t wd_dh_alloc_sess(struct wd_dh_sess_setup *setup) - setup->key_bits != 2048 && - setup->key_bits != 3072 && - setup->key_bits != 4096) { -- WD_ERR("alloc dh sess key_bit %u err!\n", setup->key_bits); -+ WD_ERR("invalid: alloc dh sess key_bit %u is err!\n", setup->key_bits); - return (handle_t)0; - } - -@@ -522,7 +522,7 @@ void wd_dh_free_sess(handle_t sess) - struct wd_dh_sess *sess_t = (struct wd_dh_sess *)sess; - - if (!sess_t) { -- WD_ERR("free rsa sess param NULL!\n"); -+ WD_ERR("invalid: free dh sess param NULL!\n"); - return; - } - -diff --git a/wd_ecc.c b/wd_ecc.c -index d925bc3..af62b9a 100644 ---- a/wd_ecc.c -+++ b/wd_ecc.c -@@ -105,14 +105,14 @@ static void wd_ecc_set_static_drv(void) - { - wd_ecc_setting.driver = wd_ecc_get_driver(); - if (!wd_ecc_setting.driver) -- WD_ERR("fail to get driver\n"); -+ WD_ERR("failed to get ecc driver!\n"); - } - #else - static void __attribute__((constructor)) wd_ecc_open_driver(void) - { - wd_ecc_setting.dlhandle = dlopen("libhisi_hpre.so", RTLD_NOW); - if (!wd_ecc_setting.dlhandle) -- WD_ERR("failed to open libhisi_hpre.so\n"); -+ WD_ERR("failed to open libhisi_hpre.so!\n"); - } - - static void __attribute__((destructor)) wd_ecc_close_driver(void) -@@ -125,7 +125,7 @@ static void __attribute__((destructor)) wd_ecc_close_driver(void) - void wd_ecc_set_driver(struct wd_ecc_driver *drv) - { - if (!drv) { -- WD_ERR("drv NULL\n"); -+ WD_ERR("invalid: ecc drv is NULL!\n"); - return; - } - -@@ -135,12 +135,12 @@ void wd_ecc_set_driver(struct wd_ecc_driver *drv) - static int init_param_check(struct wd_ctx_config *config, struct wd_sched *sched) - { - if (!config || !config->ctxs || !config->ctxs[0].ctx || !sched) { -- WD_ERR("config or sched NULL\n"); -+ WD_ERR("invalid: config or sched is NULL!\n"); - return -WD_EINVAL; - } - - if (!wd_is_sva(config->ctxs[0].ctx)) { -- WD_ERR("no sva, not do ecc init\n"); -+ WD_ERR("invalid: the mode is non sva, please check system!\n"); - return -WD_EINVAL; - } - -@@ -191,7 +191,7 @@ int wd_ecc_init(struct wd_ctx_config *config, struct wd_sched *sched) - ret = wd_ecc_setting.driver->init(&wd_ecc_setting.config, priv, - wd_ecc_setting.driver->alg_name); - if (ret < 0) { -- WD_ERR("failed to drv init, ret = %d\n", ret); -+ WD_ERR("failed to init ecc driver, ret = %d!\n", ret); - goto out_init; - } - -@@ -212,7 +212,7 @@ out: - void wd_ecc_uninit(void) - { - if (!wd_ecc_setting.priv) { -- WD_ERR("repeat uninit ecc\n"); -+ WD_ERR("invalid: repeat uninit ecc!\n"); - return; - } - -@@ -236,7 +236,7 @@ static int trans_to_binpad(char *dst, const char *src, - int j; - - if (unlikely(!dst || !src || !b_size || !d_size || b_size < d_size)) { -- WD_ERR("%s: trans to hpre bin params err!\n", p_name); -+ WD_ERR("invalid: %s trans to hpre bin params err!\n", p_name); - return -WD_EINVAL; - } - -@@ -265,7 +265,7 @@ static __u32 get_key_bsz(__u32 ksz) - else if (ksz <= BITS_TO_BYTES(576)) - size = BITS_TO_BYTES(576); - else -- WD_ERR("failed to get key buffer size : key size = %u.\n", ksz); -+ WD_ERR("invalid: get key size %u is error!\n", ksz); - - return size; - } -@@ -386,7 +386,7 @@ static struct wd_ecc_pubkey *create_ecc_pubkey(struct wd_ecc_sess *sess) - hsz = get_key_bsz(sess->key_size); - pubkey = malloc(sizeof(struct wd_ecc_pubkey)); - if (!pubkey) { -- WD_ERR("failed to malloc!\n"); -+ WD_ERR("failed to malloc pubkey!\n"); - return NULL; - } - -@@ -419,7 +419,7 @@ static struct wd_ecc_in *create_ecc_in(struct wd_ecc_sess *sess, __u32 num) - __u32 hsz, len; - - if (!sess->key_size || sess->key_size > ECC_MAX_KEY_SIZE) { -- WD_ERR("sess key size %u error!\n", sess->key_size); -+ WD_ERR("invalid: sess key size %u is error!\n", sess->key_size); - return NULL; - } - -@@ -447,7 +447,7 @@ static struct wd_ecc_in *create_sm2_sign_in(struct wd_ecc_sess *sess, - __u64 len; - - if (ksz != SM2_KEY_SIZE) { -- WD_ERR("sess key size %u error!\n", ksz); -+ WD_ERR("invalid: sess key size %u is error!\n", ksz); - return NULL; - } - -@@ -488,7 +488,7 @@ static struct wd_ecc_in *create_sm2_enc_in(struct wd_ecc_sess *sess, - __u64 len; - - if (ksz != SM2_KEY_SIZE) { -- WD_ERR("sess key size %u error!\n", sess->key_size); -+ WD_ERR("invalid: sess key size %u is error!\n", sess->key_size); - return NULL; - } - -@@ -525,7 +525,7 @@ static void *create_sm2_ciphertext(struct wd_ecc_sess *sess, __u32 m_len, - void *start; - - if (unlikely(ksz != SM2_KEY_SIZE)) { -- WD_ERR("sess key size %u error!\n", ksz); -+ WD_ERR("invalid: sess key size %u is error!\n", ksz); - return NULL; - } - -@@ -539,7 +539,7 @@ static void *create_sm2_ciphertext(struct wd_ecc_sess *sess, __u32 m_len, - (__u64)m_len + (__u64)h_byts; - start = malloc(*len); - if (unlikely(!start)) { -- WD_ERR("failed to alloc, sz = %llu!\n", *len); -+ WD_ERR("failed to alloc start, sz = %llu!\n", *len); - return NULL; - } - -@@ -579,7 +579,7 @@ static struct wd_ecc_out *create_ecc_out(struct wd_ecc_sess *sess, __u32 num) - __u32 hsz, len; - - if (!sess->key_size || sess->key_size > ECC_MAX_KEY_SIZE) { -- WD_ERR("sess key size %u error!\n", sess->key_size); -+ WD_ERR("invalid: sess key size %u is error!\n", sess->key_size); - return NULL; - } - -@@ -678,12 +678,12 @@ static int set_param_single(struct wd_dtb *dst, const struct wd_dtb *src, - const char *p_name) - { - if (unlikely(!src || !src->data)) { -- WD_ERR("%s: src or data NULL!\n", p_name); -+ WD_ERR("invalid: %s src or data NULL!\n", p_name); - return -WD_EINVAL; - } - - if (!src->dsize || src->dsize > dst->dsize) { -- WD_ERR("%s: src dsz = %u error, dst dsz = %u!\n", -+ WD_ERR("invalid: %s src dsz %u or dst dsz %u is error!\n", - p_name, src->dsize, dst->dsize); - return -WD_EINVAL; - } -@@ -698,7 +698,7 @@ static int set_param_single(struct wd_dtb *dst, const struct wd_dtb *src, - int wd_ecc_get_key_bits(handle_t sess) - { - if (!sess) { -- WD_ERR("get ecc key bits, sess NULL!\n"); -+ WD_ERR("invalid: get ecc key bits, sess NULL!\n"); - return -WD_EINVAL; - } - -@@ -800,7 +800,7 @@ static int fill_param_by_id(struct wd_ecc_curve *c, - } - - if (item->key_bits != key_bits) { -- WD_ERR("curve %u and key bits %u not match!\n", id, key_bits); -+ WD_ERR("invalid: curve %u and key bits %u not match!\n", id, key_bits); - return -WD_EINVAL; - } - -@@ -833,7 +833,7 @@ static int set_key_cv(struct wd_ecc_curve *dst, - int ret; - - if (unlikely(!src)) { -- WD_ERR("set key cv: praram NULL!\n"); -+ WD_ERR("invalid: set key cv, praram NULL!\n"); - return -WD_EINVAL; - } - -@@ -870,22 +870,22 @@ static int fill_user_curve_cfg(struct wd_ecc_curve *param, - if (setup->cv.type == WD_CV_CFG_ID) { - curve_id = setup->cv.cfg.id; - ret = fill_param_by_id(param, setup->key_bits, curve_id); -- dbg("set curve id %u\n", curve_id); -+ dbg("set curve id %u!\n", curve_id); - } else if (setup->cv.type == WD_CV_CFG_PARAM) { - ret = set_key_cv(param, src_param); - if (ret) { - WD_ERR("failed to set key cv!\n"); - return ret; - } -- dbg("set curve by user param\n"); -+ dbg("set curve by user param!\n"); - } else { -- WD_ERR("fill curve cfg:type %u error!\n", setup->cv.type); -+ WD_ERR("invalid: fill curve cfg type %u is error!\n", setup->cv.type); - return -WD_EINVAL; - } - - if (!param->p.dsize || - param->p.dsize > BITS_TO_BYTES(setup->key_bits)) { -- WD_ERR("fill curve cfg:dsize %u error!\n", param->p.dsize); -+ WD_ERR("invalid: fill curve cfg dsize %u is error!\n", param->p.dsize); - return -WD_EINVAL; - } - -@@ -974,19 +974,19 @@ static bool is_alg_support(const char *alg) - static int setup_param_check(struct wd_ecc_sess_setup *setup) - { - if (unlikely(!setup || !setup->alg)) { -- WD_ERR("input parameter error!\n"); -+ WD_ERR("invalid: input parameter error!\n"); - return -WD_EINVAL; - } - - if (unlikely(!is_alg_support(setup->alg))) { -- WD_ERR("algorithms %s not supported!\n", setup->alg); -+ WD_ERR("invalid: algorithms %s not supported!\n", setup->alg); - return -WD_EINVAL; - } - - setup_curve_cfg(setup); - - if (unlikely(!is_key_width_support(setup->key_bits))) { -- WD_ERR("key_bits %u error!\n", setup->key_bits); -+ WD_ERR("invalid: key_bits %u is error!\n", setup->key_bits); - return -WD_EINVAL; - } - -@@ -1035,7 +1035,7 @@ handle_t wd_ecc_alloc_sess(struct wd_ecc_sess_setup *setup) - - ret = create_sess_key(setup, sess); - if (ret) { -- WD_ERR("failed creat ecc sess keys!\n"); -+ WD_ERR("failed to creat ecc sess keys!\n"); - goto sess_err; - } - -@@ -1061,7 +1061,7 @@ void wd_ecc_free_sess(handle_t sess) - struct wd_ecc_sess *sess_t = (struct wd_ecc_sess *)sess; - - if (!sess_t) { -- WD_ERR("free ecc sess parameter err!\n"); -+ WD_ERR("invalid: free ecc sess parameter err!\n"); - return; - } - -@@ -1076,7 +1076,7 @@ struct wd_ecc_key *wd_ecc_get_key(handle_t sess) - struct wd_ecc_sess *sess_t = (struct wd_ecc_sess *)sess; - - if (!sess_t) { -- WD_ERR("get ecc key sess NULL!\n"); -+ WD_ERR("invalid: get ecc key sess NULL!\n"); - return NULL; - } - -@@ -1091,14 +1091,14 @@ int wd_ecc_set_prikey(struct wd_ecc_key *ecc_key, - int ret; - - if (!ecc_key || !prikey) { -- WD_ERR("set ecc prikey parameter NULL!\n"); -+ WD_ERR("invalid: set ecc prikey parameter NULL!\n"); - return -WD_EINVAL; - } - - ecc_prikey = ecc_key->prikey; - d = ecc_key->d; - if (!ecc_prikey || !d) { -- WD_ERR("ecc_prikey or d NULL!\n"); -+ WD_ERR("invalid: ecc_prikey or d NULL!\n"); - return -WD_EINVAL; - } - -@@ -1113,7 +1113,7 @@ int wd_ecc_get_prikey(struct wd_ecc_key *ecc_key, - struct wd_dtb **prikey) - { - if (!ecc_key || !prikey) { -- WD_ERR("get ecc prikey parameter err!\n"); -+ WD_ERR("invalid: get ecc prikey parameter err!\n"); - return -WD_EINVAL; - } - -@@ -1129,14 +1129,14 @@ int wd_ecc_set_pubkey(struct wd_ecc_key *ecc_key, struct wd_ecc_point *pubkey) - int ret; - - if (!ecc_key || !pubkey) { -- WD_ERR("set ecc pubkey parameter err!\n"); -+ WD_ERR("invalid: set ecc pubkey parameter err!\n"); - return -WD_EINVAL; - } - - pub = ecc_key->pub; - ecc_pubkey = ecc_key->pubkey; - if (!ecc_pubkey || !pub) { -- WD_ERR("ecc_pubkey or pub NULL!\n"); -+ WD_ERR("invalid: ecc_pubkey or pub NULL!\n"); - return -WD_EINVAL; - } - -@@ -1161,7 +1161,7 @@ int wd_ecc_get_pubkey(struct wd_ecc_key *ecc_key, - struct wd_ecc_point **pubkey) - { - if (!ecc_key || !pubkey) { -- WD_ERR("get ecc pubkey parameter err!\n"); -+ WD_ERR("invalid: get ecc pubkey parameter err!\n"); - return -WD_EINVAL; - } - -@@ -1174,7 +1174,7 @@ int wd_ecc_get_curve(struct wd_ecc_key *ecc_key, - struct wd_ecc_curve **cv) - { - if (!ecc_key || !cv) { -- WD_ERR("get ecc pubkey parameter err!\n"); -+ WD_ERR("invalid: get ecc pubkey parameter err!\n"); - return -WD_EINVAL; - } - -@@ -1192,7 +1192,7 @@ void wd_ecc_get_prikey_params(struct wd_ecc_key *key, - struct wd_ecc_prikey *prk; - - if (!key || !key->prikey) { -- WD_ERR("input NULL in get ecc prikey param!\n"); -+ WD_ERR("invalid: input NULL in get ecc prikey param!\n"); - return; - } - -@@ -1226,7 +1226,7 @@ void wd_ecc_get_pubkey_params(struct wd_ecc_key *key, - struct wd_ecc_pubkey *pbk; - - if (!key || !key->pubkey) { -- WD_ERR("input NULL in get ecc pubkey param!\n"); -+ WD_ERR("invalid: input NULL in get ecc pubkey param!\n"); - return; - } - -@@ -1259,7 +1259,7 @@ struct wd_ecc_in *wd_ecxdh_new_in(handle_t sess, struct wd_ecc_point *in) - int ret; - - if (!s || !in) { -- WD_ERR("new ecc dh in parameter error!\n"); -+ WD_ERR("invalid: new ecc dh in parameter error!\n"); - return NULL; - } - -@@ -1288,7 +1288,7 @@ struct wd_ecc_out *wd_ecxdh_new_out(handle_t sess) - struct wd_ecc_out *ecc_out; - - if (!sess) { -- WD_ERR("new ecc dh out sess NULL!\n"); -+ WD_ERR("invalid: new ecc dh out sess NULL!\n"); - return NULL; - } - -@@ -1304,7 +1304,7 @@ void wd_ecxdh_get_out_params(struct wd_ecc_out *out, struct wd_ecc_point **key) - struct wd_ecc_dh_out *dh_out = (void *)out; - - if (!dh_out) { -- WD_ERR("input NULL in get ecdh out!\n"); -+ WD_ERR("invalid: input NULL in get ecdh out!\n"); - return; - } - -@@ -1317,13 +1317,13 @@ void wd_ecc_del_in(handle_t sess, struct wd_ecc_in *in) - __u32 bsz; - - if (!in) { -- WD_ERR("del ecc in parameter error!\n"); -+ WD_ERR("invalid: del ecc in parameter error!\n"); - return; - } - - bsz = in->size; - if (!bsz) { -- WD_ERR("del ecc in: bsz 0!\n"); -+ WD_ERR("invalid: del ecc in, bsz 0!\n"); - return; - } - -@@ -1336,13 +1336,13 @@ void wd_ecc_del_out(handle_t sess, struct wd_ecc_out *out) - __u32 bsz; - - if (!out) { -- WD_ERR("del ecc out parameter error!\n"); -+ WD_ERR("invalid: del ecc out parameter error!\n"); - return; - } - - bsz = out->size; - if (!bsz) { -- WD_ERR("del ecc out: bsz 0!\n"); -+ WD_ERR("invalid: del ecc out, bsz 0!\n"); - return; - } - -@@ -1374,7 +1374,7 @@ static int fill_ecc_msg(struct wd_ecc_msg *msg, struct wd_ecc_req *req, - key = &sess->key; - break; - default: -- WD_ERR("ecc request op type = %u error!\n", req->op_type); -+ WD_ERR("invalid: ecc request op type %u is error!\n", req->op_type); - return -WD_EINVAL; - } - msg->key = key; -@@ -1390,7 +1390,7 @@ static int fill_ecc_msg(struct wd_ecc_msg *msg, struct wd_ecc_req *req, - - if (!msg->req.src || (!req->dst && (req->op_type != WD_ECDSA_VERIFY && - req->op_type != WD_SM2_VERIFY))) { -- WD_ERR("req in/out NULL!\n"); -+ WD_ERR("invalid: req in/out NULL!\n"); - return -WD_EINVAL; - } - -@@ -1468,7 +1468,7 @@ int wd_do_ecc_sync(handle_t h_sess, struct wd_ecc_req *req) - int ret; - - if (unlikely(!h_sess || !req)) { -- WD_ERR("input parameter NULL!\n"); -+ WD_ERR("invalid: input parameter NULL!\n"); - return -WD_EINVAL; - } - -@@ -1504,7 +1504,7 @@ static void get_sign_out_params(struct wd_ecc_out *out, - struct wd_ecc_sign_out *sout = (void *)out; - - if (!sout) { -- WD_ERR("input NULL in get ecc sign out!\n"); -+ WD_ERR("invalid: input NULL in get ecc sign out!\n"); - return; - } - -@@ -1556,7 +1556,7 @@ static int generate_random(struct wd_ecc_sess *sess, struct wd_dtb *k) - - ret = rand_t.cb(k->data, k->dsize, rand_t.usr); - if (ret) -- WD_ERR("failed to rand cb: ret = %d!\n", ret); -+ WD_ERR("failed to do rand cb, ret = %d!\n", ret); - - return ret; - } -@@ -1580,7 +1580,7 @@ static int sm2_compute_za_hash(__u8 *za, __u32 *len, struct wd_dtb *id, - - if (id && (!BYTES_TO_BITS(id->dsize) || !id->data || - BYTES_TO_BITS(id->dsize) > UINT16_MAX)) { -- WD_ERR("id error: lens = %u!\n", id->dsize); -+ WD_ERR("invalid: id error, lens = %u!\n", id->dsize); - return -WD_EINVAL; - } - -@@ -1633,7 +1633,7 @@ static int sm2_compute_digest(struct wd_ecc_sess *sess, struct wd_dtb *hash_msg, - - hash_bytes = get_hash_bytes(hash->type); - if (unlikely(!hash_bytes || hash_bytes > SM2_KEY_SIZE)) { -- WD_ERR("hash type = %hhu error!\n", hash->type); -+ WD_ERR("invalid: hash type %hhu is error!\n", hash->type); - return -WD_EINVAL; - } - -@@ -1675,7 +1675,7 @@ static struct wd_ecc_in *new_sign_in(struct wd_ecc_sess *sess, - int ret; - - if (!sess || !e) { -- WD_ERR("failed to new ecc sign in: sess or e NULL!\n"); -+ WD_ERR("invalid: new ecc sign in, sess or e NULL!\n"); - return NULL; - } - -@@ -1758,7 +1758,7 @@ static struct wd_ecc_in *create_sm2_verf_in(struct wd_ecc_sess *sess, - __u32 hsz; - - if (sess->key_size != SM2_KEY_SIZE) { -- WD_ERR("sess key size %u error!\n", sess->key_size); -+ WD_ERR("invalid: sess key size %u is error!\n", sess->key_size); - return NULL; - } - -@@ -1820,7 +1820,7 @@ static struct wd_ecc_in *new_verf_in(handle_t sess, - int ret; - - if (!sess_t || !r || !e || !s) { -- WD_ERR("new ecc verf in parameter error!\n"); -+ WD_ERR("invalid: new ecc verf in parameter error!\n"); - return NULL; - } - -@@ -1879,7 +1879,7 @@ static struct wd_ecc_out *wd_ecc_new_sign_out(struct wd_ecc_sess *sess) - struct wd_ecc_out *ecc_out; - - if (!sess) { -- WD_ERR("new ecc sout ctx NULL!\n"); -+ WD_ERR("invalid: new ecc sout ctx NULL!\n"); - return NULL; - } - -@@ -1900,7 +1900,7 @@ struct wd_ecc_out *wd_sm2_new_kg_out(handle_t sess) - struct wd_ecc_out *ecc_out; - - if (!sess) { -- WD_ERR("new sm2 kg out sess NULL!\n"); -+ WD_ERR("invalid: new sm2 kg out sess NULL!\n"); - return NULL; - } - -@@ -1919,7 +1919,7 @@ void wd_sm2_get_kg_out_params(struct wd_ecc_out *out, - struct wd_sm2_kg_out *kout = (void *)out; - - if (!kout) { -- WD_ERR("input NULL in get sm2 kg out!\n"); -+ WD_ERR("invalid: input NULL in get sm2 kg out!\n"); - return; - } - -@@ -1940,7 +1940,7 @@ struct wd_ecc_in *wd_sm2_new_enc_in(handle_t sess, - int ret; - - if (!sess_t || !plaintext) { -- WD_ERR("new sm2 enc in parameter error!\n"); -+ WD_ERR("invalid: new sm2 enc in parameter error!\n"); - return NULL; - } - -@@ -1991,7 +1991,7 @@ struct wd_ecc_in *wd_sm2_new_dec_in(handle_t sess, - int ret; - - if (!sess_t || !c1 || !c2 || !c3) { -- WD_ERR("new sm2 dec in parameter error!\n"); -+ WD_ERR("invalid: new sm2 dec in parameter error!\n"); - return NULL; - } - -@@ -2035,7 +2035,7 @@ struct wd_ecc_out *wd_sm2_new_enc_out(handle_t sess, __u32 plaintext_len) - __u64 len = 0; - - if (!sess_t) { -- WD_ERR("new ecc sout sess NULL!\n"); -+ WD_ERR("invalid: new ecc sout sess NULL!\n"); - return NULL; - } - -@@ -2090,7 +2090,7 @@ void wd_sm2_get_enc_out_params(struct wd_ecc_out *out, - struct wd_sm2_enc_out *eout = (void *)out; - - if (!eout) { -- WD_ERR("input NULL in get sm2 enc out!\n"); -+ WD_ERR("invalid: input NULL in get sm2 enc out!\n"); - return; - } - -@@ -2110,7 +2110,7 @@ void wd_sm2_get_dec_out_params(struct wd_ecc_out *out, - struct wd_sm2_dec_out *dout = (void *)out; - - if (!dout) { -- WD_ERR("input NULL in get sm2 dec out!\n"); -+ WD_ERR("invalid: input NULL in get sm2 dec out!\n"); - return; - } - -@@ -2156,7 +2156,7 @@ int wd_do_ecc_async(handle_t sess, struct wd_ecc_req *req) - int idx; - - if (unlikely(!req || !sess || !req->cb)) { -- WD_ERR("input parameter NULL!\n"); -+ WD_ERR("invalid: input parameter NULL!\n"); - return -WD_EINVAL; - } - -@@ -2207,7 +2207,7 @@ int wd_ecc_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - int ret; - - if (unlikely(!count)) { -- WD_ERR("param count is NULL!"); -+ WD_ERR("invalid: param count is NULL!\n"); - return -WD_EINVAL; - } - -@@ -2234,7 +2234,7 @@ int wd_ecc_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - msg = wd_find_msg_in_pool(&wd_ecc_setting.pool, idx, - recv_msg.tag); - if (!msg) { -- WD_ERR("get msg from pool is NULL!\n"); -+ WD_ERR("failed to get msg from pool!\n"); - return -WD_EINVAL; - } - -diff --git a/wd_rsa.c b/wd_rsa.c -index 8fc405f..8371475 100644 ---- a/wd_rsa.c -+++ b/wd_rsa.c -@@ -91,14 +91,14 @@ static void wd_rsa_set_static_drv(void) - { - wd_rsa_setting.driver = wd_rsa_get_driver(); - if (!wd_rsa_setting.driver) -- WD_ERR("fail to get driver\n"); -+ WD_ERR("failed to get rsa driver!\n"); - } - #else - static void __attribute__((constructor)) wd_rsa_open_driver(void) - { - wd_rsa_setting.dlhandle = dlopen("libhisi_hpre.so", RTLD_NOW); - if (!wd_rsa_setting.dlhandle) -- WD_ERR("Fail to open libhisi_hpre.so\n"); -+ WD_ERR("failed to open libhisi_hpre.so!\n"); - } - - static void __attribute__((destructor)) wd_rsa_close_driver(void) -@@ -111,7 +111,7 @@ static void __attribute__((destructor)) wd_rsa_close_driver(void) - void wd_rsa_set_driver(struct wd_rsa_driver *drv) - { - if (!drv) { -- WD_ERR("drv NULL\n"); -+ WD_ERR("invalid: rsa drv is NULL!\n"); - return; - } - -@@ -121,12 +121,12 @@ void wd_rsa_set_driver(struct wd_rsa_driver *drv) - static int param_check(struct wd_ctx_config *config, struct wd_sched *sched) - { - if (!config || !config->ctxs[0].ctx || !sched) { -- WD_ERR("config or sched NULL\n"); -+ WD_ERR("invalid: config or sched NULL!\n"); - return -WD_EINVAL; - } - - if (!wd_is_sva(config->ctxs[0].ctx)) { -- WD_ERR("no sva, do not rsa init\n"); -+ WD_ERR("invalid: the mode is non sva, please check system!\n"); - return -WD_EINVAL; - } - -@@ -177,7 +177,7 @@ int wd_rsa_init(struct wd_ctx_config *config, struct wd_sched *sched) - ret = wd_rsa_setting.driver->init(&wd_rsa_setting.config, priv, - wd_rsa_setting.driver->alg_name); - if (ret < 0) { -- WD_ERR("failed to drv init, ret = %d\n", ret); -+ WD_ERR("failed to init rsa driver, ret = %d!\n", ret); - goto out_init; - } - -@@ -198,7 +198,7 @@ out: - void wd_rsa_uninit(void) - { - if (!wd_rsa_setting.priv) { -- WD_ERR("repeat uninit rsa\n"); -+ WD_ERR("invalid: repeat uninit rsa!\n"); - return; - } - -@@ -240,24 +240,24 @@ static int fill_rsa_msg(struct wd_rsa_msg *msg, struct wd_rsa_req *req, - key = (__u8 *)req->src; - break; - default: -- WD_ERR("rsa msguest op type err!\n"); -+ WD_ERR("invalid: rsa msg req op type %u is err!\n", msg->req.op_type); - return -WD_EINVAL; - } - - if (unlikely(!key)) { -- WD_ERR("rsa msguest key null!\n"); -+ WD_ERR("invalid: rsa msg key null!\n"); - return -WD_EINVAL; - } - - if (msg->req.op_type == WD_RSA_SIGN || - msg->req.op_type == WD_RSA_VERIFY) { - if (unlikely(msg->req.src_bytes != sess->key_size)) { -- WD_ERR("sign or verf src_bytes != key_size!\n"); -+ WD_ERR("invalid: sign or verf src_bytes != key_size!\n"); - return -WD_EINVAL; - } - - if (unlikely(req->dst_bytes != sess->key_size)) { -- WD_ERR("req dst bytes = %hu error!\n", req->dst_bytes); -+ WD_ERR("invalid: req dst bytes %hu is error!\n", req->dst_bytes); - return -WD_EINVAL; - } - } -@@ -329,7 +329,7 @@ int wd_do_rsa_sync(handle_t h_sess, struct wd_rsa_req *req) - int ret; - - if (unlikely(!h_sess || !req)) { -- WD_ERR("input param NULL!\n"); -+ WD_ERR("invalid: input param NULL!\n"); - return -WD_EINVAL; - } - -@@ -370,7 +370,7 @@ int wd_do_rsa_async(handle_t sess, struct wd_rsa_req *req) - __u32 idx; - - if (unlikely(!req || !sess || !req->cb)) { -- WD_ERR("input param NULL!\n"); -+ WD_ERR("invalid: input param NULL!\n"); - return -WD_EINVAL; - } - -@@ -417,7 +417,7 @@ int wd_rsa_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - int ret; - - if (unlikely(!count)) { -- WD_ERR("param count is NULL!"); -+ WD_ERR("invalid: param count is NULL!\n"); - return -WD_EINVAL; - } - -@@ -443,7 +443,7 @@ int wd_rsa_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - msg = wd_find_msg_in_pool(&wd_rsa_setting.pool, idx, - recv_msg.tag); - if (!msg) { -- WD_ERR("get msg from pool is NULL!\n"); -+ WD_ERR("failed to get msg from pool!\n"); - return -WD_EINVAL; - } - -@@ -468,7 +468,7 @@ int wd_rsa_poll(__u32 expt, __u32 *count) - int wd_rsa_kg_in_data(struct wd_rsa_kg_in *ki, char **data) - { - if (!ki || !data) { -- WD_ERR("param is NULL!\n"); -+ WD_ERR("invalid: param is NULL!\n"); - return -WD_EINVAL; - } - -@@ -479,7 +479,7 @@ int wd_rsa_kg_in_data(struct wd_rsa_kg_in *ki, char **data) - int wd_rsa_kg_out_data(struct wd_rsa_kg_out *ko, char **data) - { - if (!ko || !data) { -- WD_ERR("param is NULL!\n"); -+ WD_ERR("invalid: param is NULL!\n"); - return -WD_EINVAL; - } - -@@ -497,32 +497,32 @@ struct wd_rsa_kg_in *wd_rsa_new_kg_in(handle_t sess, struct wd_dtb *e, - int kg_in_size; - - if (!c || !e || !p || !q) { -- WD_ERR("sess malloc kg_in memory fail!\n"); -+ WD_ERR("invalid: sess malloc kg_in memory params err!\n"); - return NULL; - } - - if (!c->key_size || c->key_size > RSA_MAX_KEY_SIZE) { -- WD_ERR("key size err at create kg in!\n"); -+ WD_ERR("invalid: key size err at create kg in!\n"); - return NULL; - } - - if (!e->dsize || e->dsize > c->key_size) { -- WD_ERR("e para err at create kg in!\n"); -+ WD_ERR("invalid: e para err at create kg in!\n"); - return NULL; - } - if (!p->dsize || p->dsize > CRT_PARAM_SZ(c->key_size)) { -- WD_ERR("p para err at create kg in!\n"); -+ WD_ERR("invalid: p para err at create kg in!\n"); - return NULL; - } - if (!q->dsize || q->dsize > CRT_PARAM_SZ(c->key_size)) { -- WD_ERR("q para err at create kg in!\n"); -+ WD_ERR("invalid: q para err at create kg in!\n"); - return NULL; - } - - kg_in_size = GEN_PARAMS_SZ(c->key_size); - kg_in = malloc(kg_in_size + sizeof(*kg_in)); - if (!kg_in) { -- WD_ERR("sess malloc kg_in memory fail!\n"); -+ WD_ERR("failed to malloc kg_in memory!\n"); - return NULL; - } - memset(kg_in, 0, kg_in_size + sizeof(*kg_in)); -@@ -545,7 +545,7 @@ void wd_rsa_get_kg_in_params(struct wd_rsa_kg_in *kin, struct wd_dtb *e, - struct wd_dtb *q, struct wd_dtb *p) - { - if (!kin || !e || !q || !p) { -- WD_ERR("para err at get input parameters key generate !\n"); -+ WD_ERR("invalid: para err at get input parameters key generate!\n"); - return; - } - -@@ -563,7 +563,7 @@ void wd_rsa_get_kg_in_params(struct wd_rsa_kg_in *kin, struct wd_dtb *e, - static void del_kg(void *k) - { - if (!k) { -- WD_ERR("del key generate params err!\n"); -+ WD_ERR("invalid: del key generate params err!\n"); - return; - } - -@@ -583,13 +583,13 @@ struct wd_rsa_kg_out *wd_rsa_new_kg_out(handle_t sess) - __u32 kz; - - if (!c) { -- WD_ERR("sess null at new rsa key gen out!\n"); -+ WD_ERR("invalid: sess null at new rsa key gen out!\n"); - return NULL; - } - - kz = c->key_size; - if (!kz || kz > RSA_MAX_KEY_SIZE) { -- WD_ERR("new kg out key size error!\n"); -+ WD_ERR("invalid: new kg out key size error!\n"); - return NULL; - } - -@@ -600,7 +600,7 @@ struct wd_rsa_kg_out *wd_rsa_new_kg_out(handle_t sess) - - kg_out = malloc(kg_out_size + sizeof(*kg_out)); - if (!kg_out) { -- WD_ERR("sess malloc kg_out memory fail!\n"); -+ WD_ERR("failed to malloc kg_out memory!\n"); - return NULL; - } - -@@ -621,7 +621,7 @@ struct wd_rsa_kg_out *wd_rsa_new_kg_out(handle_t sess) - void wd_rsa_del_kg_out(handle_t sess, struct wd_rsa_kg_out *kout) - { - if (!kout) { -- WD_ERR("param null at del kg out!\n"); -+ WD_ERR("invalid: param null at del kg out!\n"); - return; - } - -@@ -633,7 +633,7 @@ void wd_rsa_get_kg_out_params(struct wd_rsa_kg_out *kout, struct wd_dtb *d, - struct wd_dtb *n) - { - if (!kout) { -- WD_ERR("input null at get key gen params!\n"); -+ WD_ERR("invalid: input null at get key gen params!\n"); - return; - } - -@@ -655,7 +655,7 @@ void wd_rsa_get_kg_out_crt_params(struct wd_rsa_kg_out *kout, - struct wd_dtb *dq, struct wd_dtb *dp) - { - if (!kout || !qinv || !dq || !dp) { -- WD_ERR("input null at get key gen crt para!\n"); -+ WD_ERR("invalid: input null at get key gen crt para!\n"); - return; - } - -@@ -743,7 +743,7 @@ static int create_sess_key(struct wd_rsa_sess_setup *setup, - CRT_PARAMS_SZ(sess->key_size); - sess->prikey = malloc(len); - if (!sess->prikey) { -- WD_ERR("alloc prikey2 fail!\n"); -+ WD_ERR("failed to alloc sess prikey2!\n"); - return -WD_ENOMEM; - } - pkey2 = &sess->prikey->pkey2; -@@ -754,7 +754,7 @@ static int create_sess_key(struct wd_rsa_sess_setup *setup, - GEN_PARAMS_SZ(sess->key_size); - sess->prikey = malloc(len); - if (!sess->prikey) { -- WD_ERR("alloc prikey1 fail!\n"); -+ WD_ERR("failed to alloc sess prikey1!\n"); - return -WD_ENOMEM; - } - pkey1 = &sess->prikey->pkey1; -@@ -767,7 +767,7 @@ static int create_sess_key(struct wd_rsa_sess_setup *setup, - sess->pubkey = malloc(len); - if (!sess->pubkey) { - free(sess->prikey); -- WD_ERR("alloc pubkey fail!\n"); -+ WD_ERR("failed to alloc sess pubkey!\n"); - return -WD_ENOMEM; - } - -@@ -783,7 +783,7 @@ static void del_sess_key(struct wd_rsa_sess *sess) - struct wd_rsa_pubkey *pub = sess->pubkey; - - if (!prk || !pub) { -- WD_ERR("del sess key error: prk or pub NULL\n"); -+ WD_ERR("invalid: del sess key error, prk or pub NULL!\n"); - return; - } - -@@ -808,7 +808,7 @@ handle_t wd_rsa_alloc_sess(struct wd_rsa_sess_setup *setup) - int ret; - - if (!setup) { -- WD_ERR("alloc rsa sess setup NULL!\n"); -+ WD_ERR("invalid: alloc rsa sess setup NULL!\n"); - return(handle_t)0; - } - -@@ -816,7 +816,7 @@ handle_t wd_rsa_alloc_sess(struct wd_rsa_sess_setup *setup) - setup->key_bits != 2048 && - setup->key_bits != 3072 && - setup->key_bits != 4096) { -- WD_ERR("alloc rsa sess key_bit %u err!\n", setup->key_bits); -+ WD_ERR("invalid: alloc rsa sess key_bit %u err!\n", setup->key_bits); - return (handle_t)0; - } - -@@ -829,7 +829,7 @@ handle_t wd_rsa_alloc_sess(struct wd_rsa_sess_setup *setup) - - ret = create_sess_key(setup, sess); - if (ret) { -- WD_ERR("fail creating rsa sess keys!\n"); -+ WD_ERR("failed to create rsa sess keys!\n"); - goto sess_err; - } - -@@ -855,7 +855,7 @@ void wd_rsa_free_sess(handle_t sess) - struct wd_rsa_sess *sess_t = (struct wd_rsa_sess *)sess; - - if (!sess_t) { -- WD_ERR("free rsa sess param err!\n"); -+ WD_ERR("invalid: free rsa sess param err!\n"); - return; - } - -@@ -869,7 +869,7 @@ void wd_rsa_free_sess(handle_t sess) - bool wd_rsa_is_crt(handle_t sess) - { - if (!sess) { -- WD_ERR("rsa is crt judge, sess NULL, return false!\n"); -+ WD_ERR("invalid: rsa is crt judge, sess NULL, return false!\n"); - return false; - } - -@@ -879,7 +879,7 @@ bool wd_rsa_is_crt(handle_t sess) - __u32 wd_rsa_get_key_bits(handle_t sess) - { - if (!sess) { -- WD_ERR("get rsa key bits, sess NULL!\n"); -+ WD_ERR("invalid: get rsa key bits, sess NULL!\n"); - return 0; - } - -@@ -891,13 +891,13 @@ int wd_rsa_set_pubkey_params(handle_t sess, struct wd_dtb *e, struct wd_dtb *n) - struct wd_rsa_sess *c = (struct wd_rsa_sess *)sess; - - if (!c || !c->pubkey || !c->pubkey->key_size) { -- WD_ERR("sess NULL in set rsa public key!\n"); -+ WD_ERR("invalid: sess NULL in set rsa public key!\n"); - return -WD_EINVAL; - } - - if (e) { - if (!e->dsize || !e->data || e->dsize > c->pubkey->key_size) { -- WD_ERR("e err in set rsa public key!\n"); -+ WD_ERR("invalid: e err in set rsa public key!\n"); - return -WD_EINVAL; - } - -@@ -908,7 +908,7 @@ int wd_rsa_set_pubkey_params(handle_t sess, struct wd_dtb *e, struct wd_dtb *n) - - if (n) { - if (!n->dsize || !n->data || n->dsize > c->pubkey->key_size) { -- WD_ERR("n err in set rsa public key!\n"); -+ WD_ERR("invalid: n err in set rsa public key!\n"); - return -WD_EINVAL; - } - -@@ -924,7 +924,7 @@ void wd_rsa_get_pubkey_params(struct wd_rsa_pubkey *pbk, struct wd_dtb **e, - struct wd_dtb **n) - { - if (!pbk) { -- WD_ERR("input NULL in get rsa public key!\n"); -+ WD_ERR("invalid: input NULL in get rsa public key!\n"); - return; - } - if (e) -@@ -940,13 +940,13 @@ int wd_rsa_set_prikey_params(handle_t sess, struct wd_dtb *d, struct wd_dtb *n) - struct wd_rsa_sess *c = (struct wd_rsa_sess *)sess; - - if (!c || wd_rsa_is_crt(sess) || !c->prikey) { -- WD_ERR("sess err in set rsa private key1!\n"); -+ WD_ERR("invalid: sess err in set rsa private key1!\n"); - return -WD_EINVAL; - } - pkey1 = &c->prikey->pkey1; - if (d) { - if (!d->dsize || !d->data || d->dsize > pkey1->key_size) { -- WD_ERR("d err in set rsa private key1!\n"); -+ WD_ERR("invalid: d err in set rsa private key1!\n"); - return -WD_EINVAL; - } - -@@ -956,7 +956,7 @@ int wd_rsa_set_prikey_params(handle_t sess, struct wd_dtb *d, struct wd_dtb *n) - } - if (n) { - if (!n->dsize || !n->data || n->dsize > pkey1->key_size) { -- WD_ERR("en err in set rsa private key1!\n"); -+ WD_ERR("invalid: en err in set rsa private key1!\n"); - return -WD_EINVAL; - } - -@@ -974,7 +974,7 @@ void wd_rsa_get_prikey_params(struct wd_rsa_prikey *pvk, struct wd_dtb **d, - struct wd_rsa_prikey1 *pkey1; - - if (!pvk) { -- WD_ERR("pvk is NULL!\n"); -+ WD_ERR("invalid: pvk is NULL!\n"); - return; - } - -@@ -1041,43 +1041,43 @@ int wd_rsa_set_crt_prikey_params(handle_t sess, struct wd_dtb *dq, - int ret = -WD_EINVAL; - - if (!sess || !wd_rsa_is_crt(sess)) { -- WD_ERR("sess err in set rsa crt private key2!\n"); -+ WD_ERR("invalid: sess err in set rsa crt private key2!\n"); - return ret; - } - - if (!dq || !dp || !qinv || !q || !p) { -- WD_ERR("para err in set rsa crt private key2!\n"); -+ WD_ERR("invalid: para err in set rsa crt private key2!\n"); - return ret; - } - - pkey2 = &c->prikey->pkey2; - ret = rsa_prikey2_param_set(pkey2, dq, WD_CRT_PRIKEY_DQ); - if (ret) { -- WD_ERR("dq err in set rsa private key2!\n"); -+ WD_ERR("failed to set dq for rsa private key2!\n"); - return ret; - } - - ret = rsa_prikey2_param_set(pkey2, dp, WD_CRT_PRIKEY_DP); - if (ret) { -- WD_ERR("dp err in set rsa private key2!\n"); -+ WD_ERR("failed to set dp for rsa private key2!\n"); - return ret; - } - - ret = rsa_prikey2_param_set(pkey2, qinv, WD_CRT_PRIKEY_QINV); - if (ret) { -- WD_ERR("qinv err in set rsa private key2!\n"); -+ WD_ERR("failed to set qinv for rsa private key2!\n"); - return ret; - } - - ret = rsa_prikey2_param_set(pkey2, q, WD_CRT_PRIKEY_Q); - if (ret) { -- WD_ERR("q err in set rsa private key2!\n"); -+ WD_ERR("failed to set q for rsa private key2!\n"); - return ret; - } - - ret = rsa_prikey2_param_set(pkey2, p, WD_CRT_PRIKEY_P); - if (ret) { -- WD_ERR("p err in set rsa private key2!\n"); -+ WD_ERR("failed to set p for rsa private key2!\n"); - return ret; - } - -@@ -1092,7 +1092,7 @@ void wd_rsa_get_crt_prikey_params(struct wd_rsa_prikey *pvk, - struct wd_rsa_prikey2 *pkey2; - - if (!pvk) { -- WD_ERR("pvk is NULL!\n"); -+ WD_ERR("invalid: pvk is NULL!\n"); - return; - } - -@@ -1113,7 +1113,7 @@ void wd_rsa_get_crt_prikey_params(struct wd_rsa_prikey *pvk, - void wd_rsa_get_pubkey(handle_t sess, struct wd_rsa_pubkey **pubkey) - { - if (!sess || !pubkey) { -- WD_ERR("param is NULL!\n"); -+ WD_ERR("invalid: param is NULL!\n"); - return; - } - -@@ -1123,7 +1123,7 @@ void wd_rsa_get_pubkey(handle_t sess, struct wd_rsa_pubkey **pubkey) - void wd_rsa_get_prikey(handle_t sess, struct wd_rsa_prikey **prikey) - { - if (!sess || !prikey) { -- WD_ERR("param is NULL!\n"); -+ WD_ERR("invalid: param is NULL!\n"); - return; - } - --- -2.27.0 - diff --git a/0091-drv-hpre-free-memory-when-BD-sends-failed.patch b/0091-drv-hpre-free-memory-when-BD-sends-failed.patch deleted file mode 100644 index ccf7a31..0000000 --- a/0091-drv-hpre-free-memory-when-BD-sends-failed.patch +++ /dev/null @@ -1,66 +0,0 @@ -From e4ed630c442a7a5affb14dbcd70f20cbeaf6d969 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Thu, 10 Mar 2022 20:29:47 +0800 -Subject: [PATCH 099/109] drv/hpre: free memory when BD sends failed - -When BD fails to send to the hardware, the requested -memory needs to be freed. - -Signed-off-by: Weili Qian ---- - drv/hisi_hpre.c | 23 +++++++++++++++++++---- - 1 file changed, 19 insertions(+), 4 deletions(-) - -diff --git a/drv/hisi_hpre.c b/drv/hisi_hpre.c -index 11ef78b..e46efef 100644 ---- a/drv/hisi_hpre.c -+++ b/drv/hisi_hpre.c -@@ -1699,7 +1699,11 @@ static int sm2_enc_send(handle_t ctx, struct wd_ecc_msg *msg) - goto fail_fill_sqe; - } - -- return hisi_qm_send(h_qp, &hw_msg, SM2_SQE_NUM, &send_cnt); -+ ret = hisi_qm_send(h_qp, &hw_msg, SM2_SQE_NUM, &send_cnt); -+ if (unlikely(ret)) -+ goto fail_fill_sqe; -+ -+ return ret; - - fail_fill_sqe: - free_req(msg_dst[0]); -@@ -1713,6 +1717,7 @@ static int sm2_dec_send(handle_t ctx, struct wd_ecc_msg *msg) - struct wd_sm2_dec_in *din = (void *)msg->req.src; - struct wd_hash_mt *hash = &msg->hash; - struct wd_ecc_msg *dst; -+ int ret; - - /* c2 data lens <= 4096 bit */ - if (din->c2.dsize <= BITS_TO_BYTES(4096) && -@@ -1739,11 +1744,21 @@ static int sm2_dec_send(handle_t ctx, struct wd_ecc_msg *msg) - /* dst->req.dst last store point "struct wd_ecc_msg *" */ - dst->req.dst = create_ecdh_out(dst); - if (unlikely(!dst->req.dst)) { -- free(dst); -- return -WD_ENOMEM; -+ ret = -WD_ENOMEM; -+ goto free_dst; - } - -- return ecc_general_send(ctx, dst); -+ ret = ecc_general_send(ctx, dst); -+ if (unlikely(ret)) -+ goto free_req_dst; -+ -+ return ret; -+ -+free_req_dst: -+ free(dst->req.dst); -+free_dst: -+ free(dst); -+ return ret; - } - - static int ecc_send(handle_t ctx, struct wd_ecc_msg *msg) --- -2.27.0 - diff --git a/0092-v1-hpre-add-unlikely-for-branch-prefetch.patch b/0092-v1-hpre-add-unlikely-for-branch-prefetch.patch deleted file mode 100644 index e445dfa..0000000 --- a/0092-v1-hpre-add-unlikely-for-branch-prefetch.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 608b4ff6c4c5942d51086781956d36629465ca56 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Thu, 10 Mar 2022 20:29:48 +0800 -Subject: [PATCH 100/109] v1/hpre: add unlikely() for branch prefetch - -Add unlikely() on the route of doing request to improve -branch prefetch success rate. - -Signed-off-by: Weili Qian ---- - v1/drv/hisi_hpre_udrv.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/v1/drv/hisi_hpre_udrv.c b/v1/drv/hisi_hpre_udrv.c -index ba32114..bd87cbe 100644 ---- a/v1/drv/hisi_hpre_udrv.c -+++ b/v1/drv/hisi_hpre_udrv.c -@@ -1976,7 +1976,7 @@ static int fill_sm2_dec_sqe(void *message, struct qm_queue_info *info, __u16 i) - } - - ret = qm_fill_ecc_sqe_general(dst, info, i); -- if (ret) -+ if (unlikely(ret)) - goto free_out; - - return ret; --- -2.27.0 - diff --git a/0093-comp-unify-print-format.patch b/0093-comp-unify-print-format.patch deleted file mode 100644 index 854026a..0000000 --- a/0093-comp-unify-print-format.patch +++ /dev/null @@ -1,207 +0,0 @@ -From e308fbdd62bb7a59b1550ed748b85cc79cfc2019 Mon Sep 17 00:00:00 2001 -From: Yang Shen -Date: Thu, 10 Mar 2022 20:29:49 +0800 -Subject: [PATCH 101/109] comp: unify print format - -Unify print format with following rules: -1.failed to do sth. -2.add prefix "invalid: " for check parameters printf -3.add "!" at the end. - -Signed-off-by: Yang Shen ---- - wd_comp.c | 46 ++++++++++++++++++++++------------------------ - 1 file changed, 22 insertions(+), 24 deletions(-) - -diff --git a/wd_comp.c b/wd_comp.c -index 8d0c603..de71e9c 100644 ---- a/wd_comp.c -+++ b/wd_comp.c -@@ -60,14 +60,14 @@ static void wd_comp_set_static_drv(void) - { - wd_comp_setting.driver = wd_comp_get_driver(); - if (!wd_comp_setting.driver) -- WD_ERR("fail to get driver\n"); -+ WD_ERR("failed to get driver!\n"); - } - #else - static void __attribute__((constructor)) wd_comp_open_driver(void) - { - wd_comp_setting.dlhandle = dlopen("libhisi_zip.so", RTLD_NOW); - if (!wd_comp_setting.dlhandle) -- WD_ERR("Fail to open libhisi_zip.so\n"); -+ WD_ERR("failed to open libhisi_zip.so!\n"); - } - - static void __attribute__((destructor)) wd_comp_close_driver(void) -@@ -88,12 +88,12 @@ int wd_comp_init(struct wd_ctx_config *config, struct wd_sched *sched) - int ret; - - if (!config || !config->ctxs || !config->ctxs[0].ctx || !sched) { -- WD_ERR("invalid params, config or sched is NULL!\n"); -+ WD_ERR("invalid: config or sched is NULL!\n"); - return -WD_EINVAL; - } - - if (!wd_is_sva(config->ctxs[0].ctx)) { -- WD_ERR("err, non sva, please check system!\n"); -+ WD_ERR("failed to find sva device, please check system!\n"); - return -WD_EINVAL; - } - -@@ -191,7 +191,7 @@ int wd_comp_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - int ret; - - if (unlikely(!count)) { -- WD_ERR("comp poll input count is NULL\n"); -+ WD_ERR("invalid: comp poll count is 0!\n"); - return -WD_EINVAL; - } - -@@ -208,7 +208,7 @@ int wd_comp_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - priv); - if (ret < 0) { - if (ret == -WD_HW_EACCESS) -- WD_ERR("wd comp recv hw err!\n"); -+ WD_ERR("wd comp recv hw error!\n"); - return ret; - } - -@@ -217,7 +217,7 @@ int wd_comp_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - msg = wd_find_msg_in_pool(&wd_comp_setting.pool, idx, - resp_msg.tag); - if (!msg) { -- WD_ERR("get msg from pool is NULL!\n"); -+ WD_ERR("failed to get msg from pool!\n"); - return -WD_EINVAL; - } - -@@ -341,7 +341,7 @@ static int wd_comp_check_buffer(struct wd_comp_req *req) - } - } else if (req->data_fmt == WD_SGL_BUF) { - if (!req->list_src || !req->list_dst) { -- WD_ERR("invalid: src or dst is NULL!\n"); -+ WD_ERR("invalid: list_src or list_dst is NULL!\n"); - return -WD_EINVAL; - } - } -@@ -381,17 +381,17 @@ static int wd_comp_check_params(struct wd_comp_sess *sess, - } - - if (mode == CTX_MODE_ASYNC && !req->cb) { -- WD_ERR("async comp input cb is NULL!\n"); -+ WD_ERR("invalid: async comp cb is NULL!\n"); - return -WD_EINVAL; - } - - if (mode == CTX_MODE_ASYNC && !req->cb_param) { -- WD_ERR("async comp input cb param is NULL!\n"); -+ WD_ERR("invalid: async comp cb param is NULL!\n"); - return -WD_EINVAL; - } - - if (mode == CTX_MODE_SYNC && req->cb) { -- WD_ERR("sync comp input cb should be NULL!\n"); -+ WD_ERR("invalid: sync comp cb should be NULL!\n"); - return -WD_EINVAL; - } - -@@ -409,6 +409,7 @@ static int wd_comp_sync_job(struct wd_comp_sess *sess, - __u64 recv_count = 0; - __u32 idx; - int ret; -+ - idx = wd_comp_setting.sched.pick_next_ctx(h_sched_ctx, - sess->sched_key, - CTX_MODE_SYNC); -@@ -423,7 +424,7 @@ static int wd_comp_sync_job(struct wd_comp_sess *sess, - ret = wd_comp_setting.driver->comp_send(ctx->ctx, msg, priv); - if (ret < 0) { - pthread_spin_unlock(&ctx->lock); -- WD_ERR("wd comp send err(%d)!\n", ret); -+ WD_ERR("wd comp send error, ret = %d!\n", ret); - return ret; - } - -@@ -431,17 +432,17 @@ static int wd_comp_sync_job(struct wd_comp_sess *sess, - if (msg->is_polled) { - ret = wd_ctx_wait(ctx->ctx, POLL_TIME); - if (ret < 0) -- WD_ERR("wd ctx wait timeout(%d)!\n", ret); -+ WD_ERR("wd ctx wait timeout, ret = %d!\n", ret); - } - ret = wd_comp_setting.driver->comp_recv(ctx->ctx, msg, priv); - if (ret == -WD_HW_EACCESS) { - pthread_spin_unlock(&ctx->lock); -- WD_ERR("wd comp recv hw err!\n"); -+ WD_ERR("wd comp recv hw error!\n"); - return ret; - } else if (ret == -WD_EAGAIN) { - if (++recv_count > MAX_RETRY_COUNTS) { - pthread_spin_unlock(&ctx->lock); -- WD_ERR("wd comp recv timeout fail!\n"); -+ WD_ERR("wd comp recv timeout!\n"); - return -WD_ETIMEDOUT; - } - } -@@ -523,8 +524,7 @@ int wd_do_comp_sync2(handle_t h_sess, struct wd_comp_req *req) - - ret = wd_do_comp_strm(h_sess, &strm_req); - if (ret < 0 || strm_req.status == WD_IN_EPARA) { -- WD_ERR("wd comp, invalid or incomplete data! " -- "ret(%d), req.status(%u)\n", -+ WD_ERR("wd comp, invalid or incomplete data! ret = %d, status = %u!\n", - ret, strm_req.status); - return ret; - } -@@ -622,10 +622,8 @@ int wd_do_comp_strm(handle_t h_sess, struct wd_comp_req *req) - int ret; - - ret = wd_comp_check_params(sess, req, CTX_MODE_SYNC); -- if (ret) { -- WD_ERR("fail to check params!\n"); -+ if (ret) - return ret; -- } - - if (req->data_fmt > WD_FLAT_BUF) { - WD_ERR("invalid: data_fmt is %d!\n", req->data_fmt); -@@ -696,7 +694,7 @@ int wd_do_comp_async(handle_t h_sess, struct wd_comp_req *req) - - tag = wd_get_msg_from_pool(&wd_comp_setting.pool, idx, (void **)&msg); - if (tag < 0) { -- WD_ERR("busy, failed to get msg from pool!\n"); -+ WD_ERR("failed to get msg from pool!\n"); - return -WD_EBUSY; - } - fill_comp_msg(sess, msg, req); -@@ -709,7 +707,7 @@ int wd_do_comp_async(handle_t h_sess, struct wd_comp_req *req) - ret = wd_comp_setting.driver->comp_send(ctx->ctx, msg, priv); - if (ret < 0) { - pthread_spin_unlock(&ctx->lock); -- WD_ERR("wd comp send err(%d)!\n", ret); -+ WD_ERR("wd comp send error, ret = %d!\n", ret); - goto fail_with_msg; - } - -@@ -780,7 +778,7 @@ int wd_comp_ctx_num_init(__u32 node, __u32 type, __u32 num, __u8 mode) - int ret; - - if (type >= WD_DIR_MAX) { -- WD_ERR("wrong type(%u))!\n", type); -+ WD_ERR("invalid: op_type is %u!\n", type); - return -WD_EINVAL; - } - -@@ -804,7 +802,7 @@ int wd_comp_get_env_param(__u32 node, __u32 type, __u32 mode, - int ret; - - if (type >= WD_DIR_MAX) { -- WD_ERR("wrong type(%u))!\n", type); -+ WD_ERR("invalid: op_type is %u!\n", type); - return -WD_EINVAL; - } - --- -2.27.0 - diff --git a/0094-drv-comp-unify-print-format.patch b/0094-drv-comp-unify-print-format.patch deleted file mode 100644 index 3c22ae0..0000000 --- a/0094-drv-comp-unify-print-format.patch +++ /dev/null @@ -1,217 +0,0 @@ -From be7121984d223d146348ede53626b0afb1026256 Mon Sep 17 00:00:00 2001 -From: Yang Shen -Date: Thu, 10 Mar 2022 20:29:50 +0800 -Subject: [PATCH 102/109] drv/comp: unify print format - -Unify print format with following rules: -1.failed to do sth. -2.add prefix "invalid: " for check parameters printf -3.add "!" at the end. - -Signed-off-by: Yang Shen ---- - drv/hisi_comp.c | 50 +++++++++++++++++++++++++------------------------ - 1 file changed, 26 insertions(+), 24 deletions(-) - -diff --git a/drv/hisi_comp.c b/drv/hisi_comp.c -index 0760908..5883bb4 100644 ---- a/drv/hisi_comp.c -+++ b/drv/hisi_comp.c -@@ -192,12 +192,12 @@ struct hisi_zip_ctx { - static int buf_size_check_deflate(__u32 *in_size, __u32 *out_size) - { - if (unlikely(*in_size > HZ_MAX_SIZE)) { -- WD_ERR("invalid: out of range in_len(%u)!\n", *in_size); -+ WD_ERR("invalid: in_len(%u) is out of range!\n", *in_size); - return -WD_EINVAL; - } - - if (unlikely(*out_size > HZ_MAX_SIZE)) { -- WD_ERR("warning: out of range avail_out(%u), will set 8MB size max!\n", -+ WD_ERR("warning: avail_out(%u) is out of range, will set 8MB size max!\n", - *out_size); - *out_size = HZ_MAX_SIZE; - } -@@ -295,19 +295,19 @@ static int fill_buf_addr_deflate_sgl(handle_t h_qp, struct hisi_zip_sqe *sqe, - - h_sgl_pool = hisi_qm_get_sglpool(h_qp); - if (!h_sgl_pool) { -- WD_ERR("failed to get sglpool\n"); -+ WD_ERR("failed to get sglpool!\n"); - return -WD_EINVAL; - } - - hw_sgl_in = hisi_qm_get_hw_sgl(h_sgl_pool, req->list_src); - if (!hw_sgl_in) { -- WD_ERR("failed to get hw sgl in\n"); -+ WD_ERR("failed to get hw sgl in!\n"); - return -WD_ENOMEM; - } - - hw_sgl_out = hisi_qm_get_hw_sgl(h_sgl_pool, req->list_dst); - if (!hw_sgl_out) { -- WD_ERR("failed to get hw sgl out\n"); -+ WD_ERR("failed to get hw sgl out!\n"); - hisi_qm_put_hw_sgl(h_sgl_pool, hw_sgl_in); - return -WD_ENOMEM; - } -@@ -419,17 +419,18 @@ static int fill_buf_lz77_zstd(handle_t h_qp, struct hisi_zip_sqe *sqe, - void *ctx_buf = NULL; - - if (unlikely(!data)) { -- WD_ERR("wd_lz77_zstd_data address is NULL\n"); -+ WD_ERR("invalid: wd_lz77_zstd_data address is NULL!\n"); - return -WD_EINVAL; - } - - if (unlikely(in_size > ZSTD_MAX_SIZE)) { -- WD_ERR("invalid input data size of lz77_zstd(%u)\n", in_size); -+ WD_ERR("invalid: in_len(%u) of lz77_zstd is out of range!\n", -+ in_size); - return -WD_EINVAL; - } - - if (unlikely(out_size > HZ_MAX_SIZE)) { -- WD_ERR("warning: out of range avail_out(%u), will set 8MB size max!\n", -+ WD_ERR("warning: avail_out(%u) is out of range , will set 8MB size max!\n", - out_size); - out_size = HZ_MAX_SIZE; - } -@@ -439,7 +440,7 @@ static int fill_buf_lz77_zstd(handle_t h_qp, struct hisi_zip_sqe *sqe, - * the frequency information about input data. - */ - if (unlikely(out_size < ZSTD_FREQ_DATA_SIZE + lit_size)) { -- WD_ERR("output buffer size of lz77_zstd is not enough(%u)\n", -+ WD_ERR("invalid: sequences output size(%u) is not enough!\n", - ZSTD_FREQ_DATA_SIZE + in_size); - return -WD_EINVAL; - } -@@ -491,12 +492,13 @@ static int fill_buf_lz77_zstd_sgl(handle_t h_qp, struct hisi_zip_sqe *sqe, - int ret; - - if (unlikely(in_size > ZSTD_MAX_SIZE)) { -- WD_ERR("invalid input data size of lz77_zstd(%u)\n", in_size); -+ WD_ERR("invalid: in_len(%u) of lz77_zstd is out of range!\n", -+ in_size); - return -WD_EINVAL; - } - - if (unlikely(!data)) { -- WD_ERR("wd_lz77_zstd_data address is NULL\n"); -+ WD_ERR("invalid: wd_lz77_zstd_data address is NULL!\n"); - return -WD_EINVAL; - } - -@@ -513,26 +515,26 @@ static int fill_buf_lz77_zstd_sgl(handle_t h_qp, struct hisi_zip_sqe *sqe, - - h_sgl_pool = hisi_qm_get_sglpool(h_qp); - if (!h_sgl_pool) { -- WD_ERR("failed to get sglpool\n"); -+ WD_ERR("failed to get sglpool!\n"); - return -WD_EINVAL; - } - - hw_sgl_in = hisi_qm_get_hw_sgl(h_sgl_pool, req->list_src); - if (!hw_sgl_in) { -- WD_ERR("failed to get hw sgl in\n"); -+ WD_ERR("failed to get hw sgl in!\n"); - return -WD_ENOMEM; - } - - hw_sgl_out_lit = hisi_qm_get_hw_sgl(h_sgl_pool, req->list_dst); - if (!hw_sgl_out_lit) { -- WD_ERR("failed to get hw sgl out for literals\n"); -+ WD_ERR("failed to get hw sgl out for literals!\n"); - ret = -WD_ENOMEM; - goto err_free_sgl_in; - } - - hw_sgl_out_seq = hisi_qm_get_hw_sgl(h_sgl_pool, seq_start); - if (!hw_sgl_out_seq) { -- WD_ERR("failed to get hw sgl out for sequences\n"); -+ WD_ERR("failed to get hw sgl out for sequences!\n"); - ret = -WD_ENOMEM; - goto err_free_sgl_out_lit; - } -@@ -626,7 +628,7 @@ static int fill_comp_level_lz77_zstd(struct hisi_zip_sqe *sqe, enum wd_comp_leve - sqe->dw9 = val; - break; - default: -- WD_ERR("invalid: comp_lv in unsupported (%d)\n", comp_lv); -+ WD_ERR("invalid: comp_lv(%d) is unsupport!\n", comp_lv); - return -WD_EINVAL; - } - -@@ -821,7 +823,7 @@ static int fill_zip_comp_sqe(struct hisi_qp *qp, struct wd_comp_msg *msg, - - if ((hw_type <= HISI_QM_API_VER2_BASE && alg_type > WD_GZIP) || - (hw_type >= HISI_QM_API_VER3_BASE && alg_type >= WD_COMP_ALG_MAX)) { -- WD_ERR("invalid algorithm type(%d)\n", alg_type); -+ WD_ERR("invalid: algorithm type is %d!\n", alg_type); - return -WD_EINVAL; - } - -@@ -870,13 +872,13 @@ static int hisi_zip_comp_send(handle_t ctx, struct wd_comp_msg *msg, void *priv) - - ret = fill_zip_comp_sqe(qp, msg, &sqe); - if (ret < 0) { -- WD_ERR("failed to fill zip sqe(%d)!\n", ret); -+ WD_ERR("failed to fill zip sqe, ret = %d!\n", ret); - return ret; - } - ret = hisi_qm_send(h_qp, &sqe, 1, &count); - if (ret < 0) { - if (ret != -WD_EBUSY) -- WD_ERR("qm send is err(%d)!\n", ret); -+ WD_ERR("failed to send to hardware, ret = %d!\n", ret); - - return ret; - } -@@ -919,7 +921,7 @@ static void free_hw_sgl(handle_t h_qp, struct hisi_zip_sqe *sqe, - - h_sgl_pool = hisi_qm_get_sglpool(h_qp); - if (!h_sgl_pool) { -- WD_ERR("failed to get sglpool to free hw sgl\n"); -+ WD_ERR("failed to get sglpool to free hw sgl!\n"); - return; - } - -@@ -949,7 +951,7 @@ static int parse_zip_sqe(struct hisi_qp *qp, struct hisi_zip_sqe *sqe, - - alg_type = get_alg_type(type); - if (alg_type < 0) { -- WD_ERR("failed to get request algorithm type(%u)\n", type); -+ WD_ERR("invalid: hardware type is %u!\n", type); - return -WD_EINVAL; - } - -@@ -960,7 +962,7 @@ static int parse_zip_sqe(struct hisi_qp *qp, struct hisi_zip_sqe *sqe, - if (qp->q_info.qp_mode == CTX_MODE_ASYNC) { - recv_msg = wd_comp_get_msg(qp->q_info.idx, tag); - if (!recv_msg) { -- WD_ERR("failed to get send msg! idx = %u, tag = %u.\n", -+ WD_ERR("failed to get send msg! idx = %u, tag = %u!\n", - qp->q_info.idx, tag); - return -WD_EINVAL; - } -@@ -970,7 +972,7 @@ static int parse_zip_sqe(struct hisi_qp *qp, struct hisi_zip_sqe *sqe, - - if (status != 0 && status != HZ_NEGACOMPRESS && - status != HZ_CRC_ERR && status != HZ_DECOMP_END) { -- WD_ERR("bad status(ctx_st=0x%x, s=0x%x, t=%u)\n", -+ WD_ERR("bad request(ctx_st = 0x%x, status = 0x%x, algorithm type = %u)!\n", - ctx_st, status, type); - recv_msg->req.status = WD_IN_EPARA; - } -@@ -993,7 +995,7 @@ static int parse_zip_sqe(struct hisi_qp *qp, struct hisi_zip_sqe *sqe, - if (ctx_st == HZ_DECOMP_NO_SPACE) - recv_msg->req.status = WD_EAGAIN; - -- dbg("zip recv lst =%hu, ctx_st=0x%x, status=0x%x, alg=%u\n", lstblk, ctx_st, status, type); -+ dbg("zip recv lst =%hu, ctx_st=0x%x, status=0x%x, alg=%u!\n", lstblk, ctx_st, status, type); - if (lstblk && (status == HZ_DECOMP_END)) - recv_msg->req.status = WD_STREAM_END; - --- -2.27.0 - diff --git a/0095-comp-add-unlikely-for-branch-prefetch.patch b/0095-comp-add-unlikely-for-branch-prefetch.patch deleted file mode 100644 index ab8a7c3..0000000 --- a/0095-comp-add-unlikely-for-branch-prefetch.patch +++ /dev/null @@ -1,272 +0,0 @@ -From bbbaf91e0819a3ef6953a434b229a105a1008892 Mon Sep 17 00:00:00 2001 -From: Yang Shen -Date: Thu, 10 Mar 2022 20:29:51 +0800 -Subject: [PATCH 103/109] comp: add unlikely() for branch prefetch - -Add unlikely() on the route of doing request to improve -branch prefetch success rate. - -Signed-off-by: Yang Shen ---- - wd_comp.c | 69 ++++++++++++++++++++++++++++--------------------------- - 1 file changed, 35 insertions(+), 34 deletions(-) - -diff --git a/wd_comp.c b/wd_comp.c -index de71e9c..9a71dfc 100644 ---- a/wd_comp.c -+++ b/wd_comp.c -@@ -198,7 +198,7 @@ int wd_comp_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - *count = 0; - - ret = wd_check_ctx(config, CTX_MODE_ASYNC, idx); -- if (ret) -+ if (unlikely(ret)) - return ret; - - ctx = config->ctxs + idx; -@@ -206,7 +206,7 @@ int wd_comp_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - do { - ret = wd_comp_setting.driver->comp_recv(ctx->ctx, &resp_msg, - priv); -- if (ret < 0) { -+ if (unlikely(ret < 0)) { - if (ret == -WD_HW_EACCESS) - WD_ERR("wd comp recv hw error!\n"); - return ret; -@@ -216,7 +216,7 @@ int wd_comp_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - - msg = wd_find_msg_in_pool(&wd_comp_setting.pool, idx, - resp_msg.tag); -- if (!msg) { -+ if (unlikely(!msg)) { - WD_ERR("failed to get msg from pool!\n"); - return -WD_EINVAL; - } -@@ -335,12 +335,12 @@ static void fill_comp_msg(struct wd_comp_sess *sess, struct wd_comp_msg *msg, - static int wd_comp_check_buffer(struct wd_comp_req *req) - { - if (req->data_fmt == WD_FLAT_BUF) { -- if (!req->src || !req->dst) { -+ if (unlikely(!req->src || !req->dst)) { - WD_ERR("invalid: src or dst is NULL!\n"); - return -WD_EINVAL; - } - } else if (req->data_fmt == WD_SGL_BUF) { -- if (!req->list_src || !req->list_dst) { -+ if (unlikely(!req->list_src || !req->list_dst)) { - WD_ERR("invalid: list_src or list_dst is NULL!\n"); - return -WD_EINVAL; - } -@@ -360,37 +360,37 @@ static int wd_comp_check_params(struct wd_comp_sess *sess, - { - int ret; - -- if (!sess || !req) { -+ if (unlikely(!sess || !req)) { - WD_ERR("invalid: sess or req is NULL!\n"); - return -WD_EINVAL; - } - -- if (req->data_fmt > WD_SGL_BUF) { -+ if (unlikely(req->data_fmt > WD_SGL_BUF)) { - WD_ERR("invalid: data_fmt is %d!\n", req->data_fmt); - return -WD_EINVAL; - } - - ret = wd_comp_check_buffer(req); -- if (ret) -+ if (unlikely(ret)) - return ret; - -- if (req->op_type != WD_DIR_COMPRESS && -- req->op_type != WD_DIR_DECOMPRESS) { -+ if (unlikely(req->op_type != WD_DIR_COMPRESS && -+ req->op_type != WD_DIR_DECOMPRESS)) { - WD_ERR("invalid: op_type is %d!\n", req->op_type); - return -WD_EINVAL; - } - -- if (mode == CTX_MODE_ASYNC && !req->cb) { -+ if (unlikely(mode == CTX_MODE_ASYNC && !req->cb)) { - WD_ERR("invalid: async comp cb is NULL!\n"); - return -WD_EINVAL; - } - -- if (mode == CTX_MODE_ASYNC && !req->cb_param) { -+ if (unlikely(mode == CTX_MODE_ASYNC && !req->cb_param)) { - WD_ERR("invalid: async comp cb param is NULL!\n"); - return -WD_EINVAL; - } - -- if (mode == CTX_MODE_SYNC && req->cb) { -+ if (unlikely(mode == CTX_MODE_SYNC && req->cb)) { - WD_ERR("invalid: sync comp cb should be NULL!\n"); - return -WD_EINVAL; - } -@@ -414,7 +414,7 @@ static int wd_comp_sync_job(struct wd_comp_sess *sess, - sess->sched_key, - CTX_MODE_SYNC); - ret = wd_check_ctx(config, CTX_MODE_SYNC, idx); -- if (ret) -+ if (unlikely(ret)) - return ret; - - ctx = config->ctxs + idx; -@@ -422,7 +422,7 @@ static int wd_comp_sync_job(struct wd_comp_sess *sess, - pthread_spin_lock(&ctx->lock); - - ret = wd_comp_setting.driver->comp_send(ctx->ctx, msg, priv); -- if (ret < 0) { -+ if (unlikely(ret < 0)) { - pthread_spin_unlock(&ctx->lock); - WD_ERR("wd comp send error, ret = %d!\n", ret); - return ret; -@@ -431,11 +431,11 @@ static int wd_comp_sync_job(struct wd_comp_sess *sess, - do { - if (msg->is_polled) { - ret = wd_ctx_wait(ctx->ctx, POLL_TIME); -- if (ret < 0) -+ if (unlikely(ret < 0)) - WD_ERR("wd ctx wait timeout, ret = %d!\n", ret); - } - ret = wd_comp_setting.driver->comp_recv(ctx->ctx, msg, priv); -- if (ret == -WD_HW_EACCESS) { -+ if (unlikely(ret == -WD_HW_EACCESS)) { - pthread_spin_unlock(&ctx->lock); - WD_ERR("wd comp recv hw error!\n"); - return ret; -@@ -460,10 +460,10 @@ int wd_do_comp_sync(handle_t h_sess, struct wd_comp_req *req) - int ret; - - ret = wd_comp_check_params(sess, req, CTX_MODE_SYNC); -- if (ret) -+ if (unlikely(ret)) - return ret; - -- if (!req->src_len) { -+ if (unlikely(!req->src_len)) { - WD_ERR("invalid: req src_len is 0!\n"); - return -WD_EINVAL; - } -@@ -476,7 +476,7 @@ int wd_do_comp_sync(handle_t h_sess, struct wd_comp_req *req) - msg.stream_mode = WD_COMP_STATELESS; - - ret = wd_comp_sync_job(sess, req, &msg); -- if (ret) -+ if (unlikely(ret)) - return ret; - - req->src_len = msg.in_cons; -@@ -496,10 +496,10 @@ int wd_do_comp_sync2(handle_t h_sess, struct wd_comp_req *req) - int ret; - - ret = wd_comp_check_params(sess, req, CTX_MODE_SYNC); -- if (ret) -+ if (unlikely(ret)) - return ret; - -- if (!req->src_len) { -+ if (unlikely(!req->src_len)) { - WD_ERR("invalid: req src_len is 0!\n"); - return -WD_EINVAL; - } -@@ -523,7 +523,7 @@ int wd_do_comp_sync2(handle_t h_sess, struct wd_comp_req *req) - } - - ret = wd_do_comp_strm(h_sess, &strm_req); -- if (ret < 0 || strm_req.status == WD_IN_EPARA) { -+ if (unlikely(ret < 0 || strm_req.status == WD_IN_EPARA)) { - WD_ERR("wd comp, invalid or incomplete data! ret = %d, status = %u!\n", - ret, strm_req.status); - return ret; -@@ -573,7 +573,7 @@ static int append_store_block(struct wd_comp_sess *sess, - __u32 isize = sess->isize; - - if (sess->alg_type == WD_ZLIB) { -- if (req->dst_len < blocksize + sizeof(checksum)) -+ if (unlikely(req->dst_len < blocksize + sizeof(checksum))) - return -WD_EINVAL; - memcpy(req->dst, store_block, blocksize); - req->dst_len = blocksize; -@@ -582,7 +582,8 @@ static int append_store_block(struct wd_comp_sess *sess, - memcpy(req->dst + blocksize, &checksum, sizeof(checksum)); - req->dst_len += sizeof(checksum); - } else if (sess->alg_type == WD_GZIP) { -- if (req->dst_len < blocksize + sizeof(checksum) + sizeof(isize)) -+ if (unlikely(req->dst_len < blocksize + -+ sizeof(checksum) + sizeof(isize))) - return -WD_EINVAL; - memcpy(req->dst, store_block, blocksize); - req->dst_len = blocksize; -@@ -622,10 +623,10 @@ int wd_do_comp_strm(handle_t h_sess, struct wd_comp_req *req) - int ret; - - ret = wd_comp_check_params(sess, req, CTX_MODE_SYNC); -- if (ret) -+ if (unlikely(ret)) - return ret; - -- if (req->data_fmt > WD_FLAT_BUF) { -+ if (unlikely(req->data_fmt > WD_FLAT_BUF)) { - WD_ERR("invalid: data_fmt is %d!\n", req->data_fmt); - return -WD_EINVAL; - } -@@ -647,7 +648,7 @@ int wd_do_comp_strm(handle_t h_sess, struct wd_comp_req *req) - src_len = req->src_len; - - ret = wd_comp_sync_job(sess, req, &msg); -- if (ret) -+ if (unlikely(ret)) - return ret; - - req->src_len = msg.in_cons; -@@ -675,10 +676,10 @@ int wd_do_comp_async(handle_t h_sess, struct wd_comp_req *req) - __u32 idx; - - ret = wd_comp_check_params(sess, req, CTX_MODE_ASYNC); -- if (ret) -+ if (unlikely(ret)) - return ret; - -- if (!req->src_len) { -+ if (unlikely(!req->src_len)) { - WD_ERR("invalid: req src_len is 0!\n"); - return -WD_EINVAL; - } -@@ -687,13 +688,13 @@ int wd_do_comp_async(handle_t h_sess, struct wd_comp_req *req) - sess->sched_key, - CTX_MODE_ASYNC); - ret = wd_check_ctx(config, CTX_MODE_ASYNC, idx); -- if (ret) -+ if (unlikely(ret)) - return ret; - - ctx = config->ctxs + idx; - - tag = wd_get_msg_from_pool(&wd_comp_setting.pool, idx, (void **)&msg); -- if (tag < 0) { -+ if (unlikely(tag < 0)) { - WD_ERR("failed to get msg from pool!\n"); - return -WD_EBUSY; - } -@@ -705,7 +706,7 @@ int wd_do_comp_async(handle_t h_sess, struct wd_comp_req *req) - pthread_spin_lock(&ctx->lock); - - ret = wd_comp_setting.driver->comp_send(ctx->ctx, msg, priv); -- if (ret < 0) { -+ if (unlikely(ret < 0)) { - pthread_spin_unlock(&ctx->lock); - WD_ERR("wd comp send error, ret = %d!\n", ret); - goto fail_with_msg; -@@ -714,7 +715,7 @@ int wd_do_comp_async(handle_t h_sess, struct wd_comp_req *req) - pthread_spin_unlock(&ctx->lock); - - ret = wd_add_task_to_async_queue(&wd_comp_env_config, idx); -- if (ret) -+ if (unlikely(ret)) - goto fail_with_msg; - - return 0; --- -2.27.0 - diff --git a/0096-drv-comp-add-unlikely-for-branch-prefetch.patch b/0096-drv-comp-add-unlikely-for-branch-prefetch.patch deleted file mode 100644 index d79dfd5..0000000 --- a/0096-drv-comp-add-unlikely-for-branch-prefetch.patch +++ /dev/null @@ -1,199 +0,0 @@ -From 4077df41a1ba2ccd155195e16026d0329d062f85 Mon Sep 17 00:00:00 2001 -From: Yang Shen -Date: Thu, 10 Mar 2022 20:29:52 +0800 -Subject: [PATCH 104/109] drv/comp: add unlikely() for branch prefetch - -Add unlikely() on the route of doing request to improve -branch prefetch success rate. - -Signed-off-by: Yang Shen ---- - drv/hisi_comp.c | 46 +++++++++++++++++++++++----------------------- - 1 file changed, 23 insertions(+), 23 deletions(-) - -diff --git a/drv/hisi_comp.c b/drv/hisi_comp.c -index 5883bb4..860da43 100644 ---- a/drv/hisi_comp.c -+++ b/drv/hisi_comp.c -@@ -246,7 +246,7 @@ static int fill_buf_deflate_generic(struct hisi_zip_sqe *sqe, - } - - ret = buf_size_check_deflate(&in_size, &out_size); -- if (ret) -+ if (unlikely(ret)) - return ret; - - fill_buf_size_deflate(sqe, in_size, out_size); -@@ -294,19 +294,19 @@ static int fill_buf_addr_deflate_sgl(handle_t h_qp, struct hisi_zip_sqe *sqe, - handle_t h_sgl_pool; - - h_sgl_pool = hisi_qm_get_sglpool(h_qp); -- if (!h_sgl_pool) { -+ if (unlikely(!h_sgl_pool)) { - WD_ERR("failed to get sglpool!\n"); - return -WD_EINVAL; - } - - hw_sgl_in = hisi_qm_get_hw_sgl(h_sgl_pool, req->list_src); -- if (!hw_sgl_in) { -+ if (unlikely(!hw_sgl_in)) { - WD_ERR("failed to get hw sgl in!\n"); - return -WD_ENOMEM; - } - - hw_sgl_out = hisi_qm_get_hw_sgl(h_sgl_pool, req->list_dst); -- if (!hw_sgl_out) { -+ if (unlikely(!hw_sgl_out)) { - WD_ERR("failed to get hw sgl out!\n"); - hisi_qm_put_hw_sgl(h_sgl_pool, hw_sgl_in); - return -WD_ENOMEM; -@@ -345,7 +345,7 @@ static int fill_buf_deflate_slg_generic(handle_t h_qp, struct hisi_zip_sqe *sqe, - fill_buf_type_sgl(sqe); - - ret = fill_buf_addr_deflate_sgl(h_qp, sqe, msg); -- if (ret) -+ if (unlikely(ret)) - return ret; - - if (head != NULL && msg->req.op_type == WD_DIR_COMPRESS) { -@@ -514,26 +514,26 @@ static int fill_buf_lz77_zstd_sgl(handle_t h_qp, struct hisi_zip_sqe *sqe, - fill_buf_size_lz77_zstd(sqe, in_size, lits_size, out_size - lits_size); - - h_sgl_pool = hisi_qm_get_sglpool(h_qp); -- if (!h_sgl_pool) { -+ if (unlikely(!h_sgl_pool)) { - WD_ERR("failed to get sglpool!\n"); - return -WD_EINVAL; - } - - hw_sgl_in = hisi_qm_get_hw_sgl(h_sgl_pool, req->list_src); -- if (!hw_sgl_in) { -+ if (unlikely(!hw_sgl_in)) { - WD_ERR("failed to get hw sgl in!\n"); - return -WD_ENOMEM; - } - - hw_sgl_out_lit = hisi_qm_get_hw_sgl(h_sgl_pool, req->list_dst); -- if (!hw_sgl_out_lit) { -+ if (unlikely(!hw_sgl_out_lit)) { - WD_ERR("failed to get hw sgl out for literals!\n"); - ret = -WD_ENOMEM; - goto err_free_sgl_in; - } - - hw_sgl_out_seq = hisi_qm_get_hw_sgl(h_sgl_pool, seq_start); -- if (!hw_sgl_out_seq) { -+ if (unlikely(!hw_sgl_out_seq)) { - WD_ERR("failed to get hw sgl out for sequences!\n"); - ret = -WD_ENOMEM; - goto err_free_sgl_out_lit; -@@ -680,7 +680,7 @@ static void get_data_size_lz77_zstd(struct hisi_zip_sqe *sqe, enum wd_comp_op_ty - struct wd_lz77_zstd_data *data = recv_msg->req.priv; - void *ctx_buf = recv_msg->ctx_buf; - -- if (!data) -+ if (unlikely(!data)) - return; - - data->lit_num = sqe->comp_data_length; -@@ -782,7 +782,7 @@ static int hisi_zip_init(struct wd_ctx_config_internal *config, void *priv) - qm_priv.qp_mode = config->ctxs[i].ctx_mode; - qm_priv.idx = i; - h_qp = hisi_qm_alloc_qp(&qm_priv, h_ctx); -- if (!h_qp) -+ if (unlikely(!h_qp)) - goto out; - } - -@@ -821,14 +821,14 @@ static int fill_zip_comp_sqe(struct hisi_qp *qp, struct wd_comp_msg *msg, - __u8 state; - int ret; - -- if ((hw_type <= HISI_QM_API_VER2_BASE && alg_type > WD_GZIP) || -- (hw_type >= HISI_QM_API_VER3_BASE && alg_type >= WD_COMP_ALG_MAX)) { -+ if (unlikely((hw_type <= HISI_QM_API_VER2_BASE && alg_type > WD_GZIP) || -+ (hw_type >= HISI_QM_API_VER3_BASE && alg_type >= WD_COMP_ALG_MAX))) { - WD_ERR("invalid: algorithm type is %d!\n", alg_type); - return -WD_EINVAL; - } - - ret = ops[alg_type].fill_buf[msg->req.data_fmt]((handle_t)qp, sqe, msg); -- if (ret) -+ if (unlikely(ret)) - return ret; - - ops[alg_type].fill_sqe_type(sqe); -@@ -838,7 +838,7 @@ static int fill_zip_comp_sqe(struct hisi_qp *qp, struct wd_comp_msg *msg, - ops[alg_type].fill_tag(sqe, msg->tag); - - ret = ops[alg_type].fill_comp_level(sqe, msg->comp_lv); -- if (ret) -+ if (unlikely(ret)) - return ret; - - state = (msg->stream_mode == WD_COMP_STATEFUL) ? HZ_STATEFUL : -@@ -871,12 +871,12 @@ static int hisi_zip_comp_send(handle_t ctx, struct wd_comp_msg *msg, void *priv) - int ret; - - ret = fill_zip_comp_sqe(qp, msg, &sqe); -- if (ret < 0) { -+ if (unlikely(ret < 0)) { - WD_ERR("failed to fill zip sqe, ret = %d!\n", ret); - return ret; - } - ret = hisi_qm_send(h_qp, &sqe, 1, &count); -- if (ret < 0) { -+ if (unlikely(ret < 0)) { - if (ret != -WD_EBUSY) - WD_ERR("failed to send to hardware, ret = %d!\n", ret); - -@@ -920,7 +920,7 @@ static void free_hw_sgl(handle_t h_qp, struct hisi_zip_sqe *sqe, - handle_t h_sgl_pool; - - h_sgl_pool = hisi_qm_get_sglpool(h_qp); -- if (!h_sgl_pool) { -+ if (unlikely(!h_sgl_pool)) { - WD_ERR("failed to get sglpool to free hw sgl!\n"); - return; - } -@@ -950,7 +950,7 @@ static int parse_zip_sqe(struct hisi_qp *qp, struct hisi_zip_sqe *sqe, - __u32 tag; - - alg_type = get_alg_type(type); -- if (alg_type < 0) { -+ if (unlikely(alg_type < 0)) { - WD_ERR("invalid: hardware type is %u!\n", type); - return -WD_EINVAL; - } -@@ -961,7 +961,7 @@ static int parse_zip_sqe(struct hisi_qp *qp, struct hisi_zip_sqe *sqe, - - if (qp->q_info.qp_mode == CTX_MODE_ASYNC) { - recv_msg = wd_comp_get_msg(qp->q_info.idx, tag); -- if (!recv_msg) { -+ if (unlikely(!recv_msg)) { - WD_ERR("failed to get send msg! idx = %u, tag = %u!\n", - qp->q_info.idx, tag); - return -WD_EINVAL; -@@ -970,8 +970,8 @@ static int parse_zip_sqe(struct hisi_qp *qp, struct hisi_zip_sqe *sqe, - - recv_msg->req.status = 0; - -- if (status != 0 && status != HZ_NEGACOMPRESS && -- status != HZ_CRC_ERR && status != HZ_DECOMP_END) { -+ if (unlikely(status != 0 && status != HZ_NEGACOMPRESS && -+ status != HZ_CRC_ERR && status != HZ_DECOMP_END)) { - WD_ERR("bad request(ctx_st = 0x%x, status = 0x%x, algorithm type = %u)!\n", - ctx_st, status, type); - recv_msg->req.status = WD_IN_EPARA; -@@ -1019,7 +1019,7 @@ static int hisi_zip_comp_recv(handle_t ctx, struct wd_comp_msg *recv_msg, - int ret; - - ret = hisi_qm_recv(h_qp, &sqe, 1, &count); -- if (ret < 0) -+ if (unlikely(ret < 0)) - return ret; - - return parse_zip_sqe(qp, &sqe, recv_msg); --- -2.27.0 - diff --git a/0097-hisi_hpre-modify-the-return-value-of-function.patch b/0097-hisi_hpre-modify-the-return-value-of-function.patch deleted file mode 100644 index b2f5dca..0000000 --- a/0097-hisi_hpre-modify-the-return-value-of-function.patch +++ /dev/null @@ -1,73 +0,0 @@ -From 8ebb63a449ec1514f7758aa866d29a6b94845e13 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Mon, 14 Mar 2022 18:47:57 +0800 -Subject: [PATCH 106/109] hisi_hpre: modify the return value of function - -When these functions are executed successfully, -the caller of these functions will not care about -the value of the data size, so there is no need -to return the data size, just returning a "WD_SUCCESS" -will be fine. - -Signed-off-by: Weili Qian ---- - drv/hisi_hpre.c | 14 +++++++------- - 1 file changed, 7 insertions(+), 7 deletions(-) - -diff --git a/drv/hisi_hpre.c b/drv/hisi_hpre.c -index e46efef..d9546a6 100644 ---- a/drv/hisi_hpre.c -+++ b/drv/hisi_hpre.c -@@ -221,8 +221,7 @@ static int fill_rsa_crt_prikey2(struct wd_rsa_prikey *prikey, - - *data = wd_dq->data; - -- return (int)(wd_dq->bsize + wd_qinv->bsize + wd_p->bsize + -- wd_q->bsize + wd_dp->bsize); -+ return WD_SUCCESS; - } - - static int fill_rsa_prikey1(struct wd_rsa_prikey *prikey, void **data) -@@ -243,7 +242,7 @@ static int fill_rsa_prikey1(struct wd_rsa_prikey *prikey, void **data) - - *data = wd_d->data; - -- return (int)(wd_n->bsize + wd_d->bsize); -+ return WD_SUCCESS; - } - - static int fill_rsa_pubkey(struct wd_rsa_pubkey *pubkey, void **data) -@@ -263,7 +262,8 @@ static int fill_rsa_pubkey(struct wd_rsa_pubkey *pubkey, void **data) - return ret; - - *data = wd_e->data; -- return (int)(wd_n->bsize + wd_e->bsize); -+ -+ return WD_SUCCESS; - } - - static int fill_rsa_genkey_in(struct wd_rsa_kg_in *genkey) -@@ -382,17 +382,17 @@ static int rsa_prepare_key(struct wd_rsa_msg *msg, - if (req->op_type == WD_RSA_SIGN) { - if (hw_msg->alg == HPRE_ALG_NC_CRT) { - ret = fill_rsa_crt_prikey2((void *)msg->key, &data); -- if (ret <= 0) -+ if (ret) - return ret; - } else { - ret = fill_rsa_prikey1((void *)msg->key, &data); -- if (ret < 0) -+ if (ret) - return ret; - hw_msg->alg = HPRE_ALG_NC_NCRT; - } - } else if (req->op_type == WD_RSA_VERIFY) { - ret = fill_rsa_pubkey((void *)msg->key, &data); -- if (ret < 0) -+ if (ret) - return ret; - hw_msg->alg = HPRE_ALG_NC_NCRT; - } else if (req->op_type == WD_RSA_GENKEY) { --- -2.27.0 - diff --git a/0098-uadk-parse-epoll-flag-from-environment-variable.patch b/0098-uadk-parse-epoll-flag-from-environment-variable.patch deleted file mode 100644 index 8cfa692..0000000 --- a/0098-uadk-parse-epoll-flag-from-environment-variable.patch +++ /dev/null @@ -1,955 +0,0 @@ -From f01c1ddc862fc07ce247c8d64083918cf84009c8 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Wed, 16 Mar 2022 18:55:28 +0800 -Subject: [PATCH 107/109] uadk: parse epoll flag from environment variable - -1.wd_set_epoll_en is used to parse epoll enable flag -from environment variable and store it to global variable. -2.When uadk works in synchronize mode, it will check the -global variable and decide whether to use wd_ctx_wait. -3.HPRE algorithm(ecc, rsa, dh) is also support epoll wait now. -4.hisi_qm_enable_interrupt is used to enable interrupt mode dynamically -when uadk send packets, but since we can init queue with fixed mode now, -it is not so efficient and can be replaced. - -Signed-off-by: Wenkai Lin ---- - docs/wd_environment_variable | 5 +++ - drv/hisi_comp.c | 5 +-- - drv/hisi_hpre.c | 3 ++ - drv/hisi_qm_udrv.c | 21 ++---------- - drv/hisi_sec.c | 15 ++------- - include/drv/wd_aead_drv.h | 2 -- - include/drv/wd_cipher_drv.h | 2 -- - include/drv/wd_comp_drv.h | 2 -- - include/drv/wd_digest_drv.h | 2 -- - include/hisi_qm_udrv.h | 4 +-- - include/wd_alg_common.h | 3 ++ - include/wd_util.h | 9 +++++ - wd_aead.c | 23 +++++-------- - wd_cipher.c | 23 +++++-------- - wd_comp.c | 26 +++++++-------- - wd_dh.c | 23 ++++++++----- - wd_digest.c | 24 ++++++-------- - wd_ecc.c | 23 ++++++++----- - wd_rsa.c | 23 ++++++++----- - wd_sched.c | 2 +- - wd_util.c | 64 ++++++++++++++++++++++++++++-------- - 21 files changed, 163 insertions(+), 141 deletions(-) - -diff --git a/docs/wd_environment_variable b/docs/wd_environment_variable -index 3ada5fb..8ac2da7 100644 ---- a/docs/wd_environment_variable -+++ b/docs/wd_environment_variable -@@ -47,6 +47,11 @@ WD__ASYNC_POLL_NUM - WD__ASYNC_POLL_NUM=2@0,4@2 means to configure 2 async polling threads in - node0, and 4 polling threads in node2. - -+WD__EPOLL_EN -+ Define if wd_do__sync enable wd_ctx_wait in WD. WD__EPOLL_EN=1 -+ means enable wd_ctx_wait in WD, driver will wait to receive the package until -+ hardware is done with package, otherwise driver will try to receive the package -+ directly after the package is sent. - - 2. User model - ============= -diff --git a/drv/hisi_comp.c b/drv/hisi_comp.c -index 860da43..9fdf3f1 100644 ---- a/drv/hisi_comp.c -+++ b/drv/hisi_comp.c -@@ -780,6 +780,9 @@ static int hisi_zip_init(struct wd_ctx_config_internal *config, void *priv) - qm_priv.sqe_size = sizeof(struct hisi_zip_sqe); - qm_priv.op_type = config->ctxs[i].op_type; - qm_priv.qp_mode = config->ctxs[i].ctx_mode; -+ /* Setting the epoll en to 0 for ASYNC ctx */ -+ qm_priv.epoll_en = (qm_priv.qp_mode == CTX_MODE_SYNC) ? -+ config->epoll_en : 0; - qm_priv.idx = i; - h_qp = hisi_qm_alloc_qp(&qm_priv, h_ctx); - if (unlikely(!h_qp)) -@@ -883,8 +886,6 @@ static int hisi_zip_comp_send(handle_t ctx, struct wd_comp_msg *msg, void *priv) - return ret; - } - -- hisi_qm_enable_interrupt(ctx, msg->is_polled); -- - return 0; - } - -diff --git a/drv/hisi_hpre.c b/drv/hisi_hpre.c -index d9546a6..7e14027 100644 ---- a/drv/hisi_hpre.c -+++ b/drv/hisi_hpre.c -@@ -466,6 +466,9 @@ static int hpre_init(struct wd_ctx_config_internal *config, void *priv, const ch - for (i = 0; i < config->ctx_num; i++) { - h_ctx = config->ctxs[i].ctx; - qm_priv.qp_mode = config->ctxs[i].ctx_mode; -+ /* Setting the epoll en to 0 for ASYNC ctx */ -+ qm_priv.epoll_en = (qm_priv.qp_mode == CTX_MODE_SYNC) ? -+ config->epoll_en : 0; - qm_priv.idx = i; - h_qp = hisi_qm_alloc_qp(&qm_priv, h_ctx); - if (!h_qp) { -diff --git a/drv/hisi_qm_udrv.c b/drv/hisi_qm_udrv.c -index be06570..2c0d87c 100644 ---- a/drv/hisi_qm_udrv.c -+++ b/drv/hisi_qm_udrv.c -@@ -309,6 +309,7 @@ static int hisi_qm_setup_info(struct hisi_qp *qp, struct hisi_qm_priv *config) - } - - q_info->qp_mode = config->qp_mode; -+ q_info->epoll_en = config->epoll_en; - q_info->idx = config->idx; - q_info->sqe_size = config->sqe_size; - q_info->cqc_phase = 1; -@@ -479,7 +480,7 @@ static int hisi_qm_recv_single(struct hisi_qm_queue_info *q_info, void *resp) - i++; - } - -- q_info->db(q_info, QM_DBELL_CMD_CQ, i, 0); -+ q_info->db(q_info, QM_DBELL_CMD_CQ, i, q_info->epoll_en); - - /* only support one thread poll one queue, so no need protect */ - q_info->cq_head_index = i; -@@ -919,21 +920,3 @@ __u32 hisi_qm_get_list_size(struct wd_datalist *start_node, - - return lits_size; - } -- --void hisi_qm_enable_interrupt(handle_t ctx, __u8 enable) --{ -- struct hisi_qm_queue_info *q_info; -- struct hisi_qp *qp; -- handle_t h_qp; -- -- if (!enable) -- return; -- -- h_qp = (handle_t)wd_ctx_get_priv(ctx); -- qp = (struct hisi_qp *)h_qp; -- q_info = &qp->q_info; -- -- pthread_spin_lock(&q_info->lock); -- q_info->db(q_info, QM_DBELL_CMD_CQ, q_info->cq_head_index, 1); -- pthread_spin_unlock(&q_info->lock); --} -diff --git a/drv/hisi_sec.c b/drv/hisi_sec.c -index aa86a6b..0732cdc 100644 ---- a/drv/hisi_sec.c -+++ b/drv/hisi_sec.c -@@ -959,8 +959,6 @@ int hisi_sec_cipher_send(handle_t ctx, struct wd_cipher_msg *msg) - return ret; - } - -- hisi_qm_enable_interrupt(ctx, msg->is_polled); -- - return 0; - } - -@@ -1162,8 +1160,6 @@ int hisi_sec_cipher_send_v3(handle_t ctx, struct wd_cipher_msg *msg) - return ret; - } - -- hisi_qm_enable_interrupt(ctx, msg->is_polled); -- - return 0; - } - -@@ -1403,8 +1399,6 @@ int hisi_sec_digest_send(handle_t ctx, struct wd_digest_msg *msg) - goto put_sgl; - } - -- hisi_qm_enable_interrupt(ctx, msg->is_polled); -- - return 0; - - put_sgl: -@@ -1560,8 +1554,6 @@ int hisi_sec_digest_send_v3(handle_t ctx, struct wd_digest_msg *msg) - goto put_sgl; - } - -- hisi_qm_enable_interrupt(ctx, msg->is_polled); -- - return 0; - - put_sgl: -@@ -1913,8 +1905,6 @@ int hisi_sec_aead_send(handle_t ctx, struct wd_aead_msg *msg) - return ret; - } - -- hisi_qm_enable_interrupt(ctx, msg->is_polled); -- - return 0; - } - -@@ -2181,8 +2171,6 @@ int hisi_sec_aead_send_v3(handle_t ctx, struct wd_aead_msg *msg) - return ret; - } - -- hisi_qm_enable_interrupt(ctx, msg->is_polled); -- - return 0; - } - -@@ -2285,6 +2273,9 @@ int hisi_sec_init(struct wd_ctx_config_internal *config, void *priv) - /* setting the type is 0 for sqc_type */ - qm_priv.op_type = 0; - qm_priv.qp_mode = config->ctxs[i].ctx_mode; -+ /* Setting the epoll en to 0 for ASYNC ctx */ -+ qm_priv.epoll_en = (qm_priv.qp_mode == CTX_MODE_SYNC) ? -+ config->epoll_en : 0; - qm_priv.idx = i; - h_qp = hisi_qm_alloc_qp(&qm_priv, h_ctx); - if (!h_qp) -diff --git a/include/drv/wd_aead_drv.h b/include/drv/wd_aead_drv.h -index 78a5673..137e70a 100644 ---- a/include/drv/wd_aead_drv.h -+++ b/include/drv/wd_aead_drv.h -@@ -31,8 +31,6 @@ struct wd_aead_msg { - __u8 data_fmt; - /* Operation result, denoted by WD error code */ - __u8 result; -- /* epoll flag */ -- __u8 is_polled; - - /* in bytes */ - __u32 in_bytes; -diff --git a/include/drv/wd_cipher_drv.h b/include/drv/wd_cipher_drv.h -index e649869..87b77d3 100644 ---- a/include/drv/wd_cipher_drv.h -+++ b/include/drv/wd_cipher_drv.h -@@ -28,8 +28,6 @@ struct wd_cipher_msg { - __u8 data_fmt; - /* Operation result, denoted by WD error code */ - __u8 result; -- /* epoll flag */ -- __u8 is_polled; - - /* Key bytes */ - __u16 key_bytes; -diff --git a/include/drv/wd_comp_drv.h b/include/drv/wd_comp_drv.h -index 8146a50..73403b5 100644 ---- a/include/drv/wd_comp_drv.h -+++ b/include/drv/wd_comp_drv.h -@@ -50,8 +50,6 @@ struct wd_comp_msg { - __u32 checksum; - /* Request identifier */ - __u32 tag; -- /* Epoll flag */ -- __u8 is_polled; - }; - - struct wd_comp_driver { -diff --git a/include/drv/wd_digest_drv.h b/include/drv/wd_digest_drv.h -index fdde772..6907bc5 100644 ---- a/include/drv/wd_digest_drv.h -+++ b/include/drv/wd_digest_drv.h -@@ -27,8 +27,6 @@ struct wd_digest_msg { - __u8 data_fmt; - /* Operation result, denoted by WD error code */ - __u8 result; -- /* epoll flag */ -- __u8 is_polled; - /* user identifier: struct wcrypto_cb_tag */ - __u64 usr_data; - -diff --git a/include/hisi_qm_udrv.h b/include/hisi_qm_udrv.h -index 707d0e3..68de837 100644 ---- a/include/hisi_qm_udrv.h -+++ b/include/hisi_qm_udrv.h -@@ -47,6 +47,7 @@ struct hisi_qm_priv { - __u16 op_type; - /* index of ctxs */ - __u32 idx; -+ bool epoll_en; - }; - - struct hisi_qm_queue_info { -@@ -71,6 +72,7 @@ struct hisi_qm_queue_info { - bool cqc_phase; - pthread_spinlock_t lock; - unsigned long region_size[UACCE_QFRT_MAX]; -+ bool epoll_en; - }; - - struct hisi_qp { -@@ -182,8 +184,6 @@ int hisi_qm_get_free_sqe_num(handle_t h_qp); - __u32 hisi_qm_get_list_size(struct wd_datalist *start_node, - struct wd_datalist *end_node); - --void hisi_qm_enable_interrupt(handle_t ctx, __u8 enable); -- - #ifdef __cplusplus - } - #endif -diff --git a/include/wd_alg_common.h b/include/wd_alg_common.h -index 94336f0..30d244f 100644 ---- a/include/wd_alg_common.h -+++ b/include/wd_alg_common.h -@@ -9,6 +9,7 @@ - - #include - #include -+#include - #include "wd.h" - #include "wd_common.h" - -@@ -27,6 +28,7 @@ extern "C" { - #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) - #define MAX_STR_LEN 256 - #define CTX_TYPE_INVALID 9999 -+#define POLL_TIME 1000 - - enum wd_ctx_mode { - CTX_MODE_SYNC = 0, -@@ -74,6 +76,7 @@ struct wd_ctx_config_internal { - struct wd_ctx_internal *ctxs; - void *priv; - int pid; -+ bool epoll_en; - }; - - /** -diff --git a/include/wd_util.h b/include/wd_util.h -index 2d3c1e4..a41b4c9 100644 ---- a/include/wd_util.h -+++ b/include/wd_util.h -@@ -314,6 +314,15 @@ int wd_set_ctx_attr(struct wd_ctx_attr *ctx_attr, - */ - int wd_check_ctx(struct wd_ctx_config_internal *config, __u8 mode, __u32 idx); - -+/** -+ * wd_set_epoll_en() - set epoll enable flag from environment variable value. -+ * @var_name: Environment variable name string. -+ * @epoll_en: epoll enable flag. -+ * -+ * Return 0 if the value is 0 or 1, otherwise return -WD_EINVAL. -+ */ -+int wd_set_epoll_en(const char *var_name, bool *epoll_en); -+ - #ifdef __cplusplus - } - #endif -diff --git a/wd_aead.c b/wd_aead.c -index 74047b5..2e006c3 100644 ---- a/wd_aead.c -+++ b/wd_aead.c -@@ -21,8 +21,6 @@ - #define WD_POOL_MAX_ENTRIES 1024 - #define MAX_RETRY_COUNTS 200000000 - --#define POLL_SIZE 70000 --#define POLL_TIME 1000 - - static int g_aead_mac_len[WD_DIGEST_TYPE_MAX] = { - WD_DIGEST_SM3_LEN, WD_DIGEST_MD5_LEN, WD_DIGEST_SHA1_LEN, -@@ -414,17 +412,18 @@ int wd_aead_init(struct wd_ctx_config *config, struct wd_sched *sched) - if (ret) - return ret; - -+ ret = wd_set_epoll_en("WD_AEAD_EPOLL_EN", -+ &wd_aead_setting.config.epoll_en); -+ if (ret < 0) -+ return ret; -+ - ret = wd_init_ctx_config(&wd_aead_setting.config, config); -- if (ret) { -- WD_ERR("failed to set config, ret = %d\n", ret); -+ if (ret) - return ret; -- } - - ret = wd_init_sched(&wd_aead_setting.sched, sched); -- if (ret < 0) { -- WD_ERR("failed to set sched, ret = %d\n", ret); -+ if (ret < 0) - goto out; -- } - - /* set driver */ - #ifdef WD_STATIC_DRV -@@ -435,10 +434,8 @@ int wd_aead_init(struct wd_ctx_config *config, struct wd_sched *sched) - ret = wd_init_async_request_pool(&wd_aead_setting.pool, - config->ctx_num, WD_POOL_MAX_ENTRIES, - sizeof(struct wd_aead_msg)); -- if (ret < 0) { -- WD_ERR("failed to init aead aysnc request pool.\n"); -+ if (ret < 0) - goto out_sched; -- } - - /* init ctx related resources in specific driver */ - priv = calloc(1, wd_aead_setting.driver->drv_ctx_size); -@@ -525,7 +522,7 @@ static int send_recv_sync(struct wd_ctx_internal *ctx, - } - - do { -- if (msg->is_polled) { -+ if (wd_aead_setting.config.epoll_en) { - ret = wd_ctx_wait(ctx->ctx, POLL_TIME); - if (unlikely(ret < 0)) - WD_ERR("wd aead ctx wait timeout(%d)!\n", ret); -@@ -563,7 +560,6 @@ int wd_do_aead_sync(handle_t h_sess, struct wd_aead_req *req) - - memset(&msg, 0, sizeof(struct wd_aead_msg)); - fill_request_msg(&msg, req, sess); -- msg.is_polled = (req->in_bytes >= POLL_SIZE); - req->state = 0; - - idx = wd_aead_setting.sched.pick_next_ctx( -@@ -616,7 +612,6 @@ int wd_do_aead_async(handle_t h_sess, struct wd_aead_req *req) - - fill_request_msg(msg, req, sess); - msg->tag = msg_id; -- msg->is_polled = 0; - - ret = wd_aead_setting.driver->aead_send(ctx->ctx, msg); - if (unlikely(ret < 0)) { -diff --git a/wd_cipher.c b/wd_cipher.c -index 563eece..6d286f9 100644 ---- a/wd_cipher.c -+++ b/wd_cipher.c -@@ -22,8 +22,6 @@ - #define DES_WEAK_KEY_NUM 16 - #define MAX_RETRY_COUNTS 200000000 - --#define POLL_SIZE 100000 --#define POLL_TIME 1000 - - static const unsigned char des_weak_keys[DES_WEAK_KEY_NUM][DES_KEY_SIZE] = { - /* weak keys */ -@@ -255,17 +253,18 @@ int wd_cipher_init(struct wd_ctx_config *config, struct wd_sched *sched) - if (ret) - return ret; - -+ ret = wd_set_epoll_en("WD_CIPHER_EPOLL_EN", -+ &wd_cipher_setting.config.epoll_en); -+ if (ret < 0) -+ return ret; -+ - ret = wd_init_ctx_config(&wd_cipher_setting.config, config); -- if (ret < 0) { -- WD_ERR("failed to set config, ret = %d!\n", ret); -+ if (ret < 0) - return ret; -- } - - ret = wd_init_sched(&wd_cipher_setting.sched, sched); -- if (ret < 0) { -- WD_ERR("failed to set sched, ret = %d!\n", ret); -+ if (ret < 0) - goto out; -- } - - #ifdef WD_STATIC_DRV - /* set driver */ -@@ -276,10 +275,8 @@ int wd_cipher_init(struct wd_ctx_config *config, struct wd_sched *sched) - ret = wd_init_async_request_pool(&wd_cipher_setting.pool, - config->ctx_num, WD_POOL_MAX_ENTRIES, - sizeof(struct wd_cipher_msg)); -- if (ret < 0) { -- WD_ERR("failed to init req pool, ret = %d!\n", ret); -+ if (ret < 0) - goto out_sched; -- } - - /* init ctx related resources in specific driver */ - priv = calloc(1, wd_cipher_setting.driver->drv_ctx_size); -@@ -436,7 +433,7 @@ static int send_recv_sync(struct wd_ctx_internal *ctx, - } - - do { -- if (msg->is_polled) { -+ if (wd_cipher_setting.config.epoll_en) { - ret = wd_ctx_wait(ctx->ctx, POLL_TIME); - if (unlikely(ret < 0)) - WD_ERR("wd cipher ctx wait timeout(%d)!\n", ret); -@@ -476,7 +473,6 @@ int wd_do_cipher_sync(handle_t h_sess, struct wd_cipher_req *req) - - memset(&msg, 0, sizeof(struct wd_cipher_msg)); - fill_request_msg(&msg, req, sess); -- msg.is_polled = (req->in_bytes >= POLL_SIZE); - req->state = 0; - - idx = wd_cipher_setting.sched.pick_next_ctx( -@@ -526,7 +522,6 @@ int wd_do_cipher_async(handle_t h_sess, struct wd_cipher_req *req) - - fill_request_msg(msg, req, sess); - msg->tag = msg_id; -- msg->is_polled = 0; - - ret = wd_cipher_setting.driver->cipher_send(ctx->ctx, msg); - if (unlikely(ret < 0)) { -diff --git a/wd_comp.c b/wd_comp.c -index 9a71dfc..3bd7f43 100644 ---- a/wd_comp.c -+++ b/wd_comp.c -@@ -22,8 +22,6 @@ - #define HW_CTX_SIZE (64 * 1024) - #define STREAM_CHUNK (128 * 1024) - --#define POLL_SIZE 250000 --#define POLL_TIME 1000 - - #define swap_byte(x) \ - ((((x) & 0x000000ff) << 24) | \ -@@ -97,16 +95,18 @@ int wd_comp_init(struct wd_ctx_config *config, struct wd_sched *sched) - return -WD_EINVAL; - } - -+ ret = wd_set_epoll_en("WD_COMP_EPOLL_EN", -+ &wd_comp_setting.config.epoll_en); -+ if (ret < 0) -+ return ret; -+ - ret = wd_init_ctx_config(&wd_comp_setting.config, config); -- if (ret < 0) { -- WD_ERR("failed to set config, ret = %d!\n", ret); -+ if (ret < 0) - return ret; -- } -+ - ret = wd_init_sched(&wd_comp_setting.sched, sched); -- if (ret < 0) { -- WD_ERR("failed to set sched, ret = %d!\n", ret); -+ if (ret < 0) - goto out; -- } - /* - * Fix me: ctx could be passed into wd_comp_set_static_drv to help to - * choose static compiled vendor driver. For dynamic vendor driver, -@@ -125,10 +125,9 @@ int wd_comp_init(struct wd_ctx_config *config, struct wd_sched *sched) - ret = wd_init_async_request_pool(&wd_comp_setting.pool, - config->ctx_num, WD_POOL_MAX_ENTRIES, - sizeof(struct wd_comp_msg)); -- if (ret < 0) { -- WD_ERR("failed to init req pool, ret = %d!\n", ret); -+ if (ret < 0) - goto out_sched; -- } -+ - /* init ctx related resources in specific driver */ - priv = calloc(1, wd_comp_setting.driver->drv_ctx_size); - if (!priv) { -@@ -429,7 +428,7 @@ static int wd_comp_sync_job(struct wd_comp_sess *sess, - } - - do { -- if (msg->is_polled) { -+ if (config->epoll_en) { - ret = wd_ctx_wait(ctx->ctx, POLL_TIME); - if (unlikely(ret < 0)) - WD_ERR("wd ctx wait timeout, ret = %d!\n", ret); -@@ -472,7 +471,6 @@ int wd_do_comp_sync(handle_t h_sess, struct wd_comp_req *req) - - fill_comp_msg(sess, &msg, req); - msg.ctx_buf = sess->ctx_buf; -- msg.is_polled = (req->src_len >= POLL_SIZE); - msg.stream_mode = WD_COMP_STATELESS; - - ret = wd_comp_sync_job(sess, req, &msg); -@@ -643,7 +641,6 @@ int wd_do_comp_strm(handle_t h_sess, struct wd_comp_req *req) - /* fill true flag */ - msg.req.last = req->last; - msg.stream_mode = WD_COMP_STATEFUL; -- msg.is_polled = (req->src_len >= POLL_SIZE); - - src_len = req->src_len; - -@@ -701,7 +698,6 @@ int wd_do_comp_async(handle_t h_sess, struct wd_comp_req *req) - fill_comp_msg(sess, msg, req); - msg->tag = tag; - msg->stream_mode = WD_COMP_STATELESS; -- msg->is_polled = 0; - - pthread_spin_lock(&ctx->lock); - -diff --git a/wd_dh.c b/wd_dh.c -index c0d3e00..aaea812 100644 ---- a/wd_dh.c -+++ b/wd_dh.c -@@ -101,17 +101,18 @@ int wd_dh_init(struct wd_ctx_config *config, struct wd_sched *sched) - if (param_check(config, sched)) - return -WD_EINVAL; - -+ ret = wd_set_epoll_en("WD_DH_EPOLL_EN", -+ &wd_dh_setting.config.epoll_en); -+ if (ret < 0) -+ return ret; -+ - ret = wd_init_ctx_config(&wd_dh_setting.config, config); -- if (ret) { -- WD_ERR("failed to initialize ctx config, ret = %d!\n", ret); -+ if (ret) - return ret; -- } - - ret = wd_init_sched(&wd_dh_setting.sched, sched); -- if (ret) { -- WD_ERR("failed to initialize sched, ret = %d!\n", ret); -+ if (ret) - goto out; -- } - - #ifdef WD_STATIC_DRV - wd_dh_set_static_drv(); -@@ -121,10 +122,8 @@ int wd_dh_init(struct wd_ctx_config *config, struct wd_sched *sched) - ret = wd_init_async_request_pool(&wd_dh_setting.pool, - config->ctx_num, WD_POOL_MAX_ENTRIES, - sizeof(struct wd_dh_msg)); -- if (ret) { -- WD_ERR("failed to initialize async req pool, ret = %d!\n", ret); -+ if (ret) - goto out_sched; -- } - - /* initialize ctx related resources in specific driver */ - priv = calloc(1, wd_dh_setting.driver->drv_ctx_size); -@@ -236,6 +235,12 @@ static int dh_recv_sync(handle_t ctx, struct wd_dh_msg *msg) - int ret; - - do { -+ if (wd_dh_setting.config.epoll_en) { -+ ret = wd_ctx_wait(ctx, POLL_TIME); -+ if (ret < 0) -+ WD_ERR("wd ctx wait timeout(%d)!\n", ret); -+ } -+ - ret = wd_dh_setting.driver->recv(ctx, msg); - if (ret == -WD_EAGAIN) { - if (rx_cnt++ >= DH_RECV_MAX_CNT) { -diff --git a/wd_digest.c b/wd_digest.c -index 0ddc074..7afbd9c 100644 ---- a/wd_digest.c -+++ b/wd_digest.c -@@ -19,8 +19,6 @@ - #define DES_WEAK_KEY_NUM 4 - #define MAX_RETRY_COUNTS 200000000 - --#define POLL_SIZE 100000 --#define POLL_TIME 1000 - - static int g_digest_mac_len[WD_DIGEST_TYPE_MAX] = { - WD_DIGEST_SM3_LEN, WD_DIGEST_MD5_LEN, WD_DIGEST_SHA1_LEN, -@@ -28,6 +26,7 @@ static int g_digest_mac_len[WD_DIGEST_TYPE_MAX] = { - WD_DIGEST_SHA384_LEN, WD_DIGEST_SHA512_LEN, - WD_DIGEST_SHA512_224_LEN, WD_DIGEST_SHA512_256_LEN - }; -+ - struct wd_digest_setting { - struct wd_ctx_config_internal config; - struct wd_sched sched; -@@ -175,17 +174,18 @@ int wd_digest_init(struct wd_ctx_config *config, struct wd_sched *sched) - if (ret) - return ret; - -+ ret = wd_set_epoll_en("WD_DIGEST_EPOLL_EN", -+ &wd_digest_setting.config.epoll_en); -+ if (ret < 0) -+ return ret; -+ - ret = wd_init_ctx_config(&wd_digest_setting.config, config); -- if (ret < 0) { -- WD_ERR("failed to set config, ret = %d!\n", ret); -+ if (ret < 0) - return ret; -- } - - ret = wd_init_sched(&wd_digest_setting.sched, sched); -- if (ret < 0) { -- WD_ERR("failed to set sched, ret = %d!\n", ret); -+ if (ret < 0) - goto out; -- } - - /* set driver */ - #ifdef WD_STATIC_DRV -@@ -196,10 +196,8 @@ int wd_digest_init(struct wd_ctx_config *config, struct wd_sched *sched) - ret = wd_init_async_request_pool(&wd_digest_setting.pool, - config->ctx_num, WD_POOL_MAX_ENTRIES, - sizeof(struct wd_digest_msg)); -- if (ret < 0) { -- WD_ERR("failed to init req pool, ret = %d!\n", ret); -+ if (ret < 0) - goto out_sched; -- } - - /* init ctx related resources in specific driver */ - priv = calloc(1, wd_digest_setting.driver->drv_ctx_size); -@@ -322,7 +320,7 @@ static int send_recv_sync(struct wd_ctx_internal *ctx, struct wd_digest_sess *ds - } - - do { -- if (msg->is_polled) { -+ if (wd_digest_setting.config.epoll_en) { - ret = wd_ctx_wait(ctx->ctx, POLL_TIME); - if (unlikely(ret < 0)) - WD_ERR("wd digest ctx wait timeout(%d)!\n", ret); -@@ -367,7 +365,6 @@ int wd_do_digest_sync(handle_t h_sess, struct wd_digest_req *req) - - memset(&msg, 0, sizeof(struct wd_digest_msg)); - fill_request_msg(&msg, req, dsess); -- msg.is_polled = (req->in_bytes >= POLL_SIZE); - req->state = 0; - - idx = wd_digest_setting.sched.pick_next_ctx( -@@ -420,7 +417,6 @@ int wd_do_digest_async(handle_t h_sess, struct wd_digest_req *req) - - fill_request_msg(msg, req, dsess); - msg->tag = msg_id; -- msg->is_polled = 0; - - ret = wd_digest_setting.driver->digest_send(ctx->ctx, msg); - if (unlikely(ret < 0)) { -diff --git a/wd_ecc.c b/wd_ecc.c -index af62b9a..a6c2209 100644 ---- a/wd_ecc.c -+++ b/wd_ecc.c -@@ -155,17 +155,18 @@ int wd_ecc_init(struct wd_ctx_config *config, struct wd_sched *sched) - if (init_param_check(config, sched)) - return -WD_EINVAL; - -+ ret = wd_set_epoll_en("WD_ECC_EPOLL_EN", -+ &wd_ecc_setting.config.epoll_en); -+ if (ret < 0) -+ return ret; -+ - ret = wd_init_ctx_config(&wd_ecc_setting.config, config); -- if (ret < 0) { -- WD_ERR("failed to set config, ret = %d!\n", ret); -+ if (ret < 0) - return ret; -- } - - ret = wd_init_sched(&wd_ecc_setting.sched, sched); -- if (ret < 0) { -- WD_ERR("failed to set sched, ret = %d!\n", ret); -+ if (ret < 0) - goto out; -- } - - #ifdef WD_STATIC_DRV - wd_ecc_set_static_drv(); -@@ -175,10 +176,8 @@ int wd_ecc_init(struct wd_ctx_config *config, struct wd_sched *sched) - ret = wd_init_async_request_pool(&wd_ecc_setting.pool, - config->ctx_num, WD_POOL_MAX_ENTRIES, - sizeof(struct wd_ecc_msg)); -- if (ret < 0) { -- WD_ERR("failed to initialize async req pool, ret = %d!\n", ret); -+ if (ret < 0) - goto out_sched; -- } - - /* initialize ctx related resources in specific driver */ - priv = calloc(1, wd_ecc_setting.driver->drv_ctx_size); -@@ -1435,6 +1434,12 @@ static int ecc_recv_sync(handle_t ctx, struct wd_ecc_msg *msg) - int ret; - - do { -+ if (wd_ecc_setting.config.epoll_en) { -+ ret = wd_ctx_wait(ctx, POLL_TIME); -+ if (ret < 0) -+ WD_ERR("wd ctx wait timeout(%d)!\n", ret); -+ } -+ - ret = wd_ecc_setting.driver->recv(ctx, msg); - if (ret == -WD_EAGAIN) { - if (rx_cnt++ >= ECC_RECV_MAX_CNT) { -diff --git a/wd_rsa.c b/wd_rsa.c -index 8371475..ca39cff 100644 ---- a/wd_rsa.c -+++ b/wd_rsa.c -@@ -141,17 +141,18 @@ int wd_rsa_init(struct wd_ctx_config *config, struct wd_sched *sched) - if (param_check(config, sched)) - return -WD_EINVAL; - -+ ret = wd_set_epoll_en("WD_RSA_EPOLL_EN", -+ &wd_rsa_setting.config.epoll_en); -+ if (ret < 0) -+ return ret; -+ - ret = wd_init_ctx_config(&wd_rsa_setting.config, config); -- if (ret < 0) { -- WD_ERR("failed to set config, ret = %d!\n", ret); -+ if (ret < 0) - return ret; -- } - - ret = wd_init_sched(&wd_rsa_setting.sched, sched); -- if (ret < 0) { -- WD_ERR("failed to set sched, ret = %d!\n", ret); -+ if (ret < 0) - goto out; -- } - - #ifdef WD_STATIC_DRV - wd_rsa_set_static_drv(); -@@ -161,10 +162,8 @@ int wd_rsa_init(struct wd_ctx_config *config, struct wd_sched *sched) - ret = wd_init_async_request_pool(&wd_rsa_setting.pool, - config->ctx_num, WD_POOL_MAX_ENTRIES, - sizeof(struct wd_rsa_msg)); -- if (ret < 0) { -- WD_ERR("failed to initialize async req pool, ret = %d!\n", ret); -+ if (ret < 0) - goto out_sched; -- } - - /* initialize ctx related resources in specific driver */ - priv = calloc(1, wd_rsa_setting.driver->drv_ctx_size); -@@ -296,6 +295,12 @@ static int rsa_recv_sync(handle_t ctx, struct wd_rsa_msg *msg) - int ret; - - do { -+ if (wd_rsa_setting.config.epoll_en) { -+ ret = wd_ctx_wait(ctx, POLL_TIME); -+ if (ret < 0) -+ WD_ERR("wd ctx wait timeout(%d)!\n", ret); -+ } -+ - ret = wd_rsa_setting.driver->recv(ctx, msg); - if (ret == -WD_EAGAIN) { - if (rx_cnt++ >= RSA_RECV_MAX_CNT) { -diff --git a/wd_sched.c b/wd_sched.c -index 9b1998c..dfd390b 100644 ---- a/wd_sched.c -+++ b/wd_sched.c -@@ -213,7 +213,7 @@ static int session_sched_poll_policy(handle_t sched_ctx, - } - - if (ctx->numa_num > NUMA_NUM_NODES) { -- WD_ERR("invalid: ctx's numa number is %d!\n", ctx->numa_num); -+ WD_ERR("invalid: ctx's numa number is %u!\n", ctx->numa_num); - return -WD_EINVAL; - } - -diff --git a/wd_util.c b/wd_util.c -index 03316b6..57dafa7 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -85,8 +85,10 @@ int wd_init_ctx_config(struct wd_ctx_config_internal *in, - } - - ctxs = calloc(1, cfg->ctx_num * sizeof(struct wd_ctx_internal)); -- if (!ctxs) -+ if (!ctxs) { -+ WD_ERR("failed to alloc memory for internal ctxs!\n"); - return -WD_ENOMEM; -+ } - - for (i = 0; i < cfg->ctx_num; i++) { - if (!cfg->ctxs[i].ctx) { -@@ -115,8 +117,10 @@ int wd_init_ctx_config(struct wd_ctx_config_internal *in, - int wd_init_sched(struct wd_sched *in, struct wd_sched *from) - { - if (!from->name || !from->sched_init || -- !from->pick_next_ctx || !from->poll_policy) -+ !from->pick_next_ctx || !from->poll_policy) { -+ WD_ERR("invalid: member of wd_sched is NULL!\n"); - return -WD_EINVAL; -+ } - - in->h_sched_ctx = from->h_sched_ctx; - in->name = strdup(from->name); -@@ -170,13 +174,16 @@ void wd_memset_zero(void *data, __u32 size) - static int init_msg_pool(struct msg_pool *pool, __u32 msg_num, __u32 msg_size) - { - pool->msgs = calloc(1, msg_num * msg_size); -- if (!pool->msgs) -+ if (!pool->msgs) { -+ WD_ERR("failed to alloc memory for msgs arrary of msg pool!\n"); - return -WD_ENOMEM; -+ } - - pool->used = calloc(1, msg_num * sizeof(int)); - if (!pool->used) { - free(pool->msgs); - pool->msgs = NULL; -+ WD_ERR("failed to alloc memory for used arrary of msg pool!\n"); - return -WD_ENOMEM; - } - -@@ -204,8 +211,10 @@ int wd_init_async_request_pool(struct wd_async_msg_pool *pool, __u32 pool_num, - pool->pool_num = pool_num; - - pool->pools = calloc(1, pool->pool_num * sizeof(struct msg_pool)); -- if (!pool->pools) -+ if (!pool->pools) { -+ WD_ERR("failed to alloc memory for async msg pools!\n"); - return -WD_ENOMEM; -+ } - - for (i = 0; i < pool->pool_num; i++) { - ret = init_msg_pool(&pool->pools[i], msg_num, msg_size); -@@ -510,27 +519,33 @@ static int is_number(const char *str) - return 1; - } - --/* 1 enable, 0 disable, others error */ --int wd_parse_async_poll_en(struct wd_env_config *config, const char *s) -+static int str_to_bool(const char *s, bool *target) - { - int tmp; - -- if (!is_number(s)) { -- WD_ERR("invalid: async poll en flag is %s!\n", s); -+ if (!is_number(s)) - return -WD_EINVAL; -- } - - tmp = strtol(s, NULL, 10); -- if (tmp != 0 && tmp != 1) { -- WD_ERR("invalid: async poll en flag is not 0 or 1!\n"); -+ if (tmp != 0 && tmp != 1) - return -WD_EINVAL; -- } - -- config->enable_internal_poll = tmp; -+ *target = tmp; - - return 0; - } - -+int wd_parse_async_poll_en(struct wd_env_config *config, const char *s) -+{ -+ int ret; -+ -+ ret = str_to_bool(s, &config->enable_internal_poll); -+ if (ret) -+ WD_ERR("failed to parse async poll enable flag(%s)!\n", s); -+ -+ return ret; -+} -+ - static int parse_num_on_numa(const char *s, int *num, int *node) - { - char *sep, *start, *left; -@@ -1589,3 +1604,26 @@ int wd_check_ctx(struct wd_ctx_config_internal *config, __u8 mode, __u32 idx) - - return 0; - } -+ -+int wd_set_epoll_en(const char *var_name, bool *epoll_en) -+{ -+ const char *s; -+ int ret; -+ -+ s = secure_getenv(var_name); -+ if (!s || !strlen(s)) { -+ *epoll_en = 0; -+ return 0; -+ } -+ -+ ret = str_to_bool(s, epoll_en); -+ if (ret) { -+ WD_ERR("failed to parse %s!\n", var_name); -+ return ret; -+ } -+ -+ if (*epoll_en) -+ WD_ERR("epoll wait is enabled!\n"); -+ -+ return 0; -+} --- -2.27.0 - diff --git a/0099-test-enable-epoll-in-sanity-scripts.patch b/0099-test-enable-epoll-in-sanity-scripts.patch deleted file mode 100644 index 7580fd3..0000000 --- a/0099-test-enable-epoll-in-sanity-scripts.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 1b4b3526112a4207f9ea84620fe0e91714f83729 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Wed, 16 Mar 2022 17:52:22 +0800 -Subject: [PATCH 108/109] test: enable epoll in sanity scripts - -epoll is enabled by WD_COMP_EPOLL_EN, -so set it to 1 to test the function. - -Signed-off-by: Wenkai Lin ---- - test/sanity_test.sh | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/test/sanity_test.sh b/test/sanity_test.sh -index 688485c..207eee5 100755 ---- a/test/sanity_test.sh -+++ b/test/sanity_test.sh -@@ -362,7 +362,8 @@ run_zip_test_v2() - dd if=/var/log/syslog of=/tmp/syslog bs=1M count=16 >& /dev/null - sw_dfl_hw_ifl /tmp/syslog - hw_dfl_sw_ifl /tmp/syslog -- hw_dfl_hw_ifl /tmp/syslog -+ WD_COMP_EPOLL_EN=1 hw_dfl_hw_ifl /tmp/syslog -+ WD_COMP_EPOLL_EN=0 hw_dfl_hw_ifl /tmp/syslog - # test without environment variables - #zip_sva_perf -b 8192 -s 81920 -l 1000 --self - # test with environment variables --- -2.27.0 - diff --git a/0100-drv-sec-modification-for-clean-code.patch b/0100-drv-sec-modification-for-clean-code.patch deleted file mode 100644 index e4aa0ee..0000000 --- a/0100-drv-sec-modification-for-clean-code.patch +++ /dev/null @@ -1,162 +0,0 @@ -From c46b3f972de457ffdb80325f88eae175bd8bd3a7 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Fri, 1 Apr 2022 11:01:11 +0800 -Subject: [PATCH 110/183] drv/sec - modification for clean code - -1. Delete some debug code. Debug code is not allowed in the - release version. -2. Fix a code style issue in sec drv exit. - -Signed-off-by: Kai Ye ---- - drv/hisi_sec.c | 67 ++++++-------------------------------------------- - 1 file changed, 7 insertions(+), 60 deletions(-) - -diff --git a/drv/hisi_sec.c b/drv/hisi_sec.c -index 0732cdc..396e11e 100644 ---- a/drv/hisi_sec.c -+++ b/drv/hisi_sec.c -@@ -486,20 +486,6 @@ static int g_hmac_a_alg[WD_DIGEST_TYPE_MAX] = { - int hisi_sec_init(struct wd_ctx_config_internal *config, void *priv); - void hisi_sec_exit(void *priv); - --#ifdef DEBUG --static void sec_dump_bd(unsigned char *bd, unsigned int len) --{ -- unsigned int i; -- -- for (i = 0; i < len; i++) { -- WD_ERR("\\0x%02x", bd[i]); -- if ((i + 1) % WORD_BYTES == 0) -- WD_ERR("\n"); -- } -- WD_ERR("\n"); --} --#endif -- - /* increment counter (128-bit int) by software */ - static void ctr_iv_inc(__u8 *counter, __u32 c) - { -@@ -1286,11 +1272,6 @@ static void parse_digest_bd2(struct hisi_sec_sqe *sqe, - recv_msg->data_fmt = hisi_sec_get_data_fmt_v2(sqe->sds_sa_type); - recv_msg->in = (__u8 *)(uintptr_t)sqe->type2.data_src_addr; - recv_msg->alg_type = WD_DIGEST; -- --#ifdef DEBUG -- WD_ERR("Dump digest recv sqe-->!\n"); -- sec_dump_bd((unsigned char *)sqe, SQE_BYTES_NUMS); --#endif - } - - static int digest_long_bd_check(struct wd_digest_msg *msg) -@@ -1385,11 +1366,6 @@ int hisi_sec_digest_send(handle_t ctx, struct wd_digest_msg *msg) - - qm_fill_digest_long_bd(msg, &sqe); - --#ifdef DEBUG -- WD_ERR("Dump digest send sqe-->!\n"); -- sec_dump_bd((unsigned char *)&sqe, SQE_BYTES_NUMS); --#endif -- - sqe.type2.tag = msg->tag; - ret = hisi_qm_send(h_qp, &sqe, 1, &count); - if (ret < 0) { -@@ -1539,11 +1515,6 @@ int hisi_sec_digest_send_v3(handle_t ctx, struct wd_digest_msg *msg) - - qm_fill_digest_long_bd3(msg, &sqe); - --#ifdef DEBUG -- WD_ERR("Dump digest send sqe-->!\n"); -- sec_dump_bd((unsigned char *)&sqe, SQE_BYTES_NUMS); --#endif -- - sqe.tag = (__u64)(uintptr_t)msg->tag; - - ret = hisi_qm_send(h_qp, &sqe, 1, &count); -@@ -1582,11 +1553,6 @@ static void parse_digest_bd3(struct hisi_sec_sqe3 *sqe, - recv_msg->data_fmt = hisi_sec_get_data_fmt_v3(sqe->bd_param); - recv_msg->in = (__u8 *)(uintptr_t)sqe->data_src_addr; - recv_msg->alg_type = WD_DIGEST; -- --#ifdef DEBUG -- WD_ERR("Dump digest recv sqe-->!\n"); -- sec_dump_bd((unsigned char *)sqe, SQE_BYTES_NUMS); --#endif - } - - int hisi_sec_digest_recv_v3(handle_t ctx, struct wd_digest_msg *recv_msg) -@@ -1886,11 +1852,6 @@ int hisi_sec_aead_send(handle_t ctx, struct wd_aead_msg *msg) - - fill_aead_bd2_addr(msg, &sqe); - --#ifdef DEBUG -- WD_ERR("Dump aead send sqe-->!\n"); -- sec_dump_bd((unsigned char *)&sqe, SQE_BYTES_NUMS); --#endif -- - sqe.type2.tag = (__u16)msg->tag; - - ret = hisi_qm_send(h_qp, &sqe, 1, &count); -@@ -1938,11 +1899,6 @@ static void parse_aead_bd2(struct hisi_sec_sqe *sqe, - SEC_AUTH_LEN_MASK; - recv_msg->out_bytes = sqe->type2.clen_ivhlen + - sqe->type2.cipher_src_offset; -- --#ifdef DEBUG -- WD_ERR("Dump aead recv sqe-->!\n"); -- sec_dump_bd((unsigned char *)sqe, SQE_BYTES_NUMS); --#endif - } - - int hisi_sec_aead_recv(handle_t ctx, struct wd_aead_msg *recv_msg) -@@ -2153,11 +2109,6 @@ int hisi_sec_aead_send_v3(handle_t ctx, struct wd_aead_msg *msg) - - fill_aead_bd3_addr(msg, &sqe); - --#ifdef DEBUG -- WD_ERR("Dump aead send sqe-->!\n"); -- sec_dump_bd((unsigned char *)&sqe, SQE_BYTES_NUMS); --#endif -- - sqe.tag = msg->tag; - ret = hisi_qm_send(h_qp, &sqe, 1, &count); - if (ret < 0) { -@@ -2204,11 +2155,6 @@ static void parse_aead_bd3(struct hisi_sec_sqe3 *sqe, - SEC_MAC_LEN_MASK; - recv_msg->out_bytes = sqe->c_len_ivin + - sqe->cipher_src_offset; -- --#ifdef DEBUG -- WD_ERR("Dump aead recv sqe-->!\n"); -- sec_dump_bd((unsigned char *)sqe, SQE_BYTES_NUMS); --#endif - } - - int hisi_sec_aead_recv_v3(handle_t ctx, struct wd_aead_msg *recv_msg) -@@ -2296,16 +2242,17 @@ out: - - void hisi_sec_exit(void *priv) - { -- if (!priv) { -- WD_ERR("hisi sec exit input parameter is err!\n"); -- return; -- } -- - struct hisi_sec_ctx *sec_ctx = priv; -- struct wd_ctx_config_internal *config = &sec_ctx->config; -+ struct wd_ctx_config_internal *config; - handle_t h_qp; - int i; - -+ if (!sec_ctx) { -+ WD_ERR("hisi sec exit input parameter is err!\n"); -+ return; -+ } -+ -+ config = &sec_ctx->config; - for (i = 0; i < config->ctx_num; i++) { - h_qp = (handle_t)wd_ctx_get_priv(config->ctxs[i].ctx); - hisi_qm_free_qp(h_qp); --- -2.27.0 - diff --git a/0101-uadk-fix-mempool-code.patch b/0101-uadk-fix-mempool-code.patch deleted file mode 100644 index cf1f6e3..0000000 --- a/0101-uadk-fix-mempool-code.patch +++ /dev/null @@ -1,410 +0,0 @@ -From c9ce97bff9154e712225fb06dc692b5101bd7eef Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sat, 2 Apr 2022 09:47:09 +0800 -Subject: [PATCH 111/183] uadk: fix mempool code - -1.optimize print info -2.numa node should be checked first -3.remove unused function - -Signed-off-by: Wenkai Lin ---- - wd_mempool.c | 149 ++++++++++++++++++++++----------------------------- - 1 file changed, 64 insertions(+), 85 deletions(-) - -diff --git a/wd_mempool.c b/wd_mempool.c -index 8467c48..7701f63 100644 ---- a/wd_mempool.c -+++ b/wd_mempool.c -@@ -33,7 +33,6 @@ - #define round_down(x, y) ((x) & ~wd_round_mask(x, y)) - #define WD_MEMPOOL_BLOCK_SIZE ((unsigned long)1 << 12) - #define WD_MEMPOOL_SIZE_MASK (WD_MEMPOOL_BLOCK_SIZE - 1) --#define WD_MEMPOOL_NO_NUMA -1 - #define WD_HUNDRED 100 - #define PAGE_SIZE_OFFSET 10 - -@@ -303,10 +302,13 @@ void *wd_block_alloc(handle_t blkpool) - struct blkpool *bp = (struct blkpool*)blkpool; - void *p; - -- if (!bp) -+ if (!bp) { -+ WD_ERR("invalid: block pool is NULL!\n"); - return NULL; -+ } - - if (!wd_atomic_test_add(&bp->ref, 1, 0)) { -+ WD_ERR("failed to alloc block, block pool is busy now!\n"); - return NULL; - } - -@@ -353,7 +355,7 @@ static int alloc_memzone(struct blkpool *bp, void *addr, size_t blk_num, - zone = calloc(1, sizeof(struct memzone)); - if (!zone) { - WD_ERR("failed to alloc memory for memzone!\n"); -- return -ENOMEM; -+ return -WD_ENOMEM; - } - - zone->addr = addr; -@@ -398,7 +400,7 @@ static int check_mempool_real_size(struct mempool *mp, struct blkpool *bp) - if (bp->blk_size * bp->depth > mp->real_size) { - WD_ERR("invalid: mempool size is too small: %lu!\n", - mp->real_size); -- return -ENOMEM; -+ return -WD_ENOMEM; - } - - return 0; -@@ -416,14 +418,15 @@ static int alloc_block_from_mempool(struct mempool *mp, - - do { - pos_first = find_next_zero_bit(mp->bitmap, pos_last); -- if (pos_first == mp->bitmap->bits) -- return -ENOMEM; -+ if (pos_first == mp->bitmap->bits) { -+ WD_ERR("failed to find free block from mempool!\n"); -+ return -WD_ENOMEM; -+ } - - pos_last = pos_first; -- for (i = 0; i < mem_combined_num - 1; i++) { -+ for (i = 0; i < mem_combined_num - 1; i++) - if (!test_bit(mp->bitmap, ++pos_last)) - break; -- } - } while (i != mem_combined_num - 1); - - for (i = pos_last; i >= pos_first; i--) -@@ -439,7 +442,7 @@ static int alloc_block_from_mempool(struct mempool *mp, - err_clear_bit: - for (i = pos_last; i >= pos_first; i--) - clear_bit(mp->bitmap, i); -- return -ENOMEM; -+ return -WD_ENOMEM; - } - - /* In this case, multiple blocks are in one mem block */ -@@ -447,7 +450,7 @@ static int alloc_mem_multi_in_one(struct mempool *mp, struct blkpool *bp) - { - int mem_splited_num = mp->blk_size / bp->blk_size; - int blk_num = bp->depth; -- int ret = -ENOMEM; -+ int ret = -WD_ENOMEM; - int pos = 0; - - wd_spinlock(&mp->lock); -@@ -490,7 +493,7 @@ static int alloc_mem_one_need_multi(struct mempool *mp, struct blkpool *bp) - - wd_spinlock(&mp->lock); - if (check_mempool_real_size(mp, bp)) { -- ret = -ENOMEM; -+ ret = -WD_ENOMEM; - goto err_check_size; - } - -@@ -535,13 +538,12 @@ static int init_blkpool_elem(struct blkpool *bp) - bp->blk_elem = calloc(bp->depth, sizeof(void *)); - if (!bp->blk_elem) { - WD_ERR("failed to alloc memory for blk_elem!\n"); -- return -ENOMEM; -+ return -WD_ENOMEM; - } - -- TAILQ_FOREACH(iter, &bp->mz_list, node) { -+ TAILQ_FOREACH(iter, &bp->mz_list, node) - for (i = 0; i < iter->blk_num; i++) - bp->blk_elem[idx++] = iter->addr + i * bp->blk_size; -- } - - return 0; - } -@@ -558,8 +560,10 @@ handle_t wd_blockpool_create(handle_t mempool, size_t block_size, - return (handle_t)(-WD_EINVAL); - } - -- if (!wd_atomic_test_add(&mp->ref, 1, 0)) -+ if (!wd_atomic_test_add(&mp->ref, 1, 0)) { -+ WD_ERR("failed to create blockpool, mempool is busy now!\n"); - return (handle_t)(-WD_EBUSY); -+ } - - bp = calloc(1, sizeof(struct blkpool)); - if (!bp) { -@@ -574,16 +578,12 @@ handle_t wd_blockpool_create(handle_t mempool, size_t block_size, - bp->mp = mp; - - ret = alloc_mem_from_mempool(mp, bp); -- if (ret < 0) { -- WD_ERR("failed to allocate memory from mempool!\n"); -+ if (ret < 0) - goto err_free_bp; -- } - - ret = init_blkpool_elem(bp); -- if (ret < 0) { -- WD_ERR("failed to init blkpool!\n"); -+ if (ret < 0) - goto err_free_mem; -- } - - wd_atomic_add(&bp->ref, 1); - return (handle_t)bp; -@@ -625,12 +625,11 @@ static int get_value_from_sysfs(const char *path, ssize_t path_size) - ssize_t size; - int fd; - -- if (!path || !path_size) -- return -WD_ENODEV; -- - ptrRet = realpath(path, dev_path); -- if (ptrRet == NULL) -+ if (!ptrRet) { -+ WD_ERR("failed to resolve path: %s!\n", path); - return -WD_ENODEV; -+ } - - fd = open(dev_path, O_RDONLY, 0); - if (fd < 0) { -@@ -663,24 +662,28 @@ static int get_hugepage_info_per_type(const char *hugepage_path, int path_size, - char *size_pos; - int ret; - -- if (!hugepage_path || !path_size) -- return -WD_ENODEV; -- - size_pos = index(name, '-'); -- if (!size_pos) -- return -1; -+ if (!size_pos) { -+ WD_ERR("failed to resolve dir name: %s!\n", name); -+ return -WD_EINVAL; -+ } -+ - size_pos++; - - errno = 0; - size = strtol(size_pos, NULL, 10); -- if (errno) -+ if (errno) { -+ WD_ERR("failed to resolve size pos to number: %s!\n", size_pos); - return -errno; -+ } - cfg->page_size = size << PAGE_SIZE_OFFSET; - - ret = snprintf(path, sizeof(path), "%s/%s/nr_hugepages", hugepage_path, - name); -- if (ret < 0) -- return -EINVAL; -+ if (ret < 0) { -+ WD_ERR("failed to get nr hugepages path!\n"); -+ return -WD_EINVAL; -+ } - - ret = get_value_from_sysfs(path, MAX_ATTR_STR_SIZE); - if (ret < 0) -@@ -690,15 +693,17 @@ static int get_hugepage_info_per_type(const char *hugepage_path, int path_size, - - ret = snprintf(path, sizeof(path), "%s/%s/free_hugepages", - hugepage_path, name); -- if (ret < 0) -- return -EINVAL; -+ if (ret < 0) { -+ WD_ERR("failed to get free hugepages path!\n"); -+ return -WD_EINVAL; -+ } - - ret = get_value_from_sysfs(path, MAX_ATTR_STR_SIZE); - if (ret < 0) - return ret; - cfg->free_num = ret; - -- return 1; -+ return 0; - } - - static void put_hugepage_info(struct mempool *mp) -@@ -720,13 +725,12 @@ static int get_hugepage_info(struct mempool *mp) - DIR *dir; - int ret; - -- if (mp->node == -1) -- return -EINVAL; -- - ret = snprintf(hugepage_path, sizeof(hugepage_path), "%s%d/hugepages", - SYSFS_NODE_PATH, mp->node); -- if (ret < 0) -- return -EINVAL; -+ if (ret < 0) { -+ WD_ERR("failed to get hugepages path!\n"); -+ return -WD_EINVAL; -+ } - - dir = opendir(hugepage_path); - if (!dir) { -@@ -747,10 +751,8 @@ static int get_hugepage_info(struct mempool *mp) - } - ret = get_hugepage_info_per_type(hugepage_path, MAX_HP_STR_SIZE, - hp_dir, tmp); -- if (ret < 0) { -- WD_ERR("failed to get hugepage info!\n"); -+ if (ret < 0) - goto err_free; -- } - - /* list: page size small -> big */ - TAILQ_FOREACH(iter, &mp->hp_list, node) { -@@ -783,13 +785,6 @@ static int mbind_memory(void *addr, size_t size, int node) - unsigned long node_mask; - int ret = 0; - -- /* -- * if node is equal to -1, the memory is not bound to numa node by default -- * or the system does not support numa. -- */ -- if (node == -1) -- return ret; -- - node_mask = 1U << (unsigned int)node; - ret = mbind(addr, size, MPOL_BIND, &node_mask, max_node, 0); - if (ret < 0) { -@@ -814,13 +809,13 @@ static int alloc_mem_from_hugepage(struct mempool *mp) - return ret; - - /* find proper hugepage: use small huge page if possible */ -- TAILQ_FOREACH(iter, &mp->hp_list, node) { -+ TAILQ_FOREACH(iter, &mp->hp_list, node) - if (iter->page_size * iter->free_num >= mp->size) - break; -- } -+ - if (!iter) { - WD_ERR("failed to find proper hugepage!\n"); -- ret = -ENOMEM; -+ ret = -WD_ENOMEM; - goto err_put_info; - } - -@@ -841,7 +836,7 @@ static int alloc_mem_from_hugepage(struct mempool *mp) - MAP_ANONYMOUS | MAP_HUGETLB | flags, -1, 0); - if (p == MAP_FAILED) { - WD_ERR("failed to allocate huge page!\n"); -- ret = -ENOMEM; -+ ret = -WD_ENOMEM; - goto err_put_info; - } - -@@ -870,24 +865,6 @@ static void free_hugepage_mem(struct mempool *mp) - put_hugepage_info(mp); - } - --static int alloc_mempool_memory(struct mempool *mp) --{ -- int ret; -- -- ret = alloc_mem_from_hugepage(mp); -- if (ret) { -- WD_ERR("failed to alloc memory from hugepage!\n"); -- return -ENOMEM; -- } -- -- return 0; --} -- --static void free_mempool_memory(struct mempool *mp) --{ -- free_hugepage_mem(mp); --} -- - static int init_mempool(struct mempool *mp) - { - /* size of mp should align to 4KB */ -@@ -896,7 +873,7 @@ static int init_mempool(struct mempool *mp) - - bm = create_bitmap(bits); - if (!bm) -- return -ENOMEM; -+ return -WD_ENOMEM; - mp->bitmap = bm; - mp->free_blk_num = bits; - mp->blk_num = bits; -@@ -915,8 +892,10 @@ handle_t wd_mempool_create(size_t size, int node) - struct mempool *mp; - int ret; - -- if (!size || node < WD_MEMPOOL_NO_NUMA || node > numa_max_node()) -+ if (!size || node < 0 || node > numa_max_node()) { -+ WD_ERR("invalid: numa node is %d, size is %ld!\n", node, size); - return (handle_t)(-WD_EINVAL); -+ } - - if (WD_MEMPOOL_SIZE_MASK & size) - size += WD_MEMPOOL_BLOCK_SIZE - (WD_MEMPOOL_SIZE_MASK & size); -@@ -931,7 +910,7 @@ handle_t wd_mempool_create(size_t size, int node) - mp->size = size; - mp->blk_size = WD_MEMPOOL_BLOCK_SIZE; - -- ret = alloc_mempool_memory(mp); -+ ret = alloc_mem_from_hugepage(mp); - if (ret < 0) - goto free_pool; - -@@ -943,7 +922,7 @@ handle_t wd_mempool_create(size_t size, int node) - return (handle_t)mp; - - free_pool_memory: -- free_mempool_memory(mp); -+ free_hugepage_mem(mp); - free_pool: - free(mp); - return (handle_t)(-WD_ENOMEM); -@@ -961,7 +940,7 @@ void wd_mempool_destroy(handle_t mempool) - wd_atomic_sub(&mp->ref, 1); - while(wd_atomic_load(&mp->ref)); - uninit_mempool(mp); -- free_mempool_memory(mp); -+ free_hugepage_mem(mp); - free(mp); - } - -@@ -987,8 +966,8 @@ void wd_mempool_stats(handle_t mempool, struct wd_mempool_stats *stats) - stats->blk_size = mp->blk_size; - stats->blk_num = mp->blk_num; - stats->free_blk_num = mp->free_blk_num; -- stats->blk_usage_rate = (stats->blk_num - mp->free_blk_num) * WD_HUNDRED / -- stats->blk_num; -+ stats->blk_usage_rate = (stats->blk_num - mp->free_blk_num) / -+ stats->blk_num * WD_HUNDRED; - - wd_unspinlock(&mp->lock); - } -@@ -1009,12 +988,11 @@ void wd_blockpool_stats(handle_t blkpool, struct wd_blockpool_stats *stats) - stats->block_size = bp->blk_size; - stats->block_num = bp->depth; - stats->free_block_num = bp->free_block_num; -- stats->block_usage_rate = (bp->depth - bp->free_block_num) * WD_HUNDRED / -- bp->depth; -+ stats->block_usage_rate = (bp->depth - bp->free_block_num) / -+ bp->depth * WD_HUNDRED; - -- TAILQ_FOREACH(iter, &bp->mz_list, node) { -+ TAILQ_FOREACH(iter, &bp->mz_list, node) - size += (iter->end - iter->begin + 1) * bp->mp->blk_size; -- } - - if (!size) { - WD_ERR("invalid: blkpool size is zero!\n"); -@@ -1022,7 +1000,8 @@ void wd_blockpool_stats(handle_t blkpool, struct wd_blockpool_stats *stats) - return; - } - -- stats->mem_waste_rate = (size - bp->blk_size * bp->depth) * WD_HUNDRED / size; -+ stats->mem_waste_rate = (size - bp->blk_size * bp->depth) / -+ size * WD_HUNDRED; - - wd_unspinlock(&bp->lock); - } --- -2.27.0 - diff --git a/0102-uadk-some-clean-code-for-wd.patch b/0102-uadk-some-clean-code-for-wd.patch deleted file mode 100644 index aade206..0000000 --- a/0102-uadk-some-clean-code-for-wd.patch +++ /dev/null @@ -1,142 +0,0 @@ -From 60cc5e8ead870777d36eed1242163f678de08226 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sat, 2 Apr 2022 09:47:10 +0800 -Subject: [PATCH 112/183] uadk: some clean code for wd - -1.remove unused header file -2.simplify code -3.add branch prediction to IO path - -Signed-off-by: Wenkai Lin ---- - wd_cipher.c | 1 - - wd_mempool.c | 6 ++---- - wd_sched.c | 39 +++++++++++++++++++++++++-------------- - 3 files changed, 27 insertions(+), 19 deletions(-) - -diff --git a/wd_cipher.c b/wd_cipher.c -index 6d286f9..6cf1377 100644 ---- a/wd_cipher.c -+++ b/wd_cipher.c -@@ -7,7 +7,6 @@ - #include - #include - #include --#include - #include "wd_cipher.h" - #include "wd_util.h" - #include "include/drv/wd_cipher_drv.h" -diff --git a/wd_mempool.c b/wd_mempool.c -index 7701f63..03df19a 100644 ---- a/wd_mempool.c -+++ b/wd_mempool.c -@@ -488,14 +488,12 @@ static int alloc_mem_one_need_multi(struct mempool *mp, struct blkpool *bp) - int mem_combined_num = bp->blk_size / mp->blk_size + - (bp->blk_size % mp->blk_size ? 1 : 0); - int blk_num = bp->depth; -+ int ret = -WD_ENOMEM; - int pos = 0; -- int ret; - - wd_spinlock(&mp->lock); -- if (check_mempool_real_size(mp, bp)) { -- ret = -WD_ENOMEM; -+ if (check_mempool_real_size(mp, bp)) - goto err_check_size; -- } - - while (blk_num > 0) { - ret = alloc_block_from_mempool(mp, bp, pos, -diff --git a/wd_sched.c b/wd_sched.c -index dfd390b..3a19780 100644 ---- a/wd_sched.c -+++ b/wd_sched.c -@@ -180,7 +180,7 @@ static int session_poll_policy_rr(struct wd_sched_ctx *ctx, int numa_id, - end = region[SCHED_MODE_ASYNC][i].end; - ret = session_poll_region(ctx, begin, end, expect, - count); -- if (ret) -+ if (unlikely(ret)) - return ret; - } - -@@ -207,12 +207,12 @@ static int session_sched_poll_policy(handle_t sched_ctx, - __u16 i; - int ret; - -- if (!count || !ctx) { -+ if (unlikely(!count || !ctx)) { - WD_ERR("invalid: sched ctx is NULL or count is zero!\n"); - return -WD_EINVAL; - } - -- if (ctx->numa_num > NUMA_NUM_NODES) { -+ if (unlikely(ctx->numa_num > NUMA_NUM_NODES)) { - WD_ERR("invalid: ctx's numa number is %u!\n", ctx->numa_num); - return -WD_EINVAL; - } -@@ -224,8 +224,7 @@ static int session_sched_poll_policy(handle_t sched_ctx, - * package last time, it is more efficient. In most - * bad situation, poll ends after MAX_POLL_TIMES loop. - */ -- while (loop_time < MAX_POLL_TIMES) { -- loop_time++; -+ while (++loop_time < MAX_POLL_TIMES) { - for (i = 0; i < ctx->numa_num;) { - /* If current numa is not valid, find next. */ - if (!sched_info[i].valid) { -@@ -235,7 +234,7 @@ static int session_sched_poll_policy(handle_t sched_ctx, - - last_count = *count; - ret = session_poll_policy_rr(ctx, i, expect, count); -- if (ret) -+ if (unlikely(ret)) - return ret; - - if (expect == *count) -@@ -438,22 +437,34 @@ out: - return; - } - -+static int numa_num_check(__u16 numa_num) -+{ -+ int max_node; -+ -+ max_node = numa_max_node() + 1; -+ if (max_node <= 0) { -+ WD_ERR("invalid: numa max node is %d!\n", max_node); -+ return -WD_EINVAL; -+ } -+ -+ if (!numa_num || numa_num > max_node) { -+ WD_ERR("invalid: numa number is %u!\n", numa_num); -+ return -WD_EINVAL; -+ } -+ -+ return 0; -+} -+ - struct wd_sched *wd_sched_rr_alloc(__u8 sched_type, __u8 type_num, - __u16 numa_num, user_poll_func func) - { - struct wd_sched_info *sched_info; - struct wd_sched_ctx *sched_ctx; - struct wd_sched *sched; -- int i, j, max_node; -- -- max_node = numa_max_node() + 1; -- if (max_node <= 0) -- return NULL; -+ int i, j; - -- if (!numa_num || numa_num > max_node) { -- WD_ERR("invalid: numa number is %u!\n", numa_num); -+ if (numa_num_check(numa_num)) - return NULL; -- } - - if (sched_type >= SCHED_POLICY_BUTT || !type_num) { - WD_ERR("invalid: sched_type is %u or type_num is %u!\n", --- -2.27.0 - diff --git a/0103-wd-sched-modify-default-sched-param.patch b/0103-wd-sched-modify-default-sched-param.patch deleted file mode 100644 index 89ee4f8..0000000 --- a/0103-wd-sched-modify-default-sched-param.patch +++ /dev/null @@ -1,108 +0,0 @@ -From 9dd275d4e67eb7dc6d4ff3cee49e2929bd497b4f Mon Sep 17 00:00:00 2001 -From: Liulongfang -Date: Sat, 2 Apr 2022 09:22:01 +0800 -Subject: [PATCH 113/183] wd/sched: modify default sched param - -In the general scenario, after the scheduler is initialized, the user -wished to use the default scheduling parameters through the default -configuration when initilazing the task session - -Signed-off-by: Liulongfang ---- - wd_sched.c | 42 ++++++++++++++++++++++++++++++++++++++---- - 1 file changed, 38 insertions(+), 4 deletions(-) - -diff --git a/wd_sched.c b/wd_sched.c -index 3a19780..d9a33fc 100644 ---- a/wd_sched.c -+++ b/wd_sched.c -@@ -4,8 +4,10 @@ - * Copyright 2020-2021 Linaro ltd. - */ - -+#define _GNU_SOURCE - #include - #include -+#include - #include - #include "wd_sched.h" - -@@ -19,7 +21,7 @@ enum sched_region_mode { - - /** - * sched_key - The key if schedule region. -- * @numa_id: The numa_id map the hardware. -+ * @numa_id: The schedule numa region id. - * @mode: Sync mode:0, async_mode:1 - * @type: Service type , the value must smaller than type_num. - * @sync_ctxid: alloc ctx id for sync mode -@@ -109,6 +111,7 @@ static struct sched_ctx_region *sched_get_ctx_range(struct wd_sched_ctx *ctx, - { - struct wd_sched_info *sched_info; - int numa_id; -+ int type; - - sched_info = ctx->sched_info; - if (key->numa_id >= 0 && -@@ -117,8 +120,10 @@ static struct sched_ctx_region *sched_get_ctx_range(struct wd_sched_ctx *ctx, - - /* If the key->numa_id is not exist, we should scan for a region */ - for (numa_id = 0; numa_id < ctx->numa_num; numa_id++) { -- if (sched_info[numa_id].ctx_region[key->mode][key->type].valid) -- return &sched_info[numa_id].ctx_region[key->mode][key->type]; -+ for (type = 0; type < ctx->type_num; type++) { -+ if (sched_info[numa_id].ctx_region[key->mode][type].valid) -+ return &sched_info[numa_id].ctx_region[key->mode][type]; -+ } - } - - return NULL; -@@ -285,6 +290,29 @@ static __u32 session_sched_init_ctx(handle_t sched_ctx, - return sched_get_next_pos_rr(region, NULL); - } - -+static int get_nearby_numa_id(handle_t sched_ctx) -+{ -+#define MAX_NUMA_DISTANCE 1024 -+ struct wd_sched_ctx *ctx = (struct wd_sched_ctx *)sched_ctx; -+ struct wd_sched_info *sched_info = ctx->sched_info; -+ int cpu = sched_getcpu(); -+ int node = numa_node_of_cpu(cpu); -+ int dis = MAX_NUMA_DISTANCE; -+ int i, tmp, valid_id = -1; -+ -+ for (i = 0; i < ctx->numa_num; i++) { -+ if (sched_info[i].valid) { -+ tmp = numa_distance(node, i); -+ if (dis > tmp) { -+ valid_id = i; -+ dis = tmp; -+ } -+ } -+ } -+ -+ return valid_id; -+} -+ - handle_t session_sched_init(handle_t h_sched_ctx, void *sched_param) - { - struct sched_params *param = (struct sched_params *)sched_param; -@@ -296,8 +324,14 @@ handle_t session_sched_init(handle_t h_sched_ctx, void *sched_param) - return (handle_t)(-WD_ENOMEM); - } - -- if (!param) { -+ if (!param || param->numa_id < 0) { - memset(skey, 0, sizeof(struct sched_key)); -+ skey->numa_id = get_nearby_numa_id(h_sched_ctx); -+ if (skey->numa_id < 0) { -+ WD_ERR("failed to get valid sched numa region!\n"); -+ free(skey); -+ return (handle_t)(-WD_ENOMEM); -+ } - } else { - skey->type = param->type; - skey->numa_id = param->numa_id; --- -2.27.0 - diff --git a/0104-uadk-update-README.patch b/0104-uadk-update-README.patch deleted file mode 100644 index 3ba58ff..0000000 --- a/0104-uadk-update-README.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 89ce496b9c9f91feb941d6f083771250f886e266 Mon Sep 17 00:00:00 2001 -From: Liulongfang -Date: Wed, 11 May 2022 10:08:22 +0800 -Subject: [PATCH 115/183] uadk: update README - -add simple compilation instructions for uadk - -Signed-off-by: Liulongfang ---- - README | 18 ++++++++++++++++++ - 1 file changed, 18 insertions(+) - -diff --git a/README b/README -index 10804ec..34d45e3 100644 ---- a/README -+++ b/README -@@ -31,6 +31,24 @@ include/* - docs/* - Documentations. - -+Build UADK in native environment -+ -+ $ ./cleanup.sh -+ -+ Make sure that all generated files could be removed. -+ -+ $ ./autogen.sh -+ $ ./conf.sh -+ -+ UADK could be configured as either static or dynamic library by conf.sh. -+ By default, it's configured as dynamic library. -+ -+ $ make -+ $ sudo make install -+ -+ Both dynamic and static libraries would be installed in /usr/local/lib -+ directory. And all head files would be installed in /usr/local/include/uadk -+ directory. - - ====================================== - --- -2.27.0 - diff --git a/0105-uadk-add-BD-id-check-for-sync-mode.patch b/0105-uadk-add-BD-id-check-for-sync-mode.patch deleted file mode 100644 index b20bc1a..0000000 --- a/0105-uadk-add-BD-id-check-for-sync-mode.patch +++ /dev/null @@ -1,406 +0,0 @@ -From 6e4ee881aa5eb420fc101cf7d8970d3ba202d926 Mon Sep 17 00:00:00 2001 -From: Liulongfang -Date: Wed, 11 May 2022 11:44:26 +0800 -Subject: [PATCH 116/183] uadk: add BD id check for sync mode - -In synchronous mode, when multiple threads in a single queue send and -receive messages, if one thread exits the message overtime, other threads -may receive the overtime message, resulting in message misalignment. - -Therefore, we need to add the message sequence number check. if it is -not our own sequence number, it means that the message is received -incorrectly and needs to exit. - -Signed-off-by: Liulongfang ---- - drv/hisi_comp.c | 34 ++++++++++++++++++++++------------ - drv/hisi_hpre.c | 17 +++++++++++++++++ - drv/hisi_qm_udrv.c | 36 ++++++++++++++++++++++++++++++++++++ - drv/hisi_sec.c | 35 +++++++++++++++++++++++++++++++---- - include/drv/wd_dh_drv.h | 2 +- - include/drv/wd_ecc_drv.h | 2 +- - include/drv/wd_rsa_drv.h | 2 +- - include/hisi_qm_udrv.h | 15 +++++++++++++++ - 8 files changed, 124 insertions(+), 19 deletions(-) - -diff --git a/drv/hisi_comp.c b/drv/hisi_comp.c -index 9fdf3f1..e1d2f6e 100644 ---- a/drv/hisi_comp.c -+++ b/drv/hisi_comp.c -@@ -873,6 +873,7 @@ static int hisi_zip_comp_send(handle_t ctx, struct wd_comp_msg *msg, void *priv) - __u16 count = 0; - int ret; - -+ hisi_set_msg_id(h_qp, &msg->tag); - ret = fill_zip_comp_sqe(qp, msg, &sqe); - if (unlikely(ret < 0)) { - WD_ERR("failed to fill zip sqe, ret = %d!\n", ret); -@@ -939,6 +940,22 @@ static void free_hw_sgl(handle_t h_qp, struct hisi_zip_sqe *sqe, - } - } - -+static void get_ctx_buf(struct hisi_zip_sqe *sqe, -+ struct wd_comp_msg *recv_msg) -+{ -+ recv_msg->avail_out = sqe->dest_avail_out; -+ if (VA_ADDR(sqe->stream_ctx_addr_h, sqe->stream_ctx_addr_l)) { -+ /* -+ * In ASYNC mode, recv_msg->ctx_buf is NULL. -+ * recv_msg->ctx_buf is only valid in SYNC mode. -+ * ctx_dwx uses 4 BYTES -+ */ -+ *(__u32 *)recv_msg->ctx_buf = sqe->ctx_dw0; -+ *(__u32 *)(recv_msg->ctx_buf + CTX_DW1_OFFSET) = sqe->ctx_dw1; -+ *(__u32 *)(recv_msg->ctx_buf + CTX_DW2_OFFSET) = sqe->ctx_dw2; -+ } -+} -+ - static int parse_zip_sqe(struct hisi_qp *qp, struct hisi_zip_sqe *sqe, - struct wd_comp_msg *recv_msg) - { -@@ -947,7 +964,7 @@ static int parse_zip_sqe(struct hisi_qp *qp, struct hisi_zip_sqe *sqe, - __u16 lstblk = sqe->dw3 & HZ_LSTBLK_MASK; - __u32 status = sqe->dw3 & HZ_STATUS_MASK; - __u32 type = sqe->dw9 & HZ_REQ_TYPE_MASK; -- int alg_type; -+ int alg_type, ret; - __u32 tag; - - alg_type = get_alg_type(type); -@@ -957,6 +974,9 @@ static int parse_zip_sqe(struct hisi_qp *qp, struct hisi_zip_sqe *sqe, - } - - tag = ops[alg_type].get_tag(sqe); -+ ret = hisi_check_bd_id((handle_t)qp, recv_msg->tag, tag); -+ if (ret) -+ return ret; - - recv_msg->tag = tag; - -@@ -980,17 +1000,7 @@ static int parse_zip_sqe(struct hisi_qp *qp, struct hisi_zip_sqe *sqe, - - ops[alg_type].get_data_size(sqe, qp->q_info.qc_type, recv_msg); - -- recv_msg->avail_out = sqe->dest_avail_out; -- if (VA_ADDR(sqe->stream_ctx_addr_h, sqe->stream_ctx_addr_l)) { -- /* -- * In ASYNC mode, recv_msg->ctx_buf is NULL. -- * recv_msg->ctx_buf is only valid in SYNC mode. -- * ctx_dwx uses 4 BYTES -- */ -- *(__u32 *)recv_msg->ctx_buf = sqe->ctx_dw0; -- *(__u32 *)(recv_msg->ctx_buf + CTX_DW1_OFFSET) = sqe->ctx_dw1; -- *(__u32 *)(recv_msg->ctx_buf + CTX_DW2_OFFSET) = sqe->ctx_dw2; -- } -+ get_ctx_buf(sqe, recv_msg); - - /* last block no space, need resend null size req */ - if (ctx_st == HZ_DECOMP_NO_SPACE) -diff --git a/drv/hisi_hpre.c b/drv/hisi_hpre.c -index 7e14027..33127e0 100644 ---- a/drv/hisi_hpre.c -+++ b/drv/hisi_hpre.c -@@ -528,6 +528,7 @@ static int rsa_send(handle_t ctx, struct wd_rsa_msg *msg) - if (ret < 0) - return ret; - -+ hisi_set_msg_id(h_qp, &msg->tag); - hw_msg.done = 0x1; - hw_msg.etype = 0x0; - hw_msg.low_tag = msg->tag; -@@ -546,6 +547,10 @@ static int rsa_recv(handle_t ctx, struct wd_rsa_msg *msg) - if (ret < 0) - return ret; - -+ ret = hisi_check_bd_id(h_qp, msg->tag, hw_msg.low_tag); -+ if (ret) -+ return ret; -+ - if (hw_msg.done != HPRE_HW_TASK_DONE || - hw_msg.etype || hw_msg.etype1) { - WD_ERR("failed to do rsa task! done=0x%x, etype=0x%x, etype1=0x%x!\n", -@@ -668,6 +673,7 @@ static int dh_send(handle_t ctx, struct wd_dh_msg *msg) - if (ret) - return ret; - -+ hisi_set_msg_id(h_qp, &msg->tag); - hw_msg.low_out = LW_U32((uintptr_t)req->pri); - hw_msg.hi_out = HI_U32((uintptr_t)req->pri); - hw_msg.done = 0x1; -@@ -688,6 +694,10 @@ static int dh_recv(handle_t ctx, struct wd_dh_msg *msg) - if (ret < 0) - return ret; - -+ ret = hisi_check_bd_id(h_qp, msg->tag, hw_msg.low_tag); -+ if (ret) -+ return ret; -+ - if (hw_msg.done != HPRE_HW_TASK_DONE || - hw_msg.etype || hw_msg.etype1) { - WD_ERR("failed to do dh task! done=0x%x, etype=0x%x, etype1=0x%x!\n", -@@ -1766,6 +1776,9 @@ free_dst: - - static int ecc_send(handle_t ctx, struct wd_ecc_msg *msg) - { -+ handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); -+ -+ hisi_set_msg_id(h_qp, &msg->tag); - if (msg->req.op_type == WD_SM2_ENCRYPT) - return sm2_enc_send(ctx, msg); - else if (msg->req.op_type == WD_SM2_DECRYPT) -@@ -2333,6 +2346,10 @@ static int ecc_recv(handle_t ctx, struct wd_ecc_msg *msg) - if (ret) - return ret; - -+ ret = hisi_check_bd_id(h_qp, msg->tag, hw_msg.low_tag); -+ if (ret) -+ return ret; -+ - if (hw_msg.alg == HPRE_ALG_ECDH_MULTIPLY && - hw_msg.sm2_mlen == HPRE_SM2_ENC) - return sm2_enc_parse(h_qp, msg, &hw_msg); -diff --git a/drv/hisi_qm_udrv.c b/drv/hisi_qm_udrv.c -index 2c0d87c..53d5a55 100644 ---- a/drv/hisi_qm_udrv.c -+++ b/drv/hisi_qm_udrv.c -@@ -528,6 +528,42 @@ int hisi_qm_recv(handle_t h_qp, void *resp, __u16 expect, __u16 *count) - return ret; - } - -+int hisi_check_bd_id(handle_t h_qp, __u32 mid, __u32 bid) -+{ -+ struct hisi_qp *qp = (struct hisi_qp *)h_qp; -+ __u8 mode = qp->q_info.qp_mode; -+ -+ if (mode == CTX_MODE_SYNC && mid != bid) { -+ WD_ERR("failed to recv self bd, send id: %u, recv id: %u\n", -+ mid, bid); -+ return -WD_EINVAL; -+ } -+ -+ return 0; -+} -+ -+void hisi_set_msg_id(handle_t h_qp, __u32 *tag) -+{ -+ static __thread __u64 rand_seed = 0x330eabcd; -+ struct hisi_qp *qp = (struct hisi_qp *)h_qp; -+ __u8 mode = qp->q_info.qp_mode; -+ __u16 seeds[3] = {0}; -+ __u64 id; -+ -+ /* -+ * The random message id on a single queue is obtained through the -+ * system's pseudo-random number generation algorithm to ensure -+ * that 1024 packets on a queue will not have duplicate id -+ */ -+ if (mode == CTX_MODE_SYNC) { -+ seeds[0] = LW_U16(rand_seed); -+ seeds[1] = LW_U16(rand_seed >> 16); -+ id = nrand48(seeds); -+ *tag = LW_U32(id); -+ rand_seed = id; -+ } -+} -+ - static void *hisi_qm_create_sgl(__u32 sge_num) - { - void *sgl; -diff --git a/drv/hisi_sec.c b/drv/hisi_sec.c -index 396e11e..88eacc3 100644 ---- a/drv/hisi_sec.c -+++ b/drv/hisi_sec.c -@@ -929,6 +929,7 @@ int hisi_sec_cipher_send(handle_t ctx, struct wd_cipher_msg *msg) - return ret; - } - -+ hisi_set_msg_id(h_qp, &msg->tag); - sqe.type2.clen_ivhlen |= (__u32)msg->in_bytes; - sqe.type2.tag = (__u16)msg->tag; - fill_cipher_bd2_addr(msg, &sqe); -@@ -959,6 +960,10 @@ int hisi_sec_cipher_recv(handle_t ctx, struct wd_cipher_msg *recv_msg) - if (ret < 0) - return ret; - -+ ret = hisi_check_bd_id(h_qp, (__u16)recv_msg->tag, sqe.type2.tag); -+ if (ret) -+ return ret; -+ - parse_cipher_bd2(&sqe, recv_msg); - recv_msg->tag = sqe.type2.tag; - -@@ -1130,6 +1135,7 @@ int hisi_sec_cipher_send_v3(handle_t ctx, struct wd_cipher_msg *msg) - return ret; - } - -+ hisi_set_msg_id(h_qp, &msg->tag); - sqe.c_len_ivin = (__u32)msg->in_bytes; - sqe.tag = (__u64)(uintptr_t)msg->tag; - fill_cipher_bd3_addr(msg, &sqe); -@@ -1187,6 +1193,10 @@ int hisi_sec_cipher_recv_v3(handle_t ctx, struct wd_cipher_msg *recv_msg) - if (ret < 0) - return ret; - -+ ret = hisi_check_bd_id(h_qp, recv_msg->tag, sqe.tag); -+ if (ret) -+ return ret; -+ - parse_cipher_bd3(&sqe, recv_msg); - recv_msg->tag = sqe.tag; - -@@ -1366,7 +1376,8 @@ int hisi_sec_digest_send(handle_t ctx, struct wd_digest_msg *msg) - - qm_fill_digest_long_bd(msg, &sqe); - -- sqe.type2.tag = msg->tag; -+ hisi_set_msg_id(h_qp, &msg->tag); -+ sqe.type2.tag = (__u16)msg->tag; - ret = hisi_qm_send(h_qp, &sqe, 1, &count); - if (ret < 0) { - if (ret != -WD_EBUSY) -@@ -1395,6 +1406,10 @@ int hisi_sec_digest_recv(handle_t ctx, struct wd_digest_msg *recv_msg) - if (ret < 0) - return ret; - -+ ret = hisi_check_bd_id(h_qp, (__u16)recv_msg->tag, sqe.type2.tag); -+ if (ret) -+ return ret; -+ - parse_digest_bd2(&sqe, recv_msg); - - if (recv_msg->data_fmt == WD_SGL_BUF) -@@ -1515,6 +1530,7 @@ int hisi_sec_digest_send_v3(handle_t ctx, struct wd_digest_msg *msg) - - qm_fill_digest_long_bd3(msg, &sqe); - -+ hisi_set_msg_id(h_qp, &msg->tag); - sqe.tag = (__u64)(uintptr_t)msg->tag; - - ret = hisi_qm_send(h_qp, &sqe, 1, &count); -@@ -1566,6 +1582,10 @@ int hisi_sec_digest_recv_v3(handle_t ctx, struct wd_digest_msg *recv_msg) - if (ret < 0) - return ret; - -+ ret = hisi_check_bd_id(h_qp, recv_msg->tag, sqe.tag); -+ if (ret) -+ return ret; -+ - parse_digest_bd3(&sqe, recv_msg); - - if (recv_msg->data_fmt == WD_SGL_BUF) -@@ -1851,7 +1871,7 @@ int hisi_sec_aead_send(handle_t ctx, struct wd_aead_msg *msg) - } - - fill_aead_bd2_addr(msg, &sqe); -- -+ hisi_set_msg_id(h_qp, &msg->tag); - sqe.type2.tag = (__u16)msg->tag; - - ret = hisi_qm_send(h_qp, &sqe, 1, &count); -@@ -1912,6 +1932,10 @@ int hisi_sec_aead_recv(handle_t ctx, struct wd_aead_msg *recv_msg) - if (ret < 0) - return ret; - -+ ret = hisi_check_bd_id(h_qp, (__u16)recv_msg->tag, sqe.type2.tag); -+ if (ret) -+ return ret; -+ - parse_aead_bd2(&sqe, recv_msg); - - if (recv_msg->data_fmt == WD_SGL_BUF) -@@ -2078,7 +2102,6 @@ static int fill_aead_bd3(struct wd_aead_msg *msg, struct hisi_sec_sqe3 *sqe) - return 0; - } - -- - int hisi_sec_aead_send_v3(handle_t ctx, struct wd_aead_msg *msg) - { - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); -@@ -2108,7 +2131,7 @@ int hisi_sec_aead_send_v3(handle_t ctx, struct wd_aead_msg *msg) - } - - fill_aead_bd3_addr(msg, &sqe); -- -+ hisi_set_msg_id(h_qp, &msg->tag); - sqe.tag = msg->tag; - ret = hisi_qm_send(h_qp, &sqe, 1, &count); - if (ret < 0) { -@@ -2168,6 +2191,10 @@ int hisi_sec_aead_recv_v3(handle_t ctx, struct wd_aead_msg *recv_msg) - if (ret < 0) - return ret; - -+ ret = hisi_check_bd_id(h_qp, recv_msg->tag, sqe.tag); -+ if (ret) -+ return ret; -+ - parse_aead_bd3(&sqe, recv_msg); - - if (recv_msg->data_fmt == WD_SGL_BUF) -diff --git a/include/drv/wd_dh_drv.h b/include/drv/wd_dh_drv.h -index 5d436d1..0d3fb2b 100644 ---- a/include/drv/wd_dh_drv.h -+++ b/include/drv/wd_dh_drv.h -@@ -13,7 +13,7 @@ extern "C" { - /* DH message format */ - struct wd_dh_msg { - struct wd_dh_req req; -- __u64 tag; /* User-defined request identifier */ -+ __u32 tag; /* User-defined request identifier */ - void *g; - __u16 gbytes; - __u16 key_bytes; /* Input key bytes */ -diff --git a/include/drv/wd_ecc_drv.h b/include/drv/wd_ecc_drv.h -index 7e0d27e..66ed641 100644 ---- a/include/drv/wd_ecc_drv.h -+++ b/include/drv/wd_ecc_drv.h -@@ -48,7 +48,7 @@ extern "C" { - struct wd_ecc_msg { - struct wd_ecc_req req; - struct wd_hash_mt hash; -- __u64 tag; /* User-defined request identifier */ -+ __u32 tag; /* User-defined request identifier */ - __u8 *key; /* Input key VA, should be DMA buffer */ - __u16 key_bytes; /* key bytes */ - __u8 curve_id; /* Ec curve denoted by enum wd_ecc_curve_type */ -diff --git a/include/drv/wd_rsa_drv.h b/include/drv/wd_rsa_drv.h -index 948625f..837420e 100644 ---- a/include/drv/wd_rsa_drv.h -+++ b/include/drv/wd_rsa_drv.h -@@ -39,7 +39,7 @@ struct wd_rsa_kg_out { - /* RSA message format */ - struct wd_rsa_msg { - struct wd_rsa_req req; -- __u64 tag; /* User-defined request identifier */ -+ __u32 tag; /* User-defined request identifier */ - __u16 key_bytes; /* Input key bytes */ - __u8 key_type; /* Denoted by enum wd_rsa_key_type */ - __u8 result; /* Data format, denoted by WD error code */ -diff --git a/include/hisi_qm_udrv.h b/include/hisi_qm_udrv.h -index 68de837..773f57b 100644 ---- a/include/hisi_qm_udrv.h -+++ b/include/hisi_qm_udrv.h -@@ -116,6 +116,21 @@ int hisi_qm_recv(handle_t h_qp, void *resp, __u16 expect, __u16 *count); - handle_t hisi_qm_alloc_qp(struct hisi_qm_priv *config, handle_t ctx); - void hisi_qm_free_qp(handle_t h_qp); - -+/** -+ * hisi_check_bd_id - Check the SQE BD's id and send msg id. -+ * @h_qp: Handle of the qp. -+ * @mid: send message id. -+ * @bid: recv BD id. -+ */ -+int hisi_check_bd_id(handle_t h_qp, __u32 mid, __u32 bid); -+ -+/** -+ * hisi_set_msg_id - set the message tag id. -+ * @h_qp: Handle of the qp. -+ * @tag: the message tag id. -+ */ -+void hisi_set_msg_id(handle_t h_qp, __u32 *tag); -+ - /** - * hisi_qm_create_sglpool - Create sgl pool in qm. - * @sgl_num: the sgl number. --- -2.27.0 - diff --git a/0106-uadk-ecc-optimize-create_ecc_out-line.patch b/0106-uadk-ecc-optimize-create_ecc_out-line.patch deleted file mode 100644 index 4e0e63c..0000000 --- a/0106-uadk-ecc-optimize-create_ecc_out-line.patch +++ /dev/null @@ -1,80 +0,0 @@ -From f2b3a8ce0f30c0902ae93edbea5bccd87a166116 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sun, 24 Apr 2022 09:54:22 +0800 -Subject: [PATCH 117/183] uadk: ecc: optimize create_ecc_out line - -ecc function statements can be simplified. - -Signed-off-by: Wenkai Lin ---- - wd_ecc.c | 25 +++---------------------- - 1 file changed, 3 insertions(+), 22 deletions(-) - -diff --git a/wd_ecc.c b/wd_ecc.c -index a6c2209..671b62d 100644 ---- a/wd_ecc.c -+++ b/wd_ecc.c -@@ -1284,18 +1284,12 @@ set_param_error: - - struct wd_ecc_out *wd_ecxdh_new_out(handle_t sess) - { -- struct wd_ecc_out *ecc_out; -- - if (!sess) { - WD_ERR("invalid: new ecc dh out sess NULL!\n"); - return NULL; - } - -- ecc_out = create_ecc_out((struct wd_ecc_sess *)sess, ECDH_OUT_PARAM_NUM); -- if (!ecc_out) -- return NULL; -- -- return ecc_out; -+ return create_ecc_out((struct wd_ecc_sess *)sess, ECDH_OUT_PARAM_NUM); - } - - void wd_ecxdh_get_out_params(struct wd_ecc_out *out, struct wd_ecc_point **key) -@@ -1881,18 +1875,12 @@ struct wd_ecc_in *wd_sm2_new_verf_in(handle_t sess, - - static struct wd_ecc_out *wd_ecc_new_sign_out(struct wd_ecc_sess *sess) - { -- struct wd_ecc_out *ecc_out; -- - if (!sess) { - WD_ERR("invalid: new ecc sout ctx NULL!\n"); - return NULL; - } - -- ecc_out = create_ecc_out(sess, ECC_SIGN_OUT_PARAM_NUM); -- if (!ecc_out) -- return NULL; -- -- return ecc_out; -+ return create_ecc_out(sess, ECC_SIGN_OUT_PARAM_NUM); - } - - struct wd_ecc_out *wd_sm2_new_sign_out(handle_t sess) -@@ -1902,19 +1890,12 @@ struct wd_ecc_out *wd_sm2_new_sign_out(handle_t sess) - - struct wd_ecc_out *wd_sm2_new_kg_out(handle_t sess) - { -- struct wd_ecc_out *ecc_out; -- - if (!sess) { - WD_ERR("invalid: new sm2 kg out sess NULL!\n"); - return NULL; - } - -- ecc_out = create_ecc_out((struct wd_ecc_sess *)sess, -- SM2_KG_OUT_PARAM_NUM); -- if (!ecc_out) -- return NULL; -- -- return ecc_out; -+ return create_ecc_out((struct wd_ecc_sess *)sess, SM2_KG_OUT_PARAM_NUM); - } - - void wd_sm2_get_kg_out_params(struct wd_ecc_out *out, --- -2.27.0 - diff --git a/0107-uadk-fix-parameter-of-function-has-different-name.patch b/0107-uadk-fix-parameter-of-function-has-different-name.patch deleted file mode 100644 index 5d2fbc5..0000000 --- a/0107-uadk-fix-parameter-of-function-has-different-name.patch +++ /dev/null @@ -1,344 +0,0 @@ -From a43bac94144b6bb59a992a3781e5367f67a2af79 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sun, 24 Apr 2022 09:54:23 +0800 -Subject: [PATCH 118/183] uadk: fix parameter of function has different name - -Parameter of function has different name than previous -declaration of header, so fix them. - -Signed-off-by: Wenkai Lin ---- - include/wd_aead.h | 4 ++-- - include/wd_cipher.h | 4 ++-- - include/wd_comp.h | 4 ++-- - include/wd_digest.h | 4 ++-- - include/wd_ecc.h | 4 ++-- - include/wd_rsa.h | 4 ++-- - include/wd_util.h | 27 +++++++++++++++------------ - v1/drv/hisi_hpre_udrv.h | 2 +- - v1/drv/hisi_qm_udrv.h | 2 +- - v1/drv/hisi_zip_udrv.h | 2 +- - v1/wd_aead.h | 10 +++++----- - v1/wd_cipher.h | 4 ++-- - v1/wd_digest.h | 4 ++-- - 13 files changed, 39 insertions(+), 36 deletions(-) - -diff --git a/include/wd_aead.h b/include/wd_aead.h -index a632cd8..3840062 100644 ---- a/include/wd_aead.h -+++ b/include/wd_aead.h -@@ -161,11 +161,11 @@ int wd_aead_get_maxauthsize(handle_t h_sess); - - /** - * wd_aead_poll_ctx() poll operation for asynchronous operation -- * @index: index of ctx which will be polled. -+ * @idx: index of ctx which will be polled. - * @expt: user expected num respondences - * @count: how many respondences this poll has to get. - */ --int wd_aead_poll_ctx(__u32 index, __u32 expt, __u32* count); -+int wd_aead_poll_ctx(__u32 idx, __u32 expt, __u32 *count); - - /** - * wd_aead_poll() Poll finished request. -diff --git a/include/wd_cipher.h b/include/wd_cipher.h -index 660d7e8..127cd45 100644 ---- a/include/wd_cipher.h -+++ b/include/wd_cipher.h -@@ -135,11 +135,11 @@ int wd_do_cipher_sync(handle_t h_sess, struct wd_cipher_req *req); - int wd_do_cipher_async(handle_t h_sess, struct wd_cipher_req *req); - /** - * wd_cipher_poll_ctx() poll operation for asynchronous operation -- * @index: index of ctx which will be polled. -+ * @idx: index of ctx which will be polled. - * @expt: user expected num respondences - * @count: how many respondences this poll has to get. - */ --int wd_cipher_poll_ctx(__u32 index, __u32 expt, __u32* count); -+int wd_cipher_poll_ctx(__u32 idx, __u32 expt, __u32 *count); - /** - * wd_cipher_poll() Poll finished request. - * this function will call poll_policy function which is registered to wd cipher -diff --git a/include/wd_comp.h b/include/wd_comp.h -index 460cfa7..5688b8b 100644 ---- a/include/wd_comp.h -+++ b/include/wd_comp.h -@@ -154,7 +154,7 @@ int wd_do_comp_async(handle_t h_sess, struct wd_comp_req *req); - - /** - * wd_comp_poll_ctx() - Poll a ctx. -- * @index: The index of ctx which will be polled. -+ * @idx: The index of ctx which will be polled. - * @expt: Max number of requests to poll. If 0, polled all finished - * requests in this ctx. - * @count: Return the number of polled requests finally. -@@ -163,7 +163,7 @@ int wd_do_comp_async(handle_t h_sess, struct wd_comp_req *req); - * User defines polling policy in poll_policiy, when it needs to poll a - * specific ctx, this function should be used. - */ --int wd_comp_poll_ctx(__u32 index, __u32 expt, __u32 *count); -+int wd_comp_poll_ctx(__u32 idx, __u32 expt, __u32 *count); - - int wd_comp_poll(__u32 expt, __u32 *count); - -diff --git a/include/wd_digest.h b/include/wd_digest.h -index 7e93a80..92b9a4f 100644 ---- a/include/wd_digest.h -+++ b/include/wd_digest.h -@@ -157,11 +157,11 @@ int wd_digest_set_key(handle_t h_sess, const __u8 *key, __u32 key_len); - - /** - * wd_digest_poll() - Poll operation for asynchronous operation. -- * @index: index of ctx which will be polled. -+ * @idx: index of ctx which will be polled. - * @expt: Count of polling - * @count: recv poll nums. - */ --int wd_digest_poll_ctx(__u32 index, __u32 expt, __u32 *count); -+int wd_digest_poll_ctx(__u32 idx, __u32 expt, __u32 *count); - - /** - * wd_digest_poll() - Poll operation for asynchronous operation. -diff --git a/include/wd_ecc.h b/include/wd_ecc.h -index 43b9c89..5aaec23 100644 ---- a/include/wd_ecc.h -+++ b/include/wd_ecc.h -@@ -458,10 +458,10 @@ int wd_ecc_poll(__u32 expt, __u32 *count); - - /** - * wd_do_ecc() - Send a sync eccression request. -- * @sess: The session which request will be sent to. -+ * @h_sess: The session which request will be sent to. - * @req: Request. - */ --int wd_do_ecc_sync(handle_t sess, struct wd_ecc_req *req); -+int wd_do_ecc_sync(handle_t h_sess, struct wd_ecc_req *req); - - /** - * wd_do_ecc_async() - Send an async eccression request. -diff --git a/include/wd_rsa.h b/include/wd_rsa.h -index 0978b79..ef7a12c 100644 ---- a/include/wd_rsa.h -+++ b/include/wd_rsa.h -@@ -143,10 +143,10 @@ int wd_rsa_poll(__u32 expt, __u32 *count); - - /** - * wd_do_rsa() - Send a sync rsaression request. -- * @sess: The session which request will be sent to. -+ * @h_sess: The session which request will be sent to. - * @req: Request. - */ --int wd_do_rsa_sync(handle_t sess, struct wd_rsa_req *req); -+int wd_do_rsa_sync(handle_t h_sess, struct wd_rsa_req *req); - - /** - * wd_do_rsa_async() - Send an async rsaression request. -diff --git a/include/wd_util.h b/include/wd_util.h -index a41b4c9..7fe3d72 100644 ---- a/include/wd_util.h -+++ b/include/wd_util.h -@@ -168,7 +168,7 @@ void wd_uninit_async_request_pool(struct wd_async_msg_pool *pool); - /* - * wd_get_msg_from_pool() - Get a free message from pool. - * @pool: Pointer of global pools. -- * @index: Index of pool. Should be 0 ~ (pool_num - 1). -+ * @ctx_idx: Index of pool. Should be 0 ~ (pool_num - 1). - * @msg: Put pointer of got message into *msg. - * - * Return tag of got message. This tag can be used to put a message and -@@ -177,25 +177,28 @@ void wd_uninit_async_request_pool(struct wd_async_msg_pool *pool); - * be used to avoid possible error; -WD_EBUSY will return if related message pool - * is full. - */ --int wd_get_msg_from_pool(struct wd_async_msg_pool *pool, int index, void **msg); -+int wd_get_msg_from_pool(struct wd_async_msg_pool *pool, int ctx_idx, -+ void **msg); - - /* - * wd_put_msg_to_pool() - Put a message to pool. - * @pool: Pointer of global pools. -- * @index: Index of pool. Should be 0 ~ (pool_num - 1). -+ * @ctx_idx: Index of pool. Should be 0 ~ (pool_num - 1). - * @tag: Tag of put message. - */ --void wd_put_msg_to_pool(struct wd_async_msg_pool *pool, int index, __u32 tag); -+void wd_put_msg_to_pool(struct wd_async_msg_pool *pool, int ctx_idx, -+ __u32 tag); - - /* - * wd_find_msg_in_pool() - Find a message in pool. - * @pool: Pointer of global pools. -- * @index: Index of pool. Should be 0 ~ (pool_num - 1). -+ * @ctx_idx: Index of pool. Should be 0 ~ (pool_num - 1). - * @tag: Tag of expected message. - * - * Return pointer of message whose tag is input tag. - */ --void *wd_find_msg_in_pool(struct wd_async_msg_pool *pool, int index, __u32 tag); -+void *wd_find_msg_in_pool(struct wd_async_msg_pool *pool, int ctx_idx, -+ __u32 tag); - - /* - * wd_check_datalist() - Check the data list length -@@ -243,7 +246,7 @@ int wd_parse_async_poll_num(struct wd_env_config *config, const char *s); - * wd_alg_env_init() - Init wd algorithm environment variable configurations. - * This is a help function which can be used by specific - * wd algorithm APIs. -- * @config: Pointer of wd_env_config which is used to store environment -+ * @env_config: Pointer of wd_env_config which is used to store environment - * variable information. - * @table: Table which is used to define specific environment variable、its - * default value and related parsing operations. -@@ -251,7 +254,7 @@ int wd_parse_async_poll_num(struct wd_env_config *config, const char *s); - * environment init. - * @table_size: Size of above table. - */ --int wd_alg_env_init(struct wd_env_config *config, -+int wd_alg_env_init(struct wd_env_config *env_config, - const struct wd_config_variable *table, - const struct wd_alg_ops *ops, - __u32 table_size, -@@ -272,9 +275,9 @@ void wd_alg_env_uninit(struct wd_env_config *env_config, - * task queue. - * @config: Pointer of wd_env_config which is used to store environment - * variable information. -- * @index: Index of ctx in config. -+ * @idx: Index of ctx in config. - */ --int wd_add_task_to_async_queue(struct wd_env_config *config, __u32 index); -+int wd_add_task_to_async_queue(struct wd_env_config *config, __u32 idx); - - /* - * dump_env_info() - dump wd algorithm ctx info. -@@ -287,12 +290,12 @@ void dump_env_info(struct wd_env_config *config); - * wd_alg_get_env_param() - get specific ctx number. - * @config: Pointer of wd_env_config which is used to store environment - * variable information. -- * @ctx_attr: ctx attributes. -+ * @attr: ctx attributes. - * @num: save ctx number. - * @is_enable: save enable inner poll flag. - */ - int wd_alg_get_env_param(struct wd_env_config *env_config, -- struct wd_ctx_attr ctx_attr, -+ struct wd_ctx_attr attr, - __u32 *num, __u8 *is_enable); - - /* -diff --git a/v1/drv/hisi_hpre_udrv.h b/v1/drv/hisi_hpre_udrv.h -index d84c4c7..632ad28 100644 ---- a/v1/drv/hisi_hpre_udrv.h -+++ b/v1/drv/hisi_hpre_udrv.h -@@ -83,6 +83,6 @@ int qm_fill_rsa_sqe(void *message, struct qm_queue_info *info, __u16 i); - int qm_parse_rsa_sqe(void *msg, const struct qm_queue_info *info, - __u16 i, __u16 usr); - int qm_fill_ecc_sqe(void *message, struct qm_queue_info *info, __u16 i); --int qm_parse_ecc_sqe(void *msg, const struct qm_queue_info *info, -+int qm_parse_ecc_sqe(void *message, const struct qm_queue_info *info, - __u16 i, __u16 usr); - #endif -diff --git a/v1/drv/hisi_qm_udrv.h b/v1/drv/hisi_qm_udrv.h -index 3707c7d..588da00 100644 ---- a/v1/drv/hisi_qm_udrv.h -+++ b/v1/drv/hisi_qm_udrv.h -@@ -174,7 +174,7 @@ struct hisi_qm_inject_op { - - int qm_init_queue(struct wd_queue *q); - void qm_uninit_queue(struct wd_queue *q); --int qm_send(struct wd_queue *q, void **msg, __u32 num); -+int qm_send(struct wd_queue *q, void **req, __u32 num); - int qm_recv(struct wd_queue *q, void **resp, __u32 num); - int hisi_qm_inject_op_register(struct wd_queue *q, struct hisi_qm_inject_op *op); - int qm_get_hwsgl_info(struct wd_queue *q, struct hw_sgl_info *sgl_info); -diff --git a/v1/drv/hisi_zip_udrv.h b/v1/drv/hisi_zip_udrv.h -index 4246342..c93b01a 100644 ---- a/v1/drv/hisi_zip_udrv.h -+++ b/v1/drv/hisi_zip_udrv.h -@@ -125,7 +125,7 @@ struct hisi_zip_sqe_v3 { - #define HZ_REQ_TYPE_MASK 0xff - - int qm_fill_zip_sqe(void *smsg, struct qm_queue_info *info, __u16 i); --int qm_parse_zip_sqe(void *msg, const struct qm_queue_info *info, -+int qm_parse_zip_sqe(void *hw_msg, const struct qm_queue_info *info, - __u16 i, __u16 usr); - int qm_fill_zip_sqe_v3(void *smsg, struct qm_queue_info *info, __u16 i); - int qm_parse_zip_sqe_v3(void *msg, const struct qm_queue_info *info, -diff --git a/v1/wd_aead.h b/v1/wd_aead.h -index 4cc1081..ae5697b 100644 ---- a/v1/wd_aead.h -+++ b/v1/wd_aead.h -@@ -142,7 +142,7 @@ void *wcrypto_create_aead_ctx(struct wd_queue *q, - * @key: cipher key addr - * @key_len: cipher key length - */ --int wcrypto_set_aead_ckey(void *ctx, __u8 *ckey, __u16 key_len); -+int wcrypto_set_aead_ckey(void *ctx, __u8 *key, __u16 key_len); - - /** - * wcrypto_set_aead_akey() - set authenticate key to aead context. -@@ -150,7 +150,7 @@ int wcrypto_set_aead_ckey(void *ctx, __u8 *ckey, __u16 key_len); - * @key: authenticate key addr - * @key_len: authenticate key length - */ --int wcrypto_set_aead_akey(void *ctx, __u8 *akey, __u16 key_len); -+int wcrypto_set_aead_akey(void *ctx, __u8 *key, __u16 key_len); - - /** - * wcrypto_aead_setauthsize() - set aead authsize to aead context. -@@ -184,13 +184,13 @@ int wcrypto_do_aead(void *ctx, struct wcrypto_aead_op_data *opdata, - - /** - * wcrypto_burst_aead() - (a)synchronous multiple aead operations -- * @ctx: context of user, created by wcrypto_create_aead_ctx. -+ * @a_ctx: context of user, created by wcrypto_create_aead_ctx. - * @opdata: operational data - * @tag: asynchronous:user_tag; synchronous:NULL. - * @num: operations number per calling, maximum number is WCRYPTO_MAX_BURST_NUM. - */ --int wcrypto_burst_aead(void *ctx, struct wcrypto_aead_op_data **opdata, -- void **tag, __u32 num); -+int wcrypto_burst_aead(void *a_ctx, struct wcrypto_aead_op_data **opdata, -+ void **tag, __u32 num); - - /** - * wcrypto_aead_poll() - poll operation for asynchronous operation -diff --git a/v1/wd_cipher.h b/v1/wd_cipher.h -index 7059f53..591a590 100644 ---- a/v1/wd_cipher.h -+++ b/v1/wd_cipher.h -@@ -151,11 +151,11 @@ void wcrypto_del_cipher_ctx(void *ctx); - /** - * wcrypto_burst_cipher() - (a)synchronous multiple cipher operations - * @ctx: context of user, created by wcrypto_create_cipher_ctx. -- * @opdata: operational data -+ * @c_opdata: operational data - * @tag: asynchronous:user_tag; synchronous:NULL. - * @num: operations number per calling, maximum number is WCRYPTO_MAX_BURST_NUM. - */ --int wcrypto_burst_cipher(void *ctx, struct wcrypto_cipher_op_data **opdata, -+int wcrypto_burst_cipher(void *ctx, struct wcrypto_cipher_op_data **c_opdata, - void **tag, __u32 num); - - #ifdef __cplusplus -diff --git a/v1/wd_digest.h b/v1/wd_digest.h -index b9b98fe..6ad4c85 100644 ---- a/v1/wd_digest.h -+++ b/v1/wd_digest.h -@@ -152,12 +152,12 @@ void wcrypto_del_digest_ctx(void *ctx); - - /** - * wcrypto_burst_digest() - (a)synchronous multiple digest operations -- * @ctx: context of user, created by wcrypto_create_digest_ctx. -+ * @d_ctx: context of user, created by wcrypto_create_digest_ctx. - * @opdata: operational data - * @tag: asynchronous:user_tag; synchronous:NULL. - * @num: operations number per calling, maximum number is WCRYPTO_MAX_BURST_NUM. - */ --int wcrypto_burst_digest(void *ctx, struct wcrypto_digest_op_data **opdata, -+int wcrypto_burst_digest(void *d_ctx, struct wcrypto_digest_op_data **opdata, - void **tag, __u32 num); - - #ifdef __cplusplus --- -2.27.0 - diff --git a/0108-uadk-ecc-fix-local-variable-referenced-in-macro.patch b/0108-uadk-ecc-fix-local-variable-referenced-in-macro.patch deleted file mode 100644 index 305741f..0000000 --- a/0108-uadk-ecc-fix-local-variable-referenced-in-macro.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 91d11133e1f6d79e38da014123ddd0b0dc132be6 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sun, 24 Apr 2022 09:54:24 +0800 -Subject: [PATCH 119/183] uadk: ecc: fix local variable referenced in macro - -REGULAR_LEN is is calculated by multiplying the key length -by the constant parameter num, use CURVE_PARAM_NUM is better. - -Signed-off-by: Wenkai Lin ---- - v1/wd_ecc.c | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/v1/wd_ecc.c b/v1/wd_ecc.c -index 2358243..e2837bd 100644 ---- a/v1/wd_ecc.c -+++ b/v1/wd_ecc.c -@@ -1822,9 +1822,8 @@ static int sm2_compute_za_hash(__u8 *za, __u32 *len, struct wd_dtb *id, - id_bytes = id->dsize; - } - --#define REGULAR_LENS (6 * key_size) /* a b xG yG xA yA */ - /* ZA = h(ENTL || ID || a || b || xG || yG || xA || yA) */ -- lens = sizeof(__u16) + id_bytes + REGULAR_LENS; -+ lens = sizeof(__u16) + id_bytes + CURVE_PARAM_NUM * key_size; - p_in = malloc(lens); - if (unlikely(!p_in)) - return -WD_ENOMEM; --- -2.27.0 - diff --git a/0109-uadk-fix-switch-statement-has-no-default-branch.patch b/0109-uadk-fix-switch-statement-has-no-default-branch.patch deleted file mode 100644 index 9352164..0000000 --- a/0109-uadk-fix-switch-statement-has-no-default-branch.patch +++ /dev/null @@ -1,44 +0,0 @@ -From af330daeb1d215c312e0e4ff74cb4bc5f0f35cad Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sun, 24 Apr 2022 09:54:25 +0800 -Subject: [PATCH 120/183] uadk: fix switch statement has no default branch - -msg->op_type is non-enumeral type '__u8', so switch statement -on it should have a default branch. - -Signed-off-by: Wenkai Lin ---- - drv/hisi_hpre.c | 3 ++- - v1/drv/hisi_hpre_udrv.c | 2 ++ - 2 files changed, 4 insertions(+), 1 deletion(-) - -diff --git a/drv/hisi_hpre.c b/drv/hisi_hpre.c -index 33127e0..2a15900 100644 ---- a/drv/hisi_hpre.c -+++ b/drv/hisi_hpre.c -@@ -1330,7 +1330,8 @@ static int ecc_prepare_out(struct wd_ecc_msg *msg, void **data) - case WD_SM2_KG: - *data = kout->pub.x.data; - break; -- /* fall-through */ -+ default: -+ break; - } - - return ret; -diff --git a/v1/drv/hisi_hpre_udrv.c b/v1/drv/hisi_hpre_udrv.c -index bd87cbe..3d8a00f 100644 ---- a/v1/drv/hisi_hpre_udrv.c -+++ b/v1/drv/hisi_hpre_udrv.c -@@ -1466,6 +1466,8 @@ static int qm_ecc_prepare_out(struct wcrypto_ecc_msg *msg, void **data) - case WCRYPTO_SM2_KG: - ret = ecc_prepare_sm2_kg_out(out, data); - break; -+ default: -+ break; - } - - return ret; --- -2.27.0 - diff --git a/0110-uadk-fix-macro-argument.patch b/0110-uadk-fix-macro-argument.patch deleted file mode 100644 index c8be485..0000000 --- a/0110-uadk-fix-macro-argument.patch +++ /dev/null @@ -1,112 +0,0 @@ -From 47eb2bf35cf8bce3f3e9b163fe6e1c5596ce1aa9 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sun, 24 Apr 2022 09:54:27 +0800 -Subject: [PATCH 121/183] uadk: fix macro argument - -macro argument 'drv' should be enclosed in parentheses. - -Signed-off-by: Wenkai Lin ---- - include/drv/wd_aead_drv.h | 2 +- - include/drv/wd_cipher_drv.h | 2 +- - include/drv/wd_comp_drv.h | 2 +- - include/drv/wd_dh_drv.h | 2 +- - include/drv/wd_digest_drv.h | 2 +- - include/drv/wd_ecc_drv.h | 2 +- - include/drv/wd_rsa_drv.h | 2 +- - 7 files changed, 7 insertions(+), 7 deletions(-) - -diff --git a/include/drv/wd_aead_drv.h b/include/drv/wd_aead_drv.h -index 137e70a..6d883bf 100644 ---- a/include/drv/wd_aead_drv.h -+++ b/include/drv/wd_aead_drv.h -@@ -86,7 +86,7 @@ struct wd_aead_driver *wd_aead_get_driver(void) \ - #define WD_AEAD_SET_DRIVER(drv) \ - static void __attribute__((constructor)) set_aead_driver(void) \ - { \ -- wd_aead_set_driver(&drv); \ -+ wd_aead_set_driver(&(drv)); \ - } - #endif - -diff --git a/include/drv/wd_cipher_drv.h b/include/drv/wd_cipher_drv.h -index 87b77d3..ecd421d 100644 ---- a/include/drv/wd_cipher_drv.h -+++ b/include/drv/wd_cipher_drv.h -@@ -71,7 +71,7 @@ struct wd_cipher_driver *wd_cipher_get_driver(void) \ - #define WD_CIPHER_SET_DRIVER(drv) \ - static void __attribute__((constructor)) set_driver(void) \ - { \ -- wd_cipher_set_driver(&drv); \ -+ wd_cipher_set_driver(&(drv)); \ - } - #endif - -diff --git a/include/drv/wd_comp_drv.h b/include/drv/wd_comp_drv.h -index 73403b5..a6c93d0 100644 ---- a/include/drv/wd_comp_drv.h -+++ b/include/drv/wd_comp_drv.h -@@ -77,7 +77,7 @@ struct wd_comp_driver *wd_comp_get_driver(void) \ - #define WD_COMP_SET_DRIVER(drv) \ - static void __attribute__((constructor)) set_driver(void) \ - { \ -- wd_comp_set_driver(&drv); \ -+ wd_comp_set_driver(&(drv)); \ - } - #endif - -diff --git a/include/drv/wd_dh_drv.h b/include/drv/wd_dh_drv.h -index 0d3fb2b..f0235c7 100644 ---- a/include/drv/wd_dh_drv.h -+++ b/include/drv/wd_dh_drv.h -@@ -45,7 +45,7 @@ struct wd_dh_driver *wd_dh_get_driver(void) \ - #define WD_DH_SET_DRIVER(drv) \ - static void __attribute__((constructor)) set_driver_dh(void) \ - { \ -- wd_dh_set_driver(&drv); \ -+ wd_dh_set_driver(&(drv)); \ - } - #endif - -diff --git a/include/drv/wd_digest_drv.h b/include/drv/wd_digest_drv.h -index 6907bc5..2401728 100644 ---- a/include/drv/wd_digest_drv.h -+++ b/include/drv/wd_digest_drv.h -@@ -74,7 +74,7 @@ struct wd_digest_driver *wd_digest_get_driver(void) \ - #define WD_DIGEST_SET_DRIVER(drv) \ - static void __attribute__((constructor)) set_drivers(void) \ - { \ -- wd_digest_set_driver(&drv); \ -+ wd_digest_set_driver(&(drv)); \ - } - #endif - -diff --git a/include/drv/wd_ecc_drv.h b/include/drv/wd_ecc_drv.h -index 66ed641..74dbcf8 100644 ---- a/include/drv/wd_ecc_drv.h -+++ b/include/drv/wd_ecc_drv.h -@@ -198,7 +198,7 @@ struct wd_ecc_driver *wd_ecc_get_driver(void) \ - #define WD_ECC_SET_DRIVER(drv) \ - static void __attribute__((constructor)) set_driver_ecc(void) \ - { \ -- wd_ecc_set_driver(&drv); \ -+ wd_ecc_set_driver(&(drv)); \ - } - #endif - -diff --git a/include/drv/wd_rsa_drv.h b/include/drv/wd_rsa_drv.h -index 837420e..bde6bbd 100644 ---- a/include/drv/wd_rsa_drv.h -+++ b/include/drv/wd_rsa_drv.h -@@ -70,7 +70,7 @@ struct wd_rsa_driver *wd_rsa_get_driver(void) \ - #define WD_RSA_SET_DRIVER(drv) \ - static void __attribute__((constructor)) set_driver_rsa(void) \ - { \ -- wd_rsa_set_driver(&drv); \ -+ wd_rsa_set_driver(&(drv)); \ - } - #endif - --- -2.27.0 - diff --git a/0111-uadk-fix-ret-uninit-problem.patch b/0111-uadk-fix-ret-uninit-problem.patch deleted file mode 100644 index 40bd53b..0000000 --- a/0111-uadk-fix-ret-uninit-problem.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 26406484d65db093e24dd230ad544ed027e6722f Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sun, 24 Apr 2022 09:54:28 +0800 -Subject: [PATCH 122/183] uadk: fix ret uninit problem - -If switch go out with default branch, it return -random value. - -Signed-off-by: Wenkai Lin ---- - wd_rsa.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/wd_rsa.c b/wd_rsa.c -index ca39cff..b7f250e 100644 ---- a/wd_rsa.c -+++ b/wd_rsa.c -@@ -1007,7 +1007,7 @@ static int rsa_prikey2_param_set(struct wd_rsa_prikey2 *pkey2, - struct wd_dtb *param, - enum wd_rsa_crt_prikey_para type) - { -- int ret; -+ int ret = -WD_EINVAL; - - if (param->dsize > pkey2->key_size || !param->data) - return -WD_EINVAL; --- -2.27.0 - diff --git a/0112-uadk-qm-optimize-sgl-copy-function.patch b/0112-uadk-qm-optimize-sgl-copy-function.patch deleted file mode 100644 index f350b83..0000000 --- a/0112-uadk-qm-optimize-sgl-copy-function.patch +++ /dev/null @@ -1,204 +0,0 @@ -From bd323b07e49644efdb1890ef53232ad32925dd2d Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sun, 24 Apr 2022 09:54:30 +0800 -Subject: [PATCH 123/183] uadk: qm: optimize sgl copy function - -1.Reduce the number of variables and optimize memcpy statements. -2.A single line contains more than 80 characters, fix it. - -Signed-off-by: Wenkai Lin ---- - drv/hisi_qm_udrv.c | 81 +++++++++++++++++++++--------------------- - include/hisi_qm_udrv.h | 4 +-- - 2 files changed, 43 insertions(+), 42 deletions(-) - -diff --git a/drv/hisi_qm_udrv.c b/drv/hisi_qm_udrv.c -index 53d5a55..3cb6ffb 100644 ---- a/drv/hisi_qm_udrv.c -+++ b/drv/hisi_qm_udrv.c -@@ -262,15 +262,18 @@ static int his_qm_set_qp_ctx(handle_t h_ctx, struct hisi_qm_priv *config, - static int hisi_qm_get_qfrs_offs(handle_t h_ctx, - struct hisi_qm_queue_info *q_info) - { -- q_info->region_size[UACCE_QFRT_DUS] = wd_ctx_get_region_size(h_ctx, -- UACCE_QFRT_DUS); -- if (!q_info->region_size[UACCE_QFRT_DUS]) { -+ enum uacce_qfrt type; -+ -+ type = UACCE_QFRT_DUS; -+ q_info->region_size[type] = wd_ctx_get_region_size(h_ctx, type); -+ if (!q_info->region_size[type]) { - WD_ERR("failed to get DUS qfrs offset!\n"); - return -WD_EINVAL; - } -- q_info->region_size[UACCE_QFRT_MMIO] = wd_ctx_get_region_size(h_ctx, -- UACCE_QFRT_MMIO); -- if (!q_info->region_size[UACCE_QFRT_MMIO]) { -+ -+ type = UACCE_QFRT_MMIO; -+ q_info->region_size[type] = wd_ctx_get_region_size(h_ctx, type); -+ if (!q_info->region_size[type]) { - WD_ERR("failed to get MMIO qfrs offset!\n"); - return -WD_EINVAL; - } -@@ -629,7 +632,8 @@ handle_t hisi_qm_create_sglpool(__u32 sgl_num, __u32 sge_num) - if (!sgl_pool->sgl[i]) - goto err_out; - -- sgl_pool->sgl_align[i] = hisi_qm_align_sgl(sgl_pool->sgl[i], sge_num); -+ sgl_pool->sgl_align[i] = hisi_qm_align_sgl(sgl_pool->sgl[i], -+ sge_num); - } - - sgl_pool->sgl_num = sgl_num; -@@ -808,35 +812,33 @@ handle_t hisi_qm_get_sglpool(handle_t h_qp) - return qp->h_sgl_pool; - } - --static void hisi_qm_sgl_copy_inner(void *dst_buff, struct hisi_sgl *hw_sgl, -+static void hisi_qm_sgl_copy_inner(void *pbuff, struct hisi_sgl *hw_sgl, - int begin_sge, __u32 sge_offset, __u32 size) - { - struct hisi_sgl *tmp = hw_sgl; -- __u32 offset = 0; -- __u32 len; -- int i; -+ int i = begin_sge + 1; -+ __u32 offset; -+ void *src; - -- len = tmp->sge_entries[begin_sge].len - sge_offset; -+ src = (void *)tmp->sge_entries[begin_sge].buff + sge_offset; -+ offset = tmp->sge_entries[begin_sge].len - sge_offset; - /* the first one is enough for copy size, copy and return */ -- if (len >= size) { -- memcpy(dst_buff, -- (void *)tmp->sge_entries[begin_sge].buff + sge_offset, size); -+ if (offset >= size) { -+ memcpy(pbuff, src, size); - return; - } - -- memcpy(dst_buff, (void *)tmp->sge_entries[begin_sge].buff + sge_offset, len); -- offset += len; -- -- i = begin_sge + 1; -+ memcpy(pbuff, src, offset); - - while (tmp) { - for (; i < tmp->entry_sum_in_sgl; i++) { -+ src = (void *)tmp->sge_entries[i].buff; - if (offset + tmp->sge_entries[i].len >= size) { -- memcpy(dst_buff + offset, (void *)tmp->sge_entries[i].buff, size - offset); -+ memcpy(pbuff + offset, src, size - offset); - return; - } - -- memcpy(dst_buff + offset, (void *)tmp->sge_entries[i].buff, tmp->sge_entries[i].len); -+ memcpy(pbuff + offset, src, tmp->sge_entries[i].len); - offset += tmp->sge_entries[i].len; - } - -@@ -845,32 +847,30 @@ static void hisi_qm_sgl_copy_inner(void *dst_buff, struct hisi_sgl *hw_sgl, - } - } - --static void hisi_qm_pbuff_copy_inner(const void *buff, struct hisi_sgl *hw_sgl, -- int begin_sge, __u32 sge_offset, __u32 size) -+static void hisi_qm_pbuff_copy_inner(void *pbuff, struct hisi_sgl *hw_sgl, -+ int begin_sge, __u32 sge_offset, -+ __u32 size) - { - struct hisi_sgl *tmp = hw_sgl; -+ int i = begin_sge + 1; - __u32 offset = 0; -- __u32 len; -- int i; -+ void *dst; - -- len = tmp->sge_entries[begin_sge].len - sge_offset; -- if (len >= size) { -- memcpy((void *)tmp->sge_entries[begin_sge].buff + sge_offset, -- buff, size); -+ if (tmp->sge_entries[begin_sge].len - sge_offset >= size) { -+ dst = (void *)tmp->sge_entries[begin_sge].buff + sge_offset; -+ memcpy(dst, pbuff, size); - return; - } - -- i = begin_sge + 1; - while (tmp) { - for (; i < tmp->entry_sum_in_sgl; i++) { -+ dst = (void *)tmp->sge_entries[i].buff; - if (offset + tmp->sge_entries[i].len >= size) { -- memcpy((void *)tmp->sge_entries[i].buff, -- buff + offset, size - offset); -+ memcpy(dst, pbuff + offset, size - offset); - return; - } - -- memcpy((void *)tmp->sge_entries[i].buff, -- buff + offset, tmp->sge_entries[i].len); -+ memcpy(dst, pbuff + offset, tmp->sge_entries[i].len); - offset += tmp->sge_entries[i].len; - } - -@@ -879,16 +879,16 @@ static void hisi_qm_pbuff_copy_inner(const void *buff, struct hisi_sgl *hw_sgl, - } - } - --void hisi_qm_sgl_copy(void *dst_buff, void *hw_sgl, __u32 offset, __u32 size, -- __u8 direct) -+void hisi_qm_sgl_copy(void *pbuff, void *hw_sgl, __u32 offset, __u32 size, -+ __u8 direct) - { - struct hisi_sgl *tmp = hw_sgl; -- __u32 len = 0; - __u32 sge_offset = 0; -+ __u32 len = 0; - int begin_sge = 0; - int i; - -- if (!dst_buff || !size || !tmp) -+ if (!pbuff || !size || !tmp) - return; - - while (len + tmp->entry_size_in_sgl <= offset) { -@@ -916,9 +916,10 @@ void hisi_qm_sgl_copy(void *dst_buff, void *hw_sgl, __u32 offset, __u32 size, - } - - if (direct == COPY_SGL_TO_PBUFF) -- hisi_qm_sgl_copy_inner(dst_buff, tmp, begin_sge, sge_offset, size); -+ hisi_qm_sgl_copy_inner(pbuff, tmp, begin_sge, sge_offset, size); - else -- hisi_qm_pbuff_copy_inner(dst_buff, tmp, begin_sge, sge_offset, size); -+ hisi_qm_pbuff_copy_inner(pbuff, tmp, begin_sge, sge_offset, -+ size); - } - - void hisi_qm_dump_sgl(void *sgl) -diff --git a/include/hisi_qm_udrv.h b/include/hisi_qm_udrv.h -index 773f57b..2395fd7 100644 ---- a/include/hisi_qm_udrv.h -+++ b/include/hisi_qm_udrv.h -@@ -170,7 +170,7 @@ handle_t hisi_qm_get_sglpool(handle_t h_qp); - - /** - * hisi_qm_sgl_copy: Buffer copying from hw sgl to pbuff or pbuff to sgl -- * @dst_buff: Dst pbuff point -+ * @pbuff: pbuff point - * @hw_sgl: Src hw sgl point - * @offset: Offset in hw sgl chain - * @size: Copy size -@@ -179,7 +179,7 @@ handle_t hisi_qm_get_sglpool(handle_t h_qp); - * If the len of sgl is not enough, will copy much as soon as - * possible before the offset to end of the sgl. - */ --void hisi_qm_sgl_copy(void *dst_buff, void *hw_sgl, __u32 offset, -+void hisi_qm_sgl_copy(void *pbuff, void *hw_sgl, __u32 offset, - __u32 size, __u8 direct); - - /** --- -2.27.0 - diff --git a/0113-uadk-fix-problems-with-referencing-header-files.patch b/0113-uadk-fix-problems-with-referencing-header-files.patch deleted file mode 100644 index 5ac635e..0000000 --- a/0113-uadk-fix-problems-with-referencing-header-files.patch +++ /dev/null @@ -1,823 +0,0 @@ -From d1e97dbd394a2a4f1c00cd001f81a08340c33070 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sun, 24 Apr 2022 09:54:26 +0800 -Subject: [PATCH 124/183] uadk: fix problems with referencing header files - -1.includes are not sorted properly. Order-ref: - standard library headers, OS library headers, - and project-specific headers. -2.Header file is not self contained. -3.Include file is redundant, should be removed. - -Signed-off-by: Wenkai Lin ---- - drv/hisi_hpre.c | 1 - - include/drv/wd_aead_drv.h | 5 +++-- - include/drv/wd_cipher_drv.h | 4 +++- - include/drv/wd_comp_drv.h | 3 +++ - include/drv/wd_dh_drv.h | 2 ++ - include/drv/wd_digest_drv.h | 5 +++-- - include/drv/wd_ecc_drv.h | 5 ++++- - include/hisi_qm_udrv.h | 2 +- - include/uacce.h | 1 - - include/wd.h | 1 + - include/wd_aead.h | 4 ++-- - include/wd_alg_common.h | 1 - - include/wd_comp.h | 2 -- - include/wd_digest.h | 2 +- - include/wd_ecc.h | 2 -- - include/wd_util.h | 1 + - v1/drv/hisi_hpre_udrv.c | 2 +- - v1/drv/hisi_qm_udrv.c | 4 ++-- - v1/drv/hisi_rng_udrv.c | 2 +- - v1/drv/hisi_sec_udrv.c | 2 +- - v1/drv/hisi_zip_udrv.c | 2 +- - v1/wd.c | 4 +--- - v1/wd.h | 1 - - v1/wd_adapter.c | 4 ++-- - v1/wd_adapter.h | 4 ---- - v1/wd_aead.c | 3 --- - v1/wd_bmm.c | 1 - - v1/wd_bmm.h | 3 +++ - v1/wd_cipher.c | 5 +---- - v1/wd_comp.c | 3 --- - v1/wd_dh.c | 3 --- - v1/wd_digest.c | 3 --- - v1/wd_ecc.c | 3 --- - v1/wd_rng.c | 5 +---- - v1/wd_rsa.c | 5 +---- - v1/wd_sgl.c | 1 - - v1/wd_sgl.h | 4 ++++ - v1/wd_util.h | 3 +-- - wd.c | 2 +- - wd_aead.c | 2 +- - wd_cipher.c | 2 +- - wd_comp.c | 2 +- - wd_dh.c | 2 +- - wd_digest.c | 2 +- - wd_ecc.c | 2 +- - wd_util.c | 2 +- - 46 files changed, 52 insertions(+), 72 deletions(-) - -diff --git a/drv/hisi_hpre.c b/drv/hisi_hpre.c -index 2a15900..bf0f440 100644 ---- a/drv/hisi_hpre.c -+++ b/drv/hisi_hpre.c -@@ -10,7 +10,6 @@ - #include - #include - #include --#include - #include - #include - #include -diff --git a/include/drv/wd_aead_drv.h b/include/drv/wd_aead_drv.h -index 6d883bf..cc28ed5 100644 ---- a/include/drv/wd_aead_drv.h -+++ b/include/drv/wd_aead_drv.h -@@ -4,8 +4,9 @@ - #ifndef __WD_AEAD_DRV_H - #define __WD_AEAD_DRV_H - --#include "include/wd_alg_common.h" --#include "include/wd_aead.h" -+#include "../wd_common.h" -+#include "../wd_alg_common.h" -+#include "../wd_aead.h" - - #ifdef __cplusplus - extern "C" { -diff --git a/include/drv/wd_cipher_drv.h b/include/drv/wd_cipher_drv.h -index ecd421d..0ec758d 100644 ---- a/include/drv/wd_cipher_drv.h -+++ b/include/drv/wd_cipher_drv.h -@@ -4,8 +4,10 @@ - #ifndef __WD_CIPHER_DRV_H - #define __WD_CIPHER_DRV_H - --#include "../wd_cipher.h" -+#include -+#include "../wd_common.h" - #include "../wd_alg_common.h" -+#include "../wd_cipher.h" - - #ifdef __cplusplus - extern "C" { -diff --git a/include/drv/wd_comp_drv.h b/include/drv/wd_comp_drv.h -index a6c93d0..0913ed6 100644 ---- a/include/drv/wd_comp_drv.h -+++ b/include/drv/wd_comp_drv.h -@@ -5,6 +5,9 @@ - #define __WD_COMP_DRV_H - - #include -+#include -+#include "../wd_common.h" -+#include "../wd_alg_common.h" - #include "../wd_comp.h" - - #ifdef __cplusplus -diff --git a/include/drv/wd_dh_drv.h b/include/drv/wd_dh_drv.h -index f0235c7..192e7d8 100644 ---- a/include/drv/wd_dh_drv.h -+++ b/include/drv/wd_dh_drv.h -@@ -4,6 +4,8 @@ - #ifndef __WD_DH_DRV_H - #define __WD_DH_DRV_H - -+#include -+#include "../wd_alg_common.h" - #include "../wd_dh.h" - - #ifdef __cplusplus -diff --git a/include/drv/wd_digest_drv.h b/include/drv/wd_digest_drv.h -index 2401728..b426ab2 100644 ---- a/include/drv/wd_digest_drv.h -+++ b/include/drv/wd_digest_drv.h -@@ -3,8 +3,9 @@ - #ifndef __WD_DIGEST_DRV_H - #define __WD_DIGEST_DRV_H - --#include "include/wd_digest.h" --#include "include/wd_alg_common.h" -+#include "../wd_common.h" -+#include "../wd_alg_common.h" -+#include "../wd_digest.h" - - #ifdef __cplusplus - extern "C" { -diff --git a/include/drv/wd_ecc_drv.h b/include/drv/wd_ecc_drv.h -index 74dbcf8..ca21759 100644 ---- a/include/drv/wd_ecc_drv.h -+++ b/include/drv/wd_ecc_drv.h -@@ -4,8 +4,11 @@ - #ifndef __WD_ECC_DRV_H - #define __WD_ECC_DRV_H - -+#include -+#include -+ -+#include "../wd.h" - #include "../wd_ecc.h" --#include "../wd_alg_common.h" - - #ifdef __cplusplus - extern "C" { -diff --git a/include/hisi_qm_udrv.h b/include/hisi_qm_udrv.h -index 2395fd7..ea5807e 100644 ---- a/include/hisi_qm_udrv.h -+++ b/include/hisi_qm_udrv.h -@@ -4,9 +4,9 @@ - #ifndef __HZIP_DRV_H__ - #define __HZIP_DRV_H__ - --#include - #include - #include -+#include - - #include "config.h" - #include "wd.h" -diff --git a/include/uacce.h b/include/uacce.h -index 07e36fe..fb3fb22 100644 ---- a/include/uacce.h -+++ b/include/uacce.h -@@ -7,7 +7,6 @@ - #ifndef _UAPIUUACCE_H - #define _UAPIUUACCE_H - --#include - #include - - #ifdef __cplusplus -diff --git a/include/wd.h b/include/wd.h -index 273cbb8..56c4109 100644 ---- a/include/wd.h -+++ b/include/wd.h -@@ -12,6 +12,7 @@ - #include - #include - #include -+#include - #include "uacce.h" - - #ifdef __cplusplus -diff --git a/include/wd_aead.h b/include/wd_aead.h -index 3840062..3be8e8a 100644 ---- a/include/wd_aead.h -+++ b/include/wd_aead.h -@@ -8,11 +8,11 @@ - #define __WD_AEAD_H - - #include --#include "wd_alg_common.h" - #include "config.h" -+#include "wd.h" -+#include "wd_alg_common.h" - #include "wd_cipher.h" - #include "wd_digest.h" --#include "wd.h" - - #ifdef __cplusplus - extern "C" { -diff --git a/include/wd_alg_common.h b/include/wd_alg_common.h -index 30d244f..855f71d 100644 ---- a/include/wd_alg_common.h -+++ b/include/wd_alg_common.h -@@ -7,7 +7,6 @@ - #ifndef WD_ALG_COMMON_H - #define WD_ALG_COMMON_H - --#include - #include - #include - #include "wd.h" -diff --git a/include/wd_comp.h b/include/wd_comp.h -index 5688b8b..e043a83 100644 ---- a/include/wd_comp.h -+++ b/include/wd_comp.h -@@ -7,8 +7,6 @@ - #ifndef __WD_COMP_H - #define __WD_COMP_H - --#include -- - #include "wd.h" - #include "wd_alg_common.h" - -diff --git a/include/wd_digest.h b/include/wd_digest.h -index 92b9a4f..e1a33cd 100644 ---- a/include/wd_digest.h -+++ b/include/wd_digest.h -@@ -8,8 +8,8 @@ - #define __WD_DIGEST_H - #include - --#include "wd_alg_common.h" - #include "wd.h" -+#include "wd_alg_common.h" - - #ifdef __cplusplus - extern "C" { -diff --git a/include/wd_ecc.h b/include/wd_ecc.h -index 5aaec23..05a776d 100644 ---- a/include/wd_ecc.h -+++ b/include/wd_ecc.h -@@ -7,10 +7,8 @@ - #ifndef __WD_ECC_H - #define __WD_ECC_H - --#include - #include - #include --#include - - #include "wd.h" - #include "wd_alg_common.h" -diff --git a/include/wd_util.h b/include/wd_util.h -index 7fe3d72..1243428 100644 ---- a/include/wd_util.h -+++ b/include/wd_util.h -@@ -8,6 +8,7 @@ - #define __WD_UTIL_H - - #include -+#include - #include "wd_alg_common.h" - - #ifdef __cplusplus -diff --git a/v1/drv/hisi_hpre_udrv.c b/v1/drv/hisi_hpre_udrv.c -index 3d8a00f..76ba3e8 100644 ---- a/v1/drv/hisi_hpre_udrv.c -+++ b/v1/drv/hisi_hpre_udrv.c -@@ -14,7 +14,6 @@ - * limitations under the License. - */ - --#include "config.h" - #include - #include - #include -@@ -28,6 +27,7 @@ - #include - #include - #include -+#include "config.h" - #include "v1/wd_util.h" - #include "hisi_hpre_udrv.h" - -diff --git a/v1/drv/hisi_qm_udrv.c b/v1/drv/hisi_qm_udrv.c -index b457efd..54aa016 100644 ---- a/v1/drv/hisi_qm_udrv.c -+++ b/v1/drv/hisi_qm_udrv.c -@@ -14,7 +14,6 @@ - * limitations under the License. - */ - --#include "config.h" - #include - #include - #include -@@ -29,10 +28,11 @@ - #include - #include - --#include "v1/drv/hisi_qm_udrv.h" -+#include "config.h" - #include "v1/drv/hisi_zip_udrv.h" - #include "v1/drv/hisi_hpre_udrv.h" - #include "v1/drv/hisi_sec_udrv.h" -+#include "v1/drv/hisi_qm_udrv.h" - - #define HISI_SGL_SGE_NUM_MAX 255 - #define HISI_SGL_ALIGN_SZ 64 -diff --git a/v1/drv/hisi_rng_udrv.c b/v1/drv/hisi_rng_udrv.c -index d051a25..a66bca5 100644 ---- a/v1/drv/hisi_rng_udrv.c -+++ b/v1/drv/hisi_rng_udrv.c -@@ -14,7 +14,6 @@ - * limitations under the License. - */ - --#include "config.h" - #include - #include - #include -@@ -30,6 +29,7 @@ - #include - #include - -+#include "config.h" - #include "hisi_rng_udrv.h" - - #define HISI_RNG_BYTES 4 -diff --git a/v1/drv/hisi_sec_udrv.c b/v1/drv/hisi_sec_udrv.c -index 3e1e7d1..0e8bf57 100644 ---- a/v1/drv/hisi_sec_udrv.c -+++ b/v1/drv/hisi_sec_udrv.c -@@ -14,7 +14,6 @@ - * limitations under the License. - */ - --#include "config.h" - #include - #include - #include -@@ -29,6 +28,7 @@ - #include - #include - -+#include "config.h" - #include "hisi_sec_udrv.h" - - #define DES_KEY_SIZE 8 -diff --git a/v1/drv/hisi_zip_udrv.c b/v1/drv/hisi_zip_udrv.c -index f59c08f..1dec4d6 100644 ---- a/v1/drv/hisi_zip_udrv.c -+++ b/v1/drv/hisi_zip_udrv.c -@@ -14,7 +14,6 @@ - * limitations under the License. - */ - --#include "config.h" - #include - #include - #include -@@ -28,6 +27,7 @@ - #include - #include - #include -+#include "config.h" - #include "v1/wd_util.h" - #include "v1/wd_comp.h" - #include "v1/wd_cipher.h" -diff --git a/v1/wd.c b/v1/wd.c -index b94ec43..8e3a91c 100644 ---- a/v1/wd.c -+++ b/v1/wd.c -@@ -18,20 +18,18 @@ - #include - #include - #include --#include - #include - #include - #include - #include - #include --#include - #include - #include - #include - --#include "v1/wd.h" - #include "v1/wd_util.h" - #include "v1/wd_adapter.h" -+#include "v1/wd.h" - - #define SYS_CLASS_DIR "/sys/class" - #define LINUX_DEV_DIR "/dev" -diff --git a/v1/wd.h b/v1/wd.h -index 429c6b6..1bd9669 100644 ---- a/v1/wd.h -+++ b/v1/wd.h -@@ -24,7 +24,6 @@ - #include - #include - #include --#include - #include - #include - #include -diff --git a/v1/wd_adapter.c b/v1/wd_adapter.c -index e53c561..53bf41e 100644 ---- a/v1/wd_adapter.c -+++ b/v1/wd_adapter.c -@@ -14,16 +14,16 @@ - * limitations under the License. - */ - --#include "config.h" - #include - #include - #include - -+#include "config.h" - #include "v1/wd_util.h" --#include "v1/wd_adapter.h" - #include "v1/drv/dummy_drv.h" - #include "v1/drv/hisi_qm_udrv.h" - #include "v1/drv/hisi_rng_udrv.h" -+#include "v1/wd_adapter.h" - - #define __ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask)) - #define ALIGN(x, a) __ALIGN_MASK(x, (typeof(x))(a)-1) -diff --git a/v1/wd_adapter.h b/v1/wd_adapter.h -index a5edd24..bcceff2 100644 ---- a/v1/wd_adapter.h -+++ b/v1/wd_adapter.h -@@ -21,11 +21,7 @@ - #include - #include - #include --#include - #include --#include --#include --#include - #include - - #include "wd.h" -diff --git a/v1/wd_aead.c b/v1/wd_aead.c -index cf358bf..d66f6e0 100644 ---- a/v1/wd_aead.c -+++ b/v1/wd_aead.c -@@ -17,12 +17,9 @@ - #include - #include - #include --#include - #include - - #include --#include --#include - #include - - #include "wd.h" -diff --git a/v1/wd_bmm.c b/v1/wd_bmm.c -index 11f2ee8..8f41997 100644 ---- a/v1/wd_bmm.c -+++ b/v1/wd_bmm.c -@@ -20,7 +20,6 @@ - #include - #include - #include --#include - #include - #include - -diff --git a/v1/wd_bmm.h b/v1/wd_bmm.h -index 22ba702..88a8f9d 100644 ---- a/v1/wd_bmm.h -+++ b/v1/wd_bmm.h -@@ -17,6 +17,9 @@ - #ifndef _WD_BMM_H - #define _WD_BMM_H - -+#include -+#include "wd.h" -+ - #ifdef __cplusplus - extern "C" { - #endif -diff --git a/v1/wd_cipher.c b/v1/wd_cipher.c -index 8eb6a6f..355d9aa 100644 ---- a/v1/wd_cipher.c -+++ b/v1/wd_cipher.c -@@ -17,17 +17,14 @@ - #include - #include - #include --#include - #include - - #include --#include --#include - #include - - #include "v1/wd.h" --#include "v1/wd_cipher.h" - #include "v1/wd_util.h" -+#include "v1/wd_cipher.h" - - #define MAX_CIPHER_KEY_SIZE 64 - #define MAX_CIPHER_RETRY_CNT 20000000 -diff --git a/v1/wd_comp.c b/v1/wd_comp.c -index 4ce79bd..7debef7 100644 ---- a/v1/wd_comp.c -+++ b/v1/wd_comp.c -@@ -17,11 +17,8 @@ - #include - #include - #include --#include - #include - #include --#include --#include - #include - #include "wd.h" - #include "wd_util.h" -diff --git a/v1/wd_dh.c b/v1/wd_dh.c -index 66f1081..d11d5cd 100644 ---- a/v1/wd_dh.c -+++ b/v1/wd_dh.c -@@ -17,12 +17,9 @@ - #include - #include - #include --#include - #include - - #include --#include --#include - #include - - #include "wd.h" -diff --git a/v1/wd_digest.c b/v1/wd_digest.c -index 5acb660..71e5747 100644 ---- a/v1/wd_digest.c -+++ b/v1/wd_digest.c -@@ -17,12 +17,9 @@ - #include - #include - #include --#include - #include - - #include --#include --#include - #include - - #include "wd.h" -diff --git a/v1/wd_ecc.c b/v1/wd_ecc.c -index e2837bd..dfa5192 100644 ---- a/v1/wd_ecc.c -+++ b/v1/wd_ecc.c -@@ -17,12 +17,9 @@ - #include - #include - #include --#include - #include - - #include --#include --#include - #include - - #include "wd.h" -diff --git a/v1/wd_rng.c b/v1/wd_rng.c -index 4f6c114..d9d420e 100644 ---- a/v1/wd_rng.c -+++ b/v1/wd_rng.c -@@ -17,17 +17,14 @@ - #include - #include - #include --#include - #include - - #include --#include --#include - #include - - #include "wd.h" --#include "wd_rng.h" - #include "wd_util.h" -+#include "wd_rng.h" - - #define MAX_NUM 10 - #define RNG_RESEND_CNT 8 -diff --git a/v1/wd_rsa.c b/v1/wd_rsa.c -index 11635df..4de249f 100644 ---- a/v1/wd_rsa.c -+++ b/v1/wd_rsa.c -@@ -17,17 +17,14 @@ - #include - #include - #include --#include - #include - - #include --#include --#include - #include - - #include "wd.h" --#include "wd_rsa.h" - #include "wd_util.h" -+#include "wd_rsa.h" - - #define RSA_BALANCE_THRHD 1280 - #define RSA_RESEND_CNT 8 -diff --git a/v1/wd_sgl.c b/v1/wd_sgl.c -index 9995d69..9bdbe92 100644 ---- a/v1/wd_sgl.c -+++ b/v1/wd_sgl.c -@@ -19,7 +19,6 @@ - #include - #include - #include --#include - - #include "wd.h" - #include "wd_adapter.h" -diff --git a/v1/wd_sgl.h b/v1/wd_sgl.h -index c923677..e2e82f2 100644 ---- a/v1/wd_sgl.h -+++ b/v1/wd_sgl.h -@@ -17,6 +17,10 @@ - #ifndef _WD_SGL_H - #define _WD_SGL_H - -+#include -+#include -+#include "wd.h" -+ - #ifdef __cplusplus - extern "C" { - #endif -diff --git a/v1/wd_util.h b/v1/wd_util.h -index 78b91ee..d1642f8 100644 ---- a/v1/wd_util.h -+++ b/v1/wd_util.h -@@ -24,13 +24,13 @@ - #include - #include - #include --#include - #include - #include - #include - #include - #include - #include -+#include - - #include "v1/wd.h" - #include "v1/wd_ecc.h" -@@ -88,7 +88,6 @@ - #define likely(x) __builtin_expect(!!(x), 1) - #define unlikely(x) __builtin_expect(!!(x), 0) - #define MIN(a, b) (((a) < (b)) ? (a) : (b)) --#define offsetof(t, m) ((size_t)(uintptr_t)&((t *)0)->m) - - struct wd_lock { - __u8 lock; -diff --git a/wd.c b/wd.c -index 0774837..3ce9c1e 100644 ---- a/wd.c -+++ b/wd.c -@@ -17,8 +17,8 @@ - #include - #include - --#include "wd.h" - #include "wd_alg_common.h" -+#include "wd.h" - - #define SYS_CLASS_DIR "/sys/class/uacce" - -diff --git a/wd_aead.c b/wd_aead.c -index 2e006c3..36ca842 100644 ---- a/wd_aead.c -+++ b/wd_aead.c -@@ -6,9 +6,9 @@ - - #include - #include --#include "wd_aead.h" - #include "wd_util.h" - #include "include/drv/wd_aead_drv.h" -+#include "wd_aead.h" - - #define XTS_MODE_KEY_DIVISOR 2 - #define SM4_KEY_SIZE 16 -diff --git a/wd_cipher.c b/wd_cipher.c -index 6cf1377..43e83b7 100644 ---- a/wd_cipher.c -+++ b/wd_cipher.c -@@ -7,9 +7,9 @@ - #include - #include - #include --#include "wd_cipher.h" - #include "wd_util.h" - #include "include/drv/wd_cipher_drv.h" -+#include "wd_cipher.h" - - #define XTS_MODE_KEY_DIVISOR 2 - #define SM4_KEY_SIZE 16 -diff --git a/wd_comp.c b/wd_comp.c -index 3bd7f43..cc8f192 100644 ---- a/wd_comp.c -+++ b/wd_comp.c -@@ -14,8 +14,8 @@ - - #include "config.h" - #include "drv/wd_comp_drv.h" --#include "wd_comp.h" - #include "wd_util.h" -+#include "wd_comp.h" - - #define WD_POOL_MAX_ENTRIES 1024 - #define MAX_RETRY_COUNTS 200000000 -diff --git a/wd_dh.c b/wd_dh.c -index aaea812..c16701d 100644 ---- a/wd_dh.c -+++ b/wd_dh.c -@@ -14,8 +14,8 @@ - - #include "config.h" - #include "include/drv/wd_dh_drv.h" --#include "wd_dh.h" - #include "wd_util.h" -+#include "wd_dh.h" - - #define WD_POOL_MAX_ENTRIES 1024 - #define DH_BALANCE_THRHD 1280 -diff --git a/wd_digest.c b/wd_digest.c -index 7afbd9c..d5602ef 100644 ---- a/wd_digest.c -+++ b/wd_digest.c -@@ -6,9 +6,9 @@ - - #include - #include --#include "wd_digest.h" - #include "wd_util.h" - #include "include/drv/wd_digest_drv.h" -+#include "wd_digest.h" - - #define XTS_MODE_KEY_DIVISOR 2 - #define SM4_KEY_SIZE 16 -diff --git a/wd_ecc.c b/wd_ecc.c -index 671b62d..9005103 100644 ---- a/wd_ecc.c -+++ b/wd_ecc.c -@@ -12,10 +12,10 @@ - #include - #include - --#include "wd_ecc.h" - #include "wd_util.h" - #include "include/drv/wd_ecc_drv.h" - #include "include/wd_ecc_curve.h" -+#include "wd_ecc.h" - - #define WD_POOL_MAX_ENTRIES 1024 - #define WD_ECC_CTX_MSG_NUM 64 -diff --git a/wd_util.c b/wd_util.c -index 57dafa7..43cedc6 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -12,8 +12,8 @@ - #include - #include - #include "wd_alg_common.h" --#include "wd_util.h" - #include "wd_sched.h" -+#include "wd_util.h" - - #define WD_ASYNC_DEF_POLL_NUM 1 - #define WD_ASYNC_DEF_QUEUE_DEPTH 1024 --- -2.27.0 - diff --git a/0114-uadk-fix-parameter-used-as-working-variable.patch b/0114-uadk-fix-parameter-used-as-working-variable.patch deleted file mode 100644 index 4138677..0000000 --- a/0114-uadk-fix-parameter-used-as-working-variable.patch +++ /dev/null @@ -1,761 +0,0 @@ -From 280e01c8a0aae071d54200f9a5fdcdc5035c3a9c Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sun, 24 Apr 2022 09:54:29 +0800 -Subject: [PATCH 125/183] uadk: fix parameter used as working variable - -input parameter of function should not be used as -working variable, fix it. - -Signed-off-by: Wenkai Lin ---- - drv/hisi_hpre.c | 3 ++- - drv/hisi_sec.c | 3 ++- - v1/drv/hisi_hpre_udrv.c | 13 ++++++---- - v1/drv/hisi_sec_udrv.c | 3 ++- - v1/wd.c | 13 +++++----- - v1/wd_adapter.c | 15 ++++++------ - v1/wd_aead.c | 3 ++- - v1/wd_cipher.c | 3 ++- - v1/wd_comp.c | 3 ++- - v1/wd_dh.c | 3 ++- - v1/wd_digest.c | 3 ++- - v1/wd_ecc.c | 6 +++-- - v1/wd_rng.c | 3 ++- - v1/wd_rsa.c | 3 ++- - v1/wd_sgl.c | 54 ++++++++++++++++++++++++----------------- - wd_aead.c | 3 ++- - wd_cipher.c | 3 ++- - wd_comp.c | 9 ++++--- - wd_dh.c | 3 ++- - wd_digest.c | 3 ++- - wd_ecc.c | 6 +++-- - wd_mempool.c | 18 ++++++++------ - wd_util.c | 3 ++- - 23 files changed, 110 insertions(+), 69 deletions(-) - -diff --git a/drv/hisi_hpre.c b/drv/hisi_hpre.c -index bf0f440..4e62c0f 100644 ---- a/drv/hisi_hpre.c -+++ b/drv/hisi_hpre.c -@@ -1965,11 +1965,12 @@ static void msg_pack(char *dst, __u64 *out_len, - } - - static int sm2_kdf(struct wd_dtb *out, struct wd_ecc_point *x2y2, -- __u64 m_len, struct wd_hash_mt *hash) -+ __u64 mt_len, struct wd_hash_mt *hash) - { - char p_out[MAX_HASH_LENS] = {0}; - __u32 h_bytes, x2y2_len; - char *tmp = out->data; -+ __u64 m_len = mt_len; - __u64 in_len, lens; - char *p_in, *t_out; - __u8 ctr[4]; -diff --git a/drv/hisi_sec.c b/drv/hisi_sec.c -index 88eacc3..b17ce0f 100644 ---- a/drv/hisi_sec.c -+++ b/drv/hisi_sec.c -@@ -487,9 +487,10 @@ int hisi_sec_init(struct wd_ctx_config_internal *config, void *priv); - void hisi_sec_exit(void *priv); - - /* increment counter (128-bit int) by software */ --static void ctr_iv_inc(__u8 *counter, __u32 c) -+static void ctr_iv_inc(__u8 *counter, __u32 len) - { - __u32 n = CTR_128BIT_COUNTER; -+ __u32 c = len; - - do { - --n; -diff --git a/v1/drv/hisi_hpre_udrv.c b/v1/drv/hisi_hpre_udrv.c -index 76ba3e8..805160e 100644 ---- a/v1/drv/hisi_hpre_udrv.c -+++ b/v1/drv/hisi_hpre_udrv.c -@@ -1873,13 +1873,14 @@ static int split_req(struct qm_queue_info *info, - return 0; - } - --static int fill_sm2_enc_sqe(void *message, struct qm_queue_info *info, __u16 i) -+static int fill_sm2_enc_sqe(void *msg, struct qm_queue_info *info, __u16 idx) - { - struct wcrypto_hash_mt *hash = &((struct q_info *)info->q->qinfo)->hash; -- struct wcrypto_ecc_msg *req_src = message; -+ struct wcrypto_ecc_msg *req_src = msg; - struct wcrypto_sm2_enc_in *ein = (void *)req_src->in; - struct wcrypto_ecc_msg *req_dst[2] = {NULL}; - struct wd_dtb *plaintext = &ein->plaintext; -+ __u16 i = idx; - int ret; - - if (plaintext->dsize <= HW_PLAINTEXT_BYTES_MAX && -@@ -2053,11 +2054,12 @@ static int qm_parse_ecc_sqe_general(void *msg, const struct qm_queue_info *info, - return 1; - } - --static int parse_first_sqe(void *hw_msg, struct qm_queue_info *info, __u16 i, -+static int parse_first_sqe(void *hw_msg, struct qm_queue_info *info, __u16 idx, - __u16 usr) - { -- struct wcrypto_ecc_msg *msg = info->req_cache[i]; -+ struct wcrypto_ecc_msg *msg = info->req_cache[idx]; - struct wcrypto_ecc_msg *msg_src; -+ __u16 i = idx; - int ret; - - ret = qm_parse_ecc_sqe_general(hw_msg, info, i, usr); -@@ -2177,10 +2179,11 @@ static void msg_pack(char *dst, __u64 *out_len, - } - - static int sm2_kdf(struct wd_dtb *out, struct wcrypto_ecc_point *x2y2, -- __u64 m_len, struct q_info *q_info) -+ __u64 hash_mt_len, struct q_info *q_info) - { - struct wcrypto_hash_mt *hash = &q_info->hash; - char p_out[MAX_HASH_LENS] = {0}; -+ __u64 m_len = hash_mt_len; - __u32 h_bytes, x2y2_len; - char *tmp = out->data; - __u64 in_len, lens; -diff --git a/v1/drv/hisi_sec_udrv.c b/v1/drv/hisi_sec_udrv.c -index 0e8bf57..4d5ede5 100644 ---- a/v1/drv/hisi_sec_udrv.c -+++ b/v1/drv/hisi_sec_udrv.c -@@ -206,10 +206,11 @@ static void fill_bd3_addr_type(__u8 data_fmt, struct hisi_sec_bd3_sqe *sqe3) - } - - /* increment counter (128-bit int) by c */ --static void ctr_iv_inc(__u8 *counter, __u32 c, __u8 data_fmt) -+static void ctr_iv_inc(__u8 *counter, __u32 shift_len, __u8 data_fmt) - { - __u32 n = CTR_128BIT_COUNTER; - __u8 *counter1 = counter; -+ __u32 c = shift_len; - - if (data_fmt == WD_SGL_BUF) { - counter1 = wd_get_first_sge_buf((struct wd_sgl *)counter); -diff --git a/v1/wd.c b/v1/wd.c -index 8e3a91c..8ef83c6 100644 ---- a/v1/wd.c -+++ b/v1/wd.c -@@ -845,19 +845,20 @@ void *wd_dma_to_va(struct wd_queue *q, void *dma) - void *wd_drv_mmap_qfr(struct wd_queue *q, enum uacce_qfrt qfrt, size_t size) - { - struct q_info *qinfo = q->qinfo; -+ size_t tmp = size; - off_t off; - - off = qfrt * getpagesize(); - - if (qfrt != WD_UACCE_QFRT_SS) -- size = qinfo->qfrs_offset[qfrt]; -+ tmp = qinfo->qfrs_offset[qfrt]; - -- return mmap(0, size, PROT_READ | PROT_WRITE, -+ return mmap(0, tmp, PROT_READ | PROT_WRITE, - MAP_SHARED, qinfo->fd, off); - } - - void wd_drv_unmmap_qfr(struct wd_queue *q, void *addr, -- enum uacce_qfrt qfrt, size_t size) -+ enum uacce_qfrt qfrt, size_t size) - { - struct q_info *qinfo = q->qinfo; - -@@ -865,9 +866,9 @@ void wd_drv_unmmap_qfr(struct wd_queue *q, void *addr, - return; - - if (qfrt != WD_UACCE_QFRT_SS) -- size = qinfo->qfrs_offset[qfrt]; -- -- munmap(addr, size); -+ munmap(addr, qinfo->qfrs_offset[qfrt]); -+ else -+ munmap(addr, size); - } - int wd_register_log(wd_log log) - { -diff --git a/v1/wd_adapter.c b/v1/wd_adapter.c -index 53bf41e..0b7b084 100644 ---- a/v1/wd_adapter.c -+++ b/v1/wd_adapter.c -@@ -198,15 +198,16 @@ void *drv_reserve_mem(struct wd_queue *q, size_t size) - struct wd_ss_region *rgn = NULL; - struct q_info *qinfo = q->qinfo; - unsigned long info = 0; -+ size_t tmp = size; - unsigned long i = 0; - void *ptr = NULL; - int ret = 1; - - /* Make sure memory map granularity size align */ - if (!qinfo->iommu_type) -- size = ALIGN(size, WD_UACCE_GRAN_SIZE); -+ tmp = ALIGN(tmp, WD_UACCE_GRAN_SIZE); - -- ptr = wd_drv_mmap_qfr(q, WD_UACCE_QFRT_SS, size); -+ ptr = wd_drv_mmap_qfr(q, WD_UACCE_QFRT_SS, tmp); - if (ptr == MAP_FAILED) { - int value = errno; - -@@ -215,8 +216,8 @@ void *drv_reserve_mem(struct wd_queue *q, size_t size) - } - - qinfo->ss_va = ptr; -- qinfo->ss_size = size; -- size = 0; -+ qinfo->ss_size = tmp; -+ tmp = 0; - while (ret > 0) { - info = (unsigned long)i; - ret = ioctl(qinfo->fd, WD_UACCE_CMD_GET_SS_DMA, &info); -@@ -238,8 +239,8 @@ void *drv_reserve_mem(struct wd_queue *q, size_t size) - rgn->size = (info & WD_UACCE_GRAN_NUM_MASK) << - WD_UACCE_GRAN_SHIFT; - rgn->pa = info & (~WD_UACCE_GRAN_NUM_MASK); -- rgn->va = ptr + size; -- size += rgn->size; -+ rgn->va = ptr + tmp; -+ tmp += rgn->size; - drv_add_slice(q, rgn); - i++; - } -@@ -248,7 +249,7 @@ void *drv_reserve_mem(struct wd_queue *q, size_t size) - - err_out: - drv_free_slice(q); -- drv_unmap_reserve_mem(q, ptr, size); -+ drv_unmap_reserve_mem(q, ptr, tmp); - - return NULL; - } -diff --git a/v1/wd_aead.c b/v1/wd_aead.c -index d66f6e0..4ff690a 100644 ---- a/v1/wd_aead.c -+++ b/v1/wd_aead.c -@@ -635,6 +635,7 @@ int wcrypto_aead_poll(struct wd_queue *q, unsigned int num) - struct wcrypto_aead_msg *aead_resp = NULL; - struct wcrypto_aead_ctx *ctx; - struct wcrypto_aead_tag *tag; -+ unsigned int tmp = num; - int count = 0; - int ret; - -@@ -664,7 +665,7 @@ int wcrypto_aead_poll(struct wd_queue *q, unsigned int num) - ctx->setup.cb(aead_resp, tag->wcrypto_tag.tag); - aead_requests_uninit(&aead_resp, ctx, 1); - wd_put_cookies(&ctx->pool, (void **)&tag, 1); -- } while (--num); -+ } while (--tmp); - - return count; - } -diff --git a/v1/wd_cipher.c b/v1/wd_cipher.c -index 355d9aa..ad21a3a 100644 ---- a/v1/wd_cipher.c -+++ b/v1/wd_cipher.c -@@ -504,6 +504,7 @@ int wcrypto_cipher_poll(struct wd_queue *q, unsigned int num) - struct wcrypto_cipher_msg *cipher_resp = NULL; - struct wcrypto_cipher_ctx *ctx; - struct wcrypto_cipher_tag *tag; -+ unsigned int tmp = num; - int count = 0; - int ret; - -@@ -532,7 +533,7 @@ int wcrypto_cipher_poll(struct wd_queue *q, unsigned int num) - ctx = tag->wcrypto_tag.ctx; - ctx->setup.cb(cipher_resp, tag->wcrypto_tag.tag); - wd_put_cookies(&ctx->pool, (void **)&tag, 1); -- } while (--num); -+ } while (--tmp); - - return count; - } -diff --git a/v1/wd_comp.c b/v1/wd_comp.c -index 7debef7..33546d4 100644 ---- a/v1/wd_comp.c -+++ b/v1/wd_comp.c -@@ -280,6 +280,7 @@ int wcrypto_comp_poll(struct wd_queue *q, unsigned int num) - struct wcrypto_comp_msg *resp = NULL; - struct wcrypto_comp_ctx *ctx; - struct wcrypto_comp_tag *tag; -+ unsigned int tmp = num; - int count = 0; - int ret; - -@@ -309,7 +310,7 @@ int wcrypto_comp_poll(struct wd_queue *q, unsigned int num) - ctx->cb(resp, tag->wcrypto_tag.tag); - wd_put_cookies(&ctx->pool, (void **)&tag, 1); - resp = NULL; -- } while (--num); -+ } while (--tmp); - - return ret < 0 ? ret : count; - } -diff --git a/v1/wd_dh.c b/v1/wd_dh.c -index d11d5cd..49f52d9 100644 ---- a/v1/wd_dh.c -+++ b/v1/wd_dh.c -@@ -371,6 +371,7 @@ int wcrypto_dh_poll(struct wd_queue *q, unsigned int num) - struct wcrypto_dh_msg *resp = NULL; - struct wcrypto_dh_ctx *ctx; - struct wcrypto_cb_tag *tag; -+ unsigned int tmp = num; - int count = 0; - int ret; - -@@ -394,7 +395,7 @@ int wcrypto_dh_poll(struct wd_queue *q, unsigned int num) - ctx->setup.cb(resp, tag->tag); - wd_put_cookies(&ctx->pool, (void **)&tag, 1); - resp = NULL; -- } while (--num); -+ } while (--tmp); - - return count; - } -diff --git a/v1/wd_digest.c b/v1/wd_digest.c -index 71e5747..14df736 100644 ---- a/v1/wd_digest.c -+++ b/v1/wd_digest.c -@@ -422,6 +422,7 @@ int wcrypto_digest_poll(struct wd_queue *q, unsigned int num) - struct wcrypto_digest_msg *digest_resp = NULL; - struct wcrypto_digest_ctx *ctx; - struct wcrypto_digest_tag *tag; -+ unsigned int tmp = num; - int count = 0; - int ret; - -@@ -451,7 +452,7 @@ int wcrypto_digest_poll(struct wd_queue *q, unsigned int num) - ctx = tag->wcrypto_tag.ctx; - ctx->setup.cb(digest_resp, tag->wcrypto_tag.tag); - wd_put_cookies(&ctx->pool, (void **)&tag, 1); -- } while (--num); -+ } while (--tmp); - - return count; - } -diff --git a/v1/wd_ecc.c b/v1/wd_ecc.c -index dfa5192..58dabfc 100644 ---- a/v1/wd_ecc.c -+++ b/v1/wd_ecc.c -@@ -180,8 +180,9 @@ static int trans_to_binpad(char *dst, const char *src, - return WD_SUCCESS; - } - --static void wd_memset_zero(void *data, __u32 size) -+static void wd_memset_zero(void *data, __u32 mem_size) - { -+ __u32 size = mem_size; - char *s = data; - - if (unlikely(!s)) -@@ -1620,6 +1621,7 @@ static int ecc_poll(struct wd_queue *q, unsigned int num) - struct wcrypto_ecc_msg *resp = NULL; - struct wcrypto_ecc_ctx *ctx; - struct wcrypto_cb_tag *tag; -+ unsigned int tmp = num; - int count = 0; - int ret; - -@@ -1638,7 +1640,7 @@ static int ecc_poll(struct wd_queue *q, unsigned int num) - ctx->setup.cb(resp, tag->tag); - wd_put_cookies(&ctx->pool, (void **)&tag, 1); - resp = NULL; -- } while (--num); -+ } while (--tmp); - - return count; - } -diff --git a/v1/wd_rng.c b/v1/wd_rng.c -index d9d420e..7b3bda3 100644 ---- a/v1/wd_rng.c -+++ b/v1/wd_rng.c -@@ -160,6 +160,7 @@ int wcrypto_rng_poll(struct wd_queue *q, unsigned int num) - struct wcrypto_rng_msg *resp = NULL; - struct wcrypto_rng_ctx *ctx; - struct wcrypto_cb_tag *tag; -+ unsigned int tmp = num; - int count = 0; - int ret; - -@@ -184,7 +185,7 @@ int wcrypto_rng_poll(struct wd_queue *q, unsigned int num) - ctx->setup.cb(resp, tag->tag); - wd_put_cookies(&ctx->pool, (void **)&tag, 1); - resp = NULL; -- } while (--num); -+ } while (--tmp); - - return count; - } -diff --git a/v1/wd_rsa.c b/v1/wd_rsa.c -index 4de249f..6ba29d7 100644 ---- a/v1/wd_rsa.c -+++ b/v1/wd_rsa.c -@@ -1034,6 +1034,7 @@ int wcrypto_rsa_poll(struct wd_queue *q, unsigned int num) - struct wcrypto_rsa_msg *resp = NULL; - struct wcrypto_rsa_ctx *ctx; - struct wcrypto_cb_tag *tag; -+ unsigned int tmp = num; - int count = 0; - int ret; - -@@ -1056,7 +1057,7 @@ int wcrypto_rsa_poll(struct wd_queue *q, unsigned int num) - ctx->setup.cb(resp, tag->tag); - wd_put_cookies(&ctx->pool, (void **)&tag, 1); - resp = NULL; -- } while (--num); -+ } while (--tmp); - - return count; - } -diff --git a/v1/wd_sgl.c b/v1/wd_sgl.c -index 9bdbe92..dffbf12 100644 ---- a/v1/wd_sgl.c -+++ b/v1/wd_sgl.c -@@ -512,32 +512,33 @@ struct wd_sgl *wd_alloc_sgl(void *pool, __u32 size) - void wd_free_sgl(void *pool, struct wd_sgl *sgl) - { - struct wd_sglpool *p = pool; -+ struct wd_sgl *tmp = sgl; - struct wd_sgl *next; - int i; - -- if (unlikely(!p || !sgl || !p->sgl_pool)) { -+ if (unlikely(!p || !tmp || !p->sgl_pool)) { - WD_ERR("pool or sgl or p->sgl_pool is null!\n"); - return; - } - -- if (unlikely((uintptr_t)sgl->next & FLAG_MERGED_SGL)) { -+ if (unlikely((uintptr_t)tmp->next & FLAG_MERGED_SGL)) { - WD_ERR("This is a merged sgl, u cannot free it!\n"); - return; - } - - do { -- next = sgl->next; -- sgl->buf_sum = sgl->buf_num; -- sgl->next = NULL; -- sgl->sum_data_bytes = 0; -- for (i = 0; i < sgl->buf_num; i++) -- sgl->sge[i].data_len = 0; -+ next = tmp->next; -+ tmp->buf_sum = tmp->buf_num; -+ tmp->next = NULL; -+ tmp->sum_data_bytes = 0; -+ for (i = 0; i < tmp->buf_num; i++) -+ tmp->sge[i].data_len = 0; - - /* have to update current 'wd_sgl' before free it */ -- wd_free_blk(p->sgl_pool, sgl); -+ wd_free_blk(p->sgl_pool, tmp); - wd_get_free_blk_num(p->sgl_pool, &p->free_sgl_num); - next = (struct wd_sgl *)((uintptr_t)next & (~FLAG_MERGED_SGL)); -- sgl = next; -+ tmp = next; - } while (next); - } - -@@ -577,12 +578,16 @@ int wd_sgl_merge(struct wd_sgl *dst_sgl, struct wd_sgl *src_sgl) - return WD_SUCCESS; - } - --static void sgl_cp_to_pbuf(struct wd_sgl *sgl, int strtsg, int strtad, -- void *pbuf, size_t size) -+static void sgl_cp_to_pbuf(struct wd_sgl *src_sgl, int start_sg, int strtad, -+ void *buf, size_t sgl_sz) - { -- __u32 sz = sgl->pool->setup.buf_size; -- __u32 act_sz = MIN(size, sz - strtad); -+ __u32 sz = src_sgl->pool->setup.buf_size; -+ __u32 act_sz = MIN(sgl_sz, sz - strtad); -+ struct wd_sgl *sgl = src_sgl; -+ int strtsg = start_sg; -+ size_t size = sgl_sz; - struct wd_sgl *next; -+ void *pbuf = buf; - int i; - - next = (struct wd_sgl *)((uintptr_t)sgl->next & (~FLAG_MERGED_SGL)); -@@ -654,12 +659,16 @@ int wd_sgl_cp_to_pbuf(struct wd_sgl *sgl, size_t offset, void *pbuf, size_t size - return 0; - } - --static void sgl_cp_from_pbuf(struct wd_sgl *sgl, int strtsg, int strtad, -- void *pbuf, size_t size) -+static void sgl_cp_from_pbuf(struct wd_sgl *dst_sgl, int start_sg, int strtad, -+ void *buf, size_t mem_sz) - { -- __u32 sz = sgl->pool->setup.buf_size; -- __u32 act_sz = MIN(size, sz - strtad); -+ __u32 sz = dst_sgl->pool->setup.buf_size; -+ __u32 act_sz = MIN(mem_sz, sz - strtad); -+ struct wd_sgl *sgl = dst_sgl; -+ int strtsg = start_sg; -+ size_t size = mem_sz; - struct wd_sgl *next; -+ void *pbuf = buf; - int i; - - next = (struct wd_sgl *)((uintptr_t)sgl->next & (~FLAG_MERGED_SGL)); -@@ -766,18 +775,19 @@ void wd_sgl_iova_unmap(void *pool, void *sgl_iova, struct wd_sgl *sgl) - - void *wd_get_last_sge_buf(struct wd_sgl *sgl) - { -+ struct wd_sgl *tmp = sgl; - uintptr_t next; - -- if (unlikely(!sgl || !sgl->buf_num)) { -+ if (unlikely(!tmp || !tmp->buf_num)) { - WD_ERR("sgl or buf_num in sgl is null!\n"); - return NULL; - } - -- next = (uintptr_t)sgl->next & (~FLAG_MERGED_SGL); -+ next = (uintptr_t)tmp->next & (~FLAG_MERGED_SGL); - if (next) -- sgl = (struct wd_sgl *)next; -+ tmp = (struct wd_sgl *)next; - -- return sgl->sge[sgl->buf_num - 1].buf; -+ return tmp->sge[tmp->buf_num - 1].buf; - } - - void *wd_get_first_sge_buf(struct wd_sgl *sgl) -diff --git a/wd_aead.c b/wd_aead.c -index 36ca842..b3e7b41 100644 ---- a/wd_aead.c -+++ b/wd_aead.c -@@ -639,6 +639,7 @@ int wd_aead_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - struct wd_aead_msg resp_msg, *msg; - struct wd_aead_req *req; - __u64 recv_count = 0; -+ __u32 tmp = expt; - int ret; - - if (!count) { -@@ -678,7 +679,7 @@ int wd_aead_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - wd_put_msg_to_pool(&wd_aead_setting.pool, - idx, resp_msg.tag); - *count = recv_count; -- } while (--expt); -+ } while (--tmp); - - return ret; - } -diff --git a/wd_cipher.c b/wd_cipher.c -index 43e83b7..b074dd2 100644 ---- a/wd_cipher.c -+++ b/wd_cipher.c -@@ -548,6 +548,7 @@ int wd_cipher_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - struct wd_cipher_msg resp_msg, *msg; - struct wd_cipher_req *req; - __u64 recv_count = 0; -+ __u32 tmp = expt; - int ret; - - if (unlikely(!count)) { -@@ -588,7 +589,7 @@ int wd_cipher_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - wd_put_msg_to_pool(&wd_cipher_setting.pool, idx, - resp_msg.tag); - *count = recv_count; -- } while (--expt); -+ } while (--tmp); - - return ret; - } -diff --git a/wd_comp.c b/wd_comp.c -index cc8f192..502bc23 100644 ---- a/wd_comp.c -+++ b/wd_comp.c -@@ -187,6 +187,7 @@ int wd_comp_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - struct wd_comp_msg *msg; - struct wd_comp_req *req; - __u64 recv_count = 0; -+ __u32 tmp = expt; - int ret; - - if (unlikely(!count)) { -@@ -228,7 +229,7 @@ int wd_comp_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - /* free msg cache to msg_pool */ - wd_put_msg_to_pool(&wd_comp_setting.pool, idx, resp_msg.tag); - *count = recv_count; -- } while (--expt); -+ } while (--tmp); - - return ret; - } -@@ -545,14 +546,16 @@ int wd_do_comp_sync2(handle_t h_sess, struct wd_comp_req *req) - return 0; - } - --static unsigned int bit_reverse(register unsigned int x) -+static unsigned int bit_reverse(register unsigned int target) - { -+ register unsigned int x = target; -+ - x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1)); - x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2)); - x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4)); - x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8)); - -- return((x >> 16) | (x << 16)); -+ return ((x >> 16) | (x << 16)); - } - - /** -diff --git a/wd_dh.c b/wd_dh.c -index c16701d..2b02e3c 100644 ---- a/wd_dh.c -+++ b/wd_dh.c -@@ -365,6 +365,7 @@ int wd_dh_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - struct wd_dh_req *req; - struct wd_dh_msg *msg; - __u32 rcv_cnt = 0; -+ __u32 tmp = expt; - int ret; - - if (unlikely(!count)) { -@@ -405,7 +406,7 @@ int wd_dh_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - req->cb(req); - wd_put_msg_to_pool(&wd_dh_setting.pool, idx, rcv_msg.tag); - *count = rcv_cnt; -- } while (--expt); -+ } while (--tmp); - - return ret; - } -diff --git a/wd_digest.c b/wd_digest.c -index d5602ef..1d4e4cc 100644 ---- a/wd_digest.c -+++ b/wd_digest.c -@@ -444,6 +444,7 @@ int wd_digest_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - struct wd_digest_msg recv_msg, *msg; - struct wd_digest_req *req; - __u32 recv_cnt = 0; -+ __u32 tmp = expt; - int ret; - - if (unlikely(!count)) { -@@ -486,7 +487,7 @@ int wd_digest_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - wd_put_msg_to_pool(&wd_digest_setting.pool, idx, - recv_msg.tag); - *count = recv_cnt; -- } while (--expt); -+ } while (--tmp); - - return ret; - } -diff --git a/wd_ecc.c b/wd_ecc.c -index 9005103..c6bd111 100644 ---- a/wd_ecc.c -+++ b/wd_ecc.c -@@ -301,10 +301,11 @@ static __u32 get_hash_bytes(__u8 type) - return val; - } - --static void init_dtb_param(void *dtb, char *start, -+static void init_dtb_param(void *dtb, char *str, - __u32 dsz, __u32 bsz, __u32 num) - { - struct wd_dtb *tmp = dtb; -+ char *start = str; - int i = 0; - - while (i++ < num) { -@@ -2190,6 +2191,7 @@ int wd_ecc_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - struct wd_ctx_internal *ctx; - struct wd_ecc_req *req; - __u32 rcv_cnt = 0; -+ __u32 tmp = expt; - int ret; - - if (unlikely(!count)) { -@@ -2230,7 +2232,7 @@ int wd_ecc_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - req->cb(req); - wd_put_msg_to_pool(&wd_ecc_setting.pool, idx, recv_msg.tag); - *count = rcv_cnt; -- } while (--expt); -+ } while (--tmp); - - return ret; - } -diff --git a/wd_mempool.c b/wd_mempool.c -index 03df19a..d9259de 100644 ---- a/wd_mempool.c -+++ b/wd_mempool.c -@@ -174,8 +174,9 @@ struct mempool { - * - * Undefined if no bit exists, so code should check against 0 first. - */ --static __always_inline unsigned long wd_ffs(unsigned long word) -+static __always_inline unsigned long wd_ffs(unsigned long target_word) - { -+ unsigned long word = target_word; - int num = 0; - - if ((word & 0xffffffff) == 0) { -@@ -234,9 +235,11 @@ static void destroy_bitmap(struct bitmap *bm) - } - - static unsigned long _find_next_bit(unsigned long *map, unsigned long bits, -- unsigned long start, unsigned long invert) -+ unsigned long begin_position, -+ unsigned long invert) - { - unsigned long tmp, mask, next_bit; -+ unsigned long start = begin_position; - - if (start >= bits) - return bits; -@@ -888,15 +891,16 @@ static void uninit_mempool(struct mempool *mp) - handle_t wd_mempool_create(size_t size, int node) - { - struct mempool *mp; -+ size_t tmp = size; - int ret; - -- if (!size || node < 0 || node > numa_max_node()) { -- WD_ERR("invalid: numa node is %d, size is %ld!\n", node, size); -+ if (!tmp || node < 0 || node > numa_max_node()) { -+ WD_ERR("invalid: numa node is %d, size is %ld!\n", node, tmp); - return (handle_t)(-WD_EINVAL); - } - -- if (WD_MEMPOOL_SIZE_MASK & size) -- size += WD_MEMPOOL_BLOCK_SIZE - (WD_MEMPOOL_SIZE_MASK & size); -+ if (WD_MEMPOOL_SIZE_MASK & tmp) -+ tmp += WD_MEMPOOL_BLOCK_SIZE - (WD_MEMPOOL_SIZE_MASK & tmp); - - mp = calloc(1, sizeof(*mp)); - if (!mp) { -@@ -905,7 +909,7 @@ handle_t wd_mempool_create(size_t size, int node) - } - - mp->node = node; -- mp->size = size; -+ mp->size = tmp; - mp->blk_size = WD_MEMPOOL_BLOCK_SIZE; - - ret = alloc_mem_from_hugepage(mp); -diff --git a/wd_util.c b/wd_util.c -index 43cedc6..8bda8d7 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -162,12 +162,13 @@ void wd_clear_ctx_config(struct wd_ctx_config_internal *in) - - void wd_memset_zero(void *data, __u32 size) - { -+ __u32 tmp = size; - char *s = data; - - if (!s) - return; - -- while (size--) -+ while (tmp--) - *s++ = 0; - } - --- -2.27.0 - diff --git a/0115-uadk-move-parameter-check-into-wd_util.c.patch b/0115-uadk-move-parameter-check-into-wd_util.c.patch deleted file mode 100644 index 6708028..0000000 --- a/0115-uadk-move-parameter-check-into-wd_util.c.patch +++ /dev/null @@ -1,305 +0,0 @@ -From 46321d786961ea5d5a63b12084ee2ed551067c3d Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Tue, 31 May 2022 17:01:01 +0800 -Subject: [PATCH 127/183] uadk: move parameter check into wd_util.c - -The code for wd alg init parameter checking is same, -so move it into wd_util.c from wd_.c. - -Signed-off-by: Weili Qian ---- - include/wd_util.h | 9 +++++++++ - wd_aead.c | 17 +---------------- - wd_cipher.c | 18 +----------------- - wd_comp.c | 12 +++--------- - wd_dh.c | 20 +++----------------- - wd_digest.c | 17 +---------------- - wd_ecc.c | 20 +++----------------- - wd_rsa.c | 20 +++----------------- - wd_util.c | 20 ++++++++++++++++++++ - 9 files changed, 44 insertions(+), 109 deletions(-) - -diff --git a/include/wd_util.h b/include/wd_util.h -index 1243428..89dfe87 100644 ---- a/include/wd_util.h -+++ b/include/wd_util.h -@@ -327,6 +327,15 @@ int wd_check_ctx(struct wd_ctx_config_internal *config, __u8 mode, __u32 idx); - */ - int wd_set_epoll_en(const char *var_name, bool *epoll_en); - -+/** -+ * wd_init_check() - Check input parameters for wd__init. -+ * @config: Ctx configuration input by user. -+ * @sched: Scheduler configuration input by user. -+ * -+ * Return 0 if successful or less than 0 otherwise. -+ */ -+int wd_init_param_check(struct wd_ctx_config *config, struct wd_sched *sched); -+ - #ifdef __cplusplus - } - #endif -diff --git a/wd_aead.c b/wd_aead.c -index b3e7b41..3f47f8b 100644 ---- a/wd_aead.c -+++ b/wd_aead.c -@@ -388,27 +388,12 @@ static int aead_param_check(struct wd_aead_sess *sess, - return 0; - } - --static int aead_init_check(struct wd_ctx_config *config, struct wd_sched *sched) --{ -- if (!config || !config->ctxs || !config->ctxs[0].ctx || !sched) { -- WD_ERR("invalid: wd aead config or sched is NULL!\n"); -- return -WD_EINVAL; -- } -- -- if (!wd_is_sva(config->ctxs[0].ctx)) { -- WD_ERR("err, non sva, please check system!\n"); -- return -WD_EINVAL; -- } -- -- return 0; --} -- - int wd_aead_init(struct wd_ctx_config *config, struct wd_sched *sched) - { - void *priv; - int ret; - -- ret = aead_init_check(config, sched); -+ ret = wd_init_param_check(config, sched); - if (ret) - return ret; - -diff --git a/wd_cipher.c b/wd_cipher.c -index b074dd2..be8996f 100644 ---- a/wd_cipher.c -+++ b/wd_cipher.c -@@ -151,22 +151,6 @@ static int cipher_key_len_check(struct wd_cipher_sess *sess, __u32 length) - return ret; - } - --static int cipher_init_check(struct wd_ctx_config *config, -- struct wd_sched *sched) --{ -- if (!config || !config->ctxs || !config->ctxs[0].ctx || !sched) { -- WD_ERR("invalid: wd cipher config or sched is NULL!\n"); -- return -WD_EINVAL; -- } -- -- if (!wd_is_sva(config->ctxs[0].ctx)) { -- WD_ERR("err, non sva, please check system!\n"); -- return -WD_EINVAL; -- } -- -- return 0; --} -- - int wd_cipher_set_key(handle_t h_sess, const __u8 *key, __u32 key_len) - { - struct wd_cipher_sess *sess = (struct wd_cipher_sess *)h_sess; -@@ -248,7 +232,7 @@ int wd_cipher_init(struct wd_ctx_config *config, struct wd_sched *sched) - void *priv; - int ret; - -- ret = cipher_init_check(config, sched); -+ ret = wd_init_param_check(config, sched); - if (ret) - return ret; - -diff --git a/wd_comp.c b/wd_comp.c -index 502bc23..f2d01b6 100644 ---- a/wd_comp.c -+++ b/wd_comp.c -@@ -85,15 +85,9 @@ int wd_comp_init(struct wd_ctx_config *config, struct wd_sched *sched) - void *priv; - int ret; - -- if (!config || !config->ctxs || !config->ctxs[0].ctx || !sched) { -- WD_ERR("invalid: config or sched is NULL!\n"); -- return -WD_EINVAL; -- } -- -- if (!wd_is_sva(config->ctxs[0].ctx)) { -- WD_ERR("failed to find sva device, please check system!\n"); -- return -WD_EINVAL; -- } -+ ret = wd_init_param_check(config, sched); -+ if (ret) -+ return ret; - - ret = wd_set_epoll_en("WD_COMP_EPOLL_EN", - &wd_comp_setting.config.epoll_en); -diff --git a/wd_dh.c b/wd_dh.c -index 2b02e3c..dfa9505 100644 ---- a/wd_dh.c -+++ b/wd_dh.c -@@ -78,28 +78,14 @@ void wd_dh_set_driver(struct wd_dh_driver *drv) - wd_dh_setting.driver = drv; - } - --static int param_check(struct wd_ctx_config *config, struct wd_sched *sched) --{ -- if (!config || !config->ctxs || !config->ctxs[0].ctx || !sched) { -- WD_ERR("invalid: config or sched is NULL!\n"); -- return -WD_EINVAL; -- } -- -- if (!wd_is_sva(config->ctxs[0].ctx)) { -- WD_ERR("invalid: the mode is non sva, please check system!\n"); -- return -WD_EINVAL; -- } -- -- return 0; --} -- - int wd_dh_init(struct wd_ctx_config *config, struct wd_sched *sched) - { - void *priv; - int ret; - -- if (param_check(config, sched)) -- return -WD_EINVAL; -+ ret = wd_init_param_check(config, sched); -+ if (ret) -+ return ret; - - ret = wd_set_epoll_en("WD_DH_EPOLL_EN", - &wd_dh_setting.config.epoll_en); -diff --git a/wd_digest.c b/wd_digest.c -index 1d4e4cc..46546cb 100644 ---- a/wd_digest.c -+++ b/wd_digest.c -@@ -150,27 +150,12 @@ void wd_digest_free_sess(handle_t h_sess) - free(sess); - } - --static int digest_init_check(struct wd_ctx_config *config, struct wd_sched *sched) --{ -- if (!config || !config->ctxs || !config->ctxs[0].ctx || !sched) { -- WD_ERR("failed to check input param!\n"); -- return -WD_EINVAL; -- } -- -- if (!wd_is_sva(config->ctxs[0].ctx)) { -- WD_ERR("err, non sva, please check system!\n"); -- return -WD_EINVAL; -- } -- -- return 0; --} -- - int wd_digest_init(struct wd_ctx_config *config, struct wd_sched *sched) - { - void *priv; - int ret; - -- ret = digest_init_check(config, sched); -+ ret = wd_init_param_check(config, sched); - if (ret) - return ret; - -diff --git a/wd_ecc.c b/wd_ecc.c -index c6bd111..c463049 100644 ---- a/wd_ecc.c -+++ b/wd_ecc.c -@@ -132,28 +132,14 @@ void wd_ecc_set_driver(struct wd_ecc_driver *drv) - wd_ecc_setting.driver = drv; - } - --static int init_param_check(struct wd_ctx_config *config, struct wd_sched *sched) --{ -- if (!config || !config->ctxs || !config->ctxs[0].ctx || !sched) { -- WD_ERR("invalid: config or sched is NULL!\n"); -- return -WD_EINVAL; -- } -- -- if (!wd_is_sva(config->ctxs[0].ctx)) { -- WD_ERR("invalid: the mode is non sva, please check system!\n"); -- return -WD_EINVAL; -- } -- -- return 0; --} -- - int wd_ecc_init(struct wd_ctx_config *config, struct wd_sched *sched) - { - void *priv; - int ret; - -- if (init_param_check(config, sched)) -- return -WD_EINVAL; -+ ret = wd_init_param_check(config, sched); -+ if (ret) -+ return ret; - - ret = wd_set_epoll_en("WD_ECC_EPOLL_EN", - &wd_ecc_setting.config.epoll_en); -diff --git a/wd_rsa.c b/wd_rsa.c -index b7f250e..836c8ae 100644 ---- a/wd_rsa.c -+++ b/wd_rsa.c -@@ -118,28 +118,14 @@ void wd_rsa_set_driver(struct wd_rsa_driver *drv) - wd_rsa_setting.driver = drv; - } - --static int param_check(struct wd_ctx_config *config, struct wd_sched *sched) --{ -- if (!config || !config->ctxs[0].ctx || !sched) { -- WD_ERR("invalid: config or sched NULL!\n"); -- return -WD_EINVAL; -- } -- -- if (!wd_is_sva(config->ctxs[0].ctx)) { -- WD_ERR("invalid: the mode is non sva, please check system!\n"); -- return -WD_EINVAL; -- } -- -- return 0; --} -- - int wd_rsa_init(struct wd_ctx_config *config, struct wd_sched *sched) - { - void *priv; - int ret; - -- if (param_check(config, sched)) -- return -WD_EINVAL; -+ ret = wd_init_param_check(config, sched); -+ if (ret) -+ return ret; - - ret = wd_set_epoll_en("WD_RSA_EPOLL_EN", - &wd_rsa_setting.config.epoll_en); -diff --git a/wd_util.c b/wd_util.c -index 8bda8d7..4d5faf9 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -1628,3 +1628,23 @@ int wd_set_epoll_en(const char *var_name, bool *epoll_en) - - return 0; - } -+ -+int wd_init_param_check(struct wd_ctx_config *config, struct wd_sched *sched) -+{ -+ if (!config || !config->ctxs || !config->ctxs[0].ctx) { -+ WD_ERR("invalid: config or config->ctxs is NULL!\n"); -+ return -WD_EINVAL; -+ } -+ -+ if (!sched) { -+ WD_ERR("invalid: sched is NULL!\n"); -+ return -WD_EINVAL; -+ } -+ -+ if (!wd_is_sva(config->ctxs[0].ctx)) { -+ WD_ERR("invalid: the mode is non sva, please check system!\n"); -+ return -WD_EINVAL; -+ } -+ -+ return 0; -+} --- -2.27.0 - diff --git a/0116-comp-remove-unused-variable-priv.patch b/0116-comp-remove-unused-variable-priv.patch deleted file mode 100644 index 84b6bcc..0000000 --- a/0116-comp-remove-unused-variable-priv.patch +++ /dev/null @@ -1,121 +0,0 @@ -From aa9833fb3e1f28446e0dc93aa72887002cf70ca0 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Tue, 31 May 2022 17:01:02 +0800 -Subject: [PATCH 128/183] comp: remove unused variable priv - -Remove variable priv in function comp_send and comp_recv, -it is unused now. - -Signed-off-by: Weili Qian ---- - drv/hisi_comp.c | 5 ++--- - include/drv/wd_comp_drv.h | 4 ++-- - wd_comp.c | 12 ++++-------- - 3 files changed, 8 insertions(+), 13 deletions(-) - -diff --git a/drv/hisi_comp.c b/drv/hisi_comp.c -index e1d2f6e..2a2367b 100644 ---- a/drv/hisi_comp.c -+++ b/drv/hisi_comp.c -@@ -865,7 +865,7 @@ static int fill_zip_comp_sqe(struct hisi_qp *qp, struct wd_comp_msg *msg, - return 0; - } - --static int hisi_zip_comp_send(handle_t ctx, struct wd_comp_msg *msg, void *priv) -+static int hisi_zip_comp_send(handle_t ctx, struct wd_comp_msg *msg) - { - struct hisi_qp *qp = wd_ctx_get_priv(ctx); - handle_t h_qp = (handle_t)qp; -@@ -1020,8 +1020,7 @@ static int parse_zip_sqe(struct hisi_qp *qp, struct hisi_zip_sqe *sqe, - return 0; - } - --static int hisi_zip_comp_recv(handle_t ctx, struct wd_comp_msg *recv_msg, -- void *priv) -+static int hisi_zip_comp_recv(handle_t ctx, struct wd_comp_msg *recv_msg) - { - struct hisi_qp *qp = wd_ctx_get_priv(ctx); - handle_t h_qp = (handle_t)qp; -diff --git a/include/drv/wd_comp_drv.h b/include/drv/wd_comp_drv.h -index 0913ed6..e3d2269 100644 ---- a/include/drv/wd_comp_drv.h -+++ b/include/drv/wd_comp_drv.h -@@ -61,8 +61,8 @@ struct wd_comp_driver { - __u32 drv_ctx_size; - int (*init)(struct wd_ctx_config_internal *config, void *priv); - void (*exit)(void *priv); -- int (*comp_send)(handle_t ctx, struct wd_comp_msg *msg, void *priv); -- int (*comp_recv)(handle_t ctx, struct wd_comp_msg *msg, void *priv); -+ int (*comp_send)(handle_t ctx, struct wd_comp_msg *msg); -+ int (*comp_recv)(handle_t ctx, struct wd_comp_msg *msg); - }; - - void wd_comp_set_driver(struct wd_comp_driver *drv); -diff --git a/wd_comp.c b/wd_comp.c -index f2d01b6..1ae0e78 100644 ---- a/wd_comp.c -+++ b/wd_comp.c -@@ -175,7 +175,6 @@ struct wd_comp_msg *wd_comp_get_msg(__u32 idx, __u32 tag) - int wd_comp_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - { - struct wd_ctx_config_internal *config = &wd_comp_setting.config; -- void *priv = wd_comp_setting.priv; - struct wd_ctx_internal *ctx; - struct wd_comp_msg resp_msg; - struct wd_comp_msg *msg; -@@ -198,8 +197,7 @@ int wd_comp_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - ctx = config->ctxs + idx; - - do { -- ret = wd_comp_setting.driver->comp_recv(ctx->ctx, &resp_msg, -- priv); -+ ret = wd_comp_setting.driver->comp_recv(ctx->ctx, &resp_msg); - if (unlikely(ret < 0)) { - if (ret == -WD_HW_EACCESS) - WD_ERR("wd comp recv hw error!\n"); -@@ -398,7 +396,6 @@ static int wd_comp_sync_job(struct wd_comp_sess *sess, - { - struct wd_ctx_config_internal *config = &wd_comp_setting.config; - handle_t h_sched_ctx = wd_comp_setting.sched.h_sched_ctx; -- void *priv = wd_comp_setting.priv; - struct wd_ctx_internal *ctx; - __u64 recv_count = 0; - __u32 idx; -@@ -415,7 +412,7 @@ static int wd_comp_sync_job(struct wd_comp_sess *sess, - - pthread_spin_lock(&ctx->lock); - -- ret = wd_comp_setting.driver->comp_send(ctx->ctx, msg, priv); -+ ret = wd_comp_setting.driver->comp_send(ctx->ctx, msg); - if (unlikely(ret < 0)) { - pthread_spin_unlock(&ctx->lock); - WD_ERR("wd comp send error, ret = %d!\n", ret); -@@ -428,7 +425,7 @@ static int wd_comp_sync_job(struct wd_comp_sess *sess, - if (unlikely(ret < 0)) - WD_ERR("wd ctx wait timeout, ret = %d!\n", ret); - } -- ret = wd_comp_setting.driver->comp_recv(ctx->ctx, msg, priv); -+ ret = wd_comp_setting.driver->comp_recv(ctx->ctx, msg); - if (unlikely(ret == -WD_HW_EACCESS)) { - pthread_spin_unlock(&ctx->lock); - WD_ERR("wd comp recv hw error!\n"); -@@ -663,7 +660,6 @@ int wd_do_comp_async(handle_t h_sess, struct wd_comp_req *req) - struct wd_ctx_config_internal *config = &wd_comp_setting.config; - struct wd_comp_sess *sess = (struct wd_comp_sess *)h_sess; - handle_t h_sched_ctx = wd_comp_setting.sched.h_sched_ctx; -- void *priv = wd_comp_setting.priv; - struct wd_ctx_internal *ctx; - struct wd_comp_msg *msg; - int tag, ret; -@@ -698,7 +694,7 @@ int wd_do_comp_async(handle_t h_sess, struct wd_comp_req *req) - - pthread_spin_lock(&ctx->lock); - -- ret = wd_comp_setting.driver->comp_send(ctx->ctx, msg, priv); -+ ret = wd_comp_setting.driver->comp_send(ctx->ctx, msg); - if (unlikely(ret < 0)) { - pthread_spin_unlock(&ctx->lock); - WD_ERR("wd comp send error, ret = %d!\n", ret); --- -2.27.0 - diff --git a/0117-ecc-remove-the-lock-in-async-send-funciton.patch b/0117-ecc-remove-the-lock-in-async-send-funciton.patch deleted file mode 100644 index 6bf674b..0000000 --- a/0117-ecc-remove-the-lock-in-async-send-funciton.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 60b860d2fc7029e2399bb2380f1650dd0eff7d51 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Tue, 31 May 2022 17:01:04 +0800 -Subject: [PATCH 129/183] ecc: remove the lock in async send funciton - -When sending message, a lock has been added in function 'hisi_qm_send' -to ensure atomicity, so there is no need to repeat lock in -function 'wd_do_ecc_async'. - -Signed-off-by: Weili Qian ---- - wd_ecc.c | 6 +----- - 1 file changed, 1 insertion(+), 5 deletions(-) - -diff --git a/wd_ecc.c b/wd_ecc.c -index c463049..7dd3853 100644 ---- a/wd_ecc.c -+++ b/wd_ecc.c -@@ -2151,13 +2151,9 @@ int wd_do_ecc_async(handle_t sess, struct wd_ecc_req *req) - goto fail_with_msg; - msg->tag = mid; - -- pthread_spin_lock(&ctx->lock); - ret = ecc_send(ctx->ctx, msg); -- if (ret) { -- pthread_spin_unlock(&ctx->lock); -+ if (ret) - goto fail_with_msg; -- } -- pthread_spin_unlock(&ctx->lock); - - ret = wd_add_task_to_async_queue(&wd_ecc_env_config, idx); - if (ret) --- -2.27.0 - diff --git a/0118-dh-remove-the-lock-in-async-send.patch b/0118-dh-remove-the-lock-in-async-send.patch deleted file mode 100644 index b57d088..0000000 --- a/0118-dh-remove-the-lock-in-async-send.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 6b02f3609923def84213d3a6e775fa45ddfae1b7 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Tue, 31 May 2022 17:01:03 +0800 -Subject: [PATCH 130/183] dh: remove the lock in async send - -When sending task, a lock has been added in function 'hisi_qm_send' -to ensure atomicity, so there is no need to repeat lock in -function 'wd_do_dh_async'. - -Signed-off-by: Weili Qian ---- - wd_dh.c | 6 +----- - 1 file changed, 1 insertion(+), 5 deletions(-) - -diff --git a/wd_dh.c b/wd_dh.c -index dfa9505..dd669f1 100644 ---- a/wd_dh.c -+++ b/wd_dh.c -@@ -323,13 +323,9 @@ int wd_do_dh_async(handle_t sess, struct wd_dh_req *req) - goto fail_with_msg; - msg->tag = mid; - -- pthread_spin_lock(&ctx->lock); - ret = dh_send(ctx->ctx, msg); -- if (ret) { -- pthread_spin_unlock(&ctx->lock); -+ if (ret) - goto fail_with_msg; -- } -- pthread_spin_unlock(&ctx->lock); - - ret = wd_add_task_to_async_queue(&wd_dh_env_config, idx); - if (ret) --- -2.27.0 - diff --git a/0119-comp-remove-the-lock-in-async-send.patch b/0119-comp-remove-the-lock-in-async-send.patch deleted file mode 100644 index 47f14ef..0000000 --- a/0119-comp-remove-the-lock-in-async-send.patch +++ /dev/null @@ -1,39 +0,0 @@ -From a4022d3fea696df788b236a686979f84b4aa4e80 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Tue, 31 May 2022 17:01:05 +0800 -Subject: [PATCH 131/183] comp: remove the lock in async send - -When sending BD, a lock has been added in function 'hisi_qm_send' -to ensure atomicity, so there is no need to repeat lock in -function 'wd_do_comp_async'. - -Signed-off-by: Weili Qian ---- - wd_comp.c | 5 ----- - 1 file changed, 5 deletions(-) - -diff --git a/wd_comp.c b/wd_comp.c -index 1ae0e78..6bf5f82 100644 ---- a/wd_comp.c -+++ b/wd_comp.c -@@ -692,17 +692,12 @@ int wd_do_comp_async(handle_t h_sess, struct wd_comp_req *req) - msg->tag = tag; - msg->stream_mode = WD_COMP_STATELESS; - -- pthread_spin_lock(&ctx->lock); -- - ret = wd_comp_setting.driver->comp_send(ctx->ctx, msg); - if (unlikely(ret < 0)) { -- pthread_spin_unlock(&ctx->lock); - WD_ERR("wd comp send error, ret = %d!\n", ret); - goto fail_with_msg; - } - -- pthread_spin_unlock(&ctx->lock); -- - ret = wd_add_task_to_async_queue(&wd_comp_env_config, idx); - if (unlikely(ret)) - goto fail_with_msg; --- -2.27.0 - diff --git a/0120-dh-remove-repeated-send-BD.patch b/0120-dh-remove-repeated-send-BD.patch deleted file mode 100644 index 4c888d3..0000000 --- a/0120-dh-remove-repeated-send-BD.patch +++ /dev/null @@ -1,88 +0,0 @@ -From f33daa68150250815df2a359a54167c0b426c0af Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Tue, 31 May 2022 17:01:06 +0800 -Subject: [PATCH 132/183] dh: remove repeated send BD - -If -WD_EBUSY is returned When BD is sent, the app -determines whether to resend the BD. The function wd_do_dh_sync -and wd_do_dh_async does not try to resend the BD. - -Signed-off-by: Weili Qian ---- - wd_dh.c | 37 ++++++++++--------------------------- - 1 file changed, 10 insertions(+), 27 deletions(-) - -diff --git a/wd_dh.c b/wd_dh.c -index dd669f1..5f9dff1 100644 ---- a/wd_dh.c -+++ b/wd_dh.c -@@ -19,7 +19,6 @@ - - #define WD_POOL_MAX_ENTRIES 1024 - #define DH_BALANCE_THRHD 1280 --#define DH_RESEND_CNT 8 - #define DH_MAX_KEY_SIZE 512 - #define DH_RECV_MAX_CNT 60000000 // 1 min - #define WD_DH_G2 2 -@@ -192,28 +191,6 @@ static int fill_dh_msg(struct wd_dh_msg *msg, struct wd_dh_req *req, - return 0; - } - --static int dh_send(handle_t ctx, struct wd_dh_msg *msg) --{ -- __u32 tx_cnt = 0; -- int ret; -- -- do { -- ret = wd_dh_setting.driver->send(ctx, msg); -- if (ret == -WD_EBUSY) { -- if (tx_cnt++ >= DH_RESEND_CNT) { -- WD_ERR("failed to send: retry exit!\n"); -- break; -- } -- usleep(1); -- } else if (ret < 0) { -- WD_ERR("failed to send: send error = %d!\n", ret); -- break; -- } -- } while (ret); -- -- return ret; --} -- - static int dh_recv_sync(handle_t ctx, struct wd_dh_msg *msg) - { - struct wd_dh_req *req = &msg->req; -@@ -278,9 +255,11 @@ int wd_do_dh_sync(handle_t sess, struct wd_dh_req *req) - return ret; - - pthread_spin_lock(&ctx->lock); -- ret = dh_send(ctx->ctx, &msg); -- if (unlikely(ret)) -+ ret = wd_dh_setting.driver->send(ctx->ctx, &msg); -+ if (unlikely(ret < 0)) { -+ WD_ERR("failed to send dh BD, ret = %d!\n", ret); - goto fail; -+ } - - ret = dh_recv_sync(ctx->ctx, &msg); - req->pri_bytes = msg.req.pri_bytes; -@@ -323,9 +302,13 @@ int wd_do_dh_async(handle_t sess, struct wd_dh_req *req) - goto fail_with_msg; - msg->tag = mid; - -- ret = dh_send(ctx->ctx, msg); -- if (ret) -+ ret = wd_dh_setting.driver->send(ctx->ctx, msg); -+ if (unlikely(ret)) { -+ if (ret != -WD_EBUSY) -+ WD_ERR("failed to send dh BD, hw is err!\n"); -+ - goto fail_with_msg; -+ } - - ret = wd_add_task_to_async_queue(&wd_dh_env_config, idx); - if (ret) --- -2.27.0 - diff --git a/0121-ecc-remove-repeated-send-BD.patch b/0121-ecc-remove-repeated-send-BD.patch deleted file mode 100644 index 13f8543..0000000 --- a/0121-ecc-remove-repeated-send-BD.patch +++ /dev/null @@ -1,87 +0,0 @@ -From 6cda439c798c470878d1f12beff0a30236b23da3 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Tue, 31 May 2022 17:01:07 +0800 -Subject: [PATCH 133/183] ecc: remove repeated send BD - -If -WD_EBUSY is returned When BD is sent, the app -determines whether to resend the BD. The function wd_do_ecc_sync -and wd_do_ecc_async does not try to resend the BD. - -Signed-off-by: Weili Qian ---- - wd_ecc.c | 36 ++++++++++-------------------------- - 1 file changed, 10 insertions(+), 26 deletions(-) - -diff --git a/wd_ecc.c b/wd_ecc.c -index 7dd3853..f22b72d 100644 ---- a/wd_ecc.c -+++ b/wd_ecc.c -@@ -22,7 +22,6 @@ - #define WD_ECC_MAX_CTX 256 - #define ECC_BALANCE_THRHD 1280 - #define ECC_RECV_MAX_CNT 60000000 --#define ECC_RESEND_CNT 8 - #define ECC_MAX_HW_BITS 521 - #define ECC_MAX_KEY_SIZE BITS_TO_BYTES(ECC_MAX_HW_BITS) - #define ECC_MAX_IN_NUM 4 -@@ -1387,27 +1386,6 @@ static void msg_pack(char *dst, __u64 *out_len, - *out_len += src_len; - } - --static int ecc_send(handle_t ctx, struct wd_ecc_msg *msg) --{ -- __u32 tx_cnt = 0; -- int ret; -- -- do { -- ret = wd_ecc_setting.driver->send(ctx, msg); -- if (ret == -WD_EBUSY) { -- if (tx_cnt++ >= ECC_RESEND_CNT) { -- WD_ERR("failed to send: retry exit!\n"); -- break; -- } -- usleep(1); -- } else if (ret < 0) { -- WD_ERR("failed to send: send error = %d!\n", ret); -- break; -- } -- } while (ret); -- -- return ret; --} - static int ecc_recv_sync(handle_t ctx, struct wd_ecc_msg *msg) - { - struct wd_ecc_req *req = &msg->req; -@@ -1473,9 +1451,11 @@ int wd_do_ecc_sync(handle_t h_sess, struct wd_ecc_req *req) - return ret; - - pthread_spin_lock(&ctx->lock); -- ret = ecc_send(ctx->ctx, &msg); -- if (unlikely(ret)) -+ ret = wd_ecc_setting.driver->send(ctx->ctx, &msg); -+ if (unlikely(ret < 0)) { -+ WD_ERR("failed to send ecc BD, hw is err!\n"); - goto fail; -+ } - - ret = ecc_recv_sync(ctx->ctx, &msg); - fail: -@@ -2151,9 +2131,13 @@ int wd_do_ecc_async(handle_t sess, struct wd_ecc_req *req) - goto fail_with_msg; - msg->tag = mid; - -- ret = ecc_send(ctx->ctx, msg); -- if (ret) -+ ret = wd_ecc_setting.driver->send(ctx->ctx, msg); -+ if (unlikely(ret)) { -+ if (ret != -WD_EBUSY) -+ WD_ERR("failed to send ecc BD, hw is err!\n"); -+ - goto fail_with_msg; -+ } - - ret = wd_add_task_to_async_queue(&wd_ecc_env_config, idx); - if (ret) --- -2.27.0 - diff --git a/0122-rsa-remove-repeated-send-BD.patch b/0122-rsa-remove-repeated-send-BD.patch deleted file mode 100644 index 04382f6..0000000 --- a/0122-rsa-remove-repeated-send-BD.patch +++ /dev/null @@ -1,88 +0,0 @@ -From 9453dd339c43df967cff11f92f270de6f48615a1 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Tue, 31 May 2022 17:01:08 +0800 -Subject: [PATCH 134/183] rsa: remove repeated send BD - -If -WD_EBUSY is returned When BD is sent, the app -determines whether to resend the BD. The function wd_do_rsa_sync -and wd_do_rsa_async does not try to resend the BD. - -Signed-off-by: Weili Qian ---- - wd_rsa.c | 37 ++++++++++--------------------------- - 1 file changed, 10 insertions(+), 27 deletions(-) - -diff --git a/wd_rsa.c b/wd_rsa.c -index 836c8ae..024f0e0 100644 ---- a/wd_rsa.c -+++ b/wd_rsa.c -@@ -20,7 +20,6 @@ - #define WD_HW_EACCESS 62 - - #define RSA_BALANCE_THRHD 1280 --#define RSA_RESEND_CNT 8 - #define RSA_MAX_KEY_SIZE 512 - #define RSA_RECV_MAX_CNT 60000000 // 1 min - -@@ -252,28 +251,6 @@ static int fill_rsa_msg(struct wd_rsa_msg *msg, struct wd_rsa_req *req, - return 0; - } - --static int rsa_send(handle_t ctx, struct wd_rsa_msg *msg) --{ -- __u32 tx_cnt = 0; -- int ret; -- -- do { -- ret = wd_rsa_setting.driver->send(ctx, msg); -- if (ret == -WD_EBUSY) { -- if (tx_cnt++ >= RSA_RESEND_CNT) { -- WD_ERR("failed to send: retry exit!\n"); -- break; -- } -- usleep(1); -- } else if (ret < 0) { -- WD_ERR("failed to send: send error = %d!\n", ret); -- break; -- } -- } while (ret); -- -- return ret; --} -- - static int rsa_recv_sync(handle_t ctx, struct wd_rsa_msg *msg) - { - struct wd_rsa_req *req = &msg->req; -@@ -339,9 +316,11 @@ int wd_do_rsa_sync(handle_t h_sess, struct wd_rsa_req *req) - return ret; - - pthread_spin_lock(&ctx->lock); -- ret = rsa_send(ctx->ctx, &msg); -- if (unlikely(ret)) -+ ret = wd_rsa_setting.driver->send(ctx->ctx, &msg); -+ if (unlikely(ret < 0)) { -+ WD_ERR("failed to send rsa BD, ret = %d!\n", ret); - goto fail; -+ } - - ret = rsa_recv_sync(ctx->ctx, &msg); - fail: -@@ -383,9 +362,13 @@ int wd_do_rsa_async(handle_t sess, struct wd_rsa_req *req) - goto fail_with_msg; - msg->tag = mid; - -- ret = rsa_send(ctx->ctx, msg); -- if (ret) -+ ret = wd_rsa_setting.driver->send(ctx->ctx, msg); -+ if (unlikely(ret)) { -+ if (ret != -WD_EBUSY) -+ WD_ERR("failed to send rsa BD, hw is err!\n"); -+ - goto fail_with_msg; -+ } - - ret = wd_add_task_to_async_queue(&wd_rsa_env_config, idx); - if (ret) --- -2.27.0 - diff --git a/0123-uadk-move-send-and-recv-code-into-wd_util.c.patch b/0123-uadk-move-send-and-recv-code-into-wd_util.c.patch deleted file mode 100644 index 74908f8..0000000 --- a/0123-uadk-move-send-and-recv-code-into-wd_util.c.patch +++ /dev/null @@ -1,1040 +0,0 @@ -From d72b1bd6a9fae5dadfbaacf64e51353e78c785c5 Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Tue, 7 Jun 2022 14:26:49 +0800 -Subject: [PATCH 135/183] uadk: move send and recv code into wd_util.c - -In the synchronization scenario, the code for sending and -receiving BD code is same in wd_.c, so move them -into wd_util.c from wd_.c. - -Signed-off-by: Weili Qian -Signed-off-by: Zhiqi Song ---- - drv/hisi_comp.c | 6 ++-- - drv/hisi_hpre.c | 18 +++++++---- - drv/hisi_sec.c | 44 +++++++++++++++++---------- - include/drv/wd_aead_drv.h | 4 +-- - include/drv/wd_cipher_drv.h | 4 +-- - include/drv/wd_comp_drv.h | 4 +-- - include/drv/wd_dh_drv.h | 4 +-- - include/drv/wd_digest_drv.h | 4 +-- - include/drv/wd_ecc_drv.h | 4 +-- - include/drv/wd_rsa_drv.h | 4 +-- - include/wd_util.h | 18 +++++++++++ - wd_aead.c | 35 ++++------------------ - wd_cipher.c | 35 ++++------------------ - wd_comp.c | 37 ++++------------------- - wd_dh.c | 58 ++++++++--------------------------- - wd_digest.c | 45 ++++++++-------------------- - wd_ecc.c | 60 ++++++++----------------------------- - wd_rsa.c | 60 ++++++++----------------------------- - wd_util.c | 47 +++++++++++++++++++++++++++++ - 19 files changed, 192 insertions(+), 299 deletions(-) - -diff --git a/drv/hisi_comp.c b/drv/hisi_comp.c -index 2a2367b..2c0fc41 100644 ---- a/drv/hisi_comp.c -+++ b/drv/hisi_comp.c -@@ -865,9 +865,10 @@ static int fill_zip_comp_sqe(struct hisi_qp *qp, struct wd_comp_msg *msg, - return 0; - } - --static int hisi_zip_comp_send(handle_t ctx, struct wd_comp_msg *msg) -+static int hisi_zip_comp_send(handle_t ctx, void *comp_msg) - { - struct hisi_qp *qp = wd_ctx_get_priv(ctx); -+ struct wd_comp_msg *msg = comp_msg; - handle_t h_qp = (handle_t)qp; - struct hisi_zip_sqe sqe = {0}; - __u16 count = 0; -@@ -1020,9 +1021,10 @@ static int parse_zip_sqe(struct hisi_qp *qp, struct hisi_zip_sqe *sqe, - return 0; - } - --static int hisi_zip_comp_recv(handle_t ctx, struct wd_comp_msg *recv_msg) -+static int hisi_zip_comp_recv(handle_t ctx, void *comp_msg) - { - struct hisi_qp *qp = wd_ctx_get_priv(ctx); -+ struct wd_comp_msg *recv_msg = comp_msg; - handle_t h_qp = (handle_t)qp; - struct hisi_zip_sqe sqe = {0}; - __u16 count = 0; -diff --git a/drv/hisi_hpre.c b/drv/hisi_hpre.c -index 4e62c0f..7fd4189 100644 ---- a/drv/hisi_hpre.c -+++ b/drv/hisi_hpre.c -@@ -499,9 +499,10 @@ static void hpre_exit(void *priv) - } - } - --static int rsa_send(handle_t ctx, struct wd_rsa_msg *msg) -+static int rsa_send(handle_t ctx, void *rsa_msg) - { - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); -+ struct wd_rsa_msg *msg = rsa_msg; - struct hisi_hpre_sqe hw_msg; - __u16 send_cnt = 0; - int ret; -@@ -535,10 +536,11 @@ static int rsa_send(handle_t ctx, struct wd_rsa_msg *msg) - return hisi_qm_send(h_qp, &hw_msg, 1, &send_cnt); - } - --static int rsa_recv(handle_t ctx, struct wd_rsa_msg *msg) -+static int rsa_recv(handle_t ctx, void *rsa_msg) - { - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); - struct hisi_hpre_sqe hw_msg = {0}; -+ struct wd_rsa_msg *msg = rsa_msg; - __u16 recv_cnt = 0; - int ret; - -@@ -638,9 +640,10 @@ static int dh_out_transfer(struct wd_dh_msg *msg, - return WD_SUCCESS; - } - --static int dh_send(handle_t ctx, struct wd_dh_msg *msg) -+static int dh_send(handle_t ctx, void *dh_msg) - { - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); -+ struct wd_dh_msg *msg = dh_msg; - struct wd_dh_req *req = &msg->req; - struct hisi_hpre_sqe hw_msg; - __u16 send_cnt = 0; -@@ -682,9 +685,10 @@ static int dh_send(handle_t ctx, struct wd_dh_msg *msg) - return hisi_qm_send(h_qp, &hw_msg, 1, &send_cnt); - } - --static int dh_recv(handle_t ctx, struct wd_dh_msg *msg) -+static int dh_recv(handle_t ctx, void *dh_msg) - { - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); -+ struct wd_dh_msg *msg = dh_msg; - struct hisi_hpre_sqe hw_msg = {0}; - __u16 recv_cnt = 0; - int ret; -@@ -1774,9 +1778,10 @@ free_dst: - return ret; - } - --static int ecc_send(handle_t ctx, struct wd_ecc_msg *msg) -+static int ecc_send(handle_t ctx, void *ecc_msg) - { - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); -+ struct wd_ecc_msg *msg = ecc_msg; - - hisi_set_msg_id(h_qp, &msg->tag); - if (msg->req.op_type == WD_SM2_ENCRYPT) -@@ -2336,9 +2341,10 @@ fail: - return ret; - } - --static int ecc_recv(handle_t ctx, struct wd_ecc_msg *msg) -+static int ecc_recv(handle_t ctx, void *ecc_msg) - { - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); -+ struct wd_ecc_msg *msg = ecc_msg; - struct hisi_hpre_sqe hw_msg; - __u16 recv_cnt = 0; - int ret; -diff --git a/drv/hisi_sec.c b/drv/hisi_sec.c -index b17ce0f..7f12549 100644 ---- a/drv/hisi_sec.c -+++ b/drv/hisi_sec.c -@@ -906,9 +906,10 @@ static int fill_cipher_bd2(struct wd_cipher_msg *msg, struct hisi_sec_sqe *sqe) - return 0; - } - --int hisi_sec_cipher_send(handle_t ctx, struct wd_cipher_msg *msg) -+int hisi_sec_cipher_send(handle_t ctx, void *cipher_msg) - { - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); -+ struct wd_cipher_msg *msg = cipher_msg; - struct hisi_sec_sqe sqe; - __u16 count = 0; - int ret; -@@ -950,10 +951,11 @@ int hisi_sec_cipher_send(handle_t ctx, struct wd_cipher_msg *msg) - return 0; - } - --int hisi_sec_cipher_recv(handle_t ctx, struct wd_cipher_msg *recv_msg) -+int hisi_sec_cipher_recv(handle_t ctx, void *cipher_msg) - { -- struct hisi_sec_sqe sqe; - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); -+ struct wd_cipher_msg *recv_msg = cipher_msg; -+ struct hisi_sec_sqe sqe; - __u16 count = 0; - int ret; - -@@ -1112,9 +1114,10 @@ static int fill_cipher_bd3(struct wd_cipher_msg *msg, struct hisi_sec_sqe3 *sqe) - return 0; - } - --int hisi_sec_cipher_send_v3(handle_t ctx, struct wd_cipher_msg *msg) -+int hisi_sec_cipher_send_v3(handle_t ctx, void *cipher_msg) - { - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); -+ struct wd_cipher_msg *msg = cipher_msg; - struct hisi_sec_sqe3 sqe; - __u16 count = 0; - int ret; -@@ -1183,10 +1186,11 @@ static void parse_cipher_bd3(struct hisi_sec_sqe3 *sqe, - recv_msg->out = rmsg->out; - } - --int hisi_sec_cipher_recv_v3(handle_t ctx, struct wd_cipher_msg *recv_msg) -+int hisi_sec_cipher_recv_v3(handle_t ctx, void *cipher_msg) - { -- struct hisi_sec_sqe3 sqe; - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); -+ struct wd_cipher_msg *recv_msg = cipher_msg; -+ struct hisi_sec_sqe3 sqe; - __u16 count = 0; - int ret; - -@@ -1332,9 +1336,10 @@ static int digest_len_check(struct wd_digest_msg *msg, enum sec_bd_type type) - return 0; - } - --int hisi_sec_digest_send(handle_t ctx, struct wd_digest_msg *msg) -+int hisi_sec_digest_send(handle_t ctx, void *digest_msg) - { - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); -+ struct wd_digest_msg *msg = digest_msg; - struct hisi_sec_sqe sqe; - __u16 count = 0; - __u8 scene; -@@ -1396,9 +1401,10 @@ put_sgl: - return ret; - } - --int hisi_sec_digest_recv(handle_t ctx, struct wd_digest_msg *recv_msg) -+int hisi_sec_digest_recv(handle_t ctx, void *digest_msg) - { - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); -+ struct wd_digest_msg *recv_msg = digest_msg; - struct hisi_sec_sqe sqe; - __u16 count = 0; - int ret; -@@ -1486,9 +1492,10 @@ static void qm_fill_digest_long_bd3(struct wd_digest_msg *msg, - } - } - --int hisi_sec_digest_send_v3(handle_t ctx, struct wd_digest_msg *msg) -+int hisi_sec_digest_send_v3(handle_t ctx, void *digest_msg) - { - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); -+ struct wd_digest_msg *msg = digest_msg; - struct hisi_sec_sqe3 sqe; - __u16 count = 0; - __u16 scene; -@@ -1572,9 +1579,10 @@ static void parse_digest_bd3(struct hisi_sec_sqe3 *sqe, - recv_msg->alg_type = WD_DIGEST; - } - --int hisi_sec_digest_recv_v3(handle_t ctx, struct wd_digest_msg *recv_msg) -+int hisi_sec_digest_recv_v3(handle_t ctx, void *digest_msg) - { - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); -+ struct wd_digest_msg *recv_msg = digest_msg; - struct hisi_sec_sqe3 sqe; - __u16 count = 0; - int ret; -@@ -1838,9 +1846,10 @@ static int fill_aead_bd2(struct wd_aead_msg *msg, struct hisi_sec_sqe *sqe) - return 0; - } - --int hisi_sec_aead_send(handle_t ctx, struct wd_aead_msg *msg) -+int hisi_sec_aead_send(handle_t ctx, void *aead_msg) - { - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); -+ struct wd_aead_msg *msg = aead_msg; - struct hisi_sec_sqe sqe; - __u16 count = 0; - int ret; -@@ -1922,10 +1931,11 @@ static void parse_aead_bd2(struct hisi_sec_sqe *sqe, - sqe->type2.cipher_src_offset; - } - --int hisi_sec_aead_recv(handle_t ctx, struct wd_aead_msg *recv_msg) -+int hisi_sec_aead_recv(handle_t ctx, void *aead_msg) - { -- struct hisi_sec_sqe sqe; - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); -+ struct wd_aead_msg *recv_msg = aead_msg; -+ struct hisi_sec_sqe sqe; - __u16 count = 0; - int ret; - -@@ -2103,9 +2113,10 @@ static int fill_aead_bd3(struct wd_aead_msg *msg, struct hisi_sec_sqe3 *sqe) - return 0; - } - --int hisi_sec_aead_send_v3(handle_t ctx, struct wd_aead_msg *msg) -+int hisi_sec_aead_send_v3(handle_t ctx, void *aead_msg) - { - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); -+ struct wd_aead_msg *msg = aead_msg; - struct hisi_sec_sqe3 sqe; - __u16 count = 0; - int ret; -@@ -2181,10 +2192,11 @@ static void parse_aead_bd3(struct hisi_sec_sqe3 *sqe, - sqe->cipher_src_offset; - } - --int hisi_sec_aead_recv_v3(handle_t ctx, struct wd_aead_msg *recv_msg) -+int hisi_sec_aead_recv_v3(handle_t ctx, void *aead_msg) - { -- struct hisi_sec_sqe3 sqe; - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); -+ struct wd_aead_msg *recv_msg = aead_msg; -+ struct hisi_sec_sqe3 sqe; - __u16 count = 0; - int ret; - -diff --git a/include/drv/wd_aead_drv.h b/include/drv/wd_aead_drv.h -index cc28ed5..cca28ba 100644 ---- a/include/drv/wd_aead_drv.h -+++ b/include/drv/wd_aead_drv.h -@@ -70,8 +70,8 @@ struct wd_aead_driver { - __u32 drv_ctx_size; - int (*init)(struct wd_ctx_config_internal *config, void *priv); - void (*exit)(void *priv); -- int (*aead_send)(handle_t ctx, struct wd_aead_msg *msg); -- int (*aead_recv)(handle_t ctx, struct wd_aead_msg *msg); -+ int (*aead_send)(handle_t ctx, void *aead_msg); -+ int (*aead_recv)(handle_t ctx, void *aead_msg); - }; - - void wd_aead_set_driver(struct wd_aead_driver *drv); -diff --git a/include/drv/wd_cipher_drv.h b/include/drv/wd_cipher_drv.h -index 0ec758d..84c9844 100644 ---- a/include/drv/wd_cipher_drv.h -+++ b/include/drv/wd_cipher_drv.h -@@ -56,8 +56,8 @@ struct wd_cipher_driver { - __u32 drv_ctx_size; - int (*init)(struct wd_ctx_config_internal *config, void *priv); - void (*exit)(void *priv); -- int (*cipher_send)(handle_t ctx, struct wd_cipher_msg *msg); -- int (*cipher_recv)(handle_t ctx, struct wd_cipher_msg *msg); -+ int (*cipher_send)(handle_t ctx, void *cipher_msg); -+ int (*cipher_recv)(handle_t ctx, void *cipher_msg); - }; - - void wd_cipher_set_driver(struct wd_cipher_driver *drv); -diff --git a/include/drv/wd_comp_drv.h b/include/drv/wd_comp_drv.h -index e3d2269..a84f895 100644 ---- a/include/drv/wd_comp_drv.h -+++ b/include/drv/wd_comp_drv.h -@@ -61,8 +61,8 @@ struct wd_comp_driver { - __u32 drv_ctx_size; - int (*init)(struct wd_ctx_config_internal *config, void *priv); - void (*exit)(void *priv); -- int (*comp_send)(handle_t ctx, struct wd_comp_msg *msg); -- int (*comp_recv)(handle_t ctx, struct wd_comp_msg *msg); -+ int (*comp_send)(handle_t ctx, void *comp_msg); -+ int (*comp_recv)(handle_t ctx, void *comp_msg); - }; - - void wd_comp_set_driver(struct wd_comp_driver *drv); -diff --git a/include/drv/wd_dh_drv.h b/include/drv/wd_dh_drv.h -index 192e7d8..f8e3065 100644 ---- a/include/drv/wd_dh_drv.h -+++ b/include/drv/wd_dh_drv.h -@@ -30,8 +30,8 @@ struct wd_dh_driver { - int (*init)(struct wd_ctx_config_internal *config, void *priv, - const char *alg_name); - void (*exit)(void *priv); -- int (*send)(handle_t sess, struct wd_dh_msg *msg); -- int (*recv)(handle_t sess, struct wd_dh_msg *msg); -+ int (*send)(handle_t sess, void *dh_msg); -+ int (*recv)(handle_t sess, void *dh_msg); - }; - - void wd_dh_set_driver(struct wd_dh_driver *drv); -diff --git a/include/drv/wd_digest_drv.h b/include/drv/wd_digest_drv.h -index b426ab2..10ce6e1 100644 ---- a/include/drv/wd_digest_drv.h -+++ b/include/drv/wd_digest_drv.h -@@ -58,8 +58,8 @@ struct wd_digest_driver { - __u32 drv_ctx_size; - int (*init)(struct wd_ctx_config_internal *config, void *priv); - void (*exit)(void *priv); -- int (*digest_send)(handle_t ctx, struct wd_digest_msg *msg); -- int (*digest_recv)(handle_t ctx, struct wd_digest_msg *msg); -+ int (*digest_send)(handle_t ctx, void *digest_msg); -+ int (*digest_recv)(handle_t ctx, void *digest_msg); - }; - - void wd_digest_set_driver(struct wd_digest_driver *drv); -diff --git a/include/drv/wd_ecc_drv.h b/include/drv/wd_ecc_drv.h -index ca21759..ef98606 100644 ---- a/include/drv/wd_ecc_drv.h -+++ b/include/drv/wd_ecc_drv.h -@@ -184,8 +184,8 @@ struct wd_ecc_driver { - int (*init)(struct wd_ctx_config_internal *config, void *priv, - const char *alg_name); - void (*exit)(void *priv); -- int (*send)(handle_t sess, struct wd_ecc_msg *msg); -- int (*recv)(handle_t sess, struct wd_ecc_msg *msg); -+ int (*send)(handle_t sess, void *ecc_msg); -+ int (*recv)(handle_t sess, void *ecc_msg); - }; - - void wd_ecc_set_driver(struct wd_ecc_driver *drv); -diff --git a/include/drv/wd_rsa_drv.h b/include/drv/wd_rsa_drv.h -index bde6bbd..28c3337 100644 ---- a/include/drv/wd_rsa_drv.h -+++ b/include/drv/wd_rsa_drv.h -@@ -53,8 +53,8 @@ struct wd_rsa_driver { - int (*init)(struct wd_ctx_config_internal *config, void *priv, - const char *alg_name); - void (*exit)(void *priv); -- int (*send)(handle_t sess, struct wd_rsa_msg *msg); -- int (*recv)(handle_t sess, struct wd_rsa_msg *msg); -+ int (*send)(handle_t sess, void *rsa_msg); -+ int (*recv)(handle_t sess, void *rsa_msg); - }; - - void wd_rsa_set_driver(struct wd_rsa_driver *drv); -diff --git a/include/wd_util.h b/include/wd_util.h -index 89dfe87..eb250f0 100644 ---- a/include/wd_util.h -+++ b/include/wd_util.h -@@ -99,6 +99,11 @@ struct wd_ctx_attr { - __u8 mode; - }; - -+struct wd_msg_handle { -+ int (*send)(handle_t sess, void *msg); -+ int (*recv)(handle_t sess, void *msg); -+}; -+ - /* - * wd_init_ctx_config() - Init internal ctx configuration. - * @in: ctx configuration in global setting. -@@ -327,6 +332,19 @@ int wd_check_ctx(struct wd_ctx_config_internal *config, __u8 mode, __u32 idx); - */ - int wd_set_epoll_en(const char *var_name, bool *epoll_en); - -+/** -+ * wd_handle_msg_sync() - recv msg from hardware -+ * @msg_handle: callback of msg handle ops. -+ * @ctx: the handle of context. -+ * @msg: the msg of task. -+ * @balance: estimated number of receiving msg. -+ * @epoll_en: whether to enable epoll. -+ * -+ * Return 0 if successful or less than 0 otherwise. -+ */ -+int wd_handle_msg_sync(struct wd_msg_handle *msg_handle, handle_t ctx, -+ void *msg, __u64 *balance, bool epoll_en); -+ - /** - * wd_init_check() - Check input parameters for wd__init. - * @config: Ctx configuration input by user. -diff --git a/wd_aead.c b/wd_aead.c -index 3f47f8b..7c07271 100644 ---- a/wd_aead.c -+++ b/wd_aead.c -@@ -19,8 +19,6 @@ - #define WD_AEAD_CCM_GCM_MIN 4U - #define WD_AEAD_CCM_GCM_MAX 16 - #define WD_POOL_MAX_ENTRIES 1024 --#define MAX_RETRY_COUNTS 200000000 -- - - static int g_aead_mac_len[WD_DIGEST_TYPE_MAX] = { - WD_DIGEST_SM3_LEN, WD_DIGEST_MD5_LEN, WD_DIGEST_SHA1_LEN, -@@ -496,36 +494,15 @@ static void fill_request_msg(struct wd_aead_msg *msg, struct wd_aead_req *req, - static int send_recv_sync(struct wd_ctx_internal *ctx, - struct wd_aead_msg *msg) - { -- __u64 recv_cnt = 0; -+ struct wd_msg_handle msg_handle; - int ret; - -- pthread_spin_lock(&ctx->lock); -- ret = wd_aead_setting.driver->aead_send(ctx->ctx, msg); -- if (unlikely(ret < 0)) { -- WD_ERR("failed to send aead bd!\n"); -- goto out; -- } -- -- do { -- if (wd_aead_setting.config.epoll_en) { -- ret = wd_ctx_wait(ctx->ctx, POLL_TIME); -- if (unlikely(ret < 0)) -- WD_ERR("wd aead ctx wait timeout(%d)!\n", ret); -- } -- ret = wd_aead_setting.driver->aead_recv(ctx->ctx, msg); -- if (ret == -WD_HW_EACCESS) { -- WD_ERR("wd aead recv err!\n"); -- goto out; -- } else if (ret == -WD_EAGAIN) { -- if (++recv_cnt > MAX_RETRY_COUNTS) { -- WD_ERR("wd aead recv timeout fail!\n"); -- ret = -WD_ETIMEDOUT; -- goto out; -- } -- } -- } while (ret < 0); -+ msg_handle.send = wd_aead_setting.driver->aead_send; -+ msg_handle.recv = wd_aead_setting.driver->aead_recv; - --out: -+ pthread_spin_lock(&ctx->lock); -+ ret = wd_handle_msg_sync(&msg_handle, ctx->ctx, msg, NULL, -+ wd_aead_setting.config.epoll_en); - pthread_spin_unlock(&ctx->lock); - return ret; - } -diff --git a/wd_cipher.c b/wd_cipher.c -index be8996f..a7e393b 100644 ---- a/wd_cipher.c -+++ b/wd_cipher.c -@@ -19,8 +19,6 @@ - - #define WD_POOL_MAX_ENTRIES 1024 - #define DES_WEAK_KEY_NUM 16 --#define MAX_RETRY_COUNTS 200000000 -- - - static const unsigned char des_weak_keys[DES_WEAK_KEY_NUM][DES_KEY_SIZE] = { - /* weak keys */ -@@ -405,36 +403,15 @@ static int wd_cipher_check_params(handle_t h_sess, - static int send_recv_sync(struct wd_ctx_internal *ctx, - struct wd_cipher_msg *msg) - { -- __u64 recv_cnt = 0; -+ struct wd_msg_handle msg_handle; - int ret; - -- pthread_spin_lock(&ctx->lock); -- ret = wd_cipher_setting.driver->cipher_send(ctx->ctx, msg); -- if (unlikely(ret < 0)) { -- WD_ERR("wd cipher send err!\n"); -- goto out; -- } -- -- do { -- if (wd_cipher_setting.config.epoll_en) { -- ret = wd_ctx_wait(ctx->ctx, POLL_TIME); -- if (unlikely(ret < 0)) -- WD_ERR("wd cipher ctx wait timeout(%d)!\n", ret); -- } -- ret = wd_cipher_setting.driver->cipher_recv(ctx->ctx, msg); -- if (ret == -WD_HW_EACCESS) { -- WD_ERR("wd cipher recv err!\n"); -- goto out; -- } else if (ret == -WD_EAGAIN) { -- if (++recv_cnt > MAX_RETRY_COUNTS) { -- WD_ERR("wd cipher recv timeout fail!\n"); -- ret = -WD_ETIMEDOUT; -- goto out; -- } -- } -- } while (ret < 0); -+ msg_handle.send = wd_cipher_setting.driver->cipher_send; -+ msg_handle.recv = wd_cipher_setting.driver->cipher_recv; - --out: -+ pthread_spin_lock(&ctx->lock); -+ ret = wd_handle_msg_sync(&msg_handle, ctx->ctx, msg, NULL, -+ wd_cipher_setting.config.epoll_en); - pthread_spin_unlock(&ctx->lock); - return ret; - } -diff --git a/wd_comp.c b/wd_comp.c -index 6bf5f82..9107d60 100644 ---- a/wd_comp.c -+++ b/wd_comp.c -@@ -18,11 +18,9 @@ - #include "wd_comp.h" - - #define WD_POOL_MAX_ENTRIES 1024 --#define MAX_RETRY_COUNTS 200000000 - #define HW_CTX_SIZE (64 * 1024) - #define STREAM_CHUNK (128 * 1024) - -- - #define swap_byte(x) \ - ((((x) & 0x000000ff) << 24) | \ - (((x) & 0x0000ff00) << 8) | \ -@@ -396,8 +394,8 @@ static int wd_comp_sync_job(struct wd_comp_sess *sess, - { - struct wd_ctx_config_internal *config = &wd_comp_setting.config; - handle_t h_sched_ctx = wd_comp_setting.sched.h_sched_ctx; -+ struct wd_msg_handle msg_handle; - struct wd_ctx_internal *ctx; -- __u64 recv_count = 0; - __u32 idx; - int ret; - -@@ -410,35 +408,12 @@ static int wd_comp_sync_job(struct wd_comp_sess *sess, - - ctx = config->ctxs + idx; - -- pthread_spin_lock(&ctx->lock); -- -- ret = wd_comp_setting.driver->comp_send(ctx->ctx, msg); -- if (unlikely(ret < 0)) { -- pthread_spin_unlock(&ctx->lock); -- WD_ERR("wd comp send error, ret = %d!\n", ret); -- return ret; -- } -- -- do { -- if (config->epoll_en) { -- ret = wd_ctx_wait(ctx->ctx, POLL_TIME); -- if (unlikely(ret < 0)) -- WD_ERR("wd ctx wait timeout, ret = %d!\n", ret); -- } -- ret = wd_comp_setting.driver->comp_recv(ctx->ctx, msg); -- if (unlikely(ret == -WD_HW_EACCESS)) { -- pthread_spin_unlock(&ctx->lock); -- WD_ERR("wd comp recv hw error!\n"); -- return ret; -- } else if (ret == -WD_EAGAIN) { -- if (++recv_count > MAX_RETRY_COUNTS) { -- pthread_spin_unlock(&ctx->lock); -- WD_ERR("wd comp recv timeout!\n"); -- return -WD_ETIMEDOUT; -- } -- } -- } while (ret == -WD_EAGAIN); -+ msg_handle.send = wd_comp_setting.driver->comp_send; -+ msg_handle.recv = wd_comp_setting.driver->comp_recv; - -+ pthread_spin_lock(&ctx->lock); -+ ret = wd_handle_msg_sync(&msg_handle, ctx->ctx, msg, -+ NULL, config->epoll_en); - pthread_spin_unlock(&ctx->lock); - - return ret; -diff --git a/wd_dh.c b/wd_dh.c -index 5f9dff1..9571ab6 100644 ---- a/wd_dh.c -+++ b/wd_dh.c -@@ -18,12 +18,10 @@ - #include "wd_dh.h" - - #define WD_POOL_MAX_ENTRIES 1024 --#define DH_BALANCE_THRHD 1280 - #define DH_MAX_KEY_SIZE 512 --#define DH_RECV_MAX_CNT 60000000 // 1 min - #define WD_DH_G2 2 - --static __thread int balance; -+static __thread __u64 balance; - - struct wd_dh_sess { - __u32 alg_type; -@@ -191,45 +189,12 @@ static int fill_dh_msg(struct wd_dh_msg *msg, struct wd_dh_req *req, - return 0; - } - --static int dh_recv_sync(handle_t ctx, struct wd_dh_msg *msg) --{ -- struct wd_dh_req *req = &msg->req; -- __u32 rx_cnt = 0; -- int ret; -- -- do { -- if (wd_dh_setting.config.epoll_en) { -- ret = wd_ctx_wait(ctx, POLL_TIME); -- if (ret < 0) -- WD_ERR("wd ctx wait timeout(%d)!\n", ret); -- } -- -- ret = wd_dh_setting.driver->recv(ctx, msg); -- if (ret == -WD_EAGAIN) { -- if (rx_cnt++ >= DH_RECV_MAX_CNT) { -- WD_ERR("failed to recv: timeout!\n"); -- return -WD_ETIMEDOUT; -- } -- -- if (balance > DH_BALANCE_THRHD) -- usleep(1); -- } else if (ret < 0) { -- WD_ERR("failed to recv: error = %d!\n", ret); -- return ret; -- } -- } while (ret < 0); -- -- balance = rx_cnt; -- req->status = msg->result; -- -- return GET_NEGATIVE(req->status); --} -- - int wd_do_dh_sync(handle_t sess, struct wd_dh_req *req) - { - struct wd_ctx_config_internal *config = &wd_dh_setting.config; - handle_t h_sched_ctx = wd_dh_setting.sched.h_sched_ctx; - struct wd_dh_sess *sess_t = (struct wd_dh_sess *)sess; -+ struct wd_msg_handle msg_handle; - struct wd_ctx_internal *ctx; - struct wd_dh_msg msg; - __u32 idx; -@@ -254,19 +219,20 @@ int wd_do_dh_sync(handle_t sess, struct wd_dh_req *req) - if (unlikely(ret)) - return ret; - -+ msg_handle.send = wd_dh_setting.driver->send; -+ msg_handle.recv = wd_dh_setting.driver->recv; -+ - pthread_spin_lock(&ctx->lock); -- ret = wd_dh_setting.driver->send(ctx->ctx, &msg); -- if (unlikely(ret < 0)) { -- WD_ERR("failed to send dh BD, ret = %d!\n", ret); -- goto fail; -- } -+ ret = wd_handle_msg_sync(&msg_handle, ctx->ctx, &msg, &balance, -+ wd_dh_setting.config.epoll_en); -+ pthread_spin_unlock(&ctx->lock); -+ if (unlikely(ret)) -+ return ret; - -- ret = dh_recv_sync(ctx->ctx, &msg); - req->pri_bytes = msg.req.pri_bytes; --fail: -- pthread_spin_unlock(&ctx->lock); -+ req->status = msg.result; - -- return ret; -+ return GET_NEGATIVE(msg.result); - } - - int wd_do_dh_async(handle_t sess, struct wd_dh_req *req) -diff --git a/wd_digest.c b/wd_digest.c -index 46546cb..0fff7c8 100644 ---- a/wd_digest.c -+++ b/wd_digest.c -@@ -17,8 +17,6 @@ - - #define WD_POOL_MAX_ENTRIES 1024 - #define DES_WEAK_KEY_NUM 4 --#define MAX_RETRY_COUNTS 200000000 -- - - static int g_digest_mac_len[WD_DIGEST_TYPE_MAX] = { - WD_DIGEST_SM3_LEN, WD_DIGEST_MD5_LEN, WD_DIGEST_SHA1_LEN, -@@ -294,41 +292,24 @@ static void fill_request_msg(struct wd_digest_msg *msg, - static int send_recv_sync(struct wd_ctx_internal *ctx, struct wd_digest_sess *dsess, - struct wd_digest_msg *msg) - { -- __u64 recv_cnt = 0; -+ struct wd_msg_handle msg_handle; - int ret; - -+ msg_handle.send = wd_digest_setting.driver->digest_send; -+ msg_handle.recv = wd_digest_setting.driver->digest_recv; -+ - pthread_spin_lock(&ctx->lock); -- ret = wd_digest_setting.driver->digest_send(ctx->ctx, msg); -- if (unlikely(ret < 0)) { -- WD_ERR("failed to send bd!\n"); -+ ret = wd_handle_msg_sync(&msg_handle, ctx->ctx, msg, -+ NULL, wd_digest_setting.config.epoll_en); -+ if (unlikely(ret)) - goto out; -- } - -- do { -- if (wd_digest_setting.config.epoll_en) { -- ret = wd_ctx_wait(ctx->ctx, POLL_TIME); -- if (unlikely(ret < 0)) -- WD_ERR("wd digest ctx wait timeout(%d)!\n", ret); -- } -- ret = wd_digest_setting.driver->digest_recv(ctx->ctx, msg); -- if (ret == -WD_HW_EACCESS) { -- WD_ERR("wd digest recv err!\n"); -- goto out; -- } else if (ret == -WD_EAGAIN) { -- if (++recv_cnt > MAX_RETRY_COUNTS) { -- WD_ERR("wd digest recv timeout fail!\n"); -- ret = -WD_ETIMEDOUT; -- goto out; -- } -- } -- -- /* -- * 'out_bytes' can be expressed BD state, non-zero is final BD or -- * middle BD as stream mode. -- */ -- if (msg->has_next) -- dsess->bd_state = msg->out_bytes; -- } while (ret < 0); -+ /* -+ * 'out_bytes' can be expressed BD state, non-zero is final BD or -+ * middle BD as stream mode. -+ */ -+ if (msg->has_next) -+ dsess->bd_state = msg->out_bytes; - - out: - pthread_spin_unlock(&ctx->lock); -diff --git a/wd_ecc.c b/wd_ecc.c -index f22b72d..76c9d5f 100644 ---- a/wd_ecc.c -+++ b/wd_ecc.c -@@ -20,8 +20,6 @@ - #define WD_POOL_MAX_ENTRIES 1024 - #define WD_ECC_CTX_MSG_NUM 64 - #define WD_ECC_MAX_CTX 256 --#define ECC_BALANCE_THRHD 1280 --#define ECC_RECV_MAX_CNT 60000000 - #define ECC_MAX_HW_BITS 521 - #define ECC_MAX_KEY_SIZE BITS_TO_BYTES(ECC_MAX_HW_BITS) - #define ECC_MAX_IN_NUM 4 -@@ -34,7 +32,7 @@ - #define GET_NEGATIVE(val) (0 - (val)) - #define ZA_PARAM_NUM 6 - --static __thread int balance; -+static __thread __u64 balance; - - struct curve_param_desc { - __u32 type; -@@ -1386,46 +1384,12 @@ static void msg_pack(char *dst, __u64 *out_len, - *out_len += src_len; - } - --static int ecc_recv_sync(handle_t ctx, struct wd_ecc_msg *msg) --{ -- struct wd_ecc_req *req = &msg->req; -- __u32 rx_cnt = 0; -- int ret; -- -- do { -- if (wd_ecc_setting.config.epoll_en) { -- ret = wd_ctx_wait(ctx, POLL_TIME); -- if (ret < 0) -- WD_ERR("wd ctx wait timeout(%d)!\n", ret); -- } -- -- ret = wd_ecc_setting.driver->recv(ctx, msg); -- if (ret == -WD_EAGAIN) { -- if (rx_cnt++ >= ECC_RECV_MAX_CNT) { -- WD_ERR("failed to recv: timeout!\n"); -- return -WD_ETIMEDOUT; -- } -- -- if (balance > ECC_BALANCE_THRHD) -- usleep(1); -- } else if (ret < 0) { -- WD_ERR("failed to recv: error = %d!\n", ret); -- return ret; -- } -- } while (ret < 0); -- -- balance = rx_cnt; -- req->status = msg->result; -- req->dst_bytes = msg->req.dst_bytes; -- -- return GET_NEGATIVE(req->status); --} -- - int wd_do_ecc_sync(handle_t h_sess, struct wd_ecc_req *req) - { - struct wd_ctx_config_internal *config = &wd_ecc_setting.config; - handle_t h_sched_ctx = wd_ecc_setting.sched.h_sched_ctx; - struct wd_ecc_sess *sess = (struct wd_ecc_sess *)h_sess; -+ struct wd_msg_handle msg_handle; - struct wd_ctx_internal *ctx; - struct wd_ecc_msg msg; - __u32 idx; -@@ -1450,18 +1414,20 @@ int wd_do_ecc_sync(handle_t h_sess, struct wd_ecc_req *req) - if (unlikely(ret)) - return ret; - -- pthread_spin_lock(&ctx->lock); -- ret = wd_ecc_setting.driver->send(ctx->ctx, &msg); -- if (unlikely(ret < 0)) { -- WD_ERR("failed to send ecc BD, hw is err!\n"); -- goto fail; -- } -+ msg_handle.send = wd_ecc_setting.driver->send; -+ msg_handle.recv = wd_ecc_setting.driver->recv; - -- ret = ecc_recv_sync(ctx->ctx, &msg); --fail: -+ pthread_spin_lock(&ctx->lock); -+ ret = wd_handle_msg_sync(&msg_handle, ctx->ctx, &msg, &balance, -+ wd_ecc_setting.config.epoll_en); - pthread_spin_unlock(&ctx->lock); -+ if (unlikely(ret)) -+ return ret; - -- return ret; -+ req->dst_bytes = msg.req.dst_bytes; -+ req->status = msg.result; -+ -+ return GET_NEGATIVE(msg.result); - } - - static void get_sign_out_params(struct wd_ecc_out *out, -diff --git a/wd_rsa.c b/wd_rsa.c -index 024f0e0..868e78b 100644 ---- a/wd_rsa.c -+++ b/wd_rsa.c -@@ -19,11 +19,9 @@ - #define WD_POOL_MAX_ENTRIES 1024 - #define WD_HW_EACCESS 62 - --#define RSA_BALANCE_THRHD 1280 - #define RSA_MAX_KEY_SIZE 512 --#define RSA_RECV_MAX_CNT 60000000 // 1 min - --static __thread int balance; -+static __thread __u64 balance; - - struct wd_rsa_pubkey { - struct wd_dtb n; -@@ -251,46 +249,12 @@ static int fill_rsa_msg(struct wd_rsa_msg *msg, struct wd_rsa_req *req, - return 0; - } - --static int rsa_recv_sync(handle_t ctx, struct wd_rsa_msg *msg) --{ -- struct wd_rsa_req *req = &msg->req; -- __u32 rx_cnt = 0; -- int ret; -- -- do { -- if (wd_rsa_setting.config.epoll_en) { -- ret = wd_ctx_wait(ctx, POLL_TIME); -- if (ret < 0) -- WD_ERR("wd ctx wait timeout(%d)!\n", ret); -- } -- -- ret = wd_rsa_setting.driver->recv(ctx, msg); -- if (ret == -WD_EAGAIN) { -- if (rx_cnt++ >= RSA_RECV_MAX_CNT) { -- WD_ERR("failed to recv: timeout!\n"); -- return -WD_ETIMEDOUT; -- } -- -- if (balance > RSA_BALANCE_THRHD) -- usleep(1); -- } else if (ret < 0) { -- WD_ERR("failed to recv: error = %d!\n", ret); -- return ret; -- } -- } while (ret < 0); -- -- balance = rx_cnt; -- req->status = msg->result; -- req->dst_bytes = msg->req.dst_bytes; -- -- return GET_NEGATIVE(req->status); --} -- - int wd_do_rsa_sync(handle_t h_sess, struct wd_rsa_req *req) - { - struct wd_ctx_config_internal *config = &wd_rsa_setting.config; - handle_t h_sched_ctx = wd_rsa_setting.sched.h_sched_ctx; - struct wd_rsa_sess *sess = (struct wd_rsa_sess *)h_sess; -+ struct wd_msg_handle msg_handle; - struct wd_ctx_internal *ctx; - struct wd_rsa_msg msg; - __u32 idx; -@@ -315,18 +279,20 @@ int wd_do_rsa_sync(handle_t h_sess, struct wd_rsa_req *req) - if (unlikely(ret)) - return ret; - -- pthread_spin_lock(&ctx->lock); -- ret = wd_rsa_setting.driver->send(ctx->ctx, &msg); -- if (unlikely(ret < 0)) { -- WD_ERR("failed to send rsa BD, ret = %d!\n", ret); -- goto fail; -- } -+ msg_handle.send = wd_rsa_setting.driver->send; -+ msg_handle.recv = wd_rsa_setting.driver->recv; - -- ret = rsa_recv_sync(ctx->ctx, &msg); --fail: -+ pthread_spin_lock(&ctx->lock); -+ ret = wd_handle_msg_sync(&msg_handle, ctx->ctx, &msg, &balance, -+ wd_rsa_setting.config.epoll_en); - pthread_spin_unlock(&ctx->lock); -+ if (unlikely(ret)) -+ return ret; - -- return ret; -+ req->dst_bytes = msg.req.dst_bytes; -+ req->status = msg.result; -+ -+ return GET_NEGATIVE(msg.result); - } - - int wd_do_rsa_async(handle_t sess, struct wd_rsa_req *req) -diff --git a/wd_util.c b/wd_util.c -index 4d5faf9..de77d1e 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -17,6 +17,9 @@ - - #define WD_ASYNC_DEF_POLL_NUM 1 - #define WD_ASYNC_DEF_QUEUE_DEPTH 1024 -+#define WD_BALANCE_THRHD 1280 -+#define WD_RECV_MAX_CNT_SLEEP 60000000 -+#define WD_RECV_MAX_CNT_NOSLEEP 200000000 - - struct msg_pool { - /* message array allocated dynamically */ -@@ -1629,6 +1632,50 @@ int wd_set_epoll_en(const char *var_name, bool *epoll_en) - return 0; - } - -+int wd_handle_msg_sync(struct wd_msg_handle *msg_handle, handle_t ctx, -+ void *msg, __u64 *balance, bool epoll_en) -+{ -+ __u64 timeout = WD_RECV_MAX_CNT_NOSLEEP; -+ __u64 rx_cnt = 0; -+ int ret; -+ -+ if (balance) -+ timeout = WD_RECV_MAX_CNT_SLEEP; -+ -+ ret = msg_handle->send(ctx, msg); -+ if (unlikely(ret < 0)) { -+ WD_ERR("failed to send msg to hw, ret = %d!\n", ret); -+ return ret; -+ } -+ -+ do { -+ if (epoll_en) { -+ ret = wd_ctx_wait(ctx, POLL_TIME); -+ if (ret < 0) -+ WD_ERR("wd ctx wait timeout(%d)!\n", ret); -+ } -+ -+ ret = msg_handle->recv(ctx, msg); -+ if (ret == -WD_EAGAIN) { -+ if (unlikely(rx_cnt++ >= timeout)) { -+ WD_ERR("failed to recv msg: timeout!\n"); -+ return -WD_ETIMEDOUT; -+ } -+ -+ if (balance && *balance > WD_BALANCE_THRHD) -+ usleep(1); -+ } else if (unlikely(ret < 0)) { -+ WD_ERR("failed to recv msg: error = %d!\n", ret); -+ return ret; -+ } -+ } while (ret < 0); -+ -+ if (balance) -+ *balance = rx_cnt; -+ -+ return ret; -+} -+ - int wd_init_param_check(struct wd_ctx_config *config, struct wd_sched *sched) - { - if (!config || !config->ctxs || !config->ctxs[0].ctx) { --- -2.27.0 - diff --git a/0124-uadk-missing-header-file-after-install-uadk.patch b/0124-uadk-missing-header-file-after-install-uadk.patch deleted file mode 100644 index 990d506..0000000 --- a/0124-uadk-missing-header-file-after-install-uadk.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 14c04483057e73f7b5781766d48802055051d59d Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Wed, 8 Jun 2022 09:48:50 +0800 -Subject: [PATCH 136/183] uadk: missing header file after install uadk - -Add header file in build file. - -Signed-off-by: Kai Ye ---- - Makefile.am | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - -diff --git a/Makefile.am b/Makefile.am -index a42ec60..0b31cb3 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -25,13 +25,13 @@ UADK_VERSION = -version-number ${MAJOR}:${MINOR}:${REVISION} - - AM_CFLAGS+= -DUADK_VERSION_NUMBER="\"libwd version: ${MAJOR}.${MINOR}.${REVISION}\"" - --include_HEADERS = include/wd.h include/wd_cipher.h include/wd_comp.h \ -- include/wd_dh.h include/wd_digest.h include/wd_rsa.h \ -- include/uacce.h include/wd_alg_common.h \ -+include_HEADERS = include/wd.h include/wd_cipher.h include/wd_aead.h \ -+ include/wd_comp.h include/wd_dh.h include/wd_digest.h \ -+ include/wd_rsa.h include/uacce.h include/wd_alg_common.h \ - include/wd_common.h include/wd_ecc.h include/wd_sched.h - --nobase_include_HEADERS = v1/wd.h v1/wd_cipher.h v1/uacce.h v1/wd_dh.h v1/wd_digest.h \ -- v1/wd_rsa.h v1/wd_bmm.h -+nobase_include_HEADERS = v1/wd.h v1/wd_cipher.h v1/wd_aead.h v1/uacce.h v1/wd_dh.h \ -+ v1/wd_digest.h v1/wd_rsa.h v1/wd_bmm.h - - lib_LTLIBRARIES=libwd.la libwd_comp.la libwd_crypto.la libhisi_zip.la \ - libhisi_hpre.la libhisi_sec.la --- -2.27.0 - diff --git a/0125-uadk-support-some-uadk-dfx-stronger-features.patch b/0125-uadk-support-some-uadk-dfx-stronger-features.patch deleted file mode 100644 index 555cf92..0000000 --- a/0125-uadk-support-some-uadk-dfx-stronger-features.patch +++ /dev/null @@ -1,1212 +0,0 @@ -From 0951f91ba62c25a3bad11bdb16384692c640a0aa Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Wed, 22 Jun 2022 10:26:28 +0800 -Subject: [PATCH 125/167] uadk: support some uadk dfx stronger features - -1. Add the function of setting the uadk log level, include error, info, - debug by syslog. the uadk log can be printed in message or syslog - file default. You can set your own uadk.log file in rsyslog.conf. - If selected the static compilation, the syslog will not be used. -2. The number of packets in a queue can be read through the - 'uadk_tool'. the maximum number of queues supported is 1024. -3. The 'uadk_tool' supports displaying the library build date. supports - displaying the environment variables. more details, use 'uadk_tool dfx - --help or uadk_tool --help'. - -Signed-off-by: Kai Ye ---- - Makefile.am | 5 + - include/wd.h | 69 +++-- - include/wd_alg_common.h | 1 + - include/wd_util.h | 25 +- - test/hisi_zip_test/test_lib.c | 2 + - uadk_tool/Makefile.am | 11 +- - .../{ => benchmark}/sec_soft_benchmark.c | 0 - .../{ => benchmark}/sec_soft_benchmark.h | 0 - .../{ => benchmark}/sec_uadk_benchmark.c | 0 - .../{ => benchmark}/sec_uadk_benchmark.h | 0 - uadk_tool/{ => benchmark}/sec_wd_benchmark.c | 0 - uadk_tool/{ => benchmark}/sec_wd_benchmark.h | 0 - uadk_tool/{ => benchmark}/uadk_benchmark.c | 3 +- - uadk_tool/{ => benchmark}/uadk_benchmark.h | 2 +- - uadk_tool/dfx/uadk_dfx.c | 253 ++++++++++++++++++ - uadk_tool/{ => dfx}/uadk_dfx.h | 3 - - uadk_tool/uadk_dfx.c | 79 ------ - uadk_tool/uadk_tool.c | 21 +- - wd.c | 79 +++++- - wd_aead.c | 4 +- - wd_cipher.c | 3 + - wd_comp.c | 2 + - wd_dh.c | 2 + - wd_digest.c | 2 + - wd_ecc.c | 6 +- - wd_rsa.c | 2 + - wd_util.c | 91 ++++++- - 27 files changed, 528 insertions(+), 137 deletions(-) - rename uadk_tool/{ => benchmark}/sec_soft_benchmark.c (100%) - rename uadk_tool/{ => benchmark}/sec_soft_benchmark.h (100%) - rename uadk_tool/{ => benchmark}/sec_uadk_benchmark.c (100%) - rename uadk_tool/{ => benchmark}/sec_uadk_benchmark.h (100%) - rename uadk_tool/{ => benchmark}/sec_wd_benchmark.c (100%) - rename uadk_tool/{ => benchmark}/sec_wd_benchmark.h (100%) - rename uadk_tool/{ => benchmark}/uadk_benchmark.c (99%) - rename uadk_tool/{ => benchmark}/uadk_benchmark.h (97%) - create mode 100644 uadk_tool/dfx/uadk_dfx.c - rename uadk_tool/{ => dfx}/uadk_dfx.h (59%) - delete mode 100644 uadk_tool/uadk_dfx.c - -diff --git a/Makefile.am b/Makefile.am -index d7e49f7..7a097f9 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -23,7 +23,11 @@ MINOR = 3 - REVISION = 21 - UADK_VERSION = -version-number ${MAJOR}:${MINOR}:${REVISION} - -+DAY = 11 -+MONTH = Jun -+YEAR = 2022 - AM_CFLAGS+= -DUADK_VERSION_NUMBER="\"libwd version: ${MAJOR}.${MINOR}.${REVISION}\"" -+AM_CFLAGS+= -DUADK_RELEASED_TIME="\"Released ${MONTH} ${DAY}, ${YEAR}\"" - - include_HEADERS = include/wd.h include/wd_cipher.h include/wd_aead.h \ - include/wd_comp.h include/wd_dh.h include/wd_digest.h \ -@@ -78,6 +82,7 @@ libhisi_hpre_la_SOURCES=drv/hisi_hpre.c drv/hisi_qm_udrv.c \ - hisi_qm_udrv.h wd_hpre_drv.h - if WD_STATIC_DRV - AM_CFLAGS += -DWD_STATIC_DRV -+AM_CFLAGS += -DWD_NO_LOG - - libwd_la_LIBADD = $(libwd_la_OBJECTS) -lnuma - -diff --git a/include/wd.h b/include/wd.h -index 56c4109..8c45522 100644 ---- a/include/wd.h -+++ b/include/wd.h -@@ -8,9 +8,11 @@ - #define __WD_H - #include - #include -+#include - #include - #include - #include -+#include - #include - #include - #include "uacce.h" -@@ -25,39 +27,37 @@ extern "C" { - #define MAX_DEV_NAME_LEN 256 - #define LINUX_CRTDIR_SIZE 1 - #define LINUX_PRTDIR_SIZE 2 -+#define WD_CTX_CNT_NUM 1024 -+#define WD_IPC_KEY 0x500011 - - typedef void (*wd_log)(const char *format, ...); - --#ifndef WD_ERR --#ifndef WITH_LOG_FILE --extern wd_log log_out; -- --#define __WD_FILENAME__ (strrchr(__FILE__, '/') ? \ -- ((char *)((uintptr_t)strrchr(__FILE__, '/') + 1)) : __FILE__) -- --#define WD_ERR(format, args...) \ -- (log_out ? log_out("[%s, %d, %s]:"format, \ -- __WD_FILENAME__, __LINE__, __func__, ##args) : \ -- fprintf(stderr, format, ##args)) -+#ifndef WD_NO_LOG -+#define WD_DEBUG(fmt, args...) \ -+ do {\ -+ openlog("uadk-debug", LOG_CONS | LOG_PID, LOG_LOCAL5);\ -+ syslog(LOG_DEBUG, fmt, ##args);\ -+ } while (0) -+ -+#define WD_INFO(fmt, args...) \ -+ do {\ -+ openlog("uadk-info", LOG_CONS | LOG_PID, LOG_LOCAL5);\ -+ syslog(LOG_INFO, fmt, ##args);\ -+ } while (0) -+ -+#define WD_ERR(fmt, args...) \ -+ do {\ -+ openlog("uadk-err", LOG_CONS | LOG_PID, LOG_LOCAL5);\ -+ syslog(LOG_ERR, fmt, ##args);\ -+ } while (0) - #else --extern FILE *flog_fd; --#define WD_ERR(format, args...) do { \ -- if (!flog_fd) \ -- flog_fd = fopen(WITH_LOG_FILE, "a+"); \ -- if (flog_fd) \ -- fprintf(flog_fd, format, ##args); \ -- else \ -- fprintf(stderr, "log %s not exists!", \ -- WITH_LOG_FILE); \ --} while (0) --#endif -+#define OPEN_LOG(s) -+#define WD_DEBUG(fmt, args...) fprintf(stderr, fmt, ##args) -+#define WD_INFO(fmt, args...) fprintf(stderr, fmt, ##args) -+#define WD_ERR(fmt, args...) fprintf(stderr, fmt, ##args) - #endif - --#ifdef DEBUG_LOG --#define dbg(msg, ...) fprintf(stderr, msg, ##__VA_ARGS__) --#else --#define dbg(msg, ...) --#endif -+#define WD_CONSOLE printf - - /* WD error code */ - #define WD_SUCCESS 0 -@@ -488,6 +488,21 @@ void wd_mempool_stats(handle_t mempool, struct wd_mempool_stats *stats); - */ - void wd_blockpool_stats(handle_t blkpool, struct wd_blockpool_stats *stats); - -+/** -+ * wd_get_version() - Get the libwd version number and released time. -+ */ -+void wd_get_version(void); -+ -+/** -+ * wd_need_debug() - Get the debug flag from rsyslog.cnf -+ */ -+bool wd_need_debug(void); -+ -+/** -+ * wd_need_info() - Get the info flag from rsyslog.cnf -+ */ -+bool wd_need_info(void); -+ - #ifdef __cplusplus - } - #endif -diff --git a/include/wd_alg_common.h b/include/wd_alg_common.h -index 855f71d..c455dc3 100644 ---- a/include/wd_alg_common.h -+++ b/include/wd_alg_common.h -@@ -76,6 +76,7 @@ struct wd_ctx_config_internal { - void *priv; - int pid; - bool epoll_en; -+ unsigned long *msg_cnt; - }; - - /** -diff --git a/include/wd_util.h b/include/wd_util.h -index eb250f0..83a9684 100644 ---- a/include/wd_util.h -+++ b/include/wd_util.h -@@ -8,6 +8,8 @@ - #define __WD_UTIL_H - - #include -+#include -+#include - #include - #include "wd_alg_common.h" - -@@ -292,7 +294,7 @@ int wd_add_task_to_async_queue(struct wd_env_config *config, __u32 idx); - */ - void dump_env_info(struct wd_env_config *config); - --/* -+/** - * wd_alg_get_env_param() - get specific ctx number. - * @config: Pointer of wd_env_config which is used to store environment - * variable information. -@@ -304,7 +306,7 @@ int wd_alg_get_env_param(struct wd_env_config *env_config, - struct wd_ctx_attr attr, - __u32 *num, __u8 *is_enable); - --/* -+/** - * wd_set_ctx_attr() - set node type and mode for ctx - * @ctx_attr: ctx attributes pointer. - * @node: numa id. -@@ -315,7 +317,7 @@ int wd_alg_get_env_param(struct wd_env_config *env_config, - int wd_set_ctx_attr(struct wd_ctx_attr *ctx_attr, - __u32 node, __u32 type, __u8 mode, __u32 num); - --/* -+/** - * wd_check_ctx() - check ctx mode and index - * @config: ctx config pointer. - * @mode: synchronous or asynchronous mode. -@@ -354,6 +356,23 @@ int wd_handle_msg_sync(struct wd_msg_handle *msg_handle, handle_t ctx, - */ - int wd_init_param_check(struct wd_ctx_config *config, struct wd_sched *sched); - -+/** -+ * wd_dfx_msg_cnt() - Message counter interface for ctx -+ * @msg: Shared memory addr. -+ * @numSize: Number of elements. -+ * @index: Indicates the CTX index. -+ */ -+static inline void wd_dfx_msg_cnt(unsigned long *msg, __u32 numsize, __u32 idx) -+{ -+ bool ret; -+ -+ ret = wd_need_info(); -+ if (idx > numsize || !ret) -+ return; -+ -+ msg[idx]++; -+} -+ - #ifdef __cplusplus - } - #endif -diff --git a/test/hisi_zip_test/test_lib.c b/test/hisi_zip_test/test_lib.c -index 374244a..5918699 100644 ---- a/test/hisi_zip_test/test_lib.c -+++ b/test/hisi_zip_test/test_lib.c -@@ -22,6 +22,8 @@ struct check_rand_ctx { - unsigned short state[3]; - }; - -+#define dbg(msg, ...) fprintf(stderr, msg, ##__VA_ARGS__) -+ - static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; - static pthread_spinlock_t lock; - static int count = 0; -diff --git a/uadk_tool/Makefile.am b/uadk_tool/Makefile.am -index da5b229..f04b2f0 100644 ---- a/uadk_tool/Makefile.am -+++ b/uadk_tool/Makefile.am -@@ -1,13 +1,16 @@ - ACLOCAL_AMFLAGS = -I m4 -I./include --AM_CFLAGS=-Wall -fno-strict-aliasing -I$(top_srcdir) -I$(top_srcdir)/include \ -+AUTOMAKE_OPTIONS = foreign subdir-objects -+AM_CFLAGS=-Wall -fno-strict-aliasing -I$(top_srcdir) -I$(top_srcdir)/benchmark/include \ - -pthread - - #AUTOMAKE_OPTIONS = subdir-objects - - bin_PROGRAMS=uadk_tool - --uadk_tool_SOURCES=uadk_tool.c uadk_dfx.c uadk_benchmark.c \ -- sec_uadk_benchmark.c sec_wd_benchmark.c -+uadk_tool_SOURCES=uadk_tool.c dfx/uadk_dfx.c dfx/uadk_dfx.h \ -+ benchmark/uadk_benchmark.c benchmark/uadk_benchmark.h \ -+ benchmark/sec_uadk_benchmark.c benchmark/sec_uadk_benchmark.h \ -+ benchmark/sec_wd_benchmark.c benchmark/sec_wd_benchmark.h - - if WD_STATIC_DRV - AM_CFLAGS+=-Bstatic -@@ -27,7 +30,7 @@ uadk_tool_LDFLAGS=-Wl,-rpath,'/usr/local/lib' - if WITH_OPENSSL_DIR - AM_CFLAGS+= -DWITH_OPENSSL_DIR -I$(with_openssl_dir)/include - --uadk_tool_SOURCES+=sec_soft_benchmark.c -+uadk_tool_SOURCES+=benchmark/sec_soft_benchmark.c benchmark/sec_soft_benchmark.h - - if WD_STATIC_DRV - uadk_tool_LDADD+= $(with_openssl_dir)/libcrypto.a -diff --git a/uadk_tool/sec_soft_benchmark.c b/uadk_tool/benchmark/sec_soft_benchmark.c -similarity index 100% -rename from uadk_tool/sec_soft_benchmark.c -rename to uadk_tool/benchmark/sec_soft_benchmark.c -diff --git a/uadk_tool/sec_soft_benchmark.h b/uadk_tool/benchmark/sec_soft_benchmark.h -similarity index 100% -rename from uadk_tool/sec_soft_benchmark.h -rename to uadk_tool/benchmark/sec_soft_benchmark.h -diff --git a/uadk_tool/sec_uadk_benchmark.c b/uadk_tool/benchmark/sec_uadk_benchmark.c -similarity index 100% -rename from uadk_tool/sec_uadk_benchmark.c -rename to uadk_tool/benchmark/sec_uadk_benchmark.c -diff --git a/uadk_tool/sec_uadk_benchmark.h b/uadk_tool/benchmark/sec_uadk_benchmark.h -similarity index 100% -rename from uadk_tool/sec_uadk_benchmark.h -rename to uadk_tool/benchmark/sec_uadk_benchmark.h -diff --git a/uadk_tool/sec_wd_benchmark.c b/uadk_tool/benchmark/sec_wd_benchmark.c -similarity index 100% -rename from uadk_tool/sec_wd_benchmark.c -rename to uadk_tool/benchmark/sec_wd_benchmark.c -diff --git a/uadk_tool/sec_wd_benchmark.h b/uadk_tool/benchmark/sec_wd_benchmark.h -similarity index 100% -rename from uadk_tool/sec_wd_benchmark.h -rename to uadk_tool/benchmark/sec_wd_benchmark.h -diff --git a/uadk_tool/uadk_benchmark.c b/uadk_tool/benchmark/uadk_benchmark.c -similarity index 99% -rename from uadk_tool/uadk_benchmark.c -rename to uadk_tool/benchmark/uadk_benchmark.c -index 8c3c96f..84941d5 100644 ---- a/uadk_tool/uadk_benchmark.c -+++ b/uadk_tool/benchmark/uadk_benchmark.c -@@ -567,7 +567,7 @@ static void print_help(void) - ACC_TST_PRT("UPDATE:2021-7-28\n"); - } - --void benchmark_cmd_parse(int argc, char *argv[], struct acc_option *option) -+int acc_cmd_parse(int argc, char *argv[], struct acc_option *option) - { - int option_index = 0; - int c; -@@ -638,6 +638,7 @@ void benchmark_cmd_parse(int argc, char *argv[], struct acc_option *option) - exit(-1); - } - } -+ return 0; - } - - int acc_option_convert(struct acc_option *option) -diff --git a/uadk_tool/uadk_benchmark.h b/uadk_tool/benchmark/uadk_benchmark.h -similarity index 97% -rename from uadk_tool/uadk_benchmark.h -rename to uadk_tool/benchmark/uadk_benchmark.h -index 7ce0426..2cb3dc0 100644 ---- a/uadk_tool/uadk_benchmark.h -+++ b/uadk_tool/benchmark/uadk_benchmark.h -@@ -170,7 +170,7 @@ extern void add_recv_data(u32 cnt); - extern void add_send_complete(void); - extern u32 get_recv_time(void); - --void benchmark_cmd_parse(int argc, char *argv[], struct acc_option *option); -+int acc_cmd_parse(int argc, char *argv[], struct acc_option *option); - int acc_default_case(struct acc_option *option); - int acc_option_convert(struct acc_option *option); - int acc_benchmark_run(struct acc_option *option); -diff --git a/uadk_tool/dfx/uadk_dfx.c b/uadk_tool/dfx/uadk_dfx.c -new file mode 100644 -index 0000000..796135a ---- /dev/null -+++ b/uadk_tool/dfx/uadk_dfx.c -@@ -0,0 +1,253 @@ -+/* SPDX-License-Identifier: Apache-2.0 */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "include/wd.h" -+#include "uadk_dfx.h" -+ -+#define uadk_build_date() printf("built on: %s %s\n", __DATE__, __TIME__) -+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) -+#define PRIVILEGE_FLAG 666 -+ -+struct uadk_env_var { -+ const char *module; -+ const char *alg; -+ const char *ctx_num_var; -+ const char *epoll_en_var; -+}; -+ -+struct uadk_env_table { -+ int sync_ctx_num; -+ int sync_numa; -+ int async_ctx_num; -+ int async_numa; -+ int poll_en; -+}; -+ -+enum dfx_op_type { -+ DISPLAY_VERSION = 2, -+ DISPLAY_DATE, -+ DISPLAY_DIR, -+ DISPLAY_ENV, -+ DISPLAY_COUNT, -+ DISPLAY_HELP, -+}; -+ -+const char *uadk_modules[] = {"sec", "hpre", "zip"}; -+ -+const struct uadk_env_var env_vars[] = { -+ {.module = "sec", .alg = "CIPHER", .ctx_num_var = "WD_CIPHER_CTX_NUM", -+ .epoll_en_var = "WD_CIPHER_EPOLL_EN"}, -+ {.module = "sec", .alg = "AEAD", .ctx_num_var = "WD_AEAD_CTX_NUM", -+ .epoll_en_var = "WD_AEAD_EPOLL_EN"}, -+ {.module = "sec", .alg = "DIGEST", .ctx_num_var = "WD_DIGEST_CTX_NUM", -+ .epoll_en_var = "WD_DIGEST_EPOLL_EN"}, -+ {.module = "hpre", .alg = "DH", .ctx_num_var = "WD_DH_CTX_NUM", -+ .epoll_en_var = "WD_DH_EPOLL_EN"}, -+ {.module = "hpre", .alg = "RSA", .ctx_num_var = "WD_RSA_CTX_NUM", -+ .epoll_en_var = "WD_RSA_EPOLL_EN"}, -+ {.module = "hpre", .alg = "ECC", .ctx_num_var = "WD_ECC_CTX_NUM", -+ .epoll_en_var = "WD_ECC_EPOLL_EN"}, -+ {.module = "zip", .alg = "COMP", .ctx_num_var = "WD_COMP_CTX_NUM", -+ .epoll_en_var = "WD_COMP_EPOLL_EN"}, -+}; -+ -+static void dump_ctx_count(unsigned long *count) -+{ -+ __u32 idx = 0; -+ int i; -+ -+ if (!count) -+ return; -+ -+ printf("displays the ctx counter value...\n"); -+ for (i = 0; i < WD_CTX_CNT_NUM; i++) { -+ if (count[i]) { -+ printf("ctx-[%d]:%lu \t", i, count[i]); -+ idx++; -+ } else { -+ continue; -+ } -+ -+ if ((idx & 0x3) == 0) -+ printf("\n"); -+ } -+ printf("\n"); -+} -+ -+static int get_shared_id(void) -+{ -+ int shm; -+ -+ shm = shmget(WD_IPC_KEY, sizeof(unsigned long) * WD_CTX_CNT_NUM, -+ IPC_CREAT | PRIVILEGE_FLAG); -+ if (shm < 0) { -+ printf("failed to get the shared memory id.\n"); -+ return -EINVAL; -+ } -+ -+ return shm; -+} -+ -+static int uadk_shared_read(void) -+{ -+ unsigned long *shared; -+ void *ptr; -+ int shm; -+ -+ shm = get_shared_id(); -+ if (shm < 0) -+ return -EINVAL; -+ -+ ptr = (int *)shmat(shm, NULL, 0); -+ if (ptr < 0) { -+ printf("failed to get the shared memory addr.\n"); -+ return -EINVAL; -+ } -+ -+ shared = (unsigned long *)ptr; -+ -+ printf("get the shared memory addr successful.\n"); -+ dump_ctx_count(shared); -+ -+ shmdt(ptr); -+ -+ return 0; -+} -+ -+bool uadk_check_module(const char *module) -+{ -+ int i; -+ -+ for (i = 0; i < ARRAY_SIZE(uadk_modules); i++) { -+ if (!strncmp(module, uadk_modules[i], strlen(module))) -+ return true; -+ } -+ -+ return false; -+} -+ -+static void uadk_ctx_env_config(const char *s) -+{ -+ char *env_setion; -+ -+ if (!s) { -+ printf("input ctx env config is NULL.\n"); -+ return; -+ } -+ -+ env_setion = getenv(s); -+ if (!env_setion) { -+ printf("not found the %s env config!\n", s); -+ return; -+ } -+ -+ printf("%s=%s\n", s, env_setion); -+} -+ -+static void uadk_parse_env_config(const char *module) -+{ -+ int i; -+ -+ for (i = 0; i < ARRAY_SIZE(env_vars); i++) { -+ if (!strncmp(module, env_vars[i].module, strlen(module))) { -+ uadk_ctx_env_config(env_vars[i].ctx_num_var); -+ uadk_ctx_env_config(env_vars[i].epoll_en_var); -+ } -+ } -+} -+ -+static void uadk_exe_path(void) -+{ -+ char dir[PATH_MAX] = {0}; -+ int n; -+ -+ n = readlink("/proc/self/exe", dir, PATH_MAX); -+ if (n < 0 || n >= PATH_MAX) -+ printf("uadk tool failed to get the exe path.\n"); -+ -+ dir[PATH_MAX - 1] = '\0'; -+ printf("exe path: %s\n", dir); -+} -+ -+void print_dfx_help(void) -+{ -+ printf("NAME\n"); -+ printf(" uadk_tool dfx : uadk library dfx function, etc\n"); -+ printf("USAGE\n"); -+ printf(" uadk_tool dfx [--version] = Show library version\n"); -+ printf(" uadk_tool dfx [--date] = Show build date\n"); -+ printf(" uadk_tool dfx [--dir] = Show library dir\n"); -+ printf(" uadk_tool dfx [--env] = Show environment variables\n"); -+ printf(" uadk_tool dfx [--count] = Show the ctx message count\n"); -+ printf(" uadk_tool dfx [--help] = usage\n"); -+ printf("Example\n"); -+ printf(" uadk_tool dfx --version\n"); -+ printf(" uadk_tool dfx --env sec\n"); -+ printf(" uadk_tool dfx --count\n"); -+} -+ -+void dfx_cmd_parse(int argc, char *argv[]) -+{ -+ bool check_module = false; -+ char *input_module = NULL; -+ int option_index = 0; -+ int opt; -+ -+ static struct option long_options[] = { -+ {"version", no_argument, 0, 2}, -+ {"date", no_argument, 0, 3}, -+ {"dir", no_argument, 0, 4}, -+ {"env", required_argument, 0, 5}, -+ {"count", no_argument, 0, 6}, -+ {"help", no_argument, 0, 7}, -+ {0, 0, 0, 0} -+ }; -+ -+ while (1) { -+ opt = getopt_long(argc, argv, "", long_options, &option_index); -+ if (opt == -1) -+ break; -+ -+ switch (opt) { -+ case DISPLAY_VERSION: -+ wd_get_version(); -+ break; -+ case DISPLAY_DATE: -+ uadk_build_date(); -+ break; -+ case DISPLAY_DIR: -+ uadk_exe_path(); -+ break; -+ case DISPLAY_ENV: -+ input_module = optarg; -+ check_module = uadk_check_module(input_module); -+ if (check_module) { -+ uadk_parse_env_config(input_module); -+ } else { -+ print_dfx_help(); -+ printf("failed to parse module parameter!\n"); -+ } -+ break; -+ case DISPLAY_COUNT: -+ uadk_shared_read(); -+ break; -+ case DISPLAY_HELP: -+ print_dfx_help(); -+ break; -+ default: -+ printf("bad input parameter, exit!\n"); -+ print_dfx_help(); -+ break; -+ } -+ } -+} -diff --git a/uadk_tool/uadk_dfx.h b/uadk_tool/dfx/uadk_dfx.h -similarity index 59% -rename from uadk_tool/uadk_dfx.h -rename to uadk_tool/dfx/uadk_dfx.h -index 5f5d9e7..8dc1da1 100644 ---- a/uadk_tool/uadk_dfx.h -+++ b/uadk_tool/dfx/uadk_dfx.h -@@ -2,9 +2,6 @@ - #ifndef UADK_DFX_H - #define UADK_DFX_H - --#define UADK_VERSION_TEXT "UADK 2.3.22, Released Dec 20th, 2021" --#define UADK_VERSION_TAG "4b9c69d" -- - void print_dfx_help(void); - void dfx_cmd_parse(int argc, char *argv[]); - #endif -diff --git a/uadk_tool/uadk_dfx.c b/uadk_tool/uadk_dfx.c -deleted file mode 100644 -index 96c4919..0000000 ---- a/uadk_tool/uadk_dfx.c -+++ /dev/null -@@ -1,79 +0,0 @@ --/* SPDX-License-Identifier: Apache-2.0 */ -- --#include --#include --#include --#include --#include --#include --#include --#include "uadk_dfx.h" -- --#define print_date() printf("built on: %s %s\n", __DATE__, __TIME__) -- --static void print_version(void) --{ -- printf("%s\n", UADK_VERSION_TEXT); -- printf("%s\n", UADK_VERSION_TAG); --} -- --static void print_exe_path(void) --{ -- char dir[PATH_MAX] = {0}; -- int n; -- -- n = readlink("/proc/self/exe", dir, PATH_MAX); -- if (n < 0 || n >= PATH_MAX) -- printf("uadk tool failed to get the exe path.\n"); -- -- printf("exe path: %s\n", dir); --} -- --void print_dfx_help(void) --{ -- printf("NAME\n"); -- printf(" uadk_tool --dfx : uadk library dfx function, etc\n"); -- printf("USAGE\n"); -- printf(" uadk_tool --dfx [--version] = Show library version\n"); -- printf(" uadk_tool --dfx [--date] = Show build date\n"); -- printf(" uadk_tool --dfx [--dir] = Show library dir\n"); -- printf(" uadk_tool --dfx [--help] = usage\n"); --} -- --void dfx_cmd_parse(int argc, char *argv[]) --{ -- int option_index = 0; -- int c; -- -- static struct option long_options[] = { -- {"version", no_argument, 0, 2}, -- {"date", no_argument, 0, 3}, -- {"dir", no_argument, 0, 4}, -- {"help", no_argument, 0, 5}, -- {0, 0, 0, 0} -- }; -- -- while (1) { -- c = getopt_long(argc, argv, "", long_options, &option_index); -- if (c == -1) -- break; -- -- switch (c) { -- case 2: -- print_version(); -- break; -- case 3: -- print_date(); -- break; -- case 4: -- print_exe_path(); -- break; -- case 5: -- print_dfx_help(); -- break; -- default: -- printf("bad input parameter, exit\n"); -- exit(-1); -- } -- } --} -diff --git a/uadk_tool/uadk_tool.c b/uadk_tool/uadk_tool.c -index 88beeba..ce83d7a 100644 ---- a/uadk_tool/uadk_tool.c -+++ b/uadk_tool/uadk_tool.c -@@ -1,12 +1,9 @@ - /* SPDX-License-Identifier: Apache-2.0 */ - - #include --#include - #include --#include --#include --#include "uadk_dfx.h" --#include "uadk_benchmark.h" -+#include "dfx/uadk_dfx.h" -+#include "benchmark/uadk_benchmark.h" - - static void print_tool_help(void) - { -@@ -18,17 +15,21 @@ static void print_tool_help(void) - int main(int argc, char **argv) - { - struct acc_option option = {0}; -+ int index = 1; - int ret; - -- if (argc > 1) { -- if (!strcmp("dfx", argv[1])) { -+ if (argc > index) { -+ if (!strcmp("dfx", argv[index])) { - dfx_cmd_parse(argc, argv); -- } else if (!strcmp("benchmark", argv[1])) { -+ } else if (!strcmp("benchmark", argv[index])) { - printf("start UADK benchmark test.\n"); -- if (!argv[2]) -+ if (!argv[++index]) - acc_default_case(&option); - -- benchmark_cmd_parse(argc, argv, &option); -+ ret = acc_cmd_parse(argc, argv, &option); -+ if (ret) -+ return ret; -+ - ret = acc_option_convert(&option); - if (ret) - return ret; -diff --git a/wd.c b/wd.c -index 3ce9c1e..2dbb2ab 100644 ---- a/wd.c -+++ b/wd.c -@@ -14,6 +14,7 @@ - #include - #include - #include -+#include - #include - #include - -@@ -22,7 +23,14 @@ - - #define SYS_CLASS_DIR "/sys/class/uacce" - --const char *WD_VERSION = UADK_VERSION_NUMBER; -+enum UADK_LOG_LEVEL { -+ LOG_NONE = 0, -+ WD_LOG_ERROR, -+ WD_LOG_INFO, -+ WD_LOG_DEBUG, -+}; -+ -+static int uadk_log_level; - - struct wd_ctx_h { - int fd; -@@ -35,6 +43,54 @@ struct wd_ctx_h { - void *priv; - }; - -+static void wd_parse_log_level(void) -+{ -+ const char *syslog_file = "/etc/rsyslog.conf"; -+ const char *log_dir = "/var/log/uadk.log"; -+ bool log_debug = false; -+ bool log_info = false; -+ struct stat file_info; -+ char *file_contents; -+ FILE *in_file; -+ -+ in_file = fopen(syslog_file, "r"); -+ if (!in_file) { -+ WD_ERR("failed to open the rsyslog.conf file.\n"); -+ return; -+ } -+ -+ if (stat(syslog_file, &file_info) == -1) { -+ WD_ERR("failed to get file information.\n"); -+ goto close_file; -+ } -+ -+ file_contents = malloc(file_info.st_size); -+ if (!file_contents) { -+ WD_ERR("failed to get file contents memory.\n"); -+ goto close_file; -+ } -+ -+ while (fscanf(in_file, "%[^\n ] ", file_contents) != EOF) { -+ if (!strcmp("local5.debug", file_contents)) -+ log_debug = true; -+ else if (!strcmp("local5.info", file_contents)) -+ log_info = true; -+ -+ if (log_debug && !strcmp(log_dir, file_contents)) { -+ uadk_log_level = WD_LOG_DEBUG; -+ break; -+ } else if (log_info && !strcmp(log_dir, file_contents)) { -+ uadk_log_level = WD_LOG_INFO; -+ break; -+ } -+ } -+ -+ free(file_contents); -+ -+close_file: -+ fclose(in_file); -+} -+ - static int get_raw_attr(const char *dev_root, const char *attr, char *buf, - size_t sz) - { -@@ -189,6 +245,8 @@ static struct uacce_dev *read_uacce_sysfs(const char *dev_name) - if (!dev_name) - return NULL; - -+ wd_parse_log_level(); -+ - dev = calloc(1, sizeof(struct uacce_dev)); - if (!dev) - return NULL; -@@ -731,3 +789,22 @@ int wd_ctx_set_io_cmd(handle_t h_ctx, unsigned long cmd, void *arg) - - return ioctl(ctx->fd, cmd, arg); - } -+ -+void wd_get_version(void) -+{ -+ const char *wd_released_time = UADK_RELEASED_TIME; -+ const char *wd_version = UADK_VERSION_NUMBER; -+ -+ WD_CONSOLE("%s\n", wd_version); -+ WD_CONSOLE("%s\n", wd_released_time); -+} -+ -+bool wd_need_debug(void) -+{ -+ return uadk_log_level >= WD_LOG_DEBUG; -+} -+ -+bool wd_need_info(void) -+{ -+ return uadk_log_level >= WD_LOG_INFO; -+} -diff --git a/wd_aead.c b/wd_aead.c -index 7c07271..0c54de3 100644 ---- a/wd_aead.c -+++ b/wd_aead.c -@@ -413,7 +413,7 @@ int wd_aead_init(struct wd_ctx_config *config, struct wd_sched *sched) - wd_aead_set_static_drv(); - #endif - -- /* init sync request pool */ -+ /* init async request pool */ - ret = wd_init_async_request_pool(&wd_aead_setting.pool, - config->ctx_num, WD_POOL_MAX_ENTRIES, - sizeof(struct wd_aead_msg)); -@@ -531,6 +531,7 @@ int wd_do_aead_sync(handle_t h_sess, struct wd_aead_req *req) - if (unlikely(ret)) - return ret; - -+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx); - ctx = config->ctxs + idx; - ret = send_recv_sync(ctx, &msg); - req->state = msg.result; -@@ -563,6 +564,7 @@ int wd_do_aead_async(handle_t h_sess, struct wd_aead_req *req) - if (ret) - return ret; - -+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx); - ctx = config->ctxs + idx; - - msg_id = wd_get_msg_from_pool(&wd_aead_setting.pool, -diff --git a/wd_cipher.c b/wd_cipher.c -index a7e393b..0cd2e42 100644 ---- a/wd_cipher.c -+++ b/wd_cipher.c -@@ -442,7 +442,9 @@ int wd_do_cipher_sync(handle_t h_sess, struct wd_cipher_req *req) - if (unlikely(ret)) - return ret; - -+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx); - ctx = config->ctxs + idx; -+ - ret = send_recv_sync(ctx, &msg); - req->state = msg.result; - -@@ -472,6 +474,7 @@ int wd_do_cipher_async(handle_t h_sess, struct wd_cipher_req *req) - return ret; - - ctx = config->ctxs + idx; -+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx); - - msg_id = wd_get_msg_from_pool(&wd_cipher_setting.pool, idx, - (void **)&msg); -diff --git a/wd_comp.c b/wd_comp.c -index 9107d60..eacebd3 100644 ---- a/wd_comp.c -+++ b/wd_comp.c -@@ -406,6 +406,7 @@ static int wd_comp_sync_job(struct wd_comp_sess *sess, - if (unlikely(ret)) - return ret; - -+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx); - ctx = config->ctxs + idx; - - msg_handle.send = wd_comp_setting.driver->comp_send; -@@ -656,6 +657,7 @@ int wd_do_comp_async(handle_t h_sess, struct wd_comp_req *req) - if (unlikely(ret)) - return ret; - -+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx); - ctx = config->ctxs + idx; - - tag = wd_get_msg_from_pool(&wd_comp_setting.pool, idx, (void **)&msg); -diff --git a/wd_dh.c b/wd_dh.c -index 9571ab6..461f04e 100644 ---- a/wd_dh.c -+++ b/wd_dh.c -@@ -212,6 +212,7 @@ int wd_do_dh_sync(handle_t sess, struct wd_dh_req *req) - if (ret) - return ret; - -+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx); - ctx = config->ctxs + idx; - - memset(&msg, 0, sizeof(struct wd_dh_msg)); -@@ -257,6 +258,7 @@ int wd_do_dh_async(handle_t sess, struct wd_dh_req *req) - if (ret) - return ret; - -+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx); - ctx = config->ctxs + idx; - - mid = wd_get_msg_from_pool(&wd_dh_setting.pool, idx, (void **)&msg); -diff --git a/wd_digest.c b/wd_digest.c -index 0fff7c8..ae37e32 100644 ---- a/wd_digest.c -+++ b/wd_digest.c -@@ -340,6 +340,7 @@ int wd_do_digest_sync(handle_t h_sess, struct wd_digest_req *req) - if (unlikely(ret)) - return ret; - -+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx); - ctx = config->ctxs + idx; - ret = send_recv_sync(ctx, dsess, &msg); - req->state = msg.result; -@@ -372,6 +373,7 @@ int wd_do_digest_async(handle_t h_sess, struct wd_digest_req *req) - if (ret) - return ret; - -+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx); - ctx = config->ctxs + idx; - - msg_id = wd_get_msg_from_pool(&wd_digest_setting.pool, idx, -diff --git a/wd_ecc.c b/wd_ecc.c -index 76c9d5f..1ff6ed3 100644 ---- a/wd_ecc.c -+++ b/wd_ecc.c -@@ -853,14 +853,14 @@ static int fill_user_curve_cfg(struct wd_ecc_curve *param, - if (setup->cv.type == WD_CV_CFG_ID) { - curve_id = setup->cv.cfg.id; - ret = fill_param_by_id(param, setup->key_bits, curve_id); -- dbg("set curve id %u!\n", curve_id); -+ WD_DEBUG("set curve id %u!\n", curve_id); - } else if (setup->cv.type == WD_CV_CFG_PARAM) { - ret = set_key_cv(param, src_param); - if (ret) { - WD_ERR("failed to set key cv!\n"); - return ret; - } -- dbg("set curve by user param!\n"); -+ WD_DEBUG("set curve by user param!\n"); - } else { - WD_ERR("invalid: fill curve cfg type %u is error!\n", setup->cv.type); - return -WD_EINVAL; -@@ -1407,6 +1407,7 @@ int wd_do_ecc_sync(handle_t h_sess, struct wd_ecc_req *req) - if (ret) - return ret; - -+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx); - ctx = config->ctxs + idx; - - memset(&msg, 0, sizeof(struct wd_ecc_msg)); -@@ -2086,6 +2087,7 @@ int wd_do_ecc_async(handle_t sess, struct wd_ecc_req *req) - if (ret) - return ret; - -+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx); - ctx = config->ctxs + idx; - - mid = wd_get_msg_from_pool(&wd_ecc_setting.pool, idx, (void **)&msg); -diff --git a/wd_rsa.c b/wd_rsa.c -index 868e78b..e76da09 100644 ---- a/wd_rsa.c -+++ b/wd_rsa.c -@@ -272,6 +272,7 @@ int wd_do_rsa_sync(handle_t h_sess, struct wd_rsa_req *req) - if (ret) - return ret; - -+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx); - ctx = config->ctxs + idx; - - memset(&msg, 0, sizeof(struct wd_rsa_msg)); -@@ -317,6 +318,7 @@ int wd_do_rsa_async(handle_t sess, struct wd_rsa_req *req) - if (ret) - return ret; - -+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx); - ctx = config->ctxs + idx; - - mid = wd_get_msg_from_pool(&wd_rsa_setting.pool, idx, (void **)&msg); -diff --git a/wd_util.c b/wd_util.c -index de77d1e..04a2a5b 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -20,6 +20,7 @@ - #define WD_BALANCE_THRHD 1280 - #define WD_RECV_MAX_CNT_SLEEP 60000000 - #define WD_RECV_MAX_CNT_NOSLEEP 200000000 -+#define PRIVILEGE_FLAG 600 - - struct msg_pool { - /* message array allocated dynamically */ -@@ -70,11 +71,76 @@ static void clone_ctx_to_internal(struct wd_ctx *ctx, - ctx_in->ctx_mode = ctx->ctx_mode; - } - -+static int get_shared_memory_id(__u32 numsize) -+{ -+ int shm; -+ -+ shm = shmget(WD_IPC_KEY, sizeof(unsigned long) * numsize, -+ IPC_CREAT | PRIVILEGE_FLAG); -+ if (shm < 0) { -+ WD_ERR("failed to get shared memory id.\n"); -+ return -WD_EINVAL; -+ } -+ -+ return shm; -+} -+ -+static unsigned long *wd_shared_create(__u32 numsize) -+{ -+ bool need_info = wd_need_info(); -+ void *ptr; -+ int shm; -+ -+ if (!need_info) -+ return NULL; -+ -+ if (numsize > WD_CTX_CNT_NUM) { -+ WD_ERR("invalid: input parameter is err!\n"); -+ return NULL; -+ } -+ -+ shm = get_shared_memory_id(numsize); -+ if (shm < 0) -+ return NULL; -+ -+ ptr = shmat(shm, NULL, 0); -+ if (ptr == (void *)-1) { -+ WD_ERR("failed to get shared memory addr.\n"); -+ return NULL; -+ } -+ -+ memset(ptr, 0, sizeof(unsigned long) * numsize); -+ -+ return ptr; -+} -+ -+static void wd_shared_delete(__u32 numsize) -+{ -+ bool need_info = wd_need_info(); -+ int shm; -+ -+ if (!need_info) -+ return; -+ -+ if (numsize > WD_CTX_CNT_NUM) { -+ WD_ERR("invalid: input parameter is err!\n"); -+ return; -+ } -+ -+ shm = get_shared_memory_id(numsize); -+ if (shm < 0) -+ return; -+ -+ /* deleted shared memory */ -+ shmctl(shm, IPC_RMID, NULL); -+} -+ - int wd_init_ctx_config(struct wd_ctx_config_internal *in, - struct wd_ctx_config *cfg) - { -+ bool need_info = wd_need_info(); - struct wd_ctx_internal *ctxs; -- int i, ret; -+ int i, j, ret; - - if (!cfg->ctx_num) { - WD_ERR("invalid: ctx_num is 0!\n"); -@@ -87,25 +153,29 @@ int wd_init_ctx_config(struct wd_ctx_config_internal *in, - return -WD_EEXIST; - } - -+ in->msg_cnt = wd_shared_create(WD_CTX_CNT_NUM); -+ if (!in->msg_cnt && need_info) -+ return -WD_EINVAL; -+ - ctxs = calloc(1, cfg->ctx_num * sizeof(struct wd_ctx_internal)); - if (!ctxs) { - WD_ERR("failed to alloc memory for internal ctxs!\n"); -+ wd_shared_delete(WD_CTX_CNT_NUM); - return -WD_ENOMEM; - } - - for (i = 0; i < cfg->ctx_num; i++) { - if (!cfg->ctxs[i].ctx) { - WD_ERR("invalid: ctx is NULL!\n"); -- free(ctxs); -- return -WD_EINVAL; -+ ret = -WD_EINVAL; -+ goto err_out; - } - - clone_ctx_to_internal(cfg->ctxs + i, ctxs + i); - ret = pthread_spin_init(&ctxs[i].lock, PTHREAD_PROCESS_SHARED); - if (ret) { - WD_ERR("failed to init ctxs lock!\n"); -- free(ctxs); -- return ret; -+ goto err_out; - } - } - -@@ -115,6 +185,14 @@ int wd_init_ctx_config(struct wd_ctx_config_internal *in, - in->ctx_num = cfg->ctx_num; - - return 0; -+ -+err_out: -+ for (j = 0; j < i; j++) -+ pthread_spin_destroy(&ctxs[j].lock); -+ -+ wd_shared_delete(WD_CTX_CNT_NUM); -+ free(ctxs); -+ return ret; - } - - int wd_init_sched(struct wd_sched *in, struct wd_sched *from) -@@ -161,6 +239,9 @@ void wd_clear_ctx_config(struct wd_ctx_config_internal *in) - free(in->ctxs); - in->ctxs = NULL; - } -+ -+ wd_shared_delete(WD_CTX_CNT_NUM); -+ in->msg_cnt = NULL; - } - - void wd_memset_zero(void *data, __u32 size) --- -2.27.0 - diff --git a/0126-uadk-sgl-data-can-be-dumped.patch b/0126-uadk-sgl-data-can-be-dumped.patch deleted file mode 100644 index e8746d3..0000000 --- a/0126-uadk-sgl-data-can-be-dumped.patch +++ /dev/null @@ -1,96 +0,0 @@ -From 96eae2df1f7a42580037320ae78d513ae5c69dc3 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Wed, 22 Jun 2022 10:26:29 +0800 -Subject: [PATCH 139/183] uadk: sgl data can be dumped - -Users can dump the sgl data after setting the uadk log is the -debug level. - -Signed-off-by: Kai Ye ---- - drv/hisi_qm_udrv.c | 55 +++++++++++++++++++++++++++------------------- - 1 file changed, 33 insertions(+), 22 deletions(-) - -diff --git a/drv/hisi_qm_udrv.c b/drv/hisi_qm_udrv.c -index 3cb6ffb..985aecc 100644 ---- a/drv/hisi_qm_udrv.c -+++ b/drv/hisi_qm_udrv.c -@@ -737,6 +737,37 @@ void hisi_qm_put_hw_sgl(handle_t sgl_pool, void *hw_sgl) - return; - } - -+static void hisi_qm_dump_sgl(void *sgl) -+{ -+ struct hisi_sgl *tmp = (struct hisi_sgl *)sgl; -+ bool need_debug = wd_need_debug(); -+ int k = 0; -+ int i; -+ -+ if (!need_debug) -+ return; -+ -+ while (tmp) { -+ WD_DEBUG("[sgl-%d]->entry_sum_in_chain: %u\n", k, -+ tmp->entry_sum_in_chain); -+ WD_DEBUG("[sgl-%d]->entry_sum_in_sgl: %u\n", k, -+ tmp->entry_sum_in_sgl); -+ WD_DEBUG("[sgl-%d]->entry_length_in_sgl: %u\n", k, -+ tmp->entry_length_in_sgl); -+ for (i = 0; i < tmp->entry_sum_in_sgl; i++) -+ WD_DEBUG("[sgl-%d]->sge_entries[%d].len: %u\n", k, i, -+ tmp->sge_entries[i].len); -+ -+ tmp = (struct hisi_sgl *)tmp->next_dma; -+ k++; -+ -+ if (!tmp) { -+ WD_DEBUG("debug: sgl num size:%d\n", k); -+ return; -+ } -+ } -+} -+ - void *hisi_qm_get_hw_sgl(handle_t sgl_pool, struct wd_datalist *sgl) - { - struct hisi_sgl_pool *pool = (struct hisi_sgl_pool *)sgl_pool; -@@ -799,6 +830,8 @@ void *hisi_qm_get_hw_sgl(handle_t sgl_pool, struct wd_datalist *sgl) - if (!head->entry_sum_in_chain) - goto err_out; - -+ hisi_qm_dump_sgl(head); -+ - return head; - err_out: - hisi_qm_put_hw_sgl(sgl_pool, head); -@@ -922,28 +955,6 @@ void hisi_qm_sgl_copy(void *pbuff, void *hw_sgl, __u32 offset, __u32 size, - size); - } - --void hisi_qm_dump_sgl(void *sgl) --{ -- struct hisi_sgl *tmp = (struct hisi_sgl *)sgl; -- int i; -- -- while (tmp) { -- WD_ERR("sgl->entry_sum_in_chain : %u\n", -- tmp->entry_sum_in_chain); -- WD_ERR("sgl->entry_sum_in_sgl : %u\n", -- tmp->entry_sum_in_sgl); -- WD_ERR("sgl->entry_length_in_sgl : %u\n", -- tmp->entry_length_in_sgl); -- for (i = 0; i < tmp->entry_sum_in_sgl; i++) { -- WD_ERR("sgl->sge_entries[%d].buff : 0x%lx\n", i, -- tmp->sge_entries[i].buff); -- WD_ERR("sgl->sge_entries[%d].len : %u\n", i, -- tmp->sge_entries[i].len); -- } -- tmp = (struct hisi_sgl *)tmp->next_dma; -- } --} -- - __u32 hisi_qm_get_list_size(struct wd_datalist *start_node, - struct wd_datalist *end_node) - { --- -2.27.0 - diff --git a/0127-uadk-supports-zip-and-sec-message-dumping.patch b/0127-uadk-supports-zip-and-sec-message-dumping.patch deleted file mode 100644 index 340a8ff..0000000 --- a/0127-uadk-supports-zip-and-sec-message-dumping.patch +++ /dev/null @@ -1,631 +0,0 @@ -From 71d7f88f42da4959037adebd34804ef32af95d0d Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Wed, 22 Jun 2022 10:26:30 +0800 -Subject: [PATCH 140/183] uadk: supports zip and sec message dumping - -Dumping ZIP and SEC messages as receiving task errors. - -Signed-off-by: Kai Ye ---- - drv/hisi_comp.c | 18 ++- - drv/hisi_sec.c | 297 +++++++++++++++++++++++------------- - include/drv/wd_aead_drv.h | 1 + - include/drv/wd_cipher_drv.h | 1 + - include/drv/wd_digest_drv.h | 1 + - wd_aead.c | 5 + - wd_cipher.c | 5 + - wd_digest.c | 5 + - 8 files changed, 227 insertions(+), 106 deletions(-) - -diff --git a/drv/hisi_comp.c b/drv/hisi_comp.c -index 2c0fc41..69785e9 100644 ---- a/drv/hisi_comp.c -+++ b/drv/hisi_comp.c -@@ -189,6 +189,13 @@ struct hisi_zip_ctx { - struct wd_ctx_config_internal config; - }; - -+static void dump_zip_msg(struct wd_comp_msg *msg) -+{ -+ WD_ERR("dump zip message after a task error occurs.\n"); -+ WD_ERR("avali_out:%u in_cons:%u produced:%u data_fmt:%d.\n", -+ msg->avail_out, msg->in_cons, msg->produced, msg->data_fmt); -+} -+ - static int buf_size_check_deflate(__u32 *in_size, __u32 *out_size) - { - if (unlikely(*in_size > HZ_MAX_SIZE)) { -@@ -958,13 +965,15 @@ static void get_ctx_buf(struct hisi_zip_sqe *sqe, - } - - static int parse_zip_sqe(struct hisi_qp *qp, struct hisi_zip_sqe *sqe, -- struct wd_comp_msg *recv_msg) -+ struct wd_comp_msg *msg) - { - __u32 buf_type = (sqe->dw9 & HZ_BUF_TYPE_MASK) >> BUF_TYPE_SHIFT; - __u16 ctx_st = sqe->ctx_dw0 & HZ_CTX_ST_MASK; - __u16 lstblk = sqe->dw3 & HZ_LSTBLK_MASK; - __u32 status = sqe->dw3 & HZ_STATUS_MASK; - __u32 type = sqe->dw9 & HZ_REQ_TYPE_MASK; -+ struct wd_comp_msg *recv_msg = msg; -+ bool need_debug = wd_need_debug(); - int alg_type, ret; - __u32 tag; - -@@ -1007,7 +1016,9 @@ static int parse_zip_sqe(struct hisi_qp *qp, struct hisi_zip_sqe *sqe, - if (ctx_st == HZ_DECOMP_NO_SPACE) - recv_msg->req.status = WD_EAGAIN; - -- dbg("zip recv lst =%hu, ctx_st=0x%x, status=0x%x, alg=%u!\n", lstblk, ctx_st, status, type); -+ if (need_debug) -+ WD_DEBUG("zip recv lst =%hu, ctx_st=0x%x, status=0x%x, alg=%u!\n", -+ lstblk, ctx_st, status, type); - if (lstblk && (status == HZ_DECOMP_END)) - recv_msg->req.status = WD_STREAM_END; - -@@ -1018,6 +1029,9 @@ static int parse_zip_sqe(struct hisi_qp *qp, struct hisi_zip_sqe *sqe, - if (buf_type == WD_SGL_BUF) - free_hw_sgl((handle_t)qp, sqe, alg_type); - -+ if (unlikely(recv_msg->req.status == WD_IN_EPARA)) -+ dump_zip_msg(recv_msg); -+ - return 0; - } - -diff --git a/drv/hisi_sec.c b/drv/hisi_sec.c -index 7f12549..5865ffb 100644 ---- a/drv/hisi_sec.c -+++ b/drv/hisi_sec.c -@@ -486,6 +486,56 @@ static int g_hmac_a_alg[WD_DIGEST_TYPE_MAX] = { - int hisi_sec_init(struct wd_ctx_config_internal *config, void *priv); - void hisi_sec_exit(void *priv); - -+static void dump_sec_msg(void *msg, const char *alg) -+{ -+ struct wd_cipher_msg *cmsg; -+ struct wd_digest_msg *dmsg; -+ struct wd_aead_msg *amsg; -+ -+ WD_ERR("dump %s alg message after a task error occurs.\n", alg); -+ -+ if (!strcmp(alg, "cipher")) { -+ cmsg = (struct wd_cipher_msg *)msg; -+ WD_ERR("type:%u alg:%u op_type:%u mode:%u data_fmt:%u\n", -+ cmsg->alg_type, cmsg->alg, cmsg->op_type, cmsg->mode, -+ cmsg->data_fmt); -+ WD_ERR("key_bytes:%u iv_bytes:%u in_bytes:%u out_bytes:%u\n", -+ cmsg->key_bytes, cmsg->iv_bytes, cmsg->in_bytes, cmsg->out_bytes); -+ } else if (!strcmp(alg, "digest")) { -+ dmsg = (struct wd_digest_msg *)msg; -+ WD_ERR("type:%u alg:%u has_next:%u mode:%u data_fmt:%u\n", -+ dmsg->alg_type, dmsg->alg, dmsg->has_next, dmsg->mode, dmsg->data_fmt); -+ WD_ERR("key_bytes:%u iv_bytes:%u in_bytes:%u out_bytes:%u\n", -+ dmsg->key_bytes, dmsg->iv_bytes, dmsg->in_bytes, dmsg->out_bytes); -+ } else if (!strcmp(alg, "aead")) { -+ amsg = (struct wd_aead_msg *)msg; -+ WD_ERR("type:%u calg:%u op_type:%u cmode:%u\n", -+ amsg->alg_type, amsg->calg, amsg->op_type, amsg->cmode); -+ WD_ERR("data_fmt:%u ckey_bytes:%u auth_bytes:%u\n", -+ amsg->data_fmt, amsg->ckey_bytes, amsg->auth_bytes); -+ WD_ERR("assoc_bytes:%u in_bytes:%u out_bytes:%u\n", -+ amsg->assoc_bytes, amsg->in_bytes, amsg->out_bytes); -+ } -+} -+ -+static __u8 get_data_fmt_v3(__u32 bd_param) -+{ -+ /* Only check the src addr type */ -+ if (bd_param & SEC_PBUFF_MODE_MASK_V3) -+ return WD_SGL_BUF; -+ -+ return WD_FLAT_BUF; -+} -+ -+static __u8 get_data_fmt_v2(__u32 sds_sa_type) -+{ -+ /* Only check the src addr type */ -+ if (sds_sa_type & SEC_SGL_SDS_MASK) -+ return WD_SGL_BUF; -+ -+ return WD_FLAT_BUF; -+} -+ - /* increment counter (128-bit int) by software */ - static void ctr_iv_inc(__u8 *counter, __u32 len) - { -@@ -668,25 +718,14 @@ static void fill_cipher_bd2_addr(struct wd_cipher_msg *msg, - sqe->type2.data_dst_addr = (__u64)(uintptr_t)msg->out; - sqe->type2.c_ivin_addr = (__u64)(uintptr_t)msg->iv; - sqe->type2.c_key_addr = (__u64)(uintptr_t)msg->key; -- -- /* -- * Because some special algorithms need to update IV -- * after receiving the BD, and the relevant information -- * is in the send message, so the BD field segment is -- * needed to return the message pointer. -- * The Cipher algorithm does not use the mac_addr segment -- * in the BD domain and the hardware will copy all the -- * field values of the send BD when returning, so we use -- * mac_addr to carry the message pointer here. -- */ -- sqe->type2.mac_addr = (__u64)(uintptr_t)msg; - } - --static void parse_cipher_bd2(struct hisi_sec_sqe *sqe, -+static void parse_cipher_bd2(struct hisi_qp *qp, struct hisi_sec_sqe *sqe, - struct wd_cipher_msg *recv_msg) - { -- struct wd_cipher_msg *rmsg; -+ struct wd_cipher_msg *temp_msg; - __u16 done; -+ __u32 tag; - - done = sqe->type2.done_flag & SEC_DONE_MASK; - if (done != SEC_HW_TASK_DONE || sqe->type2.error_type) { -@@ -697,17 +736,33 @@ static void parse_cipher_bd2(struct hisi_sec_sqe *sqe, - recv_msg->result = WD_SUCCESS; - } - -- rmsg = (struct wd_cipher_msg *)(uintptr_t)sqe->type2.mac_addr; -+ tag = sqe->type2.tag; -+ recv_msg->tag = tag; -+ -+ if (qp->q_info.qp_mode == CTX_MODE_ASYNC) { -+ recv_msg->alg_type = WD_CIPHER; -+ recv_msg->data_fmt = get_data_fmt_v2(sqe->sds_sa_type); -+ recv_msg->in = (__u8 *)(uintptr_t)sqe->type2.data_src_addr; -+ recv_msg->out = (__u8 *)(uintptr_t)sqe->type2.data_dst_addr; -+ temp_msg = wd_cipher_get_msg(qp->q_info.idx, tag); -+ if (!temp_msg) { -+ recv_msg->result = WD_IN_EPARA; -+ WD_ERR("failed to get send msg! idx = %u, tag = %u.\n", -+ qp->q_info.idx, tag); -+ return; -+ } -+ } else { -+ /* The synchronization mode uses the same message */ -+ temp_msg = recv_msg; -+ } - -- if (rmsg->data_fmt != WD_SGL_BUF) -- update_iv(rmsg); -+ if (temp_msg->data_fmt != WD_SGL_BUF) -+ update_iv(temp_msg); - else -- update_iv_sgl(rmsg); -+ update_iv_sgl(temp_msg); - -- recv_msg->data_fmt = rmsg->data_fmt; -- recv_msg->alg_type = rmsg->alg_type; -- recv_msg->in = rmsg->in; -- recv_msg->out = rmsg->out; -+ if (unlikely(recv_msg->result != WD_SUCCESS)) -+ dump_sec_msg(temp_msg, "cipher"); - } - - static int cipher_len_check(struct wd_cipher_msg *msg) -@@ -752,24 +807,6 @@ static int cipher_len_check(struct wd_cipher_msg *msg) - return 0; - } - --static __u8 hisi_sec_get_data_fmt_v3(__u32 bd_param) --{ -- /* Only check the src addr type */ -- if (bd_param & SEC_PBUFF_MODE_MASK_V3) -- return WD_SGL_BUF; -- -- return WD_FLAT_BUF; --} -- --static __u8 hisi_sec_get_data_fmt_v2(__u32 sds_sa_type) --{ -- /* Only check the src addr type */ -- if (sds_sa_type & SEC_SGL_SDS_MASK) -- return WD_SGL_BUF; -- -- return WD_FLAT_BUF; --} -- - static void hisi_sec_put_sgl(handle_t h_qp, __u8 alg_type, void *in, void *out) - { - handle_t h_sgl_pool; -@@ -967,8 +1004,7 @@ int hisi_sec_cipher_recv(handle_t ctx, void *cipher_msg) - if (ret) - return ret; - -- parse_cipher_bd2(&sqe, recv_msg); -- recv_msg->tag = sqe.type2.tag; -+ parse_cipher_bd2((struct hisi_qp *)h_qp, &sqe, recv_msg); - - if (recv_msg->data_fmt == WD_SGL_BUF) - hisi_sec_put_sgl(h_qp, recv_msg->alg_type, recv_msg->in, -@@ -1064,18 +1100,6 @@ static void fill_cipher_bd3_addr(struct wd_cipher_msg *msg, - sqe->data_dst_addr = (__u64)(uintptr_t)msg->out; - sqe->no_scene.c_ivin_addr = (__u64)(uintptr_t)msg->iv; - sqe->c_key_addr = (__u64)(uintptr_t)msg->key; -- -- /* -- * Because some special algorithms need to update IV -- * after receiving the BD, and the relevant information -- * is in the send message, so the BD field segment is -- * needed to return the message pointer. -- * The Cipher algorithm does not use the mac_addr segment -- * in the BD domain and the hardware will copy all the -- * field values of the send BD when returning, so we use -- * mac_addr to carry the message pointer here. -- */ -- sqe->mac_addr = (__u64)(uintptr_t)msg; - } - - static int fill_cipher_bd3(struct wd_cipher_msg *msg, struct hisi_sec_sqe3 *sqe) -@@ -1159,11 +1183,12 @@ int hisi_sec_cipher_send_v3(handle_t ctx, void *cipher_msg) - return 0; - } - --static void parse_cipher_bd3(struct hisi_sec_sqe3 *sqe, -+static void parse_cipher_bd3(struct hisi_qp *qp, struct hisi_sec_sqe3 *sqe, - struct wd_cipher_msg *recv_msg) - { -- struct wd_cipher_msg *rmsg; -+ struct wd_cipher_msg *temp_msg; - __u16 done; -+ __u32 tag; - - done = sqe->done_flag & SEC_DONE_MASK; - if (done != SEC_HW_TASK_DONE || sqe->error_type) { -@@ -1174,16 +1199,33 @@ static void parse_cipher_bd3(struct hisi_sec_sqe3 *sqe, - recv_msg->result = WD_SUCCESS; - } - -- rmsg = (struct wd_cipher_msg *)(uintptr_t)sqe->mac_addr; -- if (rmsg->data_fmt != WD_SGL_BUF) -- update_iv(rmsg); -+ tag = sqe->tag; -+ -+ recv_msg->tag = tag; -+ if (qp->q_info.qp_mode == CTX_MODE_ASYNC) { -+ recv_msg->alg_type = WD_CIPHER; -+ recv_msg->data_fmt = get_data_fmt_v3(sqe->bd_param); -+ recv_msg->in = (__u8 *)(uintptr_t)sqe->data_src_addr; -+ recv_msg->out = (__u8 *)(uintptr_t)sqe->data_dst_addr; -+ temp_msg = wd_cipher_get_msg(qp->q_info.idx, tag); -+ if (!temp_msg) { -+ recv_msg->result = WD_IN_EPARA; -+ WD_ERR("failed to get send msg! idx = %u, tag = %u.\n", -+ qp->q_info.idx, tag); -+ return; -+ } -+ } else { -+ /* The synchronization mode uses the same message */ -+ temp_msg = recv_msg; -+ } -+ -+ if (temp_msg->data_fmt != WD_SGL_BUF) -+ update_iv(temp_msg); - else -- update_iv_sgl(rmsg); -+ update_iv_sgl(temp_msg); - -- recv_msg->data_fmt = rmsg->data_fmt; -- recv_msg->alg_type = rmsg->alg_type; -- recv_msg->in = rmsg->in; -- recv_msg->out = rmsg->out; -+ if (unlikely(recv_msg->result != WD_SUCCESS)) -+ dump_sec_msg(temp_msg, "cipher"); - } - - int hisi_sec_cipher_recv_v3(handle_t ctx, void *cipher_msg) -@@ -1202,8 +1244,7 @@ int hisi_sec_cipher_recv_v3(handle_t ctx, void *cipher_msg) - if (ret) - return ret; - -- parse_cipher_bd3(&sqe, recv_msg); -- recv_msg->tag = sqe.tag; -+ parse_cipher_bd3((struct hisi_qp *)h_qp, &sqe, recv_msg); - - if (recv_msg->data_fmt == WD_SGL_BUF) - hisi_sec_put_sgl(h_qp, recv_msg->alg_type, recv_msg->in, -@@ -1268,9 +1309,10 @@ static void qm_fill_digest_long_bd(struct wd_digest_msg *msg, - } - } - --static void parse_digest_bd2(struct hisi_sec_sqe *sqe, -+static void parse_digest_bd2(struct hisi_qp *qp, struct hisi_sec_sqe *sqe, - struct wd_digest_msg *recv_msg) - { -+ struct wd_digest_msg *temp_msg; - __u16 done; - - done = sqe->type2.done_flag & SEC_DONE_MASK; -@@ -1284,9 +1326,24 @@ static void parse_digest_bd2(struct hisi_sec_sqe *sqe, - - recv_msg->tag = sqe->type2.tag; - -- recv_msg->data_fmt = hisi_sec_get_data_fmt_v2(sqe->sds_sa_type); -- recv_msg->in = (__u8 *)(uintptr_t)sqe->type2.data_src_addr; -- recv_msg->alg_type = WD_DIGEST; -+ if (qp->q_info.qp_mode == CTX_MODE_ASYNC) { -+ recv_msg->alg_type = WD_DIGEST; -+ recv_msg->data_fmt = get_data_fmt_v2(sqe->sds_sa_type); -+ recv_msg->in = (__u8 *)(uintptr_t)sqe->type2.data_src_addr; -+ temp_msg = wd_digest_get_msg(qp->q_info.idx, recv_msg->tag); -+ if (!temp_msg) { -+ recv_msg->result = WD_IN_EPARA; -+ WD_ERR("failed to get send msg! idx = %u, tag = %u.\n", -+ qp->q_info.idx, recv_msg->tag); -+ return; -+ } -+ } else { -+ /* The synchronization mode uses the same message */ -+ temp_msg = recv_msg; -+ } -+ -+ if (unlikely(recv_msg->result != WD_SUCCESS)) -+ dump_sec_msg(temp_msg, "digest"); - } - - static int digest_long_bd_check(struct wd_digest_msg *msg) -@@ -1417,7 +1474,7 @@ int hisi_sec_digest_recv(handle_t ctx, void *digest_msg) - if (ret) - return ret; - -- parse_digest_bd2(&sqe, recv_msg); -+ parse_digest_bd2((struct hisi_qp *)h_qp, &sqe, recv_msg); - - if (recv_msg->data_fmt == WD_SGL_BUF) - hisi_sec_put_sgl(h_qp, recv_msg->alg_type, recv_msg->in, -@@ -1558,9 +1615,10 @@ put_sgl: - return ret; - } - --static void parse_digest_bd3(struct hisi_sec_sqe3 *sqe, -+static void parse_digest_bd3(struct hisi_qp *qp, struct hisi_sec_sqe3 *sqe, - struct wd_digest_msg *recv_msg) - { -+ struct wd_digest_msg *temp_msg; - __u16 done; - - done = sqe->done_flag & SEC_DONE_MASK; -@@ -1574,9 +1632,24 @@ static void parse_digest_bd3(struct hisi_sec_sqe3 *sqe, - - recv_msg->tag = sqe->tag; - -- recv_msg->data_fmt = hisi_sec_get_data_fmt_v3(sqe->bd_param); -- recv_msg->in = (__u8 *)(uintptr_t)sqe->data_src_addr; -- recv_msg->alg_type = WD_DIGEST; -+ if (qp->q_info.qp_mode == CTX_MODE_ASYNC) { -+ recv_msg->alg_type = WD_DIGEST; -+ recv_msg->data_fmt = get_data_fmt_v3(sqe->bd_param); -+ recv_msg->in = (__u8 *)(uintptr_t)sqe->data_src_addr; -+ temp_msg = wd_digest_get_msg(qp->q_info.idx, recv_msg->tag); -+ if (!temp_msg) { -+ recv_msg->result = WD_IN_EPARA; -+ WD_ERR("failed to get send msg! idx = %u, tag = %u.\n", -+ qp->q_info.idx, recv_msg->tag); -+ return; -+ } -+ } else { -+ /* The synchronization mode uses the same message */ -+ temp_msg = recv_msg; -+ } -+ -+ if (unlikely(recv_msg->result != WD_SUCCESS)) -+ dump_sec_msg(temp_msg, "digest"); - } - - int hisi_sec_digest_recv_v3(handle_t ctx, void *digest_msg) -@@ -1595,7 +1668,7 @@ int hisi_sec_digest_recv_v3(handle_t ctx, void *digest_msg) - if (ret) - return ret; - -- parse_digest_bd3(&sqe, recv_msg); -+ parse_digest_bd3((struct hisi_qp *)h_qp, &sqe, recv_msg); - - if (recv_msg->data_fmt == WD_SGL_BUF) - hisi_sec_put_sgl(h_qp, recv_msg->alg_type, recv_msg->in, -@@ -1899,9 +1972,10 @@ int hisi_sec_aead_send(handle_t ctx, void *aead_msg) - return 0; - } - --static void parse_aead_bd2(struct hisi_sec_sqe *sqe, -+static void parse_aead_bd2(struct hisi_qp *qp, struct hisi_sec_sqe *sqe, - struct wd_aead_msg *recv_msg) - { -+ struct wd_aead_msg *temp_msg; - __u16 done, icv; - - done = sqe->type2.done_flag & SEC_DONE_MASK; -@@ -1917,18 +1991,25 @@ static void parse_aead_bd2(struct hisi_sec_sqe *sqe, - - recv_msg->tag = sqe->type2.tag; - -- recv_msg->data_fmt = hisi_sec_get_data_fmt_v2(sqe->sds_sa_type); -- recv_msg->in = (__u8 *)(uintptr_t)sqe->type2.data_src_addr; -- recv_msg->out = (__u8 *)(uintptr_t)sqe->type2.data_dst_addr; -- recv_msg->alg_type = WD_AEAD; -- recv_msg->mac = (__u8 *)(uintptr_t)sqe->type2.mac_addr; -- recv_msg->auth_bytes = (sqe->type2.mac_key_alg & -- SEC_MAC_LEN_MASK) * WORD_BYTES; -- if (!recv_msg->auth_bytes) -- recv_msg->auth_bytes = sqe->type2.icvw_kmode & -- SEC_AUTH_LEN_MASK; -- recv_msg->out_bytes = sqe->type2.clen_ivhlen + -- sqe->type2.cipher_src_offset; -+ if (qp->q_info.qp_mode == CTX_MODE_ASYNC) { -+ recv_msg->alg_type = WD_AEAD; -+ recv_msg->data_fmt = get_data_fmt_v2(sqe->sds_sa_type); -+ recv_msg->in = (__u8 *)(uintptr_t)sqe->type2.data_src_addr; -+ recv_msg->out = (__u8 *)(uintptr_t)sqe->type2.data_dst_addr; -+ temp_msg = wd_aead_get_msg(qp->q_info.idx, recv_msg->tag); -+ if (!temp_msg) { -+ recv_msg->result = WD_IN_EPARA; -+ WD_ERR("failed to get send msg! idx = %u, tag = %u.\n", -+ qp->q_info.idx, recv_msg->tag); -+ return; -+ } -+ } else { -+ /* The synchronization mode uses the same message */ -+ temp_msg = recv_msg; -+ } -+ -+ if (unlikely(recv_msg->result != WD_SUCCESS)) -+ dump_sec_msg(temp_msg, "aead"); - } - - int hisi_sec_aead_recv(handle_t ctx, void *aead_msg) -@@ -1947,7 +2028,7 @@ int hisi_sec_aead_recv(handle_t ctx, void *aead_msg) - if (ret) - return ret; - -- parse_aead_bd2(&sqe, recv_msg); -+ parse_aead_bd2((struct hisi_qp *)h_qp, &sqe, recv_msg); - - if (recv_msg->data_fmt == WD_SGL_BUF) - hisi_sec_put_sgl(h_qp, recv_msg->alg_type, recv_msg->in, -@@ -2160,9 +2241,10 @@ int hisi_sec_aead_send_v3(handle_t ctx, void *aead_msg) - return 0; - } - --static void parse_aead_bd3(struct hisi_sec_sqe3 *sqe, -+static void parse_aead_bd3(struct hisi_qp *qp, struct hisi_sec_sqe3 *sqe, - struct wd_aead_msg *recv_msg) - { -+ struct wd_aead_msg *temp_msg; - __u16 done, icv; - - done = sqe->done_flag & SEC_DONE_MASK; -@@ -2178,18 +2260,25 @@ static void parse_aead_bd3(struct hisi_sec_sqe3 *sqe, - - recv_msg->tag = sqe->tag; - -- recv_msg->data_fmt = hisi_sec_get_data_fmt_v3(sqe->bd_param); -- recv_msg->in = (__u8 *)(uintptr_t)sqe->data_src_addr; -- recv_msg->out = (__u8 *)(uintptr_t)sqe->data_dst_addr; -- recv_msg->alg_type = WD_AEAD; -- recv_msg->mac = (__u8 *)(uintptr_t)sqe->mac_addr; -- recv_msg->auth_bytes = ((sqe->auth_mac_key >> SEC_MAC_OFFSET_V3) & -- SEC_MAC_LEN_MASK) * WORD_BYTES; -- if (!recv_msg->auth_bytes) -- recv_msg->auth_bytes = (sqe->c_icv_key >> SEC_MAC_OFFSET_V3) & -- SEC_MAC_LEN_MASK; -- recv_msg->out_bytes = sqe->c_len_ivin + -- sqe->cipher_src_offset; -+ if (qp->q_info.qp_mode == CTX_MODE_ASYNC) { -+ recv_msg->alg_type = WD_AEAD; -+ recv_msg->data_fmt = get_data_fmt_v3(sqe->bd_param); -+ recv_msg->in = (__u8 *)(uintptr_t)sqe->data_src_addr; -+ recv_msg->out = (__u8 *)(uintptr_t)sqe->data_dst_addr; -+ temp_msg = wd_aead_get_msg(qp->q_info.idx, recv_msg->tag); -+ if (!temp_msg) { -+ recv_msg->result = WD_IN_EPARA; -+ WD_ERR("failed to get send msg! idx = %u, tag = %u.\n", -+ qp->q_info.idx, recv_msg->tag); -+ return; -+ } -+ } else { -+ /* The synchronization mode uses the same message */ -+ temp_msg = recv_msg; -+ } -+ -+ if (unlikely(recv_msg->result != WD_SUCCESS)) -+ dump_sec_msg(temp_msg, "aead"); - } - - int hisi_sec_aead_recv_v3(handle_t ctx, void *aead_msg) -@@ -2208,7 +2297,7 @@ int hisi_sec_aead_recv_v3(handle_t ctx, void *aead_msg) - if (ret) - return ret; - -- parse_aead_bd3(&sqe, recv_msg); -+ parse_aead_bd3((struct hisi_qp *)h_qp, &sqe, recv_msg); - - if (recv_msg->data_fmt == WD_SGL_BUF) - hisi_sec_put_sgl(h_qp, recv_msg->alg_type, -diff --git a/include/drv/wd_aead_drv.h b/include/drv/wd_aead_drv.h -index cca28ba..de4a7d7 100644 ---- a/include/drv/wd_aead_drv.h -+++ b/include/drv/wd_aead_drv.h -@@ -76,6 +76,7 @@ struct wd_aead_driver { - - void wd_aead_set_driver(struct wd_aead_driver *drv); - struct wd_aead_driver *wd_aead_get_driver(void); -+struct wd_aead_msg *wd_aead_get_msg(__u32 idx, __u32 tag); - - #ifdef WD_STATIC_DRV - #define WD_AEAD_SET_DRIVER(drv) \ -diff --git a/include/drv/wd_cipher_drv.h b/include/drv/wd_cipher_drv.h -index 84c9844..a8da8cc 100644 ---- a/include/drv/wd_cipher_drv.h -+++ b/include/drv/wd_cipher_drv.h -@@ -62,6 +62,7 @@ struct wd_cipher_driver { - - void wd_cipher_set_driver(struct wd_cipher_driver *drv); - struct wd_cipher_driver *wd_cipher_get_driver(void); -+struct wd_cipher_msg *wd_cipher_get_msg(__u32 idx, __u32 tag); - - #ifdef WD_STATIC_DRV - #define WD_CIPHER_SET_DRIVER(drv) \ -diff --git a/include/drv/wd_digest_drv.h b/include/drv/wd_digest_drv.h -index 10ce6e1..39839f6 100644 ---- a/include/drv/wd_digest_drv.h -+++ b/include/drv/wd_digest_drv.h -@@ -64,6 +64,7 @@ struct wd_digest_driver { - - void wd_digest_set_driver(struct wd_digest_driver *drv); - struct wd_digest_driver *wd_digest_get_driver(void); -+struct wd_digest_msg *wd_digest_get_msg(__u32 idx, __u32 tag); - - #ifdef WD_STATIC_DRV - #define WD_DIGEST_SET_DRIVER(drv) \ -diff --git a/wd_aead.c b/wd_aead.c -index 0c54de3..d43ace1 100644 ---- a/wd_aead.c -+++ b/wd_aead.c -@@ -596,6 +596,11 @@ fail_with_msg: - return ret; - } - -+struct wd_aead_msg *wd_aead_get_msg(__u32 idx, __u32 tag) -+{ -+ return wd_find_msg_in_pool(&wd_aead_setting.pool, idx, tag); -+} -+ - int wd_aead_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - { - struct wd_ctx_config_internal *config = &wd_aead_setting.config; -diff --git a/wd_cipher.c b/wd_cipher.c -index 0cd2e42..3d00598 100644 ---- a/wd_cipher.c -+++ b/wd_cipher.c -@@ -505,6 +505,11 @@ fail_with_msg: - return ret; - } - -+struct wd_cipher_msg *wd_cipher_get_msg(__u32 idx, __u32 tag) -+{ -+ return wd_find_msg_in_pool(&wd_cipher_setting.pool, idx, tag); -+} -+ - int wd_cipher_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - { - struct wd_ctx_config_internal *config = &wd_cipher_setting.config; -diff --git a/wd_digest.c b/wd_digest.c -index ae37e32..43b4bc5 100644 ---- a/wd_digest.c -+++ b/wd_digest.c -@@ -405,6 +405,11 @@ fail_with_msg: - return ret; - } - -+struct wd_digest_msg *wd_digest_get_msg(__u32 idx, __u32 tag) -+{ -+ return wd_find_msg_in_pool(&wd_digest_setting.pool, idx, tag); -+} -+ - int wd_digest_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - { - struct wd_ctx_config_internal *config = &wd_digest_setting.config; --- -2.27.0 - diff --git a/0128-uadk-add-device-isolation-interface.patch b/0128-uadk-add-device-isolation-interface.patch deleted file mode 100644 index a9dc5e7..0000000 --- a/0128-uadk-add-device-isolation-interface.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 45d65ffcfea660dded788d6819399833e017fd9f Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Wed, 22 Jun 2022 10:26:31 +0800 -Subject: [PATCH 141/183] uadk: add device isolation interface - -Users need to check whether the device is isolated before using -the device. So add an isolation interface. - -Signed-off-by: Kai Ye ---- - include/wd.h | 8 ++++++++ - wd.c | 18 ++++++++++++++++++ - 2 files changed, 26 insertions(+) - -diff --git a/include/wd.h b/include/wd.h -index 8c45522..b8044a4 100644 ---- a/include/wd.h -+++ b/include/wd.h -@@ -293,6 +293,14 @@ int wd_ctx_wait(handle_t h_ctx, __u16 ms); - */ - int wd_is_sva(handle_t h_ctx); - -+/** -+ * wd_is_isolate() - Check if the device has been isolated. -+ * @dev: Indicate one device. -+ * -+ * Return 1 if isolated, 0 for not isolated, less than 0 otherwise. -+ */ -+int wd_is_isolate(struct uacce_dev *dev); -+ - /** - * wd_get_accel_name() - Get device name or driver name. - * @dev_path: The path of device. e.g. /dev/hisi_zip-0. -diff --git a/wd.c b/wd.c -index 2dbb2ab..9715e10 100644 ---- a/wd.c -+++ b/wd.c -@@ -186,6 +186,24 @@ static int access_attr(const char *dev_root, const char *attr, int mode) - return access(attr_file, mode); - } - -+int wd_is_isolate(struct uacce_dev *dev) -+{ -+ int value = 0; -+ int ret; -+ -+ if (!dev || !dev->dev_root) -+ return -WD_EINVAL; -+ -+ ret = access_attr(dev->dev_root, "isolate", F_OK); -+ if (!ret) { -+ ret = get_int_attr(dev, "isolate", &value); -+ if (ret < 0) -+ return ret; -+ } -+ -+ return value == 1 ? 1 : 0; -+} -+ - static int get_dev_info(struct uacce_dev *dev) - { - int value = 0; --- -2.27.0 - diff --git a/0129-uadk-add-WD_DEV_ERR-api.patch b/0129-uadk-add-WD_DEV_ERR-api.patch deleted file mode 100644 index 401d9ed..0000000 --- a/0129-uadk-add-WD_DEV_ERR-api.patch +++ /dev/null @@ -1,249 +0,0 @@ -From 2884d11a6307d239f72515309b565132c97f1172 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Wed, 22 Jun 2022 10:26:32 +0800 -Subject: [PATCH 142/183] uadk: add WD_DEV_ERR api - -This interface supports device differentiation by the handle of. -context. Users can use the api if they have requested the ctx. -Otherwise, occurred an error. - -Signed-off-by: Kai Ye ---- - drv/hisi_hpre.c | 4 ---- - drv/hisi_qm_udrv.c | 33 +++++++++++++++++---------------- - include/hisi_qm_udrv.h | 5 +++++ - include/wd.h | 14 ++++++++++++++ - wd.c | 10 ++++++++++ - 5 files changed, 46 insertions(+), 20 deletions(-) - -diff --git a/drv/hisi_hpre.c b/drv/hisi_hpre.c -index 7fd4189..d503d84 100644 ---- a/drv/hisi_hpre.c -+++ b/drv/hisi_hpre.c -@@ -44,10 +44,6 @@ - #define GEN_PARAMS_SZ(key_size) ((key_size) << 1) - #define CRT_PARAM_SZ(key_size) ((key_size) >> 1) - --#define container_of(ptr, type, member) ({ \ -- typeof(((type *)0)->member)(*__mptr) = (ptr); \ -- (type *)((char *)__mptr - offsetof(type, member)); }) -- - enum hpre_alg_type { - HPRE_ALG_NC_NCRT = 0x0, - HPRE_ALG_NC_CRT = 0x1, -diff --git a/drv/hisi_qm_udrv.c b/drv/hisi_qm_udrv.c -index 985aecc..9eaf60c 100644 ---- a/drv/hisi_qm_udrv.c -+++ b/drv/hisi_qm_udrv.c -@@ -167,14 +167,14 @@ static int hisi_qm_setup_region(handle_t h_ctx, - { - q_info->sq_base = wd_ctx_mmap_qfr(h_ctx, UACCE_QFRT_DUS); - if (!q_info->sq_base) { -- WD_ERR("failed to mmap dus!\n"); -+ WD_DEV_ERR(h_ctx, "failed to mmap dus!\n"); - return -WD_ENOMEM; - } - - q_info->mmio_base = wd_ctx_mmap_qfr(h_ctx, UACCE_QFRT_MMIO); - if (!q_info->mmio_base) { - wd_ctx_unmap_qfr(h_ctx, UACCE_QFRT_DUS); -- WD_ERR("failed to mmap mmio!\n"); -+ WD_DEV_ERR(h_ctx, "failed to mmap mmio!\n"); - return -WD_ENOMEM; - } - -@@ -197,14 +197,14 @@ static __u32 get_version_id(handle_t h_ctx) - - api_name = wd_ctx_get_api(h_ctx); - if (!api_name || strlen(api_name) <= VERSION_ID_SHIFT) { -- WD_ERR("invalid: api name is %s!\n", api_name); -+ WD_DEV_ERR(h_ctx, "invalid: api name is %s!\n", api_name); - return 0; - } - - id = api_name + VERSION_ID_SHIFT; - ver = strtoul(id, NULL, 10); - if (!ver || ver == ULONG_MAX) { -- WD_ERR("failed to strtoul, ver = %lu!\n", ver); -+ WD_DEV_ERR(h_ctx, "failed to strtoul, ver = %lu!\n", ver); - return 0; - } - -@@ -250,7 +250,7 @@ static int his_qm_set_qp_ctx(handle_t h_ctx, struct hisi_qm_priv *config, - q_info->qc_type = qp_ctx.qc_type; - ret = wd_ctx_set_io_cmd(h_ctx, UACCE_CMD_QM_SET_QP_CTX, &qp_ctx); - if (ret < 0) { -- WD_ERR("failed to set qc_type, use default value!\n"); -+ WD_DEV_ERR(h_ctx, "failed to set qc_type, use default value!\n"); - return ret; - } - -@@ -267,14 +267,14 @@ static int hisi_qm_get_qfrs_offs(handle_t h_ctx, - type = UACCE_QFRT_DUS; - q_info->region_size[type] = wd_ctx_get_region_size(h_ctx, type); - if (!q_info->region_size[type]) { -- WD_ERR("failed to get DUS qfrs offset!\n"); -+ WD_DEV_ERR(h_ctx, "failed to get DUS qfrs offset!\n"); - return -WD_EINVAL; - } - - type = UACCE_QFRT_MMIO; - q_info->region_size[type] = wd_ctx_get_region_size(h_ctx, type); - if (!q_info->region_size[type]) { -- WD_ERR("failed to get MMIO qfrs offset!\n"); -+ WD_DEV_ERR(h_ctx, "failed to get MMIO qfrs offset!\n"); - return -WD_EINVAL; - } - -@@ -289,25 +289,25 @@ static int hisi_qm_setup_info(struct hisi_qp *qp, struct hisi_qm_priv *config) - q_info = &qp->q_info; - ret = hisi_qm_setup_region(qp->h_ctx, q_info); - if (ret) { -- WD_ERR("failed to setup region!\n"); -+ WD_DEV_ERR(qp->h_ctx, "failed to setup region!\n"); - return ret; - } - - ret = hisi_qm_get_qfrs_offs(qp->h_ctx, q_info); - if (ret) { -- WD_ERR("failed to get dev qfrs offset!\n"); -+ WD_DEV_ERR(qp->h_ctx, "failed to get dev qfrs offset!\n"); - goto err_out; - } - - ret = hisi_qm_setup_db(qp->h_ctx, q_info); - if (ret) { -- WD_ERR("failed to setup db!\n"); -+ WD_DEV_ERR(qp->h_ctx, "failed to setup db!\n"); - goto err_out; - } - - ret = his_qm_set_qp_ctx(qp->h_ctx, config, q_info); - if (ret) { -- WD_ERR("failed to setup io cmd!\n"); -+ WD_DEV_ERR(qp->h_ctx, "failed to setup io cmd!\n"); - goto err_out; - } - -@@ -324,7 +324,7 @@ static int hisi_qm_setup_info(struct hisi_qp *qp, struct hisi_qm_priv *config) - - ret = pthread_spin_init(&q_info->lock, PTHREAD_PROCESS_SHARED); - if (ret) { -- WD_ERR("failed to init qinfo lock!\n"); -+ WD_DEV_ERR(qp->h_ctx, "failed to init qinfo lock!\n"); - goto err_out; - } - -@@ -455,6 +455,7 @@ int hisi_qm_send(handle_t h_qp, const void *req, __u16 expect, __u16 *count) - - static int hisi_qm_recv_single(struct hisi_qm_queue_info *q_info, void *resp) - { -+ struct hisi_qp *qp = container_of(q_info, struct hisi_qp, q_info); - struct cqe *cqe; - __u16 i, j; - -@@ -466,7 +467,7 @@ static int hisi_qm_recv_single(struct hisi_qm_queue_info *q_info, void *resp) - j = CQE_SQ_HEAD_INDEX(cqe); - if (j >= QM_Q_DEPTH) { - pthread_spin_unlock(&q_info->lock); -- WD_ERR("CQE_SQ_HEAD_INDEX(%u) error!\n", j); -+ WD_DEV_ERR(qp->h_ctx, "CQE_SQ_HEAD_INDEX(%u) error!\n", j); - return -WD_EIO; - } - memcpy(resp, (void *)((uintptr_t)q_info->sq_base + -@@ -510,7 +511,7 @@ int hisi_qm_recv(handle_t h_qp, void *resp, __u16 expect, __u16 *count) - - q_info = &qp->q_info; - if (wd_ioread32(q_info->ds_rx_base) == 1) { -- WD_ERR("wd queue hw error happened before qm receive!\n"); -+ WD_DEV_ERR(qp->h_ctx, "wd queue hw error happened before qm receive!\n"); - return -WD_HW_EACCESS; - } - -@@ -524,7 +525,7 @@ int hisi_qm_recv(handle_t h_qp, void *resp, __u16 expect, __u16 *count) - - *count = recv_num++; - if (wd_ioread32(q_info->ds_rx_base) == 1) { -- WD_ERR("wd queue hw error happened in qm receive!\n"); -+ WD_DEV_ERR(qp->h_ctx, "wd queue hw error happened in qm receive!\n"); - return -WD_HW_EACCESS; - } - -@@ -537,7 +538,7 @@ int hisi_check_bd_id(handle_t h_qp, __u32 mid, __u32 bid) - __u8 mode = qp->q_info.qp_mode; - - if (mode == CTX_MODE_SYNC && mid != bid) { -- WD_ERR("failed to recv self bd, send id: %u, recv id: %u\n", -+ WD_DEV_ERR(qp->h_ctx, "failed to recv self bd, send id: %u, recv id: %u\n", - mid, bid); - return -WD_EINVAL; - } -diff --git a/include/hisi_qm_udrv.h b/include/hisi_qm_udrv.h -index ea5807e..0ea17c6 100644 ---- a/include/hisi_qm_udrv.h -+++ b/include/hisi_qm_udrv.h -@@ -29,6 +29,11 @@ extern "C" { - #define BYTE_BITS 8 - #define BYTE_BITS_SHIFT 3 - -+#define __offsetof(t, m) ((size_t)(uintptr_t)&((t *)0)->m) -+#define container_of(ptr, type, member) ({ \ -+ typeof(((type *)0)->member)(*__mptr) = (ptr); \ -+ (type *)((char *)__mptr - __offsetof(type, member)); }) -+ - enum hisi_qm_sgl_copy_dir { - COPY_SGL_TO_PBUFF, - COPY_PBUFF_TO_SGL -diff --git a/include/wd.h b/include/wd.h -index b8044a4..b0580ba 100644 ---- a/include/wd.h -+++ b/include/wd.h -@@ -57,6 +57,13 @@ typedef void (*wd_log)(const char *format, ...); - #define WD_ERR(fmt, args...) fprintf(stderr, fmt, ##args) - #endif - -+/* @h_ctx: The handle of context. */ -+#define WD_DEV_ERR(h_ctx, format, args...)\ -+ do { \ -+ char *dev_name = wd_ctx_get_dev_name(h_ctx); \ -+ WD_ERR("%s: "format"\n", dev_name, ##args); \ -+ } while (0) -+ - #define WD_CONSOLE printf - - /* WD error code */ -@@ -496,6 +503,13 @@ void wd_mempool_stats(handle_t mempool, struct wd_mempool_stats *stats); - */ - void wd_blockpool_stats(handle_t blkpool, struct wd_blockpool_stats *stats); - -+/** -+ * wd_ctx_get_dev_name() - Get the device name about task. -+ * @h_ctx: The handle of context. -+ * Return device name. -+ */ -+char *wd_ctx_get_dev_name(handle_t h_ctx); -+ - /** - * wd_get_version() - Get the libwd version number and released time. - */ -diff --git a/wd.c b/wd.c -index 9715e10..b0c3dec 100644 ---- a/wd.c -+++ b/wd.c -@@ -826,3 +826,13 @@ bool wd_need_info(void) - { - return uadk_log_level >= WD_LOG_INFO; - } -+ -+char *wd_ctx_get_dev_name(handle_t h_ctx) -+{ -+ struct wd_ctx_h *ctx = (struct wd_ctx_h *)h_ctx; -+ -+ if (!ctx) -+ return NULL; -+ -+ return ctx->dev_name; -+} --- -2.27.0 - diff --git a/0130-uadk-ecc-remove-a-redefined-macro.patch b/0130-uadk-ecc-remove-a-redefined-macro.patch deleted file mode 100644 index 2b47407..0000000 --- a/0130-uadk-ecc-remove-a-redefined-macro.patch +++ /dev/null @@ -1,42 +0,0 @@ -From e54fc1d2840a7bd9b884a84d5fd4de385f23e03f Mon Sep 17 00:00:00 2001 -From: Yang Shen -Date: Fri, 1 Jul 2022 11:01:06 +0800 -Subject: [PATCH 143/183] uadk/ecc - remove a redefined macro - -Macro 'offsetof' has been defined in 'stddef.h'. So remove the -redefined one in 'wd_ecc_drv.h'. - -Signed-off-by: Yang Shen ---- - include/drv/wd_ecc_drv.h | 2 -- - wd_ecc.c | 1 + - 2 files changed, 1 insertion(+), 2 deletions(-) - -diff --git a/include/drv/wd_ecc_drv.h b/include/drv/wd_ecc_drv.h -index ef98606..857da20 100644 ---- a/include/drv/wd_ecc_drv.h -+++ b/include/drv/wd_ecc_drv.h -@@ -45,8 +45,6 @@ extern "C" { - #define WD_X448 0x2 - #define WD_SM2P256 0x3 - --#define offsetof(t, m) ((size_t)(uintptr_t)&((t *)0)->m) -- - /* ECC message format */ - struct wd_ecc_msg { - struct wd_ecc_req req; -diff --git a/wd_ecc.c b/wd_ecc.c -index 1ff6ed3..4cf287b 100644 ---- a/wd_ecc.c -+++ b/wd_ecc.c -@@ -8,6 +8,7 @@ - #include - #include - #include -+#include - #include - #include - #include --- -2.27.0 - diff --git a/0131-uadk-hisi-remove-a-redefined-macro.patch b/0131-uadk-hisi-remove-a-redefined-macro.patch deleted file mode 100644 index 1f99da8..0000000 --- a/0131-uadk-hisi-remove-a-redefined-macro.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 24a24c44373d3d2fb185bd7c3c3d8d158b63569e Mon Sep 17 00:00:00 2001 -From: Yang Shen -Date: Fri, 1 Jul 2022 11:01:07 +0800 -Subject: [PATCH 144/183] uadk/hisi - remove a redefined macro - -Macro 'offsetof' has been defined in 'stddef.h'. So remove the -redefined one in 'hisi_qm_udrv.h'. - -Signed-off-by: Yang Shen ---- - include/hisi_qm_udrv.h | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/include/hisi_qm_udrv.h b/include/hisi_qm_udrv.h -index 0ea17c6..88758ac 100644 ---- a/include/hisi_qm_udrv.h -+++ b/include/hisi_qm_udrv.h -@@ -5,6 +5,7 @@ - #define __HZIP_DRV_H__ - - #include -+#include - #include - #include - -@@ -29,10 +30,9 @@ extern "C" { - #define BYTE_BITS 8 - #define BYTE_BITS_SHIFT 3 - --#define __offsetof(t, m) ((size_t)(uintptr_t)&((t *)0)->m) - #define container_of(ptr, type, member) ({ \ - typeof(((type *)0)->member)(*__mptr) = (ptr); \ -- (type *)((char *)__mptr - __offsetof(type, member)); }) -+ (type *)((char *)__mptr - offsetof(type, member)); }) - - enum hisi_qm_sgl_copy_dir { - COPY_SGL_TO_PBUFF, --- -2.27.0 - diff --git a/0132-uadk-doc-fix-text-style-for-wd_design.md.patch b/0132-uadk-doc-fix-text-style-for-wd_design.md.patch deleted file mode 100644 index 7ad2b10..0000000 --- a/0132-uadk-doc-fix-text-style-for-wd_design.md.patch +++ /dev/null @@ -1,542 +0,0 @@ -From c69f4b5e4889a2311940efa0478e099b34d0084a Mon Sep 17 00:00:00 2001 -From: Yang Shen -Date: Mon, 11 Jul 2022 21:00:09 +0800 -Subject: [PATCH 145/183] uadk/doc - fix text style for wd_design.md - -Remove all end of line space. - -Signed-off-by: Yang Shen ---- - docs/wd_design.md | 248 +++++++++++++++++++++++----------------------- - 1 file changed, 124 insertions(+), 124 deletions(-) - -diff --git a/docs/wd_design.md b/docs/wd_design.md -index f4151db..ba5a5b9 100644 ---- a/docs/wd_design.md -+++ b/docs/wd_design.md -@@ -102,17 +102,17 @@ libwd and many other algorithm libraries for different applications. - - ![overview](./wd_overview.png) - --Libwd provides a wrapper of basic UACCE user space interfaces, they are a set -+Libwd provides a wrapper of basic UACCE user space interfaces, they are a set - of helper functions. - --Algorithm libraries offer a set of APIs to users, who could use this set of --APIs to do specific task without accessing low level implementations. Algorithm --libraries also offer a register interface to let hardware vendors to register --their own user space driver, which could use above helper functions to do UACCE -+Algorithm libraries offer a set of APIs to users, who could use this set of -+APIs to do specific task without accessing low level implementations. Algorithm -+libraries also offer a register interface to let hardware vendors to register -+their own user space driver, which could use above helper functions to do UACCE - related work. - --So two mechanisms are provided to user application. User application could --either access libwd or algorithm libraries. And all of these are compiled as -+So two mechanisms are provided to user application. User application could -+either access libwd or algorithm libraries. And all of these are compiled as - libraries. User application could pick up appropriate libraries to link. - - This document focuses on the design of libwd and algorithm libraries. -@@ -124,42 +124,42 @@ UADK relies on SVA (Shared Virtual Address) that needs to be supported - by IOMMU. - - In UADK framework, virtual address could be used by vendor driver and --application directly. And it's actually the same virtual address, memory copy -+application directly. And it's actually the same virtual address, memory copy - could be avoided between vendor driver and application with SVA. - - - ### UACCE user space API - - As the kernel driver of UADK, UACCE offers a set of APIs between kernel --and user space. UACCE is introduced in "uacce.rst" and "sysfs-driver-uacce" -+and user space. UACCE is introduced in "uacce.rst" and "sysfs-driver-uacce" - in kernel documents. - --Hardware accelerator registers in UACCE as a char dev. At the same time, --hardware informations of accelerators are also exported in sysfs node. For --example, the file path of char dev is */dev/[Accel]* and hardware informations --are in */sys/class/uacce/[Accel]/*. The same name is shared in both devfs and -+Hardware accelerator registers in UACCE as a char dev. At the same time, -+hardware information of accelerators are also exported in sysfs node. For -+example, the file path of char dev is */dev/[Accel]* and hardware information -+are in */sys/class/uacce/[Accel]/*. The same name is shared in both devfs and - sysfs. The *Accel* is comprised of name, dash and id. - --After opening this char device once, vendor driver will get a context to access --the resource of this accelerator device. Vendor driver can configure above --context by ioctl of this opened fd, and mmap hardware resource, like MMIO or -+After opening this char device once, vendor driver will get a context to access -+the resource of this accelerator device. Vendor driver can configure above -+context by ioctl of this opened fd, and mmap hardware resource, like MMIO or - context to user space. - - - ## Libwd Helper Functions - --Hardware accelerator communicates with CPU by MMIO and contexts. Libwd helper --functions provide the interface that vendor driver could access memory from -+Hardware accelerator communicates with CPU by MMIO and contexts. Libwd helper -+functions provide the interface that vendor driver could access memory from - UADK. And libwd is only accessed by vendor driver. - - - ### Context - --Context is a dual directional hardware communication resource between hardware --accelerator and CPU. When a vendor driver wants to access resources of an -+Context is a dual directional hardware communication resource between hardware -+accelerator and CPU. When a vendor driver wants to access resources of an - accelerator, a context is the requisite resource. - --UACCE creates a char dev for each registered hardware device. Once the char dev -+UACCE creates a char dev for each registered hardware device. Once the char dev - is opened by UADK, a handle of context is created. Vendor driver or - application could refer to the context by the handle. - -@@ -173,7 +173,7 @@ Libwd defines APIs to allocate contexts. - - | Layer | Parameter | Direction | Comments | - | :-- | :-- | :-- | :-- | --| libwd | *dev* | IN | A device in sysfs. All attrs informations in sysfs | -+| libwd | *dev* | IN | A device in sysfs. All attrs information in sysfs | - | | | | are recorded in this *struct uacce_dev*. | - - Return the context handle if it succeeds. Return 0 if it fails. -@@ -187,16 +187,16 @@ Return the context handle if it succeeds. Return 0 if it fails. - - ### mmap - --With a context, resources on hardware accelerator could be shared to CPU. --When vendor driver or application wants to access the resource, it needs to map -+With a context, resources on hardware accelerator could be shared to CPU. -+When vendor driver or application wants to access the resource, it needs to map - the context. - --Libwd provides API to create the mapping between virtual address and physical --address. The mapping could cover three different types. They are MMIO (device --MMIO region), DUS (device user share region) and SS (static share memory -+Libwd provides API to create the mapping between virtual address and physical -+address. The mapping could cover three different types. They are MMIO (device -+MMIO region), DUS (device user share region) and SS (static share memory - region). - --*wd_ctx_mmap_qfr()* and *wd_ctx_unmap_qfr()* are a pair of APIs to create and -+*wd_ctx_mmap_qfr()* and *wd_ctx_unmap_qfr()* are a pair of APIs to create and - destroy the mapping. - - ***void *wd_ctx_mmap_qfr(handle_t h_ctx, enum uacce_qfrt qfrt);*** -@@ -222,39 +222,39 @@ Return virtual address if it succeeds. Return NULL if it fails. - - *wd_ctx_unmap_qfr()* unmaps qfile region from user space. - --qfrt means queue file region type. The details could be found in UACCE kernel -+qfrt means queue file region type. The details could be found in UACCE kernel - driver. - - - ## Algorithm Libraries - --Libwd is a fundamental layer what user relies on to access hardware. UADK also --provides algorithm interfaces that user could get out of the hardware details, --such as contexts. With the algorithm interface, the user application could be -+Libwd is a fundamental layer what user relies on to access hardware. UADK also -+provides algorithm interfaces that user could get out of the hardware details, -+such as contexts. With the algorithm interface, the user application could be - executed on multiple vendor's hardware. - - - ### Compression Algorithm - --In compression algorithm, the contexts won't be accessed by user any more. -+In compression algorithm, the contexts won't be accessed by user any more. - Instead, user only need to focus on compressing and decompressing. - --In libwd, everything is based on context resource. In compression algorithm, --everything is based on session. Session is a superset of context, since vendor --driver may apply multiple contexts for performance. With compression algorithm -+In libwd, everything is based on context resource. In compression algorithm, -+everything is based on session. Session is a superset of context, since vendor -+driver may apply multiple contexts for performance. With compression algorithm - layer, user doesn't care how the multiple contexts are used. - - - #### Session in Compression Algorithm - --The session in compression algorithm records working algorithm, accelerator, --working mode, working context, and so on. It helps to gather more informations --and encapsulates them together. Application only needs to record the handle of -+The session in compression algorithm records working algorithm, accelerator, -+working mode, working context, and so on. It helps to gather more information -+and encapsulates them together. Application only needs to record the handle of - session. - --Whatever user wants to compress or decompress, a session is always necessary. --Each session could only support either compression or decompression. And there --are also some configurations of the compression/decompression. They are defined -+Whatever user wants to compress or decompress, a session is always necessary. -+Each session could only support either compression or decompression. And there -+are also some configurations of the compression/decompression. They are defined - in the *struct wd_comp_sess_setup*. - - ``` -@@ -267,7 +267,7 @@ struct wd_comp_sess_setup { - }; - ``` - --With *struct wd_comp_sess_setup*, a session could be created. The details of -+With *struct wd_comp_sess_setup*, a session could be created. The details of - the session is encapsuled. Only a handle is exported to user. - - ***handle_t wd_comp_alloc_sess(struct wd_comp_sess_setup \*setup)*** -@@ -277,7 +277,7 @@ the session is encapsuled. Only a handle is exported to user. - | compress | *setup* | IN | The structure describes the configurations of | - | algorithm | | | compression or decompression. | - --If a session is created successfully, a non-zero handle value is returned. -+If a session is created successfully, a non-zero handle value is returned. - If fails to create a session, just return 0. - - -@@ -293,8 +293,8 @@ With the handle, a related session could be destroyed. - - #### Compression & Decompression - --Compression & decompression always submit data buffer to hardware accelerator --and collect the output. These buffer informations could be encapsulated into a -+Compression & decompression always submit data buffer to hardware accelerator -+and collect the output. These buffer information could be encapsulated into a - structure, *struct wd_comp_req*. - - ``` -@@ -333,19 +333,19 @@ structure, *struct wd_comp_req*. - | *status* | OUT | Indicate the result. 0 means successful, and others | - | | | are error code. | - --When an application gets a session, it could request hardware accelerator to --work in synchronous mode or asychronous mode. *cb* is the callback function --of user application that is only used in asynchronous mode. *cb_param* is the -+When an application gets a session, it could request hardware accelerator to -+work in synchronous mode or asynchronous mode. *cb* is the callback function -+of user application that is only used in asynchronous mode. *cb_param* is the - parameter of the asynchronous callback function. - --Since synchronous or asynchronous mode is specified in *struct wd_comp_req*, --the compression or decompression could be treated that user submits requests to -+Since synchronous or asynchronous mode is specified in *struct wd_comp_req*, -+the compression or decompression could be treated that user submits requests to - a session. - --There're two kinds of compression interface. One is block mode that the data --in the request is not related to the previous or later data. And the other is --stream mode that the data in the request is related to the data in the previous --or later request. If user wants to compress/decompress large data buffer, it's -+There're two kinds of compression interface. One is block mode that the data -+in the request is not related to the previous or later data. And the other is -+stream mode that the data in the request is related to the data in the previous -+or later request. If user wants to compress/decompress large data buffer, it's - suggested to use stream mode. - - -@@ -358,10 +358,10 @@ suggested to use stream mode. - | | *req* | IN & | Indicate the source and destination buffer. | - | | | OUT | | - --*wd_do_comp_sync()* sends a synchronous compression/decompression request for -+*wd_do_comp_sync()* sends a synchronous compression/decompression request for - block mode. - --Return 0 if it succeeds. Return negative value if it fails. Parameter *req* -+Return 0 if it succeeds. Return negative value if it fails. Parameter *req* - contains the buffer information. - - -@@ -374,11 +374,11 @@ contains the buffer information. - | | *req* | IN & | Indicate the source and destination buffer. | - | | | OUT | | - --Return 0 if it succeeds. Return negative value if it fails. Parameter *req* -+Return 0 if it succeeds. Return negative value if it fails. Parameter *req* - contains the buffer information. - --*wd_do_comp_strm()* sends a synchronous compression/decompression request for --stream mode. *wd_do_comp_strm()* just likes *wd_do_comp_sync()*, user only -+*wd_do_comp_strm()* sends a synchronous compression/decompression request for -+stream mode. *wd_do_comp_strm()* just likes *wd_do_comp_sync()*, user only - sends one request that the data buffer should be processed at one time. - - -@@ -391,27 +391,27 @@ sends one request that the data buffer should be processed at one time. - | | *req* | IN & | Indicate the source and destination buffer. | - | | | OUT | | - --Return 0 if it succeeds. Return negative value if it fails. Parameter *req* -+Return 0 if it succeeds. Return negative value if it fails. Parameter *req* - contains the buffer information. - --*wd_do_comp_sync2()* sends a synchronous compression/decompression request for --stream mode. *wd_do_comp_sync2()* is the superset of *wd_do_comp_strm()*. If --the data buffer of one request is too large to hardware accelerator, it could -+*wd_do_comp_sync2()* sends a synchronous compression/decompression request for -+stream mode. *wd_do_comp_sync2()* is the superset of *wd_do_comp_strm()*. If -+the data buffer of one request is too large to hardware accelerator, it could - split it into several requests until all data handled by hardware. - - - - #### Asynchronous Mode - --In synchronous mode, user application is blocked until the submitted request --is finished by hardware accelerator. Then a new request could be submitted. --In hardware accelerator, multiple requests are always processed in a stream --line. If a process needs to submit multiple requests to hardware, it can't --get good performance in synchronous mode. Since the stream line isn't fully --used. In this case, asynchronous mode could help user application to gain -+In synchronous mode, user application is blocked until the submitted request -+is finished by hardware accelerator. Then a new request could be submitted. -+In hardware accelerator, multiple requests are always processed in a stream -+line. If a process needs to submit multiple requests to hardware, it can't -+get good performance in synchronous mode. Since the stream line isn't fully -+used. In this case, asynchronous mode could help user application to gain - better performance. - --In asynchronous mode, user application gets return immediately while a request -+In asynchronous mode, user application gets return immediately while a request - is submitted. - - ***int wd_do_comp_async(handle_t h_sess, struct wd_comp_req \*req)*** -@@ -423,11 +423,11 @@ is submitted. - | | *req* | IN & | Indicate the source and destination buffer. | - | | | OUT | | - --Return 0 if it succeeds. Return negative value if it fails. Parameter *req* -+Return 0 if it succeeds. Return negative value if it fails. Parameter *req* - contains the buffer information. - --When hardware accelerator finishes the request, the callback that --is provided by user will be invoked. Because the compression library isn't -+When hardware accelerator finishes the request, the callback that -+is provided by user will be invoked. Because the compression library isn't - driven by interrupt, a polling function is necessary to check result. - - ***int wd_comp_poll(__u32 expt, __u32 \*count)*** -@@ -446,8 +446,8 @@ Usually *wd_comp_poll()* could be invoked in a user defined polling thread. - - #### Bind Accelerator and Driver - --Compression algorithm library requires each vendor driver providing an --instance, *struct wd_comp_driver*. This instance represents a vendor driver. -+Compression algorithm library requires each vendor driver providing an -+instance, *struct wd_comp_driver*. This instance represents a vendor driver. - Compression algorithm library binds an vendor driver by the instance. - - ``` -@@ -472,14 +472,14 @@ Compression algorithm library binds an vendor driver by the instance. - | | vendor driver. | - - --A matched vendor driver is bound to compression algorithm library in a global --instance, *struct wd_comp_setting*. The binding process is finished by -+A matched vendor driver is bound to compression algorithm library in a global -+instance, *struct wd_comp_setting*. The binding process is finished by - macro *WD_COMP_SET_DRIVER()*. - - --*struct wd_comp_setting* binds context resources, user scheduler and vendor --driver together. At first, user application needs to allocate contexts and to --create scheduler instance. Then use *wd_comp_init()* to initialize vendor -+*struct wd_comp_setting* binds context resources, user scheduler and vendor -+driver together. At first, user application needs to allocate contexts and to -+create scheduler instance. Then use *wd_comp_init()* to initialize vendor - device. - - ***int wd_comp_init(struct wd_ctx_config \*config, struct wd_sched \*sched)*** -@@ -492,7 +492,7 @@ device. - - Return 0 if it succeeds. And return error number if it fails. - --In *wd_comp_init()*, context resources, user scheduler and vendor driver are -+In *wd_comp_init()*, context resources, user scheduler and vendor driver are - initialized. - - -@@ -504,13 +504,13 @@ In *wd_comp_uninit()*, all configurations on resources are cleared. - - ### Scheduler - --When algorithm layer is used, context resource is not exposed to user any more. --So user could define a scheduler that allocate context resources, arrange -+When algorithm layer is used, context resource is not exposed to user any more. -+So user could define a scheduler that allocate context resources, arrange - proper resources to sessions and free context resources. - - For user convenient, a sample scheduler is provided in UADK for reference. - --***struct wd_sched \*sample_sched_alloc(__u8 sched_type, __u8 type_num, -+***struct wd_sched \*sample_sched_alloc(__u8 sched_type, __u8 type_num, - __u8 numa_num, user_poll_func func)*** - - | Layer | Parameter | Direction | Comments | -@@ -535,7 +535,7 @@ Return a scheduler instance if it succeeds. And return NULL if it fails. - *sample_sched_release()* is used to release a scheduler instance. - - --***int sample_sched_fill_data(const struct wd_sched \*sched, int numa_id, -+***int sample_sched_fill_data(const struct wd_sched \*sched, int numa_id, - __u8 mode, __u8 type, __u32 begin, __u32 end)*** - - | Layer | Parameter | Direction | Comments | -@@ -548,23 +548,23 @@ __u8 mode, __u8 type, __u32 begin, __u32 end)*** - | | *begin* | Input | The index of first context in the region. | - | | *end* | Input | The index of last context in the region. | - --After context resources allocated by *wd_request_ctx()*, user could specify --which context resources are working in the specified mode or type by -+After context resources allocated by *wd_request_ctx()*, user could specify -+which context resources are working in the specified mode or type by - *sample_sched_fill_data()*. - - - ### Environment Variable - --According to above document, user need to care NUMA node and context number --to make use of UADK. The configuration process is a little boring. The idea --of Environment Variable is to make those parameters configured in user's -+According to above document, user need to care NUMA node and context number -+to make use of UADK. The configuration process is a little boring. The idea -+of Environment Variable is to make those parameters configured in user's - environment variable. It could help user to configure those parameters. - - - ***wd_comp_env_init(void)*** - --Create a registered table for algorithm that could parse different environment --variables. With those parameters from user environment variables, allocate -+Create a registered table for algorithm that could parse different environment -+variables. With those parameters from user environment variables, allocate - related hardware resources. - - -@@ -583,7 +583,7 @@ Free allocated hardware resources. - | | *mode* | Input | Specify operation mode. | - | | | | 0 -- sync mode, 1 -- async mode. | - --Specify the parameters and create a pseudo environment variable. By this -+Specify the parameters and create a pseudo environment variable. By this - pseduo environment table, allocate related hardware resource. - - -@@ -592,7 +592,7 @@ pseduo environment table, allocate related hardware resource. - Free allocated hardware resources like ***wd_comp_env_uninit()***. - - --***wd_comp_get_env_param(__u32 node, __u32 type, __u32 mode, -+***wd_comp_get_env_param(__u32 node, __u32 type, __u32 mode, - __u32 \*num, __u8 \*is_enable)*** - - | Layer | Parameter | Direction | Comments | -@@ -605,28 +605,28 @@ Free allocated hardware resources like ***wd_comp_env_uninit()***. - | | *is_enable* | Output | Indicate whether asynchronous polling | - | | | | mode is enabled or not. | - --Query context number that is defined in environment variable by specified --NUMA node, type and operation mode. At the same time, asynchronous polling -+Query context number that is defined in environment variable by specified -+NUMA node, type and operation mode. At the same time, asynchronous polling - mode is queried. - - - - ## Vendor Driver - --A vendor driver is the counterpart of a hardware accelerator. Without the --vendor driver, the accelerator can't work. *Context* could store the --informations from the both accelerator and vendor driver. -+A vendor driver is the counterpart of a hardware accelerator. Without the -+vendor driver, the accelerator can't work. *Context* could store the -+information from the both accelerator and vendor driver. - --If an accelerator is a bit special and not be generalized, application could --access the vendor driver directly. The interface to application is defined -+If an accelerator is a bit special and not be generalized, application could -+access the vendor driver directly. The interface to application is defined - by vendor driver itself. - --Before accessing hardware accelerator, vendor driver needs to allocate --*context* first. In the *struct wd_ctx*, the node path of accelerator is also --recorded. If there're multiple accelerators share a same vendor driver, vendor -+Before accessing hardware accelerator, vendor driver needs to allocate -+*context* first. In the *struct wd_ctx*, the node path of accelerator is also -+recorded. If there're multiple accelerators share a same vendor driver, vendor - driver should decide to choose which accelerator by itself. - --Application may want to track *context*. It's not good to share *context* to -+Application may want to track *context*. It's not good to share *context* to - application directly. It's better to transfer *context* to handle for security. - - -@@ -635,41 +635,41 @@ application directly. It's better to transfer *context* to handle for security. - - ### Example in user application - --Here's an example of compression in user application. User application just -+Here's an example of compression in user application. User application just - needs a few APIs to complete synchronous compression. - - ![comp_sync](./wd_comp_sync.png) - --Synchoronous operation means polling hardware accelerator status of each --operation. It costs too much CPU resources on polling and causes performance --down. User application could divide the job into multiple parts. Then it -+Synchoronous operation means polling hardware accelerator status of each -+operation. It costs too much CPU resources on polling and causes performance -+down. User application could divide the job into multiple parts. Then it - could make use of asynchronous mechanism to save time on polling. - - ![comp_async2](./wd_comp_async2.png) - --There's also a limitation on asynchronous operation in SVA scenario. Let's --assume there're two output frames generated by accelerator, A frame and B --frame. If the output is in fixed-length, then we can calculate the address of --A and B frame in the output buffer of application. If the length of hardware --accelerator output isn't fixed, we have to setup the temperary buffer to store --A and B frame. Then a memory copy operation is required between temperary --buffer and application buffer. So we use compression as a demo to explain --asynchronous operation. It doesn't mean that we recommend to use asynchronous -+There's also a limitation on asynchronous operation in SVA scenario. Let's -+assume there're two output frames generated by accelerator, A frame and B -+frame. If the output is in fixed-length, then we can calculate the address of -+A and B frame in the output buffer of application. If the length of hardware -+accelerator output isn't fixed, we have to setup the temperary buffer to store -+A and B frame. Then a memory copy operation is required between temperary -+buffer and application buffer. So we use compression as a demo to explain -+asynchronous operation. It doesn't mean that we recommend to use asynchronous - compression. - - - ### Vendor Driver Exposed to User Application - --Here's an example of implementing vendor driver that is exposed to application -+Here's an example of implementing vendor driver that is exposed to application - direcly. - --When user application needs to access hardware accelerator, it calls the --interface in vendor driver. The interface is defined by vendor driver. Then -+When user application needs to access hardware accelerator, it calls the -+interface in vendor driver. The interface is defined by vendor driver. Then - vendor driver requests a context by *wd_request_ctx()*. - --With the context, vendor driver could access hardware accelerator by libwd, --such as MMIO, memory mapping, and so on. And application has to use the -+With the context, vendor driver could access hardware accelerator by libwd, -+such as MMIO, memory mapping, and so on. And application has to use the - interface that is defined by vendor driver. - --When application doesn't want to access hardware accelerator, vendor driver -+When application doesn't want to access hardware accelerator, vendor driver - could invokes *wd_release_ctx()* to release the hardware. --- -2.27.0 - diff --git a/0133-uadk_tool-Update-some-new-test-features.patch b/0133-uadk_tool-Update-some-new-test-features.patch deleted file mode 100644 index 7971093..0000000 --- a/0133-uadk_tool-Update-some-new-test-features.patch +++ /dev/null @@ -1,1246 +0,0 @@ -From e1f90f375fc35862d2c775f97a3119b95f19c8a2 Mon Sep 17 00:00:00 2001 -From: Longfang Liu -Date: Mon, 18 Jul 2022 17:16:31 +0800 -Subject: [PATCH 147/183] uadk_tool: Update some new test features - -1. Modify part of the repeated code macro. -2. Add new random number generation method. -3. Add new test parameters, support test algorithm -query and address pre-step function. - -Signed-off-by: Longfang Liu ---- - uadk_tool/benchmark/sec_soft_benchmark.c | 7 +- - uadk_tool/benchmark/sec_soft_benchmark.h | 1 - - uadk_tool/benchmark/sec_uadk_benchmark.c | 65 ++++---- - uadk_tool/benchmark/sec_wd_benchmark.c | 191 ++++++----------------- - uadk_tool/benchmark/uadk_benchmark.c | 115 ++++++++------ - uadk_tool/benchmark/uadk_benchmark.h | 20 ++- - 6 files changed, 166 insertions(+), 233 deletions(-) - -diff --git a/uadk_tool/benchmark/sec_soft_benchmark.c b/uadk_tool/benchmark/sec_soft_benchmark.c -index 2f6bccb..a622329 100644 ---- a/uadk_tool/benchmark/sec_soft_benchmark.c -+++ b/uadk_tool/benchmark/sec_soft_benchmark.c -@@ -56,11 +56,8 @@ typedef struct soft_jobs_res { - u32 use_engine; - } jobs_data; - --#define MAX_POOL_LENTH 4096 - #define MAX_IVK_LENTH 64 - #define DEF_IVK_DATA 0xAA --#define MAX_TRY_CNT 5000 --#define SEND_USLEEP 100 - - static unsigned int g_thread_num; - static unsigned int g_ctxnum; -@@ -613,7 +610,7 @@ static void *sec_soft_async_run(void *arg) - exit_pause: - ASYNC_WAIT_CTX_free(waitctx); - -- add_recv_data(count); -+ add_recv_data(count, g_pktlen); - - return NULL; - } -@@ -802,7 +799,7 @@ static void *sec_soft_sync_run(void *arg) - break; - } - -- add_recv_data(count); -+ add_recv_data(count, g_pktlen); - - return NULL; - } -diff --git a/uadk_tool/benchmark/sec_soft_benchmark.h b/uadk_tool/benchmark/sec_soft_benchmark.h -index 8331eb5..c1374d6 100644 ---- a/uadk_tool/benchmark/sec_soft_benchmark.h -+++ b/uadk_tool/benchmark/sec_soft_benchmark.h -@@ -4,6 +4,5 @@ - - #include "uadk_benchmark.h" - -- - extern int sec_soft_benchmark(struct acc_option *options); - #endif /* SEC_SOFT_BENCHMARK_H */ -diff --git a/uadk_tool/benchmark/sec_uadk_benchmark.c b/uadk_tool/benchmark/sec_uadk_benchmark.c -index 6eeee12..09cd8f4 100644 ---- a/uadk_tool/benchmark/sec_uadk_benchmark.c -+++ b/uadk_tool/benchmark/sec_uadk_benchmark.c -@@ -10,6 +10,8 @@ - #include "include/wd_sched.h" - - #define SEC_TST_PRT printf -+#define MAX_IVK_LENTH 64 -+#define DEF_IVK_DATA 0xAA - - struct uadk_bd { - u8 *src; -@@ -37,18 +39,12 @@ typedef struct uadk_thread_res { - u32 td_id; - } thread_data; - --#define MAX_POOL_LENTH 4096 --#define MAX_IVK_LENTH 64 --#define DEF_IVK_DATA 0xAA --#define MAX_TRY_CNT 5000 --#define SEND_USLEEP 100 -- - static struct wd_ctx_config g_ctx_cfg; - static struct wd_sched *g_sched; - static unsigned int g_thread_num; - static unsigned int g_ctxnum; -+static unsigned int g_prefetch; - static unsigned int g_pktlen; --static struct sched_params g_param; - - static void *cipher_async_cb(struct wd_cipher_req *req, void *data) - { -@@ -349,6 +345,7 @@ static int sec_uadk_param_parse(thread_data *tddata, struct acc_option *options) - static int init_ctx_config(char *alg, int subtype, int mode) - { - struct uacce_dev_list *list; -+ struct sched_params param; - int i, max_node; - int ret = 0; - -@@ -385,7 +382,7 @@ static int init_ctx_config(char *alg, int subtype, int mode) - break; - default: - SEC_TST_PRT("Fail to parse alg subtype!\n"); -- return -EINVAL; -+ goto out; - } - if (!g_sched) { - SEC_TST_PRT("Fail to alloc sched!\n"); -@@ -397,12 +394,12 @@ static int init_ctx_config(char *alg, int subtype, int mode) - list->dev->numa_id = 0; - - g_sched->name = SCHED_SINGLE; -- g_param.numa_id = list->dev->numa_id; -- g_param.type = 0; -- g_param.mode = mode; -- g_param.begin = 0; -- g_param.end = g_ctxnum - 1; -- ret = wd_sched_rr_instance(g_sched, &g_param); -+ param.numa_id = list->dev->numa_id; -+ param.type = 0; -+ param.mode = mode; -+ param.begin = 0; -+ param.end = g_ctxnum - 1; -+ ret = wd_sched_rr_instance(g_sched, ¶m); - if (ret) { - SEC_TST_PRT("Fail to fill sched data!\n"); - goto out; -@@ -419,6 +416,8 @@ static int init_ctx_config(char *alg, int subtype, int mode) - case DIGEST_TYPE: - ret = wd_digest_init(&g_ctx_cfg, g_sched); - break; -+ default: -+ goto out; - } - if (ret) { - SEC_TST_PRT("Fail to cipher ctx!\n"); -@@ -461,18 +460,13 @@ static void uninit_ctx_config(int subtype) - wd_sched_rr_release(g_sched); - } - --int init_uadk_bd_pool(void) -+static int init_uadk_bd_pool(void) - { - unsigned long step; -- int fill_size; - int i, j; - - // make the block not align to 4K - step = sizeof(char) * g_pktlen * 2; -- if (g_pktlen > MAX_IVK_LENTH) -- fill_size = MAX_IVK_LENTH; -- else -- fill_size = g_pktlen; - - g_uadk_pool.iv = malloc(g_thread_num * MAX_IVK_LENTH * sizeof(char)); - g_uadk_pool.key = malloc(g_thread_num * MAX_IVK_LENTH * sizeof(char)); -@@ -498,7 +492,9 @@ int init_uadk_bd_pool(void) - if (!g_uadk_pool.pool[i].bds[j].dst) - goto malloc_error3; - -- get_rand_data(g_uadk_pool.pool[i].bds[j].src, fill_size); -+ get_rand_data(g_uadk_pool.pool[i].bds[j].src, g_pktlen); -+ if (g_prefetch) -+ get_rand_data(g_uadk_pool.pool[i].bds[j].dst, g_pktlen); - } - } - } -@@ -526,12 +522,13 @@ malloc_error1: - - free(g_uadk_pool.iv); - free(g_uadk_pool.key); -+ free(g_uadk_pool.mac); - - SEC_TST_PRT("init uadk bd pool alloc failed!\n"); - return -ENOMEM; - } - --void free_uadk_bd_pool(void) -+static void free_uadk_bd_pool(void) - { - int i, j; - -@@ -550,21 +547,22 @@ void free_uadk_bd_pool(void) - - free(g_uadk_pool.iv); - free(g_uadk_pool.key); -+ free(g_uadk_pool.mac); - } - - /*-------------------------------uadk benchmark main code-------------------------------------*/ - --void *sec_uadk_poll(void *data) -+static void *sec_uadk_poll(void *data) - { - typedef int (*poll_ctx)(__u32 idx, __u32 expt, __u32 *count); - poll_ctx uadk_poll_ctx = NULL; - thread_data *pdata = (thread_data *)data; - u32 expt = ACC_QUEUE_SIZE * g_thread_num; - u32 id = pdata->td_id; -- u32 last_time = 2; /* poll need one more recv time */ -+ u32 last_time = 2; // poll need one more recv time - u32 count = 0; - u32 recv = 0; -- int ret; -+ int ret; - - if (id > g_ctxnum) - return NULL; -@@ -586,7 +584,6 @@ void *sec_uadk_poll(void *data) - - while (last_time) { - ret = uadk_poll_ctx(id, expt, &recv); -- // SEC_TST_PRT("expt %u, poll %d recv: %u!\n", expt, i, recv); - count += recv; - recv = 0; - if (unlikely(ret != -WD_EAGAIN && ret < 0)) { -@@ -599,7 +596,7 @@ void *sec_uadk_poll(void *data) - } - - recv_error: -- add_recv_data(count); -+ add_recv_data(count, g_pktlen); - - return NULL; - } -@@ -636,7 +633,6 @@ static void *sec_uadk_async_run(void *arg) - case CIPHER_TYPE: - cipher_setup.alg = pdata->alg; - cipher_setup.mode = pdata->mode; -- cipher_setup.sched_param = (void *)&g_param; - h_sess = wd_cipher_alloc_sess(&cipher_setup); - if (!h_sess) - return NULL; -@@ -682,7 +678,6 @@ static void *sec_uadk_async_run(void *arg) - case AEAD_TYPE: // just ccm and gcm - aead_setup.calg = pdata->alg; - aead_setup.cmode = pdata->mode; -- aead_setup.sched_param = (void *)&g_param; - h_sess = wd_aead_alloc_sess(&aead_setup); - if (!h_sess) - return NULL; -@@ -740,7 +735,6 @@ static void *sec_uadk_async_run(void *arg) - case DIGEST_TYPE: - digest_setup.alg = pdata->alg; - digest_setup.mode = pdata->mode; // digest mode is optype -- digest_setup.sched_param = (void *)&g_param; - h_sess = wd_digest_alloc_sess(&digest_setup); - if (!h_sess) - return NULL; -@@ -820,7 +814,6 @@ static void *sec_uadk_sync_run(void *arg) - case CIPHER_TYPE: - cipher_setup.alg = pdata->alg; - cipher_setup.mode = pdata->mode; -- cipher_setup.sched_param = (void *)&g_param; - h_sess = wd_cipher_alloc_sess(&cipher_setup); - if (!h_sess) - return NULL; -@@ -845,7 +838,7 @@ static void *sec_uadk_sync_run(void *arg) - creq.src = uadk_pool->bds[i].src; - creq.dst = uadk_pool->bds[i].dst; - ret = wd_do_cipher_sync(h_sess, &creq); -- if (ret || creq.state) -+ if ((ret < 0 && ret != -WD_EBUSY) || creq.state) - break; - count++; - if (get_run_state() == 0) -@@ -856,7 +849,6 @@ static void *sec_uadk_sync_run(void *arg) - case AEAD_TYPE: // just ccm and gcm - aead_setup.calg = pdata->alg; - aead_setup.cmode = pdata->mode; -- aead_setup.sched_param = (void *)&g_param; - h_sess = wd_aead_alloc_sess(&aead_setup); - if (!h_sess) - return NULL; -@@ -905,7 +897,6 @@ static void *sec_uadk_sync_run(void *arg) - case DIGEST_TYPE: - digest_setup.alg = pdata->alg; - digest_setup.mode = pdata->mode; // digest mode is optype -- digest_setup.sched_param = (void *)&g_param; - h_sess = wd_digest_alloc_sess(&digest_setup); - if (!h_sess) - return NULL; -@@ -939,7 +930,7 @@ static void *sec_uadk_sync_run(void *arg) - break; - } - -- add_recv_data(count); -+ add_recv_data(count, g_pktlen); - - return NULL; - } -@@ -982,7 +973,6 @@ int sec_uadk_sync_threads(struct acc_option *options) - - sync_error: - return ret; -- - } - - int sec_uadk_async_threads(struct acc_option *options) -@@ -998,10 +988,10 @@ int sec_uadk_async_threads(struct acc_option *options) - if (ret) - return ret; - -- /* poll thread */ - for (i = 0; i < g_ctxnum; i++) { - threads_args[i].subtype = threads_option.subtype; - threads_args[i].td_id = i; -+ /* poll thread */ - ret = pthread_create(&pollid[i], NULL, sec_uadk_poll, &threads_args[i]); - if (ret) { - SEC_TST_PRT("Create poll thread fail!\n"); -@@ -1053,6 +1043,7 @@ int sec_uadk_benchmark(struct acc_option *options) - g_thread_num = options->threads; - g_pktlen = options->pktlen; - g_ctxnum = options->ctxnums; -+ g_prefetch = options->prefetch; - if (options->optype > WD_CIPHER_DECRYPTION) { - SEC_TST_PRT("SEC optype error: %u\n", options->optype); - return -EINVAL; -diff --git a/uadk_tool/benchmark/sec_wd_benchmark.c b/uadk_tool/benchmark/sec_wd_benchmark.c -index 2e9c55d..3017fb8 100644 ---- a/uadk_tool/benchmark/sec_wd_benchmark.c -+++ b/uadk_tool/benchmark/sec_wd_benchmark.c -@@ -11,6 +11,9 @@ - #include "v1/wd_util.h" - - #define SEC_TST_PRT printf -+#define MAX_IVK_LENTH 64 -+#define DEF_IVK_DATA 0xAA -+#define SQE_SIZE 128 - - typedef struct wd_thread_res { - u32 subtype; -@@ -32,57 +35,31 @@ struct thread_bd_res { - - struct thread_queue_res { - struct thread_bd_res *bd_res; --} g_thread_queue; -+}; - - struct wcrypto_async_tag { - void *ctx; -- char *out_buf; - int thread_id; - int cnt; - }; - --#define MAX_IVK_LENTH 64 --#define DEF_IVK_DATA 0xAA --#define MAX_TRY_CNT 5000 --#define SEND_USLEEP 100 --#define TEST_MAX_THRD 128 --#define SQE_SIZE 128 --#define MAX_BLOCK_NM 4096 -- -+static struct thread_queue_res g_thread_queue; - static unsigned int g_thread_num; --static unsigned int g_ctxnum; - static unsigned int g_pktlen; - - static void *cipher_async_cb(void *message, void *cipher_tag) - { -- struct wcrypto_async_tag *async_tag = (struct wcrypto_async_tag *)cipher_tag; -- struct wcrypto_cipher_msg *req = (struct wcrypto_cipher_msg *)message; -- -- // no-sva data copy from uadk to user -- memcpy(async_tag->out_buf, req->out, g_pktlen); -- - return NULL; - } - --static void *aead_async_cb(void *message, void *aead_tag) -+static void *aead_async_cb(void *message, void *cipher_tag) - { -- struct wcrypto_async_tag *async_tag = (struct wcrypto_async_tag *)aead_tag; -- struct wcrypto_aead_msg *req = (struct wcrypto_aead_msg *)message; -- -- // no-sva data copy from uadk to user -- memcpy(async_tag->out_buf, req->out, g_pktlen); -- - return NULL; - } - - static void *digest_async_cb(void *message, void *digest_tag) - { -- struct wcrypto_async_tag *async_tag = (struct wcrypto_async_tag *)digest_tag; -- struct wcrypto_digest_msg *req = (struct wcrypto_digest_msg *)message; -- -- // no-sva data copy from uadk to user -- memcpy(async_tag->out_buf, req->out, 16); -- -+ // struct WCRYPTO_req *req = (struct WCRYPTO_req *)data; - return NULL; - } - -@@ -396,9 +373,9 @@ static int init_wd_queue(struct acc_option *options) - // use no-sva pbuffer - memset(&blksetup, 0, sizeof(blksetup)); - blksetup.block_size = g_pktlen + SQE_SIZE; //aead need mac and aad out -- blksetup.block_num = MAX_BLOCK_NM * 4; //set pool inv + key + in + out -+ blksetup.block_num = MAX_BLOCK_NM; //set pool inv + key + in + out - blksetup.align_size = SQE_SIZE; -- SEC_TST_PRT("create pool memory: %d KB\n", (MAX_BLOCK_NM * blksetup.block_size) >> 10); -+ // SEC_TST_PRT("create pool memory: %d KB\n", (MAX_BLOCK_NM * blksetup.block_size) >> 10); - - for (j = 0; j < g_thread_num; j++) { - g_thread_queue.bd_res[j].pool = wd_blkpool_create(g_thread_queue.bd_res[j].queue, &blksetup); -@@ -411,8 +388,8 @@ static int init_wd_queue(struct acc_option *options) - - // alloc in pbuffer res - for (m = 0; m < g_thread_num; m++) { -- g_thread_queue.bd_res[m].in = malloc(MAX_BLOCK_NM * sizeof(void *)); -- for (idx = 0; idx < MAX_BLOCK_NM; idx++) { -+ g_thread_queue.bd_res[m].in = malloc(MAX_POOL_LENTH * sizeof(void *)); -+ for (idx = 0; idx < MAX_POOL_LENTH; idx++) { - g_thread_queue.bd_res[m].in[idx] = wd_alloc_blk(g_thread_queue.bd_res[m].pool); - if (!g_thread_queue.bd_res[m].in[idx]) { - SEC_TST_PRT("create pool %dth in memory fail!\n", m); -@@ -427,8 +404,8 @@ static int init_wd_queue(struct acc_option *options) - - // alloc out pbuffer res - for (n = 0; n < g_thread_num; n++) { -- g_thread_queue.bd_res[n].out = malloc(MAX_BLOCK_NM * sizeof(void *)); -- for (idx = 0; idx < MAX_BLOCK_NM; idx++) { -+ g_thread_queue.bd_res[n].out = malloc(MAX_POOL_LENTH * sizeof(void *)); -+ for (idx = 0; idx < MAX_POOL_LENTH; idx++) { - g_thread_queue.bd_res[n].out[idx] = wd_alloc_blk(g_thread_queue.bd_res[n].pool); - if (!g_thread_queue.bd_res[n].out[idx]) { - SEC_TST_PRT("create pool %dth out memory fail!\n", n); -@@ -443,8 +420,8 @@ static int init_wd_queue(struct acc_option *options) - - // alloc iv pbuffer res - for (k = 0; k < g_thread_num; k++) { -- g_thread_queue.bd_res[k].iv = malloc(MAX_BLOCK_NM * sizeof(void *)); -- for (idx = 0; idx < MAX_BLOCK_NM; idx++) { -+ g_thread_queue.bd_res[k].iv = malloc(MAX_POOL_LENTH * sizeof(void *)); -+ for (idx = 0; idx < MAX_POOL_LENTH; idx++) { - g_thread_queue.bd_res[k].iv[idx] = wd_alloc_blk(g_thread_queue.bd_res[k].pool); - if (!g_thread_queue.bd_res[k].iv[idx]) { - SEC_TST_PRT("create pool %dth iv memory fail!\n", k); -@@ -462,21 +439,21 @@ static int init_wd_queue(struct acc_option *options) - - iv_err: - for (k--; k >= 0; k--) { -- for (idx = 0; idx < MAX_BLOCK_NM; idx++) -+ for (idx = 0; idx < MAX_POOL_LENTH; idx++) - wd_free_blk(g_thread_queue.bd_res[k].pool, - g_thread_queue.bd_res[k].iv[idx]); - free(g_thread_queue.bd_res[k].iv); - } - out_err: - for (n--; n >= 0; n--) { -- for (idx = 0; idx < MAX_BLOCK_NM; idx++) -+ for (idx = 0; idx < MAX_POOL_LENTH; idx++) - wd_free_blk(g_thread_queue.bd_res[n].pool, - g_thread_queue.bd_res[n].out[idx]); - free(g_thread_queue.bd_res[n].out); - } - in_err: - for (m--; m >= 0; m--) { -- for (idx = 0; idx < MAX_BLOCK_NM; idx++) -+ for (idx = 0; idx < MAX_POOL_LENTH; idx++) - wd_free_blk(g_thread_queue.bd_res[m].pool, - g_thread_queue.bd_res[m].in[idx]); - free(g_thread_queue.bd_res[m].in); -@@ -498,7 +475,7 @@ static void uninit_wd_queue(void) - int i, j, idx; - - for (i = 0; i < g_thread_num; i++) { -- for (idx = 0; idx < MAX_BLOCK_NM; idx++) { -+ for (idx = 0; idx < MAX_POOL_LENTH; idx++) { - wd_free_blk(g_thread_queue.bd_res[i].pool, g_thread_queue.bd_res[i].iv[idx]); - wd_free_blk(g_thread_queue.bd_res[i].pool, g_thread_queue.bd_res[i].in[idx]); - wd_free_blk(g_thread_queue.bd_res[i].pool, g_thread_queue.bd_res[i].out[idx]); -@@ -522,22 +499,22 @@ void *sec_wd_poll(void *data) - { - typedef int (*poll_ctx)(struct wd_queue *q, unsigned int num); - thread_data *pdata = (thread_data *)data; -- poll_ctx uadk_poll_ctx = NULL; -+ poll_ctx wd_poll_ctx = NULL; - u32 expt = ACC_QUEUE_SIZE * g_thread_num; -- u32 last_time = 2; /* poll need one more recv time */ -+ u32 last_time = 2; // poll need one more recv time - u32 id = pdata->td_id; - u32 count = 0; -- u32 recv = 0; -+ int recv = 0; - - switch(pdata->subtype) { - case CIPHER_TYPE: -- uadk_poll_ctx = wcrypto_cipher_poll; -+ wd_poll_ctx = wcrypto_cipher_poll; - break; - case AEAD_TYPE: -- uadk_poll_ctx = wcrypto_aead_poll; -+ wd_poll_ctx = wcrypto_aead_poll; - break; - case DIGEST_TYPE: -- uadk_poll_ctx = wcrypto_digest_poll; -+ wd_poll_ctx = wcrypto_digest_poll; - break; - default: - SEC_TST_PRT("<<<<<out; - res_iv = bd_res->iv; - -- /* create user data buffer */ -- src_data_buf = malloc(g_pktlen * sizeof(char)); -- if (!src_data_buf) -- return NULL; -- -- get_rand_data((u8 *)src_data_buf, g_pktlen); -- out_data_buf = malloc(g_pktlen * sizeof(char)); -- if (!out_data_buf) { -- free(src_data_buf); -- return NULL; -- } -- - memset(priv_key, DEF_IVK_DATA, MAX_IVK_LENTH); - tag = malloc(sizeof(struct wcrypto_async_tag)); // set the user tag - if (!tag) { - SEC_TST_PRT("wcrypto async alloc tag fail!\n"); -- free(src_data_buf); -- free(out_data_buf); - return NULL; - } -- tag->out_buf = out_data_buf; -+ tag->thread_id = pdata->td_id; - - switch(pdata->subtype) { - case CIPHER_TYPE: -@@ -642,7 +603,7 @@ static void *sec_wd_async_run(void *arg) - ctx = wcrypto_create_cipher_ctx(queue, &cipher_setup); - if (!ctx) { - SEC_TST_PRT("wd create cipher ctx fail!\n"); -- goto async_err; -+ return NULL; - } - tag->ctx = ctx; - -@@ -650,7 +611,7 @@ static void *sec_wd_async_run(void *arg) - if (ret) { - SEC_TST_PRT("wd cipher set key fail!\n"); - wcrypto_del_cipher_ctx(ctx); -- goto async_err; -+ return NULL; - } - - if (queue->capa.priv.direction == 0) -@@ -672,9 +633,6 @@ static void *sec_wd_async_run(void *arg) - if (get_run_state() == 0) - break; - -- // no-sva data copy to uadk -- memcpy(copdata.in, src_data_buf, g_pktlen); -- - ret = wcrypto_do_cipher(ctx, &copdata, (void *)tag); - if (ret == -WD_EBUSY) { - usleep(SEND_USLEEP * try_cnt); -@@ -687,7 +645,7 @@ static void *sec_wd_async_run(void *arg) - } - - count++; -- i = count % MAX_BLOCK_NM; -+ i = count % MAX_POOL_LENTH; - tag->cnt = i; - try_cnt = 0; - copdata.in = res_in[i]; -@@ -710,7 +668,7 @@ static void *sec_wd_async_run(void *arg) - ctx = wcrypto_create_aead_ctx(queue, &aead_setup); - if (!ctx) { - SEC_TST_PRT("wd create aead ctx fail!\n"); -- goto async_err; -+ return NULL; - } - tag->ctx = ctx; - -@@ -718,7 +676,7 @@ static void *sec_wd_async_run(void *arg) - if (ret) { - SEC_TST_PRT("wd aead set key fail!\n"); - wcrypto_del_aead_ctx(ctx); -- goto async_err; -+ return NULL; - } - - authsize = 16; //set defaut size -@@ -726,7 +684,7 @@ static void *sec_wd_async_run(void *arg) - if (ret) { - SEC_TST_PRT("set authsize fail!\n"); - wcrypto_del_aead_ctx(ctx); -- goto async_err; -+ return NULL; - } - - if (queue->capa.priv.direction == 0) { -@@ -753,9 +711,6 @@ static void *sec_wd_async_run(void *arg) - if (get_run_state() == 0) - break; - -- // no-sva data copy to uadk -- memcpy(aopdata.in, src_data_buf, g_pktlen); -- - ret = wcrypto_do_aead(ctx, &aopdata, (void *)tag); - if (ret == -WD_EBUSY) { - usleep(SEND_USLEEP * try_cnt); -@@ -768,7 +723,7 @@ static void *sec_wd_async_run(void *arg) - } - - count++; -- i = count % MAX_BLOCK_NM; -+ i = count % MAX_POOL_LENTH; - tag->cnt = i; - try_cnt = 0; - aopdata.in = res_in[i]; -@@ -791,7 +746,7 @@ static void *sec_wd_async_run(void *arg) - ctx = wcrypto_create_digest_ctx(queue, &digest_setup); - if (!ctx) { - SEC_TST_PRT("wd create digest ctx fail!\n"); -- goto async_err; -+ return NULL; - } - tag->ctx = ctx; - -@@ -801,7 +756,7 @@ static void *sec_wd_async_run(void *arg) - if (ret) { - SEC_TST_PRT("wd digest set key fail!\n"); - wcrypto_del_digest_ctx(ctx); -- goto async_err; -+ return NULL; - } - } - -@@ -818,9 +773,6 @@ static void *sec_wd_async_run(void *arg) - if (get_run_state() == 0) - break; - -- // no-sva data copy to uadk -- memcpy(dopdata.in, src_data_buf, g_pktlen); -- - ret = wcrypto_do_digest(ctx, &dopdata, (void *)tag); - if (ret == -WD_EBUSY) { - usleep(SEND_USLEEP * try_cnt); -@@ -833,7 +785,7 @@ static void *sec_wd_async_run(void *arg) - } - - count++; -- i = count % MAX_BLOCK_NM; -+ i = count % MAX_POOL_LENTH; - tag->cnt = i; - try_cnt = 0; - dopdata.in = res_in[i]; -@@ -846,7 +798,7 @@ static void *sec_wd_async_run(void *arg) - add_send_complete(); - - while (1) { -- if (get_recv_time() == g_thread_num) // wait Async mode finish recv -+ if (get_recv_time() > 0) // wait Async mode finish recv - break; - usleep(SEND_USLEEP); - } -@@ -863,10 +815,6 @@ static void *sec_wd_async_run(void *arg) - break; - } - --async_err: -- free(tag); -- free(src_data_buf); -- free(out_data_buf); - return NULL; - } - -@@ -882,8 +830,6 @@ static void *sec_wd_sync_run(void *arg) - char priv_key[MAX_IVK_LENTH]; - struct thread_bd_res *bd_res; - struct wd_queue *queue; -- char *src_data_buf = NULL; -- char *out_data_buf = NULL; - void *ctx = NULL; - void *tag = NULL; - void **res_in; -@@ -905,18 +851,6 @@ static void *sec_wd_sync_run(void *arg) - res_out = bd_res->out; - res_iv = bd_res->iv; - -- /* create user data buffer */ -- src_data_buf = malloc(g_pktlen * sizeof(char)); -- if (!src_data_buf) -- return NULL; -- -- get_rand_data((u8 *)src_data_buf, g_pktlen); -- out_data_buf = malloc(g_pktlen * sizeof(char)); -- if (!out_data_buf) { -- free(src_data_buf); -- return NULL; -- } -- - memset(priv_key, DEF_IVK_DATA, MAX_IVK_LENTH); - - switch(pdata->subtype) { -@@ -933,14 +867,14 @@ static void *sec_wd_sync_run(void *arg) - ctx = wcrypto_create_cipher_ctx(queue, &cipher_setup); - if (!ctx) { - SEC_TST_PRT("wd create cipher ctx fail!\n"); -- goto sync_err; -+ return NULL; - } - - ret = wcrypto_set_cipher_key(ctx, (__u8*)priv_key, (__u16)pdata->keysize); - if (ret) { - SEC_TST_PRT("wd cipher set key fail!\n"); - wcrypto_del_cipher_ctx(ctx); -- goto sync_err; -+ return NULL; - } - - if (queue->capa.priv.direction == 0) -@@ -961,9 +895,6 @@ static void *sec_wd_sync_run(void *arg) - if (get_run_state() == 0) - break; - -- // no-sva data copy to uadk -- memcpy(copdata.in, src_data_buf, g_pktlen); -- - ret = wcrypto_do_cipher(ctx, &copdata, tag); - if (ret == -WD_EBUSY) { - usleep(SEND_USLEEP * try_cnt); -@@ -977,13 +908,10 @@ static void *sec_wd_sync_run(void *arg) - - count++; - try_cnt = 0; -- i = count % MAX_BLOCK_NM; -+ i = count % MAX_POOL_LENTH; - copdata.in = res_in[i]; - copdata.out = res_out[i]; - copdata.iv = res_iv[i]; -- -- // no-sva data copy from uadk to user -- memcpy(out_data_buf, copdata.out, g_pktlen); - } - wcrypto_del_cipher_ctx(ctx); - -@@ -1001,14 +929,14 @@ static void *sec_wd_sync_run(void *arg) - ctx = wcrypto_create_aead_ctx(queue, &aead_setup); - if (!ctx) { - SEC_TST_PRT("wd create aead ctx fail!\n"); -- goto sync_err; -+ return NULL; - } - - ret = wcrypto_set_aead_ckey(ctx, (__u8*)priv_key, (__u16)pdata->keysize); - if (ret) { - SEC_TST_PRT("wd aead set key fail!\n"); - wcrypto_del_aead_ctx(ctx); -- goto sync_err; -+ return NULL; - } - - authsize = 16; //set defaut size -@@ -1016,7 +944,7 @@ static void *sec_wd_sync_run(void *arg) - if (ret) { - SEC_TST_PRT("set authsize fail!\n"); - wcrypto_del_aead_ctx(ctx); -- goto sync_err; -+ return NULL; - } - - if (queue->capa.priv.direction == 0) { -@@ -1042,9 +970,6 @@ static void *sec_wd_sync_run(void *arg) - if (get_run_state() == 0) - break; - -- // no-sva data copy to uadk -- memcpy(aopdata.in, src_data_buf, g_pktlen); -- - ret = wcrypto_do_aead(ctx, &aopdata, tag); - if (ret == -WD_EBUSY) { - usleep(SEND_USLEEP * try_cnt); -@@ -1058,13 +983,10 @@ static void *sec_wd_sync_run(void *arg) - - count++; - try_cnt = 0; -- i = count % MAX_BLOCK_NM; -+ i = count % MAX_POOL_LENTH; - aopdata.in = res_in[i]; - aopdata.out = res_out[i]; - aopdata.iv = res_iv[i]; -- -- // no-sva data copy from uadk to user -- memcpy(out_data_buf, aopdata.out, g_pktlen); - } - wcrypto_del_aead_ctx(ctx); - -@@ -1082,7 +1004,7 @@ static void *sec_wd_sync_run(void *arg) - ctx = wcrypto_create_digest_ctx(queue, &digest_setup); - if (!ctx) { - SEC_TST_PRT("wd create digest ctx fail!\n"); -- goto sync_err; -+ return NULL; - } - - if (digest_setup.mode == WCRYPTO_DIGEST_HMAC) { -@@ -1091,7 +1013,7 @@ static void *sec_wd_sync_run(void *arg) - if (ret) { - SEC_TST_PRT("wd digest set key fail!\n"); - wcrypto_del_digest_ctx(ctx); -- goto sync_err; -+ return NULL; - } - } - -@@ -1107,9 +1029,6 @@ static void *sec_wd_sync_run(void *arg) - if (get_run_state() == 0) - break; - -- // no-sva data copy to uadk -- memcpy(dopdata.in, src_data_buf, g_pktlen); -- - ret = wcrypto_do_digest(ctx, &dopdata, (void *)tag); - if (ret == -WD_EBUSY) { - usleep(SEND_USLEEP * try_cnt); -@@ -1123,22 +1042,16 @@ static void *sec_wd_sync_run(void *arg) - - count++; - try_cnt = 0; -- i = count % MAX_BLOCK_NM; -+ i = count % MAX_POOL_LENTH; - dopdata.in = res_in[i]; -- dopdata.out = res_out[i]; -- -- // no-sva data copy from uadk to user -- memcpy(out_data_buf, dopdata.out, 16); -+ dopdata.out = res_out[i]; - } - wcrypto_del_digest_ctx(ctx); - break; - } - -- add_recv_data(count); -+ add_recv_data(count, g_pktlen); - --sync_err: -- free(src_data_buf); -- free(out_data_buf); - return NULL; - } - -@@ -1180,6 +1093,7 @@ int sec_wd_sync_threads(struct acc_option *options) - - sync_error: - return ret; -+ - } - - int sec_wd_async_threads(struct acc_option *options) -@@ -1249,7 +1163,6 @@ int sec_wd_benchmark(struct acc_option *options) - - g_thread_num = options->threads; - g_pktlen = options->pktlen; -- g_ctxnum = options->ctxnums; - if (options->optype > WCRYPTO_CIPHER_DECRYPTION) { - SEC_TST_PRT("SEC optype error: %u\n", options->optype); - return -EINVAL; -diff --git a/uadk_tool/benchmark/uadk_benchmark.c b/uadk_tool/benchmark/uadk_benchmark.c -index 84941d5..2904cba 100644 ---- a/uadk_tool/benchmark/uadk_benchmark.c -+++ b/uadk_tool/benchmark/uadk_benchmark.c -@@ -10,19 +10,19 @@ - - #define BYTES_TO_KB 10 - #define TABLE_SPACE_SIZE 8 --#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) - - /*----------------------------------------head struct--------------------------------------------------------*/ - static unsigned int g_run_state = 1; - static pthread_mutex_t acc_mutex = PTHREAD_MUTEX_INITIALIZER; - static struct _recv_data { -+ double pkg_len; - u64 send_cnt; - u64 recv_cnt; - u32 send_times; - u32 recv_times; - } g_recv_data; - --/* SVA mode and NOSVA mode change need re_insmode driver ko */ -+/* SVA mode and NOSVA mode change need re_insmod driver ko */ - enum test_type { - SVA_MODE = 0x1, - NOSVA_MODE = 0x2, -@@ -63,7 +63,7 @@ static struct acc_alg_item alg_options[] = { - {"rsa-2048-crt", RSA_2048_CRT}, - {"rsa-3072-crt", RSA_3072_CRT}, - {"rsa-4096-crt", RSA_4096_CRT}, -- {"dh-768 ", DH_768}, -+ {"dh-768", DH_768}, - {"dh-1024", DH_1024}, - {"dh-1536", DH_1536}, - {"dh-2048", DH_2048}, -@@ -131,10 +131,14 @@ void add_send_complete(void) - __atomic_add_fetch(&g_recv_data.send_times, 1, __ATOMIC_RELAXED); - } - --void add_recv_data(u32 cnt) -+void add_recv_data(u32 cnt, u32 pkglen) - { - pthread_mutex_lock(&acc_mutex); - g_recv_data.recv_cnt += cnt; -+ if (g_recv_data.pkg_len == 0) -+ g_recv_data.pkg_len = pkglen; -+ else -+ g_recv_data.pkg_len = ((double)pkglen + g_recv_data.pkg_len) / 2; - g_recv_data.recv_times++; - pthread_mutex_unlock(&acc_mutex); - } -@@ -148,6 +152,7 @@ void init_recv_data(void) - { - g_recv_data.send_cnt = 0; - g_recv_data.recv_cnt = 0; -+ g_recv_data.pkg_len = 0.0; - g_recv_data.send_times = 0; - g_recv_data.recv_times = 0; - } -@@ -263,28 +268,21 @@ void time_start(u32 seconds) - alarm(seconds); - } - --int get_rand_int(int range) --{ -- int randnum; -- -- if (range <= 0) { -- ACC_TST_PRT("rand range error!\n"); -- return 1; -- } -- srand((unsigned)time(NULL) * getpid()); -- randnum = rand() % range; -- -- return randnum; --} -- --void get_rand_data(u8 *addr, int size) -+void get_rand_data(u8 *addr, u32 size) - { -+ unsigned short rand_state[3] = { -+ (0xae >> 16) & 0xffff, 0xae & 0xffff, 0x330e}; - int i; - -- srand((unsigned)time(NULL) * getpid()); -- for (i = 0; i < size; i++) { -- addr[i] = rand() % 0xFF; -- } -+#if 1 -+ // only 32bit valid, other 32bit is zero -+ for (i = 0; i < size >> 3; i++) -+ *((u64 *)addr + i) = nrand48(rand_state); -+#else -+ // full 64bit valid -+ for (i = 0; i < size >> 2; i++) -+ *((u32 *)addr + i) = nrand48(rand_state); -+#endif - } - - /*-------------------------------------main code------------------------------------------------------*/ -@@ -320,7 +318,7 @@ static void parse_alg_param(struct acc_option *option) - case X25519_ALG: - snprintf(option->algclass, MAX_ALG_NAME, "%s", "x25519"); - option->acctype = HPRE_TYPE; -- option->subtype = X22519_TYPE; -+ option->subtype = X25519_TYPE; - break; - case X448_ALG: - snprintf(option->algclass, MAX_ALG_NAME, "%s", "x448"); -@@ -366,8 +364,8 @@ void cal_perfermance_data(struct acc_option *option, u32 sttime) - double perfermance; - double cpu_rate; - u32 ttime = 1000; -- u32 perfdata; -- u32 perfops; -+ double perfdata; -+ double perfops; - double ops; - u32 ptime; - int i, len; -@@ -397,13 +395,13 @@ void cal_perfermance_data(struct acc_option *option, u32 sttime) - palgname[i] = '\0'; - - ptime = ptime - sttime; -- perfdata = (g_recv_data.recv_cnt * option->pktlen) >> BYTES_TO_KB; -- perfops = (g_recv_data.recv_cnt) >> BYTES_TO_KB; -- perfermance = (double)perfdata / option->times; -- ops = (double)perfops / option->times; -+ perfdata = g_recv_data.pkg_len * g_recv_data.recv_cnt / 1024.0; -+ perfops = (double)(g_recv_data.recv_cnt) / 1000.0; -+ perfermance = perfdata / option->times; -+ ops = perfops / option->times; - cpu_rate = (double)ptime / option->times; - ACC_TST_PRT("algname: length: perf: iops: CPU_rate:\n" -- "%s %uBytes %.1fKB/s %.1fKops %.2f%%\n", -+ "%s %-2uBytes %.1fKB/s %.1fKops %.2f%%\n", - palgname, option->pktlen, perfermance, ops, cpu_rate); - } - -@@ -419,11 +417,11 @@ static int benchmark_run(struct acc_option *option) - ret = sec_wd_benchmark(option); - } - usleep(20000); -- #ifdef WITH_OPENSSL_DIR -+#ifdef WITH_OPENSSL_DIR - if (option->modetype & SOFT_MODE) { - ret = sec_soft_benchmark(option); - } -- #endif -+#endif - break; - case HPRE_TYPE: - break; -@@ -447,6 +445,7 @@ static void dump_param(struct acc_option *option) - ACC_TST_PRT(" [--ctxnum]: %u\n", option->ctxnums); - ACC_TST_PRT(" [--algclass]:%s\n", option->algclass); - ACC_TST_PRT(" [--acctype]: %u\n", option->acctype); -+ ACC_TST_PRT(" [--prefetch]:%u\n", option->prefetch); - ACC_TST_PRT(" [--engine]: %s\n", option->engine); - } - -@@ -457,6 +456,7 @@ int acc_benchmark_run(struct acc_option *option) - int i, ret = 0; - int status; - -+ ACC_TST_PRT("start UADK benchmark test.\n"); - parse_alg_param(option); - dump_param(option); - -@@ -558,13 +558,27 @@ static void print_help(void) - ACC_TST_PRT(" set the number of threads\n"); - ACC_TST_PRT(" [--ctxnum]:\n"); - ACC_TST_PRT(" the number of QP queues used by the entire test task\n"); -+ ACC_TST_PRT(" [--prefetch]:\n"); -+ ACC_TST_PRT(" in SVA mode, Enable prefetch can reduce page faults and improve performance\n"); - ACC_TST_PRT(" [--engine]:\n"); - ACC_TST_PRT(" set the test openssl engine\n"); -+ ACC_TST_PRT(" [--alglist]:\n"); -+ ACC_TST_PRT(" list the all support alg\n"); - ACC_TST_PRT(" [--help] = usage\n"); - ACC_TST_PRT("Example\n"); - ACC_TST_PRT(" ./uadk_tool benchmark --alg aes-128-cbc --mode sva --opt 0 --sync\n"); - ACC_TST_PRT(" --pktlen 1024 --seconds 1 --multi 1 --thread 1 --ctxnum 4\n"); -- ACC_TST_PRT("UPDATE:2021-7-28\n"); -+ ACC_TST_PRT("UPDATE:2022-7-18\n"); -+} -+ -+static void print_support_alg(void) -+{ -+ int i; -+ -+ ACC_TST_PRT("UADK benchmark supported ALG:\n"); -+ for (i = 0; i < ALG_MAX; i++) { -+ ACC_TST_PRT("%s\n", alg_options[i].name); -+ } - } - - int acc_cmd_parse(int argc, char *argv[], struct acc_option *option) -@@ -583,8 +597,10 @@ int acc_cmd_parse(int argc, char *argv[], struct acc_option *option) - {"thread", required_argument, 0, 9}, - {"multi", required_argument, 0, 10}, - {"ctxnum", required_argument, 0, 11}, -- {"engine", required_argument, 0, 12}, -- {"help", no_argument, 0, 13}, -+ {"prefetch", no_argument, 0, 12}, -+ {"engine", required_argument, 0, 13}, -+ {"alglist", no_argument, 0, 14}, -+ {"help", no_argument, 0, 15}, - {0, 0, 0, 0} - }; - -@@ -593,7 +609,6 @@ int acc_cmd_parse(int argc, char *argv[], struct acc_option *option) - if (c == -1) - break; - -- // ACC_TST_PRT("index:%d , optarg name:%s\n", c, optarg); - switch (c) { - case 2: - option->algtype = get_alg_type(optarg); -@@ -627,26 +642,36 @@ int acc_cmd_parse(int argc, char *argv[], struct acc_option *option) - option->ctxnums = strtol(optarg, NULL, 0); - break; - case 12: -- strcpy(option->engine, optarg); -+ option->prefetch = 1; - break; - case 13: -- print_help(); -+ strcpy(option->engine, optarg); - break; -+ case 14: -+ print_support_alg(); -+ goto to_exit; -+ case 15: -+ print_help(); -+ goto to_exit; - default: - ACC_TST_PRT("bad input test parameter!\n"); - print_help(); -- exit(-1); -+ goto to_exit; - } - } -+ - return 0; -+ -+to_exit: -+ return -EINVAL; - } - - int acc_option_convert(struct acc_option *option) - { -- if (option->algtype >= ALG_MAX) -+ if (option->algtype >= ALG_MAX) { -+ ACC_TST_PRT("invalid: input algname is wrong!\n"); - goto param_err; -- else if (option->algtype < 0) -- option->algtype = AES_128_CBC; -+ } - - if (option->modetype >= INVALID_MODE) - goto param_err; -@@ -657,8 +682,8 @@ int acc_option_convert(struct acc_option *option) - /* Min test package size is 64Bytes */ - if (option->pktlen > MAX_DATA_SIZE) - goto param_err; -- else if (option->pktlen < 64) -- option->pktlen = 64; -+ else if (option->pktlen < 16) -+ option->pktlen = 16; - - if (option->times > MAX_TIME_SECONDS) { - ACC_TST_PRT("uadk benchmark max test times to 128 seconds\n"); -diff --git a/uadk_tool/benchmark/uadk_benchmark.h b/uadk_tool/benchmark/uadk_benchmark.h -index 2cb3dc0..a344fac 100644 ---- a/uadk_tool/benchmark/uadk_benchmark.h -+++ b/uadk_tool/benchmark/uadk_benchmark.h -@@ -15,7 +15,6 @@ - #include - #include - #include --#include - #include - - #define ACC_TST_PRT printf -@@ -24,21 +23,30 @@ - #define MAX_CTX_NUM 64 - #define MAX_TIME_SECONDS 128 - #define BYTES_TO_MB 20 --#define MAX_OPT_TYPE 5 -+#define MAX_OPT_TYPE 6 - #define MAX_DATA_SIZE (15 * 1024 * 1024) - #define MAX_ALG_NAME 64 - #define ACC_QUEUE_SIZE 1024 - -+#define MAX_BLOCK_NM 16384 /* BLOCK_NUM must 4 times of POOL_LENTH */ -+#define MAX_POOL_LENTH 4096 -+#define MAX_TRY_CNT 5000 -+#define SEND_USLEEP 100 -+ - typedef unsigned char u8; - typedef unsigned int u32; - typedef unsigned long long u64; - #define SCHED_SINGLE "sched_single" -+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) - - /** - * struct acc_option - Define the test acc app option list. - * @algclass: 0:cipher 1:digest - * @acctype: The sub alg type, reference func get_cipher_resource. - * @syncmode: 0:sync mode 1:async mode -+ * @modetype: sva, no-sva, soft mode -+ * @optype: enc/dec, comp/decomp -+ * @prefetch: write allocated memory to prevent page faults - */ - struct acc_option { - char algname[64]; -@@ -56,6 +64,7 @@ struct acc_option { - u32 subtype; - char engine[64]; - u32 engine_flag; -+ u32 prefetch; - }; - - enum acc_type { -@@ -74,7 +83,7 @@ enum alg_type { - ECDH_TYPE, - ECDSA_TYPE, - SM2_TYPE, -- X22519_TYPE, -+ X25519_TYPE, - X448_TYPE, - }; - -@@ -164,9 +173,8 @@ extern void cal_perfermance_data(struct acc_option *option, u32 sttime); - extern void time_start(u32 seconds); - extern int get_run_state(void); - extern void set_run_state(int state); --extern int get_rand_int(int range); --extern void get_rand_data(u8 *addr, int size); --extern void add_recv_data(u32 cnt); -+extern void get_rand_data(u8 *addr, u32 size); -+extern void add_recv_data(u32 cnt, u32 pkglen); - extern void add_send_complete(void); - extern u32 get_recv_time(void); - --- -2.27.0 - diff --git a/0134-uadk_tool-Add-SVA-test-function-of-HPRE-algorithm.patch b/0134-uadk_tool-Add-SVA-test-function-of-HPRE-algorithm.patch deleted file mode 100644 index e7dfd04..0000000 --- a/0134-uadk_tool-Add-SVA-test-function-of-HPRE-algorithm.patch +++ /dev/null @@ -1,4145 +0,0 @@ -From 133b429c4949dba6af0809c531cb08ac96238f60 Mon Sep 17 00:00:00 2001 -From: Longfang Liu -Date: Mon, 18 Jul 2022 17:16:32 +0800 -Subject: [PATCH 148/183] uadk_tool: Add SVA test function of HPRE algorithm - -Add the performance test function of SVA mode of -RSA, DH, ECC algorithms for HPRE module. - -Signed-off-by: Longfang Liu ---- - uadk_tool/benchmark/hpre_protocol_data.h | 1667 ++++++++++++++ - uadk_tool/benchmark/hpre_uadk_benchmark.c | 2433 +++++++++++++++++++++ - uadk_tool/benchmark/hpre_uadk_benchmark.h | 6 + - 3 files changed, 4106 insertions(+) - create mode 100644 uadk_tool/benchmark/hpre_protocol_data.h - create mode 100644 uadk_tool/benchmark/hpre_uadk_benchmark.c - create mode 100644 uadk_tool/benchmark/hpre_uadk_benchmark.h - -diff --git a/uadk_tool/benchmark/hpre_protocol_data.h b/uadk_tool/benchmark/hpre_protocol_data.h -new file mode 100644 -index 0000000..9c92138 ---- /dev/null -+++ b/uadk_tool/benchmark/hpre_protocol_data.h -@@ -0,0 +1,1667 @@ -+/* SPDX-License-Identifier: Apache-2.0 */ -+#ifndef HPRE_PROTOCOL_DATA_H -+#define HPRE_PROTOCOL_DATA_H -+ -+static unsigned char rsa_e_1024[] = { -+ 0x01, 0x00, 0x01, -+}; -+ -+static unsigned char rsa_p_1024[] = { -+ 0xf6, 0x49, 0xf2, 0xec, 0x89, 0xc8, 0xc2, 0x9b, 0x38, 0xd8, 0x74, 0x9b, 0x77, 0xed, 0x96, 0xc7, -+ 0x6d, 0xed, 0x15, 0x51, 0x2d, 0xfe, 0x67, 0x10, 0xa5, 0xdf, 0xd0, 0x59, 0x79, 0x75, 0x00, 0x60, -+ 0x3d, 0xd0, 0xf6, 0xe4, 0xda, 0x16, 0x5a, 0x24, 0x14, 0x01, 0xfa, 0x19, 0x07, 0x75, 0x21, 0x70, -+ 0x88, 0x40, 0xd9, 0x2f, 0xec, 0x83, 0x9e, 0x5f, 0xaa, 0xc0, 0xa3, 0x70, 0x18, 0xf5, 0x78, 0xdf, -+}; -+ -+static unsigned char rsa_q_1024[] = { -+ 0xcf, 0x53, 0x52, 0x09, 0x0d, 0xd7, 0x84, 0xdb, 0xa4, 0x4c, 0x79, 0x74, 0x0d, 0x94, 0xa0, 0x19, -+ 0x94, 0x33, 0xbf, 0x39, 0xe5, 0xef, 0xf5, 0xe9, 0x6c, 0xef, 0xd0, 0x9a, 0x4c, 0x00, 0x14, 0x68, -+ 0x66, 0xa7, 0x80, 0x32, 0x14, 0x84, 0xc9, 0x6f, 0x9a, 0x7d, 0x43, 0x0e, 0x9f, 0x85, 0x27, 0x6c, -+ 0x65, 0x50, 0x9b, 0x88, 0x54, 0x22, 0x72, 0x95, 0x90, 0x26, 0xc4, 0xa8, 0x19, 0x1c, 0x47, 0x03, -+}; -+ -+static unsigned char rsa_dp_1024[] = { -+ 0xd0, 0xb6, 0x66, 0x28, 0xd1, 0xb2, 0xd2, 0x48, 0x1c, 0x6a, 0x42, 0x97, 0x25, 0x90, 0xb0, 0x40, -+ 0x1d, 0x05, 0xd7, 0x14, 0xce, 0x77, 0x52, 0xfc, 0x26, 0xb5, 0x7e, 0xa8, 0xf4, 0x66, 0x94, 0x84, -+ 0xfa, 0x9d, 0xc5, 0x3c, 0xb7, 0x1c, 0x4e, 0x13, 0x58, 0xe9, 0x3b, 0xfa, 0x4d, 0xf9, 0x92, 0xf6, -+ 0xfc, 0x60, 0x88, 0x2d, 0x36, 0xaf, 0x6b, 0x5d, 0x03, 0x24, 0xf0, 0xdc, 0x24, 0x2a, 0x91, 0xdd, -+}; -+ -+static unsigned char rsa_dq_1024[] = { -+ 0x09, 0x4a, 0x89, 0x9d, 0xa0, 0x42, 0x2d, 0x51, 0x0e, 0x8e, 0xe2, 0xce, 0x81, 0xa1, 0x4c, 0x7f, -+ 0x78, 0xf5, 0xcc, 0xb7, 0x12, 0x87, 0xeb, 0x74, 0x57, 0x8e, 0x73, 0xc1, 0xc6, 0x70, 0x26, 0x79, -+ 0xfb, 0x47, 0xbc, 0x66, 0x02, 0x27, 0x65, 0x43, 0x9c, 0x1f, 0xca, 0xf6, 0x87, 0xcd, 0x96, 0xd3, -+ 0xb3, 0xc2, 0xa6, 0x05, 0xb9, 0x07, 0x86, 0x2d, 0x0f, 0xb5, 0xbd, 0x10, 0x6f, 0x77, 0xa5, 0xf3, -+}; -+ -+static unsigned char rsa_qinv_1024[] = { -+ 0x59, 0xf3, 0xaf, 0x75, 0xde, 0xdd, 0xcc, 0xc7, 0x62, 0xd7, 0xed, 0x4e, 0x81, 0x18, 0xca, 0x42, -+ 0xab, 0x36, 0x3b, 0x83, 0x5c, 0xd0, 0x55, 0x3f, 0x37, 0x3a, 0xa9, 0x64, 0x25, 0x65, 0x05, 0xde, -+ 0x87, 0xca, 0x54, 0xdb, 0x24, 0xdc, 0xe8, 0xf7, 0x4a, 0xfe, 0x2c, 0x59, 0xbf, 0x3d, 0x45, 0x43, -+ 0x91, 0x9e, 0x6b, 0x9c, 0xf6, 0xce, 0xb2, 0xf8, 0xc5, 0x2e, 0xef, 0x85, 0x58, 0xed, 0x4a, 0x0e, -+}; -+ -+static unsigned char rsa_d_1024[] = { -+ 0x13, 0xbe, 0x3a, 0x33, 0xf3, 0xad, 0x6f, 0xc7, 0x3a, 0x8c, 0x77, 0xe3, 0x73, 0xb8, 0x13, 0xf0, -+ 0x66, 0x50, 0xd7, 0x04, 0xe5, 0xeb, 0x11, 0x31, 0x97, 0x9b, 0xac, 0xd5, 0x72, 0x9f, 0xe4, 0xeb, -+ 0xd7, 0x27, 0x9b, 0x2d, 0xef, 0xca, 0xa3, 0x7c, 0xe7, 0x2f, 0x5e, 0xd7, 0xe9, 0x85, 0xbd, 0x88, -+ 0xce, 0xb6, 0x32, 0xe2, 0xf3, 0xe4, 0x28, 0x0f, 0xc7, 0x8e, 0xa5, 0xbb, 0xc4, 0xd4, 0xe8, 0xd9, -+ 0x23, 0x81, 0x4c, 0x71, 0x37, 0xc9, 0x78, 0xe2, 0xd8, 0x54, 0x01, 0x05, 0xb9, 0x5e, 0x48, 0xab, -+ 0x65, 0x76, 0x63, 0xe3, 0x90, 0xaf, 0x25, 0x00, 0xde, 0xe3, 0xb7, 0x6f, 0x91, 0xa1, 0x5e, 0x7a, -+ 0x84, 0xbf, 0x62, 0x08, 0x63, 0xe7, 0x0a, 0x23, 0x42, 0x50, 0xc8, 0x33, 0x29, 0xb9, 0x27, 0x27, -+ 0xe6, 0x34, 0x73, 0x69, 0x08, 0x76, 0xaf, 0x65, 0x1e, 0x3b, 0x51, 0xa5, 0x16, 0xad, 0x20, 0xe5, -+}; -+ -+static unsigned char rsa_n_1024[] = { -+ 0xc7, 0x75, 0xf4, 0x53, 0x6b, 0xd4, 0x69, 0x28, 0x39, 0xeb, 0xa7, 0x70, 0xcf, 0x8f, 0x47, 0x54, -+ 0x57, 0xf9, 0x43, 0xd3, 0xd6, 0x7b, 0xa4, 0xc9, 0x4b, 0xb3, 0x9d, 0xb3, 0x7f, 0x8f, 0x46, 0x31, -+ 0xf6, 0xbe, 0x62, 0xa4, 0x0c, 0x7e, 0x41, 0x41, 0x2e, 0x4d, 0x31, 0x1a, 0x92, 0xca, 0x69, 0x27, -+ 0x0a, 0x06, 0x23, 0xf5, 0x0f, 0x50, 0xf0, 0x17, 0xfa, 0x92, 0x25, 0x1c, 0xb6, 0x59, 0x2c, 0xcc, -+ 0xc9, 0x4d, 0x3c, 0x38, 0x04, 0xbb, 0x05, 0xc5, 0x20, 0xe5, 0xaf, 0x06, 0xd0, 0xc4, 0x14, 0x9c, -+ 0xa9, 0xa4, 0x7e, 0x97, 0x04, 0xb9, 0xe7, 0x60, 0x47, 0xa2, 0xed, 0xea, 0xda, 0xec, 0x4e, 0x0a, -+ 0x7a, 0x01, 0x00, 0x19, 0x19, 0x99, 0x49, 0x28, 0x70, 0x07, 0x21, 0xd8, 0x0d, 0x1f, 0x2d, 0xa2, -+ 0x9d, 0x78, 0x94, 0x26, 0xdd, 0x26, 0x65, 0x66, 0xf3, 0x04, 0xc3, 0x3b, 0x5e, 0xca, 0x43, 0x9d, -+}; -+ -+static unsigned char rsa_e_2048[] = { -+ 0x01, 0x00, 0x01, -+}; -+ -+static unsigned char rsa_p_2048[] = { -+ 0x01, 0xf8, 0x33, 0x75, 0x8c, 0x8d, 0x6b, 0xed, 0x4b, 0xf7, 0x0a, 0x3a, 0x67, 0xd5, 0x91, -+ 0x27, 0xe6, 0x62, 0x90, 0x67, 0xd2, 0xe3, 0x33, 0xdc, 0xba, 0x96, 0x81, 0xb7, 0xc9, 0xc8, -+ 0xa6, 0x64, 0x8b, 0xe9, 0x2f, 0x1d, 0x87, 0x3c, 0x9a, 0x95, 0x19, 0x8b, 0x04, 0x8c, 0x1a, -+ 0xc1, 0x6b, 0x76, 0x8d, 0xe3, 0x2a, 0x50, 0xec, 0xb8, 0xf7, 0x02, 0x38, 0x5d, 0xd0, 0xe6, -+ 0xc0, 0x9f, 0xb5, 0xc6, 0xf7, 0xd0, 0x34, 0xec, 0xd5, 0x4d, 0xf5, 0x26, 0x32, 0x8a, 0xe8, -+ 0x5f, 0xd5, 0x1d, 0x0e, 0xd8, 0xcd, 0x84, 0xe0, 0xd6, 0x09, 0x3a, 0xcd, 0x8b, 0x5c, 0x96, -+ 0x89, 0xf0, 0x2e, 0xb7, 0x87, 0x9c, 0x12, 0xeb, 0xd6, 0x84, 0x00, 0x3d, 0x1c, 0xff, 0xa0, -+ 0xaa, 0x82, 0x0a, 0x4d, 0x53, 0x06, 0xde, 0x5a, 0x0c, 0x4a, 0xd4, 0x94, 0x5b, 0x01, 0xac, -+ 0x9f, 0x9e, 0x7e, 0x90, 0xb0, 0xd7, 0x19 -+}; -+ -+static unsigned char rsa_q_2048[] = { -+ 0x01, 0xe1, 0xf1, 0x9b, 0xd6, 0xcf, 0x15, 0x49, 0x4c, 0xfa, 0x90, 0xf1, 0x27, 0xb1, 0xe2, -+ 0xc9, 0xf8, 0xec, 0x97, 0xc5, 0x10, 0x6c, 0xad, 0x62, 0xba, 0x1b, 0x23, 0x1e, 0x95, 0xb3, -+ 0x30, 0x89, 0x15, 0xc2, 0x19, 0x9e, 0xa8, 0x06, 0x30, 0xe1, 0xf0, 0x14, 0xfa, 0x99, 0x10, -+ 0x22, 0x13, 0x43, 0xb1, 0x97, 0xa4, 0x7d, 0x5d, 0x92, 0xa4, 0xf1, 0x28, 0x33, 0xbc, 0x9b, -+ 0x20, 0xba, 0x73, 0x66, 0x32, 0x96, 0x63, 0xb2, 0x1d, 0x49, 0xe8, 0xbc, 0x2e, 0x88, 0x2b, -+ 0x9f, 0x89, 0x14, 0xb6, 0x5e, 0xe1, 0xe9, 0x0f, 0x1c, 0xa8, 0xd5, 0xa4, 0xda, 0x61, 0xde, -+ 0x0c, 0x36, 0xce, 0xf2, 0x89, 0xeb, 0x59, 0xd5, 0xd0, 0xdf, 0x77, 0xb5, 0x14, 0xa6, 0xcf, -+ 0x35, 0x86, 0xf1, 0x78, 0x1a, 0x8a, 0x52, 0x6f, 0x06, 0x20, 0x17, 0xca, 0xa8, 0xae, 0x4a, -+ 0x60, 0xf9, 0x89, 0x05, 0xc6, 0x0d, 0x87 -+}; -+ -+static unsigned char rsa_dp_2048[] = { -+ 0x54, 0xd7, 0xb3, 0xec, 0x16, 0xd0, 0x16, 0x7a, 0x35, 0xf3, 0xce, 0xa8, 0x32, 0x53, 0xde, -+ 0xb6, 0xf1, 0xd7, 0x02, 0xe1, 0x85, 0xc1, 0xf0, 0x5e, 0xa5, 0x7c, 0xe6, 0x84, 0x59, 0xf3, -+ 0x45, 0xf0, 0x15, 0x29, 0x0c, 0x7a, 0xf9, 0x43, 0xb9, 0xdb, 0x36, 0x7d, 0x69, 0x66, 0x07, -+ 0x2e, 0x22, 0x20, 0xf6, 0x1c, 0xe4, 0xc9, 0x30, 0xc6, 0xbf, 0xe4, 0xe4, 0x44, 0x86, 0xcf, -+ 0xdb, 0x10, 0x27, 0x8f, 0x03, 0xc6, 0x24, 0x24, 0x30, 0x9e, 0x13, 0xf3, 0x65, 0x54, 0x7c, -+ 0xeb, 0xcb, 0x9b, 0xf7, 0xf7, 0x7d, 0x68, 0xa8, 0x1b, 0x9d, 0x7d, 0x80, 0xf9, 0xef, 0x8a, -+ 0xfe, 0x93, 0x9d, 0xe6, 0x7f, 0xe8, 0xdf, 0x2e, 0x95, 0xbf, 0xc4, 0x88, 0xe0, 0xab, 0x14, -+ 0x86, 0x15, 0x5d, 0xb5, 0x9e, 0xee, 0x43, 0x90, 0xd5, 0xf6, 0xb7, 0x90, 0x28, 0xd3, 0xf7, -+ 0x78, 0x20, 0x2c, 0x10, 0xd5, 0xe1 -+}; -+ -+static unsigned char rsa_dq_2048[] = { -+ 0x38, 0x83, 0x81, 0x77, 0xb5, 0xfe, 0xd4, 0x02, 0x9f, 0xdb, 0x41, 0x3c, 0x1b, 0x62, 0xf1, -+ 0xb6, 0x2b, 0xe0, 0x3c, 0x2e, 0x89, 0xdf, 0xe7, 0x14, 0xd5, 0xbb, 0xcf, 0x89, 0x54, 0x62, -+ 0xdb, 0xa0, 0x5e, 0x8b, 0x6c, 0x8c, 0x5d, 0x75, 0x7b, 0xf9, 0x10, 0x2c, 0xb6, 0xa8, 0x2a, -+ 0xa6, 0xc1, 0xa8, 0x60, 0x94, 0xdc, 0x52, 0x8d, 0xb0, 0xa3, 0xca, 0xc8, 0x0e, 0x54, 0xce, -+ 0x88, 0xae, 0xa1, 0x8c, 0x4b, 0x10, 0x53, 0xc1, 0x95, 0x7a, 0x22, 0x1e, 0xfe, 0xbe, 0xc6, -+ 0xcd, 0x67, 0x4d, 0x5f, 0x60, 0xf4, 0x58, 0x5e, 0x4e, 0xfa, 0x06, 0x83, 0xc9, 0x38, 0x25, -+ 0x8c, 0x83, 0xc5, 0xf3, 0x20, 0x52, 0xff, 0x7c, 0xa7, 0xc7, 0xbc, 0xc7, 0x38, 0x2c, 0x52, -+ 0x25, 0x89, 0xc9, 0x40, 0xab, 0x79, 0xb1, 0x25, 0x31, 0xbc, 0x38, 0x7a, 0x81, 0x3d, 0x9d, -+ 0x93, 0x85, 0x5a, 0xd4, 0xf7, 0x9f -+}; -+ -+static unsigned char rsa_qinv_2048[] = { -+ 0x01, 0x3d, 0x2b, 0xcc, 0x55, 0x34, 0x6f, 0x0b, 0x2d, 0x84, 0x57, 0x16, 0x50, 0x06, 0x38, -+ 0x3f, 0xcf, 0x61, 0x25, 0x6d, 0x16, 0xc4, 0x91, 0x0e, 0x28, 0xa4, 0xbe, 0x2e, 0x0a, 0x12, -+ 0x6a, 0x0b, 0xe7, 0xda, 0x94, 0x12, 0x36, 0x99, 0xbe, 0x3c, 0x51, 0x01, 0x98, 0x84, 0x77, -+ 0xc8, 0xed, 0xd9, 0xaa, 0xbc, 0x3d, 0x7a, 0x48, 0x69, 0xf4, 0xac, 0x68, 0x78, 0xfa, 0x81, -+ 0xba, 0x57, 0xbd, 0xaa, 0x9d, 0xcc, 0x39, 0x57, 0x87, 0x77, 0xe9, 0x2a, 0xcd, 0xde, 0xfc, -+ 0x4d, 0xf5, 0xb6, 0x4f, 0xc3, 0x53, 0x00, 0x5a, 0xf6, 0x14, 0x96, 0x7b, 0x37, 0x7e, 0x9f, -+ 0x89, 0xa0, 0x7e, 0xa4, 0xc8, 0xe5, 0xb1, 0x7b, 0x29, 0x82, 0x95, 0x7b, 0x08, 0x68, 0xb6, -+ 0x76, 0x4b, 0xf9, 0x5f, 0x31, 0xe7, 0x3f, 0xf2, 0x2a, 0xbe, 0xe4, 0x28, 0xf3, 0x83, 0x0f, -+ 0x17, 0xe9, 0x8f, 0xbb, 0x4f, 0x1e, 0x26 -+}; -+ -+static unsigned char rsa_d_2048[] = { -+ 0x03, 0xb5, 0x34, 0x8b, 0x3c, 0xfa, 0x14, 0xd1, 0x38, 0x44, 0xc0, 0xb5, 0xee, 0x6f, 0xa6, -+ 0x8b, 0x46, 0x4a, 0x46, 0x77, 0x7f, 0x49, 0x4f, 0x0a, 0x00, 0x5d, 0xed, 0x36, 0xe2, 0x22, -+ 0x0b, 0xc6, 0x6c, 0xd6, 0x25, 0x15, 0xa2, 0x51, 0xa1, 0xc8, 0xb7, 0x22, 0xd8, 0xad, 0xb7, -+ 0xf8, 0x59, 0xa9, 0x69, 0x32, 0xf0, 0xa4, 0xc6, 0x17, 0x40, 0xaa, 0x74, 0x4d, 0x98, 0x2f, -+ 0x71, 0xc0, 0x18, 0xdd, 0x3d, 0xe9, 0x0f, 0x7a, 0x1a, 0x7f, 0xff, 0xf8, 0x5b, 0x63, 0x13, -+ 0xf8, 0xfe, 0x4b, 0xf8, 0x9f, 0xa5, 0xfc, 0x6d, 0x60, 0x49, 0x5a, 0xc2, 0xbd, 0x07, 0x6c, -+ 0x32, 0xe7, 0x24, 0xf9, 0x46, 0x03, 0xab, 0x54, 0x30, 0x3b, 0x29, 0x91, 0x0f, 0x1c, 0x77, -+ 0x3a, 0x00, 0xf4, 0xe3, 0xcf, 0xd8, 0x35, 0x3e, 0x0f, 0xd0, 0xd8, 0xf4, 0x50, 0x6e, 0x88, -+ 0x6a, 0x4f, 0xd0, 0xa8, 0x40, 0x5a, 0x2f, 0x3c, 0x11, 0x4f, 0x43, 0xb0, 0x43, 0x23, 0x20, -+ 0x36, 0xb7, 0xb2, 0x16, 0xed, 0xbc, 0xb5, 0xc8, 0xde, 0x7e, 0x4a, 0x03, 0x7a, 0xf6, 0xa2, -+ 0xa8, 0xb6, 0xc0, 0xd0, 0x98, 0x94, 0x7a, 0x81, 0x02, 0xc1, 0xce, 0x0b, 0xed, 0x6e, 0xf1, -+ 0x5d, 0xb7, 0xb3, 0x9c, 0xa9, 0x88, 0x52, 0xf9, 0xf9, 0xcf, 0xfd, 0x74, 0x6a, 0xa3, 0x3b, -+ 0x0c, 0xa0, 0x32, 0xd2, 0xb6, 0x31, 0x8b, 0x93, 0x3b, 0x8a, 0x04, 0x2e, 0xdd, 0x14, 0x60, -+ 0x35, 0xa0, 0xd4, 0xca, 0xdc, 0x9e, 0x96, 0x23, 0xac, 0x64, 0xd5, 0x29, 0xb2, 0x0d, 0x46, -+ 0x01, 0xe6, 0xf7, 0xa0, 0xe0, 0x9c, 0xfb, 0xde, 0x21, 0xff, 0xff, 0x4f, 0xc0, 0x04, 0x3e, -+ 0xc4, 0x4b, 0xaf, 0x20, 0x1c, 0x41, 0xce, 0x07, 0x3c, 0x79, 0xfc, 0x6d, 0x7c, 0xef, 0x1e, -+ 0x37, 0x14, 0x78, 0x9d, 0x26, 0x85, 0x2a, 0xcc, 0x72, 0x22, 0x83, 0xb3, 0x2f -+}; -+ -+static unsigned char rsa_n_2048[] = { -+ 0x03, 0xB5, 0x34, 0x8B, 0x3C, 0xFA, 0x14, 0xD1, 0x38, 0x44, 0xC0, 0xB5, 0xEE, 0x6F, 0xA6, 0x8B, -+ 0x46, 0x4A, 0x46, 0x77, 0x7F, 0x49, 0x4F, 0x0A, 0x00, 0x5D, 0xED, 0x36, 0xE2, 0x22, 0x0B, 0xC6, -+ 0x6C, 0xD6, 0x25, 0x15, 0xA2, 0x51, 0xA1, 0xC8, 0xB7, 0x22, 0xD8, 0xAD, 0xB7, 0xF8, 0x59, 0xA9, -+ 0x69, 0x32, 0xF0, 0xA4, 0xC6, 0x17, 0x40, 0xAA, 0x74, 0x4D, 0x98, 0x2F, 0x71, 0xC0, 0x18, 0xDD, -+ 0x3D, 0xE9, 0x0F, 0x7A, 0x1A, 0x7F, 0xFF, 0xF8, 0x5B, 0x63, 0x13, 0xF8, 0xFE, 0x4B, 0xF8, 0x9F, -+ 0xA5, 0xFC, 0x6D, 0x60, 0x49, 0x5A, 0xC2, 0xBD, 0x07, 0x6C, 0x32, 0xE7, 0x24, 0xF9, 0x46, 0x03, -+ 0xAB, 0x54, 0x30, 0x3B, 0x29, 0x91, 0x0F, 0x1C, 0x77, 0x3A, 0x00, 0xF4, 0xE3, 0xCF, 0xD8, 0x35, -+ 0x3E, 0x0F, 0xD0, 0xD8, 0xF4, 0x50, 0x6E, 0x88, 0x6A, 0x4F, 0xD0, 0xA8, 0x40, 0x5A, 0x2F, 0x3C, -+ 0x11, 0x4F, 0x43, 0xB0, 0x43, 0x23, 0x20, 0x36, 0xB7, 0xB2, 0x16, 0xED, 0xBC, 0xB5, 0xC8, 0xDE, -+ 0x7E, 0x4A, 0x03, 0x7A, 0xF6, 0xA2, 0xA8, 0xB6, 0xC0, 0xD0, 0x98, 0x94, 0x7A, 0x81, 0x02, 0xC1, -+ 0xCE, 0x0B, 0xED, 0x6E, 0xF1, 0x5D, 0xB7, 0xB3, 0x9C, 0xA9, 0x88, 0x52, 0xF9, 0xF9, 0xCF, 0xFD, -+ 0x74, 0x6A, 0xA3, 0x3B, 0x0C, 0xA0, 0x32, 0xD2, 0xB6, 0x31, 0x8B, 0x93, 0x3B, 0x8A, 0x04, 0x2E, -+ 0xDD, 0x14, 0x60, 0x35, 0xA0, 0xD4, 0xCA, 0xDC, 0x9E, 0x96, 0x23, 0xAC, 0x64, 0xD5, 0x29, 0xB2, -+ 0x0D, 0x46, 0x01, 0xE6, 0xF7, 0xA0, 0xE0, 0x9C, 0xFB, 0xDE, 0x21, 0xFF, 0xFF, 0x4F, 0xC0, 0x04, -+ 0x3E, 0xC4, 0x4B, 0xAF, 0x20, 0x1C, 0x41, 0xCE, 0x07, 0x3C, 0x79, 0xFC, 0x6D, 0x7C, 0xEF, 0x1E, -+ 0x37, 0x14, 0x78, 0x9D, 0x26, 0x85, 0x2A, 0xCC, 0x72, 0x22, 0x83, 0xB3, 0x2F -+}; -+ -+static unsigned char rsa_e_3072[] = { -+ 0x01, 0x00, 0x01 -+}; -+ -+static unsigned char rsa_p_3072[] = { -+ 0xfe, 0x2d, 0x13, 0xf6, 0x82, 0xbd, 0xc9, 0x3f, 0xf2, 0x44, 0x87, 0xb0, 0x9c, 0xda, 0xca, 0xb5, -+ 0xfa, 0x01, 0x6f, 0xf0, 0x3d, 0xd0, 0xd2, 0x1c, 0x40, 0xef, 0xc6, 0x69, 0xe0, 0xe9, 0x66, 0x06, -+ 0x29, 0x00, 0x7e, 0xe6, 0x0b, 0x1a, 0x02, 0x50, 0x5e, 0x0e, 0x19, 0x5f, 0x6a, 0xf3, 0x0c, 0xa5, -+ 0x3f, 0xe9, 0xc4, 0x5d, 0x36, 0xc5, 0xbe, 0xc7, 0x77, 0xfc, 0x15, 0x05, 0xb3, 0xa4, 0xc7, 0xd1, -+ 0xab, 0x3f, 0xfc, 0x42, 0xc3, 0x9a, 0x0e, 0x5a, 0xd8, 0x51, 0xeb, 0x36, 0x2c, 0xf2, 0x07, 0xe3, -+ 0x5c, 0xcb, 0xe1, 0xf3, 0xd7, 0x67, 0x42, 0x2f, 0x3a, 0x31, 0x21, 0x0f, 0x4e, 0x4d, 0x03, 0x30, -+ 0xaf, 0xd9, 0x05, 0x03, 0x64, 0x79, 0x7d, 0x7b, 0x96, 0x48, 0xe5, 0x6f, 0x84, 0x44, 0x03, 0x36, -+ 0x08, 0xf6, 0xe8, 0xb4, 0xa8, 0x7d, 0xb4, 0x63, 0x73, 0x6f, 0x2b, 0x14, 0xb0, 0x6e, 0x0c, 0x96, -+ 0x3d, 0xe2, 0xda, 0x7f, 0x4f, 0x07, 0xc3, 0xb0, 0x89, 0x53, 0x9d, 0x14, 0x61, 0x17, 0xe6, 0xa4, -+ 0x52, 0x1a, 0xfb, 0xd4, 0xdd, 0xe0, 0x54, 0x2a, 0xf2, 0x86, 0x30, 0x8c, 0x1c, 0x68, 0x30, 0x72, -+ 0xcc, 0xa0, 0x3f, 0xe0, 0x14, 0x3d, 0xfc, 0xf2, 0xd9, 0x91, 0xea, 0xe8, 0xe8, 0x9a, 0x78, 0xfb, -+ 0xa8, 0x16, 0x50, 0x24, 0xfe, 0x54, 0xd4, 0x57, 0xf1, 0xd9, 0x8f, 0xcb, 0x6d, 0x38, 0x63, 0x21 -+}; -+ -+static unsigned char rsa_q_3072[] = { -+ 0xd4, 0x12, 0x12, 0xd1, 0x4e, 0x9e, 0xa8, 0xb4, 0xf3, 0x94, 0x4d, 0x03, 0x70, 0x83, 0x4f, 0x1c, -+ 0x16, 0x85, 0xd8, 0xa8, 0x8d, 0xcc, 0xfe, 0xde, 0x5d, 0x08, 0xc3, 0xdf, 0xc4, 0xd8, 0xf9, 0x60, -+ 0x50, 0x9a, 0x58, 0xd5, 0xf5, 0x96, 0xec, 0x95, 0x09, 0x7b, 0x5f, 0x96, 0xaf, 0xf5, 0xee, 0x79, -+ 0x46, 0x8b, 0x38, 0x2c, 0x9b, 0x17, 0x69, 0x07, 0x91, 0x74, 0x57, 0x73, 0x99, 0xd9, 0x89, 0xa4, -+ 0x20, 0x0b, 0xb5, 0x7f, 0x30, 0xd7, 0x13, 0xda, 0x0d, 0xc0, 0x3a, 0x96, 0x76, 0xf7, 0xac, 0x86, -+ 0x5e, 0x1f, 0x5d, 0xd4, 0x54, 0xa0, 0x30, 0xca, 0x36, 0x00, 0x7c, 0xc1, 0xd8, 0x05, 0x73, 0xde, -+ 0x75, 0x6c, 0xd0, 0x69, 0xe5, 0xfa, 0xd8, 0x24, 0xca, 0xb0, 0xee, 0x8a, 0x63, 0x83, 0x1b, 0x90, -+ 0xb8, 0x0d, 0x6d, 0xd5, 0x75, 0xe4, 0x5c, 0x73, 0xc7, 0xff, 0xe4, 0x57, 0x6a, 0x59, 0xc3, 0x17, -+ 0x05, 0xc4, 0xc4, 0x87, 0xc2, 0x11, 0x7a, 0x34, 0xbd, 0xb4, 0x7c, 0x7f, 0x3a, 0x60, 0xd7, 0x57, -+ 0xcb, 0x48, 0xb1, 0x14, 0xa6, 0x4f, 0x57, 0x35, 0xc7, 0x64, 0xf9, 0xb8, 0x11, 0xe8, 0x22, 0xfd, -+ 0x6c, 0x53, 0xdd, 0xef, 0x6a, 0x88, 0x56, 0xf7, 0x6d, 0x51, 0xa1, 0x5b, 0x26, 0x81, 0xa0, 0xd4, -+ 0x78, 0x10, 0x9f, 0x2d, 0x88, 0xdc, 0xa1, 0x09, 0xd0, 0x84, 0x7a, 0x3b, 0x38, 0x7c, 0x5f, 0x75 -+}; -+ -+static unsigned char rsa_dp_3072[] = { -+ 0xfd, 0x8d, 0x3a, 0x3c, 0xce, 0x6f, 0x44, 0x32, 0xe6, 0x1a, 0x36, 0xc1, 0x97, 0xb7, 0x2a, 0x40, -+ 0x1e, 0x05, 0x11, 0x05, 0x36, 0xa4, 0xf8, 0xf3, 0xf6, 0x53, 0x3a, 0x3a, 0xa4, 0x82, 0x2f, 0xa4, -+ 0x35, 0x82, 0xa9, 0x14, 0x12, 0x3e, 0xff, 0xcf, 0xec, 0x03, 0x64, 0x8c, 0x2a, 0xc4, 0x09, 0xf9, -+ 0x4e, 0xa8, 0x83, 0x99, 0xf8, 0xe9, 0x8a, 0x46, 0xb1, 0x0a, 0x66, 0x6e, 0x29, 0xa6, 0x57, 0x2e, -+ 0x71, 0x06, 0x83, 0x3e, 0x96, 0xa1, 0x37, 0x70, 0xa8, 0x1a, 0x0f, 0xe9, 0x1b, 0x2c, 0xd5, 0x71, -+ 0x99, 0x40, 0x49, 0x46, 0x55, 0xba, 0x4b, 0xeb, 0x90, 0xc1, 0x31, 0x99, 0x73, 0x22, 0x9f, 0xec, -+ 0x11, 0x7f, 0x0b, 0xe1, 0x36, 0x79, 0x7b, 0x13, 0xad, 0xf7, 0x49, 0xe8, 0xd4, 0xa8, 0x84, 0x0b, -+ 0x83, 0x25, 0xcb, 0x3d, 0x6c, 0x56, 0xf9, 0x7b, 0xbb, 0xcb, 0x49, 0xce, 0x79, 0xb1, 0x4e, 0x1d, -+ 0x11, 0xdf, 0x1a, 0xd7, 0xa4, 0x9e, 0xba, 0x37, 0x80, 0xc6, 0x48, 0x0b, 0xec, 0x4f, 0x4b, 0x64, -+ 0xe0, 0x02, 0xca, 0xf4, 0xad, 0xe0, 0xfa, 0x15, 0x5d, 0x99, 0x3f, 0x14, 0x85, 0xc1, 0xe9, 0x92, -+ 0x9b, 0x4d, 0xc0, 0x6a, 0x67, 0xc6, 0xee, 0x6d, 0xd3, 0x5c, 0x1c, 0x59, 0xfa, 0xaf, 0x1d, 0xc0, -+ 0xed, 0x0c, 0x55, 0x26, 0x92, 0x0f, 0x4d, 0x43, 0xed, 0x9e, 0x7a, 0x33, 0x13, 0xe1, 0x0c, 0x01 -+}; -+ -+static unsigned char rsa_dq_3072[] = { -+ 0x51, 0xfc, 0xde, 0xcb, 0x8e, 0xe2, 0xa6, 0x04, 0xb7, 0x3a, 0xf9, 0x7f, 0x3f, 0xeb, 0x74, 0x15, -+ 0x3e, 0xdb, 0xe6, 0x44, 0x5b, 0xf6, 0x09, 0xfe, 0xfb, 0xe6, 0xdc, 0x9b, 0x51, 0x66, 0x35, 0x1b, -+ 0x38, 0x6e, 0x43, 0xb4, 0x0c, 0x6b, 0x99, 0xf1, 0x90, 0xa5, 0xe2, 0xf1, 0xc5, 0xfb, 0x85, 0x83, -+ 0xdb, 0x73, 0x0d, 0x77, 0xa9, 0x4a, 0x26, 0xaf, 0xe7, 0x5b, 0x1c, 0x48, 0x34, 0x0d, 0xb7, 0x39, -+ 0xfd, 0xad, 0xa9, 0x30, 0x90, 0x38, 0x46, 0x93, 0x81, 0xc7, 0x74, 0x9f, 0x21, 0x45, 0x65, 0xac, -+ 0xd9, 0x0c, 0xb5, 0x60, 0xd6, 0x8a, 0xcb, 0xf2, 0x11, 0x68, 0xa4, 0xd2, 0xe8, 0x6a, 0x4b, 0x3e, -+ 0x91, 0x15, 0x4d, 0x89, 0xf3, 0x80, 0xc4, 0x39, 0x8d, 0x27, 0x54, 0x41, 0xaa, 0x71, 0x50, 0xa1, -+ 0xe5, 0x96, 0x43, 0x85, 0x48, 0x3b, 0xce, 0x46, 0x70, 0xe7, 0x0c, 0x67, 0x83, 0x55, 0x4a, 0xa8, -+ 0x46, 0xf1, 0xa8, 0xad, 0x77, 0xa8, 0xfc, 0x1f, 0x11, 0xcc, 0x8a, 0x69, 0x41, 0xaf, 0x98, 0xf1, -+ 0x77, 0x45, 0x16, 0x39, 0x0e, 0x87, 0x14, 0x07, 0x55, 0x9c, 0x43, 0x33, 0x17, 0xb1, 0x30, 0x7d, -+ 0xdb, 0x78, 0x9d, 0x0f, 0xe7, 0x96, 0xe8, 0x50, 0x66, 0x32, 0x2d, 0xf8, 0xa8, 0x6d, 0x6b, 0x39, -+ 0x59, 0x65, 0xcb, 0xb4, 0x75, 0xfa, 0x1e, 0x44, 0x46, 0x1a, 0x41, 0x8b, 0x4d, 0xae, 0x3f, 0xd5 -+}; -+ -+static unsigned char rsa_qinv_3072[] = { -+ 0xb2, 0xa1, 0x52, 0x54, 0xee, 0xcd, 0xb9, 0x07, 0xde, 0x26, 0x8a, 0x1b, 0x93, 0x91, 0xf7, 0x08, -+ 0xbe, 0x81, 0x23, 0x0c, 0xba, 0x24, 0x7a, 0x66, 0x57, 0x41, 0x09, 0xc6, 0x3a, 0x25, 0xa8, 0x56, -+ 0x03, 0x34, 0xcd, 0xcb, 0x97, 0xe8, 0x48, 0xdf, 0x64, 0xc8, 0xd3, 0xe2, 0xfd, 0xaa, 0xcb, 0xdc, -+ 0x9c, 0xfc, 0xab, 0x0d, 0x00, 0x57, 0x06, 0xb3, 0x71, 0x53, 0xe9, 0x2d, 0x7c, 0xcc, 0x68, 0xca, -+ 0x24, 0x94, 0x11, 0x48, 0x21, 0xb0, 0x55, 0xcb, 0xa9, 0x2b, 0x09, 0x99, 0x90, 0x9a, 0xaa, 0xea, -+ 0xa3, 0xbd, 0x4d, 0xf3, 0xba, 0x67, 0x55, 0x3c, 0x5c, 0xbf, 0xfa, 0x23, 0xbf, 0xfc, 0xcd, 0x7e, -+ 0x99, 0x60, 0xf1, 0x71, 0x78, 0x03, 0x15, 0xbb, 0xda, 0x54, 0xd9, 0x3d, 0x0d, 0x19, 0xad, 0xbf, -+ 0x3e, 0x35, 0xa9, 0x5d, 0xf7, 0xb1, 0x88, 0x78, 0x96, 0x59, 0xda, 0x0b, 0x54, 0xd9, 0x8a, 0x64, -+ 0x89, 0xf8, 0xea, 0x27, 0x78, 0x73, 0x58, 0x40, 0x1f, 0xec, 0xa3, 0xdd, 0xe3, 0xdb, 0x88, 0xdb, -+ 0x3f, 0x00, 0xc1, 0xdb, 0x95, 0x24, 0x7d, 0x55, 0x2f, 0xe1, 0xa1, 0xa5, 0x70, 0x13, 0xd5, 0xc7, -+ 0x26, 0x41, 0x9f, 0x79, 0xc7, 0x5b, 0x30, 0x58, 0x65, 0x16, 0xa0, 0x0d, 0xac, 0x1d, 0xc8, 0x8d, -+ 0xe1, 0xce, 0xc2, 0x61, 0x0f, 0xb0, 0x02, 0xc9, 0x80, 0x1e, 0xbd, 0x25, 0x83, 0xbc, 0x9d, 0xdc -+}; -+ -+static unsigned char rsa_d_3072[] = { -+ 0x33, 0x49, 0x58, 0xb0, 0x89, 0x3d, 0x96, 0x78, 0xb7, 0x2a, 0x99, 0x5e, 0x0c, 0x56, 0xae, 0x08, -+ 0x32, 0xe1, 0xb9, 0x1c, 0x17, 0xd7, 0x71, 0xaa, 0x57, 0x37, 0x58, 0xbf, 0x94, 0xf8, 0xa0, 0xdf, -+ 0xdb, 0x0a, 0xfd, 0x2f, 0xce, 0x8a, 0x82, 0x43, 0x11, 0x48, 0x6b, 0xec, 0x61, 0x72, 0x77, 0x98, -+ 0x53, 0x00, 0x32, 0x5e, 0xbe, 0x3d, 0x37, 0xaf, 0x53, 0x55, 0x13, 0xc7, 0x61, 0x03, 0x6a, 0x28, -+ 0xc8, 0xe6, 0xa8, 0xac, 0x5f, 0xcf, 0x15, 0x54, 0x36, 0xc4, 0x74, 0x60, 0x3b, 0xcc, 0xbc, 0x4f, -+ 0x05, 0x27, 0x0d, 0x9e, 0x3c, 0x0c, 0x74, 0x1d, 0x59, 0xb7, 0x28, 0x05, 0x94, 0x2d, 0x0d, 0x02, -+ 0x60, 0xaa, 0x82, 0x14, 0x29, 0xf9, 0x38, 0x6a, 0xcb, 0x3a, 0xc4, 0x14, 0x70, 0xa4, 0x6b, 0x34, -+ 0xb6, 0xad, 0x11, 0xca, 0x4b, 0x76, 0x59, 0xd7, 0x29, 0xf1, 0x2e, 0xef, 0xf9, 0xa9, 0xf4, 0xd5, -+ 0x50, 0x13, 0x60, 0xc9, 0xac, 0x96, 0x14, 0x23, 0xdd, 0x3a, 0x2d, 0x9a, 0x9f, 0x58, 0xa8, 0xcb, -+ 0x70, 0xe4, 0x19, 0x45, 0x5c, 0xec, 0x7c, 0x64, 0xab, 0x76, 0x63, 0x07, 0xe0, 0x98, 0x5a, 0xbc, -+ 0x91, 0xc0, 0xbc, 0x84, 0xd5, 0x06, 0xef, 0xc4, 0xa2, 0xe0, 0x8f, 0x5a, 0xc9, 0x0e, 0x74, 0x3a, -+ 0x64, 0x80, 0x72, 0x8f, 0x62, 0xe4, 0x23, 0xe2, 0x7c, 0x79, 0x60, 0x49, 0xd6, 0x24, 0xca, 0x3d, -+ 0x8f, 0xb5, 0xbf, 0xee, 0x31, 0x25, 0x7b, 0xf8, 0x36, 0xe3, 0x47, 0x4a, 0xc6, 0xd8, 0x6e, 0xfe, -+ 0x05, 0xf0, 0x42, 0x4b, 0x90, 0x59, 0xf4, 0x45, 0xb7, 0x89, 0xed, 0x20, 0x9e, 0x60, 0x36, 0xaf, -+ 0xd3, 0x07, 0x2f, 0x5a, 0x47, 0xdc, 0x00, 0xb7, 0x01, 0xc7, 0x5d, 0xa0, 0x1f, 0x03, 0x08, 0x57, -+ 0x2e, 0x1e, 0x95, 0x61, 0xf7, 0x6c, 0x62, 0x7a, 0x07, 0x6b, 0x27, 0x81, 0xb9, 0xe6, 0x49, 0x9d, -+ 0x15, 0x6d, 0x19, 0xba, 0xd3, 0x11, 0xd5, 0x2b, 0xd1, 0x24, 0x1e, 0x16, 0xd0, 0x78, 0xdc, 0xda, -+ 0x55, 0x4a, 0x8a, 0x46, 0x04, 0xda, 0x7a, 0xb2, 0xda, 0xe4, 0xc0, 0xc7, 0xb7, 0x2b, 0xd6, 0x22, -+ 0x5a, 0xe3, 0xf7, 0xe1, 0xa4, 0xed, 0x6a, 0xb5, 0xb4, 0x3c, 0x25, 0x1e, 0x41, 0x0f, 0xb1, 0x26, -+ 0x88, 0xfc, 0x10, 0x25, 0x52, 0x2d, 0x95, 0xac, 0xf8, 0x81, 0x29, 0xe0, 0x90, 0xc0, 0x10, 0xdf, -+ 0x83, 0xbd, 0xee, 0x9c, 0xb6, 0x79, 0x9c, 0xd2, 0x6f, 0x4a, 0xd9, 0x15, 0xd1, 0xdb, 0x23, 0x38, -+ 0x1e, 0xf5, 0x69, 0x81, 0xc3, 0xe4, 0x02, 0xa2, 0x1f, 0xe8, 0xa2, 0x95, 0xbe, 0x3e, 0x40, 0x3b, -+ 0xda, 0xa1, 0x96, 0x7d, 0x51, 0xae, 0x06, 0x84, 0x02, 0xe1, 0x99, 0xcb, 0x9e, 0xf0, 0xe8, 0x7d, -+ 0x9c, 0xa3, 0x00, 0xd0, 0x1d, 0xe1, 0x52, 0xc4, 0x71, 0x12, 0x5c, 0x53, 0xd6, 0x88, 0xfb, 0x81 -+}; -+ -+static unsigned char rsa_n_3072[] = { -+ 0xd2, 0x8f, 0x46, 0x62, 0x87, 0xde, 0x40, 0xdb, 0xdc, 0xd5, 0xf1, 0x7b, 0x14, 0x75, 0x7e, 0x5e, -+ 0xcb, 0x38, 0x7f, 0x9e, 0xc4, 0x30, 0xb6, 0x77, 0x6d, 0x20, 0x9a, 0x52, 0xe0, 0x0a, 0x9d, 0x34, -+ 0x09, 0xfd, 0x15, 0xbe, 0x36, 0x25, 0x71, 0x85, 0x0d, 0x6a, 0x33, 0x6d, 0x81, 0xd5, 0x74, 0x4c, -+ 0x2f, 0x8a, 0xd2, 0xad, 0xa0, 0x94, 0x26, 0x3d, 0xba, 0x1d, 0xe9, 0x33, 0xdc, 0x50, 0x6d, 0xc2, -+ 0xd1, 0xc9, 0xc9, 0xae, 0xd3, 0xf8, 0x31, 0x30, 0xc5, 0x33, 0xe5, 0xf7, 0x80, 0xcf, 0x33, 0x6d, -+ 0x50, 0xf0, 0xba, 0xa0, 0xd0, 0x86, 0x75, 0x21, 0xb9, 0x28, 0x02, 0x20, 0xf1, 0x7f, 0x1c, 0xe7, -+ 0xdb, 0xe6, 0x10, 0x5e, 0x5c, 0xf0, 0xea, 0x55, 0x89, 0x41, 0x1d, 0x93, 0x60, 0x59, 0x3a, 0x58, -+ 0x54, 0x93, 0x7c, 0x09, 0x62, 0xc0, 0x2d, 0x60, 0x8e, 0x49, 0x5e, 0x23, 0xe6, 0x90, 0x67, 0xe8, -+ 0x99, 0xb5, 0xe3, 0xf3, 0xb4, 0x9f, 0x29, 0xe7, 0x6b, 0xc9, 0x32, 0xd5, 0x98, 0xde, 0xb9, 0xad, -+ 0xd2, 0x28, 0x9b, 0xc6, 0x8e, 0xeb, 0x8a, 0xb0, 0xf3, 0x6d, 0x86, 0x71, 0x70, 0xba, 0x77, 0xf0, -+ 0xad, 0x28, 0x46, 0x02, 0xd0, 0xb3, 0xf2, 0xe8, 0x29, 0xc7, 0x9e, 0x08, 0xf4, 0x8d, 0xa8, 0xff, -+ 0x10, 0xc5, 0xb0, 0xad, 0x8b, 0x67, 0x1d, 0x67, 0xf1, 0x2d, 0xf5, 0x5e, 0xee, 0x31, 0x5e, 0x4b, -+ 0x76, 0x78, 0xaf, 0xd1, 0x06, 0x3a, 0xed, 0xf3, 0x57, 0x07, 0x53, 0x44, 0xd6, 0x54, 0xe8, 0xb4, -+ 0xcf, 0xd2, 0xc6, 0x1d, 0xc4, 0xeb, 0xd8, 0xc4, 0x89, 0x78, 0x41, 0x12, 0x33, 0x06, 0xfa, 0xf5, -+ 0xec, 0x13, 0xe5, 0x90, 0xd9, 0xad, 0x6e, 0x26, 0x89, 0xf9, 0x7f, 0x7f, 0x0a, 0x3b, 0xe5, 0xf8, -+ 0x40, 0x88, 0x10, 0x08, 0x40, 0xc8, 0x31, 0x84, 0x8f, 0x18, 0x5c, 0xe6, 0x60, 0xa0, 0x3a, 0x94, -+ 0xc7, 0x45, 0xf8, 0xbc, 0x90, 0x2c, 0x2d, 0x92, 0x41, 0x6e, 0xe0, 0xb5, 0xe4, 0x85, 0x69, 0xfc, -+ 0xef, 0xd6, 0xdb, 0xe9, 0x73, 0x73, 0x42, 0x5f, 0x0f, 0x08, 0xec, 0xd6, 0xd7, 0x92, 0xa6, 0x7f, -+ 0xfb, 0xa1, 0x31, 0x7d, 0x57, 0x44, 0xdf, 0xfa, 0xf8, 0xaf, 0x2e, 0x5a, 0x00, 0xa2, 0x6a, 0x2b, -+ 0x9d, 0x05, 0xf5, 0xba, 0xd4, 0x19, 0x07, 0xd2, 0x1e, 0x85, 0x67, 0xf1, 0x51, 0x96, 0xe0, 0x44, -+ 0xba, 0x76, 0xf4, 0x4e, 0xa0, 0x2b, 0xb0, 0x6e, 0xe8, 0xd9, 0xb1, 0xd3, 0xcd, 0x85, 0xd0, 0x45, -+ 0x70, 0x70, 0x1c, 0x94, 0xcc, 0x7e, 0x6b, 0x81, 0x19, 0x07, 0xdd, 0x05, 0x91, 0xc2, 0x78, 0x32, -+ 0x72, 0x09, 0x62, 0x30, 0xf0, 0x73, 0x7b, 0xbc, 0x5e, 0x7d, 0x3d, 0xfe, 0x0d, 0x8b, 0xef, 0x31, -+ 0xdb, 0x8e, 0x28, 0x20, 0xae, 0x0e, 0xe0, 0x7d, 0x63, 0x79, 0x05, 0x1b, 0x13, 0x8a, 0x8d, 0x15 -+}; -+ -+static unsigned char rsa_e_4096[] = { -+ 0x01, 0x00, 0x01 -+}; -+ -+static unsigned char rsa_p_4096[] = { -+ 0xff, 0x0f, 0x4f, 0x6c, 0xdd, 0x59, 0xd8, 0x48, 0x87, 0xc3, 0x24, 0x04, 0x87, 0x63, 0xbe, 0xcd, -+ 0xa6, 0x51, 0xb6, 0xb8, 0xda, 0x31, 0x8f, 0xb0, 0xf7, 0x29, 0x08, 0x28, 0x60, 0xb0, 0xb1, 0x52, -+ 0xe4, 0x73, 0xf1, 0xdb, 0x10, 0xe3, 0xbc, 0xfc, 0x2d, 0x88, 0x43, 0xab, 0x2a, 0x2e, 0x41, 0x80, -+ 0x0f, 0x25, 0x62, 0x53, 0x8f, 0x09, 0x82, 0xd1, 0xe4, 0x12, 0xe3, 0x9f, 0xae, 0xe9, 0x5b, 0xe4, -+ 0x89, 0x97, 0xf7, 0x40, 0x0c, 0x78, 0x86, 0xd1, 0x23, 0xe7, 0xd3, 0x45, 0xc9, 0x15, 0xf8, 0xbf, -+ 0xe9, 0x3d, 0x44, 0x57, 0x21, 0x61, 0x62, 0xe1, 0xad, 0x9d, 0x28, 0x5c, 0x99, 0xfc, 0xec, 0xe1, -+ 0xcb, 0x93, 0x70, 0x28, 0x8d, 0xc2, 0x97, 0xc4, 0xc4, 0xaa, 0xb1, 0xe3, 0xb6, 0x61, 0x84, 0x0c, -+ 0x03, 0xc9, 0xf7, 0x96, 0xdf, 0x04, 0xdc, 0x15, 0x94, 0x35, 0x60, 0xfa, 0xe7, 0xc4, 0xc1, 0xc7, -+ 0x80, 0xfb, 0xa6, 0xa6, 0x3e, 0x00, 0x42, 0x4a, 0x51, 0x91, 0xd3, 0x32, 0xee, 0x60, 0x2a, 0xda, -+ 0x13, 0xa9, 0x5b, 0xf8, 0x8a, 0xcd, 0x4a, 0x80, 0x23, 0x3a, 0x77, 0xf7, 0x10, 0xdf, 0x4e, 0x13, -+ 0x6e, 0xb6, 0x24, 0xe5, 0xd6, 0x97, 0x0d, 0x6e, 0xe8, 0xb3, 0xfd, 0x8a, 0x3b, 0xdb, 0x66, 0x8b, -+ 0x8a, 0x49, 0x56, 0xfa, 0xff, 0x16, 0xb6, 0x6c, 0xea, 0xc1, 0xed, 0xbe, 0x54, 0x3c, 0x5f, 0x28, -+ 0x4a, 0x62, 0x15, 0x9c, 0x71, 0xc0, 0xce, 0xa5, 0x59, 0x0f, 0x53, 0xf3, 0xa1, 0xf5, 0x38, 0x04, -+ 0x90, 0xa8, 0x88, 0x6d, 0x90, 0xf4, 0x61, 0xdf, 0xb2, 0xd1, 0x8f, 0x8e, 0x48, 0x68, 0x19, 0xd0, -+ 0xd8, 0x3b, 0x9f, 0xbe, 0xbe, 0x56, 0x12, 0xf9, 0x6e, 0x1a, 0x6d, 0xbc, 0xac, 0xa5, 0xc3, 0xb6, -+ 0x53, 0x1e, 0xed, 0x57, 0xfd, 0x53, 0xe9, 0x9d, 0xf7, 0xe3, 0xac, 0xe6, 0xe8, 0x87, 0xc5, 0xa7 -+}; -+ -+static unsigned char rsa_q_4096[] = { -+ 0xe8, 0x98, 0x10, 0x31, 0x2a, 0xde, 0xbf, 0xa0, 0xec, 0xbf, 0x77, 0xfd, 0x5d, 0x8e, 0x0e, 0xf7, -+ 0xa2, 0x81, 0xc9, 0xc1, 0x98, 0xde, 0x5c, 0x22, 0x8b, 0x7d, 0x9f, 0xf3, 0x7a, 0x41, 0xc9, 0x2b, -+ 0xa7, 0xbc, 0x7f, 0xcf, 0x41, 0x6d, 0xf8, 0x88, 0xbd, 0x90, 0x17, 0x9e, 0xc9, 0xdc, 0x79, 0x85, -+ 0x20, 0x97, 0x87, 0x06, 0xf4, 0x39, 0xf6, 0x6e, 0x47, 0x0a, 0x74, 0xe0, 0x83, 0x74, 0x7c, 0xc8, -+ 0x62, 0xe9, 0x64, 0x1c, 0xde, 0x8a, 0x2f, 0x58, 0x1d, 0xe7, 0x11, 0xb1, 0xb0, 0xf1, 0x78, 0x58, -+ 0x4f, 0xa1, 0x17, 0x97, 0xfc, 0x81, 0x2c, 0x11, 0x53, 0x3d, 0x43, 0x32, 0xb7, 0xd9, 0xb9, 0x4e, -+ 0x5b, 0x2b, 0xa8, 0x02, 0x03, 0x4c, 0x18, 0xd9, 0x8c, 0xa0, 0x2e, 0x5f, 0x22, 0xbe, 0x2e, 0x4a, -+ 0x9e, 0x29, 0xf6, 0x38, 0x54, 0x53, 0x14, 0xdf, 0x1b, 0x06, 0xec, 0x6c, 0x27, 0x2b, 0x8c, 0x55, -+ 0x22, 0x47, 0xcd, 0x90, 0xf5, 0xe1, 0x6f, 0xfc, 0x63, 0xa3, 0xa2, 0xc3, 0xe7, 0x22, 0xa7, 0x9a, -+ 0x96, 0x7f, 0xec, 0x24, 0xdd, 0xc5, 0xc0, 0x75, 0xe0, 0x31, 0x87, 0xe6, 0xbb, 0x6d, 0x6b, 0x78, -+ 0x43, 0x8b, 0x8f, 0xc4, 0x1c, 0x5e, 0xd7, 0x22, 0x50, 0x66, 0x4a, 0x6a, 0x08, 0xbe, 0xaf, 0x06, -+ 0xfd, 0x41, 0xbf, 0xc8, 0xab, 0x54, 0xa0, 0x0f, 0x5b, 0x16, 0x8a, 0xc8, 0x91, 0x65, 0x3e, 0x2a, -+ 0xb7, 0xbb, 0x3d, 0xff, 0xe3, 0xc9, 0xb9, 0xcf, 0x64, 0x12, 0xc5, 0x7d, 0x3c, 0x5a, 0xbc, 0x53, -+ 0x00, 0xf0, 0xeb, 0x7d, 0x2b, 0x03, 0xec, 0xfd, 0x56, 0x8d, 0x1c, 0xed, 0x8e, 0xd4, 0x23, 0xfe, -+ 0xe7, 0x98, 0xd4, 0xe7, 0x58, 0xdb, 0xd9, 0x00, 0x6e, 0xbb, 0x91, 0xc3, 0x7d, 0x2c, 0x87, 0xa6, -+ 0xe3, 0x6d, 0x60, 0xec, 0x6b, 0xa9, 0x1e, 0x0b, 0xf7, 0x7b, 0xd8, 0xa8, 0xdf, 0x2a, 0x50, 0x6f -+}; -+ -+static unsigned char rsa_dp_4096[] = { -+ 0xec, 0x30, 0x31, 0x4c, 0x8e, 0x6d, 0x74, 0x6b, 0x35, 0xcc, 0xee, 0xbd, 0x82, 0xe2, 0x4a, 0xfe, -+ 0x04, 0xd6, 0x06, 0x6e, 0x87, 0x1e, 0xfe, 0x00, 0xd1, 0xdf, 0x9d, 0x3e, 0x46, 0xcb, 0x58, 0x69, -+ 0x7a, 0x44, 0x23, 0xe2, 0xc8, 0x71, 0x1b, 0xc0, 0x2a, 0x29, 0xd4, 0xff, 0xdb, 0xbf, 0x99, 0xc8, -+ 0x0c, 0x3e, 0x82, 0x1e, 0xfe, 0x85, 0xc0, 0x2e, 0xbd, 0x15, 0x00, 0xd4, 0x0e, 0x14, 0xea, 0x93, -+ 0x67, 0x16, 0xe2, 0x4e, 0xdd, 0x3d, 0x7f, 0x1a, 0x8c, 0x35, 0x50, 0xdf, 0x7e, 0xa6, 0x6a, 0x02, -+ 0xcc, 0xe9, 0x7f, 0x2f, 0x70, 0x29, 0xce, 0x77, 0x4d, 0x5e, 0x0a, 0xd2, 0x35, 0x86, 0x91, 0x95, -+ 0x45, 0xfe, 0xf2, 0x0d, 0x9b, 0xb8, 0x66, 0xf2, 0x3f, 0x6c, 0x11, 0xee, 0xdc, 0x24, 0xd1, 0x32, -+ 0x8f, 0x0f, 0xa7, 0xc6, 0x7e, 0x1e, 0xf1, 0xee, 0xc9, 0x9f, 0xe4, 0x7e, 0x73, 0xc1, 0x2f, 0xf0, -+ 0x9e, 0xf0, 0x6a, 0x11, 0xe7, 0xb8, 0x35, 0xaa, 0xbc, 0x7e, 0x5d, 0x24, 0xfc, 0xb8, 0xf0, 0xf5, -+ 0xa0, 0xdf, 0x63, 0xdb, 0x74, 0x2d, 0x46, 0xa0, 0x01, 0xff, 0x52, 0xb7, 0xe7, 0x57, 0xe1, 0xe4, -+ 0xfc, 0xd0, 0x8e, 0xba, 0x87, 0x4c, 0xb9, 0x93, 0xca, 0xc9, 0x62, 0x2f, 0x6f, 0xde, 0x6b, 0xc7, -+ 0x2b, 0xf7, 0x5e, 0x24, 0x6f, 0xb3, 0x88, 0x9a, 0xb3, 0x89, 0x81, 0xae, 0x8e, 0x32, 0x99, 0xab, -+ 0xa5, 0xb5, 0xce, 0x6d, 0x60, 0xa9, 0x3a, 0xb2, 0xc3, 0x15, 0xfe, 0x97, 0xcd, 0x92, 0x56, 0x9d, -+ 0x63, 0x97, 0xad, 0x3e, 0x48, 0xcd, 0x05, 0x15, 0x31, 0x71, 0xfd, 0x8d, 0xb4, 0x5f, 0x32, 0x08, -+ 0xc3, 0x33, 0xf3, 0x69, 0x9e, 0xb7, 0xf6, 0x3a, 0x24, 0x4b, 0x34, 0xf3, 0x52, 0xac, 0xed, 0xdf, -+ 0x18, 0x79, 0xbb, 0x2f, 0x8f, 0xd6, 0xf4, 0xae, 0xe3, 0xae, 0x61, 0x9e, 0x32, 0x16, 0x08, 0x61 -+}; -+ -+static unsigned char rsa_dq_4096[] = { -+ 0xb8, 0x1a, 0x74, 0xe6, 0x96, 0x0a, 0x4e, 0x1f, 0xf0, 0x84, 0xf5, 0x52, 0xe4, 0xd4, 0x66, 0xe0, -+ 0x78, 0x0e, 0xc7, 0x45, 0xa7, 0xdc, 0x89, 0x8d, 0x06, 0x60, 0x5f, 0x54, 0xf7, 0x36, 0x4f, 0x27, -+ 0x70, 0xd3, 0x71, 0x4e, 0xf9, 0x79, 0x34, 0x39, 0xf7, 0xe1, 0xaf, 0xf0, 0x8d, 0xd3, 0x27, 0x94, -+ 0xca, 0x61, 0x66, 0x0d, 0x89, 0x0e, 0xc0, 0x12, 0x35, 0xc4, 0xff, 0x12, 0x1e, 0xba, 0xfb, 0x72, -+ 0x19, 0x68, 0xa7, 0x47, 0x7a, 0x96, 0x62, 0x37, 0x1b, 0x24, 0x25, 0x0b, 0x43, 0x05, 0x3e, 0xbe, -+ 0x97, 0xf8, 0xe8, 0x95, 0xf2, 0xd5, 0xc3, 0xad, 0xca, 0xf7, 0x38, 0xd3, 0x52, 0x56, 0xd1, 0xa8, -+ 0x45, 0xdd, 0xde, 0x54, 0x09, 0x8c, 0x18, 0x37, 0x4a, 0x6a, 0x17, 0x8a, 0x52, 0x13, 0xba, 0xcc, -+ 0x71, 0x38, 0xc1, 0x9d, 0x80, 0x91, 0x6a, 0x79, 0xd6, 0x08, 0xba, 0xe6, 0x38, 0x72, 0xed, 0xd7, -+ 0x0d, 0x15, 0x4c, 0x8f, 0x2b, 0x30, 0x4f, 0xd5, 0xb4, 0x80, 0x77, 0x7b, 0x1c, 0xde, 0x7f, 0x4f, -+ 0x8b, 0x44, 0xa2, 0x03, 0xe4, 0x4e, 0x7c, 0xb2, 0x50, 0xcc, 0xa3, 0xc7, 0x6c, 0x1f, 0x85, 0xeb, -+ 0x61, 0x7b, 0x7c, 0x46, 0x3c, 0x36, 0x8d, 0x8e, 0xa9, 0x98, 0xed, 0xd9, 0xd4, 0x26, 0x2a, 0xa0, -+ 0x1b, 0xa2, 0x09, 0x4d, 0xaa, 0xdf, 0x86, 0xf9, 0xe0, 0x9d, 0x8d, 0x28, 0x88, 0x7d, 0x5c, 0xa1, -+ 0xaf, 0x60, 0x54, 0x08, 0xd1, 0xa2, 0x80, 0xa2, 0xb9, 0x91, 0x6a, 0x24, 0x60, 0xbb, 0x69, 0x49, -+ 0x41, 0xfb, 0x70, 0x4a, 0x58, 0xdb, 0xf8, 0x9f, 0xe5, 0xfc, 0x38, 0x23, 0x88, 0xe4, 0x3d, 0xc1, -+ 0xac, 0x4b, 0x7a, 0x69, 0xcc, 0x19, 0xe8, 0x3f, 0xc1, 0x66, 0x52, 0x50, 0x2c, 0x2a, 0x2d, 0x0d, -+ 0x5a, 0x02, 0xdf, 0xaf, 0x02, 0xe0, 0x8f, 0xd9, 0xe5, 0x00, 0x70, 0x53, 0xea, 0xa0, 0xb1, 0x9d -+}; -+ -+static unsigned char rsa_qinv_4096[] = { -+ 0x11, 0xc1, 0x35, 0xf3, 0xe0, 0x74, 0x80, 0x68, 0x32, 0xdd, 0x15, 0xdb, 0x92, 0x72, 0xad, 0xd8, -+ 0xfd, 0xfe, 0x78, 0xee, 0xfd, 0x8a, 0xaa, 0xd4, 0x47, 0x07, 0xc3, 0xcf, 0x35, 0xbd, 0x23, 0x3d, -+ 0x2b, 0x09, 0xed, 0xbe, 0xb6, 0x3d, 0xc1, 0xb7, 0x25, 0x79, 0x5e, 0x0c, 0x7c, 0x25, 0x2c, 0x8f, -+ 0x98, 0x34, 0x19, 0xc7, 0xdf, 0x74, 0x67, 0x6a, 0x2e, 0x3b, 0x99, 0x3d, 0x41, 0xee, 0x44, 0xe8, -+ 0xc5, 0x75, 0xc2, 0x05, 0xdc, 0x85, 0x04, 0x59, 0x45, 0x14, 0x70, 0xc2, 0x9c, 0xa8, 0xa9, 0x2b, -+ 0x04, 0x65, 0xe1, 0xba, 0x83, 0x5e, 0x03, 0x04, 0x78, 0xe4, 0x16, 0x2d, 0x14, 0xfa, 0x10, 0xeb, -+ 0xe4, 0x3e, 0x6d, 0x75, 0xb1, 0xe5, 0xc5, 0xe7, 0x98, 0x69, 0x9a, 0x1b, 0xab, 0x87, 0x05, 0x51, -+ 0x84, 0x73, 0x31, 0xd5, 0x61, 0x67, 0xdc, 0x70, 0xce, 0x12, 0xdc, 0x53, 0xa5, 0xe6, 0x12, 0xb2, -+ 0x85, 0x00, 0x14, 0x6f, 0x56, 0x5c, 0x35, 0xc7, 0xd0, 0xea, 0x51, 0xf7, 0xba, 0xe4, 0x6b, 0x13, -+ 0x0c, 0x4d, 0x3d, 0x82, 0xe0, 0x7b, 0xac, 0x4b, 0x7e, 0xfb, 0x95, 0x47, 0xa3, 0x90, 0x84, 0xdc, -+ 0x9b, 0xf1, 0x4a, 0x36, 0x85, 0x7a, 0x5e, 0x9e, 0x74, 0x59, 0x1c, 0x59, 0xaa, 0x7e, 0x30, 0x5b, -+ 0x0c, 0x03, 0x3a, 0xb3, 0x80, 0xc5, 0x0b, 0xf4, 0x04, 0x41, 0x21, 0x77, 0xdc, 0x89, 0x10, 0x09, -+ 0x32, 0xa2, 0xd3, 0xa8, 0xb2, 0x3f, 0x9e, 0xc8, 0x62, 0x68, 0x59, 0x83, 0x68, 0xf3, 0xe4, 0x1f, -+ 0x20, 0x64, 0x0e, 0x2c, 0x18, 0x5a, 0xd1, 0x16, 0x02, 0x1c, 0x73, 0x4e, 0xc4, 0x92, 0x79, 0x56, -+ 0x9f, 0x66, 0x7c, 0xa6, 0xf2, 0x5e, 0xb5, 0x04, 0xf6, 0xa2, 0xf6, 0x59, 0xe2, 0x8c, 0x85, 0x95, -+ 0x62, 0xd6, 0x20, 0x8d, 0x3d, 0x87, 0x88, 0xa1, 0xa2, 0xea, 0x68, 0xe1, 0x29, 0x99, 0xd3, 0x7e -+}; -+ -+static unsigned char rsa_d_4096[] = { -+ 0x15, 0x49, 0x6c, 0x18, 0x59, 0x19, 0x8d, 0x47, 0xa9, 0xf4, 0x83, 0xd9, 0x13, 0xa8, 0x60, 0xb7, -+ 0xcf, 0x53, 0x9d, 0xe1, 0xe8, 0xb2, 0x90, 0x3b, 0x2e, 0x9a, 0xd4, 0xed, 0x7f, 0xce, 0x16, 0x92, -+ 0xcb, 0xa4, 0x89, 0x38, 0xe8, 0x88, 0x1d, 0x7c, 0x7f, 0x8a, 0xdf, 0xa2, 0x7f, 0xf5, 0xcd, 0x18, -+ 0xd4, 0x51, 0xf7, 0x31, 0x8b, 0x54, 0x19, 0x0d, 0xfc, 0xfe, 0x87, 0x8b, 0x62, 0x94, 0x0c, 0xe2, -+ 0x50, 0x23, 0xbe, 0x22, 0xda, 0x5c, 0xbf, 0x00, 0xc7, 0xce, 0x0b, 0x1d, 0x0d, 0x9b, 0x74, 0x2e, -+ 0xad, 0xcd, 0x80, 0x2b, 0x69, 0x1b, 0x92, 0x86, 0xe9, 0x5b, 0x9e, 0x3a, 0xf2, 0x66, 0xd1, 0x64, -+ 0x93, 0xcb, 0x72, 0xb7, 0x86, 0x7b, 0x32, 0x4a, 0xeb, 0x52, 0x75, 0x51, 0xb4, 0x5f, 0xb0, 0x23, -+ 0x53, 0xc8, 0x40, 0x60, 0xc8, 0x2a, 0x40, 0x98, 0xb2, 0x27, 0x9c, 0xea, 0x21, 0xb0, 0x71, 0x53, -+ 0xf8, 0x64, 0x3b, 0xd9, 0x6e, 0xba, 0xca, 0xeb, 0x77, 0xdf, 0xc9, 0x65, 0xaa, 0xdb, 0xd9, 0x92, -+ 0xda, 0x76, 0x3d, 0xf6, 0x91, 0xbd, 0xe1, 0x52, 0x8c, 0x09, 0x0e, 0x2d, 0x42, 0xa7, 0x33, 0x57, -+ 0xf5, 0x4c, 0xe6, 0x78, 0xb4, 0x89, 0xfe, 0x1f, 0xcc, 0xab, 0x45, 0xb0, 0xae, 0xc0, 0x1f, 0x16, -+ 0xcb, 0x2f, 0x6d, 0xd1, 0x66, 0x36, 0x17, 0x72, 0xcd, 0x8e, 0xf8, 0x52, 0xf5, 0xb3, 0x88, 0xd9, -+ 0x18, 0xa5, 0x76, 0x07, 0x1c, 0x97, 0xb6, 0xbb, 0x56, 0xa9, 0xee, 0xab, 0x7e, 0xa1, 0x6a, 0x21, -+ 0x43, 0xb5, 0x68, 0xd7, 0x5a, 0xd4, 0x5c, 0xc8, 0xaa, 0xd9, 0x8f, 0xaf, 0xe9, 0x8d, 0x37, 0xac, -+ 0xde, 0x21, 0xfc, 0xdd, 0xed, 0x75, 0xcc, 0x35, 0x87, 0x11, 0x84, 0x6c, 0xfd, 0x67, 0xef, 0x18, -+ 0x55, 0xa0, 0x62, 0xa3, 0x13, 0x5e, 0x66, 0x83, 0xcd, 0x82, 0xcf, 0xe9, 0xd1, 0x1e, 0xa2, 0x89, -+ 0x5c, 0xe8, 0x67, 0x2f, 0x7c, 0x80, 0x18, 0x6f, 0x9d, 0xcc, 0x4f, 0x6f, 0xfe, 0x33, 0x97, 0x5b, -+ 0xc2, 0x38, 0xf3, 0x22, 0xdb, 0xce, 0x47, 0x6b, 0x0e, 0xba, 0x85, 0x5a, 0x67, 0x97, 0x21, 0xbc, -+ 0xea, 0xa2, 0xae, 0x86, 0x82, 0x71, 0xd3, 0xb3, 0xa2, 0x8e, 0xc0, 0x38, 0xfd, 0xfe, 0x76, 0x3c, -+ 0x19, 0x95, 0x50, 0x6c, 0xc0, 0x48, 0xf2, 0x33, 0xae, 0x54, 0xde, 0x36, 0x10, 0xcc, 0x99, 0xea, -+ 0x3b, 0xec, 0xdc, 0x35, 0xa5, 0xa0, 0x59, 0x32, 0xd4, 0x38, 0xc2, 0x31, 0xf4, 0xbc, 0xa9, 0x4b, -+ 0xbb, 0xdb, 0x00, 0x84, 0x44, 0x2f, 0x69, 0x7d, 0xf6, 0xd4, 0x9c, 0x5f, 0x18, 0xbc, 0x94, 0x07, -+ 0x1b, 0x72, 0xf8, 0x97, 0xac, 0xf1, 0x2f, 0xd1, 0x1c, 0xa4, 0xa6, 0x11, 0x54, 0x52, 0x29, 0xf8, -+ 0x12, 0x3c, 0x3f, 0x1b, 0x07, 0x9a, 0x70, 0x7a, 0x5f, 0x68, 0xd8, 0x1a, 0xd3, 0xbd, 0x3b, 0x3d, -+ 0xfa, 0x62, 0x66, 0xf2, 0x77, 0xe7, 0x40, 0x39, 0x18, 0x34, 0x66, 0x77, 0xd2, 0x2b, 0x5b, 0x6d, -+ 0x7a, 0x1e, 0x89, 0x30, 0xdd, 0xed, 0x38, 0xab, 0xdd, 0x28, 0x7b, 0xf2, 0xcb, 0xc1, 0xd4, 0x2c, -+ 0x5b, 0xc6, 0xf5, 0x75, 0x89, 0xdd, 0x27, 0x1c, 0x03, 0x10, 0x37, 0x61, 0xb6, 0xd0, 0xb3, 0xbf, -+ 0x4a, 0xbc, 0x47, 0x37, 0xf0, 0x67, 0xd8, 0x0b, 0xfb, 0xe0, 0x34, 0x71, 0x62, 0xfb, 0x18, 0x86, -+ 0x03, 0x33, 0x25, 0x6f, 0x97, 0x4a, 0x48, 0xf1, 0x36, 0xd7, 0x60, 0x1c, 0x17, 0x5e, 0x17, 0xcb, -+ 0xc3, 0x1a, 0x49, 0x4a, 0xf3, 0xe3, 0x86, 0x5e, 0xc4, 0x16, 0x61, 0x5c, 0x80, 0x7a, 0x4d, 0x81, -+ 0x95, 0x8e, 0xa8, 0x15, 0x32, 0x2f, 0x46, 0x8c, 0x89, 0xe6, 0x2c, 0x75, 0x11, 0x16, 0xd5, 0xea, -+ 0xbf, 0x0c, 0x21, 0x75, 0x3a, 0xad, 0x9a, 0xd1, 0x3e, 0xd8, 0x4d, 0xee, 0x89, 0xe3, 0x6b, 0x51 -+}; -+ -+static unsigned char rsa_n_4096[] = { -+ 0xe7, 0xbd, 0x61, 0x33, 0xc2, 0xd8, 0x4c, 0x41, 0xa0, 0x3d, 0xd2, 0xa6, 0xad, 0x39, 0x2b, 0x62, -+ 0x26, 0x3f, 0x7f, 0xa3, 0xbe, 0xdf, 0x35, 0xd3, 0x62, 0x67, 0x3b, 0x09, 0xe5, 0x9d, 0xf4, 0x21, -+ 0x6f, 0x0b, 0xf1, 0x9a, 0x5a, 0xe0, 0x72, 0x80, 0xcf, 0x27, 0x99, 0x25, 0xea, 0x3d, 0x73, 0x70, -+ 0x7f, 0x03, 0x61, 0x9d, 0xca, 0x25, 0xf2, 0xd2, 0x29, 0x04, 0x1a, 0xf5, 0x08, 0xa6, 0xac, 0xc0, -+ 0x6d, 0x1f, 0x0e, 0x0e, 0xfd, 0x6e, 0x73, 0xe7, 0x1d, 0x60, 0x92, 0x13, 0xc3, 0x20, 0x39, 0x95, -+ 0x9a, 0x1e, 0x31, 0x07, 0x07, 0x45, 0x62, 0x97, 0xe4, 0xe4, 0x41, 0x98, 0xf2, 0x4c, 0x06, 0x9b, -+ 0xb1, 0x13, 0x28, 0x70, 0xa8, 0x2c, 0x99, 0x59, 0x8a, 0x85, 0x0b, 0x92, 0xde, 0x35, 0x9a, 0x68, -+ 0x9b, 0x9f, 0x8f, 0x70, 0x1e, 0x68, 0x22, 0x25, 0x32, 0xdf, 0x78, 0xac, 0xc3, 0x0b, 0x2f, 0x4e, -+ 0x26, 0x1c, 0x6a, 0xb9, 0x2d, 0x98, 0xa6, 0x48, 0x94, 0xce, 0x37, 0x01, 0x08, 0x0f, 0x28, 0x42, -+ 0x2b, 0x97, 0x93, 0xae, 0x56, 0xf0, 0xa6, 0xb7, 0x41, 0x4d, 0x26, 0x33, 0x67, 0xc7, 0xc8, 0x2b, -+ 0xe9, 0xc0, 0xe2, 0x21, 0x77, 0xb1, 0xde, 0x0e, 0x68, 0x3b, 0x4b, 0x85, 0xb7, 0x92, 0x5d, 0x2b, -+ 0x21, 0xc6, 0x35, 0x72, 0x4e, 0xe7, 0x93, 0x83, 0xb3, 0x30, 0xba, 0x82, 0xe4, 0x8c, 0xc7, 0xe4, -+ 0xd8, 0xfc, 0x5f, 0x1c, 0x2d, 0x89, 0x69, 0x6b, 0xe7, 0x0c, 0xa4, 0xe3, 0x23, 0x6b, 0x5d, 0x7f, -+ 0xa7, 0x26, 0xce, 0x5d, 0x07, 0xd0, 0x03, 0xf4, 0xc2, 0x02, 0x26, 0x2a, 0x3c, 0xc6, 0x0c, 0x55, -+ 0xfa, 0x2a, 0xfe, 0x20, 0x13, 0xe3, 0xd5, 0x9d, 0xd2, 0x5f, 0x67, 0x86, 0xf7, 0x88, 0xc8, 0x0c, -+ 0x72, 0xad, 0x83, 0x4b, 0x44, 0xf4, 0x00, 0xc6, 0x2a, 0xce, 0x64, 0x37, 0x27, 0xfe, 0x1d, 0x43, -+ 0xb5, 0xb8, 0x37, 0xa3, 0xa1, 0xcd, 0xa3, 0xfa, 0x0c, 0xbf, 0x0c, 0x1d, 0xb0, 0xb4, 0xcd, 0xe9, -+ 0xc0, 0xc6, 0xcd, 0x5a, 0xef, 0x9f, 0x9f, 0x56, 0x94, 0x11, 0x7b, 0x95, 0x01, 0xa0, 0x09, 0x61, -+ 0x4e, 0x6d, 0x0c, 0x81, 0xb5, 0x80, 0x68, 0x5b, 0x2b, 0x7e, 0x88, 0xdd, 0x5a, 0x96, 0xbb, 0x78, -+ 0x2a, 0x86, 0x65, 0x1a, 0x95, 0xe0, 0x69, 0x49, 0xb7, 0x78, 0x5f, 0x42, 0x68, 0x92, 0x5a, 0x3d, -+ 0xed, 0x51, 0x39, 0x73, 0x1b, 0xe9, 0xff, 0x44, 0xdf, 0xa4, 0xa4, 0x71, 0xbb, 0xa0, 0xf5, 0x47, -+ 0x63, 0x82, 0x85, 0x68, 0x41, 0xee, 0xb4, 0xf0, 0xa2, 0xba, 0x3c, 0xc5, 0x1e, 0x48, 0xd1, 0x8c, -+ 0xd5, 0x5b, 0x6a, 0xf2, 0x7f, 0xbe, 0x6f, 0x65, 0xdd, 0x30, 0x74, 0xac, 0x12, 0x41, 0x79, 0x47, -+ 0xac, 0x2c, 0x1e, 0x6d, 0x56, 0x9d, 0xdb, 0x0c, 0x27, 0x4a, 0xe9, 0x07, 0xa0, 0x34, 0xcf, 0xdd, -+ 0x42, 0x7e, 0x31, 0xe9, 0xed, 0xb4, 0x1d, 0x74, 0x24, 0x84, 0x80, 0x2d, 0xf9, 0x32, 0x6e, 0xd0, -+ 0x12, 0xf1, 0x75, 0xad, 0x1a, 0xed, 0x79, 0xe9, 0x80, 0xf8, 0x60, 0xf6, 0x73, 0x31, 0xad, 0x0d, -+ 0x23, 0xda, 0xad, 0x8a, 0x73, 0xab, 0x99, 0xc5, 0xe0, 0x52, 0x01, 0xf4, 0x88, 0x10, 0x69, 0x99, -+ 0xf3, 0x07, 0x2c, 0xb7, 0x67, 0x0c, 0xf3, 0xa6, 0x74, 0x4a, 0x73, 0x7d, 0xdb, 0x72, 0x22, 0xba, -+ 0xc1, 0xdd, 0xbc, 0x82, 0x2b, 0x6f, 0xaa, 0xcb, 0x7a, 0xfd, 0x50, 0x30, 0xb7, 0xf6, 0x72, 0x4b, -+ 0x71, 0xe0, 0xbd, 0xca, 0xf9, 0xd2, 0x4d, 0x42, 0x85, 0x40, 0x49, 0x9b, 0xba, 0x44, 0x7d, 0x98, -+ 0x16, 0x40, 0x32, 0xd0, 0x5f, 0x2a, 0xcf, 0x0d, 0x1a, 0x5b, 0x74, 0xd6, 0x4c, 0xb0, 0x0f, 0xe5, -+ 0x81, 0x01, 0x03, 0xfd, 0xd3, 0x14, 0xbc, 0xc5, 0x64, 0x4c, 0x29, 0xd4, 0x27, 0x08, 0xe3, 0x69 -+}; -+ -+static unsigned char dh_g_5[] = {0x05}; -+static unsigned char dh_g_2[] = {0x02}; -+ -+static unsigned char dh_p_768[] = { -+ 0xdd, 0xe8, 0xa1, 0x7d, 0xdd, 0x39, 0x87, 0x3c, 0xa1, 0x6a, 0xeb, 0x1b, 0x4f, 0x14, 0x72, 0x88, -+ 0x6c, 0x14, 0x6d, 0x24, 0xb7, 0xda, 0xf8, 0x97, 0xaa, 0xba, 0xb4, 0xdd, 0xc9, 0x5b, 0x28, 0x10, -+ 0x49, 0xfa, 0x93, 0xcc, 0x62, 0xc0, 0x70, 0xf8, 0xd6, 0xdc, 0xb2, 0x80, 0x35, 0x20, 0x84, 0xa4, -+ 0x99, 0xfc, 0x10, 0x7c, 0x9d, 0xc0, 0xc6, 0xd4, 0x8b, 0x0c, 0x57, 0xf1, 0x01, 0xf5, 0x1a, 0x4f, -+ 0x20, 0xfa, 0x8d, 0x66, 0x8b, 0x22, 0x3c, 0x96, 0xef, 0xd0, 0xde, 0xe5, 0x7e, 0x7f, 0x23, 0xdc, -+ 0x6d, 0x71, 0xdf, 0xc3, 0xe5, 0x1b, 0x39, 0xfe, 0xb7, 0x77, 0xe5, 0x72, 0x0d, 0x1c, 0x8d, 0xb7 -+}; -+ -+static unsigned char dh_xa_768[] = { -+ 0xe0, 0x80, 0x86, 0x24, 0xe2, 0x20, 0x35, 0x97, 0xda, 0x0e, 0x68, 0x39, 0x01, 0xdd, 0x01, 0x87, -+ 0xa2, 0x47, 0xd2, 0x0d, 0xee, 0xfe, 0xdc, 0x5a, 0x37, 0x23, 0xeb, 0x3d, 0xe8, 0x1e, 0x39, 0x2d, -+ 0xbf, 0xa6, 0xe9, 0x17, 0x48, 0xe2, 0xea, 0xef, 0x1d, 0x2f, 0xe2, 0xaf, 0x3c, 0xbc, 0xae, 0xa7, -+ 0x42, 0x9b, 0xa5, 0x7d, 0x47, 0x8a, 0x20, 0xc5, 0xae, 0xa1, 0xe4, 0xe8, 0x1c, 0x05, 0xc0, 0x0a, -+ 0x05, 0xdc, 0x01, 0x74, 0xde, 0xad, 0xad, 0x07, 0xec, 0x6e, 0x6a, 0xc7, 0xee, 0x0f, 0xb8, 0xbe, -+ 0xaa, 0x46, 0x61, 0x8c, 0x12, 0x5a, 0xaf, 0x05, 0xff, 0x1b, 0x35, 0x6b, 0xe2, 0x3d, 0x48, 0x4f -+}; -+ -+static unsigned char dh_except_a_pubkey_768[] = { -+ 0xba, 0xe7, 0x3, 0x5b, 0xe4, 0x70, 0x8b, 0xe0, 0xe1, 0x92, 0x13, 0x86, 0x74, 0x4, 0xdc, 0x6a, -+ 0x0a, 0x2a, 0x20, 0xec, 0x6d, 0xbf, 0xf0, 0x46, 0xf7, 0x9, 0x2, 0xdb, 0x2f, 0x70, 0x11, 0xdd, -+ 0xb0, 0x13, 0xa2, 0xc1, 0x58, 0x74, 0x29, 0x19, 0x8d, 0x4a, 0x94, 0x80, 0x0b, 0xd7, 0x25, 0x85, -+ 0x10, 0x35, 0x97, 0x48, 0x6e, 0x70, 0x28, 0xae, 0x58, 0x97, 0x7d, 0xf2, 0x19, 0x27, 0x13, 0xab, -+ 0x47, 0x9b, 0x54, 0xdf, 0xc3, 0x5b, 0x5f, 0x5e, 0xb4, 0x64, 0x47, 0xce, 0x40, 0x3b, 0x0c, 0x4a, -+ 0x62, 0x52, 0xba, 0xc7, 0xf0, 0x36, 0x87, 0x9c, 0x79, 0x9a, 0x83, 0x11, 0x61, 0x0c, 0x1b, 0x6b -+}; -+ -+static unsigned char dh_except_b_pubkey_768[] = { -+ 0x0d, 0xe8, 0xa1, 0x7d, 0xdd, 0x39, 0x87, 0x3c, 0xa1, 0x6a, 0xeb, 0x1b, 0x4f, 0x14, 0x72, 0x88, -+ 0x6c, 0x14, 0x6d, 0x24, 0xb7, 0xda, 0xf8, 0x97, 0xaa, 0xba, 0xb4, 0xdd, 0xc9, 0x5b, 0x28, 0x10, -+ 0x49, 0xfa, 0x93, 0xcc, 0x62, 0xc0, 0x70, 0xf8, 0xd6, 0xdc, 0xb2, 0x80, 0x35, 0x20, 0x84, 0xa4, -+ 0x99, 0xfc, 0x10, 0x7c, 0x9d, 0xc0, 0xc6, 0xd4, 0x8b, 0x0c, 0x57, 0xf1, 0x1, 0xf5, 0x1a, 0x4f, -+ 0x20, 0xfa, 0x8d, 0x66, 0x8b, 0x22, 0x3c, 0x96, 0xef, 0xd0, 0xde, 0xe5, 0x7e, 0x7f, 0x23, 0xdc, -+ 0x6d, 0x71, 0xdf, 0xc3, 0xe5, 0x1b, 0x39, 0xfe, 0xb7, 0x77, 0xe5, 0x72, 0x0d, 0x1c, 0x8d, 0xb7 -+}; -+ -+static unsigned char dh_share_key_768[] = { -+ 0x55, 0x9, 0x6b, 0x9c, 0xc6, 0x37, 0xa9, 0x9b, 0xdf, 0x67, 0x73, 0x7b, 0x46, 0xf9, 0x63, 0x47, -+ 0xcb, 0xa0, 0x57, 0x2a, 0xed, 0x97, 0x2f, 0xfe, 0x92, 0xf2, 0x20, 0x2c, 0x7e, 0xee, 0x7d, 0x11, -+ 0x78, 0xe6, 0xb9, 0x9, 0xd1, 0x94, 0xce, 0xd1, 0x5b, 0xf4, 0x44, 0xa9, 0xcb, 0x26, 0x2, 0x36, -+ 0x57, 0x2c, 0xa2, 0xbe, 0x37, 0xde, 0x86, 0x46, 0x20, 0x27, 0x9d, 0xa0, 0x2f, 0x4, 0xc1, 0xcd, -+ 0xff, 0x81, 0xe5, 0xe6, 0x2c, 0x9e, 0x39, 0x82, 0x31, 0x54, 0x33, 0xf8, 0xe7, 0xa0, 0xe5, 0x96, -+ 0xa4, 0x40, 0xc4, 0x44, 0xfe, 0x93, 0x66, 0xe2, 0xda, 0xaa, 0xb8, 0xfb, 0x2f, 0x3b, 0x8c, 0xce, -+}; -+ -+static unsigned char dh_p_1024[] = { -+ 0x6a, 0xf3, 0x2c, 0xd2, 0x2d, 0x55, 0xc1, 0x54, 0x40, 0x18, 0x71, 0x07, 0x96, 0xa9, 0x56, 0x6e, -+ 0x45, 0x58, 0x24, 0xce, 0x75, 0x80, 0x3, 0x68, 0x36, 0x96, 0x03, 0xb2, 0x9c, 0x25, 0xbc, 0x55, -+ 0x0d, 0xe8, 0xa1, 0x7d, 0xdd, 0x39, 0x87, 0x3c, 0xa1, 0x6a, 0xeb, 0x1b, 0x4f, 0x14, 0x72, 0x88, -+ 0x6c, 0x14, 0x6d, 0x24, 0xb7, 0xda, 0xf8, 0x97, 0xaa, 0xba, 0xb4, 0xdd, 0xc9, 0x5b, 0x28, 0x10, -+ 0x49, 0xfa, 0x93, 0xcc, 0x62, 0xc0, 0x70, 0xf8, 0xd6, 0xdc, 0xb2, 0x80, 0x35, 0x20, 0x84, 0xa4, -+ 0x99, 0xfc, 0x10, 0x7c, 0x9d, 0xc0, 0xc6, 0xd4, 0x8b, 0x0c, 0x57, 0xf1, 0x01, 0xf5, 0x1a, 0x4f, -+ 0x20, 0xfa, 0x8d, 0x66, 0x8b, 0x22, 0x3c, 0x96, 0xef, 0xd0, 0xde, 0xe5, 0x7e, 0x7f, 0x23, 0xdc, -+ 0x6d, 0x71, 0xdf, 0xc3, 0xe5, 0x1b, 0x39, 0xfe, 0xb7, 0x77, 0xe5, 0x72, 0x0d, 0x1c, 0x8d, 0xb7 -+}; -+ -+static unsigned char dh_xa_1024[] = { -+ 0x0f, 0x2a, 0x77, 0x25, 0x4b, 0xb3, 0xd3, 0x2d, 0xfd, 0x94, 0x8b, 0x53, 0x02, 0x21, 0x40, 0xd7, -+ 0x36, 0x76, 0xf3, 0xc8, 0xc0, 0x36, 0x3d, 0x23, 0xc9, 0xbd, 0x92, 0x51, 0xf2, 0x4b, 0x83, 0x15, -+ 0xe0, 0x80, 0x86, 0x24, 0xe2, 0x20, 0x35, 0x97, 0xda, 0x0e, 0x68, 0x39, 0x01, 0xdd, 0x01, 0x87, -+ 0xa2, 0x47, 0xd2, 0x0d, 0xee, 0xfe, 0xdc, 0x5a, 0x37, 0x23, 0xeb, 0x3d, 0xe8, 0x1e, 0x39, 0x2d, -+ 0xbf, 0xa6, 0xe9, 0x17, 0x48, 0xe2, 0xea, 0xef, 0x1d, 0x2f, 0xe2, 0xaf, 0x3c, 0xbc, 0xae, 0xa7, -+ 0x42, 0x9b, 0xa5, 0x7d, 0x47, 0x8a, 0x20, 0xc5, 0xae, 0xa1, 0xe4, 0xe8, 0x1c, 0x05, 0xc0, 0x0a, -+ 0x05, 0xdc, 0x01, 0x74, 0xde, 0xad, 0xad, 0x07, 0xec, 0x6e, 0x6a, 0xc7, 0xee, 0x0f, 0xb8, 0xbe, -+ 0xaa, 0x46, 0x61, 0x8c, 0x12, 0x5a, 0xaf, 0x05, 0xff, 0x1b, 0x35, 0x6b, 0xe2, 0x3d, 0x48, 0x4f -+}; -+ -+static unsigned char dh_except_a_pubkey_1024[] = { -+ 0x5d, 0xa6, 0x7, 0x56, 0x93, 0x89, 0xe5, 0x0f, 0x2a, 0xb5, 0x67, 0x3a, 0xcf, 0xc3, 0x82, 0x83, -+ 0xf6, 0x88, 0x52, 0x0b, 0xfc, 0x6a, 0x5b, 0x1a, 0x57, 0x87, 0x86, 0xef, 0xda, 0x47, 0xdb, 0x4d, -+ 0xba, 0xe7, 0x3, 0x5b, 0xe4, 0x70, 0x8b, 0xe0, 0xe1, 0x92, 0x13, 0x86, 0x74, 0x4, 0xdc, 0x6a, -+ 0x0a, 0x2a, 0x20, 0xec, 0x6d, 0xbf, 0xf0, 0x46, 0xf7, 0x9, 0x2, 0xdb, 0x2f, 0x70, 0x11, 0xdd, -+ 0xb0, 0x13, 0xa2, 0xc1, 0x58, 0x74, 0x29, 0x19, 0x8d, 0x4a, 0x94, 0x80, 0x0b, 0xd7, 0x25, 0x85, -+ 0x10, 0x35, 0x97, 0x48, 0x6e, 0x70, 0x28, 0xae, 0x58, 0x97, 0x7d, 0xf2, 0x19, 0x27, 0x13, 0xab, -+ 0x47, 0x9b, 0x54, 0xdf, 0xc3, 0x5b, 0x5f, 0x5e, 0xb4, 0x64, 0x47, 0xce, 0x40, 0x3b, 0x0c, 0x4a, -+ 0x62, 0x52, 0xba, 0xc7, 0xf0, 0x36, 0x87, 0x9c, 0x79, 0x9a, 0x83, 0x11, 0x61, 0x0c, 0x1b, 0x6b -+}; -+ -+static unsigned char dh_except_b_pubkey_1024[] = { -+ 0x4a, 0xf3, 0x2c, 0xd2, 0x2d, 0x55, 0xc1, 0x54, 0x40, 0x18, 0x71, 0x7, 0x96, 0xa9, 0x56, 0x6e, -+ 0x45, 0x58, 0x24, 0xce, 0x75, 0x80, 0x3, 0x68, 0x36, 0x96, 0x3, 0xb2, 0x9c, 0x25, 0xbc, 0x55, -+ 0x0d, 0xe8, 0xa1, 0x7d, 0xdd, 0x39, 0x87, 0x3c, 0xa1, 0x6a, 0xeb, 0x1b, 0x4f, 0x14, 0x72, 0x88, -+ 0x6c, 0x14, 0x6d, 0x24, 0xb7, 0xda, 0xf8, 0x97, 0xaa, 0xba, 0xb4, 0xdd, 0xc9, 0x5b, 0x28, 0x10, -+ 0x49, 0xfa, 0x93, 0xcc, 0x62, 0xc0, 0x70, 0xf8, 0xd6, 0xdc, 0xb2, 0x80, 0x35, 0x20, 0x84, 0xa4, -+ 0x99, 0xfc, 0x10, 0x7c, 0x9d, 0xc0, 0xc6, 0xd4, 0x8b, 0x0c, 0x57, 0xf1, 0x1, 0xf5, 0x1a, 0x4f, -+ 0x20, 0xfa, 0x8d, 0x66, 0x8b, 0x22, 0x3c, 0x96, 0xef, 0xd0, 0xde, 0xe5, 0x7e, 0x7f, 0x23, 0xdc, -+ 0x6d, 0x71, 0xdf, 0xc3, 0xe5, 0x1b, 0x39, 0xfe, 0xb7, 0x77, 0xe5, 0x72, 0x0d, 0x1c, 0x8d, 0xb7 -+}; -+ -+static unsigned char dh_share_key_1024[] = { -+ 0xcc, 0x48, 0x97, 0xe4, 0x21, 0x65, 0xa6, 0x55, 0xb8, 0xf3, 0xb2, 0x7b, 0x91, 0xd7, 0xca, 0xb9, -+ 0x17, 0x58, 0x31, 0x71, 0xc0, 0xc9, 0x69, 0x1e, 0xf0, 0x9e, 0x3f, 0xe2, 0x37, 0x4, 0x2d, 0xa8, -+ 0x55, 0x9, 0x6b, 0x9c, 0xc6, 0x37, 0xa9, 0x9b, 0xdf, 0x67, 0x73, 0x7b, 0x46, 0xf9, 0x63, 0x47, -+ 0xcb, 0xa0, 0x57, 0x2a, 0xed, 0x97, 0x2f, 0xfe, 0x92, 0xf2, 0x20, 0x2c, 0x7e, 0xee, 0x7d, 0x11, -+ 0x78, 0xe6, 0xb9, 0x9, 0xd1, 0x94, 0xce, 0xd1, 0x5b, 0xf4, 0x44, 0xa9, 0xcb, 0x26, 0x2, 0x36, -+ 0x57, 0x2c, 0xa2, 0xbe, 0x37, 0xde, 0x86, 0x46, 0x20, 0x27, 0x9d, 0xa0, 0x2f, 0x4, 0xc1, 0xcd, -+ 0xff, 0x81, 0xe5, 0xe6, 0x2c, 0x9e, 0x39, 0x82, 0x31, 0x54, 0x33, 0xf8, 0xe7, 0xa0, 0xe5, 0x96, -+ 0xa4, 0x40, 0xc4, 0x44, 0xfe, 0x93, 0x66, 0xe2, 0xda, 0xaa, 0xb8, 0xfb, 0x2f, 0x3b, 0x8c, 0xce, -+}; -+ -+static unsigned char dh_p_1536[] = { -+ 0xe3,0x7d,0xa7,0x4a,0xcc,0xef,0xce,0xa6,0xde,0x1d,0x3d,0xc5,0x2b,0xaa,0x6b,0x83, -+ 0xec,0x87,0x60,0xcd,0xc6,0xe4,0x16,0x0d,0xe7,0xb9,0x20,0x0e,0x10,0x50,0x35,0x22, -+ 0xd6,0xdb,0xbf,0x6,0xcc,0x7b,0x8e,0xe1,0x68,0x38,0x76,0x5f,0x0a,0x68,0xa8,0xfd, -+ 0x3f,0x40,0x51,0x46,0x45,0x64,0x53,0x22,0xcf,0x8,0xe2,0xef,0xd2,0x6f,0x28,0x84, -+ 0x14,0xb3,0xa6,0x24,0x49,0x6f,0x49,0x6c,0x0a,0x13,0xb6,0x78,0x4f,0xa4,0xd0,0xc4, -+ 0x20,0x6c,0x7,0x4c,0x6b,0xf7,0x8c,0x72,0x16,0x6c,0x99,0xd2,0x44,0x9e,0x63,0x5, -+ 0xfc,0x3a,0xa9,0x33,0x16,0x0b,0xc4,0x1a,0xf0,0xc7,0x25,0xcd,0xc6,0x3a,0x8e,0x66, -+ 0xa2,0xeb,0x70,0xb9,0x59,0xd9,0xb7,0xdd,0x68,0x45,0x26,0x20,0xfa,0x58,0x6f,0xd6, -+ 0x3f,0xd8,0xf2,0x52,0xd5,0x3a,0x16,0x7,0xdd,0xb4,0x63,0x0c,0xfe,0x8,0x67,0xd0, -+ 0x9f,0x8a,0xe0,0xe9,0x25,0xa0,0x0e,0x5,0x8e,0xe5,0x56,0xa6,0xc3,0x5b,0x0b,0xb5, -+ 0x41,0x33,0xd0,0xdb,0x89,0xbd,0x3b,0xaf,0x33,0x7e,0xae,0xff,0x20,0xef,0xa9,0x3c, -+ 0xd7,0xb5,0x45,0x61,0x50,0x76,0x60,0x89,0x6a,0xbb,0x9c,0x3e,0xcb,0xcb,0xdb,0x0b, -+}; -+ -+static unsigned char dh_xa_1536[] = { -+ 0x56,0x68,0x23,0x22,0x49,0x24,0xf2,0x21,0xee,0x5f,0x12,0x46,0xe2,0xea,0x69,0x93, -+ 0x0,0xf5,0x10,0x1d,0x4d,0x96,0x7b,0xa4,0x9d,0xab,0xbe,0xdf,0x8e,0xcc,0xa5,0x0e, -+ 0x84,0x12,0x4e,0x77,0xc0,0x46,0x6b,0x51,0x11,0x46,0x4f,0x73,0x1e,0x1c,0x1c,0xd1, -+ 0x3,0xea,0x0e,0x11,0xdb,0xa3,0xa6,0x14,0xdb,0xdc,0x3e,0xc5,0x7f,0x7d,0x7a,0x69, -+ 0xa1,0x38,0x70,0x95,0xa5,0x2d,0x47,0xa3,0x0f,0xcf,0xf9,0x7c,0x2,0x4e,0x52,0x4c, -+ 0xd6,0x5b,0x9e,0xf3,0x7f,0x64,0x70,0x13,0x59,0x8e,0x44,0x31,0x92,0x1b,0xb4,0xaa, -+ 0xf9,0x64,0xfd,0xb7,0x3c,0x81,0xc0,0xf9,0x66,0x5d,0xff,0x9,0x3e,0x26,0xaf,0x1a, -+ 0xc0,0xd2,0xd9,0x7c,0x0e,0x6f,0x81,0x12,0x82,0x90,0x1b,0x37,0xb7,0x1a,0x7e,0x36, -+ 0x79,0x15,0xb1,0xe1,0xd5,0x2d,0x72,0xd4,0x47,0xf7,0x30,0x3c,0x17,0xe1,0x76,0x15, -+ 0xbc,0x17,0xdc,0x9d,0xd9,0xfc,0xfd,0xb6,0xe6,0xbd,0x8e,0x47,0x8d,0xbb,0xa8,0x8a, -+ 0xe7,0xe7,0x57,0xf2,0xd8,0x80,0x4c,0xdd,0xe7,0xaf,0x29,0xee,0x40,0x4e,0x2,0xad, -+ 0xec,0xb3,0x18,0x8e,0x4b,0x2d,0xd2,0x28,0x4e,0x58,0x85,0x29,0xe3,0x93,0x1b,0xa7, -+}; -+ -+static unsigned char dh_except_a_pubkey_1536[] = { -+ 0x97,0x1e,0x6d,0xf7,0xb1,0x2f,0xa7,0x82,0x9e,0x99,0x22,0xfb,0xf3,0x4e,0x2a,0x73, -+ 0xcc,0xd9,0x2b,0x10,0x1,0xfb,0xac,0xf1,0x81,0xfe,0x78,0x3d,0x23,0xb0,0xcf,0x5c, -+ 0x95,0x69,0x36,0xc0,0x99,0x6a,0xd2,0x9c,0xf0,0x85,0x8d,0xda,0x5d,0xba,0x8e,0x0f, -+ 0xa3,0xce,0xbe,0x9b,0xe8,0x3b,0xad,0x71,0xfd,0xfd,0x53,0x25,0xee,0x61,0x26,0x15, -+ 0x0a,0x46,0x9e,0xce,0x85,0xb1,0x5c,0xf1,0xa0,0x8f,0xe7,0x89,0xe3,0x4f,0x7c,0xea, -+ 0x18,0xd3,0xa9,0x44,0xce,0x35,0x9,0x86,0x80,0x8c,0x30,0x1,0xbc,0x6d,0xf6,0x6a, -+ 0x3a,0xa6,0xad,0xbe,0xfa,0x73,0x6b,0xb0,0x35,0x8c,0x63,0x80,0xb6,0x58,0x51,0x6e, -+ 0x4c,0x5d,0x4a,0xe9,0xa9,0x72,0x6,0x9f,0xa2,0x3e,0x64,0xaf,0x70,0x63,0xee,0x2a, -+ 0x5d,0x73,0xf3,0xdc,0xa3,0x32,0x0f,0x8,0x48,0xcf,0x13,0x80,0x0d,0xdb,0x91,0xdf, -+ 0x87,0x99,0xa4,0x8a,0x50,0xe9,0x75,0x43,0xfb,0x56,0xd7,0x89,0xc3,0x10,0x7e,0xd0, -+ 0xb7,0x46,0xd8,0x41,0x91,0xdf,0xb1,0x91,0x8e,0xc1,0x58,0xd7,0x7c,0x33,0x1e,0xb3, -+ 0xa3,0xda,0xcb,0xf5,0x0,0x76,0xe4,0xee,0x20,0xd6,0x9d,0x8a,0x28,0xa4,0xdb,0xf9, -+}; -+ -+static unsigned char dh_except_b_pubkey_1536[] = { -+ 0x44, 0x58, 0xe8, 0x62, 0xc8, 0xd2, 0xb5, 0x45, 0x1f, 0xa5, 0xc3, 0xdb, 0x8e, 0x69, 0x42, 0xd2, -+ 0x21, 0x7e, 0x6b, 0x26, 0x69, 0x45, 0xf1, 0x33, 0xcf, 0xd7, 0xe6, 0x6e, 0x64, 0xc3, 0x29, 0xa5, -+ 0x68, 0x49, 0x3d, 0x13, 0x0b, 0x42, 0x36, 0xa6, 0xf4, 0xb1, 0xab, 0xa3, 0x8f, 0xe6, 0xcf, 0x46, -+ 0xe8, 0x85, 0xf3, 0xaa, 0xcb, 0x9, 0x84, 0x32, 0x34, 0xf7, 0x46, 0x0a, 0x65, 0xf9, 0xb5, 0x97, -+ 0xc2, 0x4a, 0x6f, 0x41, 0x40, 0xc9, 0x9e, 0x63, 0xe1, 0x0f, 0xd2, 0x12, 0x59, 0x35, 0xcc, 0x39, -+ 0x99, 0x4, 0xe8, 0x9a, 0xd2, 0x0, 0x7a, 0xce, 0x3c, 0x78, 0xfe, 0xea, 0x4b, 0x13, 0x53, 0xcd, -+ 0xc3, 0x60, 0x73, 0xa4, 0x3f, 0xbc, 0x8a, 0x8d, 0x61, 0x1c, 0xfa, 0xaf, 0xb7, 0xf8, 0x37, 0xa5, -+ 0xe2, 0x3a, 0xd2, 0x7a, 0xb6, 0x0, 0xf3, 0xd8, 0x3a, 0xa2, 0x46, 0xd2, 0x5c, 0x91, 0xc1, 0x5, -+ 0x6a, 0xf3, 0x2c, 0xd2, 0x2d, 0x55, 0xc1, 0x54, 0x40, 0x18, 0x71, 0x7, 0x96, 0xa9, 0x56, 0x6e, -+ 0x45, 0x58, 0x24, 0xce, 0x75, 0x80, 0x3, 0x68, 0x36, 0x96, 0x3, 0xb2, 0x9c, 0x25, 0xbc, 0x55, -+ 0x0d, 0xe8, 0xa1, 0x7d, 0xdd, 0x39, 0x87, 0x3c, 0xa1, 0x6a, 0xeb, 0x1b, 0x4f, 0x14, 0x72, 0x88, -+ 0x6c, 0x14, 0x6d, 0x24, 0xb7, 0xda, 0xf8, 0x97, 0xaa, 0xba, 0xb4, 0xdd, 0xc9, 0x5b, 0x28, 0x10, -+}; -+ -+static unsigned char dh_share_key_1536[] = { -+ 0xaf, 0xd4, 0xf6, 0x45, 0x63, 0x21, 0x8d, 0x98, 0xc4, 0xab, 0x18, 0xd7, 0x2b, 0x3c, 0x1d, 0xde, -+ 0xe7, 0x1f, 0xe1, 0xc5, 0x79, 0x57, 0x60, 0x20, 0xfa, 0x99, 0xbd, 0x7b, 0xa2, 0x94, 0x0b, 0xa3, -+ 0xb4, 0xb3, 0x33, 0x4a, 0x2f, 0xd0, 0x17, 0x7, 0x2e, 0x70, 0x19, 0x84, 0x1f, 0x8e, 0xe9, 0x61, -+ 0xe5, 0x52, 0x3, 0x96, 0xea, 0xd8, 0xb6, 0x3, 0x9f, 0xc4, 0x3e, 0x23, 0x77, 0x17, 0x54, 0xfb, -+ 0x13, 0xf0, 0x3e, 0x9a, 0x27, 0x5d, 0x12, 0x99, 0x58, 0x8d, 0x41, 0x46, 0xd9, 0xc9, 0x29, 0xbd, -+ 0x40, 0xd1, 0x4f, 0xef, 0x63, 0x7b, 0x54, 0xe6, 0x59, 0x6d, 0xe2, 0x30, 0xe8, 0x2c, 0x2f, 0xf9, -+ 0x66, 0xa2, 0x12, 0xf5, 0x58, 0x61, 0xac, 0x43, 0xec, 0x7e, 0xf9, 0x2e, 0x27, 0x70, 0x35, 0x75, -+ 0xb4, 0x10, 0x29, 0xac, 0x0a, 0xab, 0x59, 0xb6, 0x68, 0x4c, 0x16, 0xaf, 0xf0, 0x4f, 0x21, 0xcd, -+ 0xcc, 0x48, 0x97, 0xe4, 0x21, 0x65, 0xa6, 0x55, 0xb8, 0xf3, 0xb2, 0x7b, 0x91, 0xd7, 0xca, 0xb9, -+ 0x17, 0x58, 0x31, 0x71, 0xc0, 0xc9, 0x69, 0x1e, 0xf0, 0x9e, 0x3f, 0xe2, 0x37, 0x4, 0x2d, 0xa8, -+ 0x55, 0x9, 0x6b, 0x9c, 0xc6, 0x37, 0xa9, 0x9b, 0xdf, 0x67, 0x73, 0x7b, 0x46, 0xf9, 0x63, 0x47, -+ 0xcb, 0xa0, 0x57, 0x2a, 0xed, 0x97, 0x2f, 0xfe, 0x92, 0xf2, 0x20, 0x2c, 0x7e, 0xee, 0x7d, 0x11, -+}; -+ -+static unsigned char dh_p_2048[] = { -+ 0xce, 0x58, 0xe8, 0x62, 0xc8, 0xd2, 0xb5, 0x45, 0x1f, 0xa5, 0xc3, 0xdb, 0x8e, 0x69, 0x42, 0xd2, -+ 0x21, 0x7e, 0x6b, 0x26, 0x69, 0x45, 0xf1, 0x33, 0xcf, 0xd7, 0xe6, 0x6e, 0x64, 0xc3, 0x29, 0xa5, -+ 0x68, 0x49, 0x3d, 0x13, 0x0b, 0x42, 0x36, 0xa6, 0xf4, 0xb1, 0xab, 0xa3, 0x8f, 0xe6, 0xcf, 0x46, -+ 0xe8, 0x85, 0xf3, 0xaa, 0xcb, 0x09, 0x84, 0x32, 0x34, 0xf7, 0x46, 0x0a, 0x65, 0xf9, 0xb5, 0x97, -+ 0xc2, 0x4a, 0x6f, 0x41, 0x40, 0xc9, 0x9e, 0x63, 0xe1, 0x0f, 0xd2, 0x12, 0x59, 0x35, 0xcc, 0x39, -+ 0x99, 0x04, 0xe8, 0x9a, 0xd2, 0x00, 0x7a, 0xce, 0x3c, 0x78, 0xfe, 0xea, 0x4b, 0x13, 0x53, 0xcd, -+ 0xc3, 0x60, 0x73, 0xa4, 0x3f, 0xbc, 0x8a, 0x8d, 0x61, 0x1c, 0xfa, 0xaf, 0xb7, 0xf8, 0x37, 0xa5, -+ 0xe2, 0x3a, 0xd2, 0x7a, 0xb6, 0x00, 0xf3, 0xd8, 0x3a, 0xa2, 0x46, 0xd2, 0x5c, 0x91, 0xc1, 0x05, -+ 0x6a, 0xf3, 0x2c, 0xd2, 0x2d, 0x55, 0xc1, 0x54, 0x40, 0x18, 0x71, 0x07, 0x96, 0xa9, 0x56, 0x6e, -+ 0x45, 0x58, 0x24, 0xce, 0x75, 0x80, 0x3, 0x68, 0x36, 0x96, 0x03, 0xb2, 0x9c, 0x25, 0xbc, 0x55, -+ 0x0d, 0xe8, 0xa1, 0x7d, 0xdd, 0x39, 0x87, 0x3c, 0xa1, 0x6a, 0xeb, 0x1b, 0x4f, 0x14, 0x72, 0x88, -+ 0x6c, 0x14, 0x6d, 0x24, 0xb7, 0xda, 0xf8, 0x97, 0xaa, 0xba, 0xb4, 0xdd, 0xc9, 0x5b, 0x28, 0x10, -+ 0x49, 0xfa, 0x93, 0xcc, 0x62, 0xc0, 0x70, 0xf8, 0xd6, 0xdc, 0xb2, 0x80, 0x35, 0x20, 0x84, 0xa4, -+ 0x99, 0xfc, 0x10, 0x7c, 0x9d, 0xc0, 0xc6, 0xd4, 0x8b, 0x0c, 0x57, 0xf1, 0x01, 0xf5, 0x1a, 0x4f, -+ 0x20, 0xfa, 0x8d, 0x66, 0x8b, 0x22, 0x3c, 0x96, 0xef, 0xd0, 0xde, 0xe5, 0x7e, 0x7f, 0x23, 0xdc, -+ 0x6d, 0x71, 0xdf, 0xc3, 0xe5, 0x1b, 0x39, 0xfe, 0xb7, 0x77, 0xe5, 0x72, 0x0d, 0x1c, 0x8d, 0xb7 -+}; -+ -+static unsigned char dh_xa_2048[] = { -+ 0x6b, 0x1f, 0xc4, 0x85, 0x98, 0xc3, 0x01, 0xda, 0x39, 0xf0, 0x1b, 0x76, 0x5d, 0x81, 0x1d, 0x1f, -+ 0xc9, 0x93, 0x95, 0xc1, 0xf8, 0xd1, 0x67, 0x2c, 0xd4, 0x0a, 0x67, 0xf0, 0x40, 0x86, 0x82, 0x7f, -+ 0x8f, 0x9d, 0x79, 0x04, 0xee, 0x4a, 0x54, 0xc9, 0x9c, 0x7f, 0xda, 0x15, 0x13, 0xc6, 0x95, 0xfb, -+ 0xfc, 0x7b, 0xe7, 0xd8, 0xde, 0x2a, 0xd8, 0xfd, 0xff, 0xdb, 0xa4, 0x7f, 0x4b, 0x37, 0x5d, 0x42, -+ 0xb6, 0x46, 0x4c, 0xbc, 0x34, 0x23, 0x99, 0x74, 0xf8, 0x80, 0x1b, 0xc1, 0x97, 0x34, 0xdf, 0x23, -+ 0x15, 0xa2, 0x8b, 0xec, 0xf3, 0x3e, 0x20, 0x93, 0x63, 0x88, 0x17, 0x70, 0x75, 0xbb, 0x9d, 0xb8, -+ 0x32, 0xb0, 0xae, 0xb5, 0x24, 0x6a, 0x86, 0xf6, 0xc1, 0x60, 0x41, 0xc4, 0xf4, 0x95, 0x6e, 0x10, -+ 0x2f, 0xd8, 0x58, 0x56, 0x42, 0x82, 0x71, 0x85, 0x19, 0xde, 0x91, 0xf0, 0x2f, 0x30, 0x0c, 0x63, -+ 0x0f, 0x2a, 0x77, 0x25, 0x4b, 0xb3, 0xd3, 0x2d, 0xfd, 0x94, 0x8b, 0x53, 0x02, 0x21, 0x40, 0xd7, -+ 0x36, 0x76, 0xf3, 0xc8, 0xc0, 0x36, 0x3d, 0x23, 0xc9, 0xbd, 0x92, 0x51, 0xf2, 0x4b, 0x83, 0x15, -+ 0xe0, 0x80, 0x86, 0x24, 0xe2, 0x20, 0x35, 0x97, 0xda, 0x0e, 0x68, 0x39, 0x01, 0xdd, 0x01, 0x87, -+ 0xa2, 0x47, 0xd2, 0x0d, 0xee, 0xfe, 0xdc, 0x5a, 0x37, 0x23, 0xeb, 0x3d, 0xe8, 0x1e, 0x39, 0x2d, -+ 0xbf, 0xa6, 0xe9, 0x17, 0x48, 0xe2, 0xea, 0xef, 0x1d, 0x2f, 0xe2, 0xaf, 0x3c, 0xbc, 0xae, 0xa7, -+ 0x42, 0x9b, 0xa5, 0x7d, 0x47, 0x8a, 0x20, 0xc5, 0xae, 0xa1, 0xe4, 0xe8, 0x1c, 0x05, 0xc0, 0x0a, -+ 0x05, 0xdc, 0x01, 0x74, 0xde, 0xad, 0xad, 0x07, 0xec, 0x6e, 0x6a, 0xc7, 0xee, 0x0f, 0xb8, 0xbe, -+ 0xaa, 0x46, 0x61, 0x8c, 0x12, 0x5a, 0xaf, 0x05, 0xff, 0x1b, 0x35, 0x6b, 0xe2, 0x3d, 0x48, 0x4f -+}; -+ -+static unsigned char dh_except_a_pubkey_2048[] = { -+ 0xa5, 0x24, 0x63, 0x20, 0xb2, 0x56, 0x9a, 0x94, 0x97, 0xf7, 0x88, 0x41, 0x35, 0xeb, 0x52, 0x37, -+ 0xa4, 0xf2, 0x74, 0x1b, 0x38, 0xe4, 0x4c, 0x8b, 0x4b, 0xd2, 0xa5, 0xad, 0xb8, 0x2f, 0x7b, 0x5a, -+ 0xfd, 0xbc, 0x9c, 0xe0, 0xea, 0x9e, 0x82, 0x3, 0x62, 0xe2, 0xdc, 0x6c, 0x56, 0x9, 0x2, 0x28, -+ 0xb8, 0x2d, 0xb8, 0x46, 0xaf, 0x3a, 0xf4, 0x51, 0xf7, 0x4d, 0xc4, 0xd9, 0xa9, 0x1d, 0x67, 0x9d, -+ 0x2b, 0x18, 0x56, 0x86, 0x2a, 0x3, 0x19, 0xe9, 0x6, 0xeb, 0x4a, 0x6f, 0x2a, 0x40, 0x28, 0xbb, -+ 0x3e, 0x87, 0xc1, 0xce, 0x39, 0x6e, 0x3b, 0x1f, 0xb0, 0x9, 0x33, 0x67, 0x19, 0x0e, 0x1a, 0xb2, -+ 0xb3, 0x7d, 0xd3, 0xe6, 0x33, 0xf4, 0x7c, 0x82, 0x73, 0x7b, 0xb6, 0x16, 0x55, 0xff, 0x76, 0xaf, -+ 0x7f, 0xc2, 0x42, 0x51, 0xa9, 0xad, 0x1e, 0x72, 0xc9, 0x63, 0xab, 0x41, 0x5a, 0x26, 0x32, 0x39, -+ 0x5d, 0xa6, 0x7, 0x56, 0x93, 0x89, 0xe5, 0x0f, 0x2a, 0xb5, 0x67, 0x3a, 0xcf, 0xc3, 0x82, 0x83, -+ 0xf6, 0x88, 0x52, 0x0b, 0xfc, 0x6a, 0x5b, 0x1a, 0x57, 0x87, 0x86, 0xef, 0xda, 0x47, 0xdb, 0x4d, -+ 0xba, 0xe7, 0x3, 0x5b, 0xe4, 0x70, 0x8b, 0xe0, 0xe1, 0x92, 0x13, 0x86, 0x74, 0x4, 0xdc, 0x6a, -+ 0x0a, 0x2a, 0x20, 0xec, 0x6d, 0xbf, 0xf0, 0x46, 0xf7, 0x9, 0x2, 0xdb, 0x2f, 0x70, 0x11, 0xdd, -+ 0xb0, 0x13, 0xa2, 0xc1, 0x58, 0x74, 0x29, 0x19, 0x8d, 0x4a, 0x94, 0x80, 0x0b, 0xd7, 0x25, 0x85, -+ 0x10, 0x35, 0x97, 0x48, 0x6e, 0x70, 0x28, 0xae, 0x58, 0x97, 0x7d, 0xf2, 0x19, 0x27, 0x13, 0xab, -+ 0x47, 0x9b, 0x54, 0xdf, 0xc3, 0x5b, 0x5f, 0x5e, 0xb4, 0x64, 0x47, 0xce, 0x40, 0x3b, 0x0c, 0x4a, -+ 0x62, 0x52, 0xba, 0xc7, 0xf0, 0x36, 0x87, 0x9c, 0x79, 0x9a, 0x83, 0x11, 0x61, 0x0c, 0x1b, 0x6b -+}; -+ -+static unsigned char dh_except_b_pubkey_2048[] = { -+ 0x44, 0x58, 0xe8, 0x62, 0xc8, 0xd2, 0xb5, 0x45, 0x1f, 0xa5, 0xc3, 0xdb, 0x8e, 0x69, 0x42, 0xd2, -+ 0x21, 0x7e, 0x6b, 0x26, 0x69, 0x45, 0xf1, 0x33, 0xcf, 0xd7, 0xe6, 0x6e, 0x64, 0xc3, 0x29, 0xa5, -+ 0x68, 0x49, 0x3d, 0x13, 0x0b, 0x42, 0x36, 0xa6, 0xf4, 0xb1, 0xab, 0xa3, 0x8f, 0xe6, 0xcf, 0x46, -+ 0xe8, 0x85, 0xf3, 0xaa, 0xcb, 0x9, 0x84, 0x32, 0x34, 0xf7, 0x46, 0x0a, 0x65, 0xf9, 0xb5, 0x97, -+ 0xc2, 0x4a, 0x6f, 0x41, 0x40, 0xc9, 0x9e, 0x63, 0xe1, 0x0f, 0xd2, 0x12, 0x59, 0x35, 0xcc, 0x39, -+ 0x99, 0x4, 0xe8, 0x9a, 0xd2, 0x0, 0x7a, 0xce, 0x3c, 0x78, 0xfe, 0xea, 0x4b, 0x13, 0x53, 0xcd, -+ 0xc3, 0x60, 0x73, 0xa4, 0x3f, 0xbc, 0x8a, 0x8d, 0x61, 0x1c, 0xfa, 0xaf, 0xb7, 0xf8, 0x37, 0xa5, -+ 0xe2, 0x3a, 0xd2, 0x7a, 0xb6, 0x0, 0xf3, 0xd8, 0x3a, 0xa2, 0x46, 0xd2, 0x5c, 0x91, 0xc1, 0x5, -+ 0x6a, 0xf3, 0x2c, 0xd2, 0x2d, 0x55, 0xc1, 0x54, 0x40, 0x18, 0x71, 0x7, 0x96, 0xa9, 0x56, 0x6e, -+ 0x45, 0x58, 0x24, 0xce, 0x75, 0x80, 0x3, 0x68, 0x36, 0x96, 0x3, 0xb2, 0x9c, 0x25, 0xbc, 0x55, -+ 0x0d, 0xe8, 0xa1, 0x7d, 0xdd, 0x39, 0x87, 0x3c, 0xa1, 0x6a, 0xeb, 0x1b, 0x4f, 0x14, 0x72, 0x88, -+ 0x6c, 0x14, 0x6d, 0x24, 0xb7, 0xda, 0xf8, 0x97, 0xaa, 0xba, 0xb4, 0xdd, 0xc9, 0x5b, 0x28, 0x10, -+ 0x49, 0xfa, 0x93, 0xcc, 0x62, 0xc0, 0x70, 0xf8, 0xd6, 0xdc, 0xb2, 0x80, 0x35, 0x20, 0x84, 0xa4, -+ 0x99, 0xfc, 0x10, 0x7c, 0x9d, 0xc0, 0xc6, 0xd4, 0x8b, 0x0c, 0x57, 0xf1, 0x1, 0xf5, 0x1a, 0x4f, -+ 0x20, 0xfa, 0x8d, 0x66, 0x8b, 0x22, 0x3c, 0x96, 0xef, 0xd0, 0xde, 0xe5, 0x7e, 0x7f, 0x23, 0xdc, -+ 0x6d, 0x71, 0xdf, 0xc3, 0xe5, 0x1b, 0x39, 0xfe, 0xb7, 0x77, 0xe5, 0x72, 0x0d, 0x1c, 0x8d, 0xb7 -+}; -+ -+static unsigned char dh_share_key_2048[] = { -+ 0xaf, 0xd4, 0xf6, 0x45, 0x63, 0x21, 0x8d, 0x98, 0xc4, 0xab, 0x18, 0xd7, 0x2b, 0x3c, 0x1d, 0xde, -+ 0xe7, 0x1f, 0xe1, 0xc5, 0x79, 0x57, 0x60, 0x20, 0xfa, 0x99, 0xbd, 0x7b, 0xa2, 0x94, 0x0b, 0xa3, -+ 0xb4, 0xb3, 0x33, 0x4a, 0x2f, 0xd0, 0x17, 0x7, 0x2e, 0x70, 0x19, 0x84, 0x1f, 0x8e, 0xe9, 0x61, -+ 0xe5, 0x52, 0x3, 0x96, 0xea, 0xd8, 0xb6, 0x3, 0x9f, 0xc4, 0x3e, 0x23, 0x77, 0x17, 0x54, 0xfb, -+ 0x13, 0xf0, 0x3e, 0x9a, 0x27, 0x5d, 0x12, 0x99, 0x58, 0x8d, 0x41, 0x46, 0xd9, 0xc9, 0x29, 0xbd, -+ 0x40, 0xd1, 0x4f, 0xef, 0x63, 0x7b, 0x54, 0xe6, 0x59, 0x6d, 0xe2, 0x30, 0xe8, 0x2c, 0x2f, 0xf9, -+ 0x66, 0xa2, 0x12, 0xf5, 0x58, 0x61, 0xac, 0x43, 0xec, 0x7e, 0xf9, 0x2e, 0x27, 0x70, 0x35, 0x75, -+ 0xb4, 0x10, 0x29, 0xac, 0x0a, 0xab, 0x59, 0xb6, 0x68, 0x4c, 0x16, 0xaf, 0xf0, 0x4f, 0x21, 0xcd, -+ 0xcc, 0x48, 0x97, 0xe4, 0x21, 0x65, 0xa6, 0x55, 0xb8, 0xf3, 0xb2, 0x7b, 0x91, 0xd7, 0xca, 0xb9, -+ 0x17, 0x58, 0x31, 0x71, 0xc0, 0xc9, 0x69, 0x1e, 0xf0, 0x9e, 0x3f, 0xe2, 0x37, 0x4, 0x2d, 0xa8, -+ 0x55, 0x9, 0x6b, 0x9c, 0xc6, 0x37, 0xa9, 0x9b, 0xdf, 0x67, 0x73, 0x7b, 0x46, 0xf9, 0x63, 0x47, -+ 0xcb, 0xa0, 0x57, 0x2a, 0xed, 0x97, 0x2f, 0xfe, 0x92, 0xf2, 0x20, 0x2c, 0x7e, 0xee, 0x7d, 0x11, -+ 0x78, 0xe6, 0xb9, 0x9, 0xd1, 0x94, 0xce, 0xd1, 0x5b, 0xf4, 0x44, 0xa9, 0xcb, 0x26, 0x2, 0x36, -+ 0x57, 0x2c, 0xa2, 0xbe, 0x37, 0xde, 0x86, 0x46, 0x20, 0x27, 0x9d, 0xa0, 0x2f, 0x4, 0xc1, 0xcd, -+ 0xff, 0x81, 0xe5, 0xe6, 0x2c, 0x9e, 0x39, 0x82, 0x31, 0x54, 0x33, 0xf8, 0xe7, 0xa0, 0xe5, 0x96, -+ 0xa4, 0x40, 0xc4, 0x44, 0xfe, 0x93, 0x66, 0xe2, 0xda, 0xaa, 0xb8, 0xfb, 0x2f, 0x3b, 0x8c, 0xce, -+}; -+ -+static unsigned char dh_p_3072[] = { -+ 0xce, 0x58, 0xe8, 0x62, 0xc8, 0xd2, 0xb5, 0x45, 0x1f, 0xa5, 0xc3, 0xdb, 0x8e, 0x69, 0x42, 0xd2, -+ 0x21, 0x7e, 0x6b, 0x26, 0x69, 0x45, 0xf1, 0x33, 0xcf, 0xd7, 0xe6, 0x6e, 0x64, 0xc3, 0x29, 0xa5, -+ 0x68, 0x49, 0x3d, 0x13, 0x0b, 0x42, 0x36, 0xa6, 0xf4, 0xb1, 0xab, 0xa3, 0x8f, 0xe6, 0xcf, 0x46, -+ 0xe8, 0x85, 0xf3, 0xaa, 0xcb, 0x09, 0x84, 0x32, 0x34, 0xf7, 0x46, 0x0a, 0x65, 0xf9, 0xb5, 0x97, -+ 0xc2, 0x4a, 0x6f, 0x41, 0x40, 0xc9, 0x9e, 0x63, 0xe1, 0x0f, 0xd2, 0x12, 0x59, 0x35, 0xcc, 0x39, -+ 0x99, 0x04, 0xe8, 0x9a, 0xd2, 0x00, 0x7a, 0xce, 0x3c, 0x78, 0xfe, 0xea, 0x4b, 0x13, 0x53, 0xcd, -+ 0xc3, 0x60, 0x73, 0xa4, 0x3f, 0xbc, 0x8a, 0x8d, 0x61, 0x1c, 0xfa, 0xaf, 0xb7, 0xf8, 0x37, 0xa5, -+ 0xe2, 0x3a, 0xd2, 0x7a, 0xb6, 0x00, 0xf3, 0xd8, 0x3a, 0xa2, 0x46, 0xd2, 0x5c, 0x91, 0xc1, 0x05, -+ 0x6a, 0xf3, 0x2c, 0xd2, 0x2d, 0x55, 0xc1, 0x54, 0x40, 0x18, 0x71, 0x07, 0x96, 0xa9, 0x56, 0x6e, -+ 0x45, 0x58, 0x24, 0xce, 0x75, 0x80, 0x3, 0x68, 0x36, 0x96, 0x03, 0xb2, 0x9c, 0x25, 0xbc, 0x55, -+ 0x0d, 0xe8, 0xa1, 0x7d, 0xdd, 0x39, 0x87, 0x3c, 0xa1, 0x6a, 0xeb, 0x1b, 0x4f, 0x14, 0x72, 0x88, -+ 0x6c, 0x14, 0x6d, 0x24, 0xb7, 0xda, 0xf8, 0x97, 0xaa, 0xba, 0xb4, 0xdd, 0xc9, 0x5b, 0x28, 0x10, -+ 0x49, 0xfa, 0x93, 0xcc, 0x62, 0xc0, 0x70, 0xf8, 0xd6, 0xdc, 0xb2, 0x80, 0x35, 0x20, 0x84, 0xa4, -+ 0x99, 0xfc, 0x10, 0x7c, 0x9d, 0xc0, 0xc6, 0xd4, 0x8b, 0x0c, 0x57, 0xf1, 0x01, 0xf5, 0x1a, 0x4f, -+ 0x20, 0xfa, 0x8d, 0x66, 0x8b, 0x22, 0x3c, 0x96, 0xef, 0xd0, 0xde, 0xe5, 0x7e, 0x7f, 0x23, 0xdc, -+ 0x6d, 0x71, 0xdf, 0xc3, 0xe5, 0x1b, 0x39, 0xfe, 0xb7, 0x77, 0xe5, 0x72, 0x0d, 0x1c, 0x8d, 0xb7, -+ 0xce, 0x58, 0xe8, 0x62, 0xc8, 0xd2, 0xb5, 0x45, 0x1f, 0xa5, 0xc3, 0xdb, 0x8e, 0x69, 0x42, 0xd2, -+ 0x21, 0x7e, 0x6b, 0x26, 0x69, 0x45, 0xf1, 0x33, 0xcf, 0xd7, 0xe6, 0x6e, 0x64, 0xc3, 0x29, 0xa5, -+ 0x68, 0x49, 0x3d, 0x13, 0x0b, 0x42, 0x36, 0xa6, 0xf4, 0xb1, 0xab, 0xa3, 0x8f, 0xe6, 0xcf, 0x46, -+ 0xe8, 0x85, 0xf3, 0xaa, 0xcb, 0x09, 0x84, 0x32, 0x34, 0xf7, 0x46, 0x0a, 0x65, 0xf9, 0xb5, 0x97, -+ 0xc2, 0x4a, 0x6f, 0x41, 0x40, 0xc9, 0x9e, 0x63, 0xe1, 0x0f, 0xd2, 0x12, 0x59, 0x35, 0xcc, 0x39, -+ 0x99, 0x04, 0xe8, 0x9a, 0xd2, 0x00, 0x7a, 0xce, 0x3c, 0x78, 0xfe, 0xea, 0x4b, 0x13, 0x53, 0xcd, -+ 0xc3, 0x60, 0x73, 0xa4, 0x3f, 0xbc, 0x8a, 0x8d, 0x61, 0x1c, 0xfa, 0xaf, 0xb7, 0xf8, 0x37, 0xa5, -+ 0xe2, 0x3a, 0xd2, 0x7a, 0xb6, 0x00, 0xf3, 0xd8, 0x3a, 0xa2, 0x46, 0xd2, 0x5c, 0x91, 0xc1, 0x05, -+}; -+ -+static unsigned char dh_xa_3072[] = { -+ 0x6b, 0x1f, 0xc4, 0x85, 0x98, 0xc3, 0x01, 0xda, 0x39, 0xf0, 0x1b, 0x76, 0x5d, 0x81, 0x1d, 0x1f, -+ 0xc9, 0x93, 0x95, 0xc1, 0xf8, 0xd1, 0x67, 0x2c, 0xd4, 0x0a, 0x67, 0xf0, 0x40, 0x86, 0x82, 0x7f, -+ 0x8f, 0x9d, 0x79, 0x04, 0xee, 0x4a, 0x54, 0xc9, 0x9c, 0x7f, 0xda, 0x15, 0x13, 0xc6, 0x95, 0xfb, -+ 0xfc, 0x7b, 0xe7, 0xd8, 0xde, 0x2a, 0xd8, 0xfd, 0xff, 0xdb, 0xa4, 0x7f, 0x4b, 0x37, 0x5d, 0x42, -+ 0xb6, 0x46, 0x4c, 0xbc, 0x34, 0x23, 0x99, 0x74, 0xf8, 0x80, 0x1b, 0xc1, 0x97, 0x34, 0xdf, 0x23, -+ 0x15, 0xa2, 0x8b, 0xec, 0xf3, 0x3e, 0x20, 0x93, 0x63, 0x88, 0x17, 0x70, 0x75, 0xbb, 0x9d, 0xb8, -+ 0x32, 0xb0, 0xae, 0xb5, 0x24, 0x6a, 0x86, 0xf6, 0xc1, 0x60, 0x41, 0xc4, 0xf4, 0x95, 0x6e, 0x10, -+ 0x2f, 0xd8, 0x58, 0x56, 0x42, 0x82, 0x71, 0x85, 0x19, 0xde, 0x91, 0xf0, 0x2f, 0x30, 0x0c, 0x63, -+ 0x0f, 0x2a, 0x77, 0x25, 0x4b, 0xb3, 0xd3, 0x2d, 0xfd, 0x94, 0x8b, 0x53, 0x02, 0x21, 0x40, 0xd7, -+ 0x36, 0x76, 0xf3, 0xc8, 0xc0, 0x36, 0x3d, 0x23, 0xc9, 0xbd, 0x92, 0x51, 0xf2, 0x4b, 0x83, 0x15, -+ 0xe0, 0x80, 0x86, 0x24, 0xe2, 0x20, 0x35, 0x97, 0xda, 0x0e, 0x68, 0x39, 0x01, 0xdd, 0x01, 0x87, -+ 0xa2, 0x47, 0xd2, 0x0d, 0xee, 0xfe, 0xdc, 0x5a, 0x37, 0x23, 0xeb, 0x3d, 0xe8, 0x1e, 0x39, 0x2d, -+ 0xbf, 0xa6, 0xe9, 0x17, 0x48, 0xe2, 0xea, 0xef, 0x1d, 0x2f, 0xe2, 0xaf, 0x3c, 0xbc, 0xae, 0xa7, -+ 0x42, 0x9b, 0xa5, 0x7d, 0x47, 0x8a, 0x20, 0xc5, 0xae, 0xa1, 0xe4, 0xe8, 0x1c, 0x05, 0xc0, 0x0a, -+ 0x05, 0xdc, 0x01, 0x74, 0xde, 0xad, 0xad, 0x07, 0xec, 0x6e, 0x6a, 0xc7, 0xee, 0x0f, 0xb8, 0xbe, -+ 0xaa, 0x46, 0x61, 0x8c, 0x12, 0x5a, 0xaf, 0x05, 0xff, 0x1b, 0x35, 0x6b, 0xe2, 0x3d, 0x48, 0x4f, -+ 0x6b, 0x1f, 0xc4, 0x85, 0x98, 0xc3, 0x01, 0xda, 0x39, 0xf0, 0x1b, 0x76, 0x5d, 0x81, 0x1d, 0x1f, -+ 0xc9, 0x93, 0x95, 0xc1, 0xf8, 0xd1, 0x67, 0x2c, 0xd4, 0x0a, 0x67, 0xf0, 0x40, 0x86, 0x82, 0x7f, -+ 0x8f, 0x9d, 0x79, 0x04, 0xee, 0x4a, 0x54, 0xc9, 0x9c, 0x7f, 0xda, 0x15, 0x13, 0xc6, 0x95, 0xfb, -+ 0xfc, 0x7b, 0xe7, 0xd8, 0xde, 0x2a, 0xd8, 0xfd, 0xff, 0xdb, 0xa4, 0x7f, 0x4b, 0x37, 0x5d, 0x42, -+ 0xb6, 0x46, 0x4c, 0xbc, 0x34, 0x23, 0x99, 0x74, 0xf8, 0x80, 0x1b, 0xc1, 0x97, 0x34, 0xdf, 0x23, -+ 0x15, 0xa2, 0x8b, 0xec, 0xf3, 0x3e, 0x20, 0x93, 0x63, 0x88, 0x17, 0x70, 0x75, 0xbb, 0x9d, 0xb8, -+ 0x32, 0xb0, 0xae, 0xb5, 0x24, 0x6a, 0x86, 0xf6, 0xc1, 0x60, 0x41, 0xc4, 0xf4, 0x95, 0x6e, 0x10, -+ 0x2f, 0xd8, 0x58, 0x56, 0x42, 0x82, 0x71, 0x85, 0x19, 0xde, 0x91, 0xf0, 0x2f, 0x30, 0x0c, 0x63, -+}; -+ -+static unsigned char dh_except_a_pubkey_3072[] = { -+ 0xa5, 0x24, 0x63, 0x20, 0xb2, 0x56, 0x9a, 0x94, 0x97, 0xf7, 0x88, 0x41, 0x35, 0xeb, 0x52, 0x37, -+ 0xa4, 0xf2, 0x74, 0x1b, 0x38, 0xe4, 0x4c, 0x8b, 0x4b, 0xd2, 0xa5, 0xad, 0xb8, 0x2f, 0x7b, 0x5a, -+ 0xfd, 0xbc, 0x9c, 0xe0, 0xea, 0x9e, 0x82, 0x3, 0x62, 0xe2, 0xdc, 0x6c, 0x56, 0x9, 0x2, 0x28, -+ 0xb8, 0x2d, 0xb8, 0x46, 0xaf, 0x3a, 0xf4, 0x51, 0xf7, 0x4d, 0xc4, 0xd9, 0xa9, 0x1d, 0x67, 0x9d, -+ 0x2b, 0x18, 0x56, 0x86, 0x2a, 0x3, 0x19, 0xe9, 0x6, 0xeb, 0x4a, 0x6f, 0x2a, 0x40, 0x28, 0xbb, -+ 0x3e, 0x87, 0xc1, 0xce, 0x39, 0x6e, 0x3b, 0x1f, 0xb0, 0x9, 0x33, 0x67, 0x19, 0x0e, 0x1a, 0xb2, -+ 0xb3, 0x7d, 0xd3, 0xe6, 0x33, 0xf4, 0x7c, 0x82, 0x73, 0x7b, 0xb6, 0x16, 0x55, 0xff, 0x76, 0xaf, -+ 0x7f, 0xc2, 0x42, 0x51, 0xa9, 0xad, 0x1e, 0x72, 0xc9, 0x63, 0xab, 0x41, 0x5a, 0x26, 0x32, 0x39, -+ 0x5d, 0xa6, 0x7, 0x56, 0x93, 0x89, 0xe5, 0x0f, 0x2a, 0xb5, 0x67, 0x3a, 0xcf, 0xc3, 0x82, 0x83, -+ 0xf6, 0x88, 0x52, 0x0b, 0xfc, 0x6a, 0x5b, 0x1a, 0x57, 0x87, 0x86, 0xef, 0xda, 0x47, 0xdb, 0x4d, -+ 0xba, 0xe7, 0x3, 0x5b, 0xe4, 0x70, 0x8b, 0xe0, 0xe1, 0x92, 0x13, 0x86, 0x74, 0x4, 0xdc, 0x6a, -+ 0x0a, 0x2a, 0x20, 0xec, 0x6d, 0xbf, 0xf0, 0x46, 0xf7, 0x9, 0x2, 0xdb, 0x2f, 0x70, 0x11, 0xdd, -+ 0xb0, 0x13, 0xa2, 0xc1, 0x58, 0x74, 0x29, 0x19, 0x8d, 0x4a, 0x94, 0x80, 0x0b, 0xd7, 0x25, 0x85, -+ 0x10, 0x35, 0x97, 0x48, 0x6e, 0x70, 0x28, 0xae, 0x58, 0x97, 0x7d, 0xf2, 0x19, 0x27, 0x13, 0xab, -+ 0x47, 0x9b, 0x54, 0xdf, 0xc3, 0x5b, 0x5f, 0x5e, 0xb4, 0x64, 0x47, 0xce, 0x40, 0x3b, 0x0c, 0x4a, -+ 0x62, 0x52, 0xba, 0xc7, 0xf0, 0x36, 0x87, 0x9c, 0x79, 0x9a, 0x83, 0x11, 0x61, 0x0c, 0x1b, 0x6b, -+ 0xa5, 0x24, 0x63, 0x20, 0xb2, 0x56, 0x9a, 0x94, 0x97, 0xf7, 0x88, 0x41, 0x35, 0xeb, 0x52, 0x37, -+ 0xa4, 0xf2, 0x74, 0x1b, 0x38, 0xe4, 0x4c, 0x8b, 0x4b, 0xd2, 0xa5, 0xad, 0xb8, 0x2f, 0x7b, 0x5a, -+ 0xfd, 0xbc, 0x9c, 0xe0, 0xea, 0x9e, 0x82, 0x3, 0x62, 0xe2, 0xdc, 0x6c, 0x56, 0x9, 0x2, 0x28, -+ 0xb8, 0x2d, 0xb8, 0x46, 0xaf, 0x3a, 0xf4, 0x51, 0xf7, 0x4d, 0xc4, 0xd9, 0xa9, 0x1d, 0x67, 0x9d, -+ 0x2b, 0x18, 0x56, 0x86, 0x2a, 0x3, 0x19, 0xe9, 0x6, 0xeb, 0x4a, 0x6f, 0x2a, 0x40, 0x28, 0xbb, -+ 0x3e, 0x87, 0xc1, 0xce, 0x39, 0x6e, 0x3b, 0x1f, 0xb0, 0x9, 0x33, 0x67, 0x19, 0x0e, 0x1a, 0xb2, -+ 0xb3, 0x7d, 0xd3, 0xe6, 0x33, 0xf4, 0x7c, 0x82, 0x73, 0x7b, 0xb6, 0x16, 0x55, 0xff, 0x76, 0xaf, -+ 0x7f, 0xc2, 0x42, 0x51, 0xa9, 0xad, 0x1e, 0x72, 0xc9, 0x63, 0xab, 0x41, 0x5a, 0x26, 0x32, 0x39, -+}; -+ -+static unsigned char dh_except_b_pubkey_3072[] = { -+ 0x44, 0x58, 0xe8, 0x62, 0xc8, 0xd2, 0xb5, 0x45, 0x1f, 0xa5, 0xc3, 0xdb, 0x8e, 0x69, 0x42, 0xd2, -+ 0x21, 0x7e, 0x6b, 0x26, 0x69, 0x45, 0xf1, 0x33, 0xcf, 0xd7, 0xe6, 0x6e, 0x64, 0xc3, 0x29, 0xa5, -+ 0x68, 0x49, 0x3d, 0x13, 0x0b, 0x42, 0x36, 0xa6, 0xf4, 0xb1, 0xab, 0xa3, 0x8f, 0xe6, 0xcf, 0x46, -+ 0xe8, 0x85, 0xf3, 0xaa, 0xcb, 0x9, 0x84, 0x32, 0x34, 0xf7, 0x46, 0x0a, 0x65, 0xf9, 0xb5, 0x97, -+ 0xc2, 0x4a, 0x6f, 0x41, 0x40, 0xc9, 0x9e, 0x63, 0xe1, 0x0f, 0xd2, 0x12, 0x59, 0x35, 0xcc, 0x39, -+ 0x99, 0x4, 0xe8, 0x9a, 0xd2, 0x0, 0x7a, 0xce, 0x3c, 0x78, 0xfe, 0xea, 0x4b, 0x13, 0x53, 0xcd, -+ 0xc3, 0x60, 0x73, 0xa4, 0x3f, 0xbc, 0x8a, 0x8d, 0x61, 0x1c, 0xfa, 0xaf, 0xb7, 0xf8, 0x37, 0xa5, -+ 0xe2, 0x3a, 0xd2, 0x7a, 0xb6, 0x0, 0xf3, 0xd8, 0x3a, 0xa2, 0x46, 0xd2, 0x5c, 0x91, 0xc1, 0x5, -+ 0x6a, 0xf3, 0x2c, 0xd2, 0x2d, 0x55, 0xc1, 0x54, 0x40, 0x18, 0x71, 0x7, 0x96, 0xa9, 0x56, 0x6e, -+ 0x45, 0x58, 0x24, 0xce, 0x75, 0x80, 0x3, 0x68, 0x36, 0x96, 0x3, 0xb2, 0x9c, 0x25, 0xbc, 0x55, -+ 0x0d, 0xe8, 0xa1, 0x7d, 0xdd, 0x39, 0x87, 0x3c, 0xa1, 0x6a, 0xeb, 0x1b, 0x4f, 0x14, 0x72, 0x88, -+ 0x6c, 0x14, 0x6d, 0x24, 0xb7, 0xda, 0xf8, 0x97, 0xaa, 0xba, 0xb4, 0xdd, 0xc9, 0x5b, 0x28, 0x10, -+ 0x49, 0xfa, 0x93, 0xcc, 0x62, 0xc0, 0x70, 0xf8, 0xd6, 0xdc, 0xb2, 0x80, 0x35, 0x20, 0x84, 0xa4, -+ 0x99, 0xfc, 0x10, 0x7c, 0x9d, 0xc0, 0xc6, 0xd4, 0x8b, 0x0c, 0x57, 0xf1, 0x1, 0xf5, 0x1a, 0x4f, -+ 0x20, 0xfa, 0x8d, 0x66, 0x8b, 0x22, 0x3c, 0x96, 0xef, 0xd0, 0xde, 0xe5, 0x7e, 0x7f, 0x23, 0xdc, -+ 0x6d, 0x71, 0xdf, 0xc3, 0xe5, 0x1b, 0x39, 0xfe, 0xb7, 0x77, 0xe5, 0x72, 0x0d, 0x1c, 0x8d, 0xb7, -+ 0x44, 0x58, 0xe8, 0x62, 0xc8, 0xd2, 0xb5, 0x45, 0x1f, 0xa5, 0xc3, 0xdb, 0x8e, 0x69, 0x42, 0xd2, -+ 0x21, 0x7e, 0x6b, 0x26, 0x69, 0x45, 0xf1, 0x33, 0xcf, 0xd7, 0xe6, 0x6e, 0x64, 0xc3, 0x29, 0xa5, -+ 0x68, 0x49, 0x3d, 0x13, 0x0b, 0x42, 0x36, 0xa6, 0xf4, 0xb1, 0xab, 0xa3, 0x8f, 0xe6, 0xcf, 0x46, -+ 0xe8, 0x85, 0xf3, 0xaa, 0xcb, 0x9, 0x84, 0x32, 0x34, 0xf7, 0x46, 0x0a, 0x65, 0xf9, 0xb5, 0x97, -+ 0xc2, 0x4a, 0x6f, 0x41, 0x40, 0xc9, 0x9e, 0x63, 0xe1, 0x0f, 0xd2, 0x12, 0x59, 0x35, 0xcc, 0x39, -+ 0x99, 0x4, 0xe8, 0x9a, 0xd2, 0x0, 0x7a, 0xce, 0x3c, 0x78, 0xfe, 0xea, 0x4b, 0x13, 0x53, 0xcd, -+ 0xc3, 0x60, 0x73, 0xa4, 0x3f, 0xbc, 0x8a, 0x8d, 0x61, 0x1c, 0xfa, 0xaf, 0xb7, 0xf8, 0x37, 0xa5, -+ 0xe2, 0x3a, 0xd2, 0x7a, 0xb6, 0x0, 0xf3, 0xd8, 0x3a, 0xa2, 0x46, 0xd2, 0x5c, 0x91, 0xc1, 0x5, -+}; -+ -+static unsigned char dh_share_key_3072[] = { -+ 0xaf, 0xd4, 0xf6, 0x45, 0x63, 0x21, 0x8d, 0x98, 0xc4, 0xab, 0x18, 0xd7, 0x2b, 0x3c, 0x1d, 0xde, -+ 0xe7, 0x1f, 0xe1, 0xc5, 0x79, 0x57, 0x60, 0x20, 0xfa, 0x99, 0xbd, 0x7b, 0xa2, 0x94, 0x0b, 0xa3, -+ 0xb4, 0xb3, 0x33, 0x4a, 0x2f, 0xd0, 0x17, 0x7, 0x2e, 0x70, 0x19, 0x84, 0x1f, 0x8e, 0xe9, 0x61, -+ 0xe5, 0x52, 0x3, 0x96, 0xea, 0xd8, 0xb6, 0x3, 0x9f, 0xc4, 0x3e, 0x23, 0x77, 0x17, 0x54, 0xfb, -+ 0x13, 0xf0, 0x3e, 0x9a, 0x27, 0x5d, 0x12, 0x99, 0x58, 0x8d, 0x41, 0x46, 0xd9, 0xc9, 0x29, 0xbd, -+ 0x40, 0xd1, 0x4f, 0xef, 0x63, 0x7b, 0x54, 0xe6, 0x59, 0x6d, 0xe2, 0x30, 0xe8, 0x2c, 0x2f, 0xf9, -+ 0x66, 0xa2, 0x12, 0xf5, 0x58, 0x61, 0xac, 0x43, 0xec, 0x7e, 0xf9, 0x2e, 0x27, 0x70, 0x35, 0x75, -+ 0xb4, 0x10, 0x29, 0xac, 0x0a, 0xab, 0x59, 0xb6, 0x68, 0x4c, 0x16, 0xaf, 0xf0, 0x4f, 0x21, 0xcd, -+ 0xcc, 0x48, 0x97, 0xe4, 0x21, 0x65, 0xa6, 0x55, 0xb8, 0xf3, 0xb2, 0x7b, 0x91, 0xd7, 0xca, 0xb9, -+ 0x17, 0x58, 0x31, 0x71, 0xc0, 0xc9, 0x69, 0x1e, 0xf0, 0x9e, 0x3f, 0xe2, 0x37, 0x4, 0x2d, 0xa8, -+ 0x55, 0x9, 0x6b, 0x9c, 0xc6, 0x37, 0xa9, 0x9b, 0xdf, 0x67, 0x73, 0x7b, 0x46, 0xf9, 0x63, 0x47, -+ 0xcb, 0xa0, 0x57, 0x2a, 0xed, 0x97, 0x2f, 0xfe, 0x92, 0xf2, 0x20, 0x2c, 0x7e, 0xee, 0x7d, 0x11, -+ 0x78, 0xe6, 0xb9, 0x9, 0xd1, 0x94, 0xce, 0xd1, 0x5b, 0xf4, 0x44, 0xa9, 0xcb, 0x26, 0x2, 0x36, -+ 0x57, 0x2c, 0xa2, 0xbe, 0x37, 0xde, 0x86, 0x46, 0x20, 0x27, 0x9d, 0xa0, 0x2f, 0x4, 0xc1, 0xcd, -+ 0xff, 0x81, 0xe5, 0xe6, 0x2c, 0x9e, 0x39, 0x82, 0x31, 0x54, 0x33, 0xf8, 0xe7, 0xa0, 0xe5, 0x96, -+ 0xa4, 0x40, 0xc4, 0x44, 0xfe, 0x93, 0x66, 0xe2, 0xda, 0xaa, 0xb8, 0xfb, 0x2f, 0x3b, 0x8c, 0xce, -+ 0xaf, 0xd4, 0xf6, 0x45, 0x63, 0x21, 0x8d, 0x98, 0xc4, 0xab, 0x18, 0xd7, 0x2b, 0x3c, 0x1d, 0xde, -+ 0xe7, 0x1f, 0xe1, 0xc5, 0x79, 0x57, 0x60, 0x20, 0xfa, 0x99, 0xbd, 0x7b, 0xa2, 0x94, 0x0b, 0xa3, -+ 0xb4, 0xb3, 0x33, 0x4a, 0x2f, 0xd0, 0x17, 0x7, 0x2e, 0x70, 0x19, 0x84, 0x1f, 0x8e, 0xe9, 0x61, -+ 0xe5, 0x52, 0x3, 0x96, 0xea, 0xd8, 0xb6, 0x3, 0x9f, 0xc4, 0x3e, 0x23, 0x77, 0x17, 0x54, 0xfb, -+ 0x13, 0xf0, 0x3e, 0x9a, 0x27, 0x5d, 0x12, 0x99, 0x58, 0x8d, 0x41, 0x46, 0xd9, 0xc9, 0x29, 0xbd, -+ 0x40, 0xd1, 0x4f, 0xef, 0x63, 0x7b, 0x54, 0xe6, 0x59, 0x6d, 0xe2, 0x30, 0xe8, 0x2c, 0x2f, 0xf9, -+ 0x66, 0xa2, 0x12, 0xf5, 0x58, 0x61, 0xac, 0x43, 0xec, 0x7e, 0xf9, 0x2e, 0x27, 0x70, 0x35, 0x75, -+ 0xb4, 0x10, 0x29, 0xac, 0x0a, 0xab, 0x59, 0xb6, 0x68, 0x4c, 0x16, 0xaf, 0xf0, 0x4f, 0x21, 0xcd, -+}; -+ -+static unsigned char dh_p_4096[] = { -+ 0xce, 0x58, 0xe8, 0x62, 0xc8, 0xd2, 0xb5, 0x45, 0x1f, 0xa5, 0xc3, 0xdb, 0x8e, 0x69, 0x42, 0xd2, -+ 0x21, 0x7e, 0x6b, 0x26, 0x69, 0x45, 0xf1, 0x33, 0xcf, 0xd7, 0xe6, 0x6e, 0x64, 0xc3, 0x29, 0xa5, -+ 0x68, 0x49, 0x3d, 0x13, 0x0b, 0x42, 0x36, 0xa6, 0xf4, 0xb1, 0xab, 0xa3, 0x8f, 0xe6, 0xcf, 0x46, -+ 0xe8, 0x85, 0xf3, 0xaa, 0xcb, 0x09, 0x84, 0x32, 0x34, 0xf7, 0x46, 0x0a, 0x65, 0xf9, 0xb5, 0x97, -+ 0xc2, 0x4a, 0x6f, 0x41, 0x40, 0xc9, 0x9e, 0x63, 0xe1, 0x0f, 0xd2, 0x12, 0x59, 0x35, 0xcc, 0x39, -+ 0x99, 0x04, 0xe8, 0x9a, 0xd2, 0x00, 0x7a, 0xce, 0x3c, 0x78, 0xfe, 0xea, 0x4b, 0x13, 0x53, 0xcd, -+ 0xc3, 0x60, 0x73, 0xa4, 0x3f, 0xbc, 0x8a, 0x8d, 0x61, 0x1c, 0xfa, 0xaf, 0xb7, 0xf8, 0x37, 0xa5, -+ 0xe2, 0x3a, 0xd2, 0x7a, 0xb6, 0x00, 0xf3, 0xd8, 0x3a, 0xa2, 0x46, 0xd2, 0x5c, 0x91, 0xc1, 0x05, -+ 0x6a, 0xf3, 0x2c, 0xd2, 0x2d, 0x55, 0xc1, 0x54, 0x40, 0x18, 0x71, 0x07, 0x96, 0xa9, 0x56, 0x6e, -+ 0x45, 0x58, 0x24, 0xce, 0x75, 0x80, 0x3, 0x68, 0x36, 0x96, 0x03, 0xb2, 0x9c, 0x25, 0xbc, 0x55, -+ 0x0d, 0xe8, 0xa1, 0x7d, 0xdd, 0x39, 0x87, 0x3c, 0xa1, 0x6a, 0xeb, 0x1b, 0x4f, 0x14, 0x72, 0x88, -+ 0x6c, 0x14, 0x6d, 0x24, 0xb7, 0xda, 0xf8, 0x97, 0xaa, 0xba, 0xb4, 0xdd, 0xc9, 0x5b, 0x28, 0x10, -+ 0x49, 0xfa, 0x93, 0xcc, 0x62, 0xc0, 0x70, 0xf8, 0xd6, 0xdc, 0xb2, 0x80, 0x35, 0x20, 0x84, 0xa4, -+ 0x99, 0xfc, 0x10, 0x7c, 0x9d, 0xc0, 0xc6, 0xd4, 0x8b, 0x0c, 0x57, 0xf1, 0x01, 0xf5, 0x1a, 0x4f, -+ 0x20, 0xfa, 0x8d, 0x66, 0x8b, 0x22, 0x3c, 0x96, 0xef, 0xd0, 0xde, 0xe5, 0x7e, 0x7f, 0x23, 0xdc, -+ 0x6d, 0x71, 0xdf, 0xc3, 0xe5, 0x1b, 0x39, 0xfe, 0xb7, 0x77, 0xe5, 0x72, 0x0d, 0x1c, 0x8d, 0xb7, -+ 0xce, 0x58, 0xe8, 0x62, 0xc8, 0xd2, 0xb5, 0x45, 0x1f, 0xa5, 0xc3, 0xdb, 0x8e, 0x69, 0x42, 0xd2, -+ 0x21, 0x7e, 0x6b, 0x26, 0x69, 0x45, 0xf1, 0x33, 0xcf, 0xd7, 0xe6, 0x6e, 0x64, 0xc3, 0x29, 0xa5, -+ 0x68, 0x49, 0x3d, 0x13, 0x0b, 0x42, 0x36, 0xa6, 0xf4, 0xb1, 0xab, 0xa3, 0x8f, 0xe6, 0xcf, 0x46, -+ 0xe8, 0x85, 0xf3, 0xaa, 0xcb, 0x09, 0x84, 0x32, 0x34, 0xf7, 0x46, 0x0a, 0x65, 0xf9, 0xb5, 0x97, -+ 0xc2, 0x4a, 0x6f, 0x41, 0x40, 0xc9, 0x9e, 0x63, 0xe1, 0x0f, 0xd2, 0x12, 0x59, 0x35, 0xcc, 0x39, -+ 0x99, 0x04, 0xe8, 0x9a, 0xd2, 0x00, 0x7a, 0xce, 0x3c, 0x78, 0xfe, 0xea, 0x4b, 0x13, 0x53, 0xcd, -+ 0xc3, 0x60, 0x73, 0xa4, 0x3f, 0xbc, 0x8a, 0x8d, 0x61, 0x1c, 0xfa, 0xaf, 0xb7, 0xf8, 0x37, 0xa5, -+ 0xe2, 0x3a, 0xd2, 0x7a, 0xb6, 0x00, 0xf3, 0xd8, 0x3a, 0xa2, 0x46, 0xd2, 0x5c, 0x91, 0xc1, 0x05, -+ 0x6a, 0xf3, 0x2c, 0xd2, 0x2d, 0x55, 0xc1, 0x54, 0x40, 0x18, 0x71, 0x07, 0x96, 0xa9, 0x56, 0x6e, -+ 0x45, 0x58, 0x24, 0xce, 0x75, 0x80, 0x3, 0x68, 0x36, 0x96, 0x03, 0xb2, 0x9c, 0x25, 0xbc, 0x55, -+ 0x0d, 0xe8, 0xa1, 0x7d, 0xdd, 0x39, 0x87, 0x3c, 0xa1, 0x6a, 0xeb, 0x1b, 0x4f, 0x14, 0x72, 0x88, -+ 0x6c, 0x14, 0x6d, 0x24, 0xb7, 0xda, 0xf8, 0x97, 0xaa, 0xba, 0xb4, 0xdd, 0xc9, 0x5b, 0x28, 0x10, -+ 0x49, 0xfa, 0x93, 0xcc, 0x62, 0xc0, 0x70, 0xf8, 0xd6, 0xdc, 0xb2, 0x80, 0x35, 0x20, 0x84, 0xa4, -+ 0x99, 0xfc, 0x10, 0x7c, 0x9d, 0xc0, 0xc6, 0xd4, 0x8b, 0x0c, 0x57, 0xf1, 0x01, 0xf5, 0x1a, 0x4f, -+ 0x20, 0xfa, 0x8d, 0x66, 0x8b, 0x22, 0x3c, 0x96, 0xef, 0xd0, 0xde, 0xe5, 0x7e, 0x7f, 0x23, 0xdc, -+ 0x6d, 0x71, 0xdf, 0xc3, 0xe5, 0x1b, 0x39, 0xfe, 0xb7, 0x77, 0xe5, 0x72, 0x0d, 0x1c, 0x8d, 0xb7 -+}; -+ -+static unsigned char dh_xa_4096[] = { -+ 0x6b, 0x1f, 0xc4, 0x85, 0x98, 0xc3, 0x01, 0xda, 0x39, 0xf0, 0x1b, 0x76, 0x5d, 0x81, 0x1d, 0x1f, -+ 0xc9, 0x93, 0x95, 0xc1, 0xf8, 0xd1, 0x67, 0x2c, 0xd4, 0x0a, 0x67, 0xf0, 0x40, 0x86, 0x82, 0x7f, -+ 0x8f, 0x9d, 0x79, 0x04, 0xee, 0x4a, 0x54, 0xc9, 0x9c, 0x7f, 0xda, 0x15, 0x13, 0xc6, 0x95, 0xfb, -+ 0xfc, 0x7b, 0xe7, 0xd8, 0xde, 0x2a, 0xd8, 0xfd, 0xff, 0xdb, 0xa4, 0x7f, 0x4b, 0x37, 0x5d, 0x42, -+ 0xb6, 0x46, 0x4c, 0xbc, 0x34, 0x23, 0x99, 0x74, 0xf8, 0x80, 0x1b, 0xc1, 0x97, 0x34, 0xdf, 0x23, -+ 0x15, 0xa2, 0x8b, 0xec, 0xf3, 0x3e, 0x20, 0x93, 0x63, 0x88, 0x17, 0x70, 0x75, 0xbb, 0x9d, 0xb8, -+ 0x32, 0xb0, 0xae, 0xb5, 0x24, 0x6a, 0x86, 0xf6, 0xc1, 0x60, 0x41, 0xc4, 0xf4, 0x95, 0x6e, 0x10, -+ 0x2f, 0xd8, 0x58, 0x56, 0x42, 0x82, 0x71, 0x85, 0x19, 0xde, 0x91, 0xf0, 0x2f, 0x30, 0x0c, 0x63, -+ 0x0f, 0x2a, 0x77, 0x25, 0x4b, 0xb3, 0xd3, 0x2d, 0xfd, 0x94, 0x8b, 0x53, 0x02, 0x21, 0x40, 0xd7, -+ 0x36, 0x76, 0xf3, 0xc8, 0xc0, 0x36, 0x3d, 0x23, 0xc9, 0xbd, 0x92, 0x51, 0xf2, 0x4b, 0x83, 0x15, -+ 0xe0, 0x80, 0x86, 0x24, 0xe2, 0x20, 0x35, 0x97, 0xda, 0x0e, 0x68, 0x39, 0x01, 0xdd, 0x01, 0x87, -+ 0xa2, 0x47, 0xd2, 0x0d, 0xee, 0xfe, 0xdc, 0x5a, 0x37, 0x23, 0xeb, 0x3d, 0xe8, 0x1e, 0x39, 0x2d, -+ 0xbf, 0xa6, 0xe9, 0x17, 0x48, 0xe2, 0xea, 0xef, 0x1d, 0x2f, 0xe2, 0xaf, 0x3c, 0xbc, 0xae, 0xa7, -+ 0x42, 0x9b, 0xa5, 0x7d, 0x47, 0x8a, 0x20, 0xc5, 0xae, 0xa1, 0xe4, 0xe8, 0x1c, 0x05, 0xc0, 0x0a, -+ 0x05, 0xdc, 0x01, 0x74, 0xde, 0xad, 0xad, 0x07, 0xec, 0x6e, 0x6a, 0xc7, 0xee, 0x0f, 0xb8, 0xbe, -+ 0xaa, 0x46, 0x61, 0x8c, 0x12, 0x5a, 0xaf, 0x05, 0xff, 0x1b, 0x35, 0x6b, 0xe2, 0x3d, 0x48, 0x4f, -+ 0x6b, 0x1f, 0xc4, 0x85, 0x98, 0xc3, 0x01, 0xda, 0x39, 0xf0, 0x1b, 0x76, 0x5d, 0x81, 0x1d, 0x1f, -+ 0xc9, 0x93, 0x95, 0xc1, 0xf8, 0xd1, 0x67, 0x2c, 0xd4, 0x0a, 0x67, 0xf0, 0x40, 0x86, 0x82, 0x7f, -+ 0x8f, 0x9d, 0x79, 0x04, 0xee, 0x4a, 0x54, 0xc9, 0x9c, 0x7f, 0xda, 0x15, 0x13, 0xc6, 0x95, 0xfb, -+ 0xfc, 0x7b, 0xe7, 0xd8, 0xde, 0x2a, 0xd8, 0xfd, 0xff, 0xdb, 0xa4, 0x7f, 0x4b, 0x37, 0x5d, 0x42, -+ 0xb6, 0x46, 0x4c, 0xbc, 0x34, 0x23, 0x99, 0x74, 0xf8, 0x80, 0x1b, 0xc1, 0x97, 0x34, 0xdf, 0x23, -+ 0x15, 0xa2, 0x8b, 0xec, 0xf3, 0x3e, 0x20, 0x93, 0x63, 0x88, 0x17, 0x70, 0x75, 0xbb, 0x9d, 0xb8, -+ 0x32, 0xb0, 0xae, 0xb5, 0x24, 0x6a, 0x86, 0xf6, 0xc1, 0x60, 0x41, 0xc4, 0xf4, 0x95, 0x6e, 0x10, -+ 0x2f, 0xd8, 0x58, 0x56, 0x42, 0x82, 0x71, 0x85, 0x19, 0xde, 0x91, 0xf0, 0x2f, 0x30, 0x0c, 0x63, -+ 0x0f, 0x2a, 0x77, 0x25, 0x4b, 0xb3, 0xd3, 0x2d, 0xfd, 0x94, 0x8b, 0x53, 0x02, 0x21, 0x40, 0xd7, -+ 0x36, 0x76, 0xf3, 0xc8, 0xc0, 0x36, 0x3d, 0x23, 0xc9, 0xbd, 0x92, 0x51, 0xf2, 0x4b, 0x83, 0x15, -+ 0xe0, 0x80, 0x86, 0x24, 0xe2, 0x20, 0x35, 0x97, 0xda, 0x0e, 0x68, 0x39, 0x01, 0xdd, 0x01, 0x87, -+ 0xa2, 0x47, 0xd2, 0x0d, 0xee, 0xfe, 0xdc, 0x5a, 0x37, 0x23, 0xeb, 0x3d, 0xe8, 0x1e, 0x39, 0x2d, -+ 0xbf, 0xa6, 0xe9, 0x17, 0x48, 0xe2, 0xea, 0xef, 0x1d, 0x2f, 0xe2, 0xaf, 0x3c, 0xbc, 0xae, 0xa7, -+ 0x42, 0x9b, 0xa5, 0x7d, 0x47, 0x8a, 0x20, 0xc5, 0xae, 0xa1, 0xe4, 0xe8, 0x1c, 0x05, 0xc0, 0x0a, -+ 0x05, 0xdc, 0x01, 0x74, 0xde, 0xad, 0xad, 0x07, 0xec, 0x6e, 0x6a, 0xc7, 0xee, 0x0f, 0xb8, 0xbe, -+ 0xaa, 0x46, 0x61, 0x8c, 0x12, 0x5a, 0xaf, 0x05, 0xff, 0x1b, 0x35, 0x6b, 0xe2, 0x3d, 0x48, 0x4f -+}; -+ -+static unsigned char dh_except_a_pubkey_4096[] = { -+ 0xa5, 0x24, 0x63, 0x20, 0xb2, 0x56, 0x9a, 0x94, 0x97, 0xf7, 0x88, 0x41, 0x35, 0xeb, 0x52, 0x37, -+ 0xa4, 0xf2, 0x74, 0x1b, 0x38, 0xe4, 0x4c, 0x8b, 0x4b, 0xd2, 0xa5, 0xad, 0xb8, 0x2f, 0x7b, 0x5a, -+ 0xfd, 0xbc, 0x9c, 0xe0, 0xea, 0x9e, 0x82, 0x3, 0x62, 0xe2, 0xdc, 0x6c, 0x56, 0x9, 0x2, 0x28, -+ 0xb8, 0x2d, 0xb8, 0x46, 0xaf, 0x3a, 0xf4, 0x51, 0xf7, 0x4d, 0xc4, 0xd9, 0xa9, 0x1d, 0x67, 0x9d, -+ 0x2b, 0x18, 0x56, 0x86, 0x2a, 0x3, 0x19, 0xe9, 0x6, 0xeb, 0x4a, 0x6f, 0x2a, 0x40, 0x28, 0xbb, -+ 0x3e, 0x87, 0xc1, 0xce, 0x39, 0x6e, 0x3b, 0x1f, 0xb0, 0x9, 0x33, 0x67, 0x19, 0x0e, 0x1a, 0xb2, -+ 0xb3, 0x7d, 0xd3, 0xe6, 0x33, 0xf4, 0x7c, 0x82, 0x73, 0x7b, 0xb6, 0x16, 0x55, 0xff, 0x76, 0xaf, -+ 0x7f, 0xc2, 0x42, 0x51, 0xa9, 0xad, 0x1e, 0x72, 0xc9, 0x63, 0xab, 0x41, 0x5a, 0x26, 0x32, 0x39, -+ 0x5d, 0xa6, 0x7, 0x56, 0x93, 0x89, 0xe5, 0x0f, 0x2a, 0xb5, 0x67, 0x3a, 0xcf, 0xc3, 0x82, 0x83, -+ 0xf6, 0x88, 0x52, 0x0b, 0xfc, 0x6a, 0x5b, 0x1a, 0x57, 0x87, 0x86, 0xef, 0xda, 0x47, 0xdb, 0x4d, -+ 0xba, 0xe7, 0x3, 0x5b, 0xe4, 0x70, 0x8b, 0xe0, 0xe1, 0x92, 0x13, 0x86, 0x74, 0x4, 0xdc, 0x6a, -+ 0x0a, 0x2a, 0x20, 0xec, 0x6d, 0xbf, 0xf0, 0x46, 0xf7, 0x9, 0x2, 0xdb, 0x2f, 0x70, 0x11, 0xdd, -+ 0xb0, 0x13, 0xa2, 0xc1, 0x58, 0x74, 0x29, 0x19, 0x8d, 0x4a, 0x94, 0x80, 0x0b, 0xd7, 0x25, 0x85, -+ 0x10, 0x35, 0x97, 0x48, 0x6e, 0x70, 0x28, 0xae, 0x58, 0x97, 0x7d, 0xf2, 0x19, 0x27, 0x13, 0xab, -+ 0x47, 0x9b, 0x54, 0xdf, 0xc3, 0x5b, 0x5f, 0x5e, 0xb4, 0x64, 0x47, 0xce, 0x40, 0x3b, 0x0c, 0x4a, -+ 0x62, 0x52, 0xba, 0xc7, 0xf0, 0x36, 0x87, 0x9c, 0x79, 0x9a, 0x83, 0x11, 0x61, 0x0c, 0x1b, 0x6b, -+ 0xa5, 0x24, 0x63, 0x20, 0xb2, 0x56, 0x9a, 0x94, 0x97, 0xf7, 0x88, 0x41, 0x35, 0xeb, 0x52, 0x37, -+ 0xa4, 0xf2, 0x74, 0x1b, 0x38, 0xe4, 0x4c, 0x8b, 0x4b, 0xd2, 0xa5, 0xad, 0xb8, 0x2f, 0x7b, 0x5a, -+ 0xfd, 0xbc, 0x9c, 0xe0, 0xea, 0x9e, 0x82, 0x3, 0x62, 0xe2, 0xdc, 0x6c, 0x56, 0x9, 0x2, 0x28, -+ 0xb8, 0x2d, 0xb8, 0x46, 0xaf, 0x3a, 0xf4, 0x51, 0xf7, 0x4d, 0xc4, 0xd9, 0xa9, 0x1d, 0x67, 0x9d, -+ 0x2b, 0x18, 0x56, 0x86, 0x2a, 0x3, 0x19, 0xe9, 0x6, 0xeb, 0x4a, 0x6f, 0x2a, 0x40, 0x28, 0xbb, -+ 0x3e, 0x87, 0xc1, 0xce, 0x39, 0x6e, 0x3b, 0x1f, 0xb0, 0x9, 0x33, 0x67, 0x19, 0x0e, 0x1a, 0xb2, -+ 0xb3, 0x7d, 0xd3, 0xe6, 0x33, 0xf4, 0x7c, 0x82, 0x73, 0x7b, 0xb6, 0x16, 0x55, 0xff, 0x76, 0xaf, -+ 0x7f, 0xc2, 0x42, 0x51, 0xa9, 0xad, 0x1e, 0x72, 0xc9, 0x63, 0xab, 0x41, 0x5a, 0x26, 0x32, 0x39, -+ 0x5d, 0xa6, 0x7, 0x56, 0x93, 0x89, 0xe5, 0x0f, 0x2a, 0xb5, 0x67, 0x3a, 0xcf, 0xc3, 0x82, 0x83, -+ 0xf6, 0x88, 0x52, 0x0b, 0xfc, 0x6a, 0x5b, 0x1a, 0x57, 0x87, 0x86, 0xef, 0xda, 0x47, 0xdb, 0x4d, -+ 0xba, 0xe7, 0x3, 0x5b, 0xe4, 0x70, 0x8b, 0xe0, 0xe1, 0x92, 0x13, 0x86, 0x74, 0x4, 0xdc, 0x6a, -+ 0x0a, 0x2a, 0x20, 0xec, 0x6d, 0xbf, 0xf0, 0x46, 0xf7, 0x9, 0x2, 0xdb, 0x2f, 0x70, 0x11, 0xdd, -+ 0xb0, 0x13, 0xa2, 0xc1, 0x58, 0x74, 0x29, 0x19, 0x8d, 0x4a, 0x94, 0x80, 0x0b, 0xd7, 0x25, 0x85, -+ 0x10, 0x35, 0x97, 0x48, 0x6e, 0x70, 0x28, 0xae, 0x58, 0x97, 0x7d, 0xf2, 0x19, 0x27, 0x13, 0xab, -+ 0x47, 0x9b, 0x54, 0xdf, 0xc3, 0x5b, 0x5f, 0x5e, 0xb4, 0x64, 0x47, 0xce, 0x40, 0x3b, 0x0c, 0x4a, -+ 0x62, 0x52, 0xba, 0xc7, 0xf0, 0x36, 0x87, 0x9c, 0x79, 0x9a, 0x83, 0x11, 0x61, 0x0c, 0x1b, 0x6b -+}; -+ -+static unsigned char dh_except_b_pubkey_4096[] = { -+ 0x44, 0x58, 0xe8, 0x62, 0xc8, 0xd2, 0xb5, 0x45, 0x1f, 0xa5, 0xc3, 0xdb, 0x8e, 0x69, 0x42, 0xd2, -+ 0x21, 0x7e, 0x6b, 0x26, 0x69, 0x45, 0xf1, 0x33, 0xcf, 0xd7, 0xe6, 0x6e, 0x64, 0xc3, 0x29, 0xa5, -+ 0x68, 0x49, 0x3d, 0x13, 0x0b, 0x42, 0x36, 0xa6, 0xf4, 0xb1, 0xab, 0xa3, 0x8f, 0xe6, 0xcf, 0x46, -+ 0xe8, 0x85, 0xf3, 0xaa, 0xcb, 0x9, 0x84, 0x32, 0x34, 0xf7, 0x46, 0x0a, 0x65, 0xf9, 0xb5, 0x97, -+ 0xc2, 0x4a, 0x6f, 0x41, 0x40, 0xc9, 0x9e, 0x63, 0xe1, 0x0f, 0xd2, 0x12, 0x59, 0x35, 0xcc, 0x39, -+ 0x99, 0x4, 0xe8, 0x9a, 0xd2, 0x0, 0x7a, 0xce, 0x3c, 0x78, 0xfe, 0xea, 0x4b, 0x13, 0x53, 0xcd, -+ 0xc3, 0x60, 0x73, 0xa4, 0x3f, 0xbc, 0x8a, 0x8d, 0x61, 0x1c, 0xfa, 0xaf, 0xb7, 0xf8, 0x37, 0xa5, -+ 0xe2, 0x3a, 0xd2, 0x7a, 0xb6, 0x0, 0xf3, 0xd8, 0x3a, 0xa2, 0x46, 0xd2, 0x5c, 0x91, 0xc1, 0x5, -+ 0x6a, 0xf3, 0x2c, 0xd2, 0x2d, 0x55, 0xc1, 0x54, 0x40, 0x18, 0x71, 0x7, 0x96, 0xa9, 0x56, 0x6e, -+ 0x45, 0x58, 0x24, 0xce, 0x75, 0x80, 0x3, 0x68, 0x36, 0x96, 0x3, 0xb2, 0x9c, 0x25, 0xbc, 0x55, -+ 0x0d, 0xe8, 0xa1, 0x7d, 0xdd, 0x39, 0x87, 0x3c, 0xa1, 0x6a, 0xeb, 0x1b, 0x4f, 0x14, 0x72, 0x88, -+ 0x6c, 0x14, 0x6d, 0x24, 0xb7, 0xda, 0xf8, 0x97, 0xaa, 0xba, 0xb4, 0xdd, 0xc9, 0x5b, 0x28, 0x10, -+ 0x49, 0xfa, 0x93, 0xcc, 0x62, 0xc0, 0x70, 0xf8, 0xd6, 0xdc, 0xb2, 0x80, 0x35, 0x20, 0x84, 0xa4, -+ 0x99, 0xfc, 0x10, 0x7c, 0x9d, 0xc0, 0xc6, 0xd4, 0x8b, 0x0c, 0x57, 0xf1, 0x1, 0xf5, 0x1a, 0x4f, -+ 0x20, 0xfa, 0x8d, 0x66, 0x8b, 0x22, 0x3c, 0x96, 0xef, 0xd0, 0xde, 0xe5, 0x7e, 0x7f, 0x23, 0xdc, -+ 0x6d, 0x71, 0xdf, 0xc3, 0xe5, 0x1b, 0x39, 0xfe, 0xb7, 0x77, 0xe5, 0x72, 0x0d, 0x1c, 0x8d, 0xb7, -+ 0x44, 0x58, 0xe8, 0x62, 0xc8, 0xd2, 0xb5, 0x45, 0x1f, 0xa5, 0xc3, 0xdb, 0x8e, 0x69, 0x42, 0xd2, -+ 0x21, 0x7e, 0x6b, 0x26, 0x69, 0x45, 0xf1, 0x33, 0xcf, 0xd7, 0xe6, 0x6e, 0x64, 0xc3, 0x29, 0xa5, -+ 0x68, 0x49, 0x3d, 0x13, 0x0b, 0x42, 0x36, 0xa6, 0xf4, 0xb1, 0xab, 0xa3, 0x8f, 0xe6, 0xcf, 0x46, -+ 0xe8, 0x85, 0xf3, 0xaa, 0xcb, 0x9, 0x84, 0x32, 0x34, 0xf7, 0x46, 0x0a, 0x65, 0xf9, 0xb5, 0x97, -+ 0xc2, 0x4a, 0x6f, 0x41, 0x40, 0xc9, 0x9e, 0x63, 0xe1, 0x0f, 0xd2, 0x12, 0x59, 0x35, 0xcc, 0x39, -+ 0x99, 0x4, 0xe8, 0x9a, 0xd2, 0x0, 0x7a, 0xce, 0x3c, 0x78, 0xfe, 0xea, 0x4b, 0x13, 0x53, 0xcd, -+ 0xc3, 0x60, 0x73, 0xa4, 0x3f, 0xbc, 0x8a, 0x8d, 0x61, 0x1c, 0xfa, 0xaf, 0xb7, 0xf8, 0x37, 0xa5, -+ 0xe2, 0x3a, 0xd2, 0x7a, 0xb6, 0x0, 0xf3, 0xd8, 0x3a, 0xa2, 0x46, 0xd2, 0x5c, 0x91, 0xc1, 0x5, -+ 0x6a, 0xf3, 0x2c, 0xd2, 0x2d, 0x55, 0xc1, 0x54, 0x40, 0x18, 0x71, 0x7, 0x96, 0xa9, 0x56, 0x6e, -+ 0x45, 0x58, 0x24, 0xce, 0x75, 0x80, 0x3, 0x68, 0x36, 0x96, 0x3, 0xb2, 0x9c, 0x25, 0xbc, 0x55, -+ 0x0d, 0xe8, 0xa1, 0x7d, 0xdd, 0x39, 0x87, 0x3c, 0xa1, 0x6a, 0xeb, 0x1b, 0x4f, 0x14, 0x72, 0x88, -+ 0x6c, 0x14, 0x6d, 0x24, 0xb7, 0xda, 0xf8, 0x97, 0xaa, 0xba, 0xb4, 0xdd, 0xc9, 0x5b, 0x28, 0x10, -+ 0x49, 0xfa, 0x93, 0xcc, 0x62, 0xc0, 0x70, 0xf8, 0xd6, 0xdc, 0xb2, 0x80, 0x35, 0x20, 0x84, 0xa4, -+ 0x99, 0xfc, 0x10, 0x7c, 0x9d, 0xc0, 0xc6, 0xd4, 0x8b, 0x0c, 0x57, 0xf1, 0x1, 0xf5, 0x1a, 0x4f, -+ 0x20, 0xfa, 0x8d, 0x66, 0x8b, 0x22, 0x3c, 0x96, 0xef, 0xd0, 0xde, 0xe5, 0x7e, 0x7f, 0x23, 0xdc, -+ 0x6d, 0x71, 0xdf, 0xc3, 0xe5, 0x1b, 0x39, 0xfe, 0xb7, 0x77, 0xe5, 0x72, 0x0d, 0x1c, 0x8d, 0xb7 -+}; -+ -+static unsigned char dh_share_key_4096[] = { -+ 0xaf, 0xd4, 0xf6, 0x45, 0x63, 0x21, 0x8d, 0x98, 0xc4, 0xab, 0x18, 0xd7, 0x2b, 0x3c, 0x1d, 0xde, -+ 0xe7, 0x1f, 0xe1, 0xc5, 0x79, 0x57, 0x60, 0x20, 0xfa, 0x99, 0xbd, 0x7b, 0xa2, 0x94, 0x0b, 0xa3, -+ 0xb4, 0xb3, 0x33, 0x4a, 0x2f, 0xd0, 0x17, 0x7, 0x2e, 0x70, 0x19, 0x84, 0x1f, 0x8e, 0xe9, 0x61, -+ 0xe5, 0x52, 0x3, 0x96, 0xea, 0xd8, 0xb6, 0x3, 0x9f, 0xc4, 0x3e, 0x23, 0x77, 0x17, 0x54, 0xfb, -+ 0x13, 0xf0, 0x3e, 0x9a, 0x27, 0x5d, 0x12, 0x99, 0x58, 0x8d, 0x41, 0x46, 0xd9, 0xc9, 0x29, 0xbd, -+ 0x40, 0xd1, 0x4f, 0xef, 0x63, 0x7b, 0x54, 0xe6, 0x59, 0x6d, 0xe2, 0x30, 0xe8, 0x2c, 0x2f, 0xf9, -+ 0x66, 0xa2, 0x12, 0xf5, 0x58, 0x61, 0xac, 0x43, 0xec, 0x7e, 0xf9, 0x2e, 0x27, 0x70, 0x35, 0x75, -+ 0xb4, 0x10, 0x29, 0xac, 0x0a, 0xab, 0x59, 0xb6, 0x68, 0x4c, 0x16, 0xaf, 0xf0, 0x4f, 0x21, 0xcd, -+ 0xcc, 0x48, 0x97, 0xe4, 0x21, 0x65, 0xa6, 0x55, 0xb8, 0xf3, 0xb2, 0x7b, 0x91, 0xd7, 0xca, 0xb9, -+ 0x17, 0x58, 0x31, 0x71, 0xc0, 0xc9, 0x69, 0x1e, 0xf0, 0x9e, 0x3f, 0xe2, 0x37, 0x4, 0x2d, 0xa8, -+ 0x55, 0x9, 0x6b, 0x9c, 0xc6, 0x37, 0xa9, 0x9b, 0xdf, 0x67, 0x73, 0x7b, 0x46, 0xf9, 0x63, 0x47, -+ 0xcb, 0xa0, 0x57, 0x2a, 0xed, 0x97, 0x2f, 0xfe, 0x92, 0xf2, 0x20, 0x2c, 0x7e, 0xee, 0x7d, 0x11, -+ 0x78, 0xe6, 0xb9, 0x9, 0xd1, 0x94, 0xce, 0xd1, 0x5b, 0xf4, 0x44, 0xa9, 0xcb, 0x26, 0x2, 0x36, -+ 0x57, 0x2c, 0xa2, 0xbe, 0x37, 0xde, 0x86, 0x46, 0x20, 0x27, 0x9d, 0xa0, 0x2f, 0x4, 0xc1, 0xcd, -+ 0xff, 0x81, 0xe5, 0xe6, 0x2c, 0x9e, 0x39, 0x82, 0x31, 0x54, 0x33, 0xf8, 0xe7, 0xa0, 0xe5, 0x96, -+ 0xa4, 0x40, 0xc4, 0x44, 0xfe, 0x93, 0x66, 0xe2, 0xda, 0xaa, 0xb8, 0xfb, 0x2f, 0x3b, 0x8c, 0xce, -+ 0xaf, 0xd4, 0xf6, 0x45, 0x63, 0x21, 0x8d, 0x98, 0xc4, 0xab, 0x18, 0xd7, 0x2b, 0x3c, 0x1d, 0xde, -+ 0xe7, 0x1f, 0xe1, 0xc5, 0x79, 0x57, 0x60, 0x20, 0xfa, 0x99, 0xbd, 0x7b, 0xa2, 0x94, 0x0b, 0xa3, -+ 0xb4, 0xb3, 0x33, 0x4a, 0x2f, 0xd0, 0x17, 0x7, 0x2e, 0x70, 0x19, 0x84, 0x1f, 0x8e, 0xe9, 0x61, -+ 0xe5, 0x52, 0x3, 0x96, 0xea, 0xd8, 0xb6, 0x3, 0x9f, 0xc4, 0x3e, 0x23, 0x77, 0x17, 0x54, 0xfb, -+ 0x13, 0xf0, 0x3e, 0x9a, 0x27, 0x5d, 0x12, 0x99, 0x58, 0x8d, 0x41, 0x46, 0xd9, 0xc9, 0x29, 0xbd, -+ 0x40, 0xd1, 0x4f, 0xef, 0x63, 0x7b, 0x54, 0xe6, 0x59, 0x6d, 0xe2, 0x30, 0xe8, 0x2c, 0x2f, 0xf9, -+ 0x66, 0xa2, 0x12, 0xf5, 0x58, 0x61, 0xac, 0x43, 0xec, 0x7e, 0xf9, 0x2e, 0x27, 0x70, 0x35, 0x75, -+ 0xb4, 0x10, 0x29, 0xac, 0x0a, 0xab, 0x59, 0xb6, 0x68, 0x4c, 0x16, 0xaf, 0xf0, 0x4f, 0x21, 0xcd, -+ 0xcc, 0x48, 0x97, 0xe4, 0x21, 0x65, 0xa6, 0x55, 0xb8, 0xf3, 0xb2, 0x7b, 0x91, 0xd7, 0xca, 0xb9, -+ 0x17, 0x58, 0x31, 0x71, 0xc0, 0xc9, 0x69, 0x1e, 0xf0, 0x9e, 0x3f, 0xe2, 0x37, 0x4, 0x2d, 0xa8, -+ 0x55, 0x9, 0x6b, 0x9c, 0xc6, 0x37, 0xa9, 0x9b, 0xdf, 0x67, 0x73, 0x7b, 0x46, 0xf9, 0x63, 0x47, -+ 0xcb, 0xa0, 0x57, 0x2a, 0xed, 0x97, 0x2f, 0xfe, 0x92, 0xf2, 0x20, 0x2c, 0x7e, 0xee, 0x7d, 0x11, -+ 0x78, 0xe6, 0xb9, 0x9, 0xd1, 0x94, 0xce, 0xd1, 0x5b, 0xf4, 0x44, 0xa9, 0xcb, 0x26, 0x2, 0x36, -+ 0x57, 0x2c, 0xa2, 0xbe, 0x37, 0xde, 0x86, 0x46, 0x20, 0x27, 0x9d, 0xa0, 0x2f, 0x4, 0xc1, 0xcd, -+ 0xff, 0x81, 0xe5, 0xe6, 0x2c, 0x9e, 0x39, 0x82, 0x31, 0x54, 0x33, 0xf8, 0xe7, 0xa0, 0xe5, 0x96, -+ 0xa4, 0x40, 0xc4, 0x44, 0xfe, 0x93, 0x66, 0xe2, 0xda, 0xaa, 0xb8, 0xfb, 0x2f, 0x3b, 0x8c, 0xce, -+}; -+ -+/******************************************* ECDH ********************************************/ -+static char ecdh_a_secp128r1[] = { -+ 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc -+}; -+ -+static char ecdh_b_secp128r1[] = { -+ 0xe8, 0x75, 0x79, 0xc1, 0x10, 0x79, 0xf4, 0x3d, 0xd8, 0x24, 0x99, 0x3c, 0x2c, 0xee, 0x5e, 0xd3 -+}; -+ -+static char ecdh_p_secp128r1[] = { -+ 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff -+}; -+ -+static char ecdh_n_secp128r1[] = { -+ 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x75, 0xa3, 0x0d, 0x1b, 0x90, 0x38, 0xa1, 0x15 -+}; -+ -+static char ecdh_g_secp128r1[] = { -+ 0x16, 0x1f, 0xf7, 0x52, 0x8b, 0x89, 0x9b, 0x2d, 0x0c, 0x28, 0x60, 0x7c, 0xa5, 0x2c, 0x5b, 0x86, -+ 0xcf, 0x5a, 0xc8, 0x39, 0x5b, 0xaf, 0xeb, 0x13, 0xc0, 0x2d, 0xa2, 0x92, 0xdd, 0xed, 0x7a, 0x83 -+}; -+ -+static char ecdh_da_secp128r1[] = { -+ 0xfe, 0x4e, 0xc2, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x78, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00 -+}; -+ -+static char ecdh_cp_pubkey_secp128r1[] = { -+ 0x04, -+ 0xcc, 0x40, 0x99, 0x3b, 0xcd, 0x0b, 0xcf, 0xcb, 0x9a, 0x96, 0x08, 0x56, 0xc2, 0x96, 0x2c, 0xe1, -+ 0xdf, 0x69, 0x2a, 0x71, 0xaf, 0x96, 0xe2, 0xeb, 0x5a, 0x26, 0x7f, 0xd3, 0x7a, 0xe8, 0x70, 0xf3 -+}; -+ -+static char ecdh_except_b_pubkey_secp128r1[] = { -+ 0x04, -+ 0xcc, 0x40, 0x99, 0x3b, 0xcd, 0x0b, 0xcf, 0xcb, 0x9a, 0x96, 0x08, 0x56, 0xc2, 0x96, 0x2c, 0xe1, -+ 0xdf, 0x69, 0x2a, 0x71, 0xaf, 0x96, 0xe2, 0xeb, 0x5a, 0x26, 0x7f, 0xd3, 0x7a, 0xe8, 0x70, 0xf3 -+}; -+ -+static char ecdh_cp_sharekey_secp128r1[] = { -+ 0x68, 0x55, 0x71, 0xa4, 0xd7, 0x51, 0x49, 0xa8, 0x78, 0xa8, 0x3a, 0xc1, 0x3f, 0xb3, 0x8c, 0xcb -+}; -+ -+/* ecc sign or verf*/ -+static char ecc_except_kinv_secp128r1[] = { -+ 0xfe, 0x4e, 0xc2, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x78, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00 -+}; -+ -+static char ecc_except_e_secp128r1[] = { -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x4 -+}; -+ -+static char ecc_cp_sign_secp128r1[] = { -+ 0x2e, 0x69, 0xad, 0x4f, 0xd5, 0xd4, 0x62, 0xec, 0xf2, 0xde, 0x21, 0x4f, 0xbc, 0x1f, 0xe8, 0x19, -+ 0x7b, 0x98, 0x8d, 0xaf, 0xe4, 0x6c, 0x60, 0x73, 0x00, 0xb0, 0x8b, 0xef, 0x89, 0x65, 0x35, 0x84 -+}; -+ -+static char ecdh_a_secp192k1[] = { -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -+}; -+ -+static char ecdh_b_secp192k1[] = { -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03 -+}; -+ -+static char ecdh_p_secp192k1[] = { -+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -+ 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xee, 0x37 -+}; -+ -+static char ecdh_n_secp192k1[] = { -+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x26, 0xf2, 0xfc, 0x17, -+ 0x0f, 0x69, 0x46, 0x6a, 0x74, 0xde, 0xfd, 0x8d -+}; -+ -+static char ecdh_g_secp192k1[] = { -+ 0xdb, 0x4f, 0xf1, 0x0e, 0xc0, 0x57, 0xe9, 0xae, 0x26, 0xb0, 0x7d, 0x02, 0x80, 0xb7, 0xf4, 0x34, -+ 0x1d, 0xa5, 0xd1, 0xb1, 0xea, 0xe0, 0x6c, 0x7d, -+ 0x9b, 0x2f, 0x2f, 0x6d, 0x9c, 0x56, 0x28, 0xa7, 0x84, 0x41, 0x63, 0xd0, 0x15, 0xbe, 0x86, 0x34, -+ 0x40, 0x82, 0xaa, 0x88, 0xd9, 0x5e, 0x2f, 0x9d -+}; -+ -+static char ecdh_da_secp192k1[] = { -+ 0x2b, 0x58, 0xc2, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x58, 0xc2, 0x5e, 0x00, 0x00, 0x00, 0x00, -+ 0x67, 0x6a, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00 -+}; -+ -+static char ecdh_cp_pubkey_secp192k1[] = { -+ 0x04, -+ 0xec, 0x0e, 0x64, 0xac, 0x04, 0x2a, 0x88, 0x86, 0xed, 0xc1, 0xf2, 0x50, 0x0f, 0xe1, 0x27, 0x63, -+ 0x86, 0x63, 0x9e, 0xb2, 0x82, 0x21, 0x6e, 0x3f, 0x48, 0x59, 0x76, 0xb9, 0x4e, 0xd9, 0xe2, 0x02, -+ 0xb4, 0xdb, 0xfc, 0x8f, 0x49, 0xe7, 0x24, 0x9b, 0xbe, 0x33, 0xee, 0xc8, 0xcc, 0x9e, 0x00, 0x9a -+}; -+ -+static char ecdh_cp_sharekey_secp192k1[] = { -+ 0x79, 0xd3, 0x1c, 0x98, 0xfb, 0xd2, 0xb6, 0x7c, 0x60, 0x4b, 0x6e, 0x4c, 0xa9, 0x95, 0xcb, 0xac, -+ 0xb0, 0xf9, 0x05, 0xed, 0x9a, 0xcb, 0x2e, 0x5b -+}; -+ -+static char ecdh_except_b_pubkey_secp192k1[] = { -+ 0x04, -+ 0xec, 0x0e, 0x64, 0xac, 0x04, 0x2a, 0x88, 0x86, 0xed, 0xc1, 0xf2, 0x50, 0x0f, 0xe1, 0x27, 0x63, -+ 0x86, 0x63, 0x9e, 0xb2, 0x82, 0x21, 0x6e, 0x3f, 0x48, 0x59, 0x76, 0xb9, 0x4e, 0xd9, 0xe2, 0x02, -+ 0xb4, 0xdb, 0xfc, 0x8f, 0x49, 0xe7, 0x24, 0x9b, 0xbe, 0x33, 0xee, 0xc8, 0xcc, 0x9e, 0x00, 0x9a -+}; -+ -+/* ecc sign or verf*/ -+static unsigned char ecc_except_kinv_secp192k1[] = { -+ 0x71, 0x71, 0xb4, 0x5b, 0x79, 0x51, 0x94, 0x70, 0x53, 0xf9, 0x77, 0x02, 0x64, 0xef, 0xc4, 0xdb, -+ 0x64, 0xfc, 0xbe, 0x4e, 0x44, 0x4a, 0xc6, 0x54 -+}; -+ -+static unsigned char ecc_except_e_secp192k1[] = { -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04 -+}; -+ -+/* 224 */ -+static char ecdh_a_secp224r1[] = { -+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -+ 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE -+}; -+ -+static char ecdh_b_secp224r1[] = { -+ 0xB4, 0x05, 0x0A, 0x85, 0x0C, 0x04, 0xB3, 0xAB, 0xF5, 0x41, 0x32, 0x56, 0x50, 0x44, -+ 0xB0, 0xB7, 0xD7, 0xBF, 0xD8, 0xBA, 0x27, 0x0B, 0x39, 0x43, 0x23, 0x55, 0xFF, 0xB4 -+}; -+ -+static char ecdh_p_secp224r1[] = { -+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -+ 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 -+}; -+ -+static char ecdh_n_secp224r1[] = { -+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -+ 0x16, 0xA2, 0xE0, 0xB8, 0xF0, 0x3E, 0x13, 0xDD, 0x29, 0x45, 0x5C, 0x5C, 0x2A, 0x3D -+}; -+ -+static char ecdh_g_secp224r1[] = { -+ 0xB7, 0x0E, 0x0C, 0xBD, 0x6B, 0xB4, 0xBF, 0x7F, 0x32, 0x13, 0x90, 0xB9, 0x4A, 0x03, -+ 0xC1, 0xD3, 0x56, 0xC2, 0x11, 0x22, 0x34, 0x32, 0x80, 0xD6, 0x11, 0x5C, 0x1D, 0x21, -+ 0xBD, 0x37, 0x63, 0x88, 0xB5, 0xF7, 0x23, 0xFB, 0x4C, 0x22, 0xDF, 0xE6, 0xCD, 0x43, -+ 0x75, 0xA0, 0x5A, 0x07, 0x47, 0x64, 0x44, 0xD5, 0x81, 0x99, 0x85, 0x00, 0x7E, 0x34 -+}; -+ -+static char ecdh_da_secp224r1[] = { -+ 0x41, 0x5c, 0x8c, 0x34, 0xfd, 0x70, 0x76, 0x3c, 0x6a, 0x81, 0x8e, 0x33, 0x7c, 0xa5, -+ 0x59, 0x6b, 0xfb, 0x58, 0x8e, 0x74, 0xb8, 0xc7, 0x3c, 0xcf, 0xde, 0xe3, 0x81, 0x60 -+}; -+ -+static char ecdh_cp_pubkey_secp224r1[] = { -+ 0x04, -+ 0x5b, 0x46, 0x50, 0x7c, 0x7a, 0x37, 0x82, 0x05, 0x5a, 0xc7, 0xd0, 0x29, 0xf8, 0xdd, -+ 0xe6, 0x3e, 0xb4, 0xc2, 0x31, 0x59, 0xfd, 0xa4, 0xb7, 0xee, 0x61, 0x83, 0x7c, 0x80, -+ 0xf1, 0x51, 0xf0, 0x5b, 0xfb, 0xc6, 0x63, 0x23, 0x9a, 0x13, 0xfa, 0x47, 0x68, 0x7b, -+ 0x3e, 0x47, 0xb3, 0x88, 0xca, 0x3e, 0x4b, 0x71, 0x24, 0x17, 0xc7, 0x4c, 0xd0, 0x06 -+}; -+ -+static char ecdh_except_b_pubkey_secp224r1[] = { -+ 0x04, -+ 0x5b, 0x46, 0x50, 0x7c, 0x7a, 0x37, 0x82, 0x05, 0x5a, 0xc7, 0xd0, 0x29, 0xf8, 0xdd, -+ 0xe6, 0x3e, 0xb4, 0xc2, 0x31, 0x59, 0xfd, 0xa4, 0xb7, 0xee, 0x61, 0x83, 0x7c, 0x80, -+ 0xf1, 0x51, 0xf0, 0x5b, 0xfb, 0xc6, 0x63, 0x23, 0x9a, 0x13, 0xfa, 0x47, 0x68, 0x7b, -+ 0x3e, 0x47, 0xb3, 0x88, 0xca, 0x3e, 0x4b, 0x71, 0x24, 0x17, 0xc7, 0x4c, 0xd0, 0x06 -+}; -+ -+static char ecdh_cp_sharekey_secp224r1[] = { -+ 0x2f, 0xc0, 0x04, 0x34, 0x0e, 0x03, 0xb0, 0xd2, 0x84, 0xe1, 0x4f, 0x4f, 0x7b, 0xac, -+ 0x53, 0xaa, 0x32, 0x5c, 0xbd, 0xe5, 0xbc, 0x2a, 0xe3, 0xda, 0x48, 0x38, 0x67, 0x16 -+}; -+ -+ -+/* 256 */ -+static char ecdh_a_secp256k1[] = { -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -+}; -+ -+static char ecdh_b_secp256k1[] = { -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07 -+}; -+ -+static char ecdh_p_secp256k1[] = { -+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2f -+}; -+ -+static char ecdh_n_secp256k1[] = { -+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, -+ 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41 -+}; -+ -+static char ecdh_g_secp256k1[] = { -+ 0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, 0x55, 0xA0, 0x62, 0x95, 0xCE, 0x87, 0x0B, 0x07, -+ 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9, 0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17, 0x98, -+ 0x48, 0x3a, 0xda, 0x77, 0x26, 0xa3, 0xc4, 0x65, 0x5d, 0xa4, 0xfb, 0xfc, 0x0e, 0x11, 0x08, 0xa8, -+ 0xfd, 0x17, 0xb4, 0x48, 0xa6, 0x85, 0x54, 0x19, 0x9c, 0x47, 0xd0, 0x8f, 0xfb, 0x10, 0xd4, 0xb8 -+}; -+ -+static char ecdh_da_secp256k1[] = { -+ 0x71, 0x71, 0xb4, 0x5b, 0x79, 0x51, 0x94, 0x70, 0x53, 0xf9, 0x77, 0x02, 0x64, 0xef, 0xc4, 0xdb, -+ 0x64, 0xfc, 0xbe, 0x4e, 0x44, 0x4a, 0xc6, 0x54, 0x71, 0x69, 0x2e, 0x4a, 0x46, 0xa7, 0x2d, 0xa3 -+}; -+ -+#if 0 -+static char ecdh_db_secp256k1[] = { -+ 0xe2, 0x74, 0x69, 0xc8, 0x17, 0x6c, 0x0d, 0xca, 0xdd, 0x9e, 0xf6, 0x2f, 0x30, 0x9f, 0xad, 0xf3, -+ 0xdd, 0x16, 0xcc, 0x0c, 0xb1, 0xd0, 0x7b, 0xf4, 0xde, 0x9d, 0xf2, 0x5d, 0x22, 0x03, 0xce, 0x41 -+}; -+#endif -+ -+static char ecdh_cp_pubkey_secp256k1[] = { -+ 0x04, -+ 0x68, 0xae, 0x87, 0x7c, 0x45, 0xb3, 0x8b, 0xa8, 0xa8, 0x8e, 0x4b, 0xe5, 0x1f, 0x4e, 0xe6, 0x89, -+ 0x67, 0x73, 0x71, 0x96, 0x92, 0x2e, 0x57, 0x07, 0xc4, 0x30, 0xa5, 0xcf, 0x9f, 0x58, 0xb0, 0x6f, -+ 0x26, 0xd3, 0x58, 0xa4, 0xb6, 0xfc, 0xb6, 0x4b, 0x0f, 0x63, 0xd9, 0xa6, 0xa0, 0x1b, 0xba, 0x10, -+ 0x10, 0xa4, 0xab, 0x28, 0x6e, 0xab, 0x51, 0x34, 0xac, 0x3d, 0x2b, 0x39, 0xf1, 0xd7, 0x21, 0x48 -+}; -+ -+static char ecdh_except_b_pubkey_secp256k1[] = { -+ 0x04, -+ 0x90, 0x34, 0x99, 0xc8, 0x9e, 0x32, 0xdb, 0xcd, 0x24, 0x4e, 0x31, 0x51, 0x1c, 0x83, 0x4b, 0xf7, -+ 0x68, 0xf0, 0xbb, 0xa3, 0x91, 0x38, 0xa8, 0xf1, 0xab, 0x76, 0x36, 0xcd, 0x23, 0x3f, 0x57, 0x3b, -+ 0x22, 0x1a, 0x3f, 0x2e, 0x40, 0x8b, 0xe2, 0x7b, 0xd4, 0x91, 0xe4, 0xf2, 0x36, 0x00, 0xbe, 0xae, -+ 0x9c, 0xf2, 0xfc, 0xb4, 0xb9, 0x8b, 0x5b, 0xa7, 0x39, 0x88, 0xf2, 0x3b, 0xe2, 0xe5, 0xab, 0x1b -+}; -+ -+static char ecdh_cp_sharekey_secp256k1[] = { -+ 0xd8, 0x9d, 0x1e, 0x25, 0xa2, 0x5, 0xd8, 0xad, 0x0f, 0x1c, 0x7a, 0x44, 0xd4, 0xe6, 0x96, 0xc2, -+ 0xd3, 0xbc, 0x05, 0xa1, 0x8d, 0x4a, 0x2, 0x11, 0x0e, 0x93, 0xcd, 0xb9, 0x56, 0xd6, 0x44, 0x1c, -+}; -+ -+/* ecc sign or verf*/ -+static unsigned char ecc_except_kinv_secp256k1[] = { -+ 0x71, 0x71, 0xb4, 0x5b, 0x79, 0x51, 0x94, 0x70, 0x53, 0xf9, 0x77, 0x02, 0x64, 0xef, 0xc4, 0xdb, -+ 0x64, 0xfc, 0xbe, 0x4e, 0x44, 0x4a, 0xc6, 0x54, 0x71, 0x69, 0x2e, 0x4a, 0x46, 0xa7, 0x2d, 0xa3 -+}; -+ -+static unsigned char ecc_except_e_secp256k1[] = { -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04 -+}; -+ -+static unsigned char ecc_cp_sign_secp256k1[] = { -+ 0x30,0x45,0x02,0x20,0x68,0xae,0x87,0x7c,0x45,0xb3,0x8b,0xa8,0xa8,0x8e,0x4b,0xe5, -+ 0x1f,0x4e,0xe6,0x89,0x67,0x73,0x71,0x96,0x92,0x2e,0x57,0x07,0xc4,0x30,0xa5,0xcf, -+ 0x9f,0x58,0xb0,0x6f,0x02,0x21,0x00,0xdb,0x14,0xac,0x48,0x0d,0x0a,0xe9,0xe4,0x1d, -+ 0x8d,0xca,0x47,0xb6,0x0e,0x44,0xf6,0xfb,0xde,0x86,0x9b,0x38,0x76,0x98,0x67,0x12, -+ 0x7f,0x1d,0x09,0x97,0xab,0xc2,0xcb -+}; -+ -+static char ecdh_a_secp320k1[] = { -+ 0x3e, 0xe3, 0x0b, 0x56, 0x8f, 0xba, 0xb0, 0xf8, 0x83, 0xcc, 0xeb, 0xd4, 0x6d, 0x3f, 0x3b, 0xb8, -+ 0xa2, 0xa7, 0x35, 0x13, 0xf5, 0xeb, 0x79, 0xda, 0x66, 0x19, 0x0e, 0xb0, 0x85, 0xff, 0xa9, 0xf4, -+ 0x92, 0xf3, 0x75, 0xa9, 0x7d, 0x86, 0x0e, 0xb4 -+}; -+ -+static char ecdh_b_secp320k1[] = { -+ 0x52, 0x08, 0x83, 0x94, 0x9d, 0xfd, 0xbc, 0x42, 0xd3, 0xad, 0x19, 0x86, 0x40, 0x68, 0x8a, 0x6f, -+ 0xe1, 0x3f, 0x41, 0x34, 0x95, 0x54, 0xb4, 0x9a, 0xcc, 0x31, 0xdc, 0xcd, 0x88, 0x45, 0x39, 0x81, -+ 0x6f, 0x5e, 0xb4, 0xac, 0x8f, 0xb1, 0xf1, 0xa6 -+}; -+ -+static char ecdh_p_secp320k1[] = { -+ 0xd3, 0x5e, 0x47, 0x20, 0x36, 0xbc, 0x4f, 0xb7, 0xe1, 0x3c, 0x78, 0x5e, 0xd2, 0x01, 0xe0, 0x65, -+ 0xf9, 0x8f, 0xcf, 0xa6, 0xf6, 0xf4, 0x0d, 0xef, 0x4f, 0x92, 0xb9, 0xec, 0x78, 0x93, 0xec, 0x28, -+ 0xfc, 0xd4, 0x12, 0xb1, 0xf1, 0xb3, 0x2e, 0x27 -+}; -+ -+static char ecdh_n_secp320k1[] = { -+ 0xd3, 0x5e, 0x47, 0x20, 0x36, 0xbc, 0x4f, 0xb7, 0xe1, 0x3c, 0x78, 0x5e, 0xd2, 0x01, 0xe0, 0x65, -+ 0xf9, 0x8f, 0xcf, 0xa5, 0xb6, 0x8f, 0x12, 0xa3, 0x2d, 0x48, 0x2e, 0xc7, 0xee, 0x86, 0x58, 0xe9, -+ 0x86, 0x91, 0x55, 0x5b, 0x44, 0xc5, 0x93, 0x11 -+}; -+ -+static char ecdh_g_secp320k1[] = { -+ 0x43, 0xbd, 0x7e, 0x9a, 0xfb, 0x53, 0xd8, 0xb8, 0x52, 0x89, 0xbc, 0xc4, 0x8e, 0xe5, 0xbf, 0xe6, -+ 0xf2, 0x01, 0x37, 0xd1, 0x0a, 0x08, 0x7e, 0xb6, 0xe7, 0x87, 0x1e, 0x2a, 0x10, 0xa5, 0x99, 0xc7, -+ 0x10, 0xaf, 0x8d, 0x0d, 0x39, 0xe2, 0x06, 0x11, -+ 0x14, 0xfd, 0xd0, 0x55, 0x45, 0xec, 0x1c, 0xc8, 0xab, 0x40, 0x93, 0x24, 0x7f, 0x77, 0x27, 0x5e, -+ 0x07, 0x43, 0xff, 0xed, 0x11, 0x71, 0x82, 0xea, 0xa9, 0xc7, 0x78, 0x77, 0xaa, 0xac, 0x6a, 0xc7, -+ 0xd3, 0x52, 0x45, 0xd1, 0x69, 0x2e, 0x8e, 0xe1, -+}; -+ -+static char ecdh_da_secp320k1[] = { -+ 0x6a, 0x5b, 0xc2, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x21, 0x8e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0x00, 0x31, 0x00, 0xa0, 0xff, 0xff, 0x00, 0x00, 0x6a, 0x5b, 0xc2, 0x5e, 0x00, 0x00, 0x00, 0x00, -+ 0x21, 0x8e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 -+}; -+ -+static char ecdh_cp_pubkey_secp320k1[] = { -+ 0x04, -+ 0x5f, 0x25, 0x77, 0xa9, 0xb5, 0x0a, 0x6f, 0xd3, 0xcb, 0x43, 0x93, 0xe0, 0xb7, 0x41, 0x3b, 0x56, -+ 0xc3, 0xfe, 0x1e, 0x5c, 0xb9, 0x32, 0x3a, 0x74, 0x68, 0xf8, 0x69, 0xea, 0xcf, 0x5b, 0x82, 0xd2, -+ 0x38, 0x8c, 0x96, 0x87, 0x97, 0xc3, 0x89, 0x9d, 0x13, 0x02, 0x40, 0xba, 0x88, 0xfa, 0x0c, 0x5a, -+ 0x64, 0x52, 0x7c, 0x36, 0xbd, 0xa6, 0x92, 0xb7, 0x6f, 0xb1, 0xd5, 0x81, 0xdb, 0xd5, 0x78, 0x96, -+ 0x50, 0x6a, 0x48, 0xec, 0x75, 0x04, 0x01, 0x3e, 0x86, 0x07, 0x74, 0x5b, 0xa7, 0x72, 0x44, 0x27 -+}; -+ -+static char ecdh_except_b_pubkey_secp320k1[] = { -+ 0x04, -+ 0x5f, 0x25, 0x77, 0xa9, 0xb5, 0x0a, 0x6f, 0xd3, 0xcb, 0x43, 0x93, 0xe0, 0xb7, 0x41, 0x3b, 0x56, -+ 0xc3, 0xfe, 0x1e, 0x5c, 0xb9, 0x32, 0x3a, 0x74, 0x68, 0xf8, 0x69, 0xea, 0xcf, 0x5b, 0x82, 0xd2, -+ 0x38, 0x8c, 0x96, 0x87, 0x97, 0xc3, 0x89, 0x9d, 0x13, 0x02, 0x40, 0xba, 0x88, 0xfa, 0x0c, 0x5a, -+ 0x64, 0x52, 0x7c, 0x36, 0xbd, 0xa6, 0x92, 0xb7, 0x6f, 0xb1, 0xd5, 0x81, 0xdb, 0xd5, 0x78, 0x96, -+ 0x50, 0x6a, 0x48, 0xec, 0x75, 0x04, 0x01, 0x3e, 0x86, 0x07, 0x74, 0x5b, 0xa7, 0x72, 0x44, 0x27 -+}; -+ -+static char ecdh_cp_sharekey_secp320k1[] = { -+ 0x69, 0x8a, 0x70, 0x4e, 0xf8, 0x4a, 0x9a, 0x80, 0xe8, 0x48, 0xc9, 0xb9, 0xac, 0x2a, 0x74, 0xf0, -+ 0xe5, 0x29, 0x60, 0x6d, 0xf3, 0x4e, 0x01, 0xa6, 0x20, 0x37, 0xc2, 0x0f, 0xba, 0x98, 0x91, 0x3b, -+ 0xc2, 0x75, 0xa3, 0xc6, 0x75, 0x90, 0x79, 0xb4 -+}; -+ -+/* ecc sign or verf*/ -+static unsigned char ecc_except_kinv_secp320k1[] = { -+ 0x71, 0x71, 0xb4, 0x5b, 0x79, 0x51, 0x94, 0x70, 0x53, 0xf9, 0x77, 0x02, 0x64, 0xef, 0xc4, 0xdb, -+ 0x64, 0xfc, 0xbe, 0x4e, 0x44, 0x4a, 0xc6, 0x54, 0x71, 0x69, 0x2e, 0x4a, 0x46, 0xa7, 0x2d, 0xa3 -+}; -+ -+static unsigned char ecc_except_e_secp320k1[] = { -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04 -+}; -+ -+/* 384 */ -+static char ecdh_a_secp384r1[] = { -+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFC -+}; -+ -+static char ecdh_b_secp384r1[] = { -+ 0xB3, 0x31, 0x2F, 0xA7, 0xE2, 0x3E, 0xE7, 0xE4, 0x98, 0x8E, 0x05, 0x6B, -+ 0xE3, 0xF8, 0x2D, 0x19, 0x18, 0x1D, 0x9C, 0x6E, 0xFE, 0x81, 0x41, 0x12, -+ 0x03, 0x14, 0x08, 0x8F, 0x50, 0x13, 0x87, 0x5A, 0xC6, 0x56, 0x39, 0x8D, -+ 0x8A, 0x2E, 0xD1, 0x9D, 0x2A, 0x85, 0xC8, 0xED, 0xD3, 0xEC, 0x2A, 0xEF -+}; -+ -+static char ecdh_p_secp384r1[] = { -+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF -+}; -+ -+static char ecdh_n_secp384r1[] = { -+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -+ 0xC7, 0x63, 0x4D, 0x81, 0xF4, 0x37, 0x2D, 0xDF, 0x58, 0x1A, 0x0D, 0xB2, -+ 0x48, 0xB0, 0xA7, 0x7A, 0xEC, 0xEC, 0x19, 0x6A, 0xCC, 0xC5, 0x29, 0x73 -+}; -+ -+static char ecdh_g_secp384r1[] = { -+ 0xAA, 0x87, 0xCA, 0x22, 0xBE, 0x8B, 0x05, 0x37, 0x8E, 0xB1, 0xC7, 0x1E, -+ 0xF3, 0x20, 0xAD, 0x74, 0x6E, 0x1D, 0x3B, 0x62, 0x8B, 0xA7, 0x9B, 0x98, -+ 0x59, 0xF7, 0x41, 0xE0, 0x82, 0x54, 0x2A, 0x38, 0x55, 0x02, 0xF2, 0x5D, -+ 0xBF, 0x55, 0x29, 0x6C, 0x3A, 0x54, 0x5E, 0x38, 0x72, 0x76, 0x0A, 0xB7, -+ 0x36, 0x17, 0xDE, 0x4A, 0x96, 0x26, 0x2C, 0x6F, 0x5D, 0x9E, 0x98, 0xBF, -+ 0x92, 0x92, 0xDC, 0x29, 0xF8, 0xF4, 0x1D, 0xBD, 0x28, 0x9A, 0x14, 0x7C, -+ 0xE9, 0xDA, 0x31, 0x13, 0xB5, 0xF0, 0xB8, 0xC0, 0x0A, 0x60, 0xB1, 0xCE, -+ 0x1D, 0x7E, 0x81, 0x9D, 0x7A, 0x43, 0x1D, 0x7C, 0x90, 0xEA, 0x0E, 0x5F -+}; -+ -+static char ecdh_da_secp384r1[] = { -+ 0xee, 0x57, 0xd7, 0xad, 0xbc, 0x8c, 0x5d, 0x82, 0x65, 0x7f, 0x03, 0xcb, 0x12, 0xc1, 0x38, 0x0d, -+ 0x02, 0x5c, 0xb7, 0x8f, 0xa4, 0x36, 0x56, 0x27, 0x25, 0x85, 0xaa, 0x3e, 0xdf, 0x22, 0x88, 0x7b, -+ 0xe3, 0xe7, 0xc5, 0xf1, 0xd7, 0x37, 0x8c, 0xc7, 0x56, 0xca, 0xa7, 0x93, 0x37, 0xbd, 0xf9, 0x37 -+}; -+ -+static char ecdh_cp_pubkey_secp384r1[] = { -+ 0x04, -+ 0x7d, 0x54, 0xd0, 0x72, 0x45, 0x4b, 0x5a, 0x48, 0xed, 0xc6, 0x19, 0xde, 0x8f, 0x1b, 0xa6, 0xfd, -+ 0xe5, 0x00, 0xbc, 0x74, 0xbb, 0xee, 0xdc, 0x6b, 0x1c, 0x6d, 0x36, 0xf1, 0x2a, 0x6a, 0x3c, 0xcd, -+ 0xd5, 0xb9, 0xf8, 0x3c, 0x57, 0xe8, 0xc2, 0xb2, 0xe6, 0x60, 0x58, 0x03, 0x3e, 0x48, 0xf4, 0xc4, -+ 0x4b, 0x80, 0x58, 0x8c, 0xc7, 0x65, 0x2e, 0xdd, 0x23, 0x31, 0xd2, 0xae, 0x62, 0x62, 0xc3, 0xb4, -+ 0x57, 0x88, 0xc6, 0x84, 0x51, 0xaf, 0x8c, 0x7b, 0x94, 0x2a, 0x43, 0x68, 0x31, 0xbd, 0x3d, 0x4f, -+ 0x43, 0xae, 0x79, 0x50, 0x80, 0x60, 0x09, 0xfa, 0x42, 0xfe, 0x9d, 0x18, 0xce, 0xbe, 0xfd, 0x64 -+}; -+ -+static char ecdh_except_b_pubkey_secp384r1[] = { -+ 0x04, -+ 0x7d, 0x54, 0xd0, 0x72, 0x45, 0x4b, 0x5a, 0x48, 0xed, 0xc6, 0x19, 0xde, 0x8f, 0x1b, 0xa6, 0xfd, -+ 0xe5, 0x00, 0xbc, 0x74, 0xbb, 0xee, 0xdc, 0x6b, 0x1c, 0x6d, 0x36, 0xf1, 0x2a, 0x6a, 0x3c, 0xcd, -+ 0xd5, 0xb9, 0xf8, 0x3c, 0x57, 0xe8, 0xc2, 0xb2, 0xe6, 0x60, 0x58, 0x03, 0x3e, 0x48, 0xf4, 0xc4, -+ 0x4b, 0x80, 0x58, 0x8c, 0xc7, 0x65, 0x2e, 0xdd, 0x23, 0x31, 0xd2, 0xae, 0x62, 0x62, 0xc3, 0xb4, -+ 0x57, 0x88, 0xc6, 0x84, 0x51, 0xaf, 0x8c, 0x7b, 0x94, 0x2a, 0x43, 0x68, 0x31, 0xbd, 0x3d, 0x4f, -+ 0x43, 0xae, 0x79, 0x50, 0x80, 0x60, 0x09, 0xfa, 0x42, 0xfe, 0x9d, 0x18, 0xce, 0xbe, 0xfd, 0x64 -+}; -+ -+static char ecdh_cp_sharekey_secp384r1[] = { -+ 0x82, 0x80, 0x4b, 0x00, 0x8c, 0x3c, 0x29, 0x51, 0xc8, 0x77, 0x1f, 0x72, 0xe2, 0x8c, 0x9d, 0x2a, -+ 0x3c, 0xf3, 0xe3, 0x7c, 0xc0, 0xc9, 0x80, 0x20, 0xe2, 0x1a, 0x45, 0xb6, 0x20, 0x13, 0x18, 0x91, -+ 0x61, 0xfa, 0xf1, 0x9d, 0x9f, 0xf2, 0x95, 0x78, 0xdd, 0xfe, 0x73, 0x9f, 0x09, 0x24, 0xa1, 0x4b -+}; -+ -+/* ecc sign or verf*/ -+static unsigned char ecc_except_kinv_secp384r1[] = { -+ /* -+ 0x71, 0x71, 0xb4, 0x5b, 0x79, 0x51, 0x94, 0x70, 0x53, 0xf9, 0x77, 0x02, 0x64, 0xef, 0xc4, 0xdb, -+ 0x64, 0xfc, 0xbe, 0x4e, 0x44, 0x4a, 0xc6, 0x54, 0x71, 0x69, 0x2e, 0x4a, 0x46, 0xa7, 0x2d, 0xa3*/ -+}; -+ -+static unsigned char ecc_except_e_secp384r1[] = { -+ /* -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04*/ -+}; -+ -+/* 521 */ -+static char ecdh_a_secp521r1[] = { -+ 0x01, 0xff, -+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc -+}; -+ -+static char ecdh_b_secp521r1[] = { -+ 0x00, 0xe6, 0x15, 0x1c, 0x79, 0x17, 0x8d, 0x1b, 0x5c, 0xfa, -+ 0xbc, 0x7e, 0x53, 0x82, 0xb9, 0x33, 0xbc, 0x16, 0x2c, 0x9f, 0x27, 0xed, 0x6d, 0x79, 0x34, 0xf2, -+ 0xba, 0x07, 0x92, 0x9e, 0x96, 0xea, 0xe9, 0xdd, 0xb5, 0xae, 0x57, 0x7a, 0x54, 0xe1, 0x3c, 0x71, -+ 0xa9, 0x6e, 0x3e, 0x3d, 0x88, 0xaf, 0x92, 0x77, 0xe8, 0xe6, 0x61, 0xfe, 0xed, 0x39, 0xbd, 0x11, -+ 0x19, 0x25, 0x3f, 0x09, 0x4e, 0x71, 0x25, 0xcc -+}; -+ -+static char ecdh_p_secp521r1[] = { -+ 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff -+}; -+ -+static char ecdh_n_secp521r1[] = { -+ 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x51, 0x86, 0x87, 0x83, 0xbf, 0x2f, 0x96, 0x6b, -+ 0x7f, 0xcc, 0x01, 0x48, 0xf7, 0x09, 0xa5, 0xd0, 0x3b, 0xb5, 0xc9, 0xb8, 0x89, 0x9c, 0x47, 0xae, -+ 0xbb, 0x6f, 0xb7, 0x1e, 0x91, 0x38, 0x64, 0x09 -+}; -+ -+static char ecdh_g_secp521r1[] = { -+ 0x00, 0xc6, -+ 0x85, 0x8e, 0x06, 0xb7, 0x04, 0x04, 0xe9, 0xcd, 0x9e, 0x3e, 0xcb, 0x66, 0x23, 0x95, 0xb4, 0x42, -+ 0x9c, 0x64, 0x81, 0x39, 0x05, 0x3f, 0xb5, 0x21, 0xf8, 0x28, 0xaf, 0x60, 0x6b, 0x4d, 0x3d, 0xba, -+ 0xa1, 0x4b, 0x5e, 0x77, 0xef, 0xe7, 0x59, 0x28, 0xfe, 0x1d, 0xc1, 0x27, 0xa2, 0xff, 0xa8, 0xde, -+ 0x33, 0x48, 0xb3, 0xc1, 0x85, 0x6a, 0x42, 0x9b, 0xf9, 0x7e, 0x7e, 0x31, 0xc2, 0xe5, 0xbd, 0x66, -+ -+ 0x01, 0x18, 0x39, 0x29, 0x6a, 0x78, 0x9a, 0x3b, 0xc0, 0x04, -+ 0x5c, 0x8a, 0x5f, 0xb4, 0x2c, 0x7d, 0x1b, 0xd9, 0x98, 0xf5, 0x44, 0x49, 0x57, 0x9b, 0x44, 0x68, -+ 0x17, 0xaf, 0xbd, 0x17, 0x27, 0x3e, 0x66, 0x2c, 0x97, 0xee, 0x72, 0x99, 0x5e, 0xf4, 0x26, 0x40, -+ 0xc5, 0x50, 0xb9, 0x01, 0x3f, 0xad, 0x07, 0x61, 0x35, 0x3c, 0x70, 0x86, 0xa2, 0x72, 0xc2, 0x40, -+ 0x88, 0xbe, 0x94, 0x76, 0x9f, 0xd1, 0x66, 0x50 -+}; -+ -+static char ecdh_da_secp521r1[] = { -+ 0x00, 0xe6, 0x15, 0x1c, 0x79, 0x17, 0x8d, 0x1b, 0x5c, 0xfa, -+ 0xbc, 0x7e, 0x53, 0x82, 0xb9, 0x33, 0xbc, 0x16, 0x2c, 0x9f, 0x27, 0xed, 0x6d, 0x79, 0x34, 0xf2, -+ 0xba, 0x07, 0x92, 0x9e, 0x96, 0xea, 0xe9, 0xdd, 0xb5, 0xae, 0x57, 0x7a, 0x54, 0xe1, 0x3c, 0x71, -+ 0xa9, 0x6e, 0x3e, 0x3d, 0x88, 0xaf, 0x92, 0x77, 0xe8, 0xe6, 0x61, 0xfe, 0xed, 0x39, 0xbd, 0x11, -+ 0x19, 0x25, 0x3f, 0x09, 0x4e, 0x71, 0x25, 0xcc -+}; -+ -+static char ecdh_except_b_pubkey_secp521r1[] = { -+ 0x04, -+ 0x01, 0x16, 0x0a, 0x52, 0xaa, 0x18, 0x96, 0x56, 0xf6, 0x27, 0xd1, 0x59, 0xbd, 0x7d, 0x0f, 0x57, -+ 0xfd, 0x34, 0xfa, 0x52, 0x1b, 0x04, 0xbd, 0x9a, 0x90, 0xd5, 0x8d, 0xad, 0x41, 0x32, 0x80, 0x14, -+ 0x6e, 0x73, 0x58, 0x83, 0x98, 0xeb, 0xb0, 0x6b, 0xb5, 0x63, 0x8e, 0xa1, 0x06, 0x04, 0x86, 0x94, -+ 0x9e, 0x34, 0x53, 0xf4, 0x93, 0x37, 0x1c, 0xbc, 0xbb, 0x7b, 0x4c, 0x97, 0x87, 0x32, 0x92, 0xf2, -+ 0x36, 0xdd, 0x01, 0x30, 0xa1, 0xa7, 0x68, 0x5a, 0x3e, 0x40, 0xe9, 0xbf, 0x3d, 0x2a, 0x1b, 0xbf, -+ 0x09, 0xa0, 0x51, 0xe8, 0x1d, 0x23, 0x27, 0x9c, 0x70, 0xb2, 0x18, 0x42, 0x02, 0x09, 0x02, 0x66, -+ 0xc7, 0xdb, 0x1a, 0xec, 0xe5, 0x20, 0x68, 0x31, 0x31, 0x6e, 0x70, 0xbe, 0x09, 0x72, 0x79, 0x42, -+ 0xe2, 0x3b, 0x3b, 0xd3, 0x0a, 0xe4, 0x9c, 0x34, 0x4c, 0x61, 0x74, 0x7c, 0xed, 0xe1, 0x84, 0x89, -+ 0x4b, 0xf4, 0xd5, 0xc3 -+}; -+ -+static char ecdh_cp_pubkey_secp521r1[] = { -+ 0x04, -+ 0x01, 0x16, 0x0a, 0x52, 0xaa, 0x18, 0x96, 0x56, 0xf6, 0x27, 0xd1, 0x59, 0xbd, 0x7d, 0x0f, 0x57, -+ 0xfd, 0x34, 0xfa, 0x52, 0x1b, 0x04, 0xbd, 0x9a, 0x90, 0xd5, 0x8d, 0xad, 0x41, 0x32, 0x80, 0x14, -+ 0x6e, 0x73, 0x58, 0x83, 0x98, 0xeb, 0xb0, 0x6b, 0xb5, 0x63, 0x8e, 0xa1, 0x06, 0x04, 0x86, 0x94, -+ 0x9e, 0x34, 0x53, 0xf4, 0x93, 0x37, 0x1c, 0xbc, 0xbb, 0x7b, 0x4c, 0x97, 0x87, 0x32, 0x92, 0xf2, -+ 0x36, 0xdd, 0x01, 0x30, 0xa1, 0xa7, 0x68, 0x5a, 0x3e, 0x40, 0xe9, 0xbf, 0x3d, 0x2a, 0x1b, 0xbf, -+ 0x09, 0xa0, 0x51, 0xe8, 0x1d, 0x23, 0x27, 0x9c, 0x70, 0xb2, 0x18, 0x42, 0x02, 0x09, 0x02, 0x66, -+ 0xc7, 0xdb, 0x1a, 0xec, 0xe5, 0x20, 0x68, 0x31, 0x31, 0x6e, 0x70, 0xbe, 0x09, 0x72, 0x79, 0x42, -+ 0xe2, 0x3b, 0x3b, 0xd3, 0x0a, 0xe4, 0x9c, 0x34, 0x4c, 0x61, 0x74, 0x7c, 0xed, 0xe1, 0x84, 0x89, -+ 0x4b, 0xf4, 0xd5, 0xc3 -+}; -+ -+static char ecdh_cp_sharekey_secp521r1[] = { -+ 0x01, 0xaf, 0x53, 0x84, 0x60, 0x59, 0x79, 0x64, 0x09, 0x5f, 0x2b, 0x4e, 0x82, 0xc4, 0x79, 0x21, -+ 0x55, 0x9c, 0xb0, 0x2f, 0x7d, 0xd4, 0x2f, 0x5d, 0xca, 0xfc, 0x4f, 0x70, 0x28, 0x6e, 0x2b, 0x13, -+ 0x2e, 0x5f, 0xf0, 0x1f, 0x50, 0x87, 0xf5, 0x82, 0x2f, 0xa7, 0x31, 0x5b, 0xfd, 0x5c, 0x0e, 0xef, -+ 0xaf, 0x5c, 0x80, 0x53, 0x48, 0xed, 0xcf, 0x14, 0xdc, 0x91, 0xc5, 0xc9, 0x1b, 0xff, 0xa8, 0x16, -+ 0x42, 0xa8 -+}; -+ -+/* ecc sign or verf*/ -+static unsigned char ecc_except_kinv_secp521r1[] = { -+ 0x71, 0x71, 0xb4, 0x5b, 0x79, 0x51, 0x94, 0x70, 0x53, 0xf9, 0x77, 0x02, 0x64, 0xef, 0xc4, 0xdb, -+ 0x64, 0xfc, 0xbe, 0x4e, 0x44, 0x4a, 0xc6, 0x54, 0x71, 0x69, 0x2e, 0x4a, 0x46, 0xa7, 0x2d, 0xa3 -+}; -+ -+static unsigned char ecc_except_e_secp521r1[] = { -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04 -+}; -+ -+static unsigned char sm2_k[] = { -+ 0x7c, 0x47, 0x81, 0x10, 0x54, 0xc6, 0xf9, 0x96, 0x13, 0xa5, 0x78, 0xeb, 0x84, 0x53, 0x70, 0x6c, -+ 0xcb, 0x96, 0x38, 0x4f, 0xe7, 0xdf, 0x5c, 0x17, 0x16, 0x71, 0xe7, 0x60, 0xbf, 0xa8, 0xbe, 0x3a -+}; -+ -+static unsigned char sm2_id[] = { -+ 0x41, 0x4c, 0x49, 0x43, 0x45, 0x31, 0x32, 0x33, 0x40, 0x59, 0x41, 0x48, 0x4f, 0x4f, 0x2e, 0x43, -+ 0x4f, 0x4d -+}; -+ -+static unsigned char sm2_plaintext[] = { -+ 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74 -+}; -+ -+static unsigned char sm2_plaintext_l[513] = { -+ 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74 -+}; -+ -+static unsigned char sm2_sign_data[] = { -+ /* r */ -+ 0xe6, 0xcd, 0x2d, 0xf9, 0x4f, 0x57, 0x40, 0x9e, 0x6b, 0xec, 0x8c, 0x0e, 0xf0, 0x44, 0x5c, 0xa4, -+ 0xfa, 0xea, 0x24, 0xe3, 0xf2, 0x28, 0x0e, 0xad, 0xc1, 0xa4, 0x1c, 0xf6, 0x24, 0x88, 0xaf, 0xd2, -+ -+ /* s */ -+ 0x98, 0x0e, 0x4f, 0xda, 0xbd, 0xe9, 0x9e, 0xc1, 0x6d, 0x59, 0x87, 0xd0, 0x23, 0x19, 0x84, 0xd1, -+ 0x94, 0x07, 0x7b, 0xb5, 0x43, 0xa8, 0x93, 0x00, 0xd4, 0xbb, 0xc7, 0xf8, 0x83, 0xb3, 0xf0, 0xc3, -+}; -+ -+static unsigned char sm2_ciphertext[] = { -+ /* c1 x */ -+ 0xe6, 0xcd, 0x2d, 0xf9, 0x4f, 0x57, 0x40, 0x9e, 0x6b, 0xec, 0x8c, 0x0e, 0xf0, 0x44, 0x5c, 0xa4, -+ 0xfa, 0xe9, 0xb7, 0x7e, 0x7e, 0xb4, 0xad, 0x46, 0x5c, 0x83, 0xb8, 0x8c, 0xbd, 0x23, 0x3c, 0x5e, -+ /* c1 y */ -+ 0x80, 0x89, 0xf0, 0xea, 0x2c, 0x84, 0x63, 0x45, 0xd8, 0x99, 0x7b, 0x5c, 0x2c, 0x75, 0x7d, 0x8e, -+ 0x5c, 0x99, 0x6e, 0x46, 0x85, 0x9f, 0x19, 0xd3, 0x7e, 0xb0, 0x3b, 0x24, 0xde, 0xab, 0xae, 0x30, -+ /* c3 */ -+ 0xfb, 0xcf, 0x24, 0x19, 0xf8, 0x61, 0x1c, 0xba, 0xb1, 0xd0, 0x6f, 0x4f, 0x84, 0xda, 0x9a, 0xe6, -+ 0x2d, 0x42, 0x27, 0xa1, 0x2b, 0x27, 0x26, 0x32, 0xc2, 0x6d, 0xda, 0x35, 0x54, 0xf9, 0xfc, 0xf8, -+ /* c2 */ -+ 0xdf, 0xe8, 0x59, 0xe8, 0x35, 0xb3, 0x98, 0x18, 0xca, 0x56, 0xaa, 0x29, 0x7b, 0x01, -+}; -+ -+static unsigned char sm2_ciphertext_l[609] = { -+ 0xe6, 0xcd, 0x2d, 0xf9, 0x4f, 0x57, 0x40, 0x9e, 0x6b, 0xec, 0x8c, 0x0e, 0xf0, 0x44, 0x5c, 0xa4, -+ 0xfa, 0xe9, 0xb7, 0x7e, 0x7e, 0xb4, 0xad, 0x46, 0x5c, 0x83, 0xb8, 0x8c, 0xbd, 0x23, 0x3c, 0x5e, -+ 0x80, 0x89, 0xf0, 0xea, 0x2c, 0x84, 0x63, 0x45, 0xd8, 0x99, 0x7b, 0x5c, 0x2c, 0x75, 0x7d, 0x8e, -+ 0x5c, 0x99, 0x6e, 0x46, 0x85, 0x9f, 0x19, 0xd3, 0x7e, 0xb0, 0x3b, 0x24, 0xde, 0xab, 0xae, 0x30, -+ 0xb6, 0x1b, 0x64, 0x56, 0x32, 0x5c, 0x33, 0x34, 0xa6, 0x68, 0x5f, 0x7a, 0x4c, 0x9b, 0xf0, 0x0c, -+ 0xbf, 0x4d, 0x2a, 0xbf, 0x2f, 0xc2, 0xf4, 0x42, 0x13, 0x61, 0xd4, 0xbb, 0x78, 0x29, 0x0c, 0x10, -+ 0xdf, 0xe8, 0x59, 0xe8, 0x35, 0xb3, 0x98, 0x18, 0xca, 0x56, 0xaa, 0x29, 0x7b, 0x01, 0xfc, 0xc3, -+ 0x78, 0xcd, 0x8e, 0x0f, 0x12, 0x24, 0xdc, 0xaf, 0xc1, 0x3c, 0x28, 0x3d, 0xeb, 0x7c, 0x46, 0x69, -+ 0x5f, 0x69, 0x4e, 0xc7, 0x86, 0x99, 0xa2, 0x41, 0x2b, 0xb4, 0xce, 0x91, 0xe5, 0x6c, 0x2e, 0x10, -+ 0x98, 0xcd, 0x1a, 0xf8, 0xac, 0x8a, 0x26, 0x92, 0xbd, 0x62, 0xe1, 0x27, 0x7e, 0xbd, 0xe1, 0xe6, -+ 0xec, 0x71, 0x9c, 0xa2, 0xfd, 0xf1, 0xa6, 0xaa, 0xf0, 0x4f, 0xa6, 0x05, 0x44, 0xd7, 0xc4, 0x8a, -+ 0xee, 0x61, 0x44, 0x41, 0xc5, 0x27, 0x76, 0x3e, 0x55, 0x0e, 0x70, 0xb7, 0xcc, 0x9d, 0x8e, 0xe4, -+ 0xea, 0x45, 0xc4, 0xce, 0xfc, 0x90, 0x44, 0xb7, 0xe9, 0x98, 0x63, 0x30, 0xfd, 0xca, 0x9f, 0x45, -+ 0x11, 0x08, 0x59, 0x80, 0xbd, 0xf2, 0xa5, 0x62, 0x9f, 0x5d, 0xb6, 0x1a, 0x5d, 0x3c, 0x72, 0x44, -+ 0x3e, 0x5a, 0x7c, 0xc4, 0x1a, 0xb1, 0x77, 0x3a, 0xb7, 0xfb, 0x01, 0x8b, 0xef, 0xc0, 0xf9, 0x87, -+ 0x46, 0x20, 0xb7, 0xef, 0x64, 0xc8, 0x9c, 0xeb, 0x26, 0x25, 0x8a, 0x6b, 0x4f, 0x75, 0x7c, 0x86, -+ 0xfd, 0xe4, 0x47, 0x40, 0x2c, 0xb7, 0x5c, 0x7e, 0x98, 0xad, 0xa3, 0x3f, 0x95, 0xa0, 0x1f, 0x47, -+ 0x3a, 0x1f, 0xde, 0xa0, 0x29, 0x78, 0x93, 0xcd, 0xc7, 0xc8, 0x29, 0xd6, 0xbe, 0x8d, 0xee, 0x76, -+ 0xd0, 0xed, 0x19, 0x2b, 0x0f, 0x57, 0x52, 0xf2, 0x19, 0x8a, 0x95, 0xcf, 0x23, 0x50, 0xbb, 0x13, -+ 0x5e, 0x89, 0xe6, 0x30, 0x87, 0x90, 0x28, 0xa5, 0x3a, 0xba, 0x16, 0x2f, 0x15, 0x98, 0x40, 0x82, -+ 0xd6, 0xbb, 0xc7, 0xaf, 0xa2, 0xf5, 0x33, 0xa7, 0xba, 0xb5, 0x29, 0x78, 0x53, 0x6a, 0x03, 0xd5, -+ 0x5a, 0x0d, 0x9c, 0xa4, 0x31, 0xab, 0x33, 0xc2, 0x19, 0x75, 0xbb, 0x25, 0x37, 0x44, 0x00, 0xd2, -+ 0xfb, 0xd9, 0xa0, 0xa0, 0xb6, 0x80, 0x4b, 0xd5, 0xc2, 0x2e, 0x80, 0xec, 0x86, 0x5a, 0x9f, 0x18, -+ 0x7b, 0x7f, 0x40, 0x92, 0xcb, 0x98, 0x60, 0x74, 0x60, 0x48, 0xd2, 0xe2, 0x56, 0x6d, 0xee, 0x2f, -+ 0x97, 0x96, 0x8b, 0xaa, 0x75, 0x94, 0xb7, 0x92, 0xfc, 0xd3, 0x37, 0xfd, 0x19, 0x6b, 0x1a, 0xba, -+ 0xf2, 0x33, 0x5e, 0x15, 0x93, 0xb0, 0xc9, 0x0f, 0x7c, 0x6e, 0x4b, 0xc0, 0xce, 0xf2, 0x22, 0x7f, -+ 0xfa, 0xff, 0x78, 0x90, 0xdb, 0x3c, 0xf5, 0x4d, 0x6a, 0x5d, 0x80, 0xcb, 0x62, 0x54, 0x67, 0xae, -+ 0x03, 0x82, 0xaa, 0xa3, 0x63, 0x4e, 0x01, 0x25, 0x32, 0x8f, 0xe9, 0x11, 0xe7, 0x12, 0x58, 0xda, -+ 0x3c, 0x4d, 0x5f, 0x1e, 0xae, 0x10, 0x6c, 0x12, 0x18, 0x5d, 0xa6, 0x7a, 0x37, 0x64, 0x83, 0x64, -+ 0xca, 0x78, 0xd6, 0x15, 0xbc, 0xb9, 0xb6, 0xfb, 0x54, 0xf3, 0xed, 0x13, 0xc3, 0x3e, 0xad, 0x3e, -+ 0x57, 0xb8, 0x8c, 0xc4, 0x9f, 0x7b, 0x1f, 0x40, 0x86, 0x13, 0x40, 0xfc, 0xba, 0x0a, 0x73, 0x98, -+ 0xf5, 0xee, 0xc7, 0x53, 0xbb, 0x87, 0xd6, 0x9d, 0x99, 0x78, 0x8b, 0xce, 0x4a, 0x1f, 0xf7, 0x46, -+ 0x93, 0xd5, 0x27, 0x7e, 0x69, 0xd1, 0xe9, 0xba, 0xfd, 0x06, 0x36, 0x44, 0x21, 0xee, 0x5a, 0x5a, -+ 0xb0, 0xdc, 0xd6, 0xe7, 0x4e, 0x28, 0x71, 0x36, 0x45, 0xa8, 0x89, 0x3b, 0x9e, 0xfd, 0x1f, 0x0b, -+ 0xcd, 0x86, 0xa7, 0xb9, 0xb1, 0x74, 0xd0, 0x51, 0x3d, 0x1e, 0x8d, 0xb3, 0x4f, 0x46, 0x9f, 0xfb, -+ 0x36, 0x43, 0x3d, 0xff, 0xaf, 0x19, 0x29, 0xb5, 0x41, 0x4c, 0x75, 0x4d, 0x75, 0x41, 0x5e, 0xe1, -+ 0x86, 0x5b, 0xbb, 0x94, 0x13, 0xd3, 0xa7, 0x23, 0xb4, 0xfb, 0x6f, 0x7f, 0x36, 0xfe, 0x9f, 0xec, -+ 0x80, 0x56, 0x5c, 0x79, 0x78, 0x9d, 0xed, 0xe0, 0x0a, 0x68, 0xd9, 0xc1, 0x19, 0x93, 0x94, 0x2c, -+ 0x3d, -+}; -+ -+static unsigned char sm2_pubkey[] = { -+ 0x04, -+ 0x09, 0xf9, 0xdf, 0x31, 0x1e, 0x54, 0x21, 0xa1, 0x50, 0xdd, 0x7d, 0x16, 0x1e, 0x4b, 0xc5, 0xc6, -+ 0x72, 0x17, 0x9f, 0xad, 0x18, 0x33, 0xfc, 0x07, 0x6b, 0xb0, 0x8f, 0xf3, 0x56, 0xf3, 0x50, 0x20, -+ 0xcc, 0xea, 0x49, 0x0c, 0xe2, 0x67, 0x75, 0xa5, 0x2d, 0xc6, 0xea, 0x71, 0x8c, 0xc1, 0xaa, 0x60, -+ 0x0a, 0xed, 0x05, 0xfb, 0xf3, 0x5e, 0x08, 0x4a, 0x66, 0x32, 0xf6, 0x07, 0x2d, 0xa9, 0xad, 0x13 -+}; -+ -+static unsigned char sm2_priv[] = { -+ 0x39, 0x45, 0x20, 0x8f, 0x7b, 0x21, 0x44, 0xb1, 0x3f, 0x36, 0xe3, 0x8a, 0xc6, 0xd3, 0x9f, 0x95, -+ 0x88, 0x93, 0x93, 0x69, 0x28, 0x60, 0xb5, 0x1a, 0x42, 0xfb, 0x81, 0xef, 0x4d, 0xf7, 0xc5, 0xb8 -+}; -+ -+static unsigned char sm2_digest[] = { -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0x00, 0x00, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74 -+}; -+#endif -diff --git a/uadk_tool/benchmark/hpre_uadk_benchmark.c b/uadk_tool/benchmark/hpre_uadk_benchmark.c -new file mode 100644 -index 0000000..e722c36 ---- /dev/null -+++ b/uadk_tool/benchmark/hpre_uadk_benchmark.c -@@ -0,0 +1,2433 @@ -+/* SPDX-License-Identifier: Apache-2.0 */ -+ -+#include -+#include "uadk_benchmark.h" -+ -+#include "hpre_uadk_benchmark.h" -+#include "hpre_protocol_data.h" -+#include "include/wd.h" -+#include "include/wd_rsa.h" -+#include "include/wd_dh.h" -+#include "include/wd_ecc.h" -+#include "include/wd_sched.h" -+ -+#define ECC_CURVE_ID 0x3 /* def set secp256k1 */ -+#define HPRE_TST_PRT printf -+#define ERR_OPTYPE 0xFF -+#define SM2_DG_SZ 1024 -+ -+struct hpre_rsa_key_in { -+ void *e; -+ void *p; -+ void *q; -+ u32 e_size; -+ u32 p_size; -+ u32 q_size; -+ void *data[]; -+}; -+ -+static __thread struct hpre_rsa_key_in *rsa_key_in = NULL; -+static const char rsa_m[8] = {0x54, 0x85, 0x9b, 0x34, 0x2c, 0x49, 0xea, 0x2a}; -+ -+struct rsa_async_tag { -+ handle_t sess; -+}; -+ -+//----------------------------------RSA param--------------------------------------// -+struct hpre_dh_param { -+ const void *x; -+ const void *p; -+ const void *g; -+ const void *except_pub_key; -+ const void *pub_key; -+ const void *share_key; -+ u32 x_size; -+ u32 p_size; -+ u32 g_size; -+ u32 pub_key_size; -+ u32 share_key_size; -+ u32 except_pub_key_size; -+ u32 key_bits; -+ u32 optype; -+}; -+ -+//----------------------------------DH param-------------------------------------// -+struct hpre_ecc_setup { -+ void *except_pub_key; // use in ecdh phase 2 -+ const void *pub_key; // use in ecdh phase 1 -+ const void *share_key; // use in ecdh phase 2 -+ const void *digest; //use in ecdsa sign -+ const void *k; // ecdsa sign in -+ const void *rp; // x coordinate of k*generator used in ecdsa -+ const void *sign; // ecdsa sign out or verf in -+ const void *priv_key; // use in ecdsa sign -+ void *msg; // sm2 plaintext,ciphertext or digest input -+ const void *userid; // sm2 user id -+ const void *ciphertext; // sm2 ciphertext -+ const void *plaintext; // sm2 plaintext -+ u32 key_size; -+ u32 share_key_size; -+ u32 except_pub_key_size; -+ u32 digest_size; -+ u32 k_size; -+ u32 rp_size; -+ u32 sign_size; -+ u32 priv_key_size; -+ u32 pub_key_size; -+ u32 msg_size; -+ u32 userid_size; -+ u32 ciphertext_size; -+ u32 plaintext_size; -+ u32 op_type; -+ u32 key_bits; -+ u32 nid; -+ u32 curve_id; // WD ecc curve_id -+}; -+ -+//----------------------------------ECC param-------------------------------------// -+ -+typedef struct uadk_thread_res { -+ u32 subtype; -+ u32 keybits; -+ u32 kmode; -+ u32 optype; -+ u32 td_id; -+} thread_data; -+ -+static struct wd_ctx_config g_ctx_cfg; -+static struct wd_sched *g_sched; -+static unsigned int g_thread_num; -+static unsigned int g_ctxnum; -+ -+static const char* const alg_operations[] = { -+ "GenKey", "ShareKey", "Encrypt", "Decrypt", "Sign", "Verify", -+}; -+ -+static void get_dh_param(u32 algtype, u32 *keysize) -+{ -+ switch(algtype) { -+ case DH_768: -+ *keysize = 768; -+ break; -+ case DH_1024: -+ *keysize = 1024; -+ break; -+ case DH_1536: -+ *keysize = 1536; -+ break; -+ case DH_2048: -+ *keysize = 2048; -+ break; -+ case DH_3072: -+ *keysize = 3072; -+ break; -+ case DH_4096: -+ *keysize = 4096; -+ break; -+ } -+} -+ -+static u32 get_dh_optype(u32 optype) -+{ -+ u32 op_type = 0; -+ -+ switch(optype) { -+ case 0: //GENKEY1 -+ op_type = WD_DH_PHASE1; -+ break; -+ case 1: //GENKEY12 -+ op_type = WD_DH_PHASE2; -+ break; -+ default: -+ HPRE_TST_PRT("failed to set dh op_type\n"); -+ HPRE_TST_PRT("DH Gen1: 0\n"); -+ HPRE_TST_PRT("DH Gen2: 1\n"); -+ return ERR_OPTYPE; -+ } -+ -+ return op_type; -+} -+ -+static void get_rsa_param(u32 algtype, u32 *keysize, u32 *mode) -+{ -+ switch(algtype) { -+ case RSA_1024: -+ *keysize = 1024; -+ *mode = 0; -+ break; -+ case RSA_2048: -+ *keysize = 2048; -+ *mode = 0; -+ break; -+ case RSA_3072: -+ *keysize = 3072; -+ *mode = 0; -+ break; -+ case RSA_4096: -+ *keysize = 4096; -+ *mode = 0; -+ break; -+ case RSA_1024_CRT: -+ *keysize = 1024; -+ *mode = 1; -+ break; -+ case RSA_2048_CRT: -+ *keysize = 2048; -+ *mode = 1; -+ break; -+ case RSA_3072_CRT: -+ *keysize = 3072; -+ *mode = 1; -+ break; -+ case RSA_4096_CRT: -+ *keysize = 4096; -+ *mode = 1; -+ break; -+ } -+} -+ -+static u32 get_rsa_optype(u32 optype) -+{ -+ u32 op_type = 0; -+ -+ switch(optype) { -+ case 0: //GENKEY1 -+ op_type = WD_RSA_GENKEY; -+ break; -+ case 4: //Sign -+ op_type = WD_RSA_SIGN; -+ break; -+ case 5: //Verf -+ op_type = WD_RSA_VERIFY; -+ break; -+ default: -+ HPRE_TST_PRT("failed to set rsa op_type\n"); -+ HPRE_TST_PRT("RSA Gen: 0\n"); -+ HPRE_TST_PRT("RSA Sign: 4\n"); -+ HPRE_TST_PRT("RSA Verf: 5\n"); -+ return ERR_OPTYPE; -+ } -+ -+ return op_type; -+} -+ -+static void get_ecc_param(u32 algtype, u32 *keysize) -+{ -+ switch(algtype) { -+ case ECDH_256: -+ *keysize = 256; -+ break; -+ case ECDH_384: -+ *keysize = 384; -+ break; -+ case ECDH_521: -+ *keysize = 521; -+ break; -+ case ECDSA_256: -+ *keysize = 256; -+ break; -+ case ECDSA_384: -+ *keysize = 384; -+ break; -+ case ECDSA_521: -+ *keysize = 521; -+ break; -+ case SM2_ALG: -+ *keysize = 256; -+ break; -+ case X25519_ALG: -+ *keysize = 256; -+ break; -+ case X448_ALG: -+ *keysize = 448; -+ break; -+ } -+} -+ -+static u32 get_ecc_optype(u32 subtype, u32 optype) -+{ -+ u32 op_type = 0; -+ -+ if (subtype == SM2_TYPE) { -+ switch (optype) { -+ case 0: -+ op_type = WD_SM2_KG; -+ break; -+ case 2: -+ op_type = WD_SM2_ENCRYPT; -+ break; -+ case 3: -+ op_type = WD_SM2_DECRYPT; -+ break; -+ case 4: -+ op_type = WD_SM2_SIGN; -+ break; -+ case 5: -+ op_type = WD_SM2_VERIFY; -+ break; -+ default: -+ HPRE_TST_PRT("failed to set SM2 op_type\n"); -+ HPRE_TST_PRT("SM2 KeyGen: 0\n"); -+ HPRE_TST_PRT("SM2 Encrypt: 2\n"); -+ HPRE_TST_PRT("SM2 Decrypt: 3\n"); -+ HPRE_TST_PRT("SM2 Sign: 4\n"); -+ HPRE_TST_PRT("SM2 Verify: 5\n"); -+ return ERR_OPTYPE; -+ } -+ } else if (subtype == ECDH_TYPE || -+ subtype == X25519_TYPE || subtype == X448_TYPE) { -+ switch(optype) { -+ case 0: //GENKEY -+ op_type = WD_ECXDH_GEN_KEY; -+ break; -+ case 1: //COMPUTEKEY -+ op_type = WD_ECXDH_COMPUTE_KEY; -+ break; -+ default: -+ HPRE_TST_PRT("failed to set ECDH op_type\n"); -+ HPRE_TST_PRT("ECDH GenKey: 0\n"); -+ HPRE_TST_PRT("ECDH ShareKey: 1\n"); -+ return ERR_OPTYPE; -+ } -+ } else if (subtype == ECDSA_TYPE) { -+ switch(optype) { -+ case 4: //Sign -+ op_type = WD_ECDSA_SIGN; -+ break; -+ case 5: //Verf -+ op_type = WD_ECDSA_VERIFY; -+ break; -+ default: -+ HPRE_TST_PRT("failed to set ECDSA op_type\n"); -+ HPRE_TST_PRT("ECDSA Sign: 4\n"); -+ HPRE_TST_PRT("ECDSA Verf: 5\n"); -+ return ERR_OPTYPE; -+ } -+ } -+ -+ return op_type; -+} -+ -+static int hpre_uadk_param_parse(thread_data *tddata, struct acc_option *options) -+{ -+ u32 algtype = options->algtype; -+ u32 optype = 0; -+ u32 keysize = 0; -+ u32 mode = 0; -+ -+ if (algtype >= RSA_1024 && algtype <= RSA_4096_CRT) { -+ get_rsa_param(algtype, &keysize, &mode); -+ optype = get_rsa_optype(options->optype); -+ } else if (algtype <= DH_4096) { -+ get_dh_param(algtype, &keysize); -+ optype = get_dh_optype(options->optype); -+ } else if (algtype <= X448_ALG) { -+ get_ecc_param(algtype, &keysize); -+ optype = get_ecc_optype(options->subtype, options->optype); -+ } else { -+ HPRE_TST_PRT("failed to set hpre alg!\n"); -+ return -EINVAL; -+ } -+ -+ if (optype == ERR_OPTYPE) -+ return -EINVAL; -+ -+ /* HPRE package length is keybits */ -+ options->pktlen = keysize >> 3; -+ tddata->keybits = keysize; -+ tddata->kmode = mode; -+ tddata->optype = optype; -+ -+ HPRE_TST_PRT("%s to run %s task!\n", options->algclass, -+ alg_operations[options->optype]); -+ -+ return 0; -+} -+ -+static int init_hpre_ctx_config(char *alg, int subtype, int mode) -+{ -+ struct uacce_dev_list *list; -+ struct sched_params param; -+ int i, max_node; -+ int ret = 0; -+ -+ max_node = numa_max_node() + 1; -+ if (max_node <= 0) -+ return -EINVAL; -+ -+ list = wd_get_accel_list(alg); -+ if (!list) { -+ HPRE_TST_PRT("failed to get %s device\n", alg); -+ return -ENODEV; -+ } -+ memset(&g_ctx_cfg, 0, sizeof(struct wd_ctx_config)); -+ g_ctx_cfg.ctx_num = g_ctxnum; -+ g_ctx_cfg.ctxs = calloc(g_ctxnum, sizeof(struct wd_ctx)); -+ if (!g_ctx_cfg.ctxs) -+ return -ENOMEM; -+ -+ for (i = 0; i < g_ctxnum; i++) { -+ g_ctx_cfg.ctxs[i].ctx = wd_request_ctx(list->dev); -+ g_ctx_cfg.ctxs[i].op_type = 0; // default op_type -+ g_ctx_cfg.ctxs[i].ctx_mode = (__u8)mode; -+ } -+ -+ switch(subtype) { -+ case RSA_TYPE: -+ g_sched = wd_sched_rr_alloc(SCHED_POLICY_RR, 1, max_node, wd_rsa_poll_ctx); -+ break; -+ case DH_TYPE: -+ g_sched = wd_sched_rr_alloc(SCHED_POLICY_RR, 1, max_node, wd_dh_poll_ctx); -+ break; -+ case ECDH_TYPE: -+ case ECDSA_TYPE: -+ case SM2_TYPE: -+ case X25519_TYPE: -+ case X448_TYPE: -+ g_sched = wd_sched_rr_alloc(SCHED_POLICY_RR, 1, max_node, wd_ecc_poll_ctx); -+ break; -+ default: -+ HPRE_TST_PRT("failed to parse alg subtype!\n"); -+ g_sched = NULL; -+ } -+ if (!g_sched) { -+ HPRE_TST_PRT("failed to alloc sched!\n"); -+ goto out; -+ } -+ -+ /* If there is no numa, we defualt config to zero */ -+ if (list->dev->numa_id < 0) -+ list->dev->numa_id = 0; -+ -+ g_sched->name = SCHED_SINGLE; -+ param.numa_id = list->dev->numa_id; -+ param.type = 0; -+ param.mode = mode; -+ param.begin = 0; -+ param.end = g_ctxnum - 1; -+ ret = wd_sched_rr_instance(g_sched, ¶m); -+ if (ret) { -+ HPRE_TST_PRT("failed to fill hpre sched data!\n"); -+ goto out; -+ } -+ -+ /* init */ -+ switch(subtype) { -+ case RSA_TYPE: -+ ret = wd_rsa_init(&g_ctx_cfg, g_sched); -+ break; -+ case DH_TYPE: -+ ret = wd_dh_init(&g_ctx_cfg, g_sched); -+ break; -+ case ECDH_TYPE: -+ case ECDSA_TYPE: -+ case SM2_TYPE: -+ case X25519_TYPE: -+ case X448_TYPE: -+ ret = wd_ecc_init(&g_ctx_cfg, g_sched); -+ break; -+ default: -+ ret = -EINVAL; -+ } -+ if (ret) { -+ HPRE_TST_PRT("failed to get hpre ctx!\n"); -+ goto out; -+ } -+ -+ wd_free_list_accels(list); -+ -+ return 0; -+out: -+ free(g_ctx_cfg.ctxs); -+ wd_sched_rr_release(g_sched); -+ -+ return ret; -+} -+ -+static void uninit_hpre_ctx_config(int subtype) -+{ -+ int i; -+ -+ /* uninit */ -+ switch(subtype) { -+ case RSA_TYPE: -+ wd_rsa_uninit(); -+ break; -+ case DH_TYPE: -+ wd_dh_uninit(); -+ break; -+ case ECDH_TYPE: -+ case ECDSA_TYPE: -+ case SM2_TYPE: -+ case X25519_TYPE: -+ case X448_TYPE: -+ wd_ecc_uninit(); -+ break; -+ default: -+ HPRE_TST_PRT("failed to parse alg subtype on uninit!\n"); -+ return; -+ } -+ -+ for (i = 0; i < g_ctx_cfg.ctx_num; i++) -+ wd_release_ctx(g_ctx_cfg.ctxs[i].ctx); -+ free(g_ctx_cfg.ctxs); -+ wd_sched_rr_release(g_sched); -+} -+ -+/*-------------------------------uadk benchmark main code-------------------------------------*/ -+ -+void *hpre_uadk_poll(void *data) -+{ -+ typedef int (*poll_ctx)(__u32 idx, __u32 expt, __u32 *count); -+ poll_ctx uadk_poll_ctx = NULL; -+ thread_data *pdata = (thread_data *)data; -+ u32 expt = ACC_QUEUE_SIZE * g_thread_num; -+ u32 id = pdata->td_id; -+ u32 last_time = 2; // poll need one more recv time -+ u32 count = 0; -+ u32 recv = 0; -+ int ret; -+ -+ if (id > g_ctxnum) -+ return NULL; -+ -+ switch(pdata->subtype) { -+ case RSA_TYPE: -+ uadk_poll_ctx = wd_rsa_poll_ctx; -+ break; -+ case DH_TYPE: -+ uadk_poll_ctx = wd_dh_poll_ctx; -+ break; -+ case ECDH_TYPE: -+ case ECDSA_TYPE: -+ case SM2_TYPE: -+ case X25519_TYPE: -+ case X448_TYPE: -+ uadk_poll_ctx = wd_ecc_poll_ctx; -+ break; -+ default: -+ HPRE_TST_PRT("<<<<<keybits >> 3); -+ -+ return NULL; -+} -+ -+static int get_rsa_key_from_sample(handle_t sess, char *privkey_file, -+ char *crt_privkey_file, u32 key_bits, u32 is_crt) -+{ -+ struct wd_dtb wd_e, wd_d, wd_n, wd_dq, wd_dp, wd_qinv, wd_q, wd_p; -+ int e_bytes, d_bytes, n_bytes, q_bytes, p_bytes, qinv_bytes; -+ u8 *p, *q, *n, *e, *d, *dmp1, *dmq1, *iqmp; -+ int dq_bytes, dp_bytes, bits, wd_lenth; -+ u32 key_size = key_bits >> 3; -+ char *wd_mem; -+ int ret = 0; -+ -+ memset(&wd_e, 0, sizeof(wd_e)); -+ memset(&wd_d, 0, sizeof(wd_d)); -+ memset(&wd_n, 0, sizeof(wd_n)); -+ memset(&wd_dq, 0, sizeof(wd_dq)); -+ memset(&wd_dp, 0, sizeof(wd_dp)); -+ memset(&wd_qinv, 0, sizeof(wd_qinv)); -+ memset(&wd_q, 0, sizeof(wd_q)); -+ memset(&wd_p, 0, sizeof(wd_p)); -+ -+ bits = wd_rsa_get_key_bits(sess); -+ switch (bits) { -+ case 1024: -+ e = rsa_e_1024; -+ n = rsa_n_1024; -+ p = rsa_p_1024; -+ q = rsa_q_1024; -+ dmp1 = rsa_dp_1024; -+ dmq1 = rsa_dq_1024; -+ iqmp = rsa_qinv_1024; -+ d = rsa_d_1024; -+ e_bytes = ARRAY_SIZE(rsa_e_1024); -+ n_bytes = ARRAY_SIZE(rsa_n_1024); -+ q_bytes = ARRAY_SIZE(rsa_q_1024); -+ p_bytes = ARRAY_SIZE(rsa_p_1024); -+ dq_bytes = ARRAY_SIZE(rsa_dq_1024); -+ dp_bytes = ARRAY_SIZE(rsa_dp_1024); -+ qinv_bytes = ARRAY_SIZE(rsa_qinv_1024); -+ d_bytes = ARRAY_SIZE(rsa_d_1024); -+ break; -+ case 2048: -+ e = rsa_e_2048; -+ n = rsa_n_2048; -+ p = rsa_p_2048; -+ q = rsa_q_2048; -+ dmp1 = rsa_dp_2048; -+ dmq1 = rsa_dq_2048; -+ iqmp = rsa_qinv_2048; -+ d = rsa_d_2048; -+ e_bytes = ARRAY_SIZE(rsa_e_2048); -+ n_bytes = ARRAY_SIZE(rsa_n_2048); -+ q_bytes = ARRAY_SIZE(rsa_q_2048); -+ p_bytes = ARRAY_SIZE(rsa_p_2048); -+ dq_bytes = ARRAY_SIZE(rsa_dq_2048); -+ dp_bytes = ARRAY_SIZE(rsa_dp_2048); -+ qinv_bytes = ARRAY_SIZE(rsa_qinv_2048); -+ d_bytes = ARRAY_SIZE(rsa_d_2048); -+ break; -+ case 3072: -+ e = rsa_e_3072; -+ n = rsa_n_3072; -+ p = rsa_p_3072; -+ q = rsa_q_3072; -+ dmp1 = rsa_dp_3072; -+ dmq1 = rsa_dq_3072; -+ iqmp = rsa_qinv_3072; -+ d = rsa_d_3072; -+ e_bytes = ARRAY_SIZE(rsa_e_3072); -+ n_bytes = ARRAY_SIZE(rsa_n_3072); -+ q_bytes = ARRAY_SIZE(rsa_q_3072); -+ p_bytes = ARRAY_SIZE(rsa_p_3072); -+ dq_bytes = ARRAY_SIZE(rsa_dq_3072); -+ dp_bytes = ARRAY_SIZE(rsa_dp_3072); -+ qinv_bytes = ARRAY_SIZE(rsa_qinv_3072); -+ d_bytes = ARRAY_SIZE(rsa_d_3072); -+ break; -+ case 4096: -+ e = rsa_e_4096; -+ n = rsa_n_4096; -+ p = rsa_p_4096; -+ q = rsa_q_4096; -+ dmp1 = rsa_dp_4096; -+ dmq1 = rsa_dq_4096; -+ iqmp = rsa_qinv_4096; -+ d = rsa_d_4096; -+ e_bytes = ARRAY_SIZE(rsa_e_4096); -+ n_bytes = ARRAY_SIZE(rsa_n_4096); -+ q_bytes = ARRAY_SIZE(rsa_q_4096); -+ p_bytes = ARRAY_SIZE(rsa_p_4096); -+ dq_bytes = ARRAY_SIZE(rsa_dq_4096); -+ dp_bytes = ARRAY_SIZE(rsa_dp_4096); -+ qinv_bytes = ARRAY_SIZE(rsa_qinv_4096); -+ d_bytes = ARRAY_SIZE(rsa_d_4096); -+ break; -+ default: -+ HPRE_TST_PRT("invalid key bits = %d!\n", bits); -+ return -EINVAL; -+ } -+ -+ wd_lenth = e_bytes + n_bytes + q_bytes + p_bytes + dq_bytes + -+ dp_bytes + qinv_bytes + d_bytes; -+ wd_mem = malloc(wd_lenth); -+ if (!wd_mem) { -+ HPRE_TST_PRT("failed to alloc rsa key memory!\n"); -+ return -EINVAL; -+ } -+ -+ wd_e.data = wd_mem; -+ wd_n.data = wd_e.data + e_bytes; -+ -+ memcpy(wd_e.data, e, e_bytes); -+ wd_e.dsize = e_bytes; -+ memcpy(wd_n.data, n, n_bytes); -+ wd_n.dsize = n_bytes; -+ if (wd_rsa_set_pubkey_params(sess, &wd_e, &wd_n)) { -+ HPRE_TST_PRT("failed to set rsa pubkey!\n"); -+ ret = -EINVAL; -+ goto gen_fail; -+ } -+ -+ if (rsa_key_in) { -+ memcpy(rsa_key_in->e, e, e_bytes); -+ memcpy(rsa_key_in->p, p, p_bytes); -+ memcpy(rsa_key_in->q, q, q_bytes); -+ rsa_key_in->e_size = e_bytes; -+ rsa_key_in->p_size = p_bytes; -+ rsa_key_in->q_size = q_bytes; -+ } -+ -+ if (is_crt) { -+ wd_q.data = wd_n.data + n_bytes; -+ wd_p.data = wd_q.data + q_bytes; -+ wd_dq.data = wd_p.data + p_bytes; -+ wd_dp.data = wd_dq.data + dq_bytes; -+ wd_qinv.data = wd_dp.data + dp_bytes; -+ -+ /* CRT mode private key */ -+ wd_dq.dsize = dq_bytes; -+ memcpy(wd_dq.data, dmq1, dq_bytes); -+ -+ wd_dp.dsize = dp_bytes; -+ memcpy(wd_dp.data, dmp1, dp_bytes); -+ -+ wd_q.dsize = q_bytes; -+ memcpy(wd_q.data, q, q_bytes); -+ -+ wd_p.dsize = p_bytes; -+ memcpy(wd_p.data, p, p_bytes); -+ -+ wd_qinv.dsize = qinv_bytes; -+ memcpy(wd_qinv.data, iqmp, qinv_bytes); -+ -+ if (wd_rsa_set_crt_prikey_params(sess, &wd_dq, -+ &wd_dp, &wd_qinv, -+ &wd_q, &wd_p)) { -+ HPRE_TST_PRT("failed to set rsa crt prikey!\n"); -+ ret = -EINVAL; -+ goto gen_fail; -+ } -+ -+ if (crt_privkey_file) { -+ memcpy(crt_privkey_file, wd_dq.data, (key_bits >> 4) * 5); -+ memcpy(crt_privkey_file + (key_bits >> 4) * 5, -+ wd_e.data, (key_bits >> 2)); -+ } -+ -+ } else { -+ //wd_rsa_get_prikey_params(prikey, &wd_d, &wd_n); -+ wd_d.data = wd_mem + (wd_lenth - d_bytes); -+ -+ /* common mode private key */ -+ wd_d.dsize = d_bytes; -+ memcpy(wd_d.data, d, d_bytes); -+ -+ if (wd_rsa_set_prikey_params(sess, &wd_d, &wd_n)) { -+ HPRE_TST_PRT("failed to set rsa prikey!\n"); -+ ret = -EINVAL; -+ goto gen_fail; -+ } -+ -+ -+ if (privkey_file) { -+ memcpy(privkey_file, wd_d.data, key_size); -+ memcpy(privkey_file + key_size, wd_n.data, key_size); -+ memcpy(privkey_file + 2 * key_size, wd_e.data, key_size); -+ memcpy(privkey_file + 3 * key_size, wd_n.data, key_size); -+ } -+ } -+ -+gen_fail: -+ free(wd_mem); -+ -+ return ret; -+} -+ -+static int get_hpre_keygen_opdata(handle_t sess, struct wd_rsa_req *req) -+{ -+ struct wd_rsa_pubkey *pubkey; -+ struct wd_rsa_prikey *prikey; -+ struct wd_dtb t_e, t_p, t_q; -+ struct wd_dtb *e, *p, *q; -+ -+ wd_rsa_get_pubkey(sess, &pubkey); -+ wd_rsa_get_pubkey_params(pubkey, &e, NULL); -+ wd_rsa_get_prikey(sess, &prikey); -+ -+ if (wd_rsa_is_crt(sess)) { -+ wd_rsa_get_crt_prikey_params(prikey, NULL , NULL, NULL, &q, &p); -+ } else { -+ e = &t_e; -+ p = &t_p; -+ q = &t_q; -+ e->data = rsa_key_in->e; -+ e->dsize = rsa_key_in->e_size; -+ p->data = rsa_key_in->p; -+ p->dsize = rsa_key_in->p_size; -+ q->data = rsa_key_in->q; -+ q->dsize = rsa_key_in->q_size; -+ } -+ -+ req->src = wd_rsa_new_kg_in(sess, e, p, q); -+ if (!req->src) { -+ HPRE_TST_PRT("failed to create rsa kgen in!\n"); -+ return -ENOMEM; -+ } -+ req->dst = wd_rsa_new_kg_out(sess); -+ if (!req->dst) { -+ HPRE_TST_PRT("failed to create rsa kgen out!\n"); -+ wd_rsa_del_kg_in(sess, req->src); -+ return -ENOMEM; -+ } -+ -+ return 0; -+} -+ -+static int get_ecc_curve(struct hpre_ecc_setup *setup, u32 cid) -+{ -+ switch (cid) { -+ case 0: // secp128R1 -+ setup->nid = 706; -+ setup->curve_id = WD_SECP128R1; -+ break; -+ case 1: // secp192K1 -+ setup->nid = 711; -+ setup->curve_id = WD_SECP192K1; -+ break; -+ case 2: // secp224R1 -+ setup->nid = 712; -+ setup->curve_id = WD_SECP224R1; -+ break; -+ case 3: // secp256K1 -+ setup->nid = 714; -+ setup->curve_id = WD_SECP256K1; -+ break; -+ case 4: // brainpoolP320R1 -+ setup->nid = 929; -+ setup->curve_id = WD_BRAINPOOLP320R1; -+ break; -+ case 5: // secp384R1 -+ setup->nid = 715; -+ setup->curve_id = WD_SECP384R1; -+ break; -+ case 6: // secp521R1 -+ setup->nid = 716; -+ setup->curve_id = WD_SECP521R1; -+ break; -+ default: -+ HPRE_TST_PRT("failed to get ecc curve id!\n"); -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ -+static int get_ecc_key_param(struct wd_ecc_curve *param, u32 key_bits) -+{ -+ u32 key_size = (key_bits + 7) / 8; -+ -+ switch (key_bits) { -+ case 128: -+ param->a.data = ecdh_a_secp128r1; -+ param->b.data = ecdh_b_secp128r1; -+ param->p.data = ecdh_p_secp128r1; -+ param->n.data = ecdh_n_secp128r1; -+ param->g.x.data = ecdh_g_secp128r1; -+ param->g.y.data = ecdh_g_secp128r1 + key_size; -+ case 192: -+ param->a.data = ecdh_a_secp192k1; -+ param->b.data = ecdh_b_secp192k1; -+ param->p.data = ecdh_p_secp192k1; -+ param->n.data = ecdh_n_secp192k1; -+ param->g.x.data = ecdh_g_secp192k1; -+ param->g.y.data = ecdh_g_secp192k1 + key_size; -+ case 224: -+ param->a.data = ecdh_a_secp224r1; -+ param->b.data = ecdh_b_secp224r1; -+ param->p.data = ecdh_p_secp224r1; -+ param->n.data = ecdh_n_secp224r1; -+ param->g.x.data = ecdh_g_secp224r1; -+ param->g.y.data = ecdh_g_secp224r1 + key_size; -+ case 256: -+ param->a.data = ecdh_a_secp256k1; -+ param->b.data = ecdh_b_secp256k1; -+ param->p.data = ecdh_p_secp256k1; -+ param->n.data = ecdh_n_secp256k1; -+ param->g.x.data = ecdh_g_secp256k1; -+ param->g.y.data = ecdh_g_secp256k1 + key_size; -+ case 320: -+ param->a.data = ecdh_a_secp320k1; -+ param->b.data = ecdh_b_secp320k1; -+ param->p.data = ecdh_p_secp320k1; -+ param->n.data = ecdh_n_secp320k1; -+ param->g.x.data = ecdh_g_secp320k1; -+ param->g.y.data = ecdh_g_secp320k1 + key_size; -+ case 384: -+ param->a.data = ecdh_a_secp384r1; -+ param->b.data = ecdh_b_secp384r1; -+ param->p.data = ecdh_p_secp384r1; -+ param->n.data = ecdh_n_secp384r1; -+ param->g.x.data = ecdh_g_secp384r1; -+ param->g.y.data = ecdh_g_secp384r1 + key_size; -+ case 521: -+ param->a.data = ecdh_a_secp521r1; -+ param->b.data = ecdh_b_secp521r1; -+ param->p.data = ecdh_p_secp521r1; -+ param->n.data = ecdh_n_secp521r1; -+ param->g.x.data = ecdh_g_secp521r1; -+ param->g.y.data = ecdh_g_secp521r1 + key_size; -+ default: -+ HPRE_TST_PRT("key_bits %d not find\n", key_bits); -+ return -EINVAL; -+ } -+ -+ param->a.bsize = key_size; -+ param->a.dsize = key_size; -+ param->b.bsize = key_size; -+ param->b.dsize = key_size; -+ param->p.bsize = key_size; -+ param->p.dsize = key_size; -+ param->n.bsize = key_size; -+ param->n.dsize = key_size; -+ param->g.x.bsize = key_size; -+ param->g.x.dsize = key_size; -+ param->g.y.bsize = key_size; -+ param->g.y.dsize = key_size; -+ -+ return 0; -+} -+ -+static int ecc_get_rand(char *out, size_t out_len, void *usr) -+{ -+ //int ret; -+ -+ get_rand_data((u8 *)out, out_len); -+ //ret = RAND_priv_bytes((void *)out, out_len); -+ //if (ret != 1) { -+ // HPRE_TST_PRT("failed to get ecc rand data:%d\n", ret); -+ // return -EINVAL; -+ //} -+ -+ return 0; -+} -+ -+static int get_ecc_param_from_sample(struct hpre_ecc_setup *setup, -+ u32 subtype, u32 key_bits) -+{ -+ int key_size = (key_bits + 7) / 8; -+ u32 len; -+ -+ setup->key_bits = key_bits; -+ -+ if (setup->nid == 714 || key_bits == 256) { // NID_secp256k1 -+ /* sm2 */ -+ if (subtype == SM2_TYPE) { -+ setup->priv_key = sm2_priv; -+ setup->priv_key_size = sizeof(sm2_priv); -+ setup->pub_key = sm2_pubkey; -+ setup->pub_key_size = sizeof(sm2_pubkey); -+ -+ len = SM2_DG_SZ; -+ setup->msg = malloc(len); -+ if (!setup->msg) -+ return -1; -+ memset(setup->msg, 0xFF, len); -+ -+ if (true) { // for msg_sigest mode -+ memcpy(setup->msg, sm2_digest, sizeof(sm2_digest)); -+ setup->msg_size = sizeof(sm2_digest); -+ } else { -+ memcpy(setup->msg, sm2_plaintext, sizeof(sm2_plaintext)); -+ setup->msg_size = sizeof(sm2_plaintext); -+ } -+ -+ if (setup->msg_size > 512) { -+ setup->ciphertext = sm2_ciphertext_l; -+ setup->ciphertext_size = sizeof(sm2_ciphertext_l); -+ setup->plaintext = sm2_plaintext_l; -+ setup->plaintext_size = sizeof(sm2_plaintext_l); -+ } else { -+ setup->ciphertext = sm2_ciphertext; -+ setup->ciphertext_size = sizeof(sm2_ciphertext); -+ setup->plaintext = sm2_plaintext; -+ setup->plaintext_size = sizeof(sm2_plaintext); -+ } -+ -+ setup->k = sm2_k; -+ setup->k_size = sizeof(sm2_k); -+ setup->userid = sm2_id; -+ setup->userid_size = sizeof(sm2_id); -+ setup->sign = sm2_sign_data; -+ setup->sign_size = sizeof(sm2_sign_data); -+ -+ } else { -+ setup->priv_key = ecdh_da_secp256k1; -+ setup->except_pub_key = ecdh_except_b_pubkey_secp256k1; -+ setup->pub_key = ecdh_cp_pubkey_secp256k1; -+ setup->share_key = ecdh_cp_sharekey_secp256k1; -+ setup->priv_key_size = sizeof(ecdh_da_secp256k1); -+ setup->except_pub_key_size = sizeof(ecdh_except_b_pubkey_secp256k1); -+ setup->pub_key_size = sizeof(ecdh_cp_pubkey_secp256k1); -+ setup->share_key_size = sizeof(ecdh_cp_sharekey_secp256k1); -+ -+ /* ecc sign */ -+ setup->msg = ecc_except_e_secp256k1; -+ setup->msg_size = sizeof(ecc_except_e_secp256k1); -+ setup->k = ecc_except_kinv_secp256k1; -+ setup->k_size = sizeof(ecc_except_kinv_secp256k1); -+ setup->rp = ecdh_cp_pubkey_secp256k1 + 1; -+ setup->rp_size = key_size; -+ -+ /* ecc verf */ -+ setup->sign = ecc_cp_sign_secp256k1; -+ setup->sign_size = sizeof(ecc_cp_sign_secp256k1); -+ } -+ } else if (setup->nid == 706 || key_bits == 128) { -+ setup->priv_key = ecdh_da_secp128r1; -+ setup->except_pub_key = ecdh_except_b_pubkey_secp128r1; -+ setup->pub_key = ecdh_cp_pubkey_secp128r1; -+ setup->share_key = ecdh_cp_sharekey_secp128r1; -+ setup->priv_key_size = sizeof(ecdh_da_secp128r1); -+ setup->except_pub_key_size = sizeof(ecdh_except_b_pubkey_secp128r1); -+ setup->pub_key_size = sizeof(ecdh_cp_pubkey_secp128r1); -+ setup->share_key_size = sizeof(ecdh_cp_sharekey_secp128r1); -+ -+ /* ecc sign */ -+ setup->msg = ecc_except_e_secp128r1; -+ setup->msg_size = sizeof(ecc_except_e_secp128r1); -+ setup->k = ecc_except_kinv_secp128r1; -+ setup->k_size = sizeof(ecc_except_kinv_secp128r1); -+ setup->rp = ecdh_cp_pubkey_secp128r1 + 1; -+ setup->rp_size = key_size; -+ -+ /* ecc verf */ -+ setup->sign = ecc_cp_sign_secp128r1; -+ setup->sign_size = sizeof(ecc_cp_sign_secp128r1); -+ -+ } else if (setup->nid == 711 || key_bits == 192) { -+ setup->priv_key = ecdh_da_secp192k1; -+ setup->except_pub_key = ecdh_except_b_pubkey_secp192k1; -+ setup->pub_key = ecdh_cp_pubkey_secp192k1; -+ setup->share_key = ecdh_cp_sharekey_secp192k1; -+ setup->priv_key_size = sizeof(ecdh_da_secp192k1); -+ setup->except_pub_key_size = sizeof(ecdh_except_b_pubkey_secp192k1); -+ setup->pub_key_size = sizeof(ecdh_cp_pubkey_secp192k1); -+ setup->share_key_size = sizeof(ecdh_cp_sharekey_secp192k1); -+ -+ /* ecc sign */ -+ setup->msg = ecc_except_e_secp192k1; -+ setup->msg_size = sizeof(ecc_except_e_secp192k1); -+ setup->k = ecc_except_kinv_secp192k1; -+ setup->k_size = sizeof(ecc_except_kinv_secp192k1); -+ setup->rp = ecdh_cp_pubkey_secp192k1 + 1; -+ setup->rp_size = key_size; -+ -+ /* ecc verf */ -+ setup->sign = ecc_cp_sign_secp256k1; -+ setup->sign_size = sizeof(ecc_cp_sign_secp256k1); -+ } else if (setup->nid == 712 || key_bits == 224) { -+ setup->priv_key = ecdh_da_secp224r1; -+ setup->except_pub_key = ecdh_except_b_pubkey_secp224r1; -+ setup->pub_key = ecdh_cp_pubkey_secp224r1; -+ setup->share_key = ecdh_cp_sharekey_secp224r1; -+ setup->priv_key_size = sizeof(ecdh_da_secp224r1); -+ setup->except_pub_key_size = sizeof(ecdh_except_b_pubkey_secp224r1); -+ setup->pub_key_size = sizeof(ecdh_cp_pubkey_secp224r1); -+ setup->share_key_size = sizeof(ecdh_cp_sharekey_secp224r1); -+ } else if (setup->nid == 929 || key_bits == 320) { -+ setup->priv_key = ecdh_da_secp320k1; -+ setup->except_pub_key = ecdh_except_b_pubkey_secp320k1; -+ setup->pub_key = ecdh_cp_pubkey_secp320k1; -+ setup->share_key = ecdh_cp_sharekey_secp320k1; -+ setup->priv_key_size = sizeof(ecdh_da_secp320k1); -+ setup->except_pub_key_size = sizeof(ecdh_except_b_pubkey_secp320k1); -+ setup->pub_key_size = sizeof(ecdh_cp_pubkey_secp320k1); -+ setup->share_key_size = sizeof(ecdh_cp_sharekey_secp320k1); -+ -+ /* ecc sign */ -+ setup->msg = ecc_except_e_secp320k1; -+ setup->msg_size = sizeof(ecc_except_e_secp320k1); -+ setup->k = ecc_except_kinv_secp320k1; -+ setup->k_size = sizeof(ecc_except_kinv_secp320k1); -+ setup->rp = ecdh_cp_pubkey_secp192k1 + 1; -+ setup->rp_size = key_size; -+ -+ /* ecc verf */ -+ setup->sign = ecc_cp_sign_secp256k1; -+ setup->sign_size = sizeof(ecc_cp_sign_secp256k1); -+ -+ } else if (setup->nid == 931 || key_bits == 384) { -+ setup->priv_key = ecdh_da_secp384r1; -+ setup->except_pub_key = ecdh_except_b_pubkey_secp384r1; -+ setup->pub_key = ecdh_cp_pubkey_secp384r1; -+ setup->share_key = ecdh_cp_sharekey_secp384r1; -+ setup->priv_key_size = sizeof(ecdh_da_secp384r1); -+ setup->except_pub_key_size = sizeof(ecdh_except_b_pubkey_secp384r1); -+ setup->pub_key_size = sizeof(ecdh_cp_pubkey_secp384r1); -+ setup->share_key_size = sizeof(ecdh_cp_sharekey_secp384r1); -+ -+ /* ecc sign */ -+ setup->msg = ecc_except_e_secp384r1; -+ setup->msg_size = sizeof(ecc_except_e_secp384r1); -+ setup->k = ecc_except_kinv_secp384r1; -+ setup->k_size = sizeof(ecc_except_kinv_secp384r1); -+ setup->rp = ecdh_cp_pubkey_secp384r1 + 1; -+ setup->rp_size = key_size; -+ -+ /* ecc verf */ -+ setup->sign = ecc_cp_sign_secp256k1; -+ setup->sign_size = sizeof(ecc_cp_sign_secp256k1); -+ } else if (setup->nid == 716 || key_bits == 521) { -+ setup->priv_key = ecdh_da_secp521r1; -+ setup->except_pub_key = ecdh_except_b_pubkey_secp521r1; -+ setup->pub_key = ecdh_cp_pubkey_secp521r1; -+ setup->share_key = ecdh_cp_sharekey_secp521r1; -+ setup->priv_key_size = sizeof(ecdh_da_secp521r1); -+ setup->except_pub_key_size = sizeof(ecdh_except_b_pubkey_secp521r1); -+ setup->pub_key_size = sizeof(ecdh_cp_pubkey_secp521r1); -+ setup->share_key_size = sizeof(ecdh_cp_sharekey_secp521r1); -+ -+ /* ecc sign */ -+ setup->msg = ecc_except_e_secp521r1; -+ setup->msg_size = sizeof(ecc_except_e_secp521r1); -+ setup->k = ecc_except_kinv_secp521r1; -+ setup->k_size = sizeof(ecc_except_kinv_secp521r1); -+ setup->rp = ecdh_cp_pubkey_secp521r1 + 1; -+ setup->rp_size = key_size; -+ -+ /* ecc verf */ -+ setup->sign = ecc_cp_sign_secp256k1; -+ setup->sign_size = sizeof(ecc_cp_sign_secp256k1); -+ -+ } else { -+ HPRE_TST_PRT("init test sess setup not find this bits %d or nid %d\n", -+ key_bits, setup->nid); -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ -+static void *rsa_uadk_sync_run(void *arg) -+{ -+ thread_data *pdata = (thread_data *)arg; -+ int key_size = pdata->keybits >> 3; -+ struct wd_rsa_sess_setup setup; -+ struct wd_rsa_req req; -+ void *key_info = NULL; -+ handle_t h_sess; -+ u32 count = 0; -+ int ret; -+ -+ memset(&setup, 0, sizeof(setup)); -+ memset(&req, 0, sizeof(req)); -+ setup.key_bits = pdata->keybits; -+ setup.is_crt = pdata->kmode; -+ -+ h_sess = wd_rsa_alloc_sess(&setup); -+ if (!h_sess) -+ return NULL; -+ -+ key_info = malloc(key_size * 16); -+ if (!key_info) { -+ HPRE_TST_PRT("failed to alloc RSA key info!\n"); -+ return NULL; -+ } -+ memset(key_info, 0, key_size * 16); -+ -+ rsa_key_in = malloc(2 * key_size + sizeof(struct hpre_rsa_key_in)); -+ if (!rsa_key_in) { -+ HPRE_TST_PRT("failed to alloc RSA key input param!\n"); -+ goto key_release; -+ } -+ rsa_key_in->e = rsa_key_in + 1; -+ rsa_key_in->p = rsa_key_in->e + key_size; -+ rsa_key_in->q = rsa_key_in->p + (key_size >> 1); -+ -+ ret = get_rsa_key_from_sample(h_sess, key_info, key_info, -+ pdata->keybits, pdata->kmode); -+ if (ret) { -+ HPRE_TST_PRT("failed to get sample key data!\n"); -+ goto sample_release; -+ } -+ -+ req.src_bytes = key_size; -+ req.dst_bytes = key_size; -+ req.op_type = pdata->optype; -+ if (req.op_type == WD_RSA_GENKEY) { -+ ret = get_hpre_keygen_opdata(h_sess, &req); -+ if (ret){ -+ HPRE_TST_PRT("failed to fill rsa key gen req!\n"); -+ goto sample_release; -+ } -+ } else { -+ req.src = malloc(key_size); -+ if (!req.src) { -+ HPRE_TST_PRT("failed to alloc rsa in buffer!\n"); -+ goto sample_release; -+ } -+ memset(req.src, 0, req.src_bytes); -+ memcpy(req.src + key_size - sizeof(rsa_m), rsa_m, sizeof(rsa_m)); -+ req.dst = malloc(key_size); -+ if (!req.dst) { -+ HPRE_TST_PRT("failed to alloc rsa out buffer!\n"); -+ goto src_release; -+ } -+ } -+ -+ do { -+ ret = wd_do_rsa_sync(h_sess, &req); -+ if (ret || req.status) { -+ HPRE_TST_PRT("failed to do rsa task, status: %d\n", req.status); -+ goto dst_release; -+ } -+ -+ count++; -+ if (get_run_state() == 0) -+ break; -+ } while(true); -+ -+ /* clean output buffer remainings in the last time operation */ -+ if (req.op_type == WD_RSA_GENKEY) { -+ char *data; -+ int len; -+ -+ len = wd_rsa_kg_out_data((void *)req.dst, &data); -+ if (len < 0) { -+ HPRE_TST_PRT("failed to wd rsa get key gen out data!\n"); -+ goto sample_release; -+ } -+ memset(data, 0, len); -+ -+ wd_rsa_del_kg_in(h_sess, req.src); -+ req.src = NULL; -+ wd_rsa_del_kg_out(h_sess, req.dst); -+ req.dst = NULL; -+ } -+ -+dst_release: -+ if (req.dst) -+ free(req.dst); -+src_release: -+ if (req.src) -+ free(req.src); -+sample_release: -+ free(rsa_key_in); -+key_release: -+ free(key_info); -+ -+ wd_rsa_free_sess(h_sess); -+ add_recv_data(count, key_size); -+ -+ return NULL; -+} -+ -+static void rsa_async_cb(void *req_t) -+{ -+ //struct wd_rsa_req *req = req_t; -+ //struct rsa_async_tag *tag = req->cb_param; -+ //enum wd_rsa_op_type op_type = req->op_type; -+ //handle_t h_sess = tag->sess; -+ -+ return; -+} -+ -+static void *rsa_uadk_async_run(void *arg) -+{ -+ thread_data *pdata = (thread_data *)arg; -+ int key_size = pdata->keybits >> 3; -+ struct rsa_async_tag *tag; -+ struct wd_rsa_sess_setup setup; -+ struct wd_rsa_req req; -+ void *key_info = NULL; -+ int try_cnt = 0; -+ handle_t h_sess; -+ u32 count = 0; -+ int i, ret; -+ -+ memset(&setup, 0, sizeof(setup)); -+ memset(&req, 0, sizeof(req)); -+ setup.key_bits = pdata->keybits; -+ setup.is_crt = pdata->kmode; -+ -+ h_sess = wd_rsa_alloc_sess(&setup); -+ if (!h_sess) -+ return NULL; -+ -+ key_info = malloc(key_size * 16); -+ if (!key_info) { -+ HPRE_TST_PRT("failed to alloc RSA key info!\n"); -+ return NULL; -+ } -+ memset(key_info, 0, key_size * 16); -+ -+ rsa_key_in = malloc(2 * key_size + sizeof(struct hpre_rsa_key_in)); -+ if (!rsa_key_in) { -+ HPRE_TST_PRT("failed to alloc RSA key input param!\n"); -+ goto key_release; -+ } -+ rsa_key_in->e = rsa_key_in + 1; -+ rsa_key_in->p = rsa_key_in->e + key_size; -+ rsa_key_in->q = rsa_key_in->p + (key_size >> 1); -+ -+ ret = get_rsa_key_from_sample(h_sess, key_info, key_info, -+ pdata->keybits, pdata->kmode); -+ if (ret) { -+ HPRE_TST_PRT("failed to get sample key data!\n"); -+ goto sample_release; -+ } -+ -+ req.src_bytes = key_size; -+ req.dst_bytes = key_size; -+ req.op_type = pdata->optype; -+ if (req.op_type == WD_RSA_GENKEY) { -+ ret = get_hpre_keygen_opdata(h_sess, &req); -+ if (ret){ -+ HPRE_TST_PRT("failed to fill rsa key gen req!\n"); -+ goto sample_release; -+ } -+ } else { -+ req.src = malloc(key_size); -+ if (!req.src) { -+ HPRE_TST_PRT("failed to alloc rsa in buffer!\n"); -+ goto sample_release; -+ } -+ memset(req.src, 0, req.src_bytes); -+ memcpy(req.src + key_size - sizeof(rsa_m), rsa_m, sizeof(rsa_m)); -+ req.dst = malloc(key_size); -+ if (!req.dst) { -+ HPRE_TST_PRT("failed to alloc rsa out buffer!\n"); -+ goto src_release; -+ } -+ } -+ -+ tag = malloc(sizeof(*tag) * MAX_POOL_LENTH); -+ if (!tag) { -+ HPRE_TST_PRT("failed to malloc rsa tag!\n"); -+ goto dst_release; -+ } -+ req.cb = rsa_async_cb; -+ -+ do { -+ if (get_run_state() == 0) -+ break; -+ -+ try_cnt = 0; -+ i = count % MAX_POOL_LENTH; -+ tag[i].sess = h_sess; -+ req.cb_param = &tag[i]; -+ -+ ret = wd_do_rsa_async(h_sess, &req); -+ if (ret == -WD_EBUSY) { -+ usleep(SEND_USLEEP * try_cnt); -+ try_cnt++; -+ if (try_cnt > MAX_TRY_CNT) { -+ HPRE_TST_PRT("Test RSA send fail %d times!\n", MAX_TRY_CNT); -+ try_cnt = 0; -+ } -+ continue; -+ } else if (ret) { -+ HPRE_TST_PRT("failed to do rsa async task!\n"); -+ goto tag_release; -+ } -+ count++; -+ } while(true); -+ -+ /* clean output buffer remainings in the last time operation */ -+ if (req.op_type == WD_RSA_GENKEY) { -+ char *data; -+ int len; -+ -+ len = wd_rsa_kg_out_data((void *)req.dst, &data); -+ if (len < 0) { -+ HPRE_TST_PRT("failed to wd rsa get key gen out data!\n"); -+ goto tag_release; -+ } -+ memset(data, 0, len); -+ -+ wd_rsa_del_kg_in(h_sess, req.src); -+ req.src = NULL; -+ wd_rsa_del_kg_out(h_sess, req.dst); -+ req.dst = NULL; -+ } -+ -+tag_release: -+ free(tag); -+dst_release: -+ if (req.dst) -+ free(req.dst); -+src_release: -+ if (req.src) -+ free(req.src); -+sample_release: -+ free(rsa_key_in); -+key_release: -+ free(key_info); -+ -+ wd_rsa_free_sess(h_sess); -+ add_send_complete(); -+ -+ return NULL; -+} -+ -+static int get_dh_param_from_sample(struct hpre_dh_param *setup, -+ u32 key_bits, u8 is_g2) -+{ -+ setup->key_bits = key_bits; -+ -+ switch (key_bits) { -+ case 768: -+ setup->x = dh_xa_768; -+ setup->p = dh_p_768; -+ setup->except_pub_key = dh_except_b_pubkey_768; -+ setup->pub_key = dh_except_a_pubkey_768; -+ setup->share_key = dh_share_key_768; -+ setup->x_size = sizeof(dh_xa_768); -+ setup->p_size = sizeof(dh_p_768); -+ setup->except_pub_key_size = sizeof(dh_except_b_pubkey_768); -+ setup->pub_key_size = sizeof(dh_except_a_pubkey_768); -+ setup->share_key_size = sizeof(dh_share_key_768); -+ break; -+ case 1024: -+ setup->x = dh_xa_1024; -+ setup->p = dh_p_1024; -+ setup->except_pub_key = dh_except_b_pubkey_1024; -+ setup->pub_key = dh_except_a_pubkey_1024; -+ setup->share_key = dh_share_key_1024; -+ setup->x_size = sizeof(dh_xa_1024); -+ setup->p_size = sizeof(dh_p_1024); -+ setup->except_pub_key_size = sizeof(dh_except_b_pubkey_1024); -+ setup->pub_key_size = sizeof(dh_except_a_pubkey_1024); -+ setup->share_key_size = sizeof(dh_share_key_1024); -+ break; -+ case 1536: -+ setup->x = dh_xa_1536; -+ setup->p = dh_p_1536; -+ setup->except_pub_key = dh_except_b_pubkey_1536; -+ setup->pub_key = dh_except_a_pubkey_1536; -+ setup->share_key = dh_share_key_1536; -+ setup->x_size = sizeof(dh_xa_1536); -+ setup->p_size = sizeof(dh_p_1536); -+ setup->except_pub_key_size = sizeof(dh_except_b_pubkey_1536); -+ setup->pub_key_size = sizeof(dh_except_a_pubkey_1536); -+ setup->share_key_size = sizeof(dh_share_key_1536); -+ break; -+ case 2048: -+ setup->x = dh_xa_2048; -+ setup->p = dh_p_2048; -+ setup->except_pub_key = dh_except_b_pubkey_2048; -+ setup->pub_key = dh_except_a_pubkey_2048; -+ setup->share_key = dh_share_key_2048; -+ setup->x_size = sizeof(dh_xa_2048); -+ setup->p_size = sizeof(dh_p_2048); -+ setup->except_pub_key_size = sizeof(dh_except_b_pubkey_2048); -+ setup->pub_key_size = sizeof(dh_except_a_pubkey_2048); -+ setup->share_key_size = sizeof(dh_share_key_2048); -+ break; -+ case 3072: -+ setup->x = dh_xa_3072; -+ setup->p = dh_p_3072; -+ setup->except_pub_key = dh_except_b_pubkey_3072; -+ setup->pub_key = dh_except_a_pubkey_3072; -+ setup->share_key = dh_share_key_3072; -+ setup->x_size = sizeof(dh_xa_3072); -+ setup->p_size = sizeof(dh_p_3072); -+ setup->except_pub_key_size = sizeof(dh_except_b_pubkey_3072); -+ setup->pub_key_size = sizeof(dh_except_a_pubkey_3072); -+ setup->share_key_size = sizeof(dh_share_key_3072); -+ break; -+ case 4096: -+ setup->x = dh_xa_4096; -+ setup->p = dh_p_4096; -+ setup->except_pub_key = dh_except_b_pubkey_4096; -+ setup->pub_key = dh_except_a_pubkey_4096; -+ setup->share_key = dh_share_key_4096; -+ setup->x_size = sizeof(dh_xa_4096); -+ setup->p_size = sizeof(dh_p_4096); -+ setup->except_pub_key_size = sizeof(dh_except_b_pubkey_4096); -+ setup->pub_key_size = sizeof(dh_except_a_pubkey_4096); -+ setup->share_key_size = sizeof(dh_share_key_4096); -+ break; -+ default: -+ HPRE_TST_PRT("failed to find dh keybits %u\n", key_bits); -+ return -EINVAL; -+ } -+ -+ if (is_g2) { -+ setup->g = dh_g_2; -+ } else { -+ setup->g = dh_g_5; -+ } -+ setup->g_size = 1; -+ -+ return 0; -+} -+ -+static int get_dh_opdata_param(handle_t h_sess, struct wd_dh_req *req, -+ struct hpre_dh_param *setup, int key_size) -+{ -+ unsigned char *ag_bin = NULL; -+ struct wd_dtb ctx_g; -+ int ret; -+ -+ ag_bin = malloc(2 * key_size); -+ if (!ag_bin) -+ return -ENOMEM; -+ -+ memset(ag_bin, 0, 2 * key_size); -+ req->pv = ag_bin; -+ -+ req->x_p = malloc(2 * key_size); -+ if (!req->x_p) -+ goto ag_error; -+ -+ memset(req->x_p, 0, 2 * key_size); -+ -+ req->pri = malloc(2 * key_size); -+ if (!req->pri) -+ goto xp_error; -+ -+ memset(req->pri, 0, 2 * key_size); -+ req->pri_bytes = 2 * key_size; -+ -+ ctx_g.data = malloc(key_size); -+ if (!ctx_g.data) -+ goto ctx_release; -+ -+ if (setup->optype == WD_DH_PHASE1) { // GEN1 -+ memcpy(req->x_p, setup->x, setup->x_size); -+ memcpy(req->x_p + key_size, setup->p, setup->p_size); -+ memcpy(ctx_g.data, setup->g, setup->g_size); -+ req->pbytes = setup->p_size; -+ req->xbytes = setup->x_size; -+ ctx_g.dsize = setup->g_size; -+ ctx_g.bsize = key_size; -+ -+ ret = wd_dh_set_g(h_sess, &ctx_g); -+ if (ret) -+ HPRE_TST_PRT("wd_dh_set_g run failed\n"); -+ } else { // GEN1 -+ memcpy(req->x_p, setup->x, setup->x_size); -+ memcpy(req->x_p + key_size, setup->p, setup->p_size); -+ memcpy(req->pv, setup->except_pub_key, setup->except_pub_key_size); -+ req->pbytes = setup->p_size; -+ req->xbytes = setup->x_size; -+ req->pvbytes = setup->except_pub_key_size; -+ } -+ -+ free(ctx_g.data); -+ -+ return 0; -+ -+ctx_release: -+ free(req->pri); -+xp_error: -+ free(req->x_p); -+ag_error: -+ free(req->pv); -+ -+ return -ENOMEM; -+} -+ -+static void dh_async_cb(void *req_t) -+{ -+ //struct wd_dh_req *req = req_t; -+ //struct rsa_async_tag *tag = req->cb_param; -+ //enum wd_rsa_op_type op_type = req->op_type; -+ //handle_t h_sess = tag->sess; -+ -+ return; -+} -+ -+static void *dh_uadk_async_run(void *arg) -+{ -+ thread_data *pdata = (thread_data *)arg; -+ int key_size = pdata->keybits >> 3; -+ struct wd_dh_sess_setup dh_setup; -+ struct rsa_async_tag *tag; -+ struct hpre_dh_param param; -+ struct wd_dh_req req; -+ handle_t h_sess; -+ int try_cnt = 0; -+ u32 count = 0; -+ int i, ret; -+ -+ memset(&dh_setup, 0, sizeof(dh_setup)); -+ memset(&req, 0, sizeof(req)); -+ dh_setup.key_bits = pdata->keybits; -+ if (pdata->optype == WD_DH_PHASE2) -+ dh_setup.is_g2 = true; // G1 is 0; G2 is 1; -+ -+ h_sess = wd_dh_alloc_sess(&dh_setup); -+ if (!h_sess) -+ return NULL; -+ -+ ret = get_dh_param_from_sample(¶m, pdata->keybits, pdata->kmode); -+ if (ret) -+ goto sess_release; -+ -+ param.optype = pdata->optype; -+ req.op_type = pdata->optype; -+ ret = get_dh_opdata_param(h_sess, &req, ¶m, key_size); -+ if (ret){ -+ HPRE_TST_PRT("failed to fill dh key gen req!\n"); -+ goto param_release; -+ } -+ -+ tag = malloc(sizeof(*tag) * MAX_POOL_LENTH); -+ if (!tag) { -+ HPRE_TST_PRT("failed to malloc rsa tag!\n"); -+ goto param_release; -+ } -+ req.cb = dh_async_cb; -+ -+ do { -+ if (get_run_state() == 0) -+ break; -+ -+ try_cnt = 0; -+ i = count % MAX_POOL_LENTH; -+ tag[i].sess = h_sess; -+ req.cb_param = &tag[i]; -+ -+ ret = wd_do_dh_async(h_sess, &req); -+ if (ret == -WD_EBUSY) { -+ usleep(SEND_USLEEP * try_cnt); -+ try_cnt++; -+ if (try_cnt > MAX_TRY_CNT) { -+ HPRE_TST_PRT("Test DH send fail %d times!\n", MAX_TRY_CNT); -+ try_cnt = 0; -+ } -+ continue; -+ } else if (ret) { -+ HPRE_TST_PRT("failed to do DH async task!\n"); -+ goto tag_release; -+ } -+ count++; -+ } while(true); -+ -+tag_release: -+ free(tag); -+param_release: -+ free(req.x_p); -+ free(req.pv); -+ free(req.pri); -+sess_release: -+ wd_dh_free_sess(h_sess); -+ add_send_complete(); -+ -+ return NULL; -+} -+ -+static void *dh_uadk_sync_run(void *arg) -+{ -+ thread_data *pdata = (thread_data *)arg; -+ int key_size = pdata->keybits >> 3; -+ struct wd_dh_sess_setup dh_setup; -+ struct hpre_dh_param setup; -+ struct wd_dh_req req; -+ handle_t h_sess; -+ u32 count = 0; -+ int ret; -+ -+ memset(&dh_setup, 0, sizeof(dh_setup)); -+ memset(&req, 0, sizeof(req)); -+ dh_setup.key_bits = pdata->keybits; -+ if (pdata->optype == WD_DH_PHASE2) -+ dh_setup.is_g2 = true; // G1 is 0; G2 is 1; -+ -+ h_sess = wd_dh_alloc_sess(&dh_setup); -+ if (!h_sess) -+ return NULL; -+ -+ ret = get_dh_param_from_sample(&setup, pdata->keybits, pdata->kmode); -+ if (ret) -+ goto sess_release; -+ -+ setup.optype = pdata->optype; -+ req.op_type = pdata->optype; -+ ret = get_dh_opdata_param(h_sess, &req, &setup, key_size); -+ if (ret){ -+ HPRE_TST_PRT("failed to fill dh key gen req!\n"); -+ goto param_release; -+ } -+ -+ do { -+ ret = wd_do_dh_sync(h_sess, &req); -+ if (ret || req.status) { -+ HPRE_TST_PRT("failed to do dh task, status: %d\n", req.status); -+ goto param_release; -+ } -+ -+ count++; -+ if (get_run_state() == 0) -+ break; -+ } while(true); -+ -+param_release: -+ free(req.x_p); -+ free(req.pv); -+ free(req.pri); -+sess_release: -+ wd_dh_free_sess(h_sess); -+ add_recv_data(count, key_size); -+ -+ return NULL; -+} -+ -+static int hpre_compute_hash(const char *in, size_t in_len, -+ char *out, size_t out_len, void *usr) -+{ -+ /* perf test for none hash check */ -+ return 0; -+} -+ -+static int ecdsa_param_fill(handle_t h_sess, struct wd_ecc_req *req, -+ struct wd_ecc_key *ecc_key, struct hpre_ecc_setup *setup, -+ thread_data *pdata) -+{ -+ int key_insize = (pdata->keybits + 7) / 8; -+ u32 optype = pdata->optype; -+ struct wd_ecc_out *ecc_out = NULL; -+ struct wd_ecc_in *ecc_in = NULL; -+ struct wd_ecc_point pub; -+ struct wd_dtb d, e, k; -+ int ret = 0; -+ -+ if (optype == WD_ECDSA_SIGN) {// Sign -+ ecc_out = wd_ecdsa_new_sign_out(h_sess); -+ if (!ecc_out) { -+ HPRE_TST_PRT("failed to get ecdsa out!\n"); -+ return -ENOMEM; -+ } -+ -+ d.data = (void *)setup->priv_key; -+ d.dsize = setup->priv_key_size; -+ d.bsize = setup->priv_key_size; -+ ret = wd_ecc_set_prikey(ecc_key, &d); -+ if (ret) { -+ HPRE_TST_PRT("failed to set ecdsa prikey!\n"); -+ goto del_ecc_out; -+ } -+ -+ pub.x.data = (void *)setup->pub_key + 1; -+ pub.x.dsize = key_insize; -+ pub.x.bsize = key_insize; -+ pub.y.data = pub.x.data + key_insize; -+ pub.y.dsize = key_insize; -+ pub.y.bsize = key_insize; -+ ret = wd_ecc_set_pubkey(ecc_key, &pub); -+ if (ret) { -+ HPRE_TST_PRT("failed to set ecdsa pubkey!\n"); -+ goto del_ecc_out; -+ } -+ -+ e.data = (void *)setup->msg; -+ e.dsize = setup->msg_size; -+ e.bsize = key_insize; -+ -+ k.data = (void *)setup->k; -+ k.dsize = setup->k_size; -+ k.bsize = key_insize; -+ ecc_in = wd_ecdsa_new_sign_in(h_sess, &e, &k); -+ if (!ecc_in) { -+ HPRE_TST_PRT("failed to get ecdsa sign in!\n"); -+ ret = -ENOMEM; -+ goto del_ecc_out; -+ } -+ -+ req->src = ecc_in; -+ req->dst = ecc_out; -+ } else { // Verf -+ pub.x.data = (void *)setup->pub_key + 1; -+ pub.x.dsize = key_insize; -+ pub.x.bsize = key_insize; -+ pub.y.data = pub.x.data + key_insize; -+ pub.y.dsize = key_insize; -+ pub.y.bsize = key_insize; -+ ret = wd_ecc_set_pubkey(ecc_key, &pub); -+ if (ret) { -+ HPRE_TST_PRT("failed to set ecdsa pubkey!\n"); -+ return -ENOMEM; -+ } -+ -+ e.data = (void *)setup->msg; -+ e.dsize = setup->msg_size; -+ e.bsize = key_insize; -+ -+ d.data = (void *)setup->sign; -+ d.dsize = key_insize; -+ d.bsize = key_insize; -+ k.data = d.data + key_insize; -+ k.dsize = key_insize; -+ k.bsize = key_insize; -+ ecc_in = wd_ecdsa_new_verf_in(h_sess, &e, &d, &k); -+ if (!ecc_in) { -+ HPRE_TST_PRT("failed to get ecdsa verf ecc in!\n"); -+ return -ENOMEM; -+ } -+ -+ req->src = ecc_in; -+ } -+ -+ return 0; -+del_ecc_out: -+ if (ecc_out) -+ (void)wd_ecc_del_out(h_sess, ecc_out); -+ return ret; -+} -+ -+static int sm2_param_fill(handle_t h_sess, struct wd_ecc_req *req, -+ struct hpre_ecc_setup *setup, thread_data *pdata) -+{ -+ int key_insize = (pdata->keybits + 7) / 8; -+ u32 optype = pdata->optype; -+ struct wd_ecc_out *ecc_out = NULL; -+ struct wd_ecc_in *ecc_in = NULL; -+ struct wd_ecc_point tmp; -+ struct wd_dtb d, e, k; -+ -+ switch (optype) { -+ case WD_SM2_SIGN:// Sign -+ ecc_out = wd_sm2_new_sign_out(h_sess); -+ if (!ecc_out) { -+ HPRE_TST_PRT("failed to alloc sm2 ecc out!\n"); -+ return -ENOMEM; -+ } -+ -+ e.data = (void *)setup->msg; -+ e.dsize = setup->msg_size; -+ e.bsize = setup->msg_size; -+ k.data = (void *)setup->k; -+ k.dsize = setup->k_size; -+ k.bsize = key_insize; -+ ecc_in = wd_sm2_new_sign_in(h_sess, &e, &k, NULL, 1); -+ if (!ecc_in) { -+ HPRE_TST_PRT("failed to alloc sm2 ecc in!\n"); -+ goto del_ecc_out; -+ } -+ req->src = ecc_in; -+ req->dst = ecc_out; -+ break; -+ case WD_SM2_VERIFY: // Verf -+ ecc_out = wd_sm2_new_sign_out(h_sess); -+ if (!ecc_out) { -+ HPRE_TST_PRT("failed to alloc sm2 ecc out!\n"); -+ return -ENOMEM; -+ } -+ -+ e.data = (void *)setup->msg; -+ e.dsize = setup->msg_size; -+ e.bsize = key_insize; -+ d.data = (void *)setup->sign; -+ d.dsize = key_insize; -+ d.bsize = key_insize; -+ k.data = d.data + key_insize; -+ k.dsize = key_insize; -+ k.bsize = key_insize; -+ ecc_in = wd_sm2_new_verf_in(h_sess, &e, &d, &k, NULL, 1); -+ if (!ecc_in) { -+ HPRE_TST_PRT("failed to alloc sm2 ecc in!\n"); -+ goto del_ecc_out; -+ } -+ -+ req->src = ecc_in; -+ req->dst = ecc_out; -+ break; -+ case WD_SM2_ENCRYPT: // Enc -+ ecc_out = wd_sm2_new_enc_out(h_sess, setup->msg_size); -+ if (!ecc_out) { -+ HPRE_TST_PRT("failed to alloc sm2 ecc out!\n"); -+ return -ENOMEM; -+ } -+ -+ e.data = (void *)setup->plaintext; -+ e.dsize = setup->plaintext_size; -+ e.bsize = setup->plaintext_size; -+ k.data = (void *)setup->k; -+ k.dsize = setup->k_size; -+ k.bsize = key_insize; -+ ecc_in = wd_sm2_new_enc_in(h_sess, &e, &k); -+ if (!ecc_in) { -+ HPRE_TST_PRT("failed to alloc sm2 ecc in!\n"); -+ goto del_ecc_out; -+ } -+ req->src = ecc_in; -+ req->dst = ecc_out; -+ break; -+ case WD_SM2_DECRYPT: // Dec -+ tmp.x.data = (void *)setup->ciphertext; -+ tmp.x.dsize = 32; -+ tmp.y.data = tmp.x.data + 32; -+ tmp.y.dsize = 32; -+ e.data = tmp.y.data + 32; -+ e.dsize = 32; -+ d.data = e.data + 32; -+ d.dsize = setup->ciphertext_size - 32 * 3; -+ ecc_in = wd_sm2_new_dec_in(h_sess, &tmp, &d, &e); -+ if (!ecc_in) { -+ HPRE_TST_PRT("failed to alloc sm2 ecc in!\n"); -+ return -ENOMEM; -+ } -+ -+ ecc_out = wd_sm2_new_dec_out(h_sess, d.dsize); -+ if (!ecc_out) { -+ HPRE_TST_PRT("failed to alloc sm2 ecc out!\n"); -+ goto del_ecc_in; -+ } -+ -+ req->src = ecc_in; -+ req->dst = ecc_out; -+ break; -+ case WD_SM2_KG: // KG -+ ecc_out = wd_sm2_new_kg_out(h_sess); -+ if (!ecc_out) { -+ HPRE_TST_PRT("failed to alloc sm2 ecc out!\n"); -+ return -ENOMEM; -+ } -+ -+ req->dst = ecc_out; -+ break; -+ default: -+ HPRE_TST_PRT("failed to match sm2 optype!\n"); -+ return -ENOMEM; -+ } -+ -+ return 0; -+ -+del_ecc_in: -+ if (ecc_in) -+ (void)wd_ecc_del_in(h_sess, ecc_in); -+del_ecc_out: -+ if (ecc_out) -+ (void)wd_ecc_del_out(h_sess, ecc_out); -+ -+ return -ENOMEM; -+} -+ -+static int ecc_param_fill(handle_t h_sess, struct wd_ecc_req *req, -+ struct wd_ecc_key *ecc_key, struct hpre_ecc_setup *setup, -+ thread_data *pdata) -+{ -+ int key_insize = (pdata->keybits + 7) / 8; -+ u32 subtype = pdata->subtype; -+ u32 optype = pdata->optype; -+ struct wd_ecc_out *ecc_out = NULL; -+ struct wd_ecc_in *ecc_in = NULL; -+ struct wd_ecc_point tmp; -+ struct wd_dtb d; -+ int ret = 0; -+ -+ ecc_out = wd_ecxdh_new_out(h_sess); -+ if (!ecc_out) { -+ HPRE_TST_PRT("failed to alloc ecc out!\n"); -+ return -ENOMEM; -+ } -+ if (optype == WD_ECXDH_GEN_KEY) { // gen -+ d.data = (void *)setup->priv_key; -+ d.dsize = setup->priv_key_size; -+ d.bsize = setup->priv_key_size; -+ ret = wd_ecc_set_prikey(ecc_key, &d); -+ if (ret) { -+ HPRE_TST_PRT("failed to set ecxdh prikey!\n"); -+ goto del_ecc_out; -+ } -+ -+ req->dst = ecc_out; -+ } else { // compute -+ if (subtype == ECDH_TYPE) -+ tmp.x.data = setup->except_pub_key; -+ else -+ tmp.x.data = setup->except_pub_key + 1; -+ tmp.x.bsize = key_insize; -+ tmp.x.dsize = key_insize; -+ tmp.y.data = tmp.x.data + key_insize; -+ tmp.y.bsize = key_insize; -+ tmp.y.dsize = key_insize; -+ ecc_in = wd_ecxdh_new_in(h_sess, &tmp); -+ if (!ecc_in) { -+ HPRE_TST_PRT("failed to get ecxdh sign in!\n"); -+ goto del_ecc_out; -+ } -+ -+ d.data = (void *)setup->priv_key; -+ d.dsize = setup->priv_key_size; -+ d.bsize = setup->priv_key_size; -+ ret = wd_ecc_set_prikey(ecc_key, &d); -+ if (ret) { -+ HPRE_TST_PRT("failed to set ecc prikey!\n"); -+ goto del_ecc_out; -+ } -+ -+ req->src = ecc_in; -+ req->dst = ecc_out; -+ } -+ -+ return 0; -+ -+del_ecc_out: -+ if (ecc_out) -+ (void)wd_ecc_del_out(h_sess, ecc_out); -+ -+ return ret; -+} -+ -+static void *ecc_uadk_sync_run(void *arg) -+{ -+ thread_data *pdata = (thread_data *)arg; -+ int key_size = pdata->keybits >> 3; -+ u32 subtype = pdata->subtype; -+ struct wd_ecc_sess_setup sess_setup; -+ struct hpre_ecc_setup setup; -+ struct wd_ecc_curve param; -+ struct wd_ecc_key *ecc_key; -+ struct wd_ecc_point pbk; -+ struct wd_dtb prk; -+ struct wd_ecc_req req; -+ u32 cid = ECC_CURVE_ID; -+ handle_t h_sess; -+ u32 count = 0; -+ int ret; -+ -+ memset(&sess_setup, 0, sizeof(sess_setup)); -+ memset(¶m, 0, sizeof(param)); -+ memset(&req, 0, sizeof(req)); -+ -+ memset(&setup, 0, sizeof(setup)); -+ if (subtype != X448_TYPE || subtype != X25519_TYPE) { -+ ret = get_ecc_curve(&setup, cid); -+ if (ret) -+ return NULL; -+ } -+ -+ sess_setup.key_bits = pdata->keybits; -+ if (subtype == ECDH_TYPE || subtype == ECDSA_TYPE) { -+ if (cid > ECC_CURVE_ID) { -+ sess_setup.cv.type = WD_CV_CFG_PARAM; -+ get_ecc_key_param(¶m, pdata->keybits); -+ sess_setup.cv.cfg.pparam = ¶m; -+ } else { -+ sess_setup.cv.type = WD_CV_CFG_ID; -+ sess_setup.cv.cfg.id = setup.curve_id; -+ } -+ } -+ -+ sess_setup.rand.cb = ecc_get_rand; -+ switch (subtype) { -+ case SM2_TYPE: -+ sess_setup.alg = "sm2"; -+ break; -+ case ECDH_TYPE: -+ sess_setup.alg = "ecdh"; -+ break; -+ case ECDSA_TYPE: -+ sess_setup.alg = "ecdsa"; -+ break; -+ } -+ -+ // set def setting; -+ sess_setup.hash.cb = hpre_compute_hash; -+ sess_setup.hash.type = WD_HASH_SHA256; -+ -+ ret = get_ecc_param_from_sample(&setup, subtype, pdata->keybits); -+ if (ret) -+ return NULL; -+ -+ h_sess = wd_ecc_alloc_sess(&sess_setup); -+ if (!h_sess) -+ goto msg_release; -+ -+ prk.data = (void *)setup.priv_key; -+ prk.dsize = setup.priv_key_size; -+ prk.bsize = setup.priv_key_size; -+ pbk.x.data = (char *)setup.pub_key + 1; -+ pbk.x.dsize = key_size; -+ pbk.x.bsize = key_size; -+ pbk.y.data = pbk.x.data + key_size; -+ pbk.y.dsize = key_size; -+ pbk.y.bsize = key_size; -+ -+ ecc_key = wd_ecc_get_key(h_sess); -+ ret = wd_ecc_set_prikey(ecc_key, &prk); -+ if (ret) { -+ HPRE_TST_PRT("failed to pre set ecc prikey!\n"); -+ goto sess_release; -+ } -+ -+ ret = wd_ecc_set_pubkey(ecc_key, &pbk); -+ if (ret) { -+ HPRE_TST_PRT("failed to pre set ecc pubkey!\n"); -+ goto sess_release; -+ } -+ -+ req.op_type = pdata->optype; -+ switch (subtype) { -+ case ECDSA_TYPE: // ECC alg -+ ret = ecdsa_param_fill(h_sess, &req, ecc_key, &setup, pdata); -+ if (ret) -+ goto src_release; -+ break; -+ case SM2_TYPE: // SM2 alg -+ ret = sm2_param_fill(h_sess, &req, &setup, pdata); -+ if (ret) -+ goto src_release; -+ break; -+ default: // ECDH, X25519, X448 alg -+ ret = ecc_param_fill(h_sess, &req, ecc_key, &setup, pdata); -+ if (ret) -+ goto src_release; -+ break; -+ } -+ -+ do { -+ ret = wd_do_ecc_sync(h_sess, &req); -+ if (ret || req.status) { -+ HPRE_TST_PRT("failed to do ecc task, status: %d\n", req.status); -+ goto src_release; -+ } -+ -+ count++; -+ if (get_run_state() == 0) -+ break; -+ } while(true); -+ -+src_release: -+ if (req.src) -+ (void)wd_ecc_del_in(h_sess, req.src); -+ if (req.dst) -+ (void)wd_ecc_del_out(h_sess, req.dst); -+sess_release: -+ wd_ecc_free_sess(h_sess); -+msg_release: -+ if (subtype == SM2_TYPE) -+ free(setup.msg); -+ -+ add_recv_data(count, key_size); -+ -+ return NULL; -+} -+ -+static void ecc_async_cb(void *req_t) -+{ -+ //struct wd_ecc_req *req = req_t; -+ //struct rsa_async_tag *tag = req->cb_param; -+ //enum wd_rsa_op_type op_type = req->op_type; -+ //handle_t h_sess = tag->sess; -+ -+ return; -+} -+ -+static void *ecc_uadk_async_run(void *arg) -+{ -+ thread_data *pdata = (thread_data *)arg; -+ int key_size = pdata->keybits >> 3; -+ u32 subtype = pdata->subtype; -+ struct wd_ecc_sess_setup sess_setup; -+ struct rsa_async_tag *tag; -+ struct hpre_ecc_setup setup; -+ struct wd_ecc_curve param; -+ struct wd_ecc_key *ecc_key; -+ struct wd_ecc_point pbk; -+ struct wd_ecc_req req; -+ struct wd_dtb prk; -+ u32 cid = ECC_CURVE_ID; -+ handle_t h_sess; -+ int try_cnt = 0; -+ u32 count = 0; -+ int i, ret; -+ -+ memset(&sess_setup, 0, sizeof(sess_setup)); -+ memset(¶m, 0, sizeof(param)); -+ memset(&req, 0, sizeof(req)); -+ -+ memset(&setup, 0, sizeof(setup)); -+ if (subtype != X448_TYPE || subtype != X25519_TYPE) { -+ ret = get_ecc_curve(&setup, cid); -+ if (ret) -+ return NULL; -+ } -+ -+ sess_setup.key_bits = pdata->keybits; -+ if (subtype == ECDH_TYPE || subtype == ECDSA_TYPE) { -+ if (cid > ECC_CURVE_ID) { -+ sess_setup.cv.type = WD_CV_CFG_PARAM; -+ get_ecc_key_param(¶m, pdata->keybits); -+ sess_setup.cv.cfg.pparam = ¶m; -+ } else { -+ sess_setup.cv.type = WD_CV_CFG_ID; -+ sess_setup.cv.cfg.id = setup.curve_id; -+ } -+ } -+ -+ sess_setup.rand.cb = ecc_get_rand; -+ switch (subtype) { -+ case SM2_TYPE: -+ sess_setup.alg = "sm2"; -+ break; -+ case ECDH_TYPE: -+ sess_setup.alg = "ecdh"; -+ break; -+ case ECDSA_TYPE: -+ sess_setup.alg = "ecdsa"; -+ break; -+ } -+ -+ // set def setting; -+ sess_setup.hash.cb = hpre_compute_hash; -+ sess_setup.hash.type = WD_HASH_SHA256; -+ -+ ret = get_ecc_param_from_sample(&setup, subtype, pdata->keybits); -+ if (ret) -+ return NULL; -+ -+ h_sess = wd_ecc_alloc_sess(&sess_setup); -+ if (!h_sess) -+ goto msg_release; -+ -+ prk.data = (void *)setup.priv_key; -+ prk.dsize = setup.priv_key_size; -+ prk.bsize = setup.priv_key_size; -+ pbk.x.data = (char *)setup.pub_key + 1; -+ pbk.x.dsize = key_size; -+ pbk.x.bsize = key_size; -+ pbk.y.data = pbk.x.data + key_size; -+ pbk.y.dsize = key_size; -+ pbk.y.bsize = key_size; -+ -+ ecc_key = wd_ecc_get_key(h_sess); -+ ret = wd_ecc_set_prikey(ecc_key, &prk); -+ if (ret) { -+ HPRE_TST_PRT("failed to pre set ecc prikey!\n"); -+ goto sess_release; -+ } -+ -+ ret = wd_ecc_set_pubkey(ecc_key, &pbk); -+ if (ret) { -+ HPRE_TST_PRT("failed to pre set ecc pubkey!\n"); -+ goto sess_release; -+ } -+ -+ req.op_type = pdata->optype; -+ switch (subtype) { -+ case ECDSA_TYPE: // ECC alg -+ ret = ecdsa_param_fill(h_sess, &req, ecc_key, &setup, pdata); -+ if (ret) -+ goto src_release; -+ break; -+ case SM2_TYPE: // SM2 alg -+ ret = sm2_param_fill(h_sess, &req, &setup, pdata); -+ if (ret) -+ goto src_release; -+ break; -+ default: // ECDH, X25519, X448 alg -+ ret = ecc_param_fill(h_sess, &req, ecc_key, &setup, pdata); -+ if (ret) -+ goto src_release; -+ break; -+ } -+ -+ tag = malloc(sizeof(*tag) * MAX_POOL_LENTH); -+ if (!tag) { -+ HPRE_TST_PRT("failed to malloc rsa tag!\n"); -+ goto src_release; -+ } -+ req.cb = ecc_async_cb; -+ -+ do { -+ if (get_run_state() == 0) -+ break; -+ -+ try_cnt = 0; -+ i = count % MAX_POOL_LENTH; -+ tag[i].sess = h_sess; -+ req.cb_param = &tag[i]; -+ -+ ret = wd_do_ecc_sync(h_sess, &req); -+ if (ret == -WD_EBUSY) { -+ usleep(SEND_USLEEP * try_cnt); -+ try_cnt++; -+ if (try_cnt > MAX_TRY_CNT) { -+ HPRE_TST_PRT("Test ECC send fail %d times!\n", MAX_TRY_CNT); -+ try_cnt = 0; -+ } -+ continue; -+ } else if (ret) { -+ HPRE_TST_PRT("failed to do ECC async task!\n"); -+ goto tag_release; -+ } -+ count++; -+ } while(true); -+ -+tag_release: -+ free(tag); -+src_release: -+ if (req.src) -+ (void)wd_ecc_del_in(h_sess, req.src); -+ if (req.dst) -+ (void)wd_ecc_del_out(h_sess, req.dst); -+sess_release: -+ wd_ecc_free_sess(h_sess); -+msg_release: -+ if (subtype == SM2_TYPE) -+ free(setup.msg); -+ -+ add_send_complete(); -+ -+ return NULL; -+} -+ -+static int hpre_uadk_sync_threads(struct acc_option *options) -+{ -+ typedef void *(*hpre_sync_run)(void *arg); -+ hpre_sync_run uadk_hpre_sync_run = NULL; -+ thread_data threads_args[THREADS_NUM]; -+ thread_data threads_option; -+ pthread_t tdid[THREADS_NUM]; -+ int i, ret; -+ -+ /* alg param parse and set to thread data */ -+ threads_option.subtype = options->subtype; -+ threads_option.td_id = 0; -+ ret = hpre_uadk_param_parse(&threads_option, options); -+ if (ret) -+ return ret; -+ -+ switch (options->subtype) { -+ case RSA_TYPE: -+ uadk_hpre_sync_run = rsa_uadk_sync_run; -+ break; -+ case DH_TYPE: -+ uadk_hpre_sync_run = dh_uadk_sync_run; -+ break; -+ case ECDH_TYPE: -+ case ECDSA_TYPE: -+ case SM2_TYPE: -+ case X25519_TYPE: -+ case X448_TYPE: -+ uadk_hpre_sync_run = ecc_uadk_sync_run; -+ break; -+ default: -+ HPRE_TST_PRT("failed to parse alg subtype on uninit!\n"); -+ return -EINVAL; -+ } -+ -+ for (i = 0; i < g_thread_num; i++) { -+ threads_args[i].subtype = threads_option.subtype; -+ threads_args[i].kmode = threads_option.kmode; -+ threads_args[i].keybits = threads_option.keybits; -+ threads_args[i].optype = threads_option.optype; -+ threads_args[i].td_id = i; -+ ret = pthread_create(&tdid[i], NULL, uadk_hpre_sync_run, &threads_args[i]); -+ if (ret) { -+ HPRE_TST_PRT("Create sync thread fail!\n"); -+ goto sync_error; -+ } -+ } -+ -+ /* join thread */ -+ for (i = 0; i < g_thread_num; i++) { -+ ret = pthread_join(tdid[i], NULL); -+ if (ret) { -+ HPRE_TST_PRT("Join sync thread fail!\n"); -+ goto sync_error; -+ } -+ } -+ -+sync_error: -+ return ret; -+} -+ -+static int hpre_uadk_async_threads(struct acc_option *options) -+{ -+ typedef void *(*hpre_async_run)(void *arg); -+ hpre_async_run uadk_hpre_async_run = NULL; -+ thread_data threads_args[THREADS_NUM]; -+ thread_data threads_option; -+ pthread_t tdid[THREADS_NUM]; -+ pthread_t pollid[THREADS_NUM]; -+ int i, ret; -+ -+ /* alg param parse and set to thread data */ -+ threads_option.subtype = options->subtype; -+ threads_option.td_id = 0; -+ ret = hpre_uadk_param_parse(&threads_option, options); -+ if (ret) -+ return ret; -+ -+ switch (options->subtype) { -+ case RSA_TYPE: -+ uadk_hpre_async_run = rsa_uadk_async_run; -+ break; -+ case DH_TYPE: -+ uadk_hpre_async_run = dh_uadk_async_run; -+ break; -+ case ECDH_TYPE: -+ case ECDSA_TYPE: -+ case SM2_TYPE: -+ case X25519_TYPE: -+ case X448_TYPE: -+ uadk_hpre_async_run = ecc_uadk_async_run; -+ break; -+ default: -+ HPRE_TST_PRT("failed to parse alg subtype on uninit!\n"); -+ return -EINVAL; -+ } -+ -+ for (i = 0; i < g_ctxnum; i++) { -+ threads_args[i].subtype = threads_option.subtype; -+ threads_args[i].td_id = i; -+ /* poll thread */ -+ ret = pthread_create(&pollid[i], NULL, hpre_uadk_poll, &threads_args[i]); -+ if (ret) { -+ HPRE_TST_PRT("Create poll thread fail!\n"); -+ goto async_error; -+ } -+ } -+ -+ for (i = 0; i < g_thread_num; i++) { -+ threads_args[i].subtype = threads_option.subtype; -+ threads_args[i].kmode = threads_option.kmode; -+ threads_args[i].keybits = threads_option.keybits; -+ threads_args[i].optype = threads_option.optype; -+ threads_args[i].td_id = i; -+ ret = pthread_create(&tdid[i], NULL, uadk_hpre_async_run, &threads_args[i]); -+ if (ret) { -+ HPRE_TST_PRT("Create async thread fail!\n"); -+ goto async_error; -+ } -+ } -+ -+ /* join thread */ -+ for (i = 0; i < g_thread_num; i++) { -+ ret = pthread_join(tdid[i], NULL); -+ if (ret) { -+ HPRE_TST_PRT("Join async thread fail!\n"); -+ goto async_error; -+ } -+ } -+ -+ for (i = 0; i < g_ctxnum; i++) { -+ ret = pthread_join(pollid[i], NULL); -+ if (ret) { -+ HPRE_TST_PRT("Join poll thread fail!\n"); -+ goto async_error; -+ } -+ } -+ -+async_error: -+ return ret; -+} -+ -+int hpre_uadk_benchmark(struct acc_option *options) -+{ -+ u32 ptime; -+ int ret; -+ -+ g_thread_num = options->threads; -+ g_ctxnum = options->ctxnums; -+ -+ if (options->optype >= (WD_EC_OP_MAX - WD_ECDSA_VERIFY)) { -+ HPRE_TST_PRT("HPRE optype error: %u\n", options->optype); -+ return -EINVAL; -+ } -+ -+ ret = init_hpre_ctx_config(options->algclass, options->subtype, -+ options->syncmode); -+ if (ret) -+ return ret; -+ -+ get_pid_cpu_time(&ptime); -+ time_start(options->times); -+ if (options->syncmode) -+ ret = hpre_uadk_async_threads(options); -+ else -+ ret = hpre_uadk_sync_threads(options); -+ cal_perfermance_data(options, ptime); -+ if (ret) -+ return ret; -+ -+ uninit_hpre_ctx_config(options->subtype); -+ -+ return 0; -+} -diff --git a/uadk_tool/benchmark/hpre_uadk_benchmark.h b/uadk_tool/benchmark/hpre_uadk_benchmark.h -new file mode 100644 -index 0000000..7e3966d ---- /dev/null -+++ b/uadk_tool/benchmark/hpre_uadk_benchmark.h -@@ -0,0 +1,6 @@ -+/* SPDX-License-Identifier: Apache-2.0 */ -+#ifndef HPRE_UADK_BENCHMARK_H -+#define HPRE_UADK_BENCHMARK_H -+ -+extern int hpre_uadk_benchmark(struct acc_option *options); -+#endif /* HPRE_UADK_BENCHMARK_H */ --- -2.27.0 - diff --git a/0135-uadk_tool-Add-No-SVA-mode-test-function-to-HPRE.patch b/0135-uadk_tool-Add-No-SVA-mode-test-function-to-HPRE.patch deleted file mode 100644 index d3b9efd..0000000 --- a/0135-uadk_tool-Add-No-SVA-mode-test-function-to-HPRE.patch +++ /dev/null @@ -1,2590 +0,0 @@ -From a845386d02be1e51832a01681f97a032707f9026 Mon Sep 17 00:00:00 2001 -From: Longfang Liu -Date: Mon, 18 Jul 2022 17:16:33 +0800 -Subject: [PATCH 149/183] uadk_tool: Add No-SVA mode test function to HPRE - -Added No-SVA mode performance test function for -HPRE's RSA, DH, ECC algorithms. - -Signed-off-by: Longfang Liu ---- - uadk_tool/benchmark/hpre_wd_benchmark.c | 2553 +++++++++++++++++++++++ - uadk_tool/benchmark/hpre_wd_benchmark.h | 6 + - 2 files changed, 2559 insertions(+) - create mode 100644 uadk_tool/benchmark/hpre_wd_benchmark.c - create mode 100644 uadk_tool/benchmark/hpre_wd_benchmark.h - -diff --git a/uadk_tool/benchmark/hpre_wd_benchmark.c b/uadk_tool/benchmark/hpre_wd_benchmark.c -new file mode 100644 -index 0000000..c9b0c18 ---- /dev/null -+++ b/uadk_tool/benchmark/hpre_wd_benchmark.c -@@ -0,0 +1,2553 @@ -+/* SPDX-License-Identifier: Apache-2.0 */ -+ -+#include -+#include "uadk_benchmark.h" -+ -+#include "hpre_wd_benchmark.h" -+#include "hpre_protocol_data.h" -+#include "v1/wd.h" -+#include "v1/wd_ecc.h" -+#include "v1/wd_rsa.h" -+#include "v1/wd_dh.h" -+#include "v1/wd_bmm.h" -+#include "v1/wd_util.h" -+ -+#define ECC_CURVE_ID 0x3 /* def set secp256k1 */ -+#define HPRE_TST_PRT printf -+#define ERR_OPTYPE 0xFF -+#define SM2_DG_SZ 1024 -+#define SEND_USLEEP 100 -+#define ALIGN_SIZE 128 -+ -+static char rsa_m[8] = {0x54, 0x85, 0x9b, 0x34, 0x2c, 0x49, 0xea, 0x2a}; -+ -+struct hpre_rsa_key_in { -+ void *e; -+ void *p; -+ void *q; -+ u32 e_size; -+ u32 p_size; -+ u32 q_size; -+ void *data[]; -+}; -+static __thread struct hpre_rsa_key_in *rsa_key_in = NULL; -+ -+struct rsa_async_tag { -+ void *ctx; -+ int cnt; -+ int optype; -+}; -+ -+//----------------------------------RSA param--------------------------------------// -+struct hpre_dh_param { -+ const void *x; -+ const void *p; -+ const void *g; -+ const void *except_pub_key; -+ const void *pub_key; -+ const void *share_key; -+ void *pool; -+ u32 x_size; -+ u32 p_size; -+ u32 g_size; -+ u32 pub_key_size; -+ u32 share_key_size; -+ u32 except_pub_key_size; -+ u32 key_bits; -+ u32 optype; -+}; -+ -+//----------------------------------DH param-------------------------------------// -+struct hpre_ecc_setup { -+ void *except_pub_key; // use in ecdh phase 2 -+ const void *pub_key; // use in ecdh phase 1 -+ const void *share_key; // use in ecdh phase 2 -+ const void *degist; //ecdsa sign in -+ const void *k; //ecdsa sign in -+ const void *rp; //ecdsa sign in -+ const void *sign; // ecdsa sign out or verf in -+ const void *priv_key; // use in ecdsa sign -+ void *msg; // sm2 plaintext,ciphertext or digest input -+ const void *userid; // sm2 user id -+ const void *ciphertext; // sm2 ciphertext -+ const void *plaintext; // sm2 plaintext -+ u32 key_size; -+ u32 share_key_size; -+ u32 except_pub_key_size; -+ u32 degist_size; -+ u32 k_size; -+ u32 rp_size; -+ u32 sign_size; -+ u32 priv_key_size; -+ u32 pub_key_size; -+ u32 msg_size; -+ u32 userid_size; -+ u32 ciphertext_size; -+ u32 plaintext_size; -+ u32 op_type; -+ u32 key_bits; -+ u32 nid; -+ u32 curve_id; // WD ecc curve_id -+}; -+ -+//----------------------------------ECC param-------------------------------------// -+struct thread_bd_res { -+ struct wd_queue *queue; -+ void *pool; -+}; -+ -+struct thread_queue_res { -+ struct thread_bd_res *bd_res; -+}; -+ -+typedef struct uadk_thread_res { -+ u32 subtype; -+ u32 keybits; -+ u32 kmode; -+ u32 optype; -+ u32 td_id; -+} thread_data; -+ -+static unsigned int g_thread_num; -+static struct thread_queue_res g_thread_queue; -+ -+static const char* const alg_operations[] = { -+ "GenKey", "ShareKey", "Encrypt", "Decrypt", "Sign", "Verify", -+}; -+ -+static void get_rsa_param(u32 algtype, u32 *keysize, u32 *mode) -+{ -+ switch(algtype) { -+ case RSA_1024: -+ *keysize = 1024; -+ *mode = 0; -+ break; -+ case RSA_2048: -+ *keysize = 2048; -+ *mode = 0; -+ break; -+ case RSA_3072: -+ *keysize = 3072; -+ *mode = 0; -+ break; -+ case RSA_4096: -+ *keysize = 4096; -+ *mode = 0; -+ break; -+ case RSA_1024_CRT: -+ *keysize = 1024; -+ *mode = 1; -+ break; -+ case RSA_2048_CRT: -+ *keysize = 2048; -+ *mode = 1; -+ break; -+ case RSA_3072_CRT: -+ *keysize = 3072; -+ *mode = 1; -+ break; -+ case RSA_4096_CRT: -+ *keysize = 4096; -+ *mode = 1; -+ break; -+ } -+} -+ -+static u32 get_rsa_optype(u32 optype) -+{ -+ u32 op_type = 0; -+ -+ switch(optype) { -+ case 0: //GENKEY1 -+ op_type = WCRYPTO_RSA_GENKEY; -+ break; -+ case 4: //Sign -+ op_type = WCRYPTO_RSA_SIGN; -+ break; -+ case 5: //Verf -+ op_type = WCRYPTO_RSA_VERIFY; -+ break; -+ default: -+ HPRE_TST_PRT("failed to set rsa op_type\n"); -+ HPRE_TST_PRT("RSA Gen: 0\n"); -+ HPRE_TST_PRT("RSA Sign: 4\n"); -+ HPRE_TST_PRT("RSA Verf: 5\n"); -+ return ERR_OPTYPE; -+ } -+ -+ return op_type; -+} -+ -+static void get_dh_param(u32 algtype, u32 *keysize) -+{ -+ switch(algtype) { -+ case DH_768: -+ *keysize = 768; -+ break; -+ case DH_1024: -+ *keysize = 1024; -+ break; -+ case DH_1536: -+ *keysize = 1536; -+ break; -+ case DH_2048: -+ *keysize = 2048; -+ break; -+ case DH_3072: -+ *keysize = 3072; -+ break; -+ case DH_4096: -+ *keysize = 4096; -+ break; -+ } -+} -+ -+static u32 get_dh_optype(u32 optype) -+{ -+ u32 op_type = 0; -+ -+ switch(optype) { -+ case 0: //GENKEY1 -+ op_type = WCRYPTO_DH_PHASE1; -+ break; -+ case 1: //GENKEY12 -+ op_type = WCRYPTO_DH_PHASE2; -+ break; -+ default: -+ HPRE_TST_PRT("failed to set dh op_type\n"); -+ HPRE_TST_PRT("DH Gen1: 0\n"); -+ HPRE_TST_PRT("DH Gen2: 1\n"); -+ return ERR_OPTYPE; -+ } -+ -+ return op_type; -+} -+ -+static void get_ecc_param(u32 algtype, u32 *keysize) -+{ -+ switch(algtype) { -+ case ECDH_256: -+ *keysize = 256; -+ break; -+ case ECDH_384: -+ *keysize = 384; -+ break; -+ case ECDH_521: -+ *keysize = 521; -+ break; -+ case ECDSA_256: -+ *keysize = 256; -+ break; -+ case ECDSA_384: -+ *keysize = 384; -+ break; -+ case ECDSA_521: -+ *keysize = 521; -+ break; -+ case SM2_ALG: -+ *keysize = 256; -+ break; -+ case X25519_ALG: -+ *keysize = 256; -+ break; -+ case X448_ALG: -+ *keysize = 448; -+ break; -+ } -+} -+ -+static u32 get_ecc_optype(u32 subtype, u32 optype) -+{ -+ u32 op_type = 0; -+ -+ if (subtype == SM2_TYPE) { -+ switch (optype) { -+ case 0: -+ op_type = WCRYPTO_SM2_KG; -+ break; -+ case 2: -+ op_type = WCRYPTO_SM2_ENCRYPT; -+ break; -+ case 3: -+ op_type = WCRYPTO_SM2_DECRYPT; -+ break; -+ case 4: -+ op_type = WCRYPTO_SM2_SIGN; -+ break; -+ case 5: -+ op_type = WCRYPTO_SM2_VERIFY; -+ break; -+ default: -+ HPRE_TST_PRT("failed to set SM2 op_type\n"); -+ HPRE_TST_PRT("SM2 KeyGen: 0\n"); -+ HPRE_TST_PRT("SM2 Encrypt: 2\n"); -+ HPRE_TST_PRT("SM2 Decrypt: 3\n"); -+ HPRE_TST_PRT("SM2 Sign: 4\n"); -+ HPRE_TST_PRT("SM2 Verify: 5\n"); -+ return ERR_OPTYPE; -+ } -+ } else if (subtype == ECDH_TYPE || -+ subtype == X25519_TYPE || subtype == X448_TYPE) { -+ switch(optype) { -+ case 0: //GENKEY -+ op_type = WCRYPTO_ECXDH_GEN_KEY; -+ break; -+ case 1: //COMPUTEKEY -+ op_type = WCRYPTO_ECXDH_COMPUTE_KEY; -+ break; -+ default: -+ HPRE_TST_PRT("failed to set ECDH op_type\n"); -+ HPRE_TST_PRT("ECDH GenKey: 0\n"); -+ HPRE_TST_PRT("ECDH ShareKey: 1\n"); -+ return ERR_OPTYPE; -+ } -+ } else if (subtype == ECDSA_TYPE) { -+ switch(optype) { -+ case 4: //Sign -+ op_type = WCRYPTO_ECDSA_SIGN; -+ break; -+ case 5: //Verf -+ op_type = WCRYPTO_ECDSA_VERIFY; -+ break; -+ default: -+ HPRE_TST_PRT("failed to set ECDSA op_type\n"); -+ HPRE_TST_PRT("ECDSA Sign: 4\n"); -+ HPRE_TST_PRT("ECDSA Verf: 5\n"); -+ return ERR_OPTYPE; -+ } -+ } -+ -+ return op_type; -+} -+ -+static int hpre_wd_param_parse(thread_data *tddata, struct acc_option *options) -+{ -+ u32 algtype = options->algtype; -+ u32 optype = 0; -+ u32 keysize = 0; -+ u32 mode = 0; -+ -+ if (algtype >= RSA_1024 && algtype <= RSA_4096_CRT) { -+ get_rsa_param(algtype, &keysize, &mode); -+ optype = get_rsa_optype(options->optype); -+ } else if (algtype <= DH_4096) { -+ get_dh_param(algtype, &keysize); -+ optype = get_dh_optype(options->optype); -+ } else if (algtype <= X448_ALG) { -+ get_ecc_param(algtype, &keysize); -+ optype = get_ecc_optype(options->subtype, options->optype); -+ } else { -+ HPRE_TST_PRT("failed to set hpre alg!\n"); -+ return -EINVAL; -+ } -+ -+ if (optype == ERR_OPTYPE) -+ return -EINVAL; -+ -+ /* HPRE package length is keybits */ -+ options->pktlen = keysize >> 3; -+ tddata->keybits = keysize; -+ tddata->kmode = mode; -+ tddata->optype = optype; -+ -+ HPRE_TST_PRT("%s to run %s task!\n", options->algclass, -+ alg_operations[options->optype]); -+ -+ return 0; -+} -+ -+static int hpre_wd_get_block(u32 algtype) -+{ -+ int block_size = 512; -+ -+ switch(algtype) { -+ case RSA_1024: -+ block_size = 1280; -+ break; -+ case RSA_2048: -+ block_size = 2560; -+ break; -+ case RSA_3072: -+ block_size = 3840; -+ break; -+ case RSA_4096: -+ block_size = 5120; -+ break; -+ case RSA_1024_CRT: -+ block_size = 1280; -+ break; -+ case RSA_2048_CRT: -+ block_size = 2560; -+ break; -+ case RSA_3072_CRT: -+ block_size = 3840; -+ break; -+ case RSA_4096_CRT: -+ block_size = 5120; -+ break; -+ case DH_768: -+ block_size = 1536; -+ break; -+ case DH_1024: -+ block_size = 2048; -+ break; -+ case DH_1536: -+ block_size = 3072; -+ break; -+ case DH_2048: -+ block_size = 4096; -+ break; -+ case DH_3072: -+ block_size = 6144; -+ break; -+ case DH_4096: -+ block_size = 8192; -+ break; -+ case ECDH_256: -+ block_size = 256; -+ break; -+ case ECDH_384: -+ block_size = 384; -+ break; -+ case ECDH_521: -+ block_size = 576; -+ break; -+ case ECDSA_256: -+ block_size = 256; -+ break; -+ case ECDSA_384: -+ block_size = 384; -+ break; -+ case ECDSA_521: -+ block_size = 576; -+ break; -+ case SM2_ALG: -+ block_size = 4352; -+ break; -+ case X25519_ALG: -+ block_size = 256; -+ break; -+ case X448_ALG: -+ block_size = 384; -+ break; -+ } -+ -+ return block_size; -+} -+ -+static int init_hpre_wd_queue(struct acc_option *options) -+{ -+ u32 blocksize = hpre_wd_get_block(options->algtype); -+ struct wd_blkpool_setup blksetup; -+ int i, j, ret; -+ -+ g_thread_queue.bd_res = malloc(g_thread_num * sizeof(struct thread_bd_res)); -+ if (!g_thread_queue.bd_res) { -+ HPRE_TST_PRT("malloc thread res memory fail!\n"); -+ return -ENOMEM; -+ } -+ -+ for (i = 0; i < g_thread_num; i++) { -+ g_thread_queue.bd_res[i].queue = malloc(sizeof(struct wd_queue)); -+ g_thread_queue.bd_res[i].queue->capa.alg = options->algclass; -+ // 0 is ENC, 1 is DEC -+ g_thread_queue.bd_res[i].queue->capa.priv.direction = options->optype; -+ /* nodemask need to be clean */ -+ g_thread_queue.bd_res[i].queue->node_mask = 0x0; -+ memset(g_thread_queue.bd_res[i].queue->dev_path, 0x0, PATH_STR_SIZE); -+ -+ ret = wd_request_queue(g_thread_queue.bd_res[i].queue); -+ if (ret) { -+ HPRE_TST_PRT("request queue %d fail!\n", i); -+ goto queue_out; -+ } -+ } -+ -+ // use no-sva pbuffer, MAX_BLOCK_NM at least 4 times of thread inside alloc -+ memset(&blksetup, 0, sizeof(blksetup)); -+ blksetup.block_size = blocksize; -+ blksetup.block_num = MAX_BLOCK_NM; -+ blksetup.align_size = ALIGN_SIZE; -+ // HPRE_TST_PRT("create pool memory: %d KB\n", (MAX_BLOCK_NM * blksetup.block_size) >> 10); -+ -+ for (j = 0; j < g_thread_num; j++) { -+ g_thread_queue.bd_res[j].pool = wd_blkpool_create(g_thread_queue.bd_res[j].queue, &blksetup); -+ if (!g_thread_queue.bd_res[j].pool) { -+ HPRE_TST_PRT("create %dth pool fail!\n", j); -+ ret = -ENOMEM; -+ goto pool_err; -+ } -+ } -+ -+ return 0; -+ -+pool_err: -+ for (j--; j >= 0; j--) -+ wd_blkpool_destroy(g_thread_queue.bd_res[j].pool); -+queue_out: -+ for (i--; i >= 0; i--) { -+ wd_release_queue(g_thread_queue.bd_res[i].queue); -+ free(g_thread_queue.bd_res[i].queue); -+ } -+ free(g_thread_queue.bd_res); -+ return ret; -+} -+ -+static void uninit_hpre_wd_queue(void) -+{ -+ int j; -+ -+ for (j = 0; j < g_thread_num; j++) { -+ wd_blkpool_destroy(g_thread_queue.bd_res[j].pool); -+ wd_release_queue(g_thread_queue.bd_res[j].queue); -+ } -+ -+ free(g_thread_queue.bd_res); -+} -+ -+/*-------------------------------uadk benchmark main code-------------------------------------*/ -+ -+void *hpre_wd_poll(void *data) -+{ -+ typedef int (*poll_ctx)(struct wd_queue *q, unsigned int num); -+ thread_data *pdata = (thread_data *)data; -+ u32 expt = ACC_QUEUE_SIZE * g_thread_num; -+ poll_ctx wd_poll_ctx = NULL; -+ struct wd_queue *queue; -+ u32 id = pdata->td_id; -+ u32 last_time = 2; // poll need one more recv time -+ u32 count = 0; -+ int recv = 0; -+ -+ if (id > g_thread_num) -+ return NULL; -+ -+ queue = g_thread_queue.bd_res[id].queue; -+ switch(pdata->subtype) { -+ case RSA_TYPE: -+ wd_poll_ctx = wcrypto_rsa_poll; -+ break; -+ case DH_TYPE: -+ wd_poll_ctx = wcrypto_dh_poll; -+ break; -+ case ECDH_TYPE: -+ case X25519_TYPE: -+ case X448_TYPE: -+ wd_poll_ctx = wcrypto_ecxdh_poll; -+ break; -+ case ECDSA_TYPE: -+ wd_poll_ctx = wcrypto_ecdsa_poll; -+ break; -+ case SM2_TYPE: -+ wd_poll_ctx = wcrypto_sm2_poll; -+ break; -+ default: -+ HPRE_TST_PRT("wd async poll interface is NULL!\n"); -+ return NULL; -+ } -+ -+ while (last_time) { -+ recv = wd_poll_ctx(queue, expt); -+ /* -+ * warpdrive async mode poll easy to 100% with small package. -+ * SEC_TST_PRT("warpdrive poll %d recv: %u!\n", i, recv); -+ */ -+ -+ if (unlikely(recv < 0)) { -+ HPRE_TST_PRT("poll ret: %u!\n", recv); -+ goto recv_error; -+ } -+ count += recv; -+ recv = 0; -+ -+ if (get_run_state() == 0) -+ last_time--; -+ } -+ -+recv_error: -+ add_recv_data(count, pdata->keybits >> 3); -+ -+ return NULL; -+} -+ -+static int get_rsa_key_from_sample(void *ctx, char *privkey_file, -+ char *crt_privkey_file, u32 key_bits, u32 is_crt) -+{ -+ struct wd_dtb wd_e, wd_d, wd_n, wd_dq, wd_dp, wd_qinv, wd_q, wd_p; -+ int e_bytes, d_bytes, n_bytes, q_bytes, p_bytes, qinv_bytes; -+ u8 *p, *q, *n, *e, *d, *dmp1, *dmq1, *iqmp; -+ int dq_bytes, dp_bytes, bits, wd_lenth; -+ u32 key_size = key_bits >> 3; -+ char *wd_mem; -+ int ret = 0; -+ -+ memset(&wd_e, 0, sizeof(wd_e)); -+ memset(&wd_d, 0, sizeof(wd_d)); -+ memset(&wd_n, 0, sizeof(wd_n)); -+ memset(&wd_dq, 0, sizeof(wd_dq)); -+ memset(&wd_dp, 0, sizeof(wd_dp)); -+ memset(&wd_qinv, 0, sizeof(wd_qinv)); -+ memset(&wd_q, 0, sizeof(wd_q)); -+ memset(&wd_p, 0, sizeof(wd_p)); -+ -+ bits = wcrypto_rsa_key_bits(ctx); -+ switch (bits) { -+ case 1024: -+ e = rsa_e_1024; -+ n = rsa_n_1024; -+ p = rsa_p_1024; -+ q = rsa_q_1024; -+ dmp1 = rsa_dp_1024; -+ dmq1 = rsa_dq_1024; -+ iqmp = rsa_qinv_1024; -+ d = rsa_d_1024; -+ e_bytes = ARRAY_SIZE(rsa_e_1024); -+ n_bytes = ARRAY_SIZE(rsa_n_1024); -+ q_bytes = ARRAY_SIZE(rsa_q_1024); -+ p_bytes = ARRAY_SIZE(rsa_p_1024); -+ dq_bytes = ARRAY_SIZE(rsa_dq_1024); -+ dp_bytes = ARRAY_SIZE(rsa_dp_1024); -+ qinv_bytes = ARRAY_SIZE(rsa_qinv_1024); -+ d_bytes = ARRAY_SIZE(rsa_d_1024); -+ break; -+ case 2048: -+ e = rsa_e_2048; -+ n = rsa_n_2048; -+ p = rsa_p_2048; -+ q = rsa_q_2048; -+ dmp1 = rsa_dp_2048; -+ dmq1 = rsa_dq_2048; -+ iqmp = rsa_qinv_2048; -+ d = rsa_d_2048; -+ e_bytes = ARRAY_SIZE(rsa_e_2048); -+ n_bytes = ARRAY_SIZE(rsa_n_2048); -+ q_bytes = ARRAY_SIZE(rsa_q_2048); -+ p_bytes = ARRAY_SIZE(rsa_p_2048); -+ dq_bytes = ARRAY_SIZE(rsa_dq_2048); -+ dp_bytes = ARRAY_SIZE(rsa_dp_2048); -+ qinv_bytes = ARRAY_SIZE(rsa_qinv_2048); -+ d_bytes = ARRAY_SIZE(rsa_d_2048); -+ break; -+ case 3072: -+ e = rsa_e_3072; -+ n = rsa_n_3072; -+ p = rsa_p_3072; -+ q = rsa_q_3072; -+ dmp1 = rsa_dp_3072; -+ dmq1 = rsa_dq_3072; -+ iqmp = rsa_qinv_3072; -+ d = rsa_d_3072; -+ e_bytes = ARRAY_SIZE(rsa_e_3072); -+ n_bytes = ARRAY_SIZE(rsa_n_3072); -+ q_bytes = ARRAY_SIZE(rsa_q_3072); -+ p_bytes = ARRAY_SIZE(rsa_p_3072); -+ dq_bytes = ARRAY_SIZE(rsa_dq_3072); -+ dp_bytes = ARRAY_SIZE(rsa_dp_3072); -+ qinv_bytes = ARRAY_SIZE(rsa_qinv_3072); -+ d_bytes = ARRAY_SIZE(rsa_d_3072); -+ break; -+ case 4096: -+ e = rsa_e_4096; -+ n = rsa_n_4096; -+ p = rsa_p_4096; -+ q = rsa_q_4096; -+ dmp1 = rsa_dp_4096; -+ dmq1 = rsa_dq_4096; -+ iqmp = rsa_qinv_4096; -+ d = rsa_d_4096; -+ e_bytes = ARRAY_SIZE(rsa_e_4096); -+ n_bytes = ARRAY_SIZE(rsa_n_4096); -+ q_bytes = ARRAY_SIZE(rsa_q_4096); -+ p_bytes = ARRAY_SIZE(rsa_p_4096); -+ dq_bytes = ARRAY_SIZE(rsa_dq_4096); -+ dp_bytes = ARRAY_SIZE(rsa_dp_4096); -+ qinv_bytes = ARRAY_SIZE(rsa_qinv_4096); -+ d_bytes = ARRAY_SIZE(rsa_d_4096); -+ break; -+ default: -+ HPRE_TST_PRT("invalid key bits = %d!\n", bits); -+ return -EINVAL; -+ } -+ -+ wd_lenth = e_bytes + n_bytes + q_bytes + p_bytes + dq_bytes + -+ dp_bytes + qinv_bytes + d_bytes; -+ wd_mem = malloc(wd_lenth); -+ if (!wd_mem) { -+ HPRE_TST_PRT("failed to alloc rsa key memory!\n"); -+ return -EINVAL; -+ } -+ -+ wd_e.data = wd_mem; -+ wd_n.data = wd_e.data + e_bytes; -+ -+ memcpy(wd_e.data, e, e_bytes); -+ wd_e.dsize = e_bytes; -+ memcpy(wd_n.data, n, n_bytes); -+ wd_n.dsize = n_bytes; -+ if (wcrypto_set_rsa_pubkey_params(ctx, &wd_e, &wd_n)) { -+ HPRE_TST_PRT("failed to set rsa pubkey!\n"); -+ ret = -EINVAL; -+ goto gen_fail; -+ } -+ -+ if (rsa_key_in) { -+ memcpy(rsa_key_in->e, e, e_bytes); -+ memcpy(rsa_key_in->p, p, p_bytes); -+ memcpy(rsa_key_in->q, q, q_bytes); -+ rsa_key_in->e_size = e_bytes; -+ rsa_key_in->p_size = p_bytes; -+ rsa_key_in->q_size = q_bytes; -+ } -+ -+ if (is_crt) { -+ wd_q.data = wd_n.data + n_bytes; -+ wd_p.data = wd_q.data + q_bytes; -+ wd_dq.data = wd_p.data + p_bytes; -+ wd_dp.data = wd_dq.data + dq_bytes; -+ wd_qinv.data = wd_dp.data + dp_bytes; -+ -+ /* CRT mode private key */ -+ wd_dq.dsize = dq_bytes; -+ memcpy(wd_dq.data, dmq1, dq_bytes); -+ -+ wd_dp.dsize = dp_bytes; -+ memcpy(wd_dp.data, dmp1, dp_bytes); -+ -+ wd_q.dsize = q_bytes; -+ memcpy(wd_q.data, q, q_bytes); -+ -+ wd_p.dsize = p_bytes; -+ memcpy(wd_p.data, p, p_bytes); -+ -+ wd_qinv.dsize = qinv_bytes; -+ memcpy(wd_qinv.data, iqmp, qinv_bytes); -+ -+ if (wcrypto_set_rsa_crt_prikey_params(ctx, &wd_dq, -+ &wd_dp, &wd_qinv, -+ &wd_q, &wd_p)) { -+ HPRE_TST_PRT("failed to set rsa crt prikey!\n"); -+ ret = -EINVAL; -+ goto gen_fail; -+ } -+ -+ -+ if (crt_privkey_file) { -+ memcpy(crt_privkey_file, wd_dq.data, (key_bits >> 4) * 5); -+ memcpy(crt_privkey_file + (key_bits >> 4) * 5, -+ wd_e.data, (key_bits >> 2)); -+ } -+ -+ } else { -+ //wd_rsa_get_prikey_params(prikey, &wd_d, &wd_n); -+ wd_d.data = wd_mem + (wd_lenth - d_bytes); -+ -+ /* common mode private key */ -+ wd_d.dsize = d_bytes; -+ memcpy(wd_d.data, d, d_bytes); -+ -+ if (wcrypto_set_rsa_prikey_params(ctx, &wd_d, &wd_n)) { -+ HPRE_TST_PRT("failed to set rsa prikey!\n"); -+ ret = -EINVAL; -+ goto gen_fail; -+ } -+ -+ if (privkey_file) { -+ memcpy(privkey_file, wd_d.data, key_size); -+ memcpy(privkey_file + key_size, wd_n.data, key_size); -+ memcpy(privkey_file + 2 * key_size, wd_e.data, key_size); -+ memcpy(privkey_file + 3 * key_size, wd_n.data, key_size); -+ } -+ } -+ -+gen_fail: -+ free(wd_mem); -+ -+ return ret; -+} -+ -+static int get_hpre_keygen_opdata(void *ctx, -+ struct wcrypto_rsa_op_data *opdata) -+{ -+ struct wcrypto_rsa_pubkey *pubkey; -+ struct wcrypto_rsa_prikey *prikey; -+ struct wd_dtb t_e, t_p, t_q; -+ struct wd_dtb *e, *p, *q; -+ -+ wcrypto_get_rsa_pubkey(ctx, &pubkey); -+ wcrypto_get_rsa_pubkey_params(pubkey, &e, NULL); -+ wcrypto_get_rsa_prikey(ctx, &prikey); -+ -+ if (wcrypto_rsa_is_crt(ctx)) { -+ wcrypto_get_rsa_crt_prikey_params(prikey, NULL , NULL, NULL, &q, &p); -+ } else { -+ e = &t_e; -+ p = &t_p; -+ q = &t_q; -+ e->data = rsa_key_in->e; -+ e->dsize = rsa_key_in->e_size; -+ p->data = rsa_key_in->p; -+ p->dsize = rsa_key_in->p_size; -+ q->data = rsa_key_in->q; -+ q->dsize = rsa_key_in->q_size; -+ } -+ -+ opdata->in = wcrypto_new_kg_in(ctx, e, p, q); -+ if (!opdata->in) { -+ HPRE_TST_PRT("failed to create rsa kgen in!\n"); -+ return -ENOMEM; -+ } -+ opdata->out = wcrypto_new_kg_out(ctx); -+ if (!opdata->out) { -+ HPRE_TST_PRT("failed to create rsa kgen out!\n"); -+ wcrypto_del_kg_in(ctx, opdata->in); -+ return -ENOMEM; -+ } -+ -+ return 0; -+} -+ -+static void *rsa_wd_sync_run(void *arg) -+{ -+ thread_data *pdata = (thread_data *)arg; -+ int key_size = pdata->keybits >> 3; -+ struct wcrypto_rsa_ctx_setup setup; -+ struct wcrypto_rsa_op_data opdata; -+ struct wd_queue *queue; -+ void *key_info = NULL; -+ void *ctx = NULL; -+ void *tag = NULL; -+ void *pool; -+ u32 count = 0; -+ int ret; -+ -+ memset(&setup, 0, sizeof(setup)); -+ memset(&opdata, 0, sizeof(opdata)); -+ pool = g_thread_queue.bd_res[pdata->td_id].pool; -+ queue = g_thread_queue.bd_res[pdata->td_id].queue; -+ -+ setup.br.alloc = (void *)wd_alloc_blk; -+ setup.br.free = (void *)wd_free_blk; -+ setup.br.iova_map = (void *)wd_blk_iova_map; -+ setup.br.iova_unmap = (void *)wd_blk_iova_unmap; -+ setup.br.get_bufsize = (void *)wd_blksize; -+ setup.br.usr = pool; -+ setup.key_bits = pdata->keybits; -+ setup.is_crt = pdata->kmode; -+ -+ ctx = wcrypto_create_rsa_ctx(queue, &setup); -+ if (!ctx) -+ return NULL; -+ -+ key_info = malloc(key_size * 16); -+ if (!key_info) { -+ HPRE_TST_PRT("failed to alloc RSA key info!\n"); -+ return NULL; -+ } -+ memset(key_info, 0, key_size * 16); -+ -+ rsa_key_in = malloc(2 * key_size + sizeof(struct hpre_rsa_key_in)); -+ if (!rsa_key_in) { -+ HPRE_TST_PRT("failed to alloc RSA key input param!\n"); -+ goto key_release; -+ } -+ rsa_key_in->e = rsa_key_in + 1; -+ rsa_key_in->p = rsa_key_in->e + key_size; -+ rsa_key_in->q = rsa_key_in->p + (key_size >> 1); -+ -+ ret = get_rsa_key_from_sample(ctx, key_info, key_info, -+ pdata->keybits, pdata->kmode); -+ if (ret) { -+ HPRE_TST_PRT("failed to get sample key data!\n"); -+ goto sample_release; -+ } -+ -+ opdata.in_bytes = key_size; -+ opdata.out_bytes = key_size; -+ opdata.op_type = pdata->optype; -+ if (opdata.op_type == WCRYPTO_RSA_GENKEY) { -+ ret = get_hpre_keygen_opdata(ctx, &opdata); -+ if (ret){ -+ HPRE_TST_PRT("failed to fill rsa key gen req!\n"); -+ goto sample_release; -+ } -+ } else { -+ opdata.in = wd_alloc_blk(pool); -+ if (!opdata.in) { -+ HPRE_TST_PRT("failed to alloc rsa in buffer!\n"); -+ goto sample_release; -+ } -+ memset(opdata.in, 0, opdata.in_bytes); -+ memcpy(opdata.in + key_size - sizeof(rsa_m), rsa_m, sizeof(rsa_m)); -+ -+ opdata.out = wd_alloc_blk(pool); -+ if (!opdata.out) { -+ HPRE_TST_PRT("failed to alloc rsa out buffer!\n"); -+ goto in_release; -+ } -+ } -+ -+ do { -+ ret = wcrypto_do_rsa(ctx, &opdata, tag); -+ if (ret || opdata.status) { -+ HPRE_TST_PRT("failed to do rsa task, status: %d\n", opdata.status); -+ goto out_release; -+ } -+ -+ count++; -+ if (get_run_state() == 0) -+ break; -+ } while(true); -+ -+ /* clean output buffer remainings in the last time operation */ -+ if (opdata.op_type == WCRYPTO_RSA_GENKEY) { -+ char *data; -+ int len; -+ -+ len = wcrypto_rsa_kg_out_data((void *)opdata.out, &data); -+ if (len < 0) { -+ HPRE_TST_PRT("failed to wd rsa get key gen out data!\n"); -+ goto out_release; -+ } -+ memset(data, 0, len); -+ -+ wcrypto_del_kg_in(ctx, opdata.in); -+ opdata.in = NULL; -+ wcrypto_del_kg_out(ctx, opdata.out); -+ opdata.out = NULL; -+ } -+ -+out_release: -+ if (opdata.out) -+ wd_free_blk(pool, opdata.out); -+in_release: -+ if (opdata.in) -+ wd_free_blk(pool, opdata.in); -+sample_release: -+ free(rsa_key_in); -+key_release: -+ free(key_info); -+ -+ wcrypto_del_rsa_ctx(ctx); -+ add_recv_data(count, key_size); -+ -+ return NULL; -+} -+ -+static void rsa_async_cb(const void *msg, void *tag) -+{ -+ //struct wcrypto_rsa_msg *massage = msg; -+ //struct rsa_async_tag *ptag = tag; -+ //u32 op_type = tag->op_type; -+ //void *ctx = tag->ctx; -+ -+ return; -+} -+ -+static void *rsa_wd_async_run(void *arg) -+{ -+ thread_data *pdata = (thread_data *)arg; -+ int key_size = pdata->keybits >> 3; -+ struct wcrypto_rsa_ctx_setup setup; -+ struct wcrypto_rsa_op_data opdata; -+ struct rsa_async_tag *tag = NULL; -+ struct wd_queue *queue; -+ void *key_info = NULL; -+ void *ctx = NULL; -+ int try_cnt = 0; -+ void *pool; -+ u32 count = 0; -+ int i, ret; -+ -+ memset(&setup, 0, sizeof(setup)); -+ memset(&opdata, 0, sizeof(opdata)); -+ pool = g_thread_queue.bd_res[pdata->td_id].pool; -+ queue = g_thread_queue.bd_res[pdata->td_id].queue; -+ -+ setup.cb = (void *)rsa_async_cb; -+ setup.br.alloc = (void *)wd_alloc_blk; -+ setup.br.free = (void *)wd_free_blk; -+ setup.br.iova_map = (void *)wd_blk_iova_map; -+ setup.br.iova_unmap = (void *)wd_blk_iova_unmap; -+ setup.br.get_bufsize = (void *)wd_blksize; -+ setup.br.usr = pool; -+ setup.key_bits = pdata->keybits; -+ setup.is_crt = pdata->kmode; -+ -+ ctx = wcrypto_create_rsa_ctx(queue, &setup); -+ if (!ctx) -+ return NULL; -+ -+ key_info = malloc(key_size * 16); -+ if (!key_info) { -+ HPRE_TST_PRT("failed to alloc RSA key info!\n"); -+ return NULL; -+ } -+ memset(key_info, 0, key_size * 16); -+ -+ rsa_key_in = malloc(2 * key_size + sizeof(struct hpre_rsa_key_in)); -+ if (!rsa_key_in) { -+ HPRE_TST_PRT("failed to alloc RSA key input param!\n"); -+ goto key_release; -+ } -+ rsa_key_in->e = rsa_key_in + 1; -+ rsa_key_in->p = rsa_key_in->e + key_size; -+ rsa_key_in->q = rsa_key_in->p + (key_size >> 1); -+ -+ ret = get_rsa_key_from_sample(ctx, key_info, key_info, -+ pdata->keybits, pdata->kmode); -+ if (ret) { -+ HPRE_TST_PRT("failed to get sample key data!\n"); -+ goto sample_release; -+ } -+ -+ opdata.in_bytes = key_size; -+ opdata.out_bytes = key_size; -+ opdata.op_type = pdata->optype; -+ if (opdata.op_type == WCRYPTO_RSA_GENKEY) { -+ ret = get_hpre_keygen_opdata(ctx, &opdata); -+ if (ret){ -+ HPRE_TST_PRT("failed to fill rsa key gen req!\n"); -+ goto sample_release; -+ } -+ } else { -+ opdata.in = wd_alloc_blk(pool); -+ if (!opdata.in) { -+ HPRE_TST_PRT("failed to alloc rsa in buffer!\n"); -+ goto sample_release; -+ } -+ memset(opdata.in, 0, opdata.in_bytes); -+ memcpy(opdata.in + key_size - sizeof(rsa_m), rsa_m, sizeof(rsa_m)); -+ -+ opdata.out = wd_alloc_blk(pool); -+ if (!opdata.out) { -+ HPRE_TST_PRT("failed to alloc rsa out buffer!\n"); -+ goto in_release; -+ } -+ } -+ -+ tag = malloc(sizeof(*tag) * MAX_POOL_LENTH); -+ if (!tag) { -+ HPRE_TST_PRT("failed to malloc rsa tag!\n"); -+ goto out_release; -+ } -+ -+ do { -+ if (get_run_state() == 0) -+ break; -+ -+ try_cnt = 0; -+ i = count % MAX_POOL_LENTH; -+ tag[i].ctx = ctx; -+ tag[i].cnt = i; -+ tag[i].optype = opdata.op_type; -+ -+ ret = wcrypto_do_rsa(ctx, &opdata, &tag[i]); -+ if (ret == -WD_EBUSY) { -+ usleep(SEND_USLEEP * try_cnt); -+ try_cnt++; -+ if (try_cnt > MAX_TRY_CNT) { -+ HPRE_TST_PRT("Test RSA send fail %d times!\n", MAX_TRY_CNT); -+ try_cnt = 0; -+ } -+ continue; -+ } else if (ret) { -+ HPRE_TST_PRT("failed to do rsa async task!\n"); -+ goto tag_release; -+ } -+ count++; -+ } while(true); -+ -+ /* clean output buffer remainings in the last time operation */ -+ if (opdata.op_type == WCRYPTO_RSA_GENKEY) { -+ char *data; -+ int len; -+ -+ len = wcrypto_rsa_kg_out_data((void *)opdata.out, &data); -+ if (len < 0) { -+ HPRE_TST_PRT("failed to wd rsa get key gen out data!\n"); -+ goto out_release; -+ } -+ memset(data, 0, len); -+ -+ wcrypto_del_kg_in(ctx, opdata.in); -+ opdata.in = NULL; -+ wcrypto_del_kg_out(ctx, opdata.out); -+ opdata.out = NULL; -+ } -+ -+tag_release: -+ free(tag); -+out_release: -+ if (opdata.out) -+ wd_free_blk(pool, opdata.out); -+in_release: -+ if (opdata.in) -+ wd_free_blk(pool, opdata.in); -+sample_release: -+ free(rsa_key_in); -+key_release: -+ free(key_info); -+ -+ while (1) { -+ if (get_recv_time() > 0) // wait Async mode finish recv -+ break; -+ usleep(SEND_USLEEP); -+ } -+ wcrypto_del_rsa_ctx(ctx); -+ -+ add_send_complete(); -+ -+ return NULL; -+} -+ -+static int get_dh_param_from_sample(struct hpre_dh_param *setup, -+ u32 key_bits, u8 is_g2) -+{ -+ setup->key_bits = key_bits; -+ -+ switch (key_bits) { -+ case 768: -+ setup->x = dh_xa_768; -+ setup->p = dh_p_768; -+ setup->except_pub_key = dh_except_b_pubkey_768; -+ setup->pub_key = dh_except_a_pubkey_768; -+ setup->share_key = dh_share_key_768; -+ setup->x_size = sizeof(dh_xa_768); -+ setup->p_size = sizeof(dh_p_768); -+ setup->except_pub_key_size = sizeof(dh_except_b_pubkey_768); -+ setup->pub_key_size = sizeof(dh_except_a_pubkey_768); -+ setup->share_key_size = sizeof(dh_share_key_768); -+ break; -+ case 1024: -+ setup->x = dh_xa_1024; -+ setup->p = dh_p_1024; -+ setup->except_pub_key = dh_except_b_pubkey_1024; -+ setup->pub_key = dh_except_a_pubkey_1024; -+ setup->share_key = dh_share_key_1024; -+ setup->x_size = sizeof(dh_xa_1024); -+ setup->p_size = sizeof(dh_p_1024); -+ setup->except_pub_key_size = sizeof(dh_except_b_pubkey_1024); -+ setup->pub_key_size = sizeof(dh_except_a_pubkey_1024); -+ setup->share_key_size = sizeof(dh_share_key_1024); -+ break; -+ case 1536: -+ setup->x = dh_xa_1536; -+ setup->p = dh_p_1536; -+ setup->except_pub_key = dh_except_b_pubkey_1536; -+ setup->pub_key = dh_except_a_pubkey_1536; -+ setup->share_key = dh_share_key_1536; -+ setup->x_size = sizeof(dh_xa_1536); -+ setup->p_size = sizeof(dh_p_1536); -+ setup->except_pub_key_size = sizeof(dh_except_b_pubkey_1536); -+ setup->pub_key_size = sizeof(dh_except_a_pubkey_1536); -+ setup->share_key_size = sizeof(dh_share_key_1536); -+ break; -+ case 2048: -+ setup->x = dh_xa_2048; -+ setup->p = dh_p_2048; -+ setup->except_pub_key = dh_except_b_pubkey_2048; -+ setup->pub_key = dh_except_a_pubkey_2048; -+ setup->share_key = dh_share_key_2048; -+ setup->x_size = sizeof(dh_xa_2048); -+ setup->p_size = sizeof(dh_p_2048); -+ setup->except_pub_key_size = sizeof(dh_except_b_pubkey_2048); -+ setup->pub_key_size = sizeof(dh_except_a_pubkey_2048); -+ setup->share_key_size = sizeof(dh_share_key_2048); -+ break; -+ case 3072: -+ setup->x = dh_xa_3072; -+ setup->p = dh_p_3072; -+ setup->except_pub_key = dh_except_b_pubkey_3072; -+ setup->pub_key = dh_except_a_pubkey_3072; -+ setup->share_key = dh_share_key_3072; -+ setup->x_size = sizeof(dh_xa_3072); -+ setup->p_size = sizeof(dh_p_3072); -+ setup->except_pub_key_size = sizeof(dh_except_b_pubkey_3072); -+ setup->pub_key_size = sizeof(dh_except_a_pubkey_3072); -+ setup->share_key_size = sizeof(dh_share_key_3072); -+ break; -+ case 4096: -+ setup->x = dh_xa_4096; -+ setup->p = dh_p_4096; -+ setup->except_pub_key = dh_except_b_pubkey_4096; -+ setup->pub_key = dh_except_a_pubkey_4096; -+ setup->share_key = dh_share_key_4096; -+ setup->x_size = sizeof(dh_xa_4096); -+ setup->p_size = sizeof(dh_p_4096); -+ setup->except_pub_key_size = sizeof(dh_except_b_pubkey_4096); -+ setup->pub_key_size = sizeof(dh_except_a_pubkey_4096); -+ setup->share_key_size = sizeof(dh_share_key_4096); -+ break; -+ default: -+ HPRE_TST_PRT("failed to find dh keybits %u\n", key_bits); -+ return -EINVAL; -+ } -+ -+ if (is_g2) { -+ setup->g = dh_g_2; -+ } else { -+ setup->g = dh_g_5; -+ } -+ setup->g_size = 1; -+ -+ return 0; -+} -+ -+static int get_dh_opdata_param(void *ctx, struct wcrypto_dh_op_data *opdata, -+ struct hpre_dh_param *setup, int key_size) -+{ -+ unsigned char *ag_bin = NULL; -+ void *pool = setup->pool; -+ struct wd_dtb ctx_g; -+ int ret; -+ -+ ag_bin = wd_alloc_blk(pool); -+ if (!ag_bin) -+ return -ENOMEM; -+ -+ memset(ag_bin, 0, 2 * key_size); -+ opdata->pv = ag_bin; -+ -+ opdata->x_p = wd_alloc_blk(pool); -+ if (!opdata->x_p) -+ goto ag_error; -+ -+ memset(opdata->x_p, 0, 2 * key_size); -+ -+ opdata->pri = wd_alloc_blk(pool); -+ if (!opdata->pri) -+ goto xp_error; -+ -+ memset(opdata->pri, 0, 2 * key_size); -+ opdata->pri_bytes = 2 * key_size; -+ -+ ctx_g.data = malloc(key_size); -+ if (!ctx_g.data) -+ goto ctx_release; -+ -+ if (setup->optype == WCRYPTO_DH_PHASE1) { // GEN1 -+ memcpy(opdata->x_p, setup->x, setup->x_size); -+ memcpy(opdata->x_p + key_size, setup->p, setup->p_size); -+ memcpy(ctx_g.data, setup->g, setup->g_size); -+ opdata->pbytes = setup->p_size; -+ opdata->xbytes = setup->x_size; -+ ctx_g.dsize = setup->g_size; -+ ctx_g.bsize = key_size; -+ -+ ret = wcrypto_set_dh_g(ctx, &ctx_g); -+ if (ret) -+ HPRE_TST_PRT("wd_dh_set_g run failed\n"); -+ } else { // GEN1 -+ memcpy(opdata->x_p, setup->x, setup->x_size); -+ memcpy(opdata->x_p + key_size, setup->p, setup->p_size); -+ memcpy(opdata->pv, setup->except_pub_key, setup->except_pub_key_size); -+ opdata->pbytes = setup->p_size; -+ opdata->xbytes = setup->x_size; -+ opdata->pvbytes = setup->except_pub_key_size; -+ } -+ -+ free(ctx_g.data); -+ -+ return 0; -+ -+ctx_release: -+ wd_free_blk(pool, opdata->pri); -+xp_error: -+ wd_free_blk(pool, opdata->x_p); -+ag_error: -+ wd_free_blk(pool, opdata->pv); -+ -+ return -ENOMEM; -+} -+ -+static void *dh_wd_sync_run(void *arg) -+{ -+ thread_data *pdata = (thread_data *)arg; -+ int key_size = pdata->keybits >> 3; -+ struct wcrypto_dh_ctx_setup dh_setup; -+ struct wcrypto_dh_op_data opdata; -+ struct hpre_dh_param setup; -+ struct wd_queue *queue; -+ void *ctx = NULL; -+ void *tag = NULL; -+ void *pool; -+ u32 count = 0; -+ int ret; -+ -+ memset(&dh_setup, 0, sizeof(dh_setup)); -+ memset(&opdata, 0, sizeof(opdata)); -+ -+ pool = g_thread_queue.bd_res[pdata->td_id].pool; -+ queue = g_thread_queue.bd_res[pdata->td_id].queue; -+ dh_setup.key_bits = pdata->keybits; -+ dh_setup.br.alloc = (void *)wd_alloc_blk; -+ dh_setup.br.free = (void *)wd_free_blk; -+ dh_setup.br.iova_map = (void *)wd_blk_iova_map; -+ dh_setup.br.iova_unmap = (void *)wd_blk_iova_unmap; -+ dh_setup.br.get_bufsize = (void *)wd_blksize; -+ dh_setup.br.usr = pool; -+ if (pdata->optype == WCRYPTO_DH_PHASE2) -+ dh_setup.is_g2 = true; // G1 is 0; G2 is 1; -+ -+ ctx = wcrypto_create_dh_ctx(queue, &dh_setup); -+ if (!ctx) -+ return NULL; -+ -+ ret = get_dh_param_from_sample(&setup, pdata->keybits, pdata->kmode); -+ if (ret) -+ goto ctx_release; -+ -+ setup.optype = pdata->optype; -+ setup.pool = pool; -+ opdata.op_type = pdata->optype; -+ ret = get_dh_opdata_param(ctx, &opdata, &setup, key_size); -+ if (ret){ -+ HPRE_TST_PRT("failed to fill dh key gen req!\n"); -+ goto param_release; -+ } -+ -+ do { -+ ret = wcrypto_do_dh(ctx, &opdata, tag); -+ if (ret || opdata.status) { -+ HPRE_TST_PRT("failed to do dh task, status: %d\n", opdata.status); -+ goto param_release; -+ } -+ -+ count++; -+ if (get_run_state() == 0) -+ break; -+ } while(true); -+ -+param_release: -+ wd_free_blk(pool, opdata.x_p); -+ wd_free_blk(pool, opdata.pv); -+ wd_free_blk(pool, opdata.pri); -+ctx_release: -+ wcrypto_del_dh_ctx(ctx); -+ add_recv_data(count, key_size); -+ -+ return NULL; -+} -+ -+static void dh_async_cb(const void *msg, void *tag) -+{ -+ //struct wcrypto_dh_msg *massage = msg; -+ //struct rsa_async_tag *ptag = tag; -+ //u32 op_type = tag->op_type; -+ //void *ctx = tag->ctx; -+ -+ return; -+} -+ -+static void *dh_wd_async_run(void *arg) -+{ -+ thread_data *pdata = (thread_data *)arg; -+ int key_size = pdata->keybits >> 3; -+ struct wcrypto_dh_ctx_setup dh_setup; -+ struct wcrypto_dh_op_data opdata; -+ struct rsa_async_tag *tag = NULL; -+ struct hpre_dh_param setup; -+ struct wd_queue *queue; -+ void *ctx = NULL; -+ int try_cnt = 0; -+ void *pool; -+ u32 count = 0; -+ int i, ret; -+ -+ memset(&dh_setup, 0, sizeof(dh_setup)); -+ memset(&opdata, 0, sizeof(opdata)); -+ -+ pool = g_thread_queue.bd_res[pdata->td_id].pool; -+ queue = g_thread_queue.bd_res[pdata->td_id].queue; -+ dh_setup.key_bits = pdata->keybits; -+ dh_setup.br.alloc = (void *)wd_alloc_blk; -+ dh_setup.br.free = (void *)wd_free_blk; -+ dh_setup.br.iova_map = (void *)wd_blk_iova_map; -+ dh_setup.br.iova_unmap = (void *)wd_blk_iova_unmap; -+ dh_setup.br.get_bufsize = (void *)wd_blksize; -+ dh_setup.cb = (void *)dh_async_cb; -+ dh_setup.br.usr = pool; -+ if (pdata->optype == WCRYPTO_DH_PHASE2) -+ dh_setup.is_g2 = true; // G1 is 0; G2 is 1; -+ -+ ctx = wcrypto_create_dh_ctx(queue, &dh_setup); -+ if (!ctx) -+ return NULL; -+ -+ ret = get_dh_param_from_sample(&setup, pdata->keybits, pdata->kmode); -+ if (ret) -+ goto ctx_release; -+ -+ setup.optype = pdata->optype; -+ setup.pool = pool; -+ opdata.op_type = pdata->optype; -+ ret = get_dh_opdata_param(ctx, &opdata, &setup, key_size); -+ if (ret){ -+ HPRE_TST_PRT("failed to fill dh key gen req!\n"); -+ goto param_release; -+ } -+ -+ tag = malloc(sizeof(*tag) * MAX_POOL_LENTH); -+ if (!tag) { -+ HPRE_TST_PRT("failed to malloc dh tag!\n"); -+ goto param_release; -+ } -+ -+ do { -+ if (get_run_state() == 0) -+ break; -+ -+ try_cnt = 0; -+ i = count % MAX_POOL_LENTH; -+ tag[i].ctx = ctx; -+ tag[i].cnt = i; -+ tag[i].optype = opdata.op_type; -+ -+ ret = wcrypto_do_dh(ctx, &opdata, &tag[i]); -+ if (ret == -WD_EBUSY) { -+ usleep(SEND_USLEEP * try_cnt); -+ try_cnt++; -+ if (try_cnt > MAX_TRY_CNT) { -+ HPRE_TST_PRT("Test DH send fail %d times!\n", MAX_TRY_CNT); -+ try_cnt = 0; -+ } -+ continue; -+ } else if (ret) { -+ HPRE_TST_PRT("failed to do rsa async task!\n"); -+ goto tag_release; -+ } -+ -+ count++; -+ } while(true); -+ -+tag_release: -+ free(tag); -+param_release: -+ wd_free_blk(pool, opdata.x_p); -+ wd_free_blk(pool, opdata.pv); -+ wd_free_blk(pool, opdata.pri); -+ctx_release: -+ while (1) { -+ if (get_recv_time() > 0) // wait Async mode finish recv -+ break; -+ usleep(SEND_USLEEP); -+ } -+ -+ wcrypto_del_dh_ctx(ctx); -+ add_send_complete(); -+ -+ return NULL; -+} -+ -+static int get_ecc_curve(struct hpre_ecc_setup *setup, u32 cid) -+{ -+ switch (cid) { -+ case 0: // secp128R1 -+ setup->nid = 706; -+ setup->curve_id = WCRYPTO_SECP128R1; -+ break; -+ case 1: // secp192K1 -+ setup->nid = 711; -+ setup->curve_id = WCRYPTO_SECP192K1; -+ break; -+ case 2: // secp256K1 -+ setup->nid = 714; -+ setup->curve_id = WCRYPTO_SECP256K1; -+ break; -+ case 3: // brainpoolP320R1 -+ setup->nid = 929; -+ setup->curve_id = WCRYPTO_BRAINPOOLP320R1; -+ break; -+ case 4: // brainpoolP384R1 -+ setup->nid = 931; -+ setup->curve_id = WCRYPTO_BRAINPOOLP384R1; -+ break; -+ case 5: // secp521R1 -+ setup->nid = 716; -+ setup->curve_id = WCRYPTO_SECP521R1; -+ break; -+ default: -+ HPRE_TST_PRT("failed to get ecc curve id!\n"); -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ -+static int get_ecc_key_param(struct wcrypto_ecc_curve *param, u32 key_bits) -+{ -+ u32 key_size = (key_bits + 7) / 8; -+ -+ switch (key_bits) { -+ case 128: -+ param->a.data = ecdh_a_secp128r1; -+ param->b.data = ecdh_b_secp128r1; -+ param->p.data = ecdh_p_secp128r1; -+ param->n.data = ecdh_n_secp128r1; -+ param->g.x.data = ecdh_g_secp128r1; -+ param->g.y.data = ecdh_g_secp128r1 + key_size; -+ case 192: -+ param->a.data = ecdh_a_secp192k1; -+ param->b.data = ecdh_b_secp192k1; -+ param->p.data = ecdh_p_secp192k1; -+ param->n.data = ecdh_n_secp192k1; -+ param->g.x.data = ecdh_g_secp192k1; -+ param->g.y.data = ecdh_g_secp192k1 + key_size; -+ case 224: -+ param->a.data = ecdh_a_secp224r1; -+ param->b.data = ecdh_b_secp224r1; -+ param->p.data = ecdh_p_secp224r1; -+ param->n.data = ecdh_n_secp224r1; -+ param->g.x.data = ecdh_g_secp224r1; -+ param->g.y.data = ecdh_g_secp224r1 + key_size; -+ case 256: -+ param->a.data = ecdh_a_secp256k1; -+ param->b.data = ecdh_b_secp256k1; -+ param->p.data = ecdh_p_secp256k1; -+ param->n.data = ecdh_n_secp256k1; -+ param->g.x.data = ecdh_g_secp256k1; -+ param->g.y.data = ecdh_g_secp256k1 + key_size; -+ case 320: -+ param->a.data = ecdh_a_secp320k1; -+ param->b.data = ecdh_b_secp320k1; -+ param->p.data = ecdh_p_secp320k1; -+ param->n.data = ecdh_n_secp320k1; -+ param->g.x.data = ecdh_g_secp320k1; -+ param->g.y.data = ecdh_g_secp320k1 + key_size; -+ case 384: -+ param->a.data = ecdh_a_secp384r1; -+ param->b.data = ecdh_b_secp384r1; -+ param->p.data = ecdh_p_secp384r1; -+ param->n.data = ecdh_n_secp384r1; -+ param->g.x.data = ecdh_g_secp384r1; -+ param->g.y.data = ecdh_g_secp384r1 + key_size; -+ case 521: -+ param->a.data = ecdh_a_secp521r1; -+ param->b.data = ecdh_b_secp521r1; -+ param->p.data = ecdh_p_secp521r1; -+ param->n.data = ecdh_n_secp521r1; -+ param->g.x.data = ecdh_g_secp521r1; -+ param->g.y.data = ecdh_g_secp521r1 + key_size; -+ default: -+ HPRE_TST_PRT("key_bits %d not find\n", key_bits); -+ return -EINVAL; -+ } -+ -+ param->a.bsize = key_size; -+ param->a.dsize = key_size; -+ param->b.bsize = key_size; -+ param->b.dsize = key_size; -+ param->p.bsize = key_size; -+ param->p.dsize = key_size; -+ param->n.bsize = key_size; -+ param->n.dsize = key_size; -+ param->g.x.bsize = key_size; -+ param->g.x.dsize = key_size; -+ param->g.y.bsize = key_size; -+ param->g.y.dsize = key_size; -+ -+ return 0; -+} -+ -+static int ecc_get_rand(char *out, size_t out_len, void *usr) -+{ -+ //int ret; -+ -+ get_rand_data((u8 *)out, out_len); -+ //ret = RAND_priv_bytes((void *)out, out_len); -+ //if (ret != 1) { -+ // HPRE_TST_PRT("failed to get ecc rand data:%d\n", ret); -+ // return -EINVAL; -+ //} -+ -+ return 0; -+} -+ -+static int ecc_compute_hash(const char *in, size_t in_len, -+ char *out, size_t out_len, void *usr) -+{ -+ /* perf test for none hash check */ -+ return 0; -+} -+ -+static int get_ecc_param_from_sample(struct hpre_ecc_setup *setup, -+ u32 subtype, u32 key_bits) -+{ -+ int key_size = (key_bits + 7) / 8; -+ u32 len; -+ -+ setup->key_bits = key_bits; -+ -+ if (setup->nid == 714 || key_bits == 256) { // NID_secp256k1 -+ /* sm2 */ -+ if (subtype == SM2_TYPE) { -+ setup->priv_key = sm2_priv; -+ setup->priv_key_size = sizeof(sm2_priv); -+ setup->pub_key = sm2_pubkey; -+ setup->pub_key_size = sizeof(sm2_pubkey); -+ -+ len = SM2_DG_SZ; -+ setup->msg = malloc(len); -+ if (!setup->msg) -+ return -1; -+ memset(setup->msg, 0xFF, len); -+ -+ if (true) { // for msg_sigest mode -+ memcpy(setup->msg, sm2_digest, sizeof(sm2_digest)); -+ setup->msg_size = sizeof(sm2_digest); -+ } else { -+ memcpy(setup->msg, sm2_plaintext, sizeof(sm2_plaintext)); -+ setup->msg_size = sizeof(sm2_plaintext); -+ } -+ -+ if (setup->msg_size > 512) { -+ setup->ciphertext = sm2_ciphertext_l; -+ setup->ciphertext_size = sizeof(sm2_ciphertext_l); -+ setup->plaintext = sm2_plaintext_l; -+ setup->plaintext_size = sizeof(sm2_plaintext_l); -+ } else { -+ setup->ciphertext = sm2_ciphertext; -+ setup->ciphertext_size = sizeof(sm2_ciphertext); -+ setup->plaintext = sm2_plaintext; -+ setup->plaintext_size = sizeof(sm2_plaintext); -+ } -+ -+ setup->k = sm2_k; -+ setup->k_size = sizeof(sm2_k); -+ setup->userid = sm2_id; -+ setup->userid_size = sizeof(sm2_id); -+ setup->sign = sm2_sign_data; -+ setup->sign_size = sizeof(sm2_sign_data); -+ -+ } else { -+ setup->priv_key = ecdh_da_secp256k1; -+ setup->except_pub_key = ecdh_except_b_pubkey_secp256k1; -+ setup->pub_key = ecdh_cp_pubkey_secp256k1; -+ setup->share_key = ecdh_cp_sharekey_secp256k1; -+ setup->priv_key_size = sizeof(ecdh_da_secp256k1); -+ setup->except_pub_key_size = sizeof(ecdh_except_b_pubkey_secp256k1); -+ setup->pub_key_size = sizeof(ecdh_cp_pubkey_secp256k1); -+ setup->share_key_size = sizeof(ecdh_cp_sharekey_secp256k1); -+ -+ /* ecc sign */ -+ setup->msg = ecc_except_e_secp256k1; -+ setup->msg_size = sizeof(ecc_except_e_secp256k1); -+ setup->k = ecc_except_kinv_secp256k1; -+ setup->k_size = sizeof(ecc_except_kinv_secp256k1); -+ setup->rp = ecdh_cp_pubkey_secp256k1 + 1; -+ setup->rp_size = key_size; -+ -+ /* ecc verf */ -+ setup->sign = ecc_cp_sign_secp256k1; -+ setup->sign_size = sizeof(ecc_cp_sign_secp256k1); -+ } -+ } else if (setup->nid == 706 || key_bits == 128) { -+ setup->priv_key = ecdh_da_secp128r1; -+ setup->except_pub_key = ecdh_except_b_pubkey_secp128r1; -+ setup->pub_key = ecdh_cp_pubkey_secp128r1; -+ setup->share_key = ecdh_cp_sharekey_secp128r1; -+ setup->priv_key_size = sizeof(ecdh_da_secp128r1); -+ setup->except_pub_key_size = sizeof(ecdh_except_b_pubkey_secp128r1); -+ setup->pub_key_size = sizeof(ecdh_cp_pubkey_secp128r1); -+ setup->share_key_size = sizeof(ecdh_cp_sharekey_secp128r1); -+ -+ /* ecc sign */ -+ setup->msg = ecc_except_e_secp128r1; -+ setup->msg_size = sizeof(ecc_except_e_secp128r1); -+ setup->k = ecc_except_kinv_secp128r1; -+ setup->k_size = sizeof(ecc_except_kinv_secp128r1); -+ setup->rp = ecdh_cp_pubkey_secp128r1 + 1; -+ setup->rp_size = key_size; -+ -+ /* ecc verf */ -+ setup->sign = ecc_cp_sign_secp128r1; -+ setup->sign_size = sizeof(ecc_cp_sign_secp128r1); -+ -+ } else if (setup->nid == 711 || key_bits == 192) { -+ setup->priv_key = ecdh_da_secp192k1; -+ setup->except_pub_key = ecdh_except_b_pubkey_secp192k1; -+ setup->pub_key = ecdh_cp_pubkey_secp192k1; -+ setup->share_key = ecdh_cp_sharekey_secp192k1; -+ setup->priv_key_size = sizeof(ecdh_da_secp192k1); -+ setup->except_pub_key_size = sizeof(ecdh_except_b_pubkey_secp192k1); -+ setup->pub_key_size = sizeof(ecdh_cp_pubkey_secp192k1); -+ setup->share_key_size = sizeof(ecdh_cp_sharekey_secp192k1); -+ -+ /* ecc sign */ -+ setup->msg = ecc_except_e_secp192k1; -+ setup->msg_size = sizeof(ecc_except_e_secp192k1); -+ setup->k = ecc_except_kinv_secp192k1; -+ setup->k_size = sizeof(ecc_except_kinv_secp192k1); -+ setup->rp = ecdh_cp_pubkey_secp192k1 + 1; -+ setup->rp_size = key_size; -+ -+ /* ecc verf */ -+ setup->sign = ecc_cp_sign_secp256k1; -+ setup->sign_size = sizeof(ecc_cp_sign_secp256k1); -+ } else if (setup->nid == 712 || key_bits == 224) { -+ setup->priv_key = ecdh_da_secp224r1; -+ setup->except_pub_key = ecdh_except_b_pubkey_secp224r1; -+ setup->pub_key = ecdh_cp_pubkey_secp224r1; -+ setup->share_key = ecdh_cp_sharekey_secp224r1; -+ setup->priv_key_size = sizeof(ecdh_da_secp224r1); -+ setup->except_pub_key_size = sizeof(ecdh_except_b_pubkey_secp224r1); -+ setup->pub_key_size = sizeof(ecdh_cp_pubkey_secp224r1); -+ setup->share_key_size = sizeof(ecdh_cp_sharekey_secp224r1); -+ } else if (setup->nid == 929 || key_bits == 320) { -+ setup->priv_key = ecdh_da_secp320k1; -+ setup->except_pub_key = ecdh_except_b_pubkey_secp320k1; -+ setup->pub_key = ecdh_cp_pubkey_secp320k1; -+ setup->share_key = ecdh_cp_sharekey_secp320k1; -+ setup->priv_key_size = sizeof(ecdh_da_secp320k1); -+ setup->except_pub_key_size = sizeof(ecdh_except_b_pubkey_secp320k1); -+ setup->pub_key_size = sizeof(ecdh_cp_pubkey_secp320k1); -+ setup->share_key_size = sizeof(ecdh_cp_sharekey_secp320k1); -+ -+ /* ecc sign */ -+ setup->msg = ecc_except_e_secp320k1; -+ setup->msg_size = sizeof(ecc_except_e_secp320k1); -+ setup->k = ecc_except_kinv_secp320k1; -+ setup->k_size = sizeof(ecc_except_kinv_secp320k1); -+ setup->rp = ecdh_cp_pubkey_secp192k1 + 1; -+ setup->rp_size = key_size; -+ -+ /* ecc verf */ -+ setup->sign = ecc_cp_sign_secp256k1; -+ setup->sign_size = sizeof(ecc_cp_sign_secp256k1); -+ -+ } else if (setup->nid == 931 || key_bits == 384) { -+ setup->priv_key = ecdh_da_secp384r1; -+ setup->except_pub_key = ecdh_except_b_pubkey_secp384r1; -+ setup->pub_key = ecdh_cp_pubkey_secp384r1; -+ setup->share_key = ecdh_cp_sharekey_secp384r1; -+ setup->priv_key_size = sizeof(ecdh_da_secp384r1); -+ setup->except_pub_key_size = sizeof(ecdh_except_b_pubkey_secp384r1); -+ setup->pub_key_size = sizeof(ecdh_cp_pubkey_secp384r1); -+ setup->share_key_size = sizeof(ecdh_cp_sharekey_secp384r1); -+ -+ /* ecc sign */ -+ setup->msg = ecc_except_e_secp384r1; -+ setup->msg_size = sizeof(ecc_except_e_secp384r1); -+ setup->k = ecc_except_kinv_secp384r1; -+ setup->k_size = sizeof(ecc_except_kinv_secp384r1); -+ setup->rp = ecdh_cp_pubkey_secp384r1 + 1; -+ setup->rp_size = key_size; -+ -+ /* ecc verf */ -+ setup->sign = ecc_cp_sign_secp256k1; -+ setup->sign_size = sizeof(ecc_cp_sign_secp256k1); -+ } else if (setup->nid == 716 || key_bits == 521) { -+ setup->priv_key = ecdh_da_secp521r1; -+ setup->except_pub_key = ecdh_except_b_pubkey_secp521r1; -+ setup->pub_key = ecdh_cp_pubkey_secp521r1; -+ setup->share_key = ecdh_cp_sharekey_secp521r1; -+ setup->priv_key_size = sizeof(ecdh_da_secp521r1); -+ setup->except_pub_key_size = sizeof(ecdh_except_b_pubkey_secp521r1); -+ setup->pub_key_size = sizeof(ecdh_cp_pubkey_secp521r1); -+ setup->share_key_size = sizeof(ecdh_cp_sharekey_secp521r1); -+ -+ /* ecc sign */ -+ setup->msg = ecc_except_e_secp521r1; -+ setup->msg_size = sizeof(ecc_except_e_secp521r1); -+ setup->k = ecc_except_kinv_secp521r1; -+ setup->k_size = sizeof(ecc_except_kinv_secp521r1); -+ setup->rp = ecdh_cp_pubkey_secp521r1 + 1; -+ setup->rp_size = key_size; -+ -+ /* ecc verf */ -+ setup->sign = ecc_cp_sign_secp256k1; -+ setup->sign_size = sizeof(ecc_cp_sign_secp256k1); -+ -+ } else { -+ HPRE_TST_PRT("init test sess setup not find this bits %d or nid %d\n", -+ key_bits, setup->nid); -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ -+static int ecdsa_param_fill(void *ctx, struct wcrypto_ecc_op_data *opdata, -+ struct wcrypto_ecc_key *ecc_key, struct hpre_ecc_setup *setup, -+ thread_data *pdata) -+{ -+ int key_insize = (pdata->keybits + 7) / 8; -+ u32 optype = pdata->optype; -+ struct wcrypto_ecc_out *ecc_out = NULL; -+ struct wcrypto_ecc_in *ecc_in = NULL; -+ struct wcrypto_ecc_point pub; -+ struct wd_dtb d, e, k; -+ int ret = 0; -+ -+ if (optype == WCRYPTO_ECDSA_SIGN) {// Sign -+ ecc_out = wcrypto_new_ecdsa_sign_out(ctx); -+ if (!ecc_out) { -+ HPRE_TST_PRT("failed to get ecdsa out!\n"); -+ return -ENOMEM; -+ } -+ -+ d.data = (void *)setup->priv_key; -+ d.dsize = setup->priv_key_size; -+ d.bsize = setup->priv_key_size; -+ ret = wcrypto_set_ecc_prikey(ecc_key, &d); -+ if (ret) { -+ HPRE_TST_PRT("failed to set ecdsa prikey!\n"); -+ goto del_ecc_out; -+ } -+ -+ pub.x.data = (void *)setup->pub_key + 1; -+ pub.x.dsize = key_insize; -+ pub.x.bsize = key_insize; -+ pub.y.data = pub.x.data + key_insize; -+ pub.y.dsize = key_insize; -+ pub.y.bsize = key_insize; -+ ret = wcrypto_set_ecc_pubkey(ecc_key, &pub); -+ if (ret) { -+ HPRE_TST_PRT("failed to set ecdsa pubkey!\n"); -+ goto del_ecc_out; -+ } -+ -+ e.data = (void *)setup->msg; -+ e.dsize = setup->msg_size; -+ e.bsize = key_insize; -+ -+ k.data = (void *)setup->k; -+ k.dsize = setup->k_size; -+ k.bsize = key_insize; -+ ecc_in = wcrypto_new_ecdsa_sign_in(ctx, &e, &k); -+ if (!ecc_in) { -+ HPRE_TST_PRT("failed to get ecdsa sign in!\n"); -+ ret = -ENOMEM; -+ goto del_ecc_out; -+ } -+ -+ opdata->in = ecc_in; -+ opdata->out = ecc_out; -+ } else { // Verf -+ pub.x.data = (void *)setup->pub_key + 1; -+ pub.x.dsize = key_insize; -+ pub.x.bsize = key_insize; -+ pub.y.data = pub.x.data + key_insize; -+ pub.y.dsize = key_insize; -+ pub.y.bsize = key_insize; -+ ret = wcrypto_set_ecc_pubkey(ecc_key, &pub); -+ if (ret) { -+ HPRE_TST_PRT("failed to set ecdsa pubkey!\n"); -+ return -ENOMEM; -+ } -+ -+ e.data = (void *)setup->msg; -+ e.dsize = setup->msg_size; -+ e.bsize = key_insize; -+ -+ d.data = (void *)setup->sign; -+ d.dsize = key_insize; -+ d.bsize = key_insize; -+ k.data = d.data + key_insize; -+ k.dsize = key_insize; -+ k.bsize = key_insize; -+ ecc_in = wcrypto_new_ecdsa_verf_in(ctx, &e, &d, &k); -+ if (!ecc_in) { -+ HPRE_TST_PRT("failed to get ecdsa verf ecc in!\n"); -+ return -ENOMEM; -+ } -+ -+ opdata->in = ecc_in; -+ } -+ -+ return 0; -+del_ecc_out: -+ if (ecc_out) -+ (void)wcrypto_del_ecc_out(ctx, ecc_out); -+ return ret; -+} -+ -+static int sm2_param_fill(void *ctx, struct wcrypto_ecc_op_data *opdata, -+ struct hpre_ecc_setup *setup, thread_data *pdata) -+{ -+ int key_insize = (pdata->keybits + 7) / 8; -+ u32 optype = pdata->optype; -+ struct wcrypto_ecc_out *ecc_out = NULL; -+ struct wcrypto_ecc_in *ecc_in = NULL; -+ struct wcrypto_ecc_point tmp; -+ struct wd_dtb d, e, k; -+ -+ switch (optype) { -+ case WCRYPTO_SM2_SIGN:// Sign -+ ecc_out = wcrypto_new_sm2_sign_out(ctx); -+ if (!ecc_out) { -+ HPRE_TST_PRT("failed to alloc sm2 ecc out!\n"); -+ return -ENOMEM; -+ } -+ -+ e.data = (void *)setup->msg; -+ e.dsize = setup->msg_size; -+ e.bsize = setup->msg_size; -+ k.data = (void *)setup->k; -+ k.dsize = setup->k_size; -+ k.bsize = key_insize; -+ ecc_in = wcrypto_new_sm2_sign_in(ctx, &e, &k, NULL, 1); -+ if (!ecc_in) { -+ HPRE_TST_PRT("failed to alloc sm2 ecc in!\n"); -+ goto del_ecc_out; -+ } -+ opdata->in = ecc_in; -+ opdata->out = ecc_out; -+ break; -+ case WCRYPTO_SM2_VERIFY: // Verf -+ ecc_out = wcrypto_new_sm2_sign_out(ctx); -+ if (!ecc_out) { -+ HPRE_TST_PRT("failed to alloc sm2 ecc out!\n"); -+ return -ENOMEM; -+ } -+ -+ e.data = (void *)setup->msg; -+ e.dsize = setup->msg_size; -+ e.bsize = key_insize; -+ d.data = (void *)setup->sign; -+ d.dsize = key_insize; -+ d.bsize = key_insize; -+ k.data = d.data + key_insize; -+ k.dsize = key_insize; -+ k.bsize = key_insize; -+ ecc_in = wcrypto_new_sm2_verf_in(ctx, &e, &d, &k, NULL, 1); -+ if (!ecc_in) { -+ HPRE_TST_PRT("failed to alloc sm2 ecc in!\n"); -+ goto del_ecc_out; -+ } -+ -+ opdata->in = ecc_in; -+ opdata->out = ecc_out; -+ break; -+ case WCRYPTO_SM2_ENCRYPT: // Enc -+ ecc_out = wcrypto_new_sm2_enc_out(ctx, setup->msg_size); -+ if (!ecc_out) { -+ HPRE_TST_PRT("failed to alloc sm2 ecc out!\n"); -+ return -ENOMEM; -+ } -+ -+ e.data = (void *)setup->plaintext; -+ e.dsize = setup->plaintext_size; -+ e.bsize = setup->plaintext_size; -+ k.data = (void *)setup->k; -+ k.dsize = setup->k_size; -+ k.bsize = key_insize; -+ ecc_in = wcrypto_new_sm2_enc_in(ctx, &e, &k); -+ if (!ecc_in) { -+ HPRE_TST_PRT("failed to alloc sm2 ecc in!\n"); -+ goto del_ecc_out; -+ } -+ opdata->in = ecc_in; -+ opdata->out = ecc_out; -+ break; -+ case WCRYPTO_SM2_DECRYPT: // Dec -+ tmp.x.data = (void *)setup->ciphertext; -+ tmp.x.dsize = 32; -+ tmp.y.data = tmp.x.data + 32; -+ tmp.y.dsize = 32; -+ e.data = tmp.y.data + 32; -+ e.dsize = 32; -+ d.data = e.data + 32; -+ d.dsize = setup->ciphertext_size - 32 * 3; -+ ecc_in = wcrypto_new_sm2_dec_in(ctx, &tmp, &d, &e); -+ if (!ecc_in) { -+ HPRE_TST_PRT("failed to alloc sm2 ecc in!\n"); -+ return -ENOMEM; -+ } -+ -+ ecc_out = wcrypto_new_sm2_dec_out(ctx, d.dsize); -+ if (!ecc_out) { -+ HPRE_TST_PRT("failed to alloc sm2 ecc out!\n"); -+ goto del_ecc_in; -+ } -+ -+ opdata->in = ecc_in; -+ opdata->out = ecc_out; -+ break; -+ case WCRYPTO_SM2_KG: // KG -+ ecc_out = wcrypto_new_sm2_kg_out(ctx); -+ if (!ecc_out) { -+ HPRE_TST_PRT("failed to alloc sm2 ecc out!\n"); -+ return -ENOMEM; -+ } -+ -+ opdata->out = ecc_out; -+ break; -+ default: -+ HPRE_TST_PRT("failed to match sm2 optype!\n"); -+ return -ENOMEM; -+ } -+ -+ return 0; -+ -+del_ecc_in: -+ if (ecc_in) -+ (void)wcrypto_del_ecc_in(ctx, ecc_in); -+del_ecc_out: -+ if (ecc_out) -+ (void)wcrypto_del_ecc_out(ctx, ecc_out); -+ -+ return -ENOMEM; -+} -+ -+static int ecc_param_fill(void *ctx, struct wcrypto_ecc_op_data *opdata, -+ struct wcrypto_ecc_key *ecc_key, struct hpre_ecc_setup *setup, -+ thread_data *pdata) -+{ -+ int key_insize = (pdata->keybits + 7) / 8; -+ u32 subtype = pdata->subtype; -+ u32 optype = pdata->optype; -+ struct wcrypto_ecc_out *ecc_out = NULL; -+ struct wcrypto_ecc_in *ecc_in = NULL; -+ struct wcrypto_ecc_point tmp; -+ struct wd_dtb d; -+ int ret = 0; -+ -+ ecc_out = wcrypto_new_ecxdh_out(ctx); -+ if (!ecc_out) { -+ HPRE_TST_PRT("failed to alloc ecxdh out!\n"); -+ return -ENOMEM; -+ } -+ if (optype == WCRYPTO_ECXDH_GEN_KEY) { // gen -+ d.data = (void *)setup->priv_key; -+ d.dsize = setup->priv_key_size; -+ d.bsize = setup->priv_key_size; -+ ret = wcrypto_set_ecc_prikey(ecc_key, &d); -+ if (ret) { -+ HPRE_TST_PRT("failed to set ecc prikey!\n"); -+ goto del_ecc_out; -+ } -+ -+ opdata->out = ecc_out; -+ } else { // compute -+ if (subtype == ECDH_TYPE) -+ tmp.x.data = setup->except_pub_key; -+ else -+ tmp.x.data = setup->except_pub_key + 1; -+ tmp.x.bsize = key_insize; -+ tmp.x.dsize = key_insize; -+ tmp.y.data = tmp.x.data + key_insize; -+ tmp.y.bsize = key_insize; -+ tmp.y.dsize = key_insize; -+ ecc_in = wcrypto_new_ecxdh_in(ctx, &tmp); -+ if (!ecc_in) { -+ HPRE_TST_PRT("failed to get ecxdh sign in!\n"); -+ goto del_ecc_out; -+ } -+ -+ d.data = (void *)setup->priv_key; -+ d.dsize = setup->priv_key_size; -+ d.bsize = setup->priv_key_size; -+ ret = wcrypto_set_ecc_prikey(ecc_key, &d); -+ if (ret) { -+ HPRE_TST_PRT("failed to set ecc prikey!\n"); -+ goto del_ecc_out; -+ } -+ -+ opdata->in = ecc_in; -+ opdata->out = ecc_out; -+ } -+ -+ return 0; -+ -+del_ecc_out: -+ if (ecc_out) -+ (void)wcrypto_del_ecc_out(ctx, ecc_out); -+ -+ return ret; -+} -+ -+static void *ecc_wd_sync_run(void *arg) -+{ -+ typedef int (*wd_do)(void *ctx, struct wcrypto_ecc_op_data *opdata, -+ void *tag); -+ wd_do wcrypto_do_ecc = NULL; -+ thread_data *pdata = (thread_data *)arg; -+ int key_size = pdata->keybits >> 3; -+ u32 subtype = pdata->subtype; -+ struct wcrypto_ecc_ctx_setup ctx_setup; -+ struct wcrypto_ecc_op_data opdata; -+ struct wcrypto_ecc_curve param; -+ struct hpre_ecc_setup setup; -+ struct wcrypto_ecc_key *ecc_key; -+ struct wcrypto_ecc_point pbk; -+ struct wd_queue *queue; -+ struct wd_dtb prk; -+ void *ctx = NULL; -+ void *tag = NULL; -+ void *pool; -+ u32 cid = ECC_CURVE_ID; -+ u32 count = 0; -+ int ret; -+ -+ memset(&ctx_setup, 0, sizeof(ctx_setup)); -+ memset(¶m, 0, sizeof(param)); -+ memset(&opdata, 0, sizeof(opdata)); -+ -+ pool = g_thread_queue.bd_res[pdata->td_id].pool; -+ queue = g_thread_queue.bd_res[pdata->td_id].queue; -+ -+ memset(&setup, 0, sizeof(setup)); -+ if (subtype != X448_TYPE || subtype != X25519_TYPE) { -+ ret = get_ecc_curve(&setup, cid); -+ if (ret) -+ return NULL; -+ } -+ -+ ctx_setup.br.alloc = (void *)wd_alloc_blk; -+ ctx_setup.br.free = (void *)wd_free_blk; -+ ctx_setup.br.iova_map = (void *)wd_blk_iova_map; -+ ctx_setup.br.iova_unmap = (void *)wd_blk_iova_unmap; -+ ctx_setup.br.get_bufsize = (void *)wd_blksize; -+ ctx_setup.br.usr = pool; -+ -+ ctx_setup.key_bits = pdata->keybits; -+ if (subtype == ECDH_TYPE || subtype == ECDSA_TYPE) { -+ if (cid > ECC_CURVE_ID) { -+ ctx_setup.cv.type = WCRYPTO_CV_CFG_PARAM; -+ get_ecc_key_param(¶m, pdata->keybits); -+ ctx_setup.cv.cfg.pparam = ¶m; -+ } else { -+ ctx_setup.cv.type = WCRYPTO_CV_CFG_ID; -+ ctx_setup.cv.cfg.id = setup.curve_id; -+ } -+ } -+ -+ ctx_setup.rand.cb = ecc_get_rand; -+ // set def setting; -+ ctx_setup.hash.cb = ecc_compute_hash; -+ ctx_setup.hash.type = WCRYPTO_HASH_SHA256; -+ -+ ret = get_ecc_param_from_sample(&setup, subtype, pdata->keybits); -+ if (ret) -+ return NULL; -+ -+ ctx = wcrypto_create_ecc_ctx(queue, &ctx_setup); -+ if (!ctx) -+ goto msg_release; -+ -+ prk.data = (void *)setup.priv_key; -+ prk.dsize = setup.priv_key_size; -+ prk.bsize = setup.priv_key_size; -+ pbk.x.data = (char *)setup.pub_key + 1; -+ pbk.x.dsize = key_size; -+ pbk.x.bsize = key_size; -+ pbk.y.data = pbk.x.data + key_size; -+ pbk.y.dsize = key_size; -+ pbk.y.bsize = key_size; -+ -+ ecc_key = wcrypto_get_ecc_key(ctx); -+ ret = wcrypto_set_ecc_prikey(ecc_key, &prk); -+ if (ret) { -+ HPRE_TST_PRT("failed to set ecc prikey!\n"); -+ goto sess_release; -+ } -+ -+ ret = wcrypto_set_ecc_pubkey(ecc_key, &pbk); -+ if (ret) { -+ HPRE_TST_PRT("failed to set ecc pubkey!\n"); -+ goto sess_release; -+ } -+ -+ opdata.op_type = pdata->optype; -+ switch (subtype) { -+ case ECDSA_TYPE: // ECC alg -+ ret = ecdsa_param_fill(ctx, &opdata, ecc_key, &setup, pdata); -+ if (ret) -+ goto src_release; -+ wcrypto_do_ecc = wcrypto_do_ecdsa; -+ break; -+ case SM2_TYPE: // SM2 alg -+ ret = sm2_param_fill(ctx, &opdata, &setup, pdata); -+ if (ret) -+ goto src_release; -+ wcrypto_do_ecc = wcrypto_do_sm2; -+ break; -+ default: // ECDH, X25519, X448 alg -+ ret = ecc_param_fill(ctx, &opdata, ecc_key, &setup, pdata); -+ if (ret) -+ goto src_release; -+ wcrypto_do_ecc = wcrypto_do_ecxdh; -+ break; -+ } -+ -+ do { -+ ret = wcrypto_do_ecc(ctx, &opdata, tag); -+ if (ret || opdata.status) { -+ HPRE_TST_PRT("failed to do ecc task, status: %d\n", opdata.status); -+ goto src_release; -+ } -+ -+ count++; -+ if (get_run_state() == 0) -+ break; -+ } while(true); -+ -+src_release: -+ if (opdata.in) -+ (void)wcrypto_del_ecc_in(ctx, opdata.in); -+ if (opdata.out) -+ (void)wcrypto_del_ecc_out(ctx, opdata.out); -+sess_release: -+ wcrypto_del_ecc_ctx(ctx); -+msg_release: -+ if (subtype == SM2_TYPE) -+ free(setup.msg); -+ add_recv_data(count, key_size); -+ -+ return NULL; -+} -+ -+static void ecc_async_cb(const void *msg, void *tag) -+{ -+ //struct wcrypto_ecc_msg *massage = msg; -+ //struct rsa_async_tag *ptag = tag; -+ //u32 op_type = tag->op_type; -+ //void *ctx = tag->ctx; -+ -+ return; -+} -+ -+static void *ecc_wd_async_run(void *arg) -+{ -+ typedef int (*wd_do)(void *ctx, struct wcrypto_ecc_op_data *opdata, -+ void *tag); -+ wd_do wcrypto_do_ecc = NULL; -+ thread_data *pdata = (thread_data *)arg; -+ int key_size = pdata->keybits >> 3; -+ u32 subtype = pdata->subtype; -+ struct rsa_async_tag *tag = NULL; -+ struct wcrypto_ecc_ctx_setup ctx_setup; -+ struct wcrypto_ecc_op_data opdata; -+ struct wcrypto_ecc_curve param; -+ struct hpre_ecc_setup setup; -+ struct wcrypto_ecc_key *ecc_key; -+ struct wcrypto_ecc_point pbk; -+ struct wd_queue *queue; -+ struct wd_dtb prk; -+ void *ctx = NULL; -+ int try_cnt = 0; -+ void *pool; -+ u32 cid = ECC_CURVE_ID; -+ u32 count = 0; -+ int i, ret; -+ -+ memset(&ctx_setup, 0, sizeof(ctx_setup)); -+ memset(¶m, 0, sizeof(param)); -+ memset(&opdata, 0, sizeof(opdata)); -+ -+ pool = g_thread_queue.bd_res[pdata->td_id].pool; -+ queue = g_thread_queue.bd_res[pdata->td_id].queue; -+ -+ memset(&setup, 0, sizeof(setup)); -+ if (subtype != X448_TYPE || subtype != X25519_TYPE) { -+ ret = get_ecc_curve(&setup, cid); -+ if (ret) -+ return NULL; -+ } -+ -+ ctx_setup.cb = (void *)ecc_async_cb; -+ ctx_setup.br.alloc = (void *)wd_alloc_blk; -+ ctx_setup.br.free = (void *)wd_free_blk; -+ ctx_setup.br.iova_map = (void *)wd_blk_iova_map; -+ ctx_setup.br.iova_unmap = (void *)wd_blk_iova_unmap; -+ ctx_setup.br.get_bufsize = (void *)wd_blksize; -+ ctx_setup.br.usr = pool; -+ -+ ctx_setup.key_bits = pdata->keybits; -+ if (subtype == ECDH_TYPE || subtype == ECDSA_TYPE) { -+ if (cid > ECC_CURVE_ID) { -+ ctx_setup.cv.type = WCRYPTO_CV_CFG_PARAM; -+ get_ecc_key_param(¶m, pdata->keybits); -+ ctx_setup.cv.cfg.pparam = ¶m; -+ } else { -+ ctx_setup.cv.type = WCRYPTO_CV_CFG_ID; -+ ctx_setup.cv.cfg.id = setup.curve_id; -+ } -+ } -+ -+ ctx_setup.rand.cb = ecc_get_rand; -+ // set def setting; -+ ctx_setup.hash.cb = ecc_compute_hash; -+ ctx_setup.hash.type = WCRYPTO_HASH_SHA256; -+ -+ ret = get_ecc_param_from_sample(&setup, subtype, pdata->keybits); -+ if (ret) -+ return NULL; -+ -+ ctx = wcrypto_create_ecc_ctx(queue, &ctx_setup); -+ if (!ctx) -+ goto msg_release; -+ -+ prk.data = (void *)setup.priv_key; -+ prk.dsize = setup.priv_key_size; -+ prk.bsize = setup.priv_key_size; -+ pbk.x.data = (char *)setup.pub_key + 1; -+ pbk.x.dsize = key_size; -+ pbk.x.bsize = key_size; -+ pbk.y.data = pbk.x.data + key_size; -+ pbk.y.dsize = key_size; -+ pbk.y.bsize = key_size; -+ -+ ecc_key = wcrypto_get_ecc_key(ctx); -+ ret = wcrypto_set_ecc_prikey(ecc_key, &prk); -+ if (ret) { -+ HPRE_TST_PRT("failed to set ecc prikey!\n"); -+ goto sess_release; -+ } -+ -+ ret = wcrypto_set_ecc_pubkey(ecc_key, &pbk); -+ if (ret) { -+ HPRE_TST_PRT("failed to set ecc pubkey!\n"); -+ goto sess_release; -+ } -+ -+ opdata.op_type = pdata->optype; -+ switch (subtype) { -+ case ECDSA_TYPE: // ECC alg -+ ret = ecdsa_param_fill(ctx, &opdata, ecc_key, &setup, pdata); -+ if (ret) -+ goto src_release; -+ wcrypto_do_ecc = wcrypto_do_ecdsa; -+ break; -+ case SM2_TYPE: // SM2 alg -+ ret = sm2_param_fill(ctx, &opdata, &setup, pdata); -+ if (ret) -+ goto src_release; -+ wcrypto_do_ecc = wcrypto_do_sm2; -+ break; -+ default: // ECDH, X25519, X448 alg -+ ret = ecc_param_fill(ctx, &opdata, ecc_key, &setup, pdata); -+ if (ret) -+ goto src_release; -+ wcrypto_do_ecc = wcrypto_do_ecxdh; -+ break; -+ } -+ -+ tag = malloc(sizeof(*tag) * MAX_POOL_LENTH); -+ if (!tag) { -+ HPRE_TST_PRT("failed to malloc ecc tag!\n"); -+ goto src_release; -+ } -+ -+ do { -+ if (get_run_state() == 0) -+ break; -+ -+ try_cnt = 0; -+ i = count % MAX_POOL_LENTH; -+ tag[i].ctx = ctx; -+ tag[i].cnt = i; -+ tag[i].optype = opdata.op_type; -+ -+ ret = wcrypto_do_ecc(ctx, &opdata, &tag[i]); -+ if (ret == -WD_EBUSY) { -+ usleep(SEND_USLEEP * try_cnt); -+ try_cnt++; -+ if (try_cnt > MAX_TRY_CNT) { -+ HPRE_TST_PRT("Test ECC send fail %d times!\n", MAX_TRY_CNT); -+ try_cnt = 0; -+ } -+ continue; -+ } else if (ret) { -+ HPRE_TST_PRT("failed to do rsa async task!\n"); -+ goto tag_release; -+ } -+ count++; -+ } while(true); -+ -+tag_release: -+ free(tag); -+src_release: -+ if (opdata.in) -+ (void)wcrypto_del_ecc_in(ctx, opdata.in); -+ if (opdata.out) -+ (void)wcrypto_del_ecc_out(ctx, opdata.out); -+sess_release: -+ while (1) { -+ if (get_recv_time() > 0) // wait Async mode finish recv -+ break; -+ usleep(SEND_USLEEP); -+ } -+ -+ wcrypto_del_ecc_ctx(ctx); -+msg_release: -+ if (subtype == SM2_TYPE) -+ free(setup.msg); -+ add_send_complete(); -+ -+ return NULL; -+} -+ -+static int hpre_wd_sync_threads(struct acc_option *options) -+{ -+ typedef void *(*hpre_sync_run)(void *arg); -+ hpre_sync_run wd_hpre_sync_run = NULL; -+ thread_data threads_args[THREADS_NUM]; -+ thread_data threads_option; -+ pthread_t tdid[THREADS_NUM]; -+ int i, ret; -+ -+ /* alg param parse and set to thread data */ -+ threads_option.subtype = options->subtype; -+ threads_option.td_id = 0; -+ ret = hpre_wd_param_parse(&threads_option, options); -+ if (ret) -+ return ret; -+ -+ switch (options->subtype) { -+ case RSA_TYPE: -+ wd_hpre_sync_run = rsa_wd_sync_run; -+ break; -+ case DH_TYPE: -+ wd_hpre_sync_run = dh_wd_sync_run; -+ break; -+ case ECDH_TYPE: -+ case ECDSA_TYPE: -+ case SM2_TYPE: -+ case X25519_TYPE: -+ case X448_TYPE: -+ wd_hpre_sync_run = ecc_wd_sync_run; -+ break; -+ default: -+ HPRE_TST_PRT("failed to parse alg subtype on uninit!\n"); -+ return -EINVAL; -+ } -+ -+ for (i = 0; i < g_thread_num; i++) { -+ threads_args[i].subtype = threads_option.subtype; -+ threads_args[i].kmode = threads_option.kmode; -+ threads_args[i].keybits = threads_option.keybits; -+ threads_args[i].optype = threads_option.optype; -+ threads_args[i].td_id = i; -+ ret = pthread_create(&tdid[i], NULL, wd_hpre_sync_run, &threads_args[i]); -+ if (ret) { -+ HPRE_TST_PRT("Create sync thread fail!\n"); -+ goto sync_error; -+ } -+ } -+ -+ /* join thread */ -+ for (i = 0; i < g_thread_num; i++) { -+ ret = pthread_join(tdid[i], NULL); -+ if (ret) { -+ HPRE_TST_PRT("Join sync thread fail!\n"); -+ goto sync_error; -+ } -+ } -+ -+sync_error: -+ return ret; -+} -+ -+static int hpre_wd_async_threads(struct acc_option *options) -+{ -+ typedef void *(*hpre_async_run)(void *arg); -+ hpre_async_run wd_hpre_async_run = NULL; -+ thread_data threads_args[THREADS_NUM]; -+ thread_data threads_option; -+ pthread_t tdid[THREADS_NUM]; -+ pthread_t pollid[THREADS_NUM]; -+ int i, ret; -+ -+ /* alg param parse and set to thread data */ -+ threads_option.subtype = options->subtype; -+ threads_option.td_id = 0; -+ ret = hpre_wd_param_parse(&threads_option, options); -+ if (ret) -+ return ret; -+ -+ switch (options->subtype) { -+ case RSA_TYPE: -+ wd_hpre_async_run = rsa_wd_async_run; -+ break; -+ case DH_TYPE: -+ wd_hpre_async_run = dh_wd_async_run; -+ break; -+ case ECDH_TYPE: -+ case ECDSA_TYPE: -+ case SM2_TYPE: -+ case X25519_TYPE: -+ case X448_TYPE: -+ wd_hpre_async_run = ecc_wd_async_run; -+ break; -+ default: -+ HPRE_TST_PRT("failed to parse alg subtype on uninit!\n"); -+ return -EINVAL; -+ } -+ -+ for (i = 0; i < g_thread_num; i++) { -+ threads_args[i].subtype = threads_option.subtype; -+ threads_args[i].td_id = i; -+ /* poll thread */ -+ ret = pthread_create(&pollid[i], NULL, hpre_wd_poll, &threads_args[i]); -+ if (ret) { -+ HPRE_TST_PRT("Create poll thread fail!\n"); -+ goto async_error; -+ } -+ } -+ -+ for (i = 0; i < g_thread_num; i++) { -+ threads_args[i].subtype = threads_option.subtype; -+ threads_args[i].kmode = threads_option.kmode; -+ threads_args[i].keybits = threads_option.keybits; -+ threads_args[i].optype = threads_option.optype; -+ threads_args[i].td_id = i; -+ ret = pthread_create(&tdid[i], NULL, wd_hpre_async_run, &threads_args[i]); -+ if (ret) { -+ HPRE_TST_PRT("Create async thread fail!\n"); -+ goto async_error; -+ } -+ } -+ -+ /* join thread */ -+ for (i = 0; i < g_thread_num; i++) { -+ ret = pthread_join(tdid[i], NULL); -+ if (ret) { -+ HPRE_TST_PRT("Join async thread fail!\n"); -+ goto async_error; -+ } -+ } -+ -+ for (i = 0; i < g_thread_num; i++) { -+ ret = pthread_join(pollid[i], NULL); -+ if (ret) { -+ HPRE_TST_PRT("Join poll thread fail!\n"); -+ goto async_error; -+ } -+ } -+ -+async_error: -+ return ret; -+} -+ -+int hpre_wd_benchmark(struct acc_option *options) -+{ -+ u32 ptime; -+ int ret; -+ -+ g_thread_num = options->threads; -+ -+ if (options->optype >= (WCRYPTO_EC_OP_MAX - WCRYPTO_ECDSA_VERIFY)) { -+ HPRE_TST_PRT("HPRE optype error: %u\n", options->optype); -+ return -EINVAL; -+ } -+ -+ ret = init_hpre_wd_queue(options); -+ if (ret) -+ return ret; -+ -+ get_pid_cpu_time(&ptime); -+ time_start(options->times); -+ if (options->syncmode) -+ ret = hpre_wd_async_threads(options); -+ else -+ ret = hpre_wd_sync_threads(options); -+ cal_perfermance_data(options, ptime); -+ if (ret) -+ return ret; -+ -+ uninit_hpre_wd_queue(); -+ -+ return 0; -+} -diff --git a/uadk_tool/benchmark/hpre_wd_benchmark.h b/uadk_tool/benchmark/hpre_wd_benchmark.h -new file mode 100644 -index 0000000..0cc94a3 ---- /dev/null -+++ b/uadk_tool/benchmark/hpre_wd_benchmark.h -@@ -0,0 +1,6 @@ -+/* SPDX-License-Identifier: Apache-2.0 */ -+#ifndef HPRE_WD_BENCHMARK_H -+#define HPRE_WD_BENCHMARK_H -+ -+extern int hpre_wd_benchmark(struct acc_option *options); -+#endif /* HPRE_WD_BENCHMARK_H */ --- -2.27.0 - diff --git a/0136-uadk_tool-Add-SVA-mode-test-function-to-ZIP-module.patch b/0136-uadk_tool-Add-SVA-mode-test-function-to-ZIP-module.patch deleted file mode 100644 index 6f5c3bb..0000000 --- a/0136-uadk_tool-Add-SVA-mode-test-function-to-ZIP-module.patch +++ /dev/null @@ -1,1296 +0,0 @@ -From 51a4f8fdc43be6ce4243197c63654df5730d474a Mon Sep 17 00:00:00 2001 -From: Longfang Liu -Date: Mon, 18 Jul 2022 17:16:34 +0800 -Subject: [PATCH 150/183] uadk_tool: Add SVA mode test function to ZIP module - -Add performance test function of SVA mode for Zlib, -Gzip algorithm of ZIP module. - -Signed-off-by: Longfang Liu ---- - uadk_tool/benchmark/include/fse.h | 51 + - uadk_tool/benchmark/zip_uadk_benchmark.c | 1200 ++++++++++++++++++++++ - uadk_tool/benchmark/zip_uadk_benchmark.h | 6 + - 3 files changed, 1257 insertions(+) - create mode 100644 uadk_tool/benchmark/include/fse.h - create mode 100644 uadk_tool/benchmark/zip_uadk_benchmark.c - create mode 100644 uadk_tool/benchmark/zip_uadk_benchmark.h - -diff --git a/uadk_tool/benchmark/include/fse.h b/uadk_tool/benchmark/include/fse.h -new file mode 100644 -index 0000000..73c3eda ---- /dev/null -+++ b/uadk_tool/benchmark/include/fse.h -@@ -0,0 +1,51 @@ -+/* SPDX-License-Identifier: Apache-2.0 */ -+ -+#ifndef ZSTD_LZ77_FSE_H -+#define ZSTD_LZ77_FSE_H -+ -+#include -+#include -+ -+typedef struct ZSTD_CCtx_s ZSTD_CCtx; -+ -+typedef struct seqDef_s { -+ unsigned int offset; -+ unsigned short litLength; -+ unsigned short matchLength; -+} seqDef; -+ -+typedef struct COMP_4TUPLE_TAG_S { -+ char *litStart; /* literal start address */ -+ seqDef *sequencesStart; /* sequences start address */ -+ unsigned int litlen; /* literal effective data length */ -+ unsigned int seqnum; /* sequences array's elements numbers */ -+ unsigned int longLengthID; /* litlen overflow flag */ -+ unsigned int longLengthPos; /* litlen overflow index */ -+ char *additional_p; /* start address of additional data */ -+} COMP_TUPLE_TAG; -+ -+typedef struct ZSTD_inBuffer_s { -+ const void* src; /* < start of input buffer */ -+ size_t size; /* < size of input buffer */ -+ size_t pos; /* < position where reading stopped. Will be updated. Necessarily 0 <= pos <= size */ -+} ZSTD_inBuffer; -+ -+typedef struct ZSTD_outBuffer_s { -+ void* dst; /* < start of output buffer */ -+ size_t size; /* < size of output buffer */ -+ size_t pos; /* < position where writing stopped. Will be updated. Necessarily 0 <= pos <= size */ -+} ZSTD_outBuffer; -+ -+typedef enum { -+ ZSTD_e_continue = 0, /* collect more data, encoder decides when to output compressed result, for optimal compression ratio */ -+ ZSTD_e_flush = 1, /* flush any data provided so far */ -+ ZSTD_e_end = 2 /* flush any remaining data _and_ close current frame. */ -+} ZSTD_EndDirective; -+ -+/* the complete implementation code in libfse */ -+#ifdef ZLIB_FSE -+ZSTD_CCtx* zstd_soft_fse_init(unsigned int level); -+int zstd_soft_fse(void *Ftuple, ZSTD_inBuffer *input, ZSTD_outBuffer *output, ZSTD_CCtx * cctx, ZSTD_EndDirective cmode); -+#endif -+ -+#endif -diff --git a/uadk_tool/benchmark/zip_uadk_benchmark.c b/uadk_tool/benchmark/zip_uadk_benchmark.c -new file mode 100644 -index 0000000..ba18e6d ---- /dev/null -+++ b/uadk_tool/benchmark/zip_uadk_benchmark.c -@@ -0,0 +1,1200 @@ -+/* SPDX-License-Identifier: Apache-2.0 */ -+ -+#include -+#include "uadk_benchmark.h" -+ -+#include "zip_uadk_benchmark.h" -+#include "include/wd_comp.h" -+#include "include/wd_sched.h" -+#include "include/fse.h" -+ -+#define ZIP_TST_PRT printf -+#define PATH_SIZE 64 -+#define ZIP_FILE "./zip" -+#define COMP_LEN_RATE 2 -+#define DECOMP_LEN_RATE 2 -+ -+struct uadk_bd { -+ u8 *src; -+ u8 *dst; -+ u32 src_len; -+ u32 dst_len; -+}; -+ -+struct bd_pool { -+ struct uadk_bd *bds; -+}; -+ -+struct thread_pool { -+ struct bd_pool *pool; -+} g_zip_pool; -+ -+enum ZIP_OP_MODE { -+ BLOCK_MODE, -+ STREAM_MODE -+}; -+ -+struct zip_async_tag { -+ handle_t sess; -+ u32 td_id; -+ u32 bd_idx; -+ u32 cm_len; -+ ZSTD_CCtx *cctx; -+}; -+ -+typedef struct uadk_thread_res { -+ u32 alg; -+ u32 mode; // block/stream -+ u32 optype; -+ u32 td_id; -+} thread_data; -+ -+struct zip_file_head { -+ u32 file_size; -+ u32 block_num; -+ u32 blk_sz[MAX_POOL_LENTH]; -+}; -+ -+static struct wd_ctx_config g_ctx_cfg; -+static struct wd_sched *g_sched; -+static unsigned int g_thread_num; -+static unsigned int g_ctxnum; -+static unsigned int g_pktlen; -+static unsigned int g_prefetch; -+ -+#ifndef ZLIB_FSE -+static ZSTD_CCtx* zstd_soft_fse_init(unsigned int level) -+{ -+ return NULL; -+} -+ -+static int zstd_soft_fse(void *Ftuple, ZSTD_inBuffer *input, ZSTD_outBuffer *output, ZSTD_CCtx * cctx, ZSTD_EndDirective cmode) -+{ -+ return input->size; -+} -+#endif -+ -+static int save_file_data(const char *alg, u32 pkg_len, u32 optype) -+{ -+ struct zip_file_head *fhead = NULL; -+ char file_path[PATH_SIZE]; -+ u32 total_file_size = 0; -+ double comp_rate = 0.0; -+ u32 full_size; -+ ssize_t size; -+ int j, fd; -+ int ret = 0; -+ -+ optype = optype % WD_DIR_MAX; -+ if (optype != WD_DIR_COMPRESS) //compress -+ return 0; -+ -+ ret = snprintf(file_path, PATH_SIZE, "%s_%u.%s", ZIP_FILE, pkg_len, alg); -+ if (ret < 0) -+ return -EINVAL; -+ -+ ret = access(file_path, F_OK); -+ if (!ret) { -+ ZIP_TST_PRT("compress data file: %s has exist!\n", file_path); -+ return 0; -+ } -+ -+ fd = open(file_path, O_WRONLY|O_CREAT, 0777); -+ if (fd < 0) { -+ ZIP_TST_PRT("compress data file open %s fail (%d)!\n", file_path, -errno); -+ return -ENODEV; -+ } -+ -+ fhead = malloc(sizeof(*fhead)); -+ if (!fhead) { -+ ZIP_TST_PRT("failed to alloc file head memory\n"); -+ ret = -ENOMEM; -+ goto fd_error; -+ } -+ -+ // init file head informations -+ for (j = 0; j < MAX_POOL_LENTH; j++) { -+ fhead->blk_sz[j] = g_zip_pool.pool[0].bds[j].dst_len; -+ total_file_size += fhead->blk_sz[j]; -+ } -+ fhead->block_num = MAX_POOL_LENTH; -+ fhead->file_size = total_file_size; -+ size = write(fd, fhead, sizeof(*fhead)); -+ if (size < 0) { -+ ZIP_TST_PRT("compress write file head failed: %lu!\n", size); -+ ret = -EINVAL; -+ goto write_error; -+ } -+ -+ // write data for one buffer one buffer to file line. -+ for (j = 0; j < MAX_POOL_LENTH; j++) { -+ size = write(fd, g_zip_pool.pool[0].bds[j].dst, -+ fhead->blk_sz[j]); -+ if (size < 0) { -+ ZIP_TST_PRT("compress write data error size: %lu!\n", size); -+ ret = -ENODEV; -+ break; -+ } -+ } -+ -+write_error: -+ free(fhead); -+fd_error: -+ close(fd); -+ -+ full_size = g_pktlen * MAX_POOL_LENTH; -+ comp_rate = (double) total_file_size / full_size; -+ ZIP_TST_PRT("compress data rate: %.1f%%!\n", comp_rate * 100); -+ -+ return ret; -+} -+ -+static int load_file_data(const char *alg, u32 pkg_len, u32 optype) -+{ -+ struct zip_file_head *fhead = NULL; -+ char file_path[PATH_SIZE]; -+ ssize_t size = 0xff; -+ int i, j, fd; -+ int ret; -+ -+ optype = optype % WD_DIR_MAX; -+ if (optype != WD_DIR_DECOMPRESS) //decompress -+ return 0; -+ -+ ret = snprintf(file_path, PATH_SIZE, "%s_%u.%s", ZIP_FILE, pkg_len, alg); -+ if (ret < 0) -+ return -EINVAL; -+ -+ ret = access(file_path, F_OK); -+ if (ret) { -+ ZIP_TST_PRT("Decompress data file: %s not exist!\n", file_path); -+ return -EINVAL; -+ } -+ -+ // read data from file -+ fd = open(file_path, O_RDONLY, 0); -+ if (fd < 0) { -+ ZIP_TST_PRT("Decompress data file open %s fail (%d)!\n", file_path, -errno); -+ return -ENODEV; -+ } -+ -+ fhead = malloc(sizeof(*fhead)); -+ if (!fhead) { -+ ZIP_TST_PRT("failed to alloc file head memory\n"); -+ ret = -ENOMEM; -+ goto fd_err; -+ } -+ size = read(fd, fhead, sizeof(*fhead)); -+ if (size < 0 || fhead->block_num != MAX_POOL_LENTH) { -+ ZIP_TST_PRT("failed to read file head\n"); -+ ret = -EINVAL; -+ goto read_err; -+ } -+ -+ // read data for one buffer one buffer from file line -+ for (j = 0; j < MAX_POOL_LENTH; j++) { -+ memset(g_zip_pool.pool[0].bds[j].src, 0x0, -+ g_zip_pool.pool[0].bds[j].src_len); -+ if (size != 0) { // zero size buffer no need to read; -+ size = read(fd, g_zip_pool.pool[0].bds[j].src, -+ fhead->blk_sz[j]); -+ if (size < 0) { -+ ZIP_TST_PRT("Decompress read data error size: %lu!\n", size); -+ ret = -EINVAL; -+ goto read_err; -+ } else if (size == 0) { -+ ZIP_TST_PRT("Read file to the end!"); -+ } -+ } -+ g_zip_pool.pool[0].bds[j].src_len = size; -+ } -+ -+ for (i = 1; i < g_thread_num; i++) { -+ for (j = 0; j < MAX_POOL_LENTH; j++) { -+ if (g_zip_pool.pool[0].bds[j].src_len) -+ memcpy(g_zip_pool.pool[i].bds[j].src, -+ g_zip_pool.pool[0].bds[j].src, -+ g_zip_pool.pool[0].bds[j].src_len); -+ g_zip_pool.pool[i].bds[j].src_len = -+ g_zip_pool.pool[0].bds[j].src_len; -+ } -+ } -+ -+read_err: -+ free(fhead); -+fd_err: -+ close(fd); -+ -+ return ret; -+} -+ -+static int zip_uadk_param_parse(thread_data *tddata, struct acc_option *options) -+{ -+ u32 algtype = options->algtype; -+ u32 optype = options->optype; -+ u8 mode = BLOCK_MODE; -+ u8 alg; -+ -+ if (optype >= WD_DIR_MAX << 1) { -+ ZIP_TST_PRT("Fail to get zip optype!\n"); -+ return -EINVAL; -+ } else if (optype >= WD_DIR_MAX) { -+ mode = STREAM_MODE; -+ } -+ -+ optype = optype % WD_DIR_MAX; -+ -+ switch(algtype) { -+ case ZLIB: -+ alg = WD_ZLIB; -+ break; -+ case GZIP: -+ alg = WD_GZIP; -+ break; -+ case DEFLATE: -+ alg = WD_DEFLATE; -+ break; -+ case LZ77_ZSTD: -+ alg = WD_LZ77_ZSTD; -+ if (optype == WD_DIR_DECOMPRESS) -+ ZIP_TST_PRT("Zip LZ77_ZSTD just support compress!\n"); -+ optype = WD_DIR_COMPRESS; -+ break; -+ default: -+ ZIP_TST_PRT("Fail to set zip alg\n"); -+ return -EINVAL; -+ } -+ -+ tddata->alg = alg; -+ tddata->mode = mode; -+ tddata->optype = optype; -+ -+ return 0; -+} -+ -+static int init_ctx_config(char *alg, int mode, int optype) -+{ -+ struct uacce_dev_list *list; -+ struct sched_params param; -+ int i, max_node; -+ int ret = 0; -+ -+ max_node = numa_max_node() + 1; -+ if (max_node <= 0) -+ return -EINVAL; -+ -+ list = wd_get_accel_list(alg); -+ if (!list) { -+ ZIP_TST_PRT("Fail to get %s device\n", alg); -+ return -ENODEV; -+ } -+ memset(&g_ctx_cfg, 0, sizeof(struct wd_ctx_config)); -+ g_ctx_cfg.ctx_num = g_ctxnum; -+ g_ctx_cfg.ctxs = calloc(g_ctxnum, sizeof(struct wd_ctx)); -+ if (!g_ctx_cfg.ctxs) -+ return -ENOMEM; -+ -+ g_sched = wd_sched_rr_alloc(SCHED_POLICY_RR, 2, max_node, wd_comp_poll_ctx); -+ if (!g_sched) { -+ ZIP_TST_PRT("Fail to alloc sched!\n"); -+ goto out; -+ } -+ -+ /* If there is no numa, we defualt config to zero */ -+ if (list->dev->numa_id < 0) -+ list->dev->numa_id = 0; -+ -+ for (i = 0; i < g_ctxnum; i++) { -+ g_ctx_cfg.ctxs[i].ctx = wd_request_ctx(list->dev); -+ g_ctx_cfg.ctxs[i].op_type = 0; // default op_type -+ g_ctx_cfg.ctxs[i].ctx_mode = (__u8)mode; -+ } -+ g_sched->name = SCHED_SINGLE; -+ -+ /* -+ * All contexts for 2 modes & 2 types. -+ * The test only uses one kind of contexts at the same time. -+ */ -+ optype = optype % WD_DIR_MAX; -+ param.numa_id = list->dev->numa_id; -+ param.type = optype; -+ param.mode = mode; -+ param.begin = 0; -+ param.end = g_ctxnum - 1; -+ ret = wd_sched_rr_instance(g_sched, ¶m); -+ if (ret) { -+ ZIP_TST_PRT("Fail to fill sched data!\n"); -+ goto out; -+ } -+ -+ /* init */ -+ ret = wd_comp_init(&g_ctx_cfg, g_sched); -+ if (ret) { -+ ZIP_TST_PRT("Fail to cipher ctx!\n"); -+ goto out; -+ } -+ -+ wd_free_list_accels(list); -+ -+ return 0; -+out: -+ free(g_ctx_cfg.ctxs); -+ wd_sched_rr_release(g_sched); -+ -+ return ret; -+} -+ -+static void uninit_ctx_config(void) -+{ -+ int i; -+ -+ /* uninit */ -+ wd_comp_uninit(); -+ -+ for (i = 0; i < g_ctx_cfg.ctx_num; i++) -+ wd_release_ctx(g_ctx_cfg.ctxs[i].ctx); -+ free(g_ctx_cfg.ctxs); -+ wd_sched_rr_release(g_sched); -+} -+ -+static int init_uadk_bd_pool(u32 optype) -+{ -+ u32 outsize; -+ u32 insize; -+ int i, j; -+ -+ // make the block not align to 4K -+ optype = optype % WD_DIR_MAX; -+ if (optype == WD_DIR_COMPRESS) {//compress -+ insize = g_pktlen; -+ outsize = g_pktlen * COMP_LEN_RATE; -+ } else { // decompress -+ insize = g_pktlen; -+ outsize = g_pktlen * DECOMP_LEN_RATE; -+ } -+ -+ g_zip_pool.pool = malloc(g_thread_num * sizeof(struct bd_pool)); -+ if (!g_zip_pool.pool) { -+ ZIP_TST_PRT("init uadk pool alloc thread failed!\n"); -+ return -ENOMEM; -+ } else { -+ for (i = 0; i < g_thread_num; i++) { -+ g_zip_pool.pool[i].bds = malloc(MAX_POOL_LENTH * -+ sizeof(struct uadk_bd)); -+ if (!g_zip_pool.pool[i].bds) { -+ ZIP_TST_PRT("init uadk bds alloc failed!\n"); -+ goto malloc_error1; -+ } -+ for (j = 0; j < MAX_POOL_LENTH; j++) { -+ g_zip_pool.pool[i].bds[j].src = malloc(insize); -+ if (!g_zip_pool.pool[i].bds[j].src) -+ goto malloc_error2; -+ g_zip_pool.pool[i].bds[j].src_len = insize; -+ -+ g_zip_pool.pool[i].bds[j].dst = malloc(outsize); -+ if (!g_zip_pool.pool[i].bds[j].dst) -+ goto malloc_error3; -+ g_zip_pool.pool[i].bds[j].dst_len = outsize; -+ -+ get_rand_data(g_zip_pool.pool[i].bds[j].src, insize); -+ if (g_prefetch) -+ get_rand_data(g_zip_pool.pool[i].bds[j].dst, outsize); -+ } -+ } -+ } -+ -+ return 0; -+ -+malloc_error3: -+ free(g_zip_pool.pool[i].bds[j].src); -+malloc_error2: -+ for (j--; j >= 0; j--) { -+ free(g_zip_pool.pool[i].bds[j].src); -+ free(g_zip_pool.pool[i].bds[j].dst); -+ } -+malloc_error1: -+ for (i--; i >= 0; i--) { -+ for (j = 0; j < MAX_POOL_LENTH; j++) { -+ free(g_zip_pool.pool[i].bds[j].src); -+ free(g_zip_pool.pool[i].bds[j].dst); -+ } -+ free(g_zip_pool.pool[i].bds); -+ g_zip_pool.pool[i].bds = NULL; -+ } -+ free(g_zip_pool.pool); -+ g_zip_pool.pool = NULL; -+ -+ ZIP_TST_PRT("init uadk bd pool alloc failed!\n"); -+ return -ENOMEM; -+} -+ -+static void free_uadk_bd_pool(void) -+{ -+ int i, j; -+ -+ for (i = 0; i < g_thread_num; i++) { -+ if (g_zip_pool.pool[i].bds) { -+ for (j = 0; j < MAX_POOL_LENTH; j++) { -+ free(g_zip_pool.pool[i].bds[j].src); -+ free(g_zip_pool.pool[i].bds[j].dst); -+ } -+ } -+ free(g_zip_pool.pool[i].bds); -+ g_zip_pool.pool[i].bds = NULL; -+ } -+ free(g_zip_pool.pool); -+ g_zip_pool.pool = NULL; -+} -+ -+/*-------------------------------uadk benchmark main code-------------------------------------*/ -+static void *zip_lz77_async_cb(struct wd_comp_req *req, void *data) -+{ -+ struct zip_async_tag *tag = req->cb_param; -+ struct bd_pool *uadk_pool; -+ int td_id = tag->td_id; -+ int idx = tag->bd_idx; -+ ZSTD_inBuffer zstd_input; -+ ZSTD_outBuffer zstd_output; -+ ZSTD_CCtx *cctx = tag->cctx; -+ size_t fse_size; -+ -+ uadk_pool = &g_zip_pool.pool[td_id]; -+ uadk_pool->bds[idx].dst_len = req->dst_len; -+ -+ zstd_input.src = req->src; -+ zstd_input.size = req->src_len; -+ zstd_input.pos = 0; -+ zstd_output.dst = uadk_pool->bds[idx].dst; -+ zstd_output.size = tag->cm_len; -+ zstd_output.pos = 0; -+ fse_size = zstd_soft_fse(req->priv, &zstd_input, &zstd_output, cctx, ZSTD_e_end); -+ -+ uadk_pool->bds[idx].dst_len = fse_size; -+ -+ return NULL; -+} -+ -+static void *zip_async_cb(struct wd_comp_req *req, void *data) -+{ -+ struct zip_async_tag *tag = req->cb_param; -+ struct bd_pool *uadk_pool; -+ int td_id = tag->td_id; -+ int idx = tag->bd_idx; -+ -+ uadk_pool = &g_zip_pool.pool[td_id]; -+ uadk_pool->bds[idx].dst_len = req->dst_len; -+ -+ return NULL; -+} -+ -+static void *zip_uadk_poll(void *data) -+{ -+ thread_data *pdata = (thread_data *)data; -+ u32 expt = ACC_QUEUE_SIZE * g_thread_num; -+ u32 id = pdata->td_id; -+ u32 last_time = 2; // poll need one more recv time -+ u32 count = 0; -+ u32 recv = 0; -+ int ret; -+ -+ if (id > g_ctxnum) -+ return NULL; -+ -+ while (last_time) { -+ ret = wd_comp_poll_ctx(id, expt, &recv); -+ count += recv; -+ recv = 0; -+ if (unlikely(ret != -WD_EAGAIN && ret < 0)) { -+ ZIP_TST_PRT("poll ret: %u!\n", ret); -+ goto recv_error; -+ } -+ -+ if (get_run_state() == 0) -+ last_time--; -+ } -+ -+recv_error: -+ add_recv_data(count, g_pktlen); -+ -+ return NULL; -+} -+ -+static void *zip_uadk_blk_lz77_sync_run(void *arg) -+{ -+ thread_data *pdata = (thread_data *)arg; -+ struct wd_comp_sess_setup comp_setup = {0}; -+ ZSTD_CCtx *cctx = zstd_soft_fse_init(15); -+ ZSTD_inBuffer zstd_input = {0}; -+ ZSTD_outBuffer zstd_output = {0}; -+ COMP_TUPLE_TAG *ftuple = NULL; -+ struct bd_pool *uadk_pool; -+ struct wd_comp_req creq; -+ char *hw_buff_out = NULL; -+ size_t fse_size; -+ handle_t h_sess; -+ u32 first_len = 0; -+ u32 out_len = 0; -+ u32 count = 0; -+ int ret, i = 0; -+ -+ if (pdata->td_id > g_thread_num) -+ return NULL; -+ -+ uadk_pool = &g_zip_pool.pool[pdata->td_id]; -+ memset(&comp_setup, 0, sizeof(comp_setup)); -+ memset(&creq, 0, sizeof(creq)); -+ -+ comp_setup.alg_type = pdata->alg; -+ comp_setup.op_type = pdata->optype; -+ comp_setup.comp_lv = WD_COMP_L8; -+ comp_setup.win_sz = WD_COMP_WS_8K; -+ h_sess = wd_comp_alloc_sess(&comp_setup); -+ if (!h_sess) -+ return NULL; -+ -+ creq.op_type = pdata->optype; -+ creq.src_len = g_pktlen; -+ out_len = uadk_pool->bds[0].dst_len; -+ -+ creq.cb = NULL; -+ creq.data_fmt = 0; -+ creq.status = 0; -+ -+ ftuple = malloc(sizeof(COMP_TUPLE_TAG) * MAX_POOL_LENTH); -+ if (!ftuple) -+ goto fse_err; -+ -+ hw_buff_out = malloc(out_len * MAX_POOL_LENTH); -+ if (!hw_buff_out) -+ goto hw_buff_err; -+ memset(hw_buff_out, 0x0, out_len * MAX_POOL_LENTH); -+ -+ while(1) { -+ i = count % MAX_POOL_LENTH; -+ creq.src = uadk_pool->bds[i].src; -+ creq.dst = &hw_buff_out[i]; //temp out -+ creq.src_len = uadk_pool->bds[i].src_len; -+ creq.dst_len = out_len; -+ creq.priv = &ftuple[i]; -+ -+ ret = wd_do_comp_sync(h_sess, &creq); -+ if (ret || creq.status) -+ break; -+ -+ count++; -+ zstd_input.src = creq.src; -+ zstd_input.size = creq.src_len; -+ zstd_input.pos = 0; -+ zstd_output.dst = uadk_pool->bds[i].dst; -+ zstd_output.size = out_len; -+ zstd_output.pos = 0; -+ fse_size = zstd_soft_fse(creq.priv, &zstd_input, &zstd_output, cctx, ZSTD_e_end); -+ -+ uadk_pool->bds[i].dst_len = fse_size; -+ if (unlikely(i == 0)) -+ first_len = fse_size; -+ if (get_run_state() == 0) -+ break; -+ } -+ -+hw_buff_err: -+ free(hw_buff_out); -+fse_err: -+ free(ftuple); -+ wd_comp_free_sess(h_sess); -+ -+ // ZIP_TST_PRT("valid pool len: %u, send count BD: %u, output len: %u!\n", -+ // MAX_POOL_LENTH, count, creq.dst_len); -+ if (pdata->optype == WD_DIR_COMPRESS) -+ add_recv_data(count, creq.src_len); -+ else -+ add_recv_data(count, first_len); -+ -+ return NULL; -+} -+ -+static void *zip_uadk_stm_lz77_sync_run(void *arg) -+{ -+ thread_data *pdata = (thread_data *)arg; -+ struct wd_comp_sess_setup comp_setup = {0}; -+ ZSTD_CCtx *cctx = zstd_soft_fse_init(15); -+ ZSTD_inBuffer zstd_input = {0}; -+ ZSTD_outBuffer zstd_output = {0}; -+ COMP_TUPLE_TAG *ftuple = NULL; -+ struct bd_pool *uadk_pool; -+ struct wd_comp_req creq; -+ char *hw_buff_out = NULL; -+ size_t fse_size; -+ handle_t h_sess; -+ u32 first_len = 0; -+ u32 out_len = 0; -+ u32 count = 0; -+ int ret, i = 0; -+ -+ if (pdata->td_id > g_thread_num) -+ return NULL; -+ -+ uadk_pool = &g_zip_pool.pool[pdata->td_id]; -+ memset(&comp_setup, 0, sizeof(comp_setup)); -+ memset(&creq, 0, sizeof(creq)); -+ -+ comp_setup.alg_type = pdata->alg; -+ comp_setup.op_type = pdata->optype; -+ comp_setup.comp_lv = WD_COMP_L8; -+ comp_setup.win_sz = WD_COMP_WS_8K; -+ h_sess = wd_comp_alloc_sess(&comp_setup); -+ if (!h_sess) -+ return NULL; -+ -+ creq.op_type = pdata->optype; -+ creq.src_len = g_pktlen; -+ out_len = uadk_pool->bds[0].dst_len; -+ -+ creq.cb = NULL; -+ creq.data_fmt = 0; -+ creq.status = 0; -+ -+ ftuple = malloc(sizeof(COMP_TUPLE_TAG) * MAX_POOL_LENTH); -+ if (!ftuple) -+ goto fse_err; -+ -+ hw_buff_out = malloc(out_len * MAX_POOL_LENTH); -+ if (!hw_buff_out) -+ goto hw_buff_err; -+ memset(hw_buff_out, 0x0, out_len * MAX_POOL_LENTH); -+ -+ while(1) { -+ i = count % MAX_POOL_LENTH; -+ creq.src = uadk_pool->bds[i].src; -+ creq.dst = &hw_buff_out[i]; //temp out -+ creq.src_len = uadk_pool->bds[i].src_len; -+ creq.dst_len = out_len; -+ creq.priv = &ftuple[i]; -+ -+ ret = wd_do_comp_strm(h_sess, &creq); -+ if (ret < 0 || creq.status == WD_IN_EPARA) { -+ ZIP_TST_PRT("wd comp, invalid or incomplete data! " -+ "ret(%d), req.status(%u)\n", ret, creq.status); -+ break; -+ } -+ -+ count++; -+ zstd_input.src = creq.src; -+ zstd_input.size = creq.src_len; -+ zstd_input.pos = 0; -+ zstd_output.dst = uadk_pool->bds[i].dst; -+ zstd_output.size = out_len; -+ zstd_output.pos = 0; -+ fse_size = zstd_soft_fse(creq.priv, &zstd_input, &zstd_output, cctx, ZSTD_e_end); -+ -+ uadk_pool->bds[i].dst_len = fse_size; -+ if (unlikely(i == 0)) -+ first_len = fse_size; -+ if (get_run_state() == 0) -+ break; -+ } -+ -+hw_buff_err: -+ free(hw_buff_out); -+fse_err: -+ free(ftuple); -+ wd_comp_free_sess(h_sess); -+ -+ // ZIP_TST_PRT("valid pool len: %u, send count BD: %u, output len: %u!\n", -+ // MAX_POOL_LENTH, count, creq.dst_len); -+ if (pdata->optype == WD_DIR_COMPRESS) -+ add_recv_data(count, creq.src_len); -+ else -+ add_recv_data(count, first_len); -+ -+ return NULL; -+} -+ -+static void *zip_uadk_blk_lz77_async_run(void *arg) -+{ -+ thread_data *pdata = (thread_data *)arg; -+ struct wd_comp_sess_setup comp_setup = {0}; -+ ZSTD_CCtx *cctx = zstd_soft_fse_init(15); -+ COMP_TUPLE_TAG *ftuple = NULL; -+ struct bd_pool *uadk_pool; -+ struct wd_comp_req creq; -+ struct zip_async_tag *tag; -+ char *hw_buff_out = NULL; -+ handle_t h_sess; -+ u32 out_len = 0; -+ u32 count = 0; -+ u32 try_cnt = 0; -+ int ret, i = 0; -+ -+ if (pdata->td_id > g_thread_num) -+ return NULL; -+ -+ uadk_pool = &g_zip_pool.pool[pdata->td_id]; -+ memset(&comp_setup, 0, sizeof(comp_setup)); -+ memset(&creq, 0, sizeof(creq)); -+ -+ comp_setup.alg_type = pdata->alg; -+ comp_setup.op_type = pdata->optype; -+ comp_setup.comp_lv = WD_COMP_L8; -+ comp_setup.win_sz = WD_COMP_WS_8K; -+ h_sess = wd_comp_alloc_sess(&comp_setup); -+ if (!h_sess) -+ return NULL; -+ -+ creq.op_type = pdata->optype; -+ creq.src_len = g_pktlen; -+ out_len = uadk_pool->bds[0].dst_len; -+ -+ creq.cb = zip_lz77_async_cb; -+ creq.data_fmt = 0; -+ creq.status = 0; -+ -+ ftuple = malloc(sizeof(COMP_TUPLE_TAG) * MAX_POOL_LENTH); -+ if (!ftuple) -+ goto fse_err; -+ -+ hw_buff_out = malloc(out_len * MAX_POOL_LENTH); -+ if (!hw_buff_out) -+ goto hw_buff_err; -+ memset(hw_buff_out, 0x0, out_len * MAX_POOL_LENTH); -+ -+ tag = malloc(sizeof(*tag) * MAX_POOL_LENTH); -+ if (!tag) { -+ ZIP_TST_PRT("failed to malloc zip tag!\n"); -+ goto tag_err; -+ } -+ -+ while(1) { -+ if (get_run_state() == 0) -+ break; -+ -+ try_cnt = 0; -+ i = count % MAX_POOL_LENTH; -+ creq.src = uadk_pool->bds[i].src; -+ creq.dst = &hw_buff_out[i]; //temp out -+ creq.src_len = uadk_pool->bds[i].src_len; -+ creq.dst_len = out_len; -+ creq.priv = &ftuple[i]; -+ -+ tag[i].td_id = pdata->td_id; -+ tag[i].bd_idx = i; -+ tag[i].cm_len = out_len; -+ tag[i].cctx = cctx; -+ creq.cb_param = &tag[i]; -+ -+ ret = wd_do_comp_async(h_sess, &creq); -+ if (ret == -WD_EBUSY) { -+ usleep(SEND_USLEEP * try_cnt); -+ try_cnt++; -+ if (try_cnt > MAX_TRY_CNT) { -+ ZIP_TST_PRT("Test LZ77 compress send fail %d times!\n", MAX_TRY_CNT); -+ try_cnt = 0; -+ } -+ continue; -+ } else if (ret || creq.status) { -+ break; -+ } -+ count++; -+ } -+ -+ while (1) { -+ if (get_recv_time() > 0) // wait Async mode finish recv -+ break; -+ usleep(SEND_USLEEP); -+ } -+ -+tag_err: -+ free(tag); -+hw_buff_err: -+ free(hw_buff_out); -+fse_err: -+ free(ftuple); -+ wd_comp_free_sess(h_sess); -+ -+ // ZIP_TST_PRT("LZ77 valid pool len: %u, send count BD: %u, output len: %u!\n", -+ // MAX_POOL_LENTH, count, creq.dst_len); -+ -+ add_send_complete(); -+ -+ return NULL; -+} -+ -+static void *zip_uadk_blk_sync_run(void *arg) -+{ -+ thread_data *pdata = (thread_data *)arg; -+ struct wd_comp_sess_setup comp_setup = {0}; -+ struct bd_pool *uadk_pool; -+ struct wd_comp_req creq; -+ handle_t h_sess; -+ u32 out_len = 0; -+ u32 count = 0; -+ int ret, i = 0; -+ -+ if (pdata->td_id > g_thread_num) -+ return NULL; -+ -+ uadk_pool = &g_zip_pool.pool[pdata->td_id]; -+ memset(&comp_setup, 0, sizeof(comp_setup)); -+ memset(&creq, 0, sizeof(creq)); -+ -+ comp_setup.alg_type = pdata->alg; -+ comp_setup.op_type = pdata->optype; -+ comp_setup.comp_lv = WD_COMP_L8; -+ comp_setup.win_sz = WD_COMP_WS_8K; -+ h_sess = wd_comp_alloc_sess(&comp_setup); -+ if (!h_sess) -+ return NULL; -+ -+ creq.op_type = pdata->optype; -+ creq.src_len = g_pktlen; -+ out_len = uadk_pool->bds[0].dst_len; -+ -+ creq.cb = NULL; -+ creq.data_fmt = 0; -+ creq.priv = 0; -+ creq.status = 0; -+ -+ while(1) { -+ i = count % MAX_POOL_LENTH; -+ creq.src = uadk_pool->bds[i].src; -+ creq.dst = uadk_pool->bds[i].dst; -+ creq.src_len = uadk_pool->bds[i].src_len; -+ creq.dst_len = out_len; -+ -+ ret = wd_do_comp_sync(h_sess, &creq); -+ if (ret || creq.status) -+ break; -+ -+ count++; -+ uadk_pool->bds[i].dst_len = creq.dst_len; -+ if (get_run_state() == 0) -+ break; -+ } -+ wd_comp_free_sess(h_sess); -+ -+ //ZIP_TST_PRT("valid pool len: %u, send count BD: %u, input len: %u, output len: %u!\n", -+ // MAX_POOL_LENTH, count, creq.src_len, g_pktlen); -+ add_recv_data(count, g_pktlen); -+ -+ return NULL; -+} -+ -+static void *zip_uadk_stm_sync_run(void *arg) -+{ -+ thread_data *pdata = (thread_data *)arg; -+ struct wd_comp_sess_setup comp_setup = {0}; -+ struct bd_pool *uadk_pool; -+ struct wd_comp_req creq; -+ handle_t h_sess; -+ u32 out_len = 0; -+ u32 count = 0; -+ int ret, i = 0; -+ -+ if (pdata->td_id > g_thread_num) -+ return NULL; -+ -+ uadk_pool = &g_zip_pool.pool[pdata->td_id]; -+ memset(&comp_setup, 0, sizeof(comp_setup)); -+ memset(&creq, 0, sizeof(creq)); -+ -+ comp_setup.alg_type = pdata->alg; -+ comp_setup.op_type = pdata->optype; -+ comp_setup.comp_lv = WD_COMP_L8; -+ comp_setup.win_sz = WD_COMP_WS_8K; -+ h_sess = wd_comp_alloc_sess(&comp_setup); -+ if (!h_sess) -+ return NULL; -+ -+ creq.op_type = pdata->optype; -+ creq.src_len = g_pktlen; -+ out_len = uadk_pool->bds[0].dst_len; -+ -+ creq.cb = NULL; -+ creq.data_fmt = 0; -+ creq.priv = 0; -+ creq.status = 0; -+ -+ while(1) { -+ i = count % MAX_POOL_LENTH; -+ creq.src = uadk_pool->bds[i].src; -+ creq.dst = uadk_pool->bds[i].dst; -+ creq.src_len = uadk_pool->bds[i].src_len; -+ creq.dst_len = out_len; -+ -+ ret = wd_do_comp_strm(h_sess, &creq); -+ if (ret < 0 || creq.status == WD_IN_EPARA) { -+ ZIP_TST_PRT("wd comp, invalid or incomplete data! " -+ "ret(%d), req.status(%u)\n", ret, creq.status); -+ break; -+ } -+ -+ count++; -+ uadk_pool->bds[i].dst_len = creq.dst_len; -+ -+ if (get_run_state() == 0) -+ break; -+ } -+ wd_comp_free_sess(h_sess); -+ -+ // ZIP_TST_PRT("valid pool len: %u, send count BD: %u, output len: %u!\n", -+ // MAX_POOL_LENTH, count, creq.dst_len); -+ add_recv_data(count, g_pktlen); -+ -+ return NULL; -+} -+ -+static void *zip_uadk_blk_async_run(void *arg) -+{ -+ thread_data *pdata = (thread_data *)arg; -+ struct wd_comp_sess_setup comp_setup = {0}; -+ struct bd_pool *uadk_pool; -+ struct zip_async_tag *tag; -+ struct wd_comp_req creq; -+ handle_t h_sess; -+ int try_cnt = 0; -+ u32 out_len = 0; -+ u32 count = 0; -+ int ret, i = 0; -+ -+ if (pdata->td_id > g_thread_num) -+ return NULL; -+ -+ uadk_pool = &g_zip_pool.pool[pdata->td_id]; -+ memset(&comp_setup, 0, sizeof(comp_setup)); -+ memset(&creq, 0, sizeof(creq)); -+ -+ comp_setup.alg_type = pdata->alg; -+ comp_setup.op_type = pdata->optype; -+ comp_setup.comp_lv = WD_COMP_L8; -+ comp_setup.win_sz = WD_COMP_WS_8K; -+ h_sess = wd_comp_alloc_sess(&comp_setup); -+ if (!h_sess) -+ return NULL; -+ -+ creq.op_type = pdata->optype; -+ creq.src_len = g_pktlen; -+ out_len = uadk_pool->bds[0].dst_len; -+ -+ creq.cb = zip_async_cb; -+ creq.data_fmt = 0; -+ creq.priv = 0; -+ creq.status = 0; -+ -+ tag = malloc(sizeof(*tag) * MAX_POOL_LENTH); -+ if (!tag) { -+ ZIP_TST_PRT("failed to malloc zip tag!\n"); -+ wd_comp_free_sess(h_sess); -+ return NULL; -+ } -+ -+ while(1) { -+ if (get_run_state() == 0) -+ break; -+ -+ try_cnt = 0; -+ i = count % MAX_POOL_LENTH; -+ creq.src = uadk_pool->bds[i].src; -+ creq.dst = uadk_pool->bds[i].dst; -+ creq.src_len = uadk_pool->bds[i].src_len; -+ creq.dst_len = out_len; -+ -+ tag[i].td_id = pdata->td_id; -+ tag[i].bd_idx = i; -+ creq.cb_param = &tag[i]; -+ -+ ret = wd_do_comp_async(h_sess, &creq); -+ if (ret == -WD_EBUSY) { -+ usleep(SEND_USLEEP * try_cnt); -+ try_cnt++; -+ if (try_cnt > MAX_TRY_CNT) { -+ ZIP_TST_PRT("Test compress send fail %d times!\n", MAX_TRY_CNT); -+ try_cnt = 0; -+ } -+ continue; -+ } else if (ret || creq.status) { -+ break; -+ } -+ count++; -+ } -+ -+ while (1) { -+ if (get_recv_time() > 0) // wait Async mode finish recv -+ break; -+ usleep(SEND_USLEEP); -+ } -+ -+ free(tag); -+ wd_comp_free_sess(h_sess); -+ -+ // ZIP_TST_PRT("valid pool len: %u, send count BD: %u, output len: %u!\n", -+ // MAX_POOL_LENTH, count, creq.dst_len); -+ -+ add_send_complete(); -+ -+ return NULL; -+} -+ -+static int zip_uadk_sync_threads(struct acc_option *options) -+{ -+ typedef void *(*zip_sync_run)(void *arg); -+ zip_sync_run uadk_zip_sync_run = NULL; -+ thread_data threads_args[THREADS_NUM]; -+ thread_data threads_option; -+ pthread_t tdid[THREADS_NUM]; -+ int i, ret; -+ -+ /* alg param parse and set to thread data */ -+ ret = zip_uadk_param_parse(&threads_option, options); -+ if (ret) -+ return ret; -+ -+ if (threads_option.mode == 1) {// stream mode -+ if (threads_option.alg == LZ77_ZSTD) -+ uadk_zip_sync_run = zip_uadk_stm_lz77_sync_run; -+ else -+ uadk_zip_sync_run = zip_uadk_stm_sync_run; -+ } else { -+ if (threads_option.alg == LZ77_ZSTD) -+ uadk_zip_sync_run = zip_uadk_blk_lz77_sync_run; -+ else -+ uadk_zip_sync_run = zip_uadk_blk_sync_run; -+ } -+ for (i = 0; i < g_thread_num; i++) { -+ threads_args[i].alg = threads_option.alg; -+ threads_args[i].mode = threads_option.mode; -+ threads_args[i].optype = threads_option.optype; -+ threads_args[i].td_id = i; -+ ret = pthread_create(&tdid[i], NULL, uadk_zip_sync_run, &threads_args[i]); -+ if (ret) { -+ ZIP_TST_PRT("Create sync thread fail!\n"); -+ goto sync_error; -+ } -+ } -+ -+ /* join thread */ -+ for (i = 0; i < g_thread_num; i++) { -+ ret = pthread_join(tdid[i], NULL); -+ if (ret) { -+ ZIP_TST_PRT("Join sync thread fail!\n"); -+ goto sync_error; -+ } -+ } -+ -+sync_error: -+ return ret; -+} -+ -+static int zip_uadk_async_threads(struct acc_option *options) -+{ -+ typedef void *(*zip_async_run)(void *arg); -+ zip_async_run uadk_zip_async_run = NULL; -+ thread_data threads_args[THREADS_NUM]; -+ thread_data threads_option; -+ pthread_t tdid[THREADS_NUM]; -+ pthread_t pollid[THREADS_NUM]; -+ int i, ret; -+ -+ /* alg param parse and set to thread data */ -+ ret = zip_uadk_param_parse(&threads_option, options); -+ if (ret) -+ return ret; -+ -+ if (threads_option.mode == STREAM_MODE) {// stream mode -+ ZIP_TST_PRT("Stream mode can't support async mode!\n"); -+ return 0; -+ } -+ -+ if (threads_option.alg == LZ77_ZSTD) -+ uadk_zip_async_run = zip_uadk_blk_lz77_async_run; -+ else -+ uadk_zip_async_run = zip_uadk_blk_async_run; -+ -+ for (i = 0; i < g_ctxnum; i++) { -+ threads_args[i].td_id = i; -+ /* poll thread */ -+ ret = pthread_create(&pollid[i], NULL, zip_uadk_poll, &threads_args[i]); -+ if (ret) { -+ ZIP_TST_PRT("Create poll thread fail!\n"); -+ goto async_error; -+ } -+ } -+ -+ for (i = 0; i < g_thread_num; i++) { -+ threads_args[i].alg = threads_option.alg; -+ threads_args[i].mode = threads_option.mode; -+ threads_args[i].optype = threads_option.optype; -+ threads_args[i].td_id = i; -+ ret = pthread_create(&tdid[i], NULL, uadk_zip_async_run, &threads_args[i]); -+ if (ret) { -+ ZIP_TST_PRT("Create async thread fail!\n"); -+ goto async_error; -+ } -+ } -+ -+ /* join thread */ -+ for (i = 0; i < g_thread_num; i++) { -+ ret = pthread_join(tdid[i], NULL); -+ if (ret) { -+ ZIP_TST_PRT("Join async thread fail!\n"); -+ goto async_error; -+ } -+ } -+ -+ for (i = 0; i < g_ctxnum; i++) { -+ ret = pthread_join(pollid[i], NULL); -+ if (ret) { -+ ZIP_TST_PRT("Join poll thread fail!\n"); -+ goto async_error; -+ } -+ } -+ -+async_error: -+ return ret; -+} -+ -+int zip_uadk_benchmark(struct acc_option *options) -+{ -+ u32 ptime; -+ int ret; -+ -+ g_thread_num = options->threads; -+ g_pktlen = options->pktlen; -+ g_ctxnum = options->ctxnums; -+ g_prefetch = options->prefetch; -+ -+ if (options->optype >= WD_DIR_MAX * 2) { -+ ZIP_TST_PRT("ZIP optype error: %u\n", options->optype); -+ return -EINVAL; -+ } -+ -+ ret = init_ctx_config(options->algclass, options->syncmode, options->optype); -+ if (ret) -+ return ret; -+ -+ ret = init_uadk_bd_pool(options->optype); -+ if (ret) -+ return ret; -+ -+ ret = load_file_data(options->algname, options->pktlen, options->optype); -+ if (ret) -+ return ret; -+ -+ get_pid_cpu_time(&ptime); -+ time_start(options->times); -+ if (options->syncmode) -+ ret = zip_uadk_async_threads(options); -+ else -+ ret = zip_uadk_sync_threads(options); -+ cal_perfermance_data(options, ptime); -+ if (ret) -+ return ret; -+ -+ ret = save_file_data(options->algname, options->pktlen, options->optype); -+ if (ret) -+ return ret; -+ -+ free_uadk_bd_pool(); -+ uninit_ctx_config(); -+ -+ return 0; -+} -diff --git a/uadk_tool/benchmark/zip_uadk_benchmark.h b/uadk_tool/benchmark/zip_uadk_benchmark.h -new file mode 100644 -index 0000000..a3cfbc0 ---- /dev/null -+++ b/uadk_tool/benchmark/zip_uadk_benchmark.h -@@ -0,0 +1,6 @@ -+/* SPDX-License-Identifier: Apache-2.0 */ -+#ifndef ZIP_UADK_BENCHMARK_H -+#define ZIP_UADK_BENCHMARK_H -+ -+extern int zip_uadk_benchmark(struct acc_option *options); -+#endif /* ZIP_UADK_BENCHMARK_H */ --- -2.27.0 - diff --git a/0137-uadk_tool-Add-NO-SVA-mode-test-function-for-ZIP-modu.patch b/0137-uadk_tool-Add-NO-SVA-mode-test-function-for-ZIP-modu.patch deleted file mode 100644 index fee9e37..0000000 --- a/0137-uadk_tool-Add-NO-SVA-mode-test-function-for-ZIP-modu.patch +++ /dev/null @@ -1,1295 +0,0 @@ -From ffa9424facf439dc4990be891e2e84fa317eaf38 Mon Sep 17 00:00:00 2001 -From: Longfang Liu -Date: Mon, 18 Jul 2022 17:16:35 +0800 -Subject: [PATCH 151/183] uadk_tool: Add NO-SVA mode test function for ZIP - module - -Add NO-SVA mode performance test function for Zlib, -Gzip algorithm of ZIP module. - -Signed-off-by: Longfang Liu ---- - uadk_tool/benchmark/zip_wd_benchmark.c | 1257 ++++++++++++++++++++++++ - uadk_tool/benchmark/zip_wd_benchmark.h | 6 + - 2 files changed, 1263 insertions(+) - create mode 100644 uadk_tool/benchmark/zip_wd_benchmark.c - create mode 100644 uadk_tool/benchmark/zip_wd_benchmark.h - -diff --git a/uadk_tool/benchmark/zip_wd_benchmark.c b/uadk_tool/benchmark/zip_wd_benchmark.c -new file mode 100644 -index 0000000..0df78cd ---- /dev/null -+++ b/uadk_tool/benchmark/zip_wd_benchmark.c -@@ -0,0 +1,1257 @@ -+/* SPDX-License-Identifier: Apache-2.0 */ -+ -+#include -+#include "uadk_benchmark.h" -+ -+#include "zip_wd_benchmark.h" -+#include "v1/wd_comp.h" -+#include "v1/wd.h" -+#include "v1/wd_bmm.h" -+#include "v1/wd_util.h" -+#include "include/fse.h" -+ -+#define ZIP_TST_PRT printf -+#define PATH_SIZE 64 -+#define ZIP_FILE "./zip" -+#define WCRYPTO_DIR_MAX (WCRYPTO_INFLATE + 1) -+#define ALIGN_SIZE 64 -+ -+#define COMP_LEN_RATE 2 -+#define DECOMP_LEN_RATE 2 -+ -+#define __ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask)) -+#define ALIGN(x, a) __ALIGN_MASK(x, (typeof(x))(a)-1) -+ -+struct wd_bd { -+ u8 *src; -+ u8 *dst; -+ u32 src_len; -+ u32 dst_len; -+}; -+ -+struct thread_bd_res { -+ struct wd_queue *queue; -+ void *pool; -+ struct wd_bd *bds; -+}; -+ -+struct thread_queue_res { -+ struct thread_bd_res *bd_res; -+}; -+ -+static struct thread_queue_res g_thread_queue; -+ -+enum ZIP_OP_MODE { -+ BLOCK_MODE, -+ STREAM_MODE -+}; -+ -+struct zip_async_tag { -+ void *ctx; -+ u32 td_id; -+ u32 bd_idx; -+ u32 cm_len; -+ void *priv; -+ ZSTD_CCtx *cctx; -+}; -+ -+typedef struct uadk_thread_res { -+ u32 alg; -+ u32 mode; // block/stream -+ u32 optype; -+ u32 td_id; -+} thread_data; -+ -+struct zip_file_head { -+ u32 file_size; -+ u32 block_num; -+ u32 blk_sz[MAX_POOL_LENTH]; -+}; -+ -+static unsigned int g_thread_num; -+static unsigned int g_pktlen; -+ -+#ifndef ZLIB_FSE -+static ZSTD_CCtx* zstd_soft_fse_init(unsigned int level) -+{ -+ return NULL; -+} -+ -+static int zstd_soft_fse(void *Ftuple, ZSTD_inBuffer *input, ZSTD_outBuffer *output, ZSTD_CCtx * cctx, ZSTD_EndDirective cmode) -+{ -+ return input->size; -+} -+#endif -+ -+static int save_file_data(const char *alg, u32 pkg_len, u32 optype) -+{ -+ struct zip_file_head *fhead = NULL; -+ char file_path[PATH_SIZE]; -+ u32 total_file_size = 0; -+ double comp_rate = 0.0; -+ u32 full_size; -+ ssize_t size; -+ int j, fd; -+ int ret = 0; -+ -+ optype = optype % WCRYPTO_DIR_MAX; -+ if (optype != WCRYPTO_DEFLATE) //compress -+ return 0; -+ -+ ret = snprintf(file_path, PATH_SIZE, "%s_%u.%s", ZIP_FILE, pkg_len, alg); -+ if (ret < 0) -+ return -EINVAL; -+ -+ ret = access(file_path, F_OK); -+ if (!ret) { -+ ZIP_TST_PRT("compress data file: %s has exist!\n", file_path); -+ return 0; -+ } -+ -+ fd = open(file_path, O_WRONLY|O_CREAT, 0777); -+ if (fd < 0) { -+ ZIP_TST_PRT("compress data file open %s failed (%d)!\n", file_path, -errno); -+ return -ENODEV; -+ } -+ -+ fhead = malloc(sizeof(*fhead)); -+ if (!fhead) { -+ ZIP_TST_PRT("failed to alloc file head memory\n"); -+ ret = -ENOMEM; -+ goto fd_error; -+ } -+ -+ // init file head informations -+ for (j = 0; j < MAX_POOL_LENTH; j++) { -+ fhead->blk_sz[j] = g_thread_queue.bd_res[0].bds[j].dst_len; -+ total_file_size += fhead->blk_sz[j]; -+ } -+ fhead->block_num = MAX_POOL_LENTH; -+ fhead->file_size = total_file_size; -+ size = write(fd, fhead, sizeof(*fhead)); -+ if (size < 0) { -+ ZIP_TST_PRT("compress write file head failed: %lu!\n", size); -+ ret = -ENODEV; -+ goto write_error; -+ } -+ -+ // write data for one buffer one buffer to file line. -+ for (j = 0; j < MAX_POOL_LENTH; j++) { -+ size = write(fd, g_thread_queue.bd_res[0].bds[j].dst, -+ fhead->blk_sz[j]); -+ if (size < 0) { -+ ZIP_TST_PRT("compress write data error size: %lu!\n", size); -+ ret = -ENODEV; -+ break; -+ } -+ } -+ -+write_error: -+ free(fhead); -+fd_error: -+ close(fd); -+ -+ full_size = g_pktlen * MAX_POOL_LENTH; -+ comp_rate = (double) total_file_size / full_size; -+ ZIP_TST_PRT("compress data rate: %.1f%%!\n", comp_rate * 100); -+ -+ return ret; -+} -+ -+static int load_file_data(const char *alg, u32 pkg_len, u32 optype) -+{ -+ struct zip_file_head *fhead = NULL; -+ char file_path[PATH_SIZE]; -+ ssize_t size = 0xff; -+ int i, j, fd; -+ int ret; -+ -+ optype = optype % WCRYPTO_DIR_MAX; -+ if (optype != WCRYPTO_INFLATE) //decompress -+ return 0; -+ -+ ret = snprintf(file_path, PATH_SIZE, "%s_%u.%s", ZIP_FILE, pkg_len, alg); -+ if (ret < 0) -+ return -EINVAL; -+ -+ ret = access(file_path, F_OK); -+ if (ret) { -+ ZIP_TST_PRT("Decompress data file: %s not exist!\n", file_path); -+ return -EINVAL; -+ } -+ -+ // read data from file -+ fd = open(file_path, O_RDONLY, 0); -+ if (fd < 0) { -+ ZIP_TST_PRT("Decompress data file open %s fail (%d)!\n", file_path, -errno); -+ return -ENODEV; -+ } -+ -+ fhead = malloc(sizeof(*fhead)); -+ if (!fhead) { -+ ZIP_TST_PRT("failed to alloc file head memory\n"); -+ ret = -ENOMEM; -+ goto fd_err; -+ } -+ size = read(fd, fhead, sizeof(*fhead)); -+ if (size < 0 || fhead->block_num != MAX_POOL_LENTH) { -+ ZIP_TST_PRT("failed to read file head\n"); -+ ret = -EINVAL; -+ goto read_err; -+ } -+ -+ // read data for one buffer one buffer from file line -+ for (j = 0; j < MAX_POOL_LENTH; j++) { -+ memset(g_thread_queue.bd_res[0].bds[j].src, 0x0, -+ g_thread_queue.bd_res[0].bds[j].src_len); -+ if (size != 0) { // zero size buffer no need to read; -+ size = read(fd, g_thread_queue.bd_res[0].bds[j].src, -+ fhead->blk_sz[j]); -+ if (size < 0) { -+ ZIP_TST_PRT("Decompress read data error size: %lu!\n", size); -+ ret = -EINVAL; -+ goto read_err; -+ } else if (size == 0) { -+ ZIP_TST_PRT("Read file to the end!"); -+ } -+ } -+ g_thread_queue.bd_res[0].bds[j].src_len = size; -+ } -+ -+ for (i = 1; i < g_thread_num; i++) { -+ for (j = 0; j < MAX_POOL_LENTH; j++) { -+ if (g_thread_queue.bd_res[0].bds[j].src_len) -+ memcpy(g_thread_queue.bd_res[i].bds[j].src, -+ g_thread_queue.bd_res[0].bds[j].src, -+ g_thread_queue.bd_res[0].bds[j].src_len); -+ g_thread_queue.bd_res[i].bds[j].src_len = -+ g_thread_queue.bd_res[0].bds[j].src_len; -+ } -+ } -+ -+read_err: -+ free(fhead); -+fd_err: -+ close(fd); -+ -+ return ret; -+} -+ -+static int zip_wd_param_parse(thread_data *tddata, struct acc_option *options) -+{ -+ u32 algtype = options->algtype; -+ u32 optype = options->optype; -+ u8 mode = BLOCK_MODE; -+ u8 alg; -+ -+ if (optype >= WCRYPTO_DIR_MAX << 1) { -+ ZIP_TST_PRT("Fail to get zip optype!\n"); -+ return -EINVAL; -+ } else if (optype > WCRYPTO_INFLATE) { -+ mode = STREAM_MODE; -+ } -+ -+ optype = optype % WCRYPTO_DIR_MAX; -+ -+ switch(algtype) { -+ case ZLIB: -+ alg = WCRYPTO_ZLIB; -+ break; -+ case GZIP: -+ alg = WCRYPTO_GZIP; -+ break; -+ case DEFLATE: -+ alg = WCRYPTO_RAW_DEFLATE; -+ break; -+ case LZ77_ZSTD: -+ alg = WCRYPTO_LZ77_ZSTD; -+ if (optype == WCRYPTO_INFLATE) -+ ZIP_TST_PRT("Zip LZ77_ZSTD just support compress!\n"); -+ optype = WCRYPTO_DEFLATE; -+ break; -+ default: -+ ZIP_TST_PRT("Fail to set zip alg\n"); -+ return -EINVAL; -+ } -+ -+ tddata->alg = alg; -+ tddata->mode = mode; -+ tddata->optype = optype; -+ -+ return 0; -+} -+ -+static int init_zip_wd_queue(struct acc_option *options) -+{ -+ struct wd_blkpool_setup blksetup; -+ struct wd_bd *bds = NULL; -+ void *pool = NULL; -+ u32 outsize; -+ u32 insize; -+ u8 op_type; -+ int i, j; -+ int ret = 0; -+ -+ op_type = options->optype % WCRYPTO_DIR_MAX; -+ if (op_type == WCRYPTO_DEFLATE) {//compress -+ insize = g_pktlen; -+ outsize = g_pktlen * COMP_LEN_RATE; -+ } else { // decompress -+ insize = g_pktlen; -+ outsize = g_pktlen * DECOMP_LEN_RATE; -+ } -+ -+ g_thread_queue.bd_res = malloc(g_thread_num * sizeof(struct thread_bd_res)); -+ if (!g_thread_queue.bd_res) { -+ ZIP_TST_PRT("malloc thread res memory fail!\n"); -+ return -ENOMEM; -+ } -+ -+ for (i = 0; i < g_thread_num; i++) { -+ g_thread_queue.bd_res[i].queue = malloc(sizeof(struct wd_queue)); -+ g_thread_queue.bd_res[i].queue->capa.alg = options->algclass; -+ // 0 is compress, 1 is decompress -+ g_thread_queue.bd_res[i].queue->capa.priv.direction = op_type; -+ /* nodemask need to be clean */ -+ g_thread_queue.bd_res[i].queue->node_mask = 0x0; -+ memset(g_thread_queue.bd_res[i].queue->dev_path, 0x0, PATH_STR_SIZE); -+ -+ ret = wd_request_queue(g_thread_queue.bd_res[i].queue); -+ if (ret) { -+ ZIP_TST_PRT("request queue %d fail!\n", i); -+ ret = -EINVAL; -+ goto queue_out; -+ } -+ } -+ -+ // use no-sva pbuffer, MAX_BLOCK_NM at least 4 times of MAX_POOL_LENTH -+ memset(&blksetup, 0, sizeof(blksetup)); -+ outsize = ALIGN(outsize, ALIGN_SIZE); -+ blksetup.block_size = outsize; -+ blksetup.block_num = MAX_BLOCK_NM; -+ blksetup.align_size = ALIGN_SIZE; -+ // ZIP_TST_PRT("create pool memory: %d KB\n", (MAX_BLOCK_NM * blksetup.block_size) >> 10); -+ -+ for (j = 0; j < g_thread_num; j++) { -+ g_thread_queue.bd_res[j].pool = wd_blkpool_create(g_thread_queue.bd_res[j].queue, &blksetup); -+ if (!g_thread_queue.bd_res[j].pool) { -+ ZIP_TST_PRT("create %dth pool fail!\n", j); -+ ret = -ENOMEM; -+ goto pool_err; -+ } -+ pool = g_thread_queue.bd_res[j].pool; -+ -+ g_thread_queue.bd_res[j].bds = malloc(sizeof(struct wd_bd) * MAX_POOL_LENTH); -+ if (!g_thread_queue.bd_res[j].bds) -+ goto bds_error; -+ bds = g_thread_queue.bd_res[j].bds; -+ -+ for (i = 0; i < MAX_POOL_LENTH; i++) { -+ bds[i].src = wd_alloc_blk(pool); -+ if (!bds[i].src) { -+ ret = -ENOMEM; -+ goto blk_error2; -+ } -+ bds[i].src_len = insize; -+ -+ bds[i].dst = wd_alloc_blk(pool); -+ if (!bds[i].dst) { -+ ret = -ENOMEM; -+ goto blk_error3; -+ } -+ bds[i].dst_len = outsize; -+ -+ get_rand_data(bds[i].src, insize); -+ } -+ -+ } -+ -+ return 0; -+ -+blk_error3: -+ wd_free_blk(pool, bds[i].src); -+blk_error2: -+ for (i--; i >= 0; i--) { -+ wd_free_blk(pool, bds[i].src); -+ wd_free_blk(pool, bds[i].dst); -+ } -+bds_error: -+ wd_blkpool_destroy(g_thread_queue.bd_res[j].pool); -+pool_err: -+ for (j--; j >= 0; j--) { -+ pool = g_thread_queue.bd_res[j].pool; -+ bds = g_thread_queue.bd_res[j].bds; -+ for (i = 0; i < MAX_POOL_LENTH; i++) { -+ wd_free_blk(pool, bds[i].src); -+ wd_free_blk(pool, bds[i].dst); -+ } -+ free(bds); -+ wd_blkpool_destroy(pool); -+ } -+queue_out: -+ for (i--; i >= 0; i--) { -+ wd_release_queue(g_thread_queue.bd_res[i].queue); -+ free(g_thread_queue.bd_res[i].queue); -+ } -+ free(g_thread_queue.bd_res); -+ return ret; -+} -+ -+static void uninit_zip_wd_queue(void) -+{ -+ struct wd_bd *bds = NULL; -+ void *pool = NULL; -+ int j, i; -+ -+ for (j = 0; j < g_thread_num; j++) { -+ pool = g_thread_queue.bd_res[j].pool; -+ bds = g_thread_queue.bd_res[j].bds; -+ for (i = 0; i < MAX_POOL_LENTH; i++) { -+ wd_free_blk(pool, bds[i].src); -+ wd_free_blk(pool, bds[i].dst); -+ } -+ -+ free(bds); -+ wd_blkpool_destroy(pool); -+ wd_release_queue(g_thread_queue.bd_res[j].queue); -+ } -+ -+ free(g_thread_queue.bd_res); -+} -+ -+/*-------------------------------uadk benchmark main code-------------------------------------*/ -+static void zip_lz77_async_cb(const void *message, void *data) -+{ -+ const struct wcrypto_comp_msg *cbmsg = message; -+ struct zip_async_tag *tag = data; -+ ZSTD_CCtx *cctx = tag->cctx; -+ ZSTD_inBuffer zstd_input; -+ ZSTD_outBuffer zstd_output; -+ struct wd_bd *bd_pool; -+ int td_id = tag->td_id; -+ int idx = tag->bd_idx; -+ size_t fse_size; -+ -+ bd_pool = g_thread_queue.bd_res[td_id].bds; -+ bd_pool[idx].dst_len = cbmsg->produced; -+ -+ zstd_input.src = cbmsg->src; -+ zstd_input.size = cbmsg->in_size; -+ zstd_input.pos = 0; -+ zstd_output.dst = bd_pool[idx].dst; -+ zstd_output.size = tag->cm_len; -+ zstd_output.pos = 0; -+ fse_size = zstd_soft_fse(tag->priv, &zstd_input, &zstd_output, cctx, ZSTD_e_end); -+ -+ bd_pool[idx].dst_len = fse_size; -+} -+ -+static void zip_async_cb(const void *message, void *data) -+{ -+ const struct wcrypto_comp_msg *cbmsg = message; -+ struct zip_async_tag *tag = data; -+ struct wd_bd *bd_pool; -+ int td_id = tag->td_id; -+ int idx = tag->bd_idx; -+ -+ bd_pool = g_thread_queue.bd_res[td_id].bds; -+ bd_pool[idx].dst_len = cbmsg->produced; -+} -+ -+static void *zip_wd_poll(void *data) -+{ -+ thread_data *pdata = (thread_data *)data; -+ u32 expt = ACC_QUEUE_SIZE * g_thread_num; -+ struct wd_queue *queue; -+ u32 id = pdata->td_id; -+ u32 last_time = 2; // poll need one more recv time -+ u32 count = 0; -+ int recv = 0; -+ -+ if (id > g_thread_num) -+ return NULL; -+ -+ queue = g_thread_queue.bd_res[id].queue; -+ while (last_time) { -+ recv = wcrypto_comp_poll(queue, expt); -+ if (unlikely(recv != -WD_EAGAIN && recv < 0)) { -+ ZIP_TST_PRT("poll ret: %u!\n", recv); -+ goto recv_error; -+ } -+ -+ count += recv; -+ recv = 0; -+ -+ if (get_run_state() == 0) -+ last_time--; -+ } -+ -+recv_error: -+ add_recv_data(count, g_pktlen); -+ -+ return NULL; -+} -+ -+static void *zip_wd_blk_lz77_sync_run(void *arg) -+{ -+ thread_data *pdata = (thread_data *)arg; -+ ZSTD_CCtx *cctx = zstd_soft_fse_init(15); -+ ZSTD_inBuffer zstd_input = {0}; -+ ZSTD_outBuffer zstd_output = {0}; -+ COMP_TUPLE_TAG *ftuple = NULL; -+ struct wcrypto_comp_ctx_setup comp_setup; -+ struct wcrypto_comp_op_data opdata; -+ struct wcrypto_comp_ctx *ctx; -+ struct wd_queue *queue; -+ struct wd_bd *bd_pool; -+ u8 *hw_buff_out = NULL; -+ size_t fse_size; -+ u32 first_len = 0; -+ u32 out_len = 0; -+ u32 count = 0; -+ int ret, i = 0; -+ -+ if (pdata->td_id > g_thread_num) -+ return NULL; -+ -+ bd_pool = g_thread_queue.bd_res[pdata->td_id].bds; -+ queue = g_thread_queue.bd_res[pdata->td_id].queue; -+ memset(&comp_setup, 0, sizeof(comp_setup)); -+ memset(&opdata, 0, sizeof(opdata)); -+ -+ comp_setup.br.alloc = (void *)wd_alloc_blk; -+ comp_setup.br.free = (void *)wd_free_blk; -+ comp_setup.br.iova_map = (void *)wd_blk_iova_map; -+ comp_setup.br.iova_unmap = (void *)wd_blk_iova_unmap; -+ comp_setup.br.get_bufsize = (void *)wd_blksize; -+ comp_setup.br.usr = g_thread_queue.bd_res[pdata->td_id].pool; -+ -+ comp_setup.alg_type = pdata->alg; -+ comp_setup.op_type = pdata->optype; -+ comp_setup.comp_lv = WCRYPTO_COMP_L8; -+ comp_setup.win_size = WCRYPTO_COMP_WS_8K; -+ comp_setup.stream_mode = WCRYPTO_COMP_STATELESS; -+ -+ ctx = wcrypto_create_comp_ctx(queue, &comp_setup); -+ if (!ctx) -+ return NULL; -+ -+ opdata.stream_pos = WCRYPTO_COMP_STREAM_NEW; -+ opdata.alg_type = pdata->alg; -+ opdata.priv = NULL; -+ opdata.status = 0; -+ if (pdata->optype == WCRYPTO_INFLATE) -+ opdata.flush = WCRYPTO_SYNC_FLUSH; -+ else -+ opdata.flush = WCRYPTO_FINISH; -+ -+ out_len = bd_pool[0].dst_len; -+ -+ ftuple = malloc(sizeof(COMP_TUPLE_TAG) * MAX_POOL_LENTH); -+ if (!ftuple) -+ goto fse_err; -+ -+ hw_buff_out = malloc(out_len * MAX_POOL_LENTH); -+ if (!hw_buff_out) -+ goto hw_buff_err; -+ memset(hw_buff_out, 0x0, out_len * MAX_POOL_LENTH); -+ -+ while(1) { -+ i = count % MAX_POOL_LENTH; -+ opdata.in = bd_pool[i].src; -+ opdata.out = &hw_buff_out[i]; //temp out -+ opdata.in_len = bd_pool[i].src_len; -+ opdata.avail_out = out_len; -+ opdata.priv = &ftuple[i]; -+ -+ ret = wcrypto_do_comp(ctx, &opdata, NULL); -+ if (ret || opdata.status == WCRYPTO_DECOMP_END_NOSPACE || -+ opdata.status == WD_IN_EPARA || opdata.status == WD_VERIFY_ERR) -+ break; -+ -+ count++; -+ zstd_input.src = opdata.in; -+ zstd_input.size = opdata.in_len; -+ zstd_input.pos = 0; -+ zstd_output.dst = bd_pool[i].dst; -+ zstd_output.size = out_len; -+ zstd_output.pos = 0; -+ fse_size = zstd_soft_fse(opdata.priv, &zstd_input, &zstd_output, cctx, ZSTD_e_end); -+ -+ bd_pool[i].dst_len = fse_size; -+ if (unlikely(i == 0)) -+ first_len = fse_size; -+ if (get_run_state() == 0) -+ break; -+ } -+ -+hw_buff_err: -+ free(hw_buff_out); -+fse_err: -+ free(ftuple); -+ wcrypto_del_comp_ctx(ctx); -+ -+ // ZIP_TST_PRT("valid pool len: %u, send count BD: %u, output len: %u!\n", -+ // MAX_POOL_LENTH, count, opdata.produced); -+ if (pdata->optype == WCRYPTO_DEFLATE) -+ add_recv_data(count, opdata.in_len); -+ else -+ add_recv_data(count, first_len); -+ -+ return NULL; -+} -+ -+static void *zip_wd_stm_lz77_sync_run(void *arg) -+{ -+ thread_data *pdata = (thread_data *)arg; -+ ZSTD_CCtx *cctx = zstd_soft_fse_init(15); -+ ZSTD_inBuffer zstd_input = {0}; -+ ZSTD_outBuffer zstd_output = {0}; -+ COMP_TUPLE_TAG *ftuple = NULL; -+ struct wcrypto_comp_ctx_setup comp_setup; -+ struct wcrypto_comp_op_data opdata; -+ struct wcrypto_comp_ctx *ctx; -+ struct wd_queue *queue; -+ struct wd_bd *bd_pool; -+ u8 *hw_buff_out = NULL; -+ size_t fse_size; -+ u32 first_len = 0; -+ u32 out_len = 0; -+ u32 count = 0; -+ int ret, i = 0; -+ -+ if (pdata->td_id > g_thread_num) -+ return NULL; -+ -+ bd_pool = g_thread_queue.bd_res[pdata->td_id].bds; -+ queue = g_thread_queue.bd_res[pdata->td_id].queue; -+ memset(&comp_setup, 0, sizeof(comp_setup)); -+ memset(&opdata, 0, sizeof(opdata)); -+ -+ comp_setup.br.alloc = (void *)wd_alloc_blk; -+ comp_setup.br.free = (void *)wd_free_blk; -+ comp_setup.br.iova_map = (void *)wd_blk_iova_map; -+ comp_setup.br.iova_unmap = (void *)wd_blk_iova_unmap; -+ comp_setup.br.get_bufsize = (void *)wd_blksize; -+ comp_setup.br.usr = g_thread_queue.bd_res[pdata->td_id].pool; -+ -+ comp_setup.alg_type = pdata->alg; -+ comp_setup.op_type = pdata->optype; -+ comp_setup.comp_lv = WCRYPTO_COMP_L8; -+ comp_setup.win_size = WCRYPTO_COMP_WS_8K; -+ comp_setup.stream_mode = WCRYPTO_COMP_STATEFUL; -+ -+ ctx = wcrypto_create_comp_ctx(queue, &comp_setup); -+ if (!ctx) -+ return NULL; -+ -+ opdata.stream_pos = WCRYPTO_COMP_STREAM_NEW; -+ opdata.alg_type = pdata->alg; -+ opdata.priv = NULL; -+ opdata.status = 0; -+ if (pdata->optype == WCRYPTO_INFLATE) -+ opdata.flush = WCRYPTO_SYNC_FLUSH; -+ else -+ opdata.flush = WCRYPTO_FINISH; -+ -+ out_len = bd_pool[0].dst_len; -+ -+ ftuple = malloc(sizeof(COMP_TUPLE_TAG) * MAX_POOL_LENTH); -+ if (!ftuple) -+ goto fse_err; -+ -+ hw_buff_out = malloc(out_len * MAX_POOL_LENTH); -+ if (!hw_buff_out) -+ goto hw_buff_err; -+ memset(hw_buff_out, 0x0, out_len * MAX_POOL_LENTH); -+ -+ while(1) { -+ i = count % MAX_POOL_LENTH; -+ opdata.in = bd_pool[i].src; -+ opdata.out = &hw_buff_out[i]; //temp out -+ opdata.in_len = bd_pool[i].src_len; -+ opdata.avail_out = out_len; -+ opdata.priv = &ftuple[i]; -+ -+ ret = wcrypto_do_comp(ctx, &opdata, NULL); -+ if (ret || opdata.status == WCRYPTO_DECOMP_END_NOSPACE || -+ opdata.status == WD_IN_EPARA || opdata.status == WD_VERIFY_ERR) { -+ ZIP_TST_PRT("wd comp, invalid or incomplete data! " -+ "ret(%d), req.status(%u)\n", ret, opdata.status); -+ break; -+ } -+ -+ count++; -+ zstd_input.src = opdata.in; -+ zstd_input.size = opdata.in_len; -+ zstd_input.pos = 0; -+ zstd_output.dst = opdata.out; -+ zstd_output.size = out_len; -+ zstd_output.pos = 0; -+ fse_size = zstd_soft_fse(opdata.priv, &zstd_input, &zstd_output, cctx, ZSTD_e_end); -+ -+ bd_pool[i].dst_len = fse_size; -+ if (unlikely(i == 0)) -+ first_len = fse_size; -+ if (get_run_state() == 0) -+ break; -+ } -+ -+hw_buff_err: -+ free(hw_buff_out); -+fse_err: -+ free(ftuple); -+ wcrypto_del_comp_ctx(ctx); -+ -+ // ZIP_TST_PRT("valid pool len: %u, send count BD: %u, output len: %u!\n", -+ // MAX_POOL_LENTH, count, opdata.produced); -+ if (pdata->optype == WCRYPTO_DEFLATE) -+ add_recv_data(count, opdata.in_len); -+ else -+ add_recv_data(count, first_len); -+ -+ return NULL; -+} -+ -+static void *zip_wd_blk_lz77_async_run(void *arg) -+{ -+ thread_data *pdata = (thread_data *)arg; -+ ZSTD_CCtx *cctx = zstd_soft_fse_init(15); -+ COMP_TUPLE_TAG *ftuple = NULL; -+ struct wcrypto_comp_ctx_setup comp_setup; -+ struct wcrypto_comp_op_data opdata; -+ struct wcrypto_comp_ctx *ctx; -+ struct zip_async_tag *tag; -+ u8 *hw_buff_out = NULL; -+ struct wd_queue *queue; -+ struct wd_bd *bd_pool; -+ u32 out_len = 0; -+ u32 count = 0; -+ u32 try_cnt = 0; -+ int ret, i = 0; -+ -+ if (pdata->td_id > g_thread_num) -+ return NULL; -+ -+ bd_pool = g_thread_queue.bd_res[pdata->td_id].bds; -+ queue = g_thread_queue.bd_res[pdata->td_id].queue; -+ memset(&comp_setup, 0, sizeof(comp_setup)); -+ memset(&opdata, 0, sizeof(opdata)); -+ -+ comp_setup.br.alloc = (void *)wd_alloc_blk; -+ comp_setup.br.free = (void *)wd_free_blk; -+ comp_setup.br.iova_map = (void *)wd_blk_iova_map; -+ comp_setup.br.iova_unmap = (void *)wd_blk_iova_unmap; -+ comp_setup.br.get_bufsize = (void *)wd_blksize; -+ comp_setup.br.usr = g_thread_queue.bd_res[pdata->td_id].pool; -+ -+ comp_setup.alg_type = pdata->alg; -+ comp_setup.op_type = pdata->optype; -+ comp_setup.comp_lv = WCRYPTO_COMP_L8; -+ comp_setup.win_size = WCRYPTO_COMP_WS_8K; -+ comp_setup.stream_mode = WCRYPTO_COMP_STATELESS; -+ comp_setup.cb = zip_lz77_async_cb; -+ -+ ctx = wcrypto_create_comp_ctx(queue, &comp_setup); -+ if (!ctx) -+ return NULL; -+ -+ opdata.stream_pos = WCRYPTO_COMP_STREAM_NEW; -+ opdata.alg_type = pdata->alg; -+ opdata.priv = NULL; -+ opdata.status = 0; -+ if (pdata->optype == WCRYPTO_INFLATE) -+ opdata.flush = WCRYPTO_SYNC_FLUSH; -+ else -+ opdata.flush = WCRYPTO_FINISH; -+ -+ out_len = bd_pool[0].dst_len; -+ -+ ftuple = malloc(sizeof(COMP_TUPLE_TAG) * MAX_POOL_LENTH); -+ if (!ftuple) -+ goto fse_err; -+ -+ hw_buff_out = malloc(out_len * MAX_POOL_LENTH); -+ if (!hw_buff_out) -+ goto hw_buff_err; -+ memset(hw_buff_out, 0x0, out_len * MAX_POOL_LENTH); -+ -+ tag = malloc(sizeof(*tag) * MAX_POOL_LENTH); -+ if (!tag) { -+ ZIP_TST_PRT("failed to malloc zip tag!\n"); -+ goto tag_err; -+ } -+ -+ while(1) { -+ if (get_run_state() == 0) -+ break; -+ -+ try_cnt = 0; -+ i = count % MAX_POOL_LENTH; -+ opdata.in = bd_pool[i].src; -+ opdata.out = &hw_buff_out[i]; //temp out -+ opdata.in_len = bd_pool[i].src_len; -+ opdata.avail_out = out_len; -+ opdata.priv = &ftuple[i]; -+ -+ tag[i].td_id = pdata->td_id; -+ tag[i].ctx = ctx; -+ tag[i].td_id = pdata->td_id; -+ tag[i].cm_len = out_len; -+ tag[i].cctx = cctx; -+ tag[i].priv = opdata.priv; -+ -+ ret = wcrypto_do_comp(ctx, &opdata, &tag[i]); -+ if (ret == -WD_EBUSY) { -+ usleep(SEND_USLEEP * try_cnt); -+ try_cnt++; -+ if (try_cnt > MAX_TRY_CNT) { -+ ZIP_TST_PRT("Test LZ77 compress send fail %d times!\n", MAX_TRY_CNT); -+ try_cnt = 0; -+ } -+ continue; -+ } else if (ret || opdata.status == WCRYPTO_DECOMP_END_NOSPACE || -+ opdata.status == WD_IN_EPARA || opdata.status == WD_VERIFY_ERR) { -+ break; -+ } -+ count++; -+ } -+ -+ while (1) { -+ if (get_recv_time() > 0) // wait Async mode finish recv -+ break; -+ usleep(SEND_USLEEP); -+ } -+ -+tag_err: -+ free(tag); -+hw_buff_err: -+ free(hw_buff_out); -+fse_err: -+ free(ftuple); -+ wcrypto_del_comp_ctx(ctx); -+ -+ // ZIP_TST_PRT("LZ77 valid pool len: %u, send count BD: %u, output len: %u!\n", -+ // MAX_POOL_LENTH, count, opdata.produced); -+ -+ add_send_complete(); -+ -+ return NULL; -+} -+ -+static void *zip_wd_blk_sync_run(void *arg) -+{ -+ thread_data *pdata = (thread_data *)arg; -+ struct wcrypto_comp_ctx_setup comp_setup; -+ struct wcrypto_comp_op_data opdata; -+ struct wcrypto_comp_ctx *ctx; -+ struct wd_queue *queue; -+ struct wd_bd *bd_pool; -+ u32 out_len = 0; -+ u32 count = 0; -+ int ret, i = 0; -+ -+ if (pdata->td_id > g_thread_num) -+ return NULL; -+ -+ bd_pool = g_thread_queue.bd_res[pdata->td_id].bds; -+ queue = g_thread_queue.bd_res[pdata->td_id].queue; -+ memset(&comp_setup, 0, sizeof(comp_setup)); -+ memset(&opdata, 0, sizeof(opdata)); -+ -+ comp_setup.br.alloc = (void *)wd_alloc_blk; -+ comp_setup.br.free = (void *)wd_free_blk; -+ comp_setup.br.iova_map = (void *)wd_blk_iova_map; -+ comp_setup.br.iova_unmap = (void *)wd_blk_iova_unmap; -+ comp_setup.br.get_bufsize = (void *)wd_blksize; -+ comp_setup.br.usr = g_thread_queue.bd_res[pdata->td_id].pool; -+ -+ comp_setup.alg_type = pdata->alg; -+ comp_setup.op_type = pdata->optype; -+ comp_setup.comp_lv = WCRYPTO_COMP_L8; -+ comp_setup.win_size = WCRYPTO_COMP_WS_8K; -+ comp_setup.stream_mode = WCRYPTO_COMP_STATELESS; -+ -+ ctx = wcrypto_create_comp_ctx(queue, &comp_setup); -+ if (!ctx) -+ return NULL; -+ -+ opdata.stream_pos = WCRYPTO_COMP_STREAM_NEW; -+ opdata.alg_type = pdata->alg; -+ opdata.priv = NULL; -+ opdata.status = 0; -+ if (pdata->optype == WCRYPTO_INFLATE) -+ opdata.flush = WCRYPTO_SYNC_FLUSH; -+ else -+ opdata.flush = WCRYPTO_FINISH; -+ -+ out_len = bd_pool[0].dst_len; -+ -+ while(1) { -+ i = count % MAX_POOL_LENTH; -+ opdata.in = bd_pool[i].src; -+ opdata.out = bd_pool[i].dst; -+ opdata.in_len = bd_pool[i].src_len; -+ opdata.avail_out = out_len; -+ -+ ret = wcrypto_do_comp(ctx, &opdata, NULL); -+ if (ret || opdata.status == WCRYPTO_DECOMP_END_NOSPACE || -+ opdata.status == WD_IN_EPARA || opdata.status == WD_VERIFY_ERR) -+ break; -+ -+ count++; -+ bd_pool[i].dst_len = opdata.produced; -+ if (get_run_state() == 0) -+ break; -+ } -+ wcrypto_del_comp_ctx(ctx); -+ -+ // ZIP_TST_PRT("valid pool len: %u, send count BD: %u, output len: %u!\n", -+ // MAX_POOL_LENTH, count, opdata.produced); -+ add_recv_data(count, g_pktlen); -+ -+ return NULL; -+} -+ -+static void *zip_wd_stm_sync_run(void *arg) -+{ -+ thread_data *pdata = (thread_data *)arg; -+ struct wcrypto_comp_ctx_setup comp_setup; -+ struct wcrypto_comp_op_data opdata; -+ struct wcrypto_comp_ctx *ctx; -+ struct wd_queue *queue; -+ struct wd_bd *bd_pool; -+ u32 out_len = 0; -+ u32 count = 0; -+ int ret, i = 0; -+ -+ if (pdata->td_id > g_thread_num) -+ return NULL; -+ -+ bd_pool = g_thread_queue.bd_res[pdata->td_id].bds; -+ queue = g_thread_queue.bd_res[pdata->td_id].queue; -+ memset(&comp_setup, 0, sizeof(comp_setup)); -+ memset(&opdata, 0, sizeof(opdata)); -+ -+ comp_setup.br.alloc = (void *)wd_alloc_blk; -+ comp_setup.br.free = (void *)wd_free_blk; -+ comp_setup.br.iova_map = (void *)wd_blk_iova_map; -+ comp_setup.br.iova_unmap = (void *)wd_blk_iova_unmap; -+ comp_setup.br.get_bufsize = (void *)wd_blksize; -+ comp_setup.br.usr = g_thread_queue.bd_res[pdata->td_id].pool; -+ -+ comp_setup.alg_type = pdata->alg; -+ comp_setup.op_type = pdata->optype; -+ comp_setup.comp_lv = WCRYPTO_COMP_L8; -+ comp_setup.win_size = WCRYPTO_COMP_WS_8K; -+ comp_setup.stream_mode = WCRYPTO_COMP_STATEFUL; -+ -+ ctx = wcrypto_create_comp_ctx(queue, &comp_setup); -+ if (!ctx) -+ return NULL; -+ -+ opdata.stream_pos = WCRYPTO_COMP_STREAM_NEW; -+ opdata.alg_type = pdata->alg; -+ opdata.priv = NULL; -+ opdata.status = 0; -+ if (pdata->optype == WCRYPTO_INFLATE) -+ opdata.flush = WCRYPTO_SYNC_FLUSH; -+ else -+ opdata.flush = WCRYPTO_FINISH; -+ -+ out_len = bd_pool[0].dst_len; -+ -+ while(1) { -+ i = count % MAX_POOL_LENTH; -+ opdata.in = bd_pool[i].src; -+ opdata.out = bd_pool[i].dst; -+ opdata.in_len = bd_pool[i].src_len; -+ opdata.avail_out = out_len; -+ -+ ret = wcrypto_do_comp(ctx, &opdata, NULL); -+ if (ret || opdata.status == WCRYPTO_DECOMP_END_NOSPACE || -+ opdata.status == WD_IN_EPARA || opdata.status == WD_VERIFY_ERR) { -+ ZIP_TST_PRT("wd comp, invalid or incomplete data! " -+ "ret(%d), req.status(%u)\n", ret, opdata.status); -+ break; -+ } -+ -+ count++; -+ bd_pool[i].dst_len = opdata.produced; -+ if (get_run_state() == 0) -+ break; -+ } -+ wcrypto_del_comp_ctx(ctx); -+ -+ // ZIP_TST_PRT("valid pool len: %u, send count BD: %u, output len: %u!\n", -+ // MAX_POOL_LENTH, count, opdata.produced); -+ add_recv_data(count, g_pktlen); -+ -+ return NULL; -+ -+} -+ -+static void *zip_wd_blk_async_run(void *arg) -+{ -+ thread_data *pdata = (thread_data *)arg; -+ struct wcrypto_comp_ctx_setup comp_setup; -+ struct wcrypto_comp_op_data opdata; -+ struct wcrypto_comp_ctx *ctx; -+ struct zip_async_tag *tag; -+ struct wd_queue *queue; -+ struct wd_bd *bd_pool; -+ int try_cnt = 0; -+ u32 out_len = 0; -+ u32 count = 0; -+ int ret, i = 0; -+ -+ if (pdata->td_id > g_thread_num) -+ return NULL; -+ -+ bd_pool = g_thread_queue.bd_res[pdata->td_id].bds; -+ queue = g_thread_queue.bd_res[pdata->td_id].queue; -+ memset(&comp_setup, 0, sizeof(comp_setup)); -+ memset(&opdata, 0, sizeof(opdata)); -+ -+ comp_setup.br.alloc = (void *)wd_alloc_blk; -+ comp_setup.br.free = (void *)wd_free_blk; -+ comp_setup.br.iova_map = (void *)wd_blk_iova_map; -+ comp_setup.br.iova_unmap = (void *)wd_blk_iova_unmap; -+ comp_setup.br.get_bufsize = (void *)wd_blksize; -+ comp_setup.br.usr = g_thread_queue.bd_res[pdata->td_id].pool; -+ -+ comp_setup.alg_type = pdata->alg; -+ comp_setup.op_type = pdata->optype; -+ comp_setup.comp_lv = WCRYPTO_COMP_L8; -+ comp_setup.win_size = WCRYPTO_COMP_WS_8K; -+ comp_setup.stream_mode = WCRYPTO_COMP_STATELESS; -+ comp_setup.cb = zip_async_cb; -+ -+ ctx = wcrypto_create_comp_ctx(queue, &comp_setup); -+ if (!ctx) -+ return NULL; -+ -+ opdata.stream_pos = WCRYPTO_COMP_STREAM_NEW; -+ opdata.alg_type = pdata->alg; -+ opdata.priv = NULL; -+ opdata.status = 0; -+ if (pdata->optype == WCRYPTO_INFLATE) -+ opdata.flush = WCRYPTO_SYNC_FLUSH; -+ else -+ opdata.flush = WCRYPTO_FINISH; -+ -+ out_len = bd_pool[0].dst_len; -+ tag = malloc(sizeof(*tag) * MAX_POOL_LENTH); -+ if (!tag) { -+ ZIP_TST_PRT("failed to malloc zip tag!\n"); -+ goto tag_release; -+ } -+ -+ while(1) { -+ if (get_run_state() == 0) -+ break; -+ -+ i = count % MAX_POOL_LENTH; -+ opdata.in = bd_pool[i].src; -+ opdata.out = bd_pool[i].dst; -+ opdata.in_len = bd_pool[i].src_len; -+ opdata.avail_out = out_len; -+ -+ try_cnt = 0; -+ tag[i].ctx = ctx; -+ tag[i].td_id = pdata->td_id; -+ tag[i].bd_idx = i; -+ -+ ret = wcrypto_do_comp(ctx, &opdata, &tag[i]); -+ if (ret == -WD_EBUSY) { -+ usleep(SEND_USLEEP * try_cnt); -+ try_cnt++; -+ if (try_cnt > MAX_TRY_CNT) { -+ ZIP_TST_PRT("Test compress send fail %d times!\n", MAX_TRY_CNT); -+ try_cnt = 0; -+ } -+ continue; -+ } else if (ret || opdata.status == WCRYPTO_DECOMP_END_NOSPACE || -+ opdata.status == WD_IN_EPARA || opdata.status == WD_VERIFY_ERR) { -+ break; -+ } -+ -+ count++; -+ } -+ -+ while (1) { -+ if (get_recv_time() > 0) // wait Async mode finish recv -+ break; -+ usleep(SEND_USLEEP); -+ } -+ -+tag_release: -+ free(tag); -+ wcrypto_del_comp_ctx(ctx); -+ -+ // ZIP_TST_PRT("valid pool len: %u, send count BD: %u, output len: %u!\n", -+ // MAX_POOL_LENTH, count, opdata.produced); -+ -+ add_send_complete(); -+ -+ return NULL; -+} -+ -+static int zip_wd_sync_threads(struct acc_option *options) -+{ -+ typedef void *(*zip_sync_run)(void *arg); -+ zip_sync_run wd_zip_sync_run = NULL; -+ thread_data threads_args[THREADS_NUM]; -+ thread_data threads_option; -+ pthread_t tdid[THREADS_NUM]; -+ int i, ret; -+ -+ /* alg param parse and set to thread data */ -+ ret = zip_wd_param_parse(&threads_option, options); -+ if (ret) -+ return ret; -+ -+ if (threads_option.mode == 1) {// stream mode -+ if (threads_option.alg == LZ77_ZSTD) -+ wd_zip_sync_run = zip_wd_stm_lz77_sync_run; -+ else -+ wd_zip_sync_run = zip_wd_stm_sync_run; -+ } else { -+ if (threads_option.alg == LZ77_ZSTD) -+ wd_zip_sync_run = zip_wd_blk_lz77_sync_run; -+ else -+ wd_zip_sync_run = zip_wd_blk_sync_run; -+ } -+ -+ for (i = 0; i < g_thread_num; i++) { -+ threads_args[i].alg = threads_option.alg; -+ threads_args[i].mode = threads_option.mode; -+ threads_args[i].optype = threads_option.optype; -+ threads_args[i].td_id = i; -+ ret = pthread_create(&tdid[i], NULL, wd_zip_sync_run, &threads_args[i]); -+ if (ret) { -+ ZIP_TST_PRT("Create sync thread fail!\n"); -+ goto sync_error; -+ } -+ } -+ -+ /* join thread */ -+ for (i = 0; i < g_thread_num; i++) { -+ ret = pthread_join(tdid[i], NULL); -+ if (ret) { -+ ZIP_TST_PRT("Join sync thread fail!\n"); -+ goto sync_error; -+ } -+ } -+ -+sync_error: -+ return ret; -+} -+ -+static int zip_wd_async_threads(struct acc_option *options) -+{ -+ typedef void *(*zip_async_run)(void *arg); -+ zip_async_run wd_zip_async_run = NULL; -+ thread_data threads_args[THREADS_NUM]; -+ thread_data threads_option; -+ pthread_t tdid[THREADS_NUM]; -+ pthread_t pollid[THREADS_NUM]; -+ int i, ret; -+ -+ /* alg param parse and set to thread data */ -+ ret = zip_wd_param_parse(&threads_option, options); -+ if (ret) -+ return ret; -+ -+ if (threads_option.mode == STREAM_MODE) {// stream mode -+ ZIP_TST_PRT("Stream mode can't support async mode!\n"); -+ return 0; -+ } -+ -+ if (threads_option.alg == LZ77_ZSTD) -+ wd_zip_async_run = zip_wd_blk_lz77_async_run; -+ else -+ wd_zip_async_run = zip_wd_blk_async_run; -+ -+ for (i = 0; i < g_thread_num; i++) { -+ threads_args[i].td_id = i; -+ /* poll thread */ -+ ret = pthread_create(&pollid[i], NULL, zip_wd_poll, &threads_args[i]); -+ if (ret) { -+ ZIP_TST_PRT("Create poll thread fail!\n"); -+ goto async_error; -+ } -+ } -+ -+ for (i = 0; i < g_thread_num; i++) { -+ threads_args[i].alg = threads_option.alg; -+ threads_args[i].mode = threads_option.mode; -+ threads_args[i].optype = threads_option.optype; -+ threads_args[i].td_id = i; -+ ret = pthread_create(&tdid[i], NULL, wd_zip_async_run, &threads_args[i]); -+ if (ret) { -+ ZIP_TST_PRT("Create async thread fail!\n"); -+ goto async_error; -+ } -+ } -+ -+ /* join thread */ -+ for (i = 0; i < g_thread_num; i++) { -+ ret = pthread_join(tdid[i], NULL); -+ if (ret) { -+ ZIP_TST_PRT("Join async thread fail!\n"); -+ goto async_error; -+ } -+ } -+ -+ for (i = 0; i < g_thread_num; i++) { -+ ret = pthread_join(pollid[i], NULL); -+ if (ret) { -+ ZIP_TST_PRT("Join poll thread fail!\n"); -+ goto async_error; -+ } -+ } -+ -+async_error: -+ return ret; -+} -+ -+int zip_wd_benchmark(struct acc_option *options) -+{ -+ u32 ptime; -+ int ret; -+ -+ g_thread_num = options->threads; -+ g_pktlen = options->pktlen; -+ -+ if (options->optype >= WCRYPTO_DIR_MAX * 2) { -+ ZIP_TST_PRT("ZIP optype error: %u\n", options->optype); -+ return -EINVAL; -+ } -+ -+ ret = init_zip_wd_queue(options); -+ if (ret) -+ return ret; -+ -+ ret = load_file_data(options->algname, options->pktlen, options->optype); -+ if (ret) -+ return ret; -+ -+ get_pid_cpu_time(&ptime); -+ time_start(options->times); -+ if (options->syncmode) -+ ret = zip_wd_async_threads(options); -+ else -+ ret = zip_wd_sync_threads(options); -+ cal_perfermance_data(options, ptime); -+ if (ret) -+ return ret; -+ -+ ret = save_file_data(options->algname, options->pktlen, options->optype); -+ if (ret) -+ return ret; -+ -+ uninit_zip_wd_queue(); -+ -+ return 0; -+} -diff --git a/uadk_tool/benchmark/zip_wd_benchmark.h b/uadk_tool/benchmark/zip_wd_benchmark.h -new file mode 100644 -index 0000000..86ef497 ---- /dev/null -+++ b/uadk_tool/benchmark/zip_wd_benchmark.h -@@ -0,0 +1,6 @@ -+/* SPDX-License-Identifier: Apache-2.0 */ -+#ifndef ZIP_WD_BENCHMARK_H -+#define ZIP_WD_BENCHMARK_H -+ -+extern int zip_wd_benchmark(struct acc_option *options); -+#endif /* ZIP_WD_BENCHMARK_H */ --- -2.27.0 - diff --git a/0138-drv-qm-fix-spin-lock-destroy.patch b/0138-drv-qm-fix-spin-lock-destroy.patch deleted file mode 100644 index 5ca5617..0000000 --- a/0138-drv-qm-fix-spin-lock-destroy.patch +++ /dev/null @@ -1,115 +0,0 @@ -From 9c9794bda2151eb66432a099b028d28628a43406 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Mon, 18 Jul 2022 10:17:05 +0800 -Subject: [PATCH 153/183] drv/qm: fix spin lock destroy - -Spin lock must be destroyed when initialization fails. -Fix missing destroy pool lock and q_info lock. - -Signed-off-by: Wenkai Lin -Signed-off-by: Weili Qian ---- - drv/hisi_qm_udrv.c | 49 ++++++++++++++++++++++++++++++++-------------- - 1 file changed, 34 insertions(+), 15 deletions(-) - -diff --git a/drv/hisi_qm_udrv.c b/drv/hisi_qm_udrv.c -index 9eaf60c..f1468a4 100644 ---- a/drv/hisi_qm_udrv.c -+++ b/drv/hisi_qm_udrv.c -@@ -335,6 +335,14 @@ err_out: - return ret; - } - -+static void hisi_qm_clear_info(struct hisi_qp *qp) -+{ -+ struct hisi_qm_queue_info *q_info = &qp->q_info; -+ -+ pthread_spin_destroy(&q_info->lock); -+ hisi_qm_unset_region(qp->h_ctx, q_info); -+} -+ - static int get_free_num(struct hisi_qm_queue_info *q_info) - { - /* The device should reserve one buffer. */ -@@ -374,7 +382,7 @@ handle_t hisi_qm_alloc_qp(struct hisi_qm_priv *config, handle_t ctx) - qp->h_sgl_pool = hisi_qm_create_sglpool(HISI_SGL_NUM_IN_BD, - HISI_SGE_NUM_IN_SGL); - if (!qp->h_sgl_pool) -- goto out_qp; -+ goto free_info; - - ret = wd_ctx_start(qp->h_ctx); - if (ret) -@@ -390,6 +398,8 @@ handle_t hisi_qm_alloc_qp(struct hisi_qm_priv *config, handle_t ctx) - - free_pool: - hisi_qm_destroy_sglpool(qp->h_sgl_pool); -+free_info: -+ hisi_qm_clear_info(qp); - out_qp: - free(qp); - out: -@@ -598,6 +608,23 @@ static struct hisi_sgl *hisi_qm_align_sgl(const void *sgl, __u32 sge_num) - return sgl_align; - } - -+static void hisi_qm_free_sglpool(struct hisi_sgl_pool *pool) -+{ -+ int i; -+ -+ if (pool->sgl) { -+ for (i = 0; i < pool->sgl_num; i++) -+ if (pool->sgl[i]) -+ free(pool->sgl[i]); -+ -+ free(pool->sgl); -+ } -+ -+ if (pool->sgl_align) -+ free(pool->sgl_align); -+ free(pool); -+} -+ - handle_t hisi_qm_create_sglpool(__u32 sgl_num, __u32 sge_num) - { - struct hisi_sgl_pool *sgl_pool; -@@ -650,30 +677,22 @@ handle_t hisi_qm_create_sglpool(__u32 sgl_num, __u32 sge_num) - return (handle_t)sgl_pool; - - err_out: -- hisi_qm_destroy_sglpool((handle_t)sgl_pool); -+ hisi_qm_free_sglpool(sgl_pool); - return (handle_t)0; - } - - void hisi_qm_destroy_sglpool(handle_t sgl_pool) - { -- struct hisi_sgl_pool *pool = (struct hisi_sgl_pool *)sgl_pool; -- int i; -+ struct hisi_sgl_pool *pool; - -- if (!pool) { -+ if (!sgl_pool) { - WD_ERR("invalid: sgl_pool is NULL!\n"); - return; - } -- if (pool->sgl) { -- for (i = 0; i < pool->sgl_num; i++) -- if (pool->sgl[i]) -- free(pool->sgl[i]); -- -- free(pool->sgl); -- } - -- if (pool->sgl_align) -- free(pool->sgl_align); -- free(pool); -+ pool = (struct hisi_sgl_pool *)sgl_pool; -+ pthread_spin_destroy(&pool->lock); -+ hisi_qm_free_sglpool(pool); - } - - static struct hisi_sgl *hisi_qm_sgl_pop(struct hisi_sgl_pool *pool) --- -2.27.0 - diff --git a/0139-drv-qm-modify-the-lock-for-send-and-receive-BD.patch b/0139-drv-qm-modify-the-lock-for-send-and-receive-BD.patch deleted file mode 100644 index d4fc26c..0000000 --- a/0139-drv-qm-modify-the-lock-for-send-and-receive-BD.patch +++ /dev/null @@ -1,144 +0,0 @@ -From 2004801f44c0b6259b051e5a55bde5c54306fd63 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Mon, 18 Jul 2022 10:17:06 +0800 -Subject: [PATCH 154/183] drv/qm: modify the lock for send and receive BD - -If the same lock is used for BD receiving and BD sending, -the BD receiving and BD sending threads compete for lock in -asynchronous scenarios, affecting tasks performance. - -Signed-off-by: Weili Qian ---- - drv/hisi_qm_udrv.c | 38 +++++++++++++++++++++++++------------- - include/hisi_qm_udrv.h | 3 ++- - 2 files changed, 27 insertions(+), 14 deletions(-) - -diff --git a/drv/hisi_qm_udrv.c b/drv/hisi_qm_udrv.c -index f1468a4..da756c4 100644 ---- a/drv/hisi_qm_udrv.c -+++ b/drv/hisi_qm_udrv.c -@@ -322,14 +322,22 @@ static int hisi_qm_setup_info(struct hisi_qp *qp, struct hisi_qm_priv *config) - q_info->region_size[UACCE_QFRT_DUS] - sizeof(uint32_t); - q_info->ds_rx_base = q_info->ds_tx_base - sizeof(uint32_t); - -- ret = pthread_spin_init(&q_info->lock, PTHREAD_PROCESS_SHARED); -+ ret = pthread_spin_init(&q_info->rv_lock, PTHREAD_PROCESS_SHARED); - if (ret) { -- WD_DEV_ERR(qp->h_ctx, "failed to init qinfo lock!\n"); -+ WD_DEV_ERR(qp->h_ctx, "failed to init qinfo rv_lock!\n"); - goto err_out; - } - -+ ret = pthread_spin_init(&q_info->sd_lock, PTHREAD_PROCESS_SHARED); -+ if (ret) { -+ WD_DEV_ERR(qp->h_ctx, "failed to init qinfo sd_lock!\n"); -+ goto err_destory_lock; -+ } -+ - return 0; - -+err_destory_lock: -+ pthread_spin_destroy(&q_info->rv_lock); - err_out: - hisi_qm_unset_region(qp->h_ctx, q_info); - return ret; -@@ -339,14 +347,16 @@ static void hisi_qm_clear_info(struct hisi_qp *qp) - { - struct hisi_qm_queue_info *q_info = &qp->q_info; - -- pthread_spin_destroy(&q_info->lock); -+ pthread_spin_destroy(&q_info->sd_lock); -+ pthread_spin_destroy(&q_info->rv_lock); - hisi_qm_unset_region(qp->h_ctx, q_info); - } - - static int get_free_num(struct hisi_qm_queue_info *q_info) - { - /* The device should reserve one buffer. */ -- return (QM_Q_DEPTH - 1) - q_info->used_num; -+ return (QM_Q_DEPTH - 1) - -+ __atomic_load_n(&q_info->used_num, __ATOMIC_RELAXED); - } - - int hisi_qm_get_free_sqe_num(handle_t h_qp) -@@ -441,10 +451,10 @@ int hisi_qm_send(handle_t h_qp, const void *req, __u16 expect, __u16 *count) - return -WD_HW_EACCESS; - } - -- pthread_spin_lock(&q_info->lock); -+ pthread_spin_lock(&q_info->sd_lock); - free_num = get_free_num(q_info); - if (!free_num) { -- pthread_spin_unlock(&q_info->lock); -+ pthread_spin_unlock(&q_info->sd_lock); - return -WD_EBUSY; - } - -@@ -455,10 +465,12 @@ int hisi_qm_send(handle_t h_qp, const void *req, __u16 expect, __u16 *count) - tail = (tail + send_num) % QM_Q_DEPTH; - q_info->db(q_info, QM_DBELL_CMD_SQ, tail, 0); - q_info->sq_tail_index = tail; -- q_info->used_num += send_num; -+ -+ /* Make sure used_num is changed before the next thread gets free sqe. */ -+ __atomic_add_fetch(&q_info->used_num, send_num, __ATOMIC_RELAXED); - *count = send_num; - -- pthread_spin_unlock(&q_info->lock); -+ pthread_spin_unlock(&q_info->sd_lock); - - return 0; - } -@@ -469,21 +481,21 @@ static int hisi_qm_recv_single(struct hisi_qm_queue_info *q_info, void *resp) - struct cqe *cqe; - __u16 i, j; - -- pthread_spin_lock(&q_info->lock); -+ pthread_spin_lock(&q_info->rv_lock); - i = q_info->cq_head_index; - cqe = q_info->cq_base + i * sizeof(struct cqe); - - if (q_info->cqc_phase == CQE_PHASE(cqe)) { - j = CQE_SQ_HEAD_INDEX(cqe); - if (j >= QM_Q_DEPTH) { -- pthread_spin_unlock(&q_info->lock); -+ pthread_spin_unlock(&q_info->rv_lock); - WD_DEV_ERR(qp->h_ctx, "CQE_SQ_HEAD_INDEX(%u) error!\n", j); - return -WD_EIO; - } - memcpy(resp, (void *)((uintptr_t)q_info->sq_base + - j * q_info->sqe_size), q_info->sqe_size); - } else { -- pthread_spin_unlock(&q_info->lock); -+ pthread_spin_unlock(&q_info->rv_lock); - return -WD_EAGAIN; - } - -@@ -500,8 +512,8 @@ static int hisi_qm_recv_single(struct hisi_qm_queue_info *q_info, void *resp) - q_info->cq_head_index = i; - q_info->sq_head_index = i; - -- q_info->used_num--; -- pthread_spin_unlock(&q_info->lock); -+ __atomic_sub_fetch(&q_info->used_num, 1, __ATOMIC_RELAXED); -+ pthread_spin_unlock(&q_info->rv_lock); - - return 0; - } -diff --git a/include/hisi_qm_udrv.h b/include/hisi_qm_udrv.h -index 88758ac..92333ed 100644 ---- a/include/hisi_qm_udrv.h -+++ b/include/hisi_qm_udrv.h -@@ -75,7 +75,8 @@ struct hisi_qm_queue_info { - __u16 hw_type; - __u32 idx; - bool cqc_phase; -- pthread_spinlock_t lock; -+ pthread_spinlock_t sd_lock; -+ pthread_spinlock_t rv_lock; - unsigned long region_size[UACCE_QFRT_MAX]; - bool epoll_en; - }; --- -2.27.0 - diff --git a/0140-uadk-v1-fix-goto-warning.patch b/0140-uadk-v1-fix-goto-warning.patch deleted file mode 100644 index d9a2c1b..0000000 --- a/0140-uadk-v1-fix-goto-warning.patch +++ /dev/null @@ -1,475 +0,0 @@ -From 746d250131c3727e658f11f37fbb0a8cb18d1b18 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sat, 23 Jul 2022 16:50:22 +0800 -Subject: [PATCH 155/183] uadk: v1: fix goto warning - -1. The goto statement can only jump down. -2. Fix wd_recv return value check. - -Signed-off-by: Wenkai Lin ---- - v1/drv/hisi_rng_udrv.c | 4 +-- - v1/wd.c | 33 ++++++++++--------- - v1/wd_comp.c | 25 ++++++++------- - v1/wd_dh.c | 72 ++++++++++++++++++++++++++---------------- - v1/wd_ecc.c | 15 ++++++--- - v1/wd_rng.c | 54 +++++++++++++++++-------------- - v1/wd_rsa.c | 71 +++++++++++++++++++++++++---------------- - 7 files changed, 164 insertions(+), 110 deletions(-) - -diff --git a/v1/drv/hisi_rng_udrv.c b/v1/drv/hisi_rng_udrv.c -index a66bca5..b86a948 100644 ---- a/v1/drv/hisi_rng_udrv.c -+++ b/v1/drv/hisi_rng_udrv.c -@@ -97,7 +97,6 @@ static int rng_read(struct rng_queue_info *info, struct wcrypto_rng_msg *msg) - int val; - - do { --recv_again: - val = wd_reg_read((void *)((uintptr_t)info->mmio_base + - RNG_NUM_OFFSET)); - if (!val) { -@@ -105,8 +104,9 @@ recv_again: - WD_ERR("read random data timeout\n"); - break; - } -+ - usleep(1); -- goto recv_again; -+ continue; - } - - recv_count = 0; -diff --git a/v1/wd.c b/v1/wd.c -index 8ef83c6..2c435ba 100644 ---- a/v1/wd.c -+++ b/v1/wd.c -@@ -524,7 +524,7 @@ static int get_queue_from_dev(struct wd_queue *q, const struct dev_info *dev) - qinfo->fd = open(q_path, O_RDWR | O_CLOEXEC); - if (qinfo->fd == -1) { - WD_ERR("open %s failed, errno = %d!\n", q_path, errno); -- return -ENODEV; -+ return -WD_ENODEV; - } - - qinfo->hw_type = dev->api; -@@ -575,23 +575,26 @@ int wd_request_queue(struct wd_queue *q) - return -WD_ENOMEM; - }; - q->qinfo = dinfop + 1; --try_again: -- ret = find_available_res(q, dinfop, NULL); -- if (ret) { -- WD_ERR("cannot find available device\n"); -- goto err_with_dev; -- } - -- ret = get_queue_from_dev(q, (const struct dev_info *)dinfop); -- if (ret == -WD_ENODEV) { -- try_cnt++; -- if (try_cnt < _TRY_REQUEST_TIMES) { -+ do { -+ ret = find_available_res(q, dinfop, NULL); -+ if (ret) { -+ WD_ERR("cannot find available device\n"); -+ goto err_with_dev; -+ } -+ -+ ret = get_queue_from_dev(q, (const struct dev_info *)dinfop); -+ if (!ret) { -+ break; -+ } else { -+ if (try_cnt++ > _TRY_REQUEST_TIMES) { -+ WD_ERR("fail to get queue!\n"); -+ goto err_with_dev; -+ } -+ - memset(dinfop, 0, sizeof(*dinfop)); -- goto try_again; - } -- WD_ERR("fail to get queue!\n"); -- goto err_with_dev; -- } -+ } while (true); - - ret = drv_open(q); - if (ret) { -diff --git a/v1/wd_comp.c b/v1/wd_comp.c -index 33546d4..2f1b8bd 100644 ---- a/v1/wd_comp.c -+++ b/v1/wd_comp.c -@@ -243,19 +243,22 @@ int wcrypto_do_comp(void *ctx, struct wcrypto_comp_op_data *opdata, void *tag) - return ret; - - resp = (void *)(uintptr_t)cctx->ctx_id; --recv_again: -- ret = wd_recv(cctx->q, (void **)&resp); -- if (ret == -WD_HW_EACCESS) { -- WD_ERR("wd_recv hw err!\n"); -- goto err_put_cookie; -- } else if (ret == 0) { -- if (++recv_count > MAX_RETRY_COUNTS) { -- WD_ERR("wd_recv timeout fail!\n"); -- ret = -ETIMEDOUT; -+ -+ do { -+ ret = wd_recv(cctx->q, (void **)&resp); -+ if (ret > 0) { -+ break; -+ } else if (!ret) { -+ if (++recv_count > MAX_RETRY_COUNTS) { -+ WD_ERR("wd_recv timeout fail!\n"); -+ ret = -ETIMEDOUT; -+ goto err_put_cookie; -+ } -+ } else { -+ WD_ERR("failed to recv msg: ret = %d!\n", ret); - goto err_put_cookie; - } -- goto recv_again; -- } -+ } while (true); - - opdata->consumed = resp->in_cons; - opdata->produced = resp->produced; -diff --git a/v1/wd_dh.c b/v1/wd_dh.c -index 49f52d9..1164f2c 100644 ---- a/v1/wd_dh.c -+++ b/v1/wd_dh.c -@@ -307,6 +307,31 @@ static int do_dh_prepare(struct wcrypto_dh_op_data *opdata, - return 0; - } - -+static int dh_send(struct wcrypto_dh_ctx *ctx, struct wcrypto_dh_msg *req) -+{ -+ uint32_t tx_cnt = 0; -+ int ret; -+ -+ do { -+ ret = wd_send(ctx->q, req); -+ if (!ret) { -+ break; -+ } else if (ret == -WD_EBUSY) { -+ if (tx_cnt++ > DH_RESEND_CNT) { -+ WD_ERR("do dh send cnt %u, exit!\n", tx_cnt); -+ break; -+ } -+ -+ usleep(1); -+ } else { -+ WD_ERR("do dh wd_send err!\n"); -+ break; -+ } -+ } while (true); -+ -+ return ret; -+} -+ - int wcrypto_do_dh(void *ctx, struct wcrypto_dh_op_data *opdata, void *tag) - { - struct wcrypto_dh_msg *resp = NULL; -@@ -314,46 +339,39 @@ int wcrypto_do_dh(void *ctx, struct wcrypto_dh_op_data *opdata, void *tag) - struct wcrypto_dh_cookie *cookie; - struct wcrypto_dh_msg *req; - uint32_t rx_cnt = 0; -- uint32_t tx_cnt = 0; - int ret; - - ret = do_dh_prepare(opdata, &cookie, ctxt, &req, tag); - if (unlikely(ret)) - return ret; - --send_again: -- ret = wd_send(ctxt->q, req); -- if (ret == -WD_EBUSY) { -- usleep(1); -- if (tx_cnt++ < DH_RESEND_CNT) -- goto send_again; -- else { -- WD_ERR("do dh send cnt %u, exit!\n", tx_cnt); -- goto fail_with_cookie; -- } -- } else if (unlikely(ret)) { -- WD_ERR("do dh wd_send err!\n"); -+ ret = dh_send(ctxt, req); -+ if (unlikely(ret)) - goto fail_with_cookie; -- } - - if (tag) - return ret; - - resp = (void *)(uintptr_t)ctxt->ctx_id; --recv_again: -- ret = wd_recv(ctxt->q, (void **)&resp); -- if (!ret) { -- if (unlikely(rx_cnt++ >= DH_RECV_MAX_CNT)) { -- WD_ERR("failed to receive: timeout!\n"); -- return -WD_ETIMEDOUT; -- } else if (balance > DH_BALANCE_THRHD) { -- usleep(1); -+ -+ do { -+ ret = wd_recv(ctxt->q, (void **)&resp); -+ if (ret > 0) { -+ break; -+ } else if (!ret) { -+ if (unlikely(rx_cnt++ >= DH_RECV_MAX_CNT)) { -+ WD_ERR("failed to receive: timeout!\n"); -+ ret = -WD_ETIMEDOUT; -+ goto fail_with_cookie; -+ } -+ -+ if (balance > DH_BALANCE_THRHD) -+ usleep(1); -+ } else { -+ WD_ERR("do dh wd_recv err!\n"); -+ goto fail_with_cookie; - } -- goto recv_again; -- } else if (unlikely(ret < 0)) { -- WD_ERR("do dh wd_recv err!\n"); -- goto fail_with_cookie; -- } -+ } while (true); - - balance = rx_cnt; - opdata->pri = (void *)resp->out; -diff --git a/v1/wd_ecc.c b/v1/wd_ecc.c -index 58dabfc..4f9ec53 100644 ---- a/v1/wd_ecc.c -+++ b/v1/wd_ecc.c -@@ -1523,17 +1523,20 @@ static int ecc_send(struct wcrypto_ecc_ctx *ctx, struct wcrypto_ecc_msg *req) - - do { - ret = wd_send(ctx->q, req); -- if (ret == -WD_EBUSY) { -+ if (!ret) { -+ break; -+ } else if (ret == -WD_EBUSY) { - if (tx_cnt++ >= ECC_RESEND_CNT) { - WD_ERR("failed to send: retry exit!\n"); - break; - } -+ - usleep(1); - } else if (unlikely(ret)) { - WD_ERR("failed to send: send error = %d!\n", ret); - break; - } -- } while (ret); -+ } while (true); - - return ret; - } -@@ -1549,7 +1552,9 @@ static int ecc_sync_recv(struct wcrypto_ecc_ctx *ctx, - - do { - ret = wd_recv(ctx->q, (void **)&resp); -- if (!ret) { -+ if (ret > 0) { -+ break; -+ } else if (!ret) { - if (rx_cnt++ >= ECC_RECV_MAX_CNT) { - WD_ERR("failed to recv: timeout!\n"); - return -WD_ETIMEDOUT; -@@ -1557,11 +1562,11 @@ static int ecc_sync_recv(struct wcrypto_ecc_ctx *ctx, - - if (balance > ECC_BALANCE_THRHD) - usleep(1); -- } else if (unlikely(ret < 0)) { -+ } else { - WD_ERR("failed to recv: error = %d!\n", ret); - return ret; - } -- } while (!ret); -+ } while (true); - - balance = rx_cnt; - opdata->out = resp->out; -diff --git a/v1/wd_rng.c b/v1/wd_rng.c -index 7b3bda3..2077578 100644 ---- a/v1/wd_rng.c -+++ b/v1/wd_rng.c -@@ -174,7 +174,7 @@ int wcrypto_rng_poll(struct wd_queue *q, unsigned int num) - if (!ret) - break; - -- if (ret == -WD_EINVAL) { -+ if (ret < 0) { - WD_ERR("recv err at trng poll!\n"); - return ret; - } -@@ -241,37 +241,45 @@ int wcrypto_do_rng(void *ctx, struct wcrypto_rng_op_data *opdata, void *tag) - if (ret) - return ret; - --send_again: -- ret = wd_send(ctxt->q, req); -- if (ret) { -- if (++tx_cnt > RNG_RESEND_CNT) { -- WD_ERR("do trng send cnt %u, exit!\n", tx_cnt); -+ do { -+ ret = wd_send(ctxt->q, req); -+ if (!ret) { -+ break; -+ } else if (ret == -WD_EBUSY) { -+ if (++tx_cnt > RNG_RESEND_CNT) { -+ WD_ERR("do trng send cnt %u, exit!\n", tx_cnt); -+ goto fail_with_cookie; -+ } -+ -+ usleep(1); -+ } else { -+ WD_ERR("do rng wd_send err!\n"); - goto fail_with_cookie; - } -- usleep(1); -- goto send_again; -- } -+ } while (true); - - if (tag) - return ret; - - resp = (void *)(uintptr_t)ctxt->ctx_id; --recv_again: -- ret = wd_recv(ctxt->q, (void **)&resp); -- if (!ret) { -- if (++rx_cnt > RNG_RECV_CNT) { -- WD_ERR("do trng recv cnt %u, exit!\n", rx_cnt); -- ret = -WD_ETIMEDOUT; -+ -+ do { -+ ret = wd_recv(ctxt->q, (void **)&resp); -+ if (ret > 0) { -+ break; -+ } else if (!ret) { -+ if (++rx_cnt > RNG_RECV_CNT) { -+ WD_ERR("do trng recv cnt %u, exit!\n", rx_cnt); -+ ret = -WD_ETIMEDOUT; -+ goto fail_with_cookie; -+ } -+ -+ usleep(1); -+ } else { -+ WD_ERR("do trng recv err!\n"); - goto fail_with_cookie; - } -- usleep(1); -- goto recv_again; -- } -- -- if (ret < 0) { -- WD_ERR("do trng recv err!\n"); -- goto fail_with_cookie; -- } -+ } while (true); - - opdata->out_bytes = resp->out_bytes; - ret = WD_SUCCESS; -diff --git a/v1/wd_rsa.c b/v1/wd_rsa.c -index 6ba29d7..f0cdda7 100644 ---- a/v1/wd_rsa.c -+++ b/v1/wd_rsa.c -@@ -970,6 +970,31 @@ static int do_rsa_prepare(struct wcrypto_rsa_ctx *ctxt, - return 0; - } - -+static int rsa_send(struct wcrypto_rsa_ctx *ctx, struct wcrypto_rsa_msg *req) -+{ -+ uint32_t tx_cnt = 0; -+ int ret; -+ -+ do { -+ ret = wd_send(ctx->q, req); -+ if (!ret) { -+ break; -+ } else if (ret == -WD_EBUSY) { -+ if (tx_cnt++ > RSA_RESEND_CNT) { -+ WD_ERR("do rsa send cnt %u, exit!\n", tx_cnt); -+ break; -+ } -+ -+ usleep(1); -+ } else { -+ WD_ERR("do rsa wd_send err!\n"); -+ break; -+ } -+ } while (true); -+ -+ return ret; -+} -+ - int wcrypto_do_rsa(void *ctx, struct wcrypto_rsa_op_data *opdata, void *tag) - { - struct wcrypto_rsa_msg *resp = NULL; -@@ -977,46 +1002,38 @@ int wcrypto_do_rsa(void *ctx, struct wcrypto_rsa_op_data *opdata, void *tag) - struct wcrypto_rsa_cookie *cookie; - struct wcrypto_rsa_msg *req; - uint32_t rx_cnt = 0; -- uint32_t tx_cnt = 0; - int ret; - - ret = do_rsa_prepare(ctxt, opdata, &cookie, &req, tag); - if (unlikely(ret)) - return ret; - --send_again: -- ret = wd_send(ctxt->q, req); -- if (ret == -WD_EBUSY) { -- usleep(1); -- if (tx_cnt++ < RSA_RESEND_CNT) -- goto send_again; -- else { -- WD_ERR("do rsa send cnt %u, exit!\n", tx_cnt); -- goto fail_with_cookie; -- } -- } else if (unlikely(ret)) { -- WD_ERR("do rsa wd_send err!\n"); -+ ret = rsa_send(ctxt, req); -+ if (unlikely(ret)) - goto fail_with_cookie; -- } - - if (tag) - return ret; - - resp = (void *)(uintptr_t)ctxt->ctx_id; --recv_again: -- ret = wd_recv(ctxt->q, (void **)&resp); -- if (!ret) { -- if (unlikely(rx_cnt++ >= RSA_RECV_MAX_CNT)) { -- WD_ERR("failed to recv: timeout!\n"); -- return -WD_ETIMEDOUT; -- } else if (balance > RSA_BALANCE_THRHD) { -- usleep(1); -+ do { -+ ret = wd_recv(ctxt->q, (void **)&resp); -+ if (ret > 0) { -+ break; -+ } else if (!ret) { -+ if (unlikely(rx_cnt++ >= RSA_RECV_MAX_CNT)) { -+ WD_ERR("failed to recv: timeout!\n"); -+ ret = -WD_ETIMEDOUT; -+ goto fail_with_cookie; -+ } -+ -+ if (balance > RSA_BALANCE_THRHD) -+ usleep(1); -+ } else { -+ WD_ERR("do rsa wd_recv err!\n"); -+ goto fail_with_cookie; - } -- goto recv_again; -- } else if (unlikely(ret < 0)) { -- WD_ERR("do rsa wd_recv err!\n"); -- goto fail_with_cookie; -- } -+ } while (true); - - balance = rx_cnt; - opdata->out = (void *)resp->out; --- -2.27.0 - diff --git a/0141-uadk-fix-comment-blank.patch b/0141-uadk-fix-comment-blank.patch deleted file mode 100644 index aa7c0bf..0000000 --- a/0141-uadk-fix-comment-blank.patch +++ /dev/null @@ -1,68 +0,0 @@ -From 28904d5266bc827b05ac1beb5e819878b56fc3f2 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sat, 23 Jul 2022 16:50:23 +0800 -Subject: [PATCH 156/183] uadk: fix comment blank - -Use 1 blank space(' ') instead of TAB('\t') -between the right comment and the previous code. - -Signed-off-by: Wenkai Lin ---- - v1/drv/dummy_drv.c | 4 ++-- - v1/internal/dummy_hw_usr_if.h | 2 +- - v1/wd_util.h | 4 ++-- - 3 files changed, 5 insertions(+), 5 deletions(-) - -diff --git a/v1/drv/dummy_drv.c b/v1/drv/dummy_drv.c -index 206fa2b..f551b79 100644 ---- a/v1/drv/dummy_drv.c -+++ b/v1/drv/dummy_drv.c -@@ -30,8 +30,8 @@ - - struct dummy_q_priv { - int ver; -- int head; /* queue head */ -- int resp_tail; /* resp tail in the queue */ -+ int head; /* queue head */ -+ int resp_tail; /* resp tail in the queue */ - /* so in the user side: when add to queue, head++ but don't exceed resp_tail. - * when get back from the queue, resp_tail++ but don't exceed tail. - * in the kernel side: when get from queue, tail++ but don't exceed head-1 */ -diff --git a/v1/internal/dummy_hw_usr_if.h b/v1/internal/dummy_hw_usr_if.h -index c35f75d..3a9df48 100644 ---- a/v1/internal/dummy_hw_usr_if.h -+++ b/v1/internal/dummy_hw_usr_if.h -@@ -35,7 +35,7 @@ - - /* the format of the device io space, which is of drv */ - struct dummy_hw_queue_reg { -- char hw_tag[DUMMY_HW_TAG_SZ]; /* should be "WDDUMMY\0" */ -+ char hw_tag[DUMMY_HW_TAG_SZ]; /* should be "WDDUMMY\0" */ - struct ring_bd ring[Q_BDS]; /* in real hardware, this is good to be - in memory space, and will be fast - for communication. here we keep it -diff --git a/v1/wd_util.h b/v1/wd_util.h -index d1642f8..e69b5f9 100644 ---- a/v1/wd_util.h -+++ b/v1/wd_util.h -@@ -359,7 +359,7 @@ struct wcrypto_ecc_out { - static inline void wd_reg_write(void *reg_addr, uint32_t value) - { - *((uint32_t *)reg_addr) = value; -- wmb(); /* load fence */ -+ wmb(); /* load fence */ - } - - static inline uint32_t wd_reg_read(void *reg_addr) -@@ -367,7 +367,7 @@ static inline uint32_t wd_reg_read(void *reg_addr) - uint32_t temp; - - temp = *((uint32_t *)reg_addr); -- rmb(); /* load fence */ -+ rmb(); /* load fence */ - - return temp; - } --- -2.27.0 - diff --git a/0142-uadk-fix-different-name-in-declaration-and-definitio.patch b/0142-uadk-fix-different-name-in-declaration-and-definitio.patch deleted file mode 100644 index f853509..0000000 --- a/0142-uadk-fix-different-name-in-declaration-and-definitio.patch +++ /dev/null @@ -1,155 +0,0 @@ -From 190cfeed8f1970f886e2fa3d9a7f45ad0a779966 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sat, 23 Jul 2022 16:50:24 +0800 -Subject: [PATCH 157/183] uadk: fix different name in declaration and - definition - -Fix static check warnings, which are described like this, " -Parameter 2 'void ** resp' of function 'dummy_get_from_dio_q' -has different name than previous declaration 'void ** req'". - -Signed-off-by: Wenkai Lin ---- - v1/drv/dummy_drv.h | 2 +- - v1/wd_aead.c | 10 +++++----- - v1/wd_digest.c | 12 ++++++------ - wd_ecc.c | 6 +++--- - 4 files changed, 15 insertions(+), 15 deletions(-) - -diff --git a/v1/drv/dummy_drv.h b/v1/drv/dummy_drv.h -index 7dca1a1..392a47e 100644 ---- a/v1/drv/dummy_drv.h -+++ b/v1/drv/dummy_drv.h -@@ -28,7 +28,7 @@ - int dummy_set_queue_dio(struct wd_queue *q); - void dummy_unset_queue_dio(struct wd_queue *q); - int dummy_add_to_dio_q(struct wd_queue *q, void **req, __u32 num); --int dummy_get_from_dio_q(struct wd_queue *q, void **req, __u32 num); -+int dummy_get_from_dio_q(struct wd_queue *q, void **resp, __u32 num); - void dummy_flush(struct wd_queue *q); - void *dummy_reserve_mem(struct wd_queue *q, size_t size); - -diff --git a/v1/wd_aead.c b/v1/wd_aead.c -index 4ff690a..4028895 100644 ---- a/v1/wd_aead.c -+++ b/v1/wd_aead.c -@@ -566,7 +566,7 @@ static int param_check(struct wcrypto_aead_ctx *a_ctx, - return WD_SUCCESS; - } - --int wcrypto_burst_aead(void *a_ctx, struct wcrypto_aead_op_data **a_opdata, -+int wcrypto_burst_aead(void *a_ctx, struct wcrypto_aead_op_data **opdata, - void **tag, __u32 num) - { - struct wcrypto_aead_cookie *cookies[WCRYPTO_MAX_BURST_NUM] = { NULL }; -@@ -575,7 +575,7 @@ int wcrypto_burst_aead(void *a_ctx, struct wcrypto_aead_op_data **a_opdata, - __u32 i; - int ret; - -- if (param_check(ctxt, a_opdata, tag, num)) -+ if (param_check(ctxt, opdata, tag, num)) - return -WD_EINVAL; - - ret = wd_get_cookies(&ctxt->pool, (void **)cookies, num); -@@ -585,13 +585,13 @@ int wcrypto_burst_aead(void *a_ctx, struct wcrypto_aead_op_data **a_opdata, - } - - for (i = 0; i < num; i++) { -- cookies[i]->tag.priv = a_opdata[i]->priv; -+ cookies[i]->tag.priv = opdata[i]->priv; - req[i] = &cookies[i]->msg; - if (tag) - cookies[i]->tag.wcrypto_tag.tag = tag[i]; - } - -- ret = aead_requests_init(req, a_opdata, ctxt, num); -+ ret = aead_requests_init(req, opdata, ctxt, num); - if (unlikely(ret)) - goto fail_with_cookies; - -@@ -604,7 +604,7 @@ int wcrypto_burst_aead(void *a_ctx, struct wcrypto_aead_op_data **a_opdata, - if (tag) - return ret; - -- ret = aead_recv_sync(ctxt, a_opdata, num); -+ ret = aead_recv_sync(ctxt, opdata, num); - - fail_with_send: - aead_requests_uninit(req, ctxt, num); -diff --git a/v1/wd_digest.c b/v1/wd_digest.c -index 14df736..557ad18 100644 ---- a/v1/wd_digest.c -+++ b/v1/wd_digest.c -@@ -351,7 +351,7 @@ static int param_check(struct wcrypto_digest_ctx *d_ctx, - return WD_SUCCESS; - } - --int wcrypto_burst_digest(void *d_ctx, struct wcrypto_digest_op_data **d_opdata, -+int wcrypto_burst_digest(void *d_ctx, struct wcrypto_digest_op_data **opdata, - void **tag, __u32 num) - { - struct wcrypto_digest_cookie *cookies[WCRYPTO_MAX_BURST_NUM] = {NULL}; -@@ -360,7 +360,7 @@ int wcrypto_burst_digest(void *d_ctx, struct wcrypto_digest_op_data **d_opdata, - __u32 i; - int ret; - -- if (param_check(ctxt, d_opdata, tag, num)) -+ if (param_check(ctxt, opdata, tag, num)) - return -WD_EINVAL; - - ret = wd_get_cookies(&ctxt->pool, (void **)cookies, num); -@@ -370,15 +370,15 @@ int wcrypto_burst_digest(void *d_ctx, struct wcrypto_digest_op_data **d_opdata, - } - - for (i = 0; i < num; i++) { -- cookies[i]->tag.priv = d_opdata[i]->priv; -+ cookies[i]->tag.priv = opdata[i]->priv; - req[i] = &cookies[i]->msg; - if (tag) - cookies[i]->tag.wcrypto_tag.tag = tag[i]; - } - -- digest_requests_init(req, d_opdata, d_ctx, num); -+ digest_requests_init(req, opdata, d_ctx, num); - /* when num is 1, wcrypto_burst_digest supports stream mode */ -- if (num == 1 && !d_opdata[0]->has_next) { -+ if (num == 1 && !opdata[0]->has_next) { - cookies[0]->tag.long_data_len = ctxt->io_bytes; - ctxt->io_bytes = 0; - } -@@ -392,7 +392,7 @@ int wcrypto_burst_digest(void *d_ctx, struct wcrypto_digest_op_data **d_opdata, - if (tag) - return ret; - -- ret = digest_recv_sync(ctxt, d_opdata, num); -+ ret = digest_recv_sync(ctxt, opdata, num); - - fail_with_cookies: - wd_put_cookies(&ctxt->pool, (void **)cookies, num); -diff --git a/wd_ecc.c b/wd_ecc.c -index 4cf287b..60a320b 100644 ---- a/wd_ecc.c -+++ b/wd_ecc.c -@@ -1277,7 +1277,7 @@ struct wd_ecc_out *wd_ecxdh_new_out(handle_t sess) - return create_ecc_out((struct wd_ecc_sess *)sess, ECDH_OUT_PARAM_NUM); - } - --void wd_ecxdh_get_out_params(struct wd_ecc_out *out, struct wd_ecc_point **key) -+void wd_ecxdh_get_out_params(struct wd_ecc_out *out, struct wd_ecc_point **pbk) - { - struct wd_ecc_dh_out *dh_out = (void *)out; - -@@ -1286,8 +1286,8 @@ void wd_ecxdh_get_out_params(struct wd_ecc_out *out, struct wd_ecc_point **key) - return; - } - -- if (key) -- *key = &dh_out->out; -+ if (pbk) -+ *pbk = &dh_out->out; - } - - void wd_ecc_del_in(handle_t sess, struct wd_ecc_in *in) --- -2.27.0 - diff --git a/0143-uadk-fix-pointer-parameters-are-not-checked.patch b/0143-uadk-fix-pointer-parameters-are-not-checked.patch deleted file mode 100644 index 8c20c18..0000000 --- a/0143-uadk-fix-pointer-parameters-are-not-checked.patch +++ /dev/null @@ -1,126 +0,0 @@ -From 45be6faf148734bfcfe5ea1536cae3e4a434cd84 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sat, 23 Jul 2022 16:50:25 +0800 -Subject: [PATCH 158/183] uadk: fix pointer parameters are not checked - -Pointer parameters of the "wd_xxx_poll" function are not checked -whether the pointer is null. Param: "count". - -Signed-off-by: Wenkai Lin ---- - wd_aead.c | 7 ++++++- - wd_cipher.c | 5 +++++ - wd_dh.c | 5 +++++ - wd_digest.c | 5 +++++ - wd_ecc.c | 5 +++++ - wd_rsa.c | 5 +++++ - 6 files changed, 31 insertions(+), 1 deletion(-) - -diff --git a/wd_aead.c b/wd_aead.c -index d43ace1..a1bdb12 100644 ---- a/wd_aead.c -+++ b/wd_aead.c -@@ -611,7 +611,7 @@ int wd_aead_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - __u32 tmp = expt; - int ret; - -- if (!count) { -+ if (unlikely(!count)) { - WD_ERR("invalid: aead poll ctx input param is NULL!\n"); - return -WD_EINVAL; - } -@@ -658,6 +658,11 @@ int wd_aead_poll(__u32 expt, __u32 *count) - handle_t h_ctx = wd_aead_setting.sched.h_sched_ctx; - struct wd_sched *sched = &wd_aead_setting.sched; - -+ if (unlikely(!count)) { -+ WD_ERR("invalid: aead poll input param is NULL!\n"); -+ return -WD_EINVAL; -+ } -+ - return sched->poll_policy(h_ctx, expt, count); - } - -diff --git a/wd_cipher.c b/wd_cipher.c -index 3d00598..884c933 100644 ---- a/wd_cipher.c -+++ b/wd_cipher.c -@@ -568,6 +568,11 @@ int wd_cipher_poll(__u32 expt, __u32 *count) - handle_t h_ctx = wd_cipher_setting.sched.h_sched_ctx; - struct wd_sched *sched = &wd_cipher_setting.sched; - -+ if (unlikely(!count)) { -+ WD_ERR("invalid: cipher poll input param is NULL!\n"); -+ return -WD_EINVAL; -+ } -+ - return sched->poll_policy(h_ctx, expt, count); - } - -diff --git a/wd_dh.c b/wd_dh.c -index 461f04e..41c4a2a 100644 ---- a/wd_dh.c -+++ b/wd_dh.c -@@ -348,6 +348,11 @@ int wd_dh_poll(__u32 expt, __u32 *count) - { - handle_t h_sched_ctx = wd_dh_setting.sched.h_sched_ctx; - -+ if (unlikely(!count)) { -+ WD_ERR("invalid: dh poll count is NULL!\n"); -+ return -WD_EINVAL; -+ } -+ - return wd_dh_setting.sched.poll_policy(h_sched_ctx, expt, count); - } - -diff --git a/wd_digest.c b/wd_digest.c -index 43b4bc5..3e64168 100644 ---- a/wd_digest.c -+++ b/wd_digest.c -@@ -470,6 +470,11 @@ int wd_digest_poll(__u32 expt, __u32 *count) - handle_t h_ctx = wd_digest_setting.sched.h_sched_ctx; - struct wd_sched *sched = &wd_digest_setting.sched; - -+ if (unlikely(!count)) { -+ WD_ERR("invalid: digest poll input param is NULL!\n"); -+ return -WD_EINVAL; -+ } -+ - return sched->poll_policy(h_ctx, expt, count); - } - -diff --git a/wd_ecc.c b/wd_ecc.c -index 60a320b..fed02cb 100644 ---- a/wd_ecc.c -+++ b/wd_ecc.c -@@ -2176,6 +2176,11 @@ int wd_ecc_poll(__u32 expt, __u32 *count) - { - handle_t h_sched_sess = wd_ecc_setting.sched.h_sched_ctx; - -+ if (unlikely(!count)) { -+ WD_ERR("invalid: ecc poll param count is NULL!\n"); -+ return -WD_EINVAL; -+ } -+ - return wd_ecc_setting.sched.poll_policy(h_sched_sess, expt, count); - } - -diff --git a/wd_rsa.c b/wd_rsa.c -index e76da09..89d3450 100644 ---- a/wd_rsa.c -+++ b/wd_rsa.c -@@ -404,6 +404,11 @@ int wd_rsa_poll(__u32 expt, __u32 *count) - { - handle_t h_sched_ctx = wd_rsa_setting.sched.h_sched_ctx; - -+ if (unlikely(!count)) { -+ WD_ERR("invalid: rsa poll count is NULL!\n"); -+ return -WD_EINVAL; -+ } -+ - return wd_rsa_setting.sched.poll_policy(h_sched_ctx, expt, count); - } - --- -2.27.0 - diff --git a/0144-uadk-fix-cqe-phase.patch b/0144-uadk-fix-cqe-phase.patch deleted file mode 100644 index f34e477..0000000 --- a/0144-uadk-fix-cqe-phase.patch +++ /dev/null @@ -1,69 +0,0 @@ -From 2563892aaab90d594b70251253f67efce378c491 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sat, 23 Jul 2022 16:50:26 +0800 -Subject: [PATCH 159/183] uadk: fix cqe phase - -1.Use explicit members from struct cqe is better -2.Use le16_to_cpu to process a __le16 data - -This changes sync from kernel patch: - -crypto: hisilicon - fix endianness verification problem of QM - -Signed-off-by: Wenkai Lin ---- - drv/hisi_qm_udrv.c | 5 +++-- - v1/drv/hisi_qm_udrv.h | 7 ++++--- - 2 files changed, 7 insertions(+), 5 deletions(-) - -diff --git a/drv/hisi_qm_udrv.c b/drv/hisi_qm_udrv.c -index da756c4..39c99d1 100644 ---- a/drv/hisi_qm_udrv.c -+++ b/drv/hisi_qm_udrv.c -@@ -1,6 +1,7 @@ - /* SPDX-License-Identifier: Apache-2.0 */ - /* Copyright 2020-2021 Huawei Technologies Co.,Ltd. All rights reserved. */ - -+#include - #include - #include - #include -@@ -19,8 +20,8 @@ - #define QM_DBELL_SQN_MASK 0x3ff - #define QM_DBELL_CMD_MASK 0xf - #define QM_Q_DEPTH 1024 --#define CQE_PHASE(cq) (((*((__u32 *)(cq) + 3)) >> 16) & 0x1) --#define CQE_SQ_HEAD_INDEX(cq) ((*((__u32 *)(cq) + 2)) & 0xffff) -+#define CQE_PHASE(cq) (__le16_to_cpu((cq)->w7) & 0x1) -+#define CQE_SQ_HEAD_INDEX(cq) (__le16_to_cpu((cq)->sq_head) & 0xffff) - #define VERSION_ID_SHIFT 9 - - #define UACCE_CMD_QM_SET_QP_CTX _IOWR('H', 10, struct hisi_qp_ctx) -diff --git a/v1/drv/hisi_qm_udrv.h b/v1/drv/hisi_qm_udrv.h -index 588da00..0d40d86 100644 ---- a/v1/drv/hisi_qm_udrv.h -+++ b/v1/drv/hisi_qm_udrv.h -@@ -17,6 +17,7 @@ - #ifndef __HISI_QM_DRV_H__ - #define __HISI_QM_DRV_H__ - -+#include - #include - #include "config.h" - #include "v1/wd.h" -@@ -69,9 +70,9 @@ - - - /* cqe shift */ --#define CQE_PHASE(cq) (((*((__u32 *)(cq) + 3)) >> 16) & 0x1) --#define CQE_SQ_NUM(cq) ((*((__u32 *)(cq) + 2)) >> 16) --#define CQE_SQ_HEAD_INDEX(cq) ((*((__u32 *)(cq) + 2)) & 0xffff) -+#define CQE_PHASE(cq) (__le16_to_cpu((cq)->w7) & 0x1) -+#define CQE_SQ_NUM(cq) __le16_to_cpu((cq)->sq_num) -+#define CQE_SQ_HEAD_INDEX(cq) (__le16_to_cpu((cq)->sq_head) & 0xffff) - - /* wd sgl len */ - #define WD_SGL_PAD0_LEN 2 --- -2.27.0 - diff --git a/0145-uadk-v1-fix-include-file-order.patch b/0145-uadk-v1-fix-include-file-order.patch deleted file mode 100644 index 394a200..0000000 --- a/0145-uadk-v1-fix-include-file-order.patch +++ /dev/null @@ -1,92 +0,0 @@ -From e4459ddbe6b9423710208d0b086cd7a491aa0f55 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sat, 23 Jul 2022 16:50:27 +0800 -Subject: [PATCH 160/183] uadk: v1: fix include file order - -Includes are not sorted properly. Order-ref: standard library headers, -OS library headers, and project-specific headers. - -Signed-off-by: Wenkai Lin ---- - v1/drv/dummy_drv.c | 2 +- - v1/wd_aead.c | 2 +- - v1/wd_dh.c | 2 +- - v1/wd_digest.c | 2 +- - v1/wd_ecc.c | 2 +- - 5 files changed, 5 insertions(+), 5 deletions(-) - -diff --git a/v1/drv/dummy_drv.c b/v1/drv/dummy_drv.c -index f551b79..b1c1968 100644 ---- a/v1/drv/dummy_drv.c -+++ b/v1/drv/dummy_drv.c -@@ -18,9 +18,9 @@ - #include - #include - #include --#include - #include - #include -+#include - - #include "v1/wd_util.h" - #include "dummy_drv.h" -diff --git a/v1/wd_aead.c b/v1/wd_aead.c -index 4028895..ab1250a 100644 ---- a/v1/wd_aead.c -+++ b/v1/wd_aead.c -@@ -23,8 +23,8 @@ - #include - - #include "wd.h" --#include "wd_aead.h" - #include "wd_util.h" -+#include "wd_aead.h" - - #define MAX_AEAD_KEY_SIZE 64 - #define MAX_AEAD_MAC_SIZE 64 -diff --git a/v1/wd_dh.c b/v1/wd_dh.c -index 1164f2c..25483c1 100644 ---- a/v1/wd_dh.c -+++ b/v1/wd_dh.c -@@ -23,8 +23,8 @@ - #include - - #include "wd.h" --#include "wd_dh.h" - #include "wd_util.h" -+#include "wd_dh.h" - - #define WD_DH_G2 2 - #define DH_BALANCE_THRHD 1280 -diff --git a/v1/wd_digest.c b/v1/wd_digest.c -index 557ad18..7b01b14 100644 ---- a/v1/wd_digest.c -+++ b/v1/wd_digest.c -@@ -23,8 +23,8 @@ - #include - - #include "wd.h" --#include "wd_digest.h" - #include "wd_util.h" -+#include "wd_digest.h" - - #define MAX_HMAC_KEY_SIZE 128 - #define MAX_DIGEST_RETRY_CNT 20000000 -diff --git a/v1/wd_ecc.c b/v1/wd_ecc.c -index 4f9ec53..d3f6694 100644 ---- a/v1/wd_ecc.c -+++ b/v1/wd_ecc.c -@@ -23,9 +23,9 @@ - #include - - #include "wd.h" -+#include "wd_util.h" - #include "internal/wd_ecc_curve.h" - #include "wd_ecc.h" --#include "wd_util.h" - - #define ECC_BALANCE_THRHD 1280 - #define ECC_RECV_MAX_CNT 60000000 --- -2.27.0 - diff --git a/0146-uadk-fix-BufferOverFlow.patch b/0146-uadk-fix-BufferOverFlow.patch deleted file mode 100644 index b94101b..0000000 --- a/0146-uadk-fix-BufferOverFlow.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 8b19ff4c4b243ca2b0adf9c19bc20c3b83c9c4b1 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sat, 23 Jul 2022 16:50:28 +0800 -Subject: [PATCH 161/183] uadk: fix BufferOverFlow - -Fix that read or write outside of array bounds -of buf if string not ended with 0. - -Signed-off-by: Wenkai Lin ---- - wd_mempool.c | 11 +++++++++-- - 1 file changed, 9 insertions(+), 2 deletions(-) - -diff --git a/wd_mempool.c b/wd_mempool.c -index d9259de..6143a69 100644 ---- a/wd_mempool.c -+++ b/wd_mempool.c -@@ -624,7 +624,7 @@ static int get_value_from_sysfs(const char *path, ssize_t path_size) - char buf[MAX_ATTR_STR_SIZE]; - char *ptrRet = NULL; - ssize_t size; -- int fd; -+ int fd, ret; - - ptrRet = realpath(path, dev_path); - if (!ptrRet) { -@@ -645,7 +645,14 @@ static int get_value_from_sysfs(const char *path, ssize_t path_size) - } - - close(fd); -- return (int)strtol(buf, NULL, 10); -+ -+ ret = strtol(buf, NULL, 10); -+ if (errno == ERANGE) { -+ WD_ERR("failed to strtol %s, out of range!\n", buf); -+ goto err_read; -+ } -+ -+ return ret; - - err_read: - close(fd); --- -2.27.0 - diff --git a/0147-uadk-fix-macro-argument-warning.patch b/0147-uadk-fix-macro-argument-warning.patch deleted file mode 100644 index 3772710..0000000 --- a/0147-uadk-fix-macro-argument-warning.patch +++ /dev/null @@ -1,44 +0,0 @@ -From e3f943d0974bee65c8ab6ca16eff541a20a4fc5e Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sat, 23 Jul 2022 16:50:29 +0800 -Subject: [PATCH 162/183] uadk: fix macro argument warning - -macro argument 'array' should be enclosed in parentheses. - -Signed-off-by: Wenkai Lin ---- - include/wd_util.h | 4 ++-- - v1/wd_ecc.c | 2 +- - 2 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/include/wd_util.h b/include/wd_util.h -index 83a9684..83ac5f8 100644 ---- a/include/wd_util.h -+++ b/include/wd_util.h -@@ -18,8 +18,8 @@ extern "C" { - #endif - - #define FOREACH_NUMA(i, config, config_numa) \ -- for (i = 0, config_numa = config->config_per_numa; \ -- i < config->numa_num; config_numa++, i++) -+ for ((i) = 0, (config_numa) = (config)->config_per_numa; \ -+ (i) < (config)->numa_num; (config_numa)++, (i)++) - - struct wd_async_msg_pool { - struct msg_pool *pools; -diff --git a/v1/wd_ecc.c b/v1/wd_ecc.c -index d3f6694..dae5e23 100644 ---- a/v1/wd_ecc.c -+++ b/v1/wd_ecc.c -@@ -37,7 +37,7 @@ - #define ECC_MAX_OUT_NUM 4 - #define CURVE_PARAM_NUM 6 - #define ECC_POINT_NUM 2 --#define WD_ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])) -+#define WD_ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0])) - #define MAX_CURVE_SIZE (ECC_MAX_KEY_SIZE * CURVE_PARAM_NUM) - #define MAX_HASH_LENS ECC_MAX_KEY_SIZE - #define SM2_KEY_SIZE 32 --- -2.27.0 - diff --git a/0148-uadk-driver-init-should-check-ctx-num.patch b/0148-uadk-driver-init-should-check-ctx-num.patch deleted file mode 100644 index 109e13d..0000000 --- a/0148-uadk-driver-init-should-check-ctx-num.patch +++ /dev/null @@ -1,67 +0,0 @@ -From c8025681d15bdfdee9cc00796b68f02f1cf85d67 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sat, 23 Jul 2022 16:50:30 +0800 -Subject: [PATCH 163/183] uadk: driver init should check ctx num - -If 'i' is >= field 'ctx_num', then qp is still 0, -it will results in a dereference of a null pointer -when hisi_sec_driver_adapter use qp's member. - -Signed-off-by: Wenkai Lin ---- - drv/hisi_comp.c | 5 +++++ - drv/hisi_hpre.c | 5 +++++ - drv/hisi_sec.c | 5 +++++ - 3 files changed, 15 insertions(+) - -diff --git a/drv/hisi_comp.c b/drv/hisi_comp.c -index 69785e9..c940c3f 100644 ---- a/drv/hisi_comp.c -+++ b/drv/hisi_comp.c -@@ -780,6 +780,11 @@ static int hisi_zip_init(struct wd_ctx_config_internal *config, void *priv) - handle_t h_ctx; - int i; - -+ if (!config->ctx_num) { -+ WD_ERR("invalid: zip init config ctx num is 0!\n"); -+ return -WD_EINVAL; -+ } -+ - memcpy(&zip_ctx->config, config, sizeof(struct wd_ctx_config_internal)); - /* allocate qp for each context */ - for (i = 0; i < config->ctx_num; i++) { -diff --git a/drv/hisi_hpre.c b/drv/hisi_hpre.c -index d503d84..4c6e532 100644 ---- a/drv/hisi_hpre.c -+++ b/drv/hisi_hpre.c -@@ -447,6 +447,11 @@ static int hpre_init(struct wd_ctx_config_internal *config, void *priv, const ch - handle_t h_ctx, h_qp; - int i, j; - -+ if (!config->ctx_num) { -+ WD_ERR("invalid: hpre init config ctx num is 0!\n"); -+ return -WD_EINVAL; -+ } -+ - memcpy(&hpre_ctx->config, config, sizeof(*config)); - - /* allocate qp for each context */ -diff --git a/drv/hisi_sec.c b/drv/hisi_sec.c -index 5865ffb..858dbb6 100644 ---- a/drv/hisi_sec.c -+++ b/drv/hisi_sec.c -@@ -2341,6 +2341,11 @@ int hisi_sec_init(struct wd_ctx_config_internal *config, void *priv) - handle_t h_ctx; - int i, j; - -+ if (!config->ctx_num) { -+ WD_ERR("invalid: sec init config ctx num is 0!\n"); -+ return -WD_EINVAL; -+ } -+ - qm_priv.sqe_size = sizeof(struct hisi_sec_sqe); - /* allocate qp for each context */ - for (i = 0; i < config->ctx_num; i++) { --- -2.27.0 - diff --git a/0149-uadk-fix-cast-pointer-problem.patch b/0149-uadk-fix-cast-pointer-problem.patch deleted file mode 100644 index 4a68a43..0000000 --- a/0149-uadk-fix-cast-pointer-problem.patch +++ /dev/null @@ -1,104 +0,0 @@ -From 3d84ae9b37c608a045322312a929839042d6b2a9 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sat, 23 Jul 2022 16:50:31 +0800 -Subject: [PATCH 164/183] uadk: fix cast pointer problem - -The pointer is cast to another pointer in a different type, -fix it with void pointer. - -Signed-off-by: Wenkai Lin ---- - v1/drv/hisi_hpre_udrv.c | 5 +++-- - v1/wd_ecc.c | 6 +++--- - wd_ecc.c | 6 +++--- - 3 files changed, 9 insertions(+), 8 deletions(-) - -diff --git a/v1/drv/hisi_hpre_udrv.c b/v1/drv/hisi_hpre_udrv.c -index 805160e..4a97917 100644 ---- a/v1/drv/hisi_hpre_udrv.c -+++ b/v1/drv/hisi_hpre_udrv.c -@@ -1215,8 +1215,9 @@ static int ecc_prepare_verf_in(struct wcrypto_ecc_msg *msg, void **data) - return 0; - } - --static int ecc_prepare_dh_gen_in(struct wcrypto_ecc_point *in, void **data) -+static int ecc_prepare_dh_gen_in(void *input, void **data) - { -+ struct wcrypto_ecc_point *in = input; - int ret; - - ret = qm_crypto_bin_to_hpre_bin(in->x.data, (const char *)in->x.data, -@@ -1325,7 +1326,7 @@ static int qm_ecc_prepare_in(struct wcrypto_ecc_msg *msg, - hw_msg->bd_rsv2 = 1; /* fall through */ - case WCRYPTO_ECXDH_GEN_KEY: /* fall through */ - case WCRYPTO_SM2_KG: -- ret = ecc_prepare_dh_gen_in((struct wcrypto_ecc_point *)in, -+ ret = ecc_prepare_dh_gen_in((void *)in, - data); - break; - case WCRYPTO_ECXDH_COMPUTE_KEY: -diff --git a/v1/wd_ecc.c b/v1/wd_ecc.c -index dae5e23..c2a5100 100644 ---- a/v1/wd_ecc.c -+++ b/v1/wd_ecc.c -@@ -435,7 +435,7 @@ static struct wcrypto_ecc_in *create_sm2_sign_in(struct wcrypto_ecc_ctx *ctx, - } - - in->size = len - sizeof(struct wcrypto_ecc_in); -- dgst = (struct wd_dtb *)in; -+ dgst = (void *)in; - dgst->data = in->data; - dgst->dsize = ctx->key_size; - dgst->bsize = hsz; -@@ -475,7 +475,7 @@ static struct wcrypto_ecc_in *create_sm2_enc_in(struct wcrypto_ecc_ctx *ctx, - } - - in->size = ksz + m_len; -- k = (struct wd_dtb *)in; -+ k = (void *)in; - k->data = in->data; - k->dsize = ksz; - k->bsize = ksz; -@@ -2017,7 +2017,7 @@ static struct wcrypto_ecc_in *create_sm2_verf_in(struct wcrypto_ecc_ctx *ctx, - - memset(in, 0, len); - in->size = len - sizeof(struct wcrypto_ecc_in); -- dgst = (struct wd_dtb *)in; -+ dgst = (void *)in; - dgst->data = in->data; - dgst->dsize = ctx->key_size; - dgst->bsize = hsz; -diff --git a/wd_ecc.c b/wd_ecc.c -index fed02cb..136e8e2 100644 ---- a/wd_ecc.c -+++ b/wd_ecc.c -@@ -445,7 +445,7 @@ static struct wd_ecc_in *create_sm2_sign_in(struct wd_ecc_sess *sess, - - memset(in, 0, len); - in->size = len - sizeof(struct wd_ecc_in); -- dgst = (struct wd_dtb *)in; -+ dgst = (void *)in; - dgst->data = in->data; - dgst->dsize = ksz; - dgst->bsize = ksz; -@@ -485,7 +485,7 @@ static struct wd_ecc_in *create_sm2_enc_in(struct wd_ecc_sess *sess, - - memset(in, 0, len); - in->size = ksz + m_len; -- k = (struct wd_dtb *)in; -+ k = (void *)in; - k->data = in->data; - k->dsize = ksz; - k->bsize = ksz; -@@ -1707,7 +1707,7 @@ static struct wd_ecc_in *create_sm2_verf_in(struct wd_ecc_sess *sess, - - memset(in, 0, len); - in->size = len - sizeof(struct wd_ecc_in); -- dgst = (struct wd_dtb *)in; -+ dgst = (void *)in; - dgst->data = in->data; - dgst->dsize = sess->key_size; - dgst->bsize = hsz; --- -2.27.0 - diff --git a/0150-uadk-fix-function-params-usage.patch b/0150-uadk-fix-function-params-usage.patch deleted file mode 100644 index d431391..0000000 --- a/0150-uadk-fix-function-params-usage.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 1e1b1fce4977f41f1cb1a86d22aca43a18531efc Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sat, 23 Jul 2022 16:50:32 +0800 -Subject: [PATCH 165/183] uadk: fix function params usage - -parameter 'expt' of function 'wd_rsa_poll_ctx' -should not be used as working variable. - -Signed-off-by: Wenkai Lin ---- - v1/wd_ecc.c | 5 +++-- - wd_rsa.c | 3 ++- - 2 files changed, 5 insertions(+), 3 deletions(-) - -diff --git a/v1/wd_ecc.c b/v1/wd_ecc.c -index c2a5100..e108051 100644 ---- a/v1/wd_ecc.c -+++ b/v1/wd_ecc.c -@@ -269,14 +269,15 @@ static void init_dtb_param(void *dtb, char *start, - __u32 dsz, __u32 bsz, __u32 num) - { - struct wd_dtb *tmp = dtb; -+ char *pos = start; - int i = 0; - - while (i++ < num) { -- tmp->data = start; -+ tmp->data = pos; - tmp->dsize = dsz; - tmp->bsize = bsz; - tmp += 1; -- start += bsz; -+ pos += bsz; - } - } - -diff --git a/wd_rsa.c b/wd_rsa.c -index 89d3450..fb2b6b0 100644 ---- a/wd_rsa.c -+++ b/wd_rsa.c -@@ -356,6 +356,7 @@ int wd_rsa_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - struct wd_rsa_req *req; - struct wd_rsa_msg recv_msg, *msg; - __u32 rcv_cnt = 0; -+ __u32 tmp = expt; - int ret; - - if (unlikely(!count)) { -@@ -395,7 +396,7 @@ int wd_rsa_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - req->cb(req); - wd_put_msg_to_pool(&wd_rsa_setting.pool, idx, recv_msg.tag); - *count = rcv_cnt; -- } while (--expt); -+ } while (--tmp); - - return ret; - } --- -2.27.0 - diff --git a/0151-uadk-fix-size_t-usage.patch b/0151-uadk-fix-size_t-usage.patch deleted file mode 100644 index 7a5c9e7..0000000 --- a/0151-uadk-fix-size_t-usage.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 76d36759e69f7ed303e8fbf42b46052383f86337 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sat, 23 Jul 2022 16:50:33 +0800 -Subject: [PATCH 166/183] uadk: fix size_t usage - -The variable is assigned by value from strlen, -its type should be size_t. - -Signed-off-by: Wenkai Lin ---- - wd_util.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/wd_util.c b/wd_util.c -index 04a2a5b..349df81 100644 ---- a/wd_util.c -+++ b/wd_util.c -@@ -585,7 +585,8 @@ free_numa_dev_num: - - static int is_number(const char *str) - { -- int len, i; -+ size_t len; -+ int i; - - if (!str) - return 0; --- -2.27.0 - diff --git a/0152-uadk-fix-atoi-usage.patch b/0152-uadk-fix-atoi-usage.patch deleted file mode 100644 index 77585d7..0000000 --- a/0152-uadk-fix-atoi-usage.patch +++ /dev/null @@ -1,79 +0,0 @@ -From 19c524e4be9fcd9af5145dde9e11725e4c7eb1c2 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sat, 23 Jul 2022 16:50:34 +0800 -Subject: [PATCH 167/183] uadk: fix atoi usage - -atoi is called, use the functions like strtol -to transform string to integer instead. - -Signed-off-by: Wenkai Lin ---- - v1/wd.c | 23 +++++++++++++---------- - wd_mempool.c | 4 ++-- - 2 files changed, 15 insertions(+), 12 deletions(-) - -diff --git a/v1/wd.c b/v1/wd.c -index 2c435ba..6e081e6 100644 ---- a/v1/wd.c -+++ b/v1/wd.c -@@ -109,21 +109,24 @@ static int get_raw_attr(const char *dev_root, const char *attr, - - static int get_int_attr(struct dev_info *dinfo, const char *attr) - { -- int size; -- char buf[MAX_ATTR_STR_SIZE]; -+ char buf[MAX_ATTR_STR_SIZE] = {'\0'}; -+ int ret; - - /* - * The signed int max number is INT_MAX 10bit char "4294967295" - * When the value is bigger than INT_MAX, it returns INT_MAX - */ -- size = get_raw_attr(dinfo->dev_root, attr, buf, MAX_ATTR_STR_SIZE); -- if (size < 0) -- return size; -- else if (size >= INT_MAX_SIZE) -- return INT_MAX; -- /* Handing the read string's end tails '\n' to '\0' */ -- buf[size] = '\0'; -- return atoi((char *)buf); -+ ret = get_raw_attr(dinfo->dev_root, attr, buf, MAX_ATTR_STR_SIZE - 1); -+ if (ret < 0) -+ return ret; -+ -+ ret = strtol(buf, NULL, 10); -+ if (errno == ERANGE) { -+ WD_ERR("failed to strtol %s, out of range!\n", buf); -+ return -errno; -+ } -+ -+ return ret; - } - - /* -diff --git a/wd_mempool.c b/wd_mempool.c -index 6143a69..b27d28c 100644 ---- a/wd_mempool.c -+++ b/wd_mempool.c -@@ -620,8 +620,8 @@ void wd_blockpool_destroy(handle_t blkpool) - - static int get_value_from_sysfs(const char *path, ssize_t path_size) - { -+ char buf[MAX_ATTR_STR_SIZE] = {'\0'}; - char dev_path[PATH_MAX]; -- char buf[MAX_ATTR_STR_SIZE]; - char *ptrRet = NULL; - ssize_t size; - int fd, ret; -@@ -638,7 +638,7 @@ static int get_value_from_sysfs(const char *path, ssize_t path_size) - goto err_open; - } - -- size = read(fd, buf, sizeof(buf)); -+ size = read(fd, buf, MAX_ATTR_STR_SIZE - 1); - if (size <= 0) { - WD_ERR("failed to read %s!\n", dev_path); - goto err_read; --- -2.27.0 - diff --git a/0153-uadk-fix-lm-not-link-problem.patch b/0153-uadk-fix-lm-not-link-problem.patch deleted file mode 100644 index 3981342..0000000 --- a/0153-uadk-fix-lm-not-link-problem.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 05a357678b603cd6d30cbedabfb981620b056eed Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sat, 23 Jul 2022 16:50:35 +0800 -Subject: [PATCH 168/183] uadk: fix lm not link problem - -Some gcc version need user to assign -lm parameter. - -Signed-off-by: Wenkai Lin ---- - Makefile.am | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/Makefile.am b/Makefile.am -index 9782ed4..5856126 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -91,7 +91,7 @@ libwd_comp_la_DEPENDENCIES = libwd.la - - libhisi_zip_la_LIBADD = -ldl - --libwd_crypto_la_LIBADD = $(libwd_la_OBJECTS) -ldl -lnuma -+libwd_crypto_la_LIBADD = $(libwd_la_OBJECTS) -ldl -lnuma -lm - libwd_crypto_la_DEPENDENCIES = libwd.la - - libhisi_sec_la_LIBADD = $(libwd_la_OBJECTS) $(libwd_crypto_la_OBJECTS) -@@ -110,7 +110,7 @@ libwd_comp_la_DEPENDENCIES= libwd.la - libhisi_zip_la_LIBADD= -ldl - libhisi_zip_la_LDFLAGS=$(UADK_VERSION) - --libwd_crypto_la_LIBADD= -lwd -ldl -lnuma -+libwd_crypto_la_LIBADD= -lwd -ldl -lnuma -lm - libwd_crypto_la_LDFLAGS=$(UADK_VERSION) - libwd_crypto_la_DEPENDENCIES= libwd.la - --- -2.27.0 - diff --git a/0154-uadk-remove-unneed-comment-and-macro.patch b/0154-uadk-remove-unneed-comment-and-macro.patch deleted file mode 100644 index a7bfec4..0000000 --- a/0154-uadk-remove-unneed-comment-and-macro.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 2cb12ab4c85a8699635e75866ae4b0ff9881adc3 Mon Sep 17 00:00:00 2001 -From: Wenkai Lin -Date: Sat, 23 Jul 2022 16:50:36 +0800 -Subject: [PATCH 169/183] uadk: remove unneed comment and macro - -Remove unneed comment and macro from v1 wd.c - -Signed-off-by: Wenkai Lin ---- - v1/wd.c | 9 ++------- - 1 file changed, 2 insertions(+), 7 deletions(-) - -diff --git a/v1/wd.c b/v1/wd.c -index 6e081e6..b8fd28c 100644 ---- a/v1/wd.c -+++ b/v1/wd.c -@@ -31,14 +31,13 @@ - #include "v1/wd_adapter.h" - #include "v1/wd.h" - --#define SYS_CLASS_DIR "/sys/class" - #define LINUX_DEV_DIR "/dev" --#define WD_UACCE_CLASS_DIR SYS_CLASS_DIR"/"WD_UACCE_CLASS_NAME -+#define WD_UACCE_CLASS_DIR "/sys/class/"WD_UACCE_CLASS_NAME - #define _TRY_REQUEST_TIMES 64 - #define INT_MAX_SIZE 10 - #define LINUX_CRTDIR_SIZE 1 - #define LINUX_PRTDIR_SIZE 2 --#define INSTANCE_RATIO_FOR_DEV_SCHED 4 -+#define INSTANCE_RATIO_FOR_DEV_SCHED 4 - - #define GET_WEIGHT(distance, instances) (\ - ((instances) & 0xffff) | (((distance) & 0xffff) << 16)) -@@ -112,10 +111,6 @@ static int get_int_attr(struct dev_info *dinfo, const char *attr) - char buf[MAX_ATTR_STR_SIZE] = {'\0'}; - int ret; - -- /* -- * The signed int max number is INT_MAX 10bit char "4294967295" -- * When the value is bigger than INT_MAX, it returns INT_MAX -- */ - ret = get_raw_attr(dinfo->dev_root, attr, buf, MAX_ATTR_STR_SIZE - 1); - if (ret < 0) - return ret; --- -2.27.0 - diff --git a/0155-drv-hpre-remove-repeatedly-included-header-file.patch b/0155-drv-hpre-remove-repeatedly-included-header-file.patch deleted file mode 100644 index 61c1b37..0000000 --- a/0155-drv-hpre-remove-repeatedly-included-header-file.patch +++ /dev/null @@ -1,56 +0,0 @@ -From fbdf545556c1fe85e5c35001af675ea0cb8ab968 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Sat, 23 Jul 2022 10:48:56 +0800 -Subject: [PATCH 170/183] drv/hpre: remove repeatedly included header file - -Some header files have included in hisi_qm_udrv.h, remove them from -hisi_hpre.c. - -Signed-off-by: Weili Qian ---- - drv/hisi_hpre.c | 10 ++-------- - include/drv/wd_rsa_drv.h | 2 ++ - 2 files changed, 4 insertions(+), 8 deletions(-) - -diff --git a/drv/hisi_hpre.c b/drv/hisi_hpre.c -index 4c6e532..8454eff 100644 ---- a/drv/hisi_hpre.c -+++ b/drv/hisi_hpre.c -@@ -2,19 +2,13 @@ - /* Copyright 2020-2021 Huawei Technologies Co.,Ltd. All rights reserved. */ - - #include --#include - #include --#include --#include --#include --#include --#include --#include -+#include - #include - #include -+#include - #include - #include "hisi_qm_udrv.h" --#include "wd.h" - #include "../include/drv/wd_rsa_drv.h" - #include "../include/drv/wd_dh_drv.h" - #include "../include/drv/wd_ecc_drv.h" -diff --git a/include/drv/wd_rsa_drv.h b/include/drv/wd_rsa_drv.h -index 28c3337..83f1af2 100644 ---- a/include/drv/wd_rsa_drv.h -+++ b/include/drv/wd_rsa_drv.h -@@ -3,6 +3,8 @@ - #ifndef __WD_RSA_DRV_H - #define __WD_RSA_DRV_H - -+#include -+ - #include "../wd_rsa.h" - - #ifdef __cplusplus --- -2.27.0 - diff --git a/0156-drv-hpre-add-hpre_result_check.patch b/0156-drv-hpre-add-hpre_result_check.patch deleted file mode 100644 index 4d31cbf..0000000 --- a/0156-drv-hpre-add-hpre_result_check.patch +++ /dev/null @@ -1,138 +0,0 @@ -From 06d0a1a22e611a23f91573d125dc83295a2b0256 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Sat, 23 Jul 2022 10:48:57 +0800 -Subject: [PATCH 171/183] drv/hpre: add hpre_result_check() - -When process recv completed task from hardware, -driver will check BD status. The check logic for ECC/DH/RSA -is the same. Therefore, call hpre_resut_check() to check the BD -status to reduce duplicate code. - -Signed-off-by: Weili Qian ---- - drv/hisi_hpre.c | 75 ++++++++++++++++++++----------------------------- - 1 file changed, 30 insertions(+), 45 deletions(-) - -diff --git a/drv/hisi_hpre.c b/drv/hisi_hpre.c -index 8454eff..76529e8 100644 ---- a/drv/hisi_hpre.c -+++ b/drv/hisi_hpre.c -@@ -531,6 +531,25 @@ static int rsa_send(handle_t ctx, void *rsa_msg) - return hisi_qm_send(h_qp, &hw_msg, 1, &send_cnt); - } - -+static void hpre_result_check(struct hisi_hpre_sqe *hw_msg, -+ __u8 *result) -+{ -+ *result = WD_SUCCESS; -+ -+ if (hw_msg->done != HPRE_HW_TASK_DONE || -+ hw_msg->etype || hw_msg->etype1) { -+ WD_ERR("failed to do hpre task! done=0x%x, etype=0x%x, etype1=0x%x!\n", -+ hw_msg->done, hw_msg->etype, hw_msg->etype1); -+ if (hw_msg->etype1 & HPRE_HW_SVA_ERROR) -+ WD_ERR("failed to SVA prefetch: status=%u!\n", -+ hw_msg->sva_status); -+ if (hw_msg->done == HPRE_HW_TASK_INIT) -+ *result = WD_EINVAL; -+ else -+ *result = WD_IN_EPARA; -+ } -+} -+ - static int rsa_recv(handle_t ctx, void *rsa_msg) - { - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); -@@ -547,25 +566,13 @@ static int rsa_recv(handle_t ctx, void *rsa_msg) - if (ret) - return ret; - -- if (hw_msg.done != HPRE_HW_TASK_DONE || -- hw_msg.etype || hw_msg.etype1) { -- WD_ERR("failed to do rsa task! done=0x%x, etype=0x%x, etype1=0x%x!\n", -- hw_msg.done, hw_msg.etype, hw_msg.etype1); -- if (hw_msg.etype1 & HPRE_HW_SVA_ERROR) -- WD_ERR("failed to SVA prefetch: status=%u!\n", -- hw_msg.sva_status); -- if (hw_msg.done == HPRE_HW_TASK_INIT) -- msg->result = WD_EINVAL; -- else -- msg->result = WD_IN_EPARA; -- } else { -- msg->tag = LW_U16(hw_msg.low_tag); -+ msg->tag = LW_U16(hw_msg.low_tag); -+ hpre_result_check(&hw_msg, &msg->result); -+ if (!msg->result) { - ret = rsa_out_transfer(msg, &hw_msg); - if (ret) { - WD_ERR("failed to transfer out rsa BD!\n"); - msg->result = WD_OUT_EPARA; -- } else { -- msg->result = WD_SUCCESS; - } - } - -@@ -696,25 +703,13 @@ static int dh_recv(handle_t ctx, void *dh_msg) - if (ret) - return ret; - -- if (hw_msg.done != HPRE_HW_TASK_DONE || -- hw_msg.etype || hw_msg.etype1) { -- WD_ERR("failed to do dh task! done=0x%x, etype=0x%x, etype1=0x%x!\n", -- hw_msg.done, hw_msg.etype, hw_msg.etype1); -- if (hw_msg.etype1 & HPRE_HW_SVA_ERROR) -- WD_ERR("failed to SVA prefetch: status=%u!\n", -- hw_msg.sva_status); -- if (hw_msg.done == HPRE_HW_TASK_INIT) -- msg->result = WD_EINVAL; -- else -- msg->result = WD_IN_EPARA; -- } else { -- msg->tag = LW_U16(hw_msg.low_tag); -+ msg->tag = LW_U16(hw_msg.low_tag); -+ hpre_result_check(&hw_msg, &msg->result); -+ if (!msg->result) { - ret = dh_out_transfer(msg, &hw_msg); - if (ret) { - WD_ERR("failed to transfer out dh BD!\n"); - msg->result = WD_OUT_EPARA; -- } else { -- msg->result = WD_SUCCESS; - } - } - -@@ -2191,26 +2186,16 @@ static int ecc_sqe_parse(struct wd_ecc_msg *msg, struct hisi_hpre_sqe *hw_msg) - { - int ret; - -- if (hw_msg->done != HPRE_HW_TASK_DONE || -- hw_msg->etype || hw_msg->etype1) { -- WD_ERR("failed to do ecc task! done=0x%x, etype=0x%x, etype1=0x%x!\n", -- hw_msg->done, hw_msg->etype, hw_msg->etype1); -- if (hw_msg->etype1 & HPRE_HW_SVA_ERROR) -- WD_ERR("failed to SVA prefetch: status=%u!\n", -- hw_msg->sva_status); -- -- if (hw_msg->done == HPRE_HW_TASK_INIT) -- ret = -WD_EINVAL; -- else -- ret = -WD_IN_EPARA; -- } else { -- msg->result = WD_SUCCESS; -+ msg->tag = LW_U16(hw_msg->low_tag); -+ hpre_result_check(hw_msg, &msg->result); -+ if (!msg->result) { - ret = ecc_out_transfer(msg, hw_msg); - if (ret) { - msg->result = WD_OUT_EPARA; - WD_ERR("failed to transfer out ecc BD, ret = %d!\n", ret); - } -- msg->tag = LW_U16(hw_msg->low_tag); -+ } else { -+ ret = -msg->result; - } - - return ret; --- -2.27.0 - diff --git a/0157-drv-hpre-move-format-check-to-is_hpre_bin_fmt.patch b/0157-drv-hpre-move-format-check-to-is_hpre_bin_fmt.patch deleted file mode 100644 index 49505ff..0000000 --- a/0157-drv-hpre-move-format-check-to-is_hpre_bin_fmt.patch +++ /dev/null @@ -1,67 +0,0 @@ -From 892ac1efc8dac5dfb0434c953c66d379533ea0f4 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Sat, 23 Jul 2022 10:48:58 +0800 -Subject: [PATCH 172/183] drv/hpre: move format check to is_hpre_bin_fmt() - -Move the check format from crypto_bin_to_hpre_bin() -to is_hpre_bin_fmt(), all check are done by is_hpre_bin_fmt(). - -Signed-off-by: Weili Qian ---- - drv/hisi_hpre.c | 18 +++++++++++------- - 1 file changed, 11 insertions(+), 7 deletions(-) - -diff --git a/drv/hisi_hpre.c b/drv/hisi_hpre.c -index 76529e8..c3c74a0 100644 ---- a/drv/hisi_hpre.c -+++ b/drv/hisi_hpre.c -@@ -100,18 +100,24 @@ struct hisi_hpre_ctx { - struct wd_ctx_config_internal config; - }; - --static bool is_hpre_bin_fmt(const char *data, int dsz, int bsz) -+static bool is_hpre_bin_fmt(char *dst, const char *src, int dsz, int bsz) - { -- const char *temp = data + dsz; -+ const char *temp = src + dsz; - int lens = bsz - dsz; - int i = 0; - -+ if (!lens) -+ return true; -+ - while (i < lens) { -- if (temp[i] && !data[i]) -- return true; -+ if (temp[i] && !src[i]) -+ break; - i++; - } - -+ if (dst == src && i != lens) -+ return true; -+ - return false; - } - -@@ -119,7 +125,6 @@ static int crypto_bin_to_hpre_bin(char *dst, const char *src, - __u32 b_size, __u32 d_size, const char *p_name) - { - int i = d_size - 1; -- bool is_hpre_bin; - int j; - - if (!dst || !src || b_size <= 0 || d_size <= 0) { -@@ -132,8 +137,7 @@ static int crypto_bin_to_hpre_bin(char *dst, const char *src, - return -WD_EINVAL; - } - -- is_hpre_bin = is_hpre_bin_fmt(src, d_size, b_size); -- if (b_size == d_size || (dst == src && is_hpre_bin)) -+ if (is_hpre_bin_fmt(dst, src, d_size, b_size)) - return WD_SUCCESS; - - for (j = b_size - 1; j >= 0; j--, i--) { --- -2.27.0 - diff --git a/0158-drv-hpre-change-the-parameter-type.patch b/0158-drv-hpre-change-the-parameter-type.patch deleted file mode 100644 index 519e737..0000000 --- a/0158-drv-hpre-change-the-parameter-type.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 8d53e4e7194addaf3e9831ba5f197440d0522ad0 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Sat, 23 Jul 2022 10:48:59 +0800 -Subject: [PATCH 173/183] drv/hpre: change the parameter type - -Change the function parameter type to '__u32' -because the input value by callers is not less than 0. - -Signed-off-by: Weili Qian ---- - drv/hisi_hpre.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/drv/hisi_hpre.c b/drv/hisi_hpre.c -index c3c74a0..aea7749 100644 ---- a/drv/hisi_hpre.c -+++ b/drv/hisi_hpre.c -@@ -100,7 +100,7 @@ struct hisi_hpre_ctx { - struct wd_ctx_config_internal config; - }; - --static bool is_hpre_bin_fmt(char *dst, const char *src, int dsz, int bsz) -+static bool is_hpre_bin_fmt(char *dst, const char *src, __u32 dsz, __u32 bsz) - { - const char *temp = src + dsz; - int lens = bsz - dsz; -@@ -127,7 +127,7 @@ static int crypto_bin_to_hpre_bin(char *dst, const char *src, - int i = d_size - 1; - int j; - -- if (!dst || !src || b_size <= 0 || d_size <= 0) { -+ if (!dst || !src || !b_size || !d_size) { - WD_ERR("invalid: %s trans to hpre bin parameters err!\n", p_name); - return -WD_EINVAL; - } -@@ -150,14 +150,14 @@ static int crypto_bin_to_hpre_bin(char *dst, const char *src, - return WD_SUCCESS; - } - --static int hpre_bin_to_crypto_bin(char *dst, const char *src, int b_size, -+static int hpre_bin_to_crypto_bin(char *dst, const char *src, __u32 b_size, - const char *p_name) - { - int i, cnt; - int j = 0; - int k = 0; - -- if (!dst || !src || b_size <= 0) { -+ if (!dst || !src || !b_size) { - WD_ERR("invalid: %s trans to crypto bin parameters err!\n", p_name); - return 0; - } --- -2.27.0 - diff --git a/0159-drv-hpre-remove-redundant-blank-line.patch b/0159-drv-hpre-remove-redundant-blank-line.patch deleted file mode 100644 index 9b4b31c..0000000 --- a/0159-drv-hpre-remove-redundant-blank-line.patch +++ /dev/null @@ -1,27 +0,0 @@ -From d0300cca906531d85d025c1c17a3d845a0f45902 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Sat, 23 Jul 2022 10:49:00 +0800 -Subject: [PATCH 174/183] drv/hpre: remove redundant blank line - -This patch removes redundant blank line from the hpre driver. - -Signed-off-by: Weili Qian ---- - drv/hisi_hpre.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/drv/hisi_hpre.c b/drv/hisi_hpre.c -index aea7749..d957101 100644 ---- a/drv/hisi_hpre.c -+++ b/drv/hisi_hpre.c -@@ -771,7 +771,6 @@ static int ecc_prepare_alg(struct wd_ecc_msg *msg, - return 0; - } - -- - static int trans_cv_param_to_hpre_bin(struct wd_dtb *p, struct wd_dtb *a, - struct wd_dtb *b, struct wd_dtb *n, - struct wd_ecc_point *g) --- -2.27.0 - diff --git a/0160-drv-qm-add-unlikely-for-branch-prefetch.patch b/0160-drv-qm-add-unlikely-for-branch-prefetch.patch deleted file mode 100644 index c6d1ed7..0000000 --- a/0160-drv-qm-add-unlikely-for-branch-prefetch.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 3c59e2ada00a20ff8aec3fe13920cf155a63740c Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Sat, 23 Jul 2022 10:49:01 +0800 -Subject: [PATCH 175/183] drv/qm: add unlikely() for branch prefetch - -Add unlikely() on the route of doing request to improve -branch prefetch success rate. - -Signed-off-by: Weili Qian ---- - drv/hisi_qm_udrv.c | 14 +++++++------- - 1 file changed, 7 insertions(+), 7 deletions(-) - -diff --git a/drv/hisi_qm_udrv.c b/drv/hisi_qm_udrv.c -index 39c99d1..7f26e52 100644 ---- a/drv/hisi_qm_udrv.c -+++ b/drv/hisi_qm_udrv.c -@@ -442,12 +442,12 @@ int hisi_qm_send(handle_t h_qp, const void *req, __u16 expect, __u16 *count) - __u16 free_num, send_num; - __u16 tail; - -- if (!qp || !req || !count) -+ if (unlikely(!qp || !req || !count)) - return -WD_EINVAL; - - q_info = &qp->q_info; - -- if (wd_ioread32(q_info->ds_tx_base) == 1) { -+ if (unlikely(wd_ioread32(q_info->ds_tx_base) == 1)) { - WD_ERR("wd queue hw error happened before qm send!\n"); - return -WD_HW_EACCESS; - } -@@ -488,7 +488,7 @@ static int hisi_qm_recv_single(struct hisi_qm_queue_info *q_info, void *resp) - - if (q_info->cqc_phase == CQE_PHASE(cqe)) { - j = CQE_SQ_HEAD_INDEX(cqe); -- if (j >= QM_Q_DEPTH) { -+ if (unlikely(j >= QM_Q_DEPTH)) { - pthread_spin_unlock(&q_info->rv_lock); - WD_DEV_ERR(qp->h_ctx, "CQE_SQ_HEAD_INDEX(%u) error!\n", j); - return -WD_EIO; -@@ -526,14 +526,14 @@ int hisi_qm_recv(handle_t h_qp, void *resp, __u16 expect, __u16 *count) - int recv_num = 0; - int i, ret, offset; - -- if (!resp || !qp || !count) -+ if (unlikely(!resp || !qp || !count)) - return -WD_EINVAL; - -- if (!expect) -+ if (unlikely(!expect)) - return 0; - - q_info = &qp->q_info; -- if (wd_ioread32(q_info->ds_rx_base) == 1) { -+ if (unlikely(wd_ioread32(q_info->ds_rx_base) == 1)) { - WD_DEV_ERR(qp->h_ctx, "wd queue hw error happened before qm receive!\n"); - return -WD_HW_EACCESS; - } -@@ -547,7 +547,7 @@ int hisi_qm_recv(handle_t h_qp, void *resp, __u16 expect, __u16 *count) - } - - *count = recv_num++; -- if (wd_ioread32(q_info->ds_rx_base) == 1) { -+ if (unlikely(wd_ioread32(q_info->ds_rx_base) == 1)) { - WD_DEV_ERR(qp->h_ctx, "wd queue hw error happened in qm receive!\n"); - return -WD_HW_EACCESS; - } --- -2.27.0 - diff --git a/0161-drv-qm-remove-redundant-add-1.patch b/0161-drv-qm-remove-redundant-add-1.patch deleted file mode 100644 index fbdda90..0000000 --- a/0161-drv-qm-remove-redundant-add-1.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 16800a92f326560006d0480faacde3cf1d5d6cb2 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Sat, 23 Jul 2022 10:49:02 +0800 -Subject: [PATCH 176/183] drv/qm: remove redundant add 1 - -The variable 'recv_num' is no longer used, remove redundant add 1; - -Signed-off-by: Weili Qian ---- - drv/hisi_qm_udrv.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drv/hisi_qm_udrv.c b/drv/hisi_qm_udrv.c -index 7f26e52..6459ffa 100644 ---- a/drv/hisi_qm_udrv.c -+++ b/drv/hisi_qm_udrv.c -@@ -546,7 +546,7 @@ int hisi_qm_recv(handle_t h_qp, void *resp, __u16 expect, __u16 *count) - recv_num++; - } - -- *count = recv_num++; -+ *count = recv_num; - if (unlikely(wd_ioread32(q_info->ds_rx_base) == 1)) { - WD_DEV_ERR(qp->h_ctx, "wd queue hw error happened in qm receive!\n"); - return -WD_HW_EACCESS; --- -2.27.0 - diff --git a/0162-drv-qm-remove-useless-parameter-sq_head_index.patch b/0162-drv-qm-remove-useless-parameter-sq_head_index.patch deleted file mode 100644 index 999c5eb..0000000 --- a/0162-drv-qm-remove-useless-parameter-sq_head_index.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 913b0b03484eace681dd53a2fdf6a20e594f07d8 Mon Sep 17 00:00:00 2001 -From: Weili Qian -Date: Sat, 23 Jul 2022 10:49:03 +0800 -Subject: [PATCH 177/183] drv/qm: remove useless parameter 'sq_head_index' - -The 'sq_head_index' is operated by the accelerator hardware, and -is useless to the driver. Therefore, remove 'sq_head_index'. - -Signed-off-by: Weili Qian ---- - drv/hisi_qm_udrv.c | 1 - - include/hisi_qm_udrv.h | 1 - - 2 files changed, 2 deletions(-) - -diff --git a/drv/hisi_qm_udrv.c b/drv/hisi_qm_udrv.c -index 6459ffa..93f2eb7 100644 ---- a/drv/hisi_qm_udrv.c -+++ b/drv/hisi_qm_udrv.c -@@ -511,7 +511,6 @@ static int hisi_qm_recv_single(struct hisi_qm_queue_info *q_info, void *resp) - - /* only support one thread poll one queue, so no need protect */ - q_info->cq_head_index = i; -- q_info->sq_head_index = i; - - __atomic_sub_fetch(&q_info->used_num, 1, __ATOMIC_RELAXED); - pthread_spin_unlock(&q_info->rv_lock); -diff --git a/include/hisi_qm_udrv.h b/include/hisi_qm_udrv.h -index 92333ed..22dedf3 100644 ---- a/include/hisi_qm_udrv.h -+++ b/include/hisi_qm_udrv.h -@@ -67,7 +67,6 @@ struct hisi_qm_queue_info { - void *ds_rx_base; - __u8 qp_mode; - __u16 sq_tail_index; -- __u16 sq_head_index; - __u16 cq_head_index; - __u16 sqn; - __u16 qc_type; --- -2.27.0 - diff --git a/0163-uadk-add-wd_-alg-_get_msg.patch b/0163-uadk-add-wd_-alg-_get_msg.patch deleted file mode 100644 index 75d2f44..0000000 --- a/0163-uadk-add-wd_-alg-_get_msg.patch +++ /dev/null @@ -1,106 +0,0 @@ -From 282f78fc44dc216166ae463944d952f753f7c8b6 Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Sat, 23 Jul 2022 10:49:04 +0800 -Subject: [PATCH 178/183] uadk: add wd__get_msg() - -Add wd__get_msg() for driver to obtain the sent -message by the user. - -Signed-off-by: Kai Ye -Signed-off-by: Weili Qian ---- - include/drv/wd_dh_drv.h | 1 + - include/drv/wd_ecc_drv.h | 1 + - include/drv/wd_rsa_drv.h | 1 + - wd_dh.c | 5 +++++ - wd_ecc.c | 5 +++++ - wd_rsa.c | 5 +++++ - 6 files changed, 18 insertions(+) - -diff --git a/include/drv/wd_dh_drv.h b/include/drv/wd_dh_drv.h -index f8e3065..57f774d 100644 ---- a/include/drv/wd_dh_drv.h -+++ b/include/drv/wd_dh_drv.h -@@ -36,6 +36,7 @@ struct wd_dh_driver { - - void wd_dh_set_driver(struct wd_dh_driver *drv); - struct wd_dh_driver *wd_dh_get_driver(void); -+struct wd_dh_msg *wd_dh_get_msg(__u32 idx, __u32 tag); - - #ifdef WD_STATIC_DRV - #define WD_DH_SET_DRIVER(drv) \ -diff --git a/include/drv/wd_ecc_drv.h b/include/drv/wd_ecc_drv.h -index 857da20..ddf5e5b 100644 ---- a/include/drv/wd_ecc_drv.h -+++ b/include/drv/wd_ecc_drv.h -@@ -188,6 +188,7 @@ struct wd_ecc_driver { - - void wd_ecc_set_driver(struct wd_ecc_driver *drv); - struct wd_ecc_driver *wd_ecc_get_driver(void); -+struct wd_ecc_msg *wd_ecc_get_msg(__u32 idx, __u32 tag); - - #ifdef WD_STATIC_DRV - #define WD_ECC_SET_DRIVER(drv) \ -diff --git a/include/drv/wd_rsa_drv.h b/include/drv/wd_rsa_drv.h -index 83f1af2..108c2a3 100644 ---- a/include/drv/wd_rsa_drv.h -+++ b/include/drv/wd_rsa_drv.h -@@ -61,6 +61,7 @@ struct wd_rsa_driver { - - void wd_rsa_set_driver(struct wd_rsa_driver *drv); - struct wd_rsa_driver *wd_rsa_get_driver(void); -+struct wd_rsa_msg *wd_rsa_get_msg(__u32 idx, __u32 tag); - - #ifdef WD_STATIC_DRV - #define WD_RSA_SET_DRIVER(drv) \ -diff --git a/wd_dh.c b/wd_dh.c -index 41c4a2a..0bf770d 100644 ---- a/wd_dh.c -+++ b/wd_dh.c -@@ -290,6 +290,11 @@ fail_with_msg: - return ret; - } - -+struct wd_dh_msg *wd_dh_get_msg(__u32 idx, __u32 tag) -+{ -+ return wd_find_msg_in_pool(&wd_dh_setting.pool, idx, tag); -+} -+ - int wd_dh_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - { - struct wd_ctx_config_internal *config = &wd_dh_setting.config; -diff --git a/wd_ecc.c b/wd_ecc.c -index 136e8e2..2266b1d 100644 ---- a/wd_ecc.c -+++ b/wd_ecc.c -@@ -2119,6 +2119,11 @@ fail_with_msg: - return ret; - } - -+struct wd_ecc_msg *wd_ecc_get_msg(__u32 idx, __u32 tag) -+{ -+ return wd_find_msg_in_pool(&wd_ecc_setting.pool, idx, tag); -+} -+ - int wd_ecc_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - { - struct wd_ctx_config_internal *config = &wd_ecc_setting.config; -diff --git a/wd_rsa.c b/wd_rsa.c -index fb2b6b0..489833e 100644 ---- a/wd_rsa.c -+++ b/wd_rsa.c -@@ -349,6 +349,11 @@ fail_with_msg: - return ret; - } - -+struct wd_rsa_msg *wd_rsa_get_msg(__u32 idx, __u32 tag) -+{ -+ return wd_find_msg_in_pool(&wd_rsa_setting.pool, idx, tag); -+} -+ - int wd_rsa_poll_ctx(__u32 idx, __u32 expt, __u32 *count) - { - struct wd_ctx_config_internal *config = &wd_rsa_setting.config; --- -2.27.0 - diff --git a/0164-drv-hpre-support-dump-BD-when-BD-checks-fail.patch b/0164-drv-hpre-support-dump-BD-when-BD-checks-fail.patch deleted file mode 100644 index 930a601..0000000 --- a/0164-drv-hpre-support-dump-BD-when-BD-checks-fail.patch +++ /dev/null @@ -1,206 +0,0 @@ -From 40bf83f1ee78c6cf28114ea93c2d93eb3a312c1e Mon Sep 17 00:00:00 2001 -From: Kai Ye -Date: Sat, 23 Jul 2022 10:49:05 +0800 -Subject: [PATCH 179/183] drv/hpre: support dump BD when BD checks fail - -When BD parsing fails, dumped BD information. - -Signed-off-by: Kai Ye -Signed-off-by: Weili Qian ---- - drv/hisi_hpre.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++--- - 1 file changed, 78 insertions(+), 5 deletions(-) - -diff --git a/drv/hisi_hpre.c b/drv/hisi_hpre.c -index d957101..768c9a1 100644 ---- a/drv/hisi_hpre.c -+++ b/drv/hisi_hpre.c -@@ -100,6 +100,27 @@ struct hisi_hpre_ctx { - struct wd_ctx_config_internal config; - }; - -+static void dump_hpre_msg(void *msg, const char *s) -+{ -+ struct wd_rsa_msg *rsa_msg; -+ struct wd_ecc_msg *ecc_msg; -+ struct wd_dh_msg *dh_msg; -+ -+ WD_ERR("dump %s alg message after a task error occurs.\n", s); -+ -+ if (!strcmp(s, "rsa")) { -+ rsa_msg = (struct wd_rsa_msg *)msg; -+ WD_ERR("key_bytes:%u key_type:%u\n", rsa_msg->key_bytes, rsa_msg->key_type); -+ } else if (!strcmp(s, "ecc")) { -+ ecc_msg = (struct wd_ecc_msg *)msg; -+ WD_ERR("key_bytes:%u curve_id:%u\n", ecc_msg->key_bytes, ecc_msg->curve_id); -+ } else if (!strcmp(s, "dh")) { -+ dh_msg = (struct wd_dh_msg *)msg; -+ WD_ERR("gbytes:%u key_bytes:%u is_g2:%u\n", dh_msg->gbytes, -+ dh_msg->key_bytes, dh_msg->is_g2); -+ } -+} -+ - static bool is_hpre_bin_fmt(char *dst, const char *src, __u32 dsz, __u32 bsz) - { - const char *temp = src + dsz; -@@ -557,8 +578,10 @@ static void hpre_result_check(struct hisi_hpre_sqe *hw_msg, - static int rsa_recv(handle_t ctx, void *rsa_msg) - { - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); -+ struct hisi_qp *qp = (struct hisi_qp *)h_qp; - struct hisi_hpre_sqe hw_msg = {0}; - struct wd_rsa_msg *msg = rsa_msg; -+ struct wd_rsa_msg *temp_msg; - __u16 recv_cnt = 0; - int ret; - -@@ -571,6 +594,17 @@ static int rsa_recv(handle_t ctx, void *rsa_msg) - return ret; - - msg->tag = LW_U16(hw_msg.low_tag); -+ if (qp->q_info.qp_mode == CTX_MODE_ASYNC) { -+ temp_msg = wd_rsa_get_msg(qp->q_info.idx, msg->tag); -+ if (!temp_msg) { -+ WD_ERR("failed to get send msg! idx = %u, tag = %u.\n", -+ qp->q_info.idx, msg->tag); -+ return -WD_EINVAL; -+ } -+ } else { -+ temp_msg = msg; -+ } -+ - hpre_result_check(&hw_msg, &msg->result); - if (!msg->result) { - ret = rsa_out_transfer(msg, &hw_msg); -@@ -580,6 +614,9 @@ static int rsa_recv(handle_t ctx, void *rsa_msg) - } - } - -+ if (unlikely(msg->result != WD_SUCCESS)) -+ dump_hpre_msg(temp_msg, "rsa"); -+ - return 0; - } - -@@ -694,8 +731,10 @@ static int dh_send(handle_t ctx, void *dh_msg) - static int dh_recv(handle_t ctx, void *dh_msg) - { - handle_t h_qp = (handle_t)wd_ctx_get_priv(ctx); -+ struct hisi_qp *qp = (struct hisi_qp *)h_qp; - struct wd_dh_msg *msg = dh_msg; - struct hisi_hpre_sqe hw_msg = {0}; -+ struct wd_dh_msg *temp_msg; - __u16 recv_cnt = 0; - int ret; - -@@ -708,6 +747,17 @@ static int dh_recv(handle_t ctx, void *dh_msg) - return ret; - - msg->tag = LW_U16(hw_msg.low_tag); -+ if (qp->q_info.qp_mode == CTX_MODE_ASYNC) { -+ temp_msg = wd_dh_get_msg(qp->q_info.idx, msg->tag); -+ if (!temp_msg) { -+ WD_ERR("failed to get send msg! idx = %u, tag = %u.\n", -+ qp->q_info.idx, msg->tag); -+ return -WD_EINVAL; -+ } -+ } else { -+ temp_msg = msg; -+ } -+ - hpre_result_check(&hw_msg, &msg->result); - if (!msg->result) { - ret = dh_out_transfer(msg, &hw_msg); -@@ -717,6 +767,9 @@ static int dh_recv(handle_t ctx, void *dh_msg) - } - } - -+ if (unlikely(msg->result != WD_SUCCESS)) -+ dump_hpre_msg(temp_msg, "dh"); -+ - return 0; - } - -@@ -2185,22 +2238,42 @@ static int sm2_convert_dec_out(struct wd_ecc_msg *src, - return ret; - } - --static int ecc_sqe_parse(struct wd_ecc_msg *msg, struct hisi_hpre_sqe *hw_msg) -+static int ecc_sqe_parse(struct hisi_qp *qp, struct wd_ecc_msg *msg, -+ struct hisi_hpre_sqe *hw_msg) - { -+ struct wd_ecc_msg *temp_msg; - int ret; - - msg->tag = LW_U16(hw_msg->low_tag); -+ if (qp->q_info.qp_mode == CTX_MODE_ASYNC) { -+ temp_msg = wd_ecc_get_msg(qp->q_info.idx, msg->tag); -+ if (!temp_msg) { -+ WD_ERR("failed to get send msg! idx = %u, tag = %u.\n", -+ qp->q_info.idx, msg->tag); -+ return -WD_EINVAL; -+ } -+ } else { -+ temp_msg = msg; -+ } -+ - hpre_result_check(hw_msg, &msg->result); - if (!msg->result) { - ret = ecc_out_transfer(msg, hw_msg); - if (ret) { - msg->result = WD_OUT_EPARA; - WD_ERR("failed to transfer out ecc BD, ret = %d!\n", ret); -+ goto dump_err_msg; - } - } else { - ret = -msg->result; -+ goto dump_err_msg; - } - -+ return ret; -+ -+dump_err_msg: -+ dump_hpre_msg(temp_msg, "ecc"); -+ - return ret; - } - -@@ -2234,7 +2307,7 @@ static int parse_second_sqe(handle_t h_qp, - dst = *(struct wd_ecc_msg **)((uintptr_t)data + - hsz * ECDH_OUT_PARAM_NUM); - hw_msg.low_tag = 0; /* use sync mode */ -- ret = ecc_sqe_parse(dst, &hw_msg); -+ ret = ecc_sqe_parse((struct hisi_qp *)h_qp, dst, &hw_msg); - msg->result = dst->result; - *second = dst; - -@@ -2260,7 +2333,7 @@ static int sm2_enc_parse(handle_t h_qp, - - /* parse first sqe */ - hw_msg->low_tag = 0; /* use sync mode */ -- ret = ecc_sqe_parse(first, hw_msg); -+ ret = ecc_sqe_parse((struct hisi_qp *)h_qp, first, hw_msg); - if (ret) { - WD_ERR("failed to parse first BD, ret = %d!\n", ret); - goto free_first; -@@ -2304,7 +2377,7 @@ static int sm2_dec_parse(handle_t ctx, struct wd_ecc_msg *msg, - - /* parse first sqe */ - hw_msg->low_tag = 0; /* use sync mode */ -- ret = ecc_sqe_parse(dst, hw_msg); -+ ret = ecc_sqe_parse((struct hisi_qp *)ctx, dst, hw_msg); - if (ret) { - WD_ERR("failed to parse decode BD, ret = %d!\n", ret); - goto fail; -@@ -2347,7 +2420,7 @@ static int ecc_recv(handle_t ctx, void *ecc_msg) - hw_msg.sm2_mlen == HPRE_SM2_DEC) - return sm2_dec_parse(h_qp, msg, &hw_msg); - -- return ecc_sqe_parse(msg, &hw_msg); -+ return ecc_sqe_parse((struct hisi_qp *)h_qp, msg, &hw_msg); - } - - static struct wd_ecc_driver ecc_hisi_hpre = { --- -2.27.0 - diff --git a/0165-drv-hpre-bugfix-about-sm2-async-parsing-error.patch b/0165-drv-hpre-bugfix-about-sm2-async-parsing-error.patch deleted file mode 100644 index 2ee45bd..0000000 --- a/0165-drv-hpre-bugfix-about-sm2-async-parsing-error.patch +++ /dev/null @@ -1,129 +0,0 @@ -From d2996f7251e18c164fc3faba909e4ab90361c2e3 Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Sat, 23 Jul 2022 15:28:50 +0800 -Subject: [PATCH 180/183] drv/hpre: bugfix about sm2 async parsing error - -After a series of modification, the 'hw_msg->low_tag' is used to -represent the sequence of sync or async task element now. - -In async mode, the value of 'hw_msg->low_tag' comes from async task -pool, refers to wd_get_msg_from_pool(). In sync mode, the value of -'hw_msg->low_tag' is a random number, refers to hisi_set_msg_id(). -Therefore, whether 'hw_msg->low_tag' is zero cannot be used as the -judgment condition for different modes, so 'hw_msg->low_tag' cannot -be set to zero directly. This is the reason why the async task of -sm2 failed. - -To fix this problem, we remove the operation of setting tag to zero, -use 'qp_mode' to distinguish between sync and async modes. - -Signed-off-by: Zhiqi Song ---- - drv/hisi_hpre.c | 20 ++++++++++---------- - 1 file changed, 10 insertions(+), 10 deletions(-) - -diff --git a/drv/hisi_hpre.c b/drv/hisi_hpre.c -index 768c9a1..18e5a3c 100644 ---- a/drv/hisi_hpre.c -+++ b/drv/hisi_hpre.c -@@ -1939,13 +1939,13 @@ static int sm2_enc_out_transfer(struct wd_ecc_msg *msg, - } - - static int ecc_out_transfer(struct wd_ecc_msg *msg, -- struct hisi_hpre_sqe *hw_msg) -+ struct hisi_hpre_sqe *hw_msg, __u8 qp_mode) - { - int ret = -WD_EINVAL; - void *va; - - /* async */ -- if (LW_U16(hw_msg->low_tag)) { -+ if (qp_mode == CTX_MODE_ASYNC) { - va = VA_ADDR(hw_msg->hi_out, hw_msg->low_out); - msg->req.dst = container_of(va, struct wd_ecc_out, data); - } -@@ -2258,7 +2258,7 @@ static int ecc_sqe_parse(struct hisi_qp *qp, struct wd_ecc_msg *msg, - - hpre_result_check(hw_msg, &msg->result); - if (!msg->result) { -- ret = ecc_out_transfer(msg, hw_msg); -+ ret = ecc_out_transfer(msg, hw_msg, qp->q_info.qp_mode); - if (ret) { - msg->result = WD_OUT_EPARA; - WD_ERR("failed to transfer out ecc BD, ret = %d!\n", ret); -@@ -2306,7 +2306,6 @@ static int parse_second_sqe(handle_t h_qp, - hsz = (hw_msg.task_len1 + 1) * BYTE_BITS; - dst = *(struct wd_ecc_msg **)((uintptr_t)data + - hsz * ECDH_OUT_PARAM_NUM); -- hw_msg.low_tag = 0; /* use sync mode */ - ret = ecc_sqe_parse((struct hisi_qp *)h_qp, dst, &hw_msg); - msg->result = dst->result; - *second = dst; -@@ -2314,8 +2313,8 @@ static int parse_second_sqe(handle_t h_qp, - return ret; - } - --static int sm2_enc_parse(handle_t h_qp, -- struct wd_ecc_msg *msg, struct hisi_hpre_sqe *hw_msg) -+static int sm2_enc_parse(handle_t h_qp, struct wd_ecc_msg *msg, -+ struct hisi_hpre_sqe *hw_msg) - { - __u16 tag = LW_U16(hw_msg->low_tag); - struct wd_ecc_msg *second = NULL; -@@ -2325,6 +2324,7 @@ static int sm2_enc_parse(handle_t h_qp, - __u32 hsz; - int ret; - -+ msg->tag = tag; - data = VA_ADDR(hw_msg->hi_out, hw_msg->low_out); - hsz = (hw_msg->task_len1 + 1) * BYTE_BITS; - first = *(struct wd_ecc_msg **)((uintptr_t)data + -@@ -2332,7 +2332,6 @@ static int sm2_enc_parse(handle_t h_qp, - memcpy(&src, first + 1, sizeof(src)); - - /* parse first sqe */ -- hw_msg->low_tag = 0; /* use sync mode */ - ret = ecc_sqe_parse((struct hisi_qp *)h_qp, first, hw_msg); - if (ret) { - WD_ERR("failed to parse first BD, ret = %d!\n", ret); -@@ -2351,11 +2350,12 @@ static int sm2_enc_parse(handle_t h_qp, - WD_ERR("failed to convert sm2 std format, ret = %d!\n", ret); - goto free_second; - } -+ - free_second: - free_req(second); - free_first: - free_req(first); -- msg->tag = tag; -+ - return ret; - } - -@@ -2376,21 +2376,21 @@ static int sm2_dec_parse(handle_t ctx, struct wd_ecc_msg *msg, - memcpy(&src, dst + 1, sizeof(src)); - - /* parse first sqe */ -- hw_msg->low_tag = 0; /* use sync mode */ - ret = ecc_sqe_parse((struct hisi_qp *)ctx, dst, hw_msg); - if (ret) { - WD_ERR("failed to parse decode BD, ret = %d!\n", ret); - goto fail; - } - msg->result = dst->result; -+ msg->tag = tag; - - ret = sm2_convert_dec_out(&src, dst); - if (unlikely(ret)) { - WD_ERR("failed to convert sm2 decode out, ret = %d!\n", ret); - goto fail; - } -+ - fail: -- msg->tag = tag; - free(dst->req.dst); - free(dst); - --- -2.27.0 - diff --git a/0166-drv-hpre-bugfix-async-tag-of-rsa-and-dh.patch b/0166-drv-hpre-bugfix-async-tag-of-rsa-and-dh.patch deleted file mode 100644 index e6d3d49..0000000 --- a/0166-drv-hpre-bugfix-async-tag-of-rsa-and-dh.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 5e5bd0a4eb5a1bd794a4b6d8998bfaf40d98c808 Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Sat, 23 Jul 2022 15:43:12 +0800 -Subject: [PATCH 181/183] drv/hpre: bugfix async tag of rsa and dh - -Use 'qp_mode' to distinguish between sync and async modes -of RSA and DH algs. - -Signed-off-by: Zhiqi Song ---- - drv/hisi_hpre.c | 12 ++++++------ - 1 file changed, 6 insertions(+), 6 deletions(-) - -diff --git a/drv/hisi_hpre.c b/drv/hisi_hpre.c -index 18e5a3c..2e9db2f 100644 ---- a/drv/hisi_hpre.c -+++ b/drv/hisi_hpre.c -@@ -336,7 +336,7 @@ static int hpre_tri_bin_transfer(struct wd_dtb *bin0, struct wd_dtb *bin1, - } - - static int rsa_out_transfer(struct wd_rsa_msg *msg, -- struct hisi_hpre_sqe *hw_msg) -+ struct hisi_hpre_sqe *hw_msg, __u8 qp_mode) - { - struct wd_rsa_req *req = &msg->req; - struct wd_rsa_kg_out *key = req->dst; -@@ -348,7 +348,7 @@ static int rsa_out_transfer(struct wd_rsa_msg *msg, - - if (hw_msg->alg == HPRE_ALG_KG_CRT || hw_msg->alg == HPRE_ALG_KG_STD) { - /* async */ -- if (LW_U16(hw_msg->low_tag)) { -+ if (qp_mode == CTX_MODE_ASYNC) { - data = VA_ADDR(hw_msg->hi_out, hw_msg->low_out); - key = container_of(data, struct wd_rsa_kg_out, data); - } else { -@@ -607,7 +607,7 @@ static int rsa_recv(handle_t ctx, void *rsa_msg) - - hpre_result_check(&hw_msg, &msg->result); - if (!msg->result) { -- ret = rsa_out_transfer(msg, &hw_msg); -+ ret = rsa_out_transfer(msg, &hw_msg, qp->q_info.qp_mode); - if (ret) { - WD_ERR("failed to transfer out rsa BD!\n"); - msg->result = WD_OUT_EPARA; -@@ -660,7 +660,7 @@ static int fill_dh_xp_params(struct wd_dh_msg *msg, - } - - static int dh_out_transfer(struct wd_dh_msg *msg, -- struct hisi_hpre_sqe *hw_msg) -+ struct hisi_hpre_sqe *hw_msg, __u8 qp_mode) - { - __u16 key_bytes = (hw_msg->task_len1 + 1) * BYTE_BITS; - struct wd_dh_req *req = &msg->req; -@@ -668,7 +668,7 @@ static int dh_out_transfer(struct wd_dh_msg *msg, - int ret; - - /* async */ -- if (LW_U16(hw_msg->low_tag)) -+ if (qp_mode == CTX_MODE_ASYNC) - out = VA_ADDR(hw_msg->hi_out, hw_msg->low_out); - else - out = req->pri; -@@ -760,7 +760,7 @@ static int dh_recv(handle_t ctx, void *dh_msg) - - hpre_result_check(&hw_msg, &msg->result); - if (!msg->result) { -- ret = dh_out_transfer(msg, &hw_msg); -+ ret = dh_out_transfer(msg, &hw_msg, qp->q_info.qp_mode); - if (ret) { - WD_ERR("failed to transfer out dh BD!\n"); - msg->result = WD_OUT_EPARA; --- -2.27.0 - diff --git a/0167-drv-hpre-cleanup-ecc-sqe-parsing-process.patch b/0167-drv-hpre-cleanup-ecc-sqe-parsing-process.patch deleted file mode 100644 index 4c3fc10..0000000 --- a/0167-drv-hpre-cleanup-ecc-sqe-parsing-process.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 858b0598f933cbaa832bb0da85e003c63b366f5d Mon Sep 17 00:00:00 2001 -From: Zhiqi Song -Date: Sat, 23 Jul 2022 15:56:27 +0800 -Subject: [PATCH 182/183] drv/hpre: cleanup ecc sqe parsing process - -The previous processing logic of ecc_sqe_parse() was -not clear enough, so it was modified. - -Signed-off-by: Zhiqi Song ---- - drv/hisi_hpre.c | 16 ++++++++-------- - 1 file changed, 8 insertions(+), 8 deletions(-) - -diff --git a/drv/hisi_hpre.c b/drv/hisi_hpre.c -index 2e9db2f..552a565 100644 ---- a/drv/hisi_hpre.c -+++ b/drv/hisi_hpre.c -@@ -2257,18 +2257,18 @@ static int ecc_sqe_parse(struct hisi_qp *qp, struct wd_ecc_msg *msg, - } - - hpre_result_check(hw_msg, &msg->result); -- if (!msg->result) { -- ret = ecc_out_transfer(msg, hw_msg, qp->q_info.qp_mode); -- if (ret) { -- msg->result = WD_OUT_EPARA; -- WD_ERR("failed to transfer out ecc BD, ret = %d!\n", ret); -- goto dump_err_msg; -- } -- } else { -+ if (msg->result) { - ret = -msg->result; - goto dump_err_msg; - } - -+ ret = ecc_out_transfer(msg, hw_msg, qp->q_info.qp_mode); -+ if (ret) { -+ msg->result = WD_OUT_EPARA; -+ WD_ERR("failed to transfer out ecc BD, ret = %d!\n", ret); -+ goto dump_err_msg; -+ } -+ - return ret; - - dump_err_msg: --- -2.27.0 - diff --git a/libwd-2.3.21.tar.gz b/libwd-2.3.21.tar.gz deleted file mode 100644 index 83b861e325d2725f09c0df75f2f555a6ffbb1af5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12540204 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%0D#f4^%ZMJknqtV70 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%0DdfL_kvB2&FBmy5kdmT6(Kzi(k_qf7VK6kAJkNiD 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�zFTUD&0b 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

dxz6U?QMdUAl{87Tc2L6G< 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

E}t)rPcL@V1SAR=}ka7L!h? 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 z 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%0Dr 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

Ny0M1sV1} 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

L@>g<&q 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∾̳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

Y9_j9FScc`7fppe}<{+r&0LN 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%0DG~X#6Wf!gkWQjU5uUlk)T-VLdcHM>@!t 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