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

相关推荐
胡西风_foxww10 天前
Linux下编译安装Nginx
linux·运维·nginx·编译·安装·openssl·pcre
Ho_pe14 天前
ubuntu下openssl签名证书制作流程及验证demo
服务器·ubuntu·openssl
花落已飘15 天前
openssl对称加密代码讲解实战
加密·openssl
花落已飘17 天前
openssl加密算法简介
加密·openssl
石牌桥网管19 天前
OpenSSL 生成根证书、中间证书和网站证书
网络协议·https·openssl
雨雪飘零19 天前
Windows系统使用OpenSSL生成自签名证书
nginx·证书·openssl
许野平1 个月前
OpenSSL:生成 DER 格式的 RSA 密钥对
服务器·网络·openssl·rsa·pem·der
Xnah_1 个月前
ubuntu 20.4 安装 openssl 3.x
ubuntu·openssl
redwingz1 个月前
openssl签名报错
openssl·random
Anlige1 个月前
PHP实现OPENSSL的EVP_BytesToKey
开发语言·php·openssl·evp