openssl3.2 - 测试程序的学习

文章目录

    • openssl3.2 - 测试程序的学习
    • 概述
    • 笔记
    • openssl3.2 - 测试程序的学习 - 准备openssl测试专用工程的模板
    • openssl3.2 - 测试程序的学习 - test\aborttest.c
    • openssl3.2 - 测试程序的学习 - test\sanitytest.c
    • openssl3.2 - 测试程序的学习 - test\acvp_test.c
    • openssl3.2 - 测试程序的学习 - test\aesgcmtest.c
    • openssl3.2 - 测试程序的学习 - error LNK2019: 无法解析的外部符号 evp_pkey_export_to_provider, evp_keymgmt_get_params
    • 可以用一个工程模板, 来学习所有的case
    • 测试文件.c 的有效范围
    • asn1_string_table_test.c
    • asynctest.c
    • bad_dtls_test.c
    • bftest.c
    • bio_addr_test.c
    • bio_callback_test.c
    • bio_comp_test.c
    • bio_core_test.c
    • bio_dgram_test.c
    • bio_enc_test.c
    • bio_memleak_test.c
    • bio_prefix_text.c
    • bio_readbuffer_test.c
    • bio_tfo_test.c
    • bioprinttest
    • bn_internal_test.c
    • bntest.c
    • build_wincrypt_test.c
    • buildtest_*.c
    • casttest.c
    • cipherlist_test.c
    • ciphername_test.c
    • clienthellotest.c
    • cmactest.c
    • 没用的内部测试
    • END

openssl3.2 - 测试程序的学习

概述

namke test时, 记录日志.

nmake test > nmake_test_log.txt

可以看到生成了很多测试程序.

	"link" /nologo /debug setargv.obj /subsystem:console /opt:ref  /nologo /debug @C:\Users\chenx\AppData\Local\Temp\nmCACF.tmpIF EXIST test\x509_test.exe.manifest  "mt" -nologo -manifest test\x509_test.exe.manifest -outputresource:test\x509_test.exeIF EXIST test\x509_time_test.exe.manifest DEL /F /Q test\x509_time_test.exe.manifest"link" /nologo /debug setargv.obj /subsystem:console /opt:ref  /nologo /debug @C:\Users\chenx\AppData\Local\Temp\nmCC66.tmpIF EXIST test\x509_time_test.exe.manifest  "mt" -nologo -manifest test\x509_time_test.exe.manifest -outputresource:test\x509_time_test.exeIF EXIST test\x509aux.exe.manifest DEL /F /Q test\x509aux.exe.manifest"link" /nologo /debug setargv.obj /subsystem:console /opt:ref  /nologo /debug @C:\Users\chenx\AppData\Local\Temp\nmCD90.tmpIF EXIST test\x509aux.exe.manifest  "mt" -nologo -manifest test\x509aux.exe.manifest -outputresource:test\x509aux.exeIF EXIST engines\capi.dll.manifest DEL /F /Q engines\capi.dll.manifestcmd /C ""link" /nologo /debug /dll  /nologo /debug @C:\Users\chenx\AppData\Local\Temp\nmCEAB.tmp || (DEL /Q capi.* engines\capi.* & EXIT 1)"IF EXIST engines\capi.dll.manifest  "mt" -nologo -manifest engines\capi.dll.manifest -outputresource:engines\capi.dllIF EXIST engines\dasync.dll.manifest DEL /F /Q engines\dasync.dll.manifestcmd /C ""link" /nologo /debug /dll  /nologo /debug @C:\Users\chenx\AppData\Local\Temp\nmD003.tmp || (DEL /Q dasync.* engines\dasync.* & EXIT 1)"IF EXIST engines\dasync.dll.manifest  "mt" -nologo -manifest engines\dasync.dll.manifest -outputresource:engines\dasync.dllIF EXIST engines\loader_attic.dll.manifest DEL /F /Q engines\loader_attic.dll.manifestcmd /C ""link" /nologo /debug /dll  /nologo /debug @C:\Users\chenx\AppData\Local\Temp\nmD7D4.tmp || (DEL /Q loader_attic.* engines\loader_attic.* & EXIT 1)"IF EXIST engines\loader_attic.dll.manifest  "mt" -nologo -manifest engines\loader_attic.dll.manifest -outputresource:engines\loader_attic.dllIF EXIST engines\ossltest.dll.manifest DEL /F /Q engines\ossltest.dll.manifestcmd /C ""link" /nologo /debug /dll  /nologo /debug @C:\Users\chenx\AppData\Local\Temp\nmD9AA.tmp || (DEL /Q ossltest.* engines\ossltest.* & EXIT 1)"IF EXIST engines\ossltest.dll.manifest  "mt" -nologo -manifest engines\ossltest.dll.manifest -outputresource:engines\ossltest.dllIF EXIST engines\padlock.dll.manifest DEL /F /Q engines\padlock.dll.manifestcmd /C ""link" /nologo /debug /dll  /nologo /debug @C:\Users\chenx\AppData\Local\Temp\nmDAF3.tmp || (DEL /Q padlock.* engines\padlock.* & EXIT 1)"IF EXIST engines\padlock.dll.manifest  "mt" -nologo -manifest engines\padlock.dll.manifest -outputresource:engines\padlock.dllIF EXIST providers\legacy.dll.manifest DEL /F /Q providers\legacy.dll.manifestcmd /C ""link" /nologo /debug /dll  /nologo /debug @C:\Users\chenx\AppData\Local\Temp\nmE18C.tmp || (DEL /Q legacy.* providers\legacy.* & EXIT 1)"IF EXIST providers\legacy.dll.manifest  "mt" -nologo -manifest providers\legacy.dll.manifest -outputresource:providers\legacy.dllcmd /C "set "SRCTOP=." & set "BLDTOP=." & set "PERL=C:\Perl\bin\perl.exe" & set "FIPSKEY=f4556650ac31d35461610bac4ed81b1a181b2d8a43ea2854cbae22ca74560813" & "C:\Perl\bin\perl.exe" ".\test\run_tests.pl" "
