文章目录
-
- [openssl3.2 - 测试程序的学习 - 准备openssl测试专用工程的模板](#openssl3.2 - 测试程序的学习 - 准备openssl测试专用工程的模板)
- 概述
- 笔记
- 工程中需要的openssl的库实现
- [补充 - 最终的模板工程](#补充 - 最终的模板工程)
- END
openssl3.2 - 测试程序的学习 - 准备openssl测试专用工程的模板
概述
整了几个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用户的立场出发, 这个工程模板就挺好的.