openssl3.2 - 测试程序的学习

news2025/1/18 6:15:36

文章目录

    • 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.tmp
	IF EXIST test\x509_test.exe.manifest  "mt" -nologo -manifest test\x509_test.exe.manifest -outputresource:test\x509_test.exe
	IF 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.tmp
	IF EXIST test\x509_time_test.exe.manifest  "mt" -nologo -manifest test\x509_time_test.exe.manifest -outputresource:test\x509_time_test.exe
	IF 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.tmp
	IF EXIST test\x509aux.exe.manifest  "mt" -nologo -manifest test\x509aux.exe.manifest -outputresource:test\x509aux.exe
	IF EXIST engines\capi.dll.manifest DEL /F /Q engines\capi.dll.manifest
	cmd /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.dll
	IF EXIST engines\dasync.dll.manifest DEL /F /Q engines\dasync.dll.manifest
	cmd /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.dll
	IF EXIST engines\loader_attic.dll.manifest DEL /F /Q engines\loader_attic.dll.manifest
	cmd /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.dll
	IF EXIST engines\ossltest.dll.manifest DEL /F /Q engines\ossltest.dll.manifest
	cmd /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.dll
	IF EXIST engines\padlock.dll.manifest DEL /F /Q engines\padlock.dll.manifest
	cmd /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.dll
	IF EXIST providers\legacy.dll.manifest DEL /F /Q providers\legacy.dll.manifest
	cmd /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.dll
	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" "
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>
#endif

int 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.c

asn1_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.coloradmin.cn/o/1416551.html

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

相关文章

C++进阶(六)map和set

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、序列式容器与关联式容器二、键值对三、树形结构的关联式容器1、set1、set的介绍2、set的使…

高考复习技巧考研资料、美赛论文及代码,数据收集网站(初高中招生考试全科试卷等)

图&#xff0c;就要从“点、线、面的位置关系”这一内核开始发散&#xff0c;第一层级为彼此的位置关系&#xff0c;平行、相交、异面&#xff08;两直线间位置&#xff09;、垂直&#xff08;相交或异面中的特殊位置&#xff09;&#xff0c;多面体、旋转体等&#xff0c;然后…

2024-macOS系统或Kail系统重——破解ZIP压缩的文件密码

2024-macOS系统或Kail系统重——破解ZIP压缩的文件密码 1. 你们有遇见这样子的情况么&#xff1a; 别人给你发的zip或者下载的zip文件&#xff0c;没有密码打不开么网上都是win系统的&#xff0c;都是没有macOS系统的&#xff0c;所以比较烦恼 2. 所以我就想到了代码&#x…

GoogLeNet模型详解

模型介绍 GoogLeNet是谷歌工程师设计的深度神经网络结构&#xff0c;于2014年在ImageNet比赛中取得了冠军。它的设计特点在于既有深度&#xff0c;又在横向上拥有“宽度”&#xff0c;并采用了一种名为Inception的核心子网络结构。这个网络名字中的“GoogLeNet”是对LeNet的致…

AtCoder Beginner Contest 338D - Island Tour【枚举】

原题链接&#xff1a;https://atcoder.jp/contests/abc338/tasks/abc338_d Time Limit: 2 sec / Memory Limit: 1024 MB Score: 425 points 问题陈述 AtCoder 群岛由 N 座岛屿组成&#xff0c;这些岛屿由 N 座桥梁连接。这些岛屿的编号从1到N&#xff0c;i(1≤i≤N−1)桥双…

Stable Diffusion系列(四):提示词规则与使用

文章目录 基础规则高级规则插件使用 基础规则 所谓提示词&#xff0c;也就是文生图中的文&#xff0c;由连贯的英语单词或句子组成。其最基础的规则是&#xff1a; 不同提示词之间需要用英文逗号分隔&#xff0c;空格和换行不影响读取想混合多个要素时使用|&#xff0c;相当于…

AD/DA(模数数模转换)

文章目录 前言一、介绍部分介绍AD/DA硬件电路模型硬件电路ADC模块DAC模块ADC0809DAC0832 运算放大器&#xff08;运放&#xff09;运放电路 DA原理两种不同的DA转换器 AD原理部分AD/DA性能指标XPT2046介绍主要功能XPT2046时序结构控制字节解释单端模式配置表 二、实例使用AD读取…

