openssl3.2 - 测试程序的学习 - test\acvp_test.c
文章目录
- openssl3.2 - 测试程序的学习 - test\acvp_test.c
- 概述
- 笔记
- 要单步学习的测试函数
- 备注
- END
openssl3.2 - 测试程序的学习 - test\acvp_test.c
概述
openssl3.2 - 测试程序的学习
将test*.c 收集起来后, 就不准备看makefile和make test的日志参考了. 按照收集的.c, 按照字母序拿来做实验就行.
直接将前面搭建的工程 test\sanitytest.c作为模板, 将acvp_test.c加进去, 将冲突的文件拿掉, 编译一下就过了.
openssl的工程是一个框架, 有main实现, 在具体的测试程序中, 只要实现3个函数就可以了.
// 每个测试.c都要实现的函数列表
const OPTIONS *test_get_options(void){};
int setup_tests(void) {};
void cleanup_tests(void) {};
笔记
只要搭好一个测试工程, 另外一个测试工程, 就将测试实现部分换掉, 公共部分不用动.
这个工程, 在上一个工程上搭建, 只需要将这个测试相关的acvp_test.c, acvp_test.inc换上, 编译即可.
公共部分如果有冲突的公共实现(test_get_options(), setup_tests(), cleanup_tests()), 说明工程中包含其他的测试实现, 将无关的测试实现删掉就行.
要单步学习的测试函数
int setup_tests(void)
{char *config_file = NULL;OPTION_CHOICE o;while ((o = opt_next()) != OPT_EOF) {switch (o) {case OPT_CONFIG_FILE:config_file = opt_arg();break;case OPT_TEST_CASES:break;default:case OPT_ERR:return 0;}}if (!test_get_libctx(&libctx, &prov_null, config_file, NULL, NULL))return 0;OSSL_SELF_TEST_set_callback(libctx, self_test_events, &self_test_args);ADD_TEST(aes_cfb1_bits_test);ADD_ALL_TESTS(cipher_enc_dec_test, OSSL_NELEM(cipher_enc_data));ADD_ALL_TESTS(aes_ccm_enc_dec_test, OSSL_NELEM(aes_ccm_enc_data));ADD_ALL_TESTS(aes_gcm_enc_dec_test, OSSL_NELEM(aes_gcm_enc_data));
在setup_tests()中, 官方会用ADD_TEST(), ADD_ALL_TESTS()添加测试函数.
在这些测试函数(e.g. aes_cfb1_bits_test(), aes_ccm_enc_dec_test())入口下断点, 然后将程序跑起来, 一个函数过一遍就可以了.
这些函数因为是测试专用, 用了一些预留的测试数据(在acvp_test.inc中定义), 只能学到一些流程性的东西.
static int aes_ccm_enc_dec_test(int id)
{const struct cipher_ccm_st *tst = &aes_ccm_enc_data[id]; // 预留数据/* The tag is on the end of the cipher text */const size_t tag_len = tst->ct_len - tst->pt_len;const size_t ct_len = tst->ct_len - tag_len;const unsigned char *tag = tst->ct + ct_len;const int enc = 1;const int pass = 1;if (ct_len < 1)return 0;return aes_ccm_enc_dec(tst->alg, tst->pt, tst->pt_len,tst->key, tst->key_len,tst->iv, tst->iv_len, tst->aad, tst->aad_len,tst->ct, ct_len, tag, tag_len, enc, pass)&& aes_ccm_enc_dec(tst->alg, tst->ct, ct_len,tst->key, tst->key_len,tst->iv, tst->iv_len, tst->aad, tst->aad_len,tst->pt, tst->pt_len, tag, tag_len, !enc, pass)/* test that it fails if the tag is incorrect */&& aes_ccm_enc_dec(tst->alg, tst->ct, ct_len,tst->key, tst->key_len,tst->iv, tst->iv_len, tst->aad, tst->aad_len,tst->pt, tst->pt_len,tag - 1, tag_len, !enc, !pass);
}
static int aes_ccm_enc_dec(const char *alg,const unsigned char *pt, size_t pt_len,const unsigned char *key, size_t key_len,const unsigned char *iv, size_t iv_len,const unsigned char *aad, size_t aad_len,const unsigned char *ct, size_t ct_len,const unsigned char *tag, size_t tag_len,int enc, int pass)
{int ret = 0;EVP_CIPHER_CTX *ctx;EVP_CIPHER *cipher = NULL;int out_len, len;unsigned char out[1024];TEST_note("%s : %s : expected to %s", alg, enc ? "encrypt" : "decrypt",pass ? "pass" : "fail");if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new())|| !TEST_ptr(cipher = EVP_CIPHER_fetch(libctx, alg, ""))|| !TEST_true(EVP_CipherInit_ex(ctx, cipher, NULL, NULL, NULL, enc))|| !TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN, iv_len,NULL), 0)|| !TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len,enc ? NULL : (void *)tag), 0)|| !TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, key, iv, enc))|| !TEST_true(EVP_CIPHER_CTX_set_padding(ctx, 0))|| !TEST_true(EVP_CipherUpdate(ctx, NULL, &len, NULL, pt_len))|| !TEST_true(EVP_CipherUpdate(ctx, NULL, &len, aad, aad_len))|| !TEST_int_eq(EVP_CipherUpdate(ctx, out, &len, pt, pt_len), pass))goto err;if (!pass) {ret = 1;goto err;}if (!TEST_true(EVP_CipherFinal_ex(ctx, out + len, &out_len)))goto err;if (enc) {out_len += len;if (!TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG,tag_len, out + out_len), 0)|| !TEST_mem_eq(out, out_len, ct, ct_len)|| !TEST_mem_eq(out + out_len, tag_len, tag, tag_len))goto err;} else {if (!TEST_mem_eq(out, out_len + len, ct, ct_len))goto err;}ret = 1;
err:EVP_CIPHER_free(cipher);EVP_CIPHER_CTX_free(ctx);return ret;
}
感觉测试程序对于openssl库的使用者的唯一用处, 就是看一个操作, 是啥流程, 用到了哪些openssl API , API的调用顺序等.
真正要干和测试程序一样的任务时, 拿这些API去openssl.exe工程中去搜索, 大致可以找到干活的代码实现.
然后就可以琢磨一下(通过回溯API调用关系), 给openssl命令行什么参数, 可以进入到干活的实现中, 这样就知道具体编程细节了.
openssl命令行什么活都能干. 找到对应命令行参数后, 就可以迁移代码到自己工程了.
备注
在本地再搭建10个测试工程, 如果不同测试工程的搭建步骤没大区别, 就直接看test*.c的实现了. 那就不需要继续搭建测试工程来单步了, 意义不大.
因为看这些测试程序, 主要是看一些流程性的东西.
END
相关文章:

