diff --git a/KAEOpensslProvider/configure.ac b/KAEOpensslProvider/configure.ac index f0b0b99f235b18b604669881a4f7b592e1db5848..915b24e156c0467bc64b64c8b67a2f55352cc97a 100644 --- a/KAEOpensslProvider/configure.ac +++ b/KAEOpensslProvider/configure.ac @@ -25,10 +25,7 @@ AC_ARG_WITH(openssl_install_dir, [Path to where the OpenSSL3.0 are installed to.])) AC_SUBST(with_openssl_install_dir) - AC_SUBST([includes_openssl], ["-I\$(with_openssl_install_dir)/include"]) -AC_SUBST([includes_openssl], ["-I`pkg-config --variable=includedir libcrypto`"]) - PKG_CHECK_MODULES(WD, libwd libwd_crypto, [-L/usr/local/lib -L$(AM_LDFLAGS)], [with_wd=yes], [with_wd=no]) AM_CONDITIONAL(HAVE_WD, [test "$with_wd" != "no"]) diff --git a/KAEOpensslProvider/test/func/demo/async_job.c b/KAEOpensslProvider/test/func/demo/async_job.c new file mode 100644 index 0000000000000000000000000000000000000000..e3e3d3aeefc19081a61623d7342a19a54d261e0c --- /dev/null +++ b/KAEOpensslProvider/test/func/demo/async_job.c @@ -0,0 +1,196 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define DATA_SIZE (16 * 1024) + +// 改进的任务上下文结构体 +typedef struct SM3_JOB_CTX { + unsigned char *data; + size_t data_len; + unsigned char md[EVP_MAX_MD_SIZE]; + unsigned int md_len; + EVP_MD_CTX *md_ctx; + EVP_MD *md_type; + struct SM3_JOB_CTX *orig_ctx; +} SM3_JOB_CTX; + +// 初始化OpenSSL provider +static int load_providers(OSSL_PROVIDER **prov_kae, OSSL_PROVIDER **prov_def) +{ + *prov_kae = OSSL_PROVIDER_load(NULL, "kae_provider"); + if (!*prov_kae) { + fprintf(stderr, "Warning: kae_provider not available, fallback.\n"); + return 0; + } + *prov_def = OSSL_PROVIDER_load(NULL, "default"); + if (!*prov_def) { + fprintf(stderr, "Error: default provider not available!\n"); + OSSL_PROVIDER_unload(*prov_kae); + return -1; + } + return 1; +} + +// 创建随机数据 +static unsigned char *generate_random_data(size_t size) +{ + unsigned char *data = OPENSSL_malloc(size); + if (!data) return NULL; + if (RAND_bytes(data, size) != 1) { + OPENSSL_free(data); + return NULL; + } + return data; +} + +// 异步任务函数 +static int sm3_async_job(void *args) +{ + SM3_JOB_CTX *job_ctx = (SM3_JOB_CTX *)args; + + if (!job_ctx->md_ctx) job_ctx->md_ctx = EVP_MD_CTX_new(); + if (!job_ctx->md_ctx) return 0; + + if (EVP_DigestInit_ex(job_ctx->md_ctx, job_ctx->md_type, NULL) <= 0) goto fail; + if (EVP_DigestUpdate(job_ctx->md_ctx, job_ctx->data, job_ctx->data_len) <= 0) goto fail; + + printf("[Job] DigestUpdate done, about to pause...\n"); + if (ASYNC_pause_job() == 0) goto fail; + + printf("[Job] Resumed after pause\n"); + if (EVP_DigestFinal_ex(job_ctx->md_ctx, job_ctx->md, &job_ctx->md_len) <= 0) goto fail; + + memcpy(job_ctx->orig_ctx->md, job_ctx->md, job_ctx->md_len); + job_ctx->orig_ctx->md_len = job_ctx->md_len; + + EVP_MD_CTX_free(job_ctx->md_ctx); + job_ctx->md_ctx = NULL; + return 1; + +fail: + EVP_MD_CTX_free(job_ctx->md_ctx); + job_ctx->md_ctx = NULL; + return 0; +} + +// 异步计算SM3 +static int async_sm3(unsigned char *data, size_t data_len) +{ + ASYNC_WAIT_CTX *wait_ctx = NULL; + ASYNC_JOB *job = NULL; + SM3_JOB_CTX *job_ctx; + int job_ret = 0; + + if (!ASYNC_is_capable() || ASYNC_init_thread(1, 1) != 1) { + fprintf(stderr, "Async not supported or init failed\n"); + return 0; + } + + wait_ctx = ASYNC_WAIT_CTX_new(); + if (!wait_ctx) return 0; + + job_ctx = OPENSSL_malloc(sizeof(SM3_JOB_CTX)); + if (!job_ctx) goto cleanup; + memset(job_ctx, 0, sizeof(SM3_JOB_CTX)); + job_ctx->data = data; + job_ctx->data_len = data_len; + job_ctx->orig_ctx = job_ctx; + job_ctx->md_type = EVP_MD_fetch(NULL, "SM3", "provider=kae_provider"); + + printf("Starting async SM3 job...\n"); + + while (1) { + int ret = ASYNC_start_job(&job, wait_ctx, &job_ret, sm3_async_job, job_ctx, sizeof(SM3_JOB_CTX)); + switch (ret) { + case ASYNC_ERR: + fprintf(stderr, "Async job error\n"); + goto cleanup; + case ASYNC_NO_JOBS: + fprintf(stderr, "No async jobs\n"); + goto cleanup; + case ASYNC_PAUSE: + printf("Job paused, doing other work...\n"); + break; + case ASYNC_FINISH: + if (job_ret == 1) { + printf("\nKAE Async job finished successfully\nHash length: %u\nHash: ", job_ctx->md_len); + for (unsigned int i = 0; i < job_ctx->md_len; i++) + printf("%02x", job_ctx->md[i]); + printf("\n"); + goto cleanup; + } else { + fprintf(stderr, "Async job failed\n"); + goto cleanup; + } + } + } + +cleanup: + if (job_ctx) { + EVP_MD_free(job_ctx->md_type); + OPENSSL_free(job_ctx); + } + if (wait_ctx) ASYNC_WAIT_CTX_free(wait_ctx); + ASYNC_cleanup_thread(); + return 1; +} + +// 同步计算SM3 +static int sync_sm3(unsigned char *data, size_t data_len) +{ + unsigned char md[EVP_MAX_MD_SIZE]; + unsigned int md_len; + EVP_MD_CTX *ctx = EVP_MD_CTX_new(); + EVP_MD *md_type = EVP_MD_fetch(NULL, "SM3", "provider=default"); + + if (!ctx || !md_type) return 0; + if (EVP_DigestInit_ex(ctx, md_type, NULL) <= 0 || + EVP_DigestUpdate(ctx, data, data_len) <= 0 || + EVP_DigestFinal_ex(ctx, md, &md_len) <= 0) { + EVP_MD_CTX_free(ctx); + EVP_MD_free(md_type); + return 0; + } + EVP_MD_CTX_free(ctx); + + printf("\nSoft SM3 hash completed synchronously\nHash length: %u\nHash: ", md_len); + for (unsigned int i = 0; i < md_len; i++) + printf("%02x", md[i]); + printf("\n"); + + EVP_MD_free(md_type); + return 1; +} + +int main() +{ + OSSL_PROVIDER *prov_kae = NULL, *prov_def = NULL; + unsigned char *data = NULL; + + int ret = load_providers(&prov_kae, &prov_def); + if (ret < 0) return -1; + + data = generate_random_data(DATA_SIZE); + if (!data) { + fprintf(stderr, "Failed to generate random data\n"); + goto unload; + } + + if (!async_sm3(data, DATA_SIZE)) { + printf("Falling back to synchronous SM3\n"); + } + sync_sm3(data, DATA_SIZE); + OPENSSL_free(data); + + unload: + if (prov_kae) OSSL_PROVIDER_unload(prov_kae); + if (prov_def) OSSL_PROVIDER_unload(prov_def); + + return 0; +} diff --git a/KAEOpensslProvider/test/func/demo/cipher.c b/KAEOpensslProvider/test/func/demo/cipher.c index d06f2fcbfb3900ee21948e575ea33c976f3c6286..8994828af919f93f98e7c4ab673e6080ffae224e 100644 --- a/KAEOpensslProvider/test/func/demo/cipher.c +++ b/KAEOpensslProvider/test/func/demo/cipher.c @@ -14,7 +14,7 @@ int main(void) // 加载 KAE provider 和 default provider prov_kae = OSSL_PROVIDER_load(NULL, "kae_provider"); if (!prov_kae) { - fprintf("Warning: kae_provider not available, will fallback.\n"); + fprintf(stderr, "Warning: kae_provider not available, will fallback.\n"); return 1; } diff --git a/build.sh b/build.sh index 252422f415b0abdc84c45dd1a676b1f9bcf10c0a..38345dddd60d114c14c84e926ca674b54fe85855 100644 --- a/build.sh +++ b/build.sh @@ -351,7 +351,7 @@ function build_engine() openssl_install_path=${openssl_install_path%/} cd ${SRC_PATH}/KAEOpensslEngine - export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig + export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:${openssl_install_path}/lib/pkgconfig autoreconf -i ./configure --libdir=/usr/local/lib/engines-1.1/ --enable-kae --with-openssl_install_dir=$openssl_install_path CFLAGS="-Wl,-z,relro,-z,now -fstack-protector-strong" make -j @@ -373,7 +373,7 @@ function build_engine_asm() fi cd ${SRC_PATH}/KAEOpensslEngine - export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig + export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:${openssl_install_path}/lib/pkgconfig autoreconf -i ./configure --libdir=/usr/local/lib/engines-1.1/ --enable-kae $enable_asm --with-openssl_install_dir=$openssl_install_path CFLAGS="-Wl,-z,relro,-z,now -fstack-protector-strong" make -j @@ -399,7 +399,7 @@ function build_engine_openssl3() openssl3_install_path=${openssl3_install_path%/} cd ${SRC_PATH}/KAEOpensslEngine - export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig + export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:${openssl3_install_path}/lib/pkgconfig autoreconf -i if [ ! -f "$openssl3_install_path/include/openssl/opensslv.h" ]; then @@ -439,7 +439,7 @@ function build_engine_openssl3_asm() fi cd ${SRC_PATH}/KAEOpensslEngine - export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig + export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:${openssl3_install_path}/lib/pkgconfig autoreconf -i if [ ! -f "$openssl3_install_path/include/openssl/opensslv.h" ]; then @@ -481,7 +481,7 @@ function build_ossl_provider() openssl3_install_path=$(which openssl | awk -F'/bin' '{print $1}') fi cd ${SRC_PATH}/KAEOpensslProvider - export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig + export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:${openss3_install_path}/lib/pkgconfig autoreconf -i if [ ! -f "$openssl3_install_path/include/openssl/opensslv.h" ]; then @@ -550,7 +550,7 @@ function build_engine3_tongsuo() tongsuo_install_path=${tongsuo_install_path%/} cd ${SRC_PATH}/KAEOpensslEngine - export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig + export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:${tongsuo_install_path}/lib/pkgconfig autoreconf -i if [ ! -f "$tongsuo_install_path/include/openssl/opensslv.h" ]; then