00-prep_fipsmodule_cnf.t .. skipped: FIPS module config file only supported in a fips build
Files=1, Tests=0,  0 wallclock secs ( 0.02 usr +  0.00 sys =  0.02 CPU)
Result: NOTESTS
01-test_abort.t ......................... ok
01-test_fipsmodule_cnf.t ................ skipped: Test only supported in a fips build

测试脚本是用perl写的, 挺复杂的. 但是大概齐能看懂意思.

cmd /C "set "SRCTOP=." & set "BLDTOP=." & set "PERL=C:\Perl\bin\perl.exe" & set "FIPSKEY=f4556650ac31d35461610bac4ed81b1a181b2d8a43ea2854cbae22ca74560813" & "C:\Perl\bin\perl.exe" ".\test\run_tests.pl"

run_tests.pl 中找测试配置文件*.t

# prep recipes are mandatory and need to be always run first
my @preps = glob(catfile($recipesdir,"00-prep_*.t"));
foreach my $test (@preps) {delete $tests{$test};
}sub find_matching_tests {my ($glob) = @_;if ($glob =~ m|^[\d\[\]\?\-]+$|) {return glob(catfile($recipesdir,"$glob-*.t"));}return glob(catfile($recipesdir,"*-$glob.t"));
}

openssl-3.2.0\test\recipes/.t
在这里插入图片描述
查看具体的
.t

use OpenSSL::Test;setup("test_abort");plan tests => 1;is(run(test(["aborttest"])), 0, "Testing that abort is caught correctly");

最终都是调用了生成好的测试程序.

run(test(["用C写的测试程序"]))

结合make test的日志和makefile, 就可以知道具体测试程序(e.g. aborttest.exe ) 编译时, 需要哪些工程文件.
这些测试程序, 是用来对编译好的openssl组件(主要是DLL)来测试. 是真正对openssl外部接口的测试.
这些测试程序是在调用openssl的DLL的接口, 和我们正常使用openssl DLL的场景是一样的, 不同的时, 官方提供的测试程序, 是在测试各种细节场景, 保证编译出的openssl DLL是正常可用的. 如果通不过测试, 那就说明从源码编译出的openssl的可执行文件(exe, DLL)是有问题的.

