openssl3.2 - 测试程序的学习 - 准备openssl测试专用工程的模板

文章目录

    • [openssl3.2 - 测试程序的学习 - 准备openssl测试专用工程的模板](#openssl3.2 - 测试程序的学习 - 准备openssl测试专用工程的模板)
    • 概述
    • 笔记
    • 工程中需要的openssl的库实现
    • [补充 - 最终的模板工程](#补充 - 最终的模板工程)
    • END

openssl3.2 - 测试程序的学习 - 准备openssl测试专用工程的模板

概述

openssl3.2 - 测试程序的学习

整了几个test.c, 每开一个新的测试工程, 总要改这改那的. 挺麻烦的.

想建立一个专门用于学习openssl测试工程的VS2019模板工程. 等做新实验时, 将openssl的测试程序加入工程, 做少量改动, 就能做实验.

如果每次做一个实验, 都要向工程中加入大量支持文件, 受不了.

观察了一下makefile中的测试工程的生成, 普遍都是一个测试程序的.c + 一个测试库 + openssl的公共库.

bash 复制代码
// 测试.exe的实现组成
test\afalgtest.exe: test\afalgtest-bin-afalgtest.obj test\libtestutil.lib libcrypto.lib
	IF EXIST test\afalgtest.exe.manifest DEL /F /Q test\afalgtest.exe.manifest
	$(LD) $(LDFLAGS) $(BIN_LDFLAGS) @<<
test\afalgtest-bin-afalgtest.obj

// 测试.c的实现组成
test\afalgtest-bin-afalgtest.obj: test\afalgtest.c
	$(CC)  $(BIN_CFLAGS) -I"include" -I"apps\include" $(BIN_CPPFLAGS)  -c $(COUTFLAG)$@ "test\afalgtest.c"
	cmd /C "$(CC) /Zs /showIncludes  $(BIN_CFLAGS) -I"include" -I"apps\include" $(BIN_CPPFLAGS)  "test\afalgtest.c" > test\afalgtest-bin-afalgtest.d 2>&1"

// libtestutil.lib的实现组成
test\libtestutil.lib: apps\lib\libtestutil-lib-opt.obj apps\lib\libtestutil-lib-win32_init.obj test\testutil\libtestutil-lib-apps_shims.obj test\testutil\libtestutil-lib-basic_output.obj test\testutil\libtestutil-lib-cb.obj test\testutil\libtestutil-lib-driver.obj test\testutil\libtestutil-lib-fake_random.obj test\testutil\libtestutil-lib-format_output.obj test\testutil\libtestutil-lib-load.obj test\testutil\libtestutil-lib-main.obj test\testutil\libtestutil-lib-options.obj test\testutil\libtestutil-lib-output.obj test\testutil\libtestutil-lib-provider.obj test\testutil\libtestutil-lib-random.obj test\testutil\libtestutil-lib-stanza.obj test\testutil\libtestutil-lib-test_cleanup.obj test\testutil\libtestutil-lib-test_options.obj test\testutil\libtestutil-lib-tests.obj test\testutil\libtestutil-lib-testutil_init.obj
	$(AR) $(ARFLAGS) $(AROUTFLAG)test\libtestutil.lib @<<
apps\lib\libtestutil-lib-opt.obj
apps\lib\libtestutil-lib-win32_init.obj
test\testutil\libtestutil-lib-apps_shims.obj
test\testutil\libtestutil-lib-basic_output.obj
test\testutil\libtestutil-lib-cb.obj
test\testutil\libtestutil-lib-driver.obj
test\testutil\libtestutil-lib-fake_random.obj
test\testutil\libtestutil-lib-format_output.obj
test\testutil\libtestutil-lib-load.obj
test\testutil\libtestutil-lib-main.obj
test\testutil\libtestutil-lib-options.obj
test\testutil\libtestutil-lib-output.obj
test\testutil\libtestutil-lib-provider.obj
test\testutil\libtestutil-lib-random.obj
test\testutil\libtestutil-lib-stanza.obj
test\testutil\libtestutil-lib-test_cleanup.obj
test\testutil\libtestutil-lib-test_options.obj
test\testutil\libtestutil-lib-tests.obj
test\testutil\libtestutil-lib-testutil_init.obj
<<
apps\lib\libtestutil-lib-opt.obj: apps\lib\opt.c
	$(CC)  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  -c $(COUTFLAG)$@ "apps\lib\opt.c"
	cmd /C "$(CC) /Zs /showIncludes  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  "apps\lib\opt.c" > apps\lib\libtestutil-lib-opt.d 2>&1"
apps\lib\libtestutil-lib-win32_init.obj: apps\lib\win32_init.c
	$(CC)  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  -c $(COUTFLAG)$@ "apps\lib\win32_init.c"
	cmd /C "$(CC) /Zs /showIncludes  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  "apps\lib\win32_init.c" > apps\lib\libtestutil-lib-win32_init.d 2>&1"
test\testutil\libtestutil-lib-apps_shims.obj: test\testutil\apps_shims.c
	$(CC)  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  -c $(COUTFLAG)$@ "test\testutil\apps_shims.c"
	cmd /C "$(CC) /Zs /showIncludes  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  "test\testutil\apps_shims.c" > test\testutil\libtestutil-lib-apps_shims.d 2>&1"
test\testutil\libtestutil-lib-basic_output.obj: test\testutil\basic_output.c
	$(CC)  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  -c $(COUTFLAG)$@ "test\testutil\basic_output.c"
	cmd /C "$(CC) /Zs /showIncludes  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  "test\testutil\basic_output.c" > test\testutil\libtestutil-lib-basic_output.d 2>&1"
test\testutil\libtestutil-lib-cb.obj: test\testutil\cb.c
	$(CC)  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  -c $(COUTFLAG)$@ "test\testutil\cb.c"
	cmd /C "$(CC) /Zs /showIncludes  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  "test\testutil\cb.c" > test\testutil\libtestutil-lib-cb.d 2>&1"
test\testutil\libtestutil-lib-driver.obj: test\testutil\driver.c
	$(CC)  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  -c $(COUTFLAG)$@ "test\testutil\driver.c"
	cmd /C "$(CC) /Zs /showIncludes  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  "test\testutil\driver.c" > test\testutil\libtestutil-lib-driver.d 2>&1"
test\testutil\libtestutil-lib-fake_random.obj: test\testutil\fake_random.c
	$(CC)  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  -c $(COUTFLAG)$@ "test\testutil\fake_random.c"
	cmd /C "$(CC) /Zs /showIncludes  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  "test\testutil\fake_random.c" > test\testutil\libtestutil-lib-fake_random.d 2>&1"
test\testutil\libtestutil-lib-format_output.obj: test\testutil\format_output.c
	$(CC)  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  -c $(COUTFLAG)$@ "test\testutil\format_output.c"
	cmd /C "$(CC) /Zs /showIncludes  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  "test\testutil\format_output.c" > test\testutil\libtestutil-lib-format_output.d 2>&1"
test\testutil\libtestutil-lib-load.obj: test\testutil\load.c
	$(CC)  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  -c $(COUTFLAG)$@ "test\testutil\load.c"
	cmd /C "$(CC) /Zs /showIncludes  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  "test\testutil\load.c" > test\testutil\libtestutil-lib-load.d 2>&1"
test\testutil\libtestutil-lib-main.obj: test\testutil\main.c
	$(CC)  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  -c $(COUTFLAG)$@ "test\testutil\main.c"
	cmd /C "$(CC) /Zs /showIncludes  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  "test\testutil\main.c" > test\testutil\libtestutil-lib-main.d 2>&1"
test\testutil\libtestutil-lib-options.obj: test\testutil\options.c
	$(CC)  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  -c $(COUTFLAG)$@ "test\testutil\options.c"
	cmd /C "$(CC) /Zs /showIncludes  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  "test\testutil\options.c" > test\testutil\libtestutil-lib-options.d 2>&1"
test\testutil\libtestutil-lib-output.obj: test\testutil\output.c
	$(CC)  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  -c $(COUTFLAG)$@ "test\testutil\output.c"
	cmd /C "$(CC) /Zs /showIncludes  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  "test\testutil\output.c" > test\testutil\libtestutil-lib-output.d 2>&1"
test\testutil\libtestutil-lib-provider.obj: test\testutil\provider.c
	$(CC)  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  -c $(COUTFLAG)$@ "test\testutil\provider.c"
	cmd /C "$(CC) /Zs /showIncludes  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  "test\testutil\provider.c" > test\testutil\libtestutil-lib-provider.d 2>&1"
test\testutil\libtestutil-lib-random.obj: test\testutil\random.c
	$(CC)  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  -c $(COUTFLAG)$@ "test\testutil\random.c"
	cmd /C "$(CC) /Zs /showIncludes  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  "test\testutil\random.c" > test\testutil\libtestutil-lib-random.d 2>&1"
test\testutil\libtestutil-lib-stanza.obj: test\testutil\stanza.c
	$(CC)  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  -c $(COUTFLAG)$@ "test\testutil\stanza.c"
	cmd /C "$(CC) /Zs /showIncludes  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  "test\testutil\stanza.c" > test\testutil\libtestutil-lib-stanza.d 2>&1"
test\testutil\libtestutil-lib-test_cleanup.obj: test\testutil\test_cleanup.c
	$(CC)  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  -c $(COUTFLAG)$@ "test\testutil\test_cleanup.c"
	cmd /C "$(CC) /Zs /showIncludes  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  "test\testutil\test_cleanup.c" > test\testutil\libtestutil-lib-test_cleanup.d 2>&1"
test\testutil\libtestutil-lib-test_options.obj: test\testutil\test_options.c
	$(CC)  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  -c $(COUTFLAG)$@ "test\testutil\test_options.c"
	cmd /C "$(CC) /Zs /showIncludes  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  "test\testutil\test_options.c" > test\testutil\libtestutil-lib-test_options.d 2>&1"
test\testutil\libtestutil-lib-tests.obj: test\testutil\tests.c
	$(CC)  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  -c $(COUTFLAG)$@ "test\testutil\tests.c"
	cmd /C "$(CC) /Zs /showIncludes  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  "test\testutil\tests.c" > test\testutil\libtestutil-lib-tests.d 2>&1"
test\testutil\libtestutil-lib-testutil_init.obj: test\testutil\testutil_init.c
	$(CC)  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  -c $(COUTFLAG)$@ "test\testutil\testutil_init.c"
	cmd /C "$(CC) /Zs /showIncludes  $(LIB_CFLAGS) -I"include" -I"apps\include" -I"." $(LIB_CPPFLAGS)  "test\testutil\testutil_init.c" > test\testutil\libtestutil-lib-testutil_init.d 2>&1"
engines\capi.dll: engines\capi-dso-e_capi.obj engines\capi.def libcrypto.lib
	IF EXIST engines\capi.dll.manifest DEL /F /Q engines\capi.dll.manifest
	cmd /C "$(LD) $(LDFLAGS) $(DSO_LDFLAGS) @<< || (DEL /Q $(@B).* engines\capi.* & EXIT 1)"

那应该建立一个以 libtestutil.lib 实现为主的工程, 补充一些空实现(在自己添加的2个公共实现里面, 用宏来控制空实现的有无), 让这个.exe工程能自编译过.

那么这就是专门做openssl测试程序实验的工程.

等做openssl测试程序新实验时, 如果测试.c有程序里面需要的要求的几个必须实现, 用宏关掉模板公共实现中的空实现即可.

试了一下好使, 做新实验时方便多了.

笔记

工程中需要的openssl的库实现

将编译过的openssl源码目录中的apps, test/testutil 目录直接拷贝到模板工程下, 将垃圾都删掉(只保留.c, .h)

工程设置合适的头文件路径和库路径

按照makefile中, test\libtestutil.lib 的实现要求, 加入对应的.c

加入自己做的2个公共文件, 里面有头文件包含和库包含, 还有宏控制的openssl测试专用的几个空实现.

c 复制代码
/*!
\file my_openSSL_lib.h
*/

#ifndef __MY_OPENSSL_LIB_H__
#define __MY_OPENSSL_LIB_H__

#ifdef  _WIN32
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib") // for select()

#include <windows.h>
#endif /* #ifdef  _WIN32 */

#pragma comment(lib, "libcrypto.lib")
#pragma comment(lib, "libssl.lib")

#ifdef  _WIN32
#define MY_SLEEP(x) Sleep(x)
#else
#define MY_SLEEP(x) sleep(x)
#endif /* #ifdef  _WIN32 */

#define USE_MY_SETUP_TEST

// #define USE_MY_OPTION_choice

#ifdef USE_MY_OPTION_choice

#include "testutil.h"

// 需要将其他实现中的enum定义拷贝过来
typedef enum OPTION_choice {
    OPT_ERR = -1,
    OPT_EOF = 0,
    OPT_CONFIG_FILE,
    OPT_TEST_ENUM
} OPTION_CHOICE;

#endif // #ifdef USE_MY_OPTION_choice


#endif /* #ifndef __MY_OPENSSL_LIB_H__ */
c 复制代码
/*!
* \file D:\my_dev\my_local_git_prj\study\openSSL\nmake_test\test_c\prj_005_afalgtest.c\my_openSSL_lib.c
*/

#include "my_openSSL_lib.h"

#define MY_USE_APPLINK
#ifdef MY_USE_APPLINK
#include <openssl/applink.c> /*! for OPENSSL_Uplink(00007FF8B7EF0FE8,08): no OPENSSL_Applink */
#endif // #ifdef MY_USE_APPLINK

#ifdef USE_MY_OPTION_choice



const OPTIONS* test_get_options(void)
{
    // 这个函数返回不能为空, 从其他有实现的函数中拷贝一个实现过来, 否则有崩溃报错

    static const OPTIONS test_options[] = {
        OPT_TEST_OPTIONS_DEFAULT_USAGE,
        { "config", OPT_CONFIG_FILE, '<',
          "The configuration file to use for the libctx" },
        { NULL }
    };
    return test_options;
}

#endif // #ifdef USE_MY_OPTION_choice

#ifdef USE_MY_SETUP_TEST
int setup_tests(void)
{
    return 0;
}

# endif // 

编译通过

bash 复制代码
1>  正在创建库 D:\my_dev\my_local_git_prj\study\openSSL\nmake_test\test_c\prj_openssl_test_template\x64\Debug\prj_template.lib 和对象 D:\my_dev\my_local_git_prj\study\openSSL\nmake_test\test_c\prj_openssl_test_template\x64\Debug\prj_template.exp
1>prj_template.vcxproj -> D:\my_dev\my_local_git_prj\study\openSSL\nmake_test\test_c\prj_openssl_test_template\x64\Debug\prj_template.exe
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========

就将这个工程作为openssl测试(test/*.c)专用的工程模板

补充 - 最终的模板工程

用工程模板, 过了100+的官方测试工程,都好使.

记录一下最终版本.

工程中有些实现要删除掉, 因为和测试工程中的函数定义重复. 最终模板工程的文件列表如下

bash 复制代码
文件夹 PATH 列表
卷序列号为 36AD-51CE
D:.
|   my_openSSL_lib.c
|   my_openSSL_lib.h
|   prj_template.sln
|   prj_template.vcxproj
|   prj_template.vcxproj.filters
|   prj_template.vcxproj.user
|   testutil.h
|   tree_all_file.txt
|   
+---apps
|   |   asn1parse.c
|   |   ca.c
|   |   ciphers.c
|   |   cmp.c
|   |   cms.c
|   |   crl.c
|   |   crl2pkcs7.c
|   |   dgst.c
|   |   dhparam.c
|   |   dsa.c
|   |   dsaparam.c
|   |   ec.c
|   |   ecparam.c
|   |   enc.c
|   |   engine.c
|   |   errstr.c
|   |   fipsinstall.c
|   |   gendsa.c
|   |   genpkey.c
|   |   genrsa.c
|   |   info.c
|   |   kdf.c
|   |   list.c
|   |   mac.c
|   |   nseq.c
|   |   ocsp.c
|   |   openssl.c
|   |   passwd.c
|   |   pkcs12.c
|   |   pkcs7.c
|   |   pkcs8.c
|   |   pkey.c
|   |   pkeyparam.c
|   |   pkeyutl.c
|   |   prime.c
|   |   progs.c
|   |   progs.h
|   |   rand.c
|   |   rehash.c
|   |   req.c
|   |   rsa.c
|   |   rsautl.c
|   |   sess_id.c
|   |   smime.c
|   |   speed.c
|   |   spkac.c
|   |   srp.c
|   |   storeutl.c
|   |   s_client.c
|   |   s_server.c
|   |   s_time.c
|   |   testdsa.h
|   |   testrsa.h
|   |   timeouts.h
|   |   ts.c
|   |   verify.c
|   |   version.c
|   |   vms_decc_init.c
|   |   x509.c
|   |   
|   +---include
|   |       apps.h
|   |       apps_ui.h
|   |       app_libctx.h
|   |       app_params.h
|   |       cmp_mock_srv.h
|   |       ec_common.h
|   |       engine_loader.h
|   |       fmt.h
|   |       function.h
|   |       http_server.h
|   |       log.h
|   |       names.h
|   |       opt.h
|   |       platform.h
|   |       s_apps.h
|   |       vms_term_sock.h
|   |       __DECC_INCLUDE_EPILOGUE.H
|   |       __DECC_INCLUDE_PROLOGUE.H
|   |       
|   \---lib
|           apps.c
|           apps_opt_printf.c
|           apps_ui.c
|           app_libctx.c
|           app_params.c
|           app_provider.c
|           app_rand.c
|           app_x509.c
|           build.info
|           cmp_mock_srv.c
|           columns.c
|           engine.c
|           engine_loader.c
|           fmt.c
|           http_server.c
|           log.c
|           names.c
|           opt.c
|           s_cb.c
|           s_socket.c
|           tlssrp_depr.c
|           vms_decc_argv.c
|           vms_term_sock.c
|           win32_init.c
|           
+---include
|   |   bn_prime.h
|   |   bn_rand_range.h
|   |   evp_local.h
|   |   
|   +---crypto
|   |       aes_platform.h
|   |       aria.h
|   |       asn1.h
|   |       asn1err.h
|   |       asn1_dsa.h
|   |       async.h
|   |       asyncerr.h
|   |       bioerr.h
|   |       bn.h
|   |       bnerr.h
|   |       bn_conf.h
|   |       bn_dh.h
|   |       bn_srp.h
|   |       buffererr.h
|   |       chacha.h
|   |       cmll_platform.h
|   |       cmperr.h
|   |       cmserr.h
|   |       comperr.h
|   |       conferr.h
|   |       context.h
|   |       crmferr.h
|   |       cryptlib.h
|   |       cryptoerr.h
|   |       cterr.h
|   |       ctype.h
|   |       decoder.h
|   |       decodererr.h
|   |       des_platform.h
|   |       dh.h
|   |       dherr.h
|   |       dsa.h
|   |       dsaerr.h
|   |       dso_conf.h
|   |       ec.h
|   |       ecerr.h
|   |       ecx.h
|   |       encoder.h
|   |       encodererr.h
|   |       engine.h
|   |       engineerr.h
|   |       err.h
|   |       ess.h
|   |       esserr.h
|   |       evp.h
|   |       evperr.h
|   |       httperr.h
|   |       lhash.h
|   |       md32_common.h
|   |       modes.h
|   |       objects.h
|   |       objectserr.h
|   |       ocsperr.h
|   |       pem.h
|   |       pemerr.h
|   |       pkcs12err.h
|   |       pkcs7.h
|   |       pkcs7err.h
|   |       poly1305.h
|   |       ppc_arch.h
|   |       punycode.h
|   |       rand.h
|   |       randerr.h
|   |       rand_pool.h
|   |       riscv_arch.h
|   |       rsa.h
|   |       rsaerr.h
|   |       security_bits.h
|   |       sha.h
|   |       siphash.h
|   |       siv.h
|   |       sm2.h
|   |       sm2err.h
|   |       sm4.h
|   |       sm4_platform.h
|   |       sparc_arch.h
|   |       sparse_array.h
|   |       store.h
|   |       storeerr.h
|   |       tserr.h
|   |       types.h
|   |       uierr.h
|   |       x509.h
|   |       x509err.h
|   |       x509v3err.h
|   |       __DECC_INCLUDE_EPILOGUE.H
|   |       __DECC_INCLUDE_PROLOGUE.H
|   |       
|   \---internal
|           asn1.h
|           bio.h
|           bio_addr.h
|           bio_tfo.h
|           common.h
|           comp.h
|           conf.h
|           constant_time.h
|           core.h
|           cryptlib.h
|           dane.h
|           deprecated.h
|           der.h
|           deterministic_nonce.h
|           dso.h
|           dsoerr.h
|           endian.h
|           err.h
|           event_queue.h
|           e_os.h
|           ffc.h
|           hpke_util.h
|           ktls.h
|           list.h
|           namemap.h
|           nelem.h
|           numbers.h
|           o_dir.h
|           packet.h
|           packet_quic.h
|           params.h
|           param_build_set.h
|           param_names.h
|           passphrase.h
|           priority_queue.h
|           property.h
|           propertyerr.h
|           provider.h
|           quic_ackm.h
|           quic_cc.h
|           quic_cfq.h
|           quic_channel.h
|           quic_demux.h
|           quic_error.h
|           quic_fc.h
|           quic_fifd.h
|           quic_reactor.h
|           quic_record_rx.h
|           quic_record_tx.h
|           quic_record_util.h
|           quic_rx_depack.h
|           quic_sf_list.h
|           quic_ssl.h
|           quic_statm.h
|           quic_stream.h
|           quic_stream_map.h
|           quic_thread_assist.h
|           quic_tls.h
|           quic_tserver.h
|           quic_txp.h
|           quic_txpim.h
|           quic_types.h
|           quic_vlint.h
|           quic_wire.h
|           quic_wire_pkt.h
|           recordmethod.h
|           refcount.h
|           ring_buf.h
|           safe_math.h
|           sha3.h
|           sizes.h
|           sm3.h
|           sockets.h
|           ssl.h
|           ssl3_cbc.h
|           sslconf.h
|           statem.h
|           symhacks.h
|           thread.h
|           thread_arch.h
|           thread_once.h
|           time.h
|           tlsgroups.h
|           tsan_assist.h
|           uint_set.h
|           unicode.h
|           __DECC_INCLUDE_EPILOGUE.H
|           __DECC_INCLUDE_PROLOGUE.H
|           
\---testutil
        apps_shims.c
        basic_output.c
        cb.c
        driver.c
        fake_random.c
        format_output.c
        load.c
        main.c
        options.c
        output.c
        output.h
        provider.c
        random.c
        stanza.c
        tests.c
        tu_local.h
        

VS2019工程中看到的工程文件(不包含头文件, 都是根据头文件路径设置自动引用)

在openssl安装好的目录, 不需要添加任何openssl源码目录的文件, 保持原样.

自己在工程中添加的2个文件(my_openSSL_lib.*), 这块是是否能方便添加任何官方测试实现, 并能快速编译通过的点.

c 复制代码
/*!
\file my_openSSL_lib.h
*/

#ifndef __MY_OPENSSL_LIB_H__
#define __MY_OPENSSL_LIB_H__

#ifdef  _WIN32
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib") // for select()

#include <windows.h>
#endif /* #ifdef  _WIN32 */

#pragma comment(lib, "libcrypto.lib")
#pragma comment(lib, "libssl.lib")

// --------------------------------------------------------------------------------
// 开关宏 - begin
// 5个开关宏默认是打开的, 在没有加入openssl官方的测试实现(.c)时, 本工程模板也能正常编译过, 只是不干活
// 加入openssl官方的测试实现(.c)后, 如果工程提供了开关宏同名的函数实现, 只需要将对应开关宏关掉, 就可以将官方测试实现编译过.
// --------------------------------------------------------------------------------

// 提供默认的 global_init()
#define MY_GLOBAL_INIT 

// 提供默认的 test_get_options()
#define USE_MY_OPTION_choice

// 提供默认的setup_tests()
#define USE_MY_SETUP_TEST

// 提供默认的 cleanup_tests()
#define USE_MY_CLEANUP_TEST

// 提供默认的 opt_printf_stderr()
#define USE_MY_OPT_PRINT_ERR

// --------------------------------------------------------------------------------
// 开关宏 - END
// --------------------------------------------------------------------------------

#ifdef  _WIN32
#define MY_SLEEP(x) Sleep(x)
#else
#define MY_SLEEP(x) sleep(x)
#endif /* #ifdef  _WIN32 */

#ifdef USE_MY_OPTION_choice

#include "testutil.h"

// 需要将其他实现中的enum定义拷贝过来
typedef enum OPTION_choice {
    OPT_CONFIG_FILE = 1,
} OPTION_CHOICE;

#endif // #ifdef USE_MY_OPTION_choice


#endif /* #ifndef __MY_OPENSSL_LIB_H__ */
c 复制代码
/*!
* \file D:\my_dev\my_local_git_prj\study\openSSL\nmake_test\test_c\prj_005_afalgtest.c\my_openSSL_lib.c
*/

#include "my_openSSL_lib.h"
#include "opt.h"
#include "testutil.h"
#include "tu_local.h" // for OPT_TEST_OPTIONS_DEFAULT_USAGE
#include "output.h" // for test_vprintf_stderr()

#define MY_USE_APPLINK
#ifdef MY_USE_APPLINK
#include <openssl/applink.c> /*! for OPENSSL_Uplink(00007FF8B7EF0FE8,08): no OPENSSL_Applink */
#endif // #ifdef MY_USE_APPLINK

#ifdef USE_MY_OPTION_choice
const OPTIONS* test_get_options(void)
{
    // 这个函数返回不能为空, 从其他有实现的函数中拷贝一个实现过来, 否则有崩溃报错

    static const OPTIONS test_options[] = {
        OPT_TEST_OPTIONS_DEFAULT_USAGE,
        { "config", OPT_CONFIG_FILE, '<',
          "The configuration file to use for the libctx" },
        { NULL }
    };
    return test_options;
}

#endif // #ifdef USE_MY_OPTION_choice

#ifdef USE_MY_SETUP_TEST
int setup_tests(void)
{
    return 0;
}

# endif // 



#ifdef USE_MY_CLEANUP_TEST
void cleanup_tests(void)
{
}
#endif // #ifdef USE_MY_CLEANUP_TEST

#ifdef USE_MY_OPT_PRINT_ERR
int opt_printf_stderr(const char* fmt, ...)
{
    va_list ap;
    int ret;

    va_start(ap, fmt);
    ret = test_vprintf_stderr(fmt, ap);
    va_end(ap);
    return ret;
}

#endif // #ifdef USE_MY_OPT_PRINT_ERR

#ifdef MY_GLOBAL_INIT

int global_init(void)
{
#ifndef OPENSSL_NO_TRACE
    setup_trace(getenv("OPENSSL_TRACE"));
#endif

    return 1;
}

#endif // #ifdef MY_GLOBAL_INIT

这个工程模板只适合官方测试工程中, 用于测试对外提供的那些API.

如果是官方内部测试的实现, 是编译不过的.

不过, openssl的用户, 基本也就关心外部API怎么用. 从openssl用户的立场出发, 这个工程模板就挺好的.

END

相关推荐
pzs02212 天前
openssl的使用
openssl
小亦小亦_空中接力4 天前
openssl+keepalived安装部署
openssl·keepalived
摸鱼手会滑6 天前
源码编译安装python3.12没有ssl模块,python3.12 ModuleNotFoundError: No module named ‘_ssl‘
ssl·openssl·python3
老朱自强不息18 天前
Windows 平台编译openssl3.3
windows·openssl
promise5241 个月前
openssl 详解
linux·运维·服务器·网络协议·安全·https·openssl
俱会一处1 个月前
用openssl 创建自签名证书用于内网HTTPS
https·openssl·内网·局域网
xiaogengtongxu1 个月前
CA证书和openssl介绍
网络·安全·openssl
蚯蚓也自由1 个月前
openssl版本不同引发的崩溃
linux·服务器·调试·openssl·崩溃
husterlichf2 个月前
openssl req 详解
openssl·ca证书
我想学LINUX2 个月前
【常见开源库的二次开发】基于openssl的加密与解密——SHA算法源码解析(六)
算法·开源·openssl·比特币·sha-1·sha-2·比特币挖矿