openssl3.2 - 测试程序的学习 - test\acvp_test.c
文章目录 openssl3.2 - 测试程序的学习 - test\acvp_test.c概述笔记要单步学习的测试函数备注END openssl3.2 - 测试程序的学习 - test\acvp_test.c 概述 openssl3.2 - 测试程序的学习 将test*.c 收集起来后, 就不准备看makefile和make test的日志参考了. 按照收集的.c, 按照…...
Qt Quick 项目(第二集Qt Quick Application创建)
上集回顾 Qt Quick 项目(第一集Qt Quick UI 项目项目创建) 如果将程序的用户界面称为前端,将程序中的数据存储和业务逻辑称为后端,那么传统Qt应用程序的前端和后端都是使用C++来完成的。对于现代软件开发而言,这里有一个存在已久的冲突:前端的演化速度要远快于后端。当用…...

深度强化学习(王树森)笔记03
深度强化学习(DRL) 本文是学习笔记,如有侵权,请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接:https://github.com/wangshusen/DRL 源代码链接:https://github.c…...

Cesium材质特效
文章目录 0.引言1.视频材质2.分辨率尺度3.云4.雾5.动态水面6.雷达扫描7.流动线8.电子围栏9.粒子烟花10.粒子火焰11.粒子天气 0.引言 现有的gis开发方向较流行的是webgis开发,其中Cesium是一款开源的WebGIS库,主要用于实时地球和空间数据的可视化和分析。…...