我想将openssl的这些测试exe的工程实现过一遍. 等过完后, openssl DLL接口细节的使用, 就没啥不知道的了.
等于是, 我们自己工程中如何用openssl, 在这些官方内部使用的nmake test相关工程中, 已经全部演示了.
看完这些测试程序, 在openssl.exe工程中找代码参考, 也容易和清晰多了.

笔记

这个笔记作为一个索引贴.
如果测试程序很短, 就写在这个笔记中
如果测试程序很长, 就另外开一个笔记, 将具体笔记的索引放在这个索引贴中.

openssl源码目录下的\test下, 用everything搜索全部的*.c, 拷贝到自己工程的备用目录下, 这些.c就是要学习的官方测试程序的C实现.
全部过一遍. 过一个工程, 就删掉一个实现, 等实现都没了, 就搞定了.

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

openssl的测试实现.c, 写的不是很标准, 不是测试必须的实现都写了.
这就导致, 向测试工程中加了新实现(删掉旧实现)时, 不是每次都能一次编译过.
有时还要向工程中添加或删减文件, 很麻烦.
整了几个openssl官方的测试程序后, 就想做个专用的模板工程, 这样每个新实验都在模板工程上做, 工作量小多了. 稍作修改就能编译过, 然后做实验.

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

openssl3.2 - 测试程序的学习 - test\aborttest.c

#include "my_openSSL_lib.h"#include <openssl/crypto.h>int main(int argc, char **argv)
{// 打印错误原因, 报错点(file, line), 结束程序OPENSSL_die("Voluntary abort", __FILE__, __LINE__);return 0;
}

openssl3.2 - 测试程序的学习 - test\sanitytest.c

openssl3.2 - 测试程序的学习 - test\sanitytest.c

openssl3.2 - 测试程序的学习 - test\acvp_test.c

openssl3.2 - 测试程序的学习 - test\acvp_test.c

openssl3.2 - 测试程序的学习 - test\aesgcmtest.c

openssl3.2 - 测试程序的学习 - test\aesgcmtest.c

openssl3.2 - 测试程序的学习 - error LNK2019: 无法解析的外部符号 evp_pkey_export_to_provider, evp_keymgmt_get_params

openssl make test 不只是测试已经导出的API, 也进行内部函数测试.
我们搭建的环境, 是基于已经编译安装的openssl3.2的DLL对外导出接口.
如果是openssl内部函数在测试程序中, 是会编译报错的.