shell常用命令,参数传递,函数,挂载磁盘

一、shell常用命令 1、ls 功能:显示文件和目录的信息ls 以默认方式显示当前目录文件列表 ls -a 显示所有文件包括隐藏文件 ls -l 显示文件属性,包括大小,日期,符号连接,是否可读写及是否可执行 ls -lh 显示文件的大小,以容易理解的格式印出文件大小 (例如 1K 234M2…

echarts多个折线图共用X轴,实现tooltip合并和分离

echarts共享X轴案例&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</…

数据结构(栈stack)

文章目录 一、栈1、栈的定义2、顺序栈2.1、初始化2.2、进栈2.3、出栈2.4、读取 3、链栈 一、栈 1、栈的定义 逻辑结构&#xff1a;与普通线性表相同数据的运算&#xff1a;插入、删除操作有区别 2、顺序栈 2.1、初始化 ”.”适用于结构体变量&#xff0c;”->”适用于…

【算法专题】二分查找(入门)

&#x1f4d1;前言 本文主要是二分查找&#xff08;入门&#xff09;的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日…

探索元宇宙的未来:数字人对话系统 - Linly-Talker —— “数字人交互,与虚拟的自己互动”

探索元宇宙的未来&#xff1a;数字人对话系统 - Linly-Talker —— “数字人交互&#xff0c;与虚拟的自己互动” 之前空闲的时候我似乎已经写过了有关于数字人的两篇文章&#xff0c;今天更多的写这篇文章就是想探索一下元宇宙的未来&#xff0c;这种数字人对话系统能做什么&…

算法沉淀——双指针算法(leetcode真题剖析)

算法沉淀——双指针算法 01.移动零02.复写零03.快乐数04.盛最多水的容器05.有效三角形的个数06.和为s的两个数字07.三数之和08.四数之和 双指针算法&#xff08;Two Pointer Algorithm&#xff09;是一种常用于数组&#xff08;或链表&#xff09;操作的算法技巧。它的核心思想…

2024年1月的论文推荐

又到月底了&#xff0c;在月初推荐论文的基础上又整理了10篇推荐阅读的论文 1、MosaicBERT https://mosaicbert.github.io/ 一种用于快速预训练的双向编码器。MosaicBERT是针对快速预训练优化的自定义BERT架构。主要架构修改:FlashAttention, ALiBi&#xff0c;门控线性单元…

【JavaWeb程序】【C00150】基于SSM的二手交易平台管理系统-(论文+PPT)

基于SSM的二手交易平台管理系统-&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目包运行、免费远程调试 项目简介 这是一个基于ssm的二手交易平台管理系统 本系统分为用户和管理员两个模块。 其中用户的权限为&#xff1a;修改个人信息、闲置商…

log4j2 java api 入门介绍

概述 Log4j 2 API 提供了应用程序应该编码的接口&#xff0c;并提供了实现者创建日志实现所需的适配器组件。 虽然 Log4j 2 在 API 和实现之间被分解&#xff0c;但这样做的主要目的不是允许多个实现&#xff0c;尽管这当然是可能的&#xff0c;而是明确定义在“正常”应用程…

探索机器学习的奥秘

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 机器学习的定义二. 机器学习的发展历程三. 机器学习的原理四. 机器学习的分类…

路由、组件目录存放

文章目录 单页应用程序&#xff1a;SPA- Single Page Application路由的介绍VuePouter的介绍VueRouted 的使用 组件目录存放问题&#xff08;组件分类&#xff09; 单页应用程序&#xff1a;SPA- Single Page Application 单页应用&#xff08;SPA&#xff09;:所有功能在一个…

四. 基于环视Camera的BEV感知算法-BEVFormer实战

目录 前言1. BEVFormer实战 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第四章——基于环视Camera的BEV感知算法&#xff0c;一起去学习下 BEVFormer 的相关代码 课程…

MySQL之索引分类,语法以及SQL性能分析(慢日志,profile,explain)

索引分类 分类含义特定关键字主键索引针对于表中主键创建的索引默认自动创建&#xff0c;只能有一个PRIMARY唯一索引避免同一个表中某数据列中的值重复可以有多个UNIQUE常规索引快速定位特定数据可以有多个全文索引全文索引查找的文本中的关键字&#xff0c;而不是比较索引中的…