华为产业链之车载激光雷达
一、智能汽车 NOA 加快普及,L3 上路利好智能感知硬件 1、感知层是 ADAS 最重要的一环 先进驾驶辅助系统 (ADAS, Advanced driver-assistance system)分“感知层、决策层、执行层”三个层级,其中感知层是最重要的一环…...
java的Object类的hasCode()和ToString()
(1)hasCode解释 hashCode()是Object类中定义的方法,用于返回对象的哈希码值。哈希码值是一个整数,用于在哈希表等数据结构中快速定位对象。 在Java中,哈希码值的计算是基于对象的内存地址的。默认情况下,ha…...
php数组算法(1)判断一维数组和多元数组中的元素是否相等并输出键值key
在php中,如何判断[1,0,1]和[ [0, 0, 0],//体质正常 [1, 0, 0],//气虚体质 [0, 1, 0],//血瘀体质 [0, 0, 1],//阴虚体质 [1, 1, 0],//气虚兼血瘀体质 [1, 0, 1],//气虚兼阴虚体质 [0, 1, 1],//血瘀兼阴虚体质 [1, 1, 1],//气虚兼血瘀兼阴虚体质 ];中的第n项相等&…...

已解决Error:AttributeError: module ‘numpy‘ has no attribute ‘float‘.
成功解决Error:AttributeError: module ‘numpy‘ has no attribute ‘float‘. 🌵文章目录🌵 🌳引言🌳🌳报错分析🌳🌳解决方案1:降低NumPy版本🌳ἳ…...

WordPress块编辑器(Gutenberg古腾堡)中如何添加脚注?
WordPress默认自带的块编辑器(Gutenberg古腾堡编辑器)本身就自带添加脚注功能,不过经典编辑器不行。如果想要在WordPress中添加更加专业的脚注,建议使用Modern Footnotes插件,具体介绍及使用请参考『WordPress站点如…...

burpsuite怎么进行本地抓包?ctfer测试自搭建靶场必须学会!
自己搭建靶场测试题目是ctfer不可避免的环节,怎么用burp对本地回环即localhost进行抓包?笔者在本篇分享一下自己的解决经验。 笔者用的是Chrome浏览器,如果是火狐浏览器可以参考本篇:Burp Suite抓不到本地包/localhost包问题解决…...
VSCode Python调试运行:json编写
对于需要在命令行传参运行的项目,如果想要调试运行,则需要编写对应的launch.json文件这里记录一下json文件的编写格式: {"version": "0.2.0","configurations": [{"python": "/data/xxx/minic…...

自动化Web页面性能测试介绍
随着越来越多的用户使用移动设备访问 Web 应用,使得 Web 应用需要支持一些性能并不是很好的移动设备。为了度量和测试 Web 应用是不是在高复杂度的情况下,页面性能能满足用户的需求。 同时,随着 Web 应用的空前发展,前端业务逐渐…...

可视化 | 【d3】力导向关系图优化(搜索+刷新)
文章目录 📚优化内容📚html和css优化🐇搜索框部分🐇刷新按钮部分 📚js🐇搜索框部分🐇刷新部分 前期回顾:【d3】力导图优化,本文主要是基于上篇代码,以代码段添…...
2024.1.26力扣每日一题——计算 K 置位下标对应元素的和
2024.1.26 题目来源我的题解方法一 位运算统计二进制数中1的个数方法二 官方的一种优化计算二进制中1的个数的方法 题目来源 力扣每日一题;题序:2859 我的题解 方法一 位运算统计二进制数中1的个数 对于每一个位置i都去计算i对应的二进制数中1的个数 …...
R语言【taxlist】——levels():获取或设置分类等级列表
Package taxlist version 0.2.4 Description 分类层次结构可以设置为 taxlist 对象中的级别,按从低到高的顺序排列。 在 taxlist 对象中为特定分类概念添加分类级别。此外,概念限制的变化可能涉及其分类层次结构的变化。 Usage levels(x)## S3 method…...
单元测试——题目十三
目录 题目要求: 定义类 测试类 题目要求: 根据输入的三条边值判断能组成何种三角形。三条边为变量a、b、c,范围为1≤边值≤10,不在范围内,提示“输入边值不在范围内”。不满足任意两边之和必须大于第三边,提示“输入边值不能组成三角形”。输入边值能组成三角形,只有…...

使用Linux SDK客户端向AWS Iot发送数据
参考链接: https://ap-southeast-1.console.aws.amazon.com/iot/home?regionap-southeast-1#/test 此篇文章用于测试,使用Linux SDK客户端向AWS Iot发送数据,准备环境如下: 1、客户端环境准备 1.1 客户端操作系统 虚拟机一台…...
1.27学习总结
今天做了些队列的题: 1.逛画展(单调队列) 2.打印队列 Printer Queue(优先队列) 3.[NOIP2010 提高组] 机器翻译(模拟队列) 4.求m区间内的最小值(单调队列板子题) 5.日志统计(滑动窗口,双指针) 总结一下&…...

【算法专题】二分查找(进阶)
📑前言 本文主要是二分查找(进阶)的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 🌄每日…...
开源项目对于新用户和初学者适合哪些工作
目录 一、阅读和理解文档 二、报告问题 三、测试和验证修复 四、编写和更新文档 五、简单的代码更改和修复 六、参与社区讨论 开源项目对于新用户和初学者来说,提供了宝贵的学习和实践机会。以下是一些适合新用户和初学者参与的工作: 一、阅读和理…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...