如果看到openssl/test/*.c中有测试内部函数(小写字母开头), 就跳过, 不玩了.

openssl3.2 - 测试程序的学习 - error LNK2019: 无法解析的外部符号 evp_pkey_export_to_provider, evp_keymgmt_get_params

可以用一个工程模板, 来学习所有的case

在这里插入图片描述
已经试验过10+个官方的test*.c的测试用例, 为了节省空间, 不用对每个case都建立单独的工程.
现在已经解决了所有的编译问题, 也搭好了工程模板.
只需要在一个基于工程模板的工程中, 删掉旧case, 添加新case, 编译, 单步调试(如果值得花费时间).
剩下300+的case, 就用这种方法去code review.

现在过了100个test.c, 发现开始整理的openssl 测试专用工程模板不太合适, 又修正了一个好用的工程模板.
遇到每个openssl的testcase都好使, 等将300+case都过完, 再来更新.

测试文件.c 的有效范围

从openssl_src_dir/test/*.c 收集来的测试.c文件, 并不都是测试用例文件.

.c名称中必须包含test字样, 其他都是支持文件.
e.g. asn1_dsa_internal_test.c

asn1_string_table_test.c

ASN1_STRING_TABLE_x() 的测试, 没学到东西

asynctest.c

openssl中实现的异步(线程)任务, 有用, 但是用起来有点复杂.
ASYNC_x()

bad_dtls_test.c

对dtls的测试, 能看到作为客户端和远端的tlserver的通讯流程.
http://git.infradead.org/users/dwmw2/openconnect.git/blob/HEAD:/dtls.c

bftest.c

BF_x() 系列是低级API, 官方不推荐在库外部使用.

bio_addr_test.c

BIO_ADDR_x()
AF_INET6, AF_INET数据(sockaddr_in6, sockaddr_in)的操作.

bio_callback_test.c

BIO_set_callback_ex(), BIO操作的回调, 可以在回调中做一些统计.

bio_comp_test.c

BIO_push() 可以让BIO可以有多种附加操作.

bio_core_test.c

BIO_new_from_core_bio()的测试

bio_dgram_test.c

用BIO进行UDP通讯的例子

bio_enc_test.c

用BIO进行对称加解密的例子, 可以指定算法.

bio_memleak_test.c

没营养

bio_prefix_text.c

可以看到程序入参的处理和分析

bio_readbuffer_test.c

读文件
BIO_read_ex(), BIO_gets()

bio_tfo_test.c

在windows上没实现, 用于测试tfo(linux, mac, freebsd)

bioprinttest

BIO_snprintf()

bn_internal_test.c

bn_prime.h 中有前2048个质数的数组预定义
其余是内部API测试, 没用.

bntest.c

openssl里面还封装了字符串操作的接口 OPENSSL_strcasecmp()
BN_x()
测试程序居然有3K+行…
BN_check_prime(), openssl中封装的API真多啊, 居然连检查是否为质数的API都有.

build_wincrypt_test.c

演示win中加密的头文件包含.

#include <openssl/types.h>#ifdef _WIN32
# ifndef WIN32_LEAN_AND_MEAN
#  define WIN32_LEAN_AND_MEAN
# endif
# include <windows.h>
# include <wincrypt.h>
# ifndef X509_NAME
#  ifndef PEDANTIC
#    ifdef _MSC_VER
#      pragma message("wincrypt.h no longer defining X509_NAME before OpenSSL headers")
#    else
#      warning "wincrypt.h no longer defining X509_NAME before OpenSSL headers"
#    endif
#  endif
# endif
#endif#include <openssl/opensslconf.h>
#ifndef OPENSSL_NO_STDIO
# include <stdio.h>
#endif#include <openssl/evp.h>
#include <openssl/x509.h>
#include <openssl/x509v3.h>//int main(void)
//{
//    return 0;
//}

buildtest_*.c

都是演示进行具体编程时, 要包哪些头文件, 怎么用宏来判断要包哪些头文件.

#ifndef OPENSSL_NO_XX_YY
# include <openssl/XX_YY.h>
#endif

openssl中的配置宏都在 opensslconf.h中.
代码中包含头文件时,应先包opensslconf.h, 然后再根据编译宏开关来包含其他头文件, 如下:

#include <openssl/opensslconf.h>
#ifndef OPENSSL_NO_STDIO
# include <stdio.h>
#endif
#ifndef OPENSSL_NO_HMAC
# include <openssl/hmac.h>
#endifint main(void)
{return 0;
}

casttest.c

CAST API官方不推荐在库外使用.
CAST是对称加解密算法, 用起来好直白:)

        CAST_set_key(&key_b, 16, out_b);CAST_ecb_encrypt(&(out_a[0]), &(out_a[0]), &key_b, CAST_ENCRYPT);CAST_ecb_encrypt(&(out_a[8]), &(out_a[8]), &key_b, CAST_ENCRYPT);

cipherlist_test.c

向SSL连接设置通讯支持的算法列表.

ciphername_test.c

从SLL连接得到支持的算法列表

clienthellotest.c

用session file 来做配置, 进行TLS客户端测试.
先放这.

cmactest.c

官方不推荐在库外使用CMAC低级API

没用的内部测试

文件名称不带test字样的.c
build_*_test.casn1_dsa_internal_test.c
bn_internal_test.c
asn1_encode_test.c
asn1_internal_test.c
asn1_time_test.c
asynciotest.c
ca_internals_test.c
cert_comp_test.c
chacha_internal_test.c
cipher_overhead_test.c
cipherbytes_test.c
cmp_*_test.c都是内部测试, 不用看.

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/653365.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

邻接矩阵、关联矩阵

邻接矩阵&#xff1a; 邻接矩阵是一种用来表示图中顶点间相互连接关系的矩阵。在邻接矩阵中&#xff0c;矩阵的行和列都代表图中的顶点。 对于无权图&#xff0c;如果顶点 i 和顶点 j 之间有一条边&#xff0c;则矩阵中的元素 Aij​&#xff08;位于第 i 行和第 j 列&#xff…

编译Opencv3.3 版本遇到的Cuda版本变更导致:CUDA_nppicom_LIBRARY (ADVANCED)链接找不到的问题根本解法:

前言&#xff1a; Opencv 开源库的使用是必须的&#xff0c;但是&#xff0c;开源项目的特性&#xff0c;造成&#xff0c;版本的依赖性比较复杂&#xff0c; 尤其是针对某一款老硬件的SDK&#xff0c;往往随着某个开源库的使用&#xff0c;导致&#xff0c;无法编译的问题&am…

(bean的创建图)学习Spring的第十天(很重要)

大致框架按如下 第一次细分 bean对象还未创建 操作第一个map 引入BeanFactoryPostProcessor , 即Bean工厂后处理器 , 为Spring很重要的扩展点 BeanFactoryPostProcessor内部的方法 可以对BeaDefinition进行修改 , 也可进行BeanDefinition的注册 ( 原有在xml文件配置的bean…

从零学习Linux操作系统 第二十部分 mariadb数据库的管理

一、对于数据库的基本介绍 1.什么是数据库 数据库就是个高级的表格软件 2.常见数据库 Mysql Oracle mongodb db2 sqlite sqlserver … 3.Mysql (SUN -----> Oracle) 4.mariadb (Mysql的一种&#xff09; 数据库中的常用名词 1.字段 &#xff1a;表格中的表头 2.表 &…

Day01_变量和数据类型(注释,关键字,标识符,数据类型,字面量,变量,常量,进制,计算机存储单位,Java的基本数据类型的存储范围,计算机如何表示数据)

文章目录 JavaSE_Day01 变量和数据类型学习目标1.1 注释&#xff08;*comment*&#xff09;&#xff08;掌握&#xff09;1.2 关键字&#xff08;*keyword*&#xff09;&#xff08;掌握&#xff09;1.3 标识符( identifier)&#xff08;掌握&#xff09;1.3.1 标识符的命名规则…

构造器模式

构造器模式 意图 将一个复杂对象的构建和表示分离&#xff0c;使得相同的构建能创建不同的表示。 解释 案例&#xff1a;想象一个角色扮演游戏的特征生成器。最简单的选择是让计算机为你创建角色。如果你想手动选择特征的细节像职业、性别、头发的颜色等。特征的产生是一个循…

js实现动漫拼图1.0版

文章目录 1 实现效果视频2 功能实现思路3代码实现 1 实现效果视频 拼图1.0 2 功能实现思路 布局忽略&#xff08;小白学前端&#xff0c;不献丑了&#xff09; 左侧拼图格 左侧4*4的拼图小格子 利用表格实现&#xff0c;规划好td的大小&#xff0c;给每个格子加上背景图片&…

Flink问题解决及性能调优-【Flink不同并行度引起sink2es报错问题】

最近需求&#xff0c;仅想提高sink2es的qps&#xff0c;所以仅调节了sink2es的并行度&#xff0c;但在调节不同算子并行度时遇到一些问题&#xff0c;找出问题的根本原因解决问题&#xff0c;并分析整理。 实例代码 --SET table.exec.state.ttl86400s; --24 hour,默认: 0 ms …

MySQL查询—联合查询、子查询

关于表格的创建&#xff0c;请看上一篇文章——MySQL查询—连接查询 1、联合查询&#xff1a;把多次查询的结果合并&#xff0c;形成一共新的查询集。 UNION&#xff0c;UNION ALL 语法&#xff1a; SELECT 字段列表 FROM 表&#xff21;&#xff0e;&#xff0e;&#…

qt-C++笔记之使用信号和槽实现跨类成员变量同步响应

qt-C笔记之使用信号和槽实现跨类成员变量同步响应 —— 杭州 2024-01-24 code review! 文章目录 qt-C笔记之使用信号和槽实现跨类成员变量同步响应1.运行2.main.cpp3.test.pro4.编译 1.运行 2.main.cpp 代码 #include <QCoreApplication> #include <QObject> #…

Linux下Docker搭建部署Typecho博客【详细版】

Linux下Docker搭建部署Typecho博客【详细版】 一、环境准备1.1.准备阿里云服务器【新用户免费使用三个月】1.2.准备远程工具【FinalShell】1.3.系统信息1.4.安装所需软件包1.5.设置docker镜像源1.6.更新yum软件包索引1.7.确认停用selinux 二、安装Docker2.1.安装Docker-Ce2.2.查…

【RTP】webrtc 学习3: webrtc对h264的rtp解包

rtp_rtcp\source\video_rtp_depacketizer_h264.cc【RTP】webrtc 学习2: webrtc对h264的rtp打包 中分析了打包过程的代码,这样再来看解析过程的源码就容易多了:本代码主要基于m79,m98类似。这里注明了jitterbuffer 会再次 做 解析stap-a 变为NAL units解析ParseFuaNalu 第一…

ACL、VLAN、NAT笔记

一、ACL ---访问控制列表 1.ACL的作用 1&#xff0c;访问控制&#xff1a;在路由器流量流入或流出的接口上&#xff0c;匹配流量&#xff0c;然后 执行设定好的动作。 ---- permit 允许 , deny 拒绝 2&#xff0c;抓取感兴趣流&#xff1a;ACL可以和其他服务结合使用。ACL只…

MyBatis 如何整合 Druid 连接池?

Mybatis 如何整合 Druid 数据连接池呢&#xff1f;首先打开创建的 Maven 工程&#xff0c;找到 pom.xml 文件&#xff0c;添加 Druid 依赖。 <!--druid连接池--> <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId&…

【C语言】数组的应用:三子棋游戏

由于代码较长&#xff0c;为了增加可读性&#xff0c;我们把代码分别写到game.h&#xff0c;game.c&#xff0c;test.c&#xff0c;里面&#xff0c;其中game.h用来声明函数&#xff0c;实现函数功能的代码在game.c&#xff0c;测试游戏的代码在test.c 为了方便后续的更改&…

ThreadLocal学习笔记

ThreadLocal类图 ThreadLocal/InheritableThreadLocal/ \TransmittableThreadLocal(阿里巴巴) TransmissibleThreadLocal(阿里巴巴)ThreadLocal 这是Thread类的局部变量&#xff0c;每个线程私有。 它主要用于解决多线程中的数据共享问题&#xff0c;保…

k8s 版本发布与回滚

一、实验环境准备&#xff1a; kubectl get pods -o wide kubectl get nodes -o wide kubectl get svc 准备两个nginx镜像&#xff0c;版本号一个是V3&#xff0c;一个是V4 二、准备一个nginx.yaml文件 apiVersion: apps/v1 kind: Deployment metadata:name: nginx-deploylab…

翻译: GPT-4 Vision静态图表转换为动态数据可视化 升级Streamlit 三

GPT-4 Vision 系列: 翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式一翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式二 1. 将任何静态图表转换为动态数据可视化 ChatGPT Vision 不仅可以将涂鸦变成功能齐全的 Streamlit 应用程序&#xff0c;还…

SpringBoot整合nacos的入门Demo

Nacos介绍 Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速…

操作系统(6)----线程相关

目录 1.线程与进程的关系 2.线程的属性 3.线程的实现方式 用户级线程 内核级线程 多线程模型 一对一模型: 多对一模型&#xff1a; 多对多模型&#xff1a; 4.线程的状态和转换 5.线程的组织与控制 1.线程与进程的关系 可以把线程理解为“轻量级进程”。线程是一个…