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

文章目录

    • openssl3.2 - 测试程序的学习 - test\aesgcmtest.c
    • 概述
    • 笔记
    • 能学到的流程性内容
    • END

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

概述

openssl3.2 - 测试程序的学习
aesgcmtest.c 工程搭建时, 发现没有提供 test_get_options(), cleanup_tests(), 需要自己补上才能编译过.

笔记

在这里插入图片描述

/*!
* \fle D:\my_dev\my_local_git_prj\study\openSSL\nmake_test\test_c\prj_004_aesgcmtest.c\aesgcmtest.c 
//** Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved.** Licensed under the Apache License 2.0 (the "License").  You may not use* this file except in compliance with the License.  You can obtain a copy* in the file LICENSE in the source distribution or at* https://www.openssl.org/source/license.html*/#include "my_openSSL_lib.h"#include <openssl/evp.h>// 最少要包含测试工具的头文件
#include "testutil.h"// openssl提供的.\test\*.c, 有的没有test_get_options(), cleanup_tests()
// 自己补充函数, 编译过就行, 不管内存泄漏了// 需要将其他实现中的enum定义拷贝过来
typedef enum OPTION_choice {OPT_ERR = -1,OPT_EOF = 0,OPT_CONFIG_FILE,OPT_TEST_ENUM
} 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;
}void cleanup_tests(void)
{}static const unsigned char gcm_key[] = {0xee, 0xbc, 0x1f, 0x57, 0x48, 0x7f, 0x51, 0x92, 0x1c, 0x04, 0x65, 0x66,0x5f, 0x8a, 0xe6, 0xd1, 0x65, 0x8b, 0xb2, 0x6d, 0xe6, 0xf8, 0xa0, 0x69,0xa3, 0x52, 0x02, 0x93, 0xa5, 0x72, 0x07, 0x8f
};
static const unsigned char gcm_iv[] = {0x99, 0xaa, 0x3e, 0x68, 0xed, 0x81, 0x73, 0xa0, 0xee, 0xd0, 0x66, 0x84
};
static const unsigned char gcm_pt[] = {0xf5, 0x6e, 0x87, 0x05, 0x5b, 0xc3, 0x2d, 0x0e, 0xeb, 0x31, 0xb2, 0xea,0xcc, 0x2b, 0xf2, 0xa5
};
static const unsigned char gcm_aad[] = {0x4d, 0x23, 0xc3, 0xce, 0xc3, 0x34, 0xb4, 0x9b, 0xdb, 0x37, 0x0c, 0x43,0x7f, 0xec, 0x78, 0xde
};
static const unsigned char gcm_ct[] = {0xf7, 0x26, 0x44, 0x13, 0xa8, 0x4c, 0x0e, 0x7c, 0xd5, 0x36, 0x86, 0x7e,0xb9, 0xf2, 0x17, 0x36
};
static const unsigned char gcm_tag[] = {0x67, 0xba, 0x05, 0x10, 0x26, 0x2a, 0xe4, 0x87, 0xd7, 0x37, 0xee, 0x62,0x98, 0xf7, 0x7e, 0x0c
};static int do_encrypt(unsigned char *iv_gen, unsigned char *ct, int *ct_len,unsigned char *tag, int *tag_len)
{int ret = 0;EVP_CIPHER_CTX *ctx = NULL;int outlen;unsigned char outbuf[64];*tag_len = 16;ret = TEST_ptr(ctx = EVP_CIPHER_CTX_new())&& TEST_true(EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, NULL,NULL) > 0)&& TEST_true(EVP_EncryptInit_ex(ctx, NULL, NULL, gcm_key,iv_gen != NULL ? NULL : gcm_iv) > 0)&& TEST_true(EVP_EncryptUpdate(ctx, NULL, &outlen, gcm_aad,sizeof(gcm_aad)) > 0)&& TEST_true(EVP_EncryptUpdate(ctx, ct, ct_len, gcm_pt,sizeof(gcm_pt)) > 0)&& TEST_true(EVP_EncryptFinal_ex(ctx, outbuf, &outlen) > 0)&& TEST_int_eq(EVP_CIPHER_CTX_get_tag_length(ctx), 16)&& TEST_true(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, 16,tag) > 0)&& TEST_true(iv_gen == NULL|| EVP_CIPHER_CTX_get_original_iv(ctx, iv_gen, 12));EVP_CIPHER_CTX_free(ctx);return ret;
}static int do_decrypt(const unsigned char *iv, const unsigned char *ct,int ct_len, const unsigned char *tag, int tag_len)
{int ret = 0;EVP_CIPHER_CTX *ctx = NULL;int outlen, ptlen;unsigned char pt[32];unsigned char outbuf[32];ret = TEST_ptr(ctx = EVP_CIPHER_CTX_new())&& TEST_true(EVP_DecryptInit_ex(ctx, EVP_aes_256_gcm(), NULL,NULL, NULL) > 0)&& TEST_true(EVP_DecryptInit_ex(ctx, NULL, NULL, gcm_key, iv) > 0)&& TEST_int_eq(EVP_CIPHER_CTX_get_tag_length(ctx), 16)&& TEST_true(EVP_DecryptUpdate(ctx, NULL, &outlen, gcm_aad,sizeof(gcm_aad)) > 0)&& TEST_true(EVP_DecryptUpdate(ctx, pt, &ptlen, ct,ct_len) > 0)&& TEST_true(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG,tag_len, (void *)tag) > 0)&& TEST_true(EVP_DecryptFinal_ex(ctx, outbuf, &outlen) > 0)&& TEST_mem_eq(gcm_pt, sizeof(gcm_pt), pt, ptlen);EVP_CIPHER_CTX_free(ctx);return ret;
}static int kat_test(void)
{unsigned char tag[32];unsigned char ct[32];int ctlen = 0, taglen = 0;return do_encrypt(NULL, ct, &ctlen, tag, &taglen)&& TEST_mem_eq(gcm_ct, sizeof(gcm_ct), ct, ctlen)&& TEST_mem_eq(gcm_tag, sizeof(gcm_tag), tag, taglen)&& do_decrypt(gcm_iv, ct, ctlen, tag, taglen);
}static int badkeylen_test(void)
{int ret;EVP_CIPHER_CTX *ctx = NULL;const EVP_CIPHER *cipher;ret = TEST_ptr(cipher = EVP_aes_192_gcm())&& TEST_ptr(ctx = EVP_CIPHER_CTX_new())&& TEST_true(EVP_EncryptInit_ex(ctx, cipher, NULL, NULL, NULL))&& TEST_int_le(EVP_CIPHER_CTX_set_key_length(ctx, 2), 0);EVP_CIPHER_CTX_free(ctx);return ret;
}static int ivgen_test(void)
{unsigned char iv_gen[16];unsigned char tag[32];unsigned char ct[32];int ctlen = 0, taglen = 0;return do_encrypt(iv_gen, ct, &ctlen, tag, &taglen)&& do_decrypt(iv_gen, ct, ctlen, tag, taglen);
}int setup_tests(void)
{ADD_TEST(kat_test);ADD_TEST(badkeylen_test);ADD_TEST(ivgen_test);return 1;
}

能学到的流程性内容

do_encrypt()
do_decrypt()
这官方测试代码, 如果只看流程性的内容, 比网上找到的代码片段规范多了.

END

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

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

相关文章

【教学类-综合练习-10】20240111 大4班 综合材料(骰子、AB手环)

作品展示 背景需求 年终了&#xff0c;清理库存&#xff0c;各种打印的题型纸都拿出来&#xff0c;当个别化学习材料 教学过程&#xff1a; 时间&#xff1a;2024年1月11日下午 班级&#xff1a;大4班&#xff08;最后一次带班&#xff09; 人数&#xff1a;16人 第1类&…

SpringBoot自定义全局异常处理器

文章目录 一、介绍二、实现1. 定义全局异常处理器2. 自定义异常类 三、使用四、疑问 一、介绍 Springboot框架提供两个注解帮助我们十分方便实现全局异常处理器以及自定义异常。 ControllerAdvice 或 RestControllerAdvice&#xff08;推荐&#xff09;ExceptionHandler 二、…

北斗卫星为野外科考人员提供安全保障

北斗卫星为野外科考人员提供安全保障 自第二次青藏高原综合科学考察研究启动以来&#xff0c;青海不断提升科考服务保障能力&#xff0c;推动科考全程信息化&#xff0c;有效促进科考成果转化。 为保障科考人员的人身安全&#xff0c;青海省青藏科学考察服务中心开发了基于北…

单片机学习笔记---独立按键控制LED状态

上一节学习的是独立按键控制LED亮灭 这一节我们先来讲一下按键的抖动&#xff1a; 对于机械开关&#xff0c;当机械触点断开、闭合时&#xff0c;由于机械触点的弹性作用&#xff0c;一个开关在闭合时不会马上稳定地接通&#xff0c;在断开时也不会一下子断开&#xff0c;所以…

有关链表的题目

目录 1.环形链表的约瑟夫问题 2.链表的中间节点 3.合并两个有序链表 4.反转链表 5.移除链表元素 1.环形链表的约瑟夫问题 环形链表的约瑟夫问题_牛客题霸_牛客网 (nowcoder.com) 思路&#xff1a;题目给出结构是环形链表&#xff0c;且题目已经定义好了环形链表的结构。 1…

【Docker】实现JMeter分布式压测

一个JMeter实例可能无法产生足够的负载来对你的应用程序进行压力测试。如本网站所示&#xff0c;一个JMeter实例将能够控制许多其他的远程JMeter实例&#xff0c;并对你的应用程序产生更大的负载。JMeter使用Java RMI[远程方法调用]来与分布式网络中的对象进行交互。JMeter主站…

嵌入式linux面试题目总结

Linux系统中常见的面试题目&#xff0c;分享&#xff0c;欢迎大家前来交流学习。 1、嵌入式系统中的CAN通信协议是什么&#xff1f; CAN&#xff08;Controller Area Network&#xff09;通信协议是一种广泛应用于嵌入式系统中的串行通信协议。它最初由德国汽车工业联合会开发…

Kafka(二)原理详解

一 、kafka核心总控制器&#xff08;Controller&#xff09; 在Kafka集群中会有一个或者多个broker&#xff0c;其中有一个broker会被选举为控制器&#xff08;Kafka Controller&#xff09;&#xff0c;它负责管理整个集群中所有分区和副本的状态。 作用&#xff1a;leader副…

学习笔记-李沐动手学深度学习(五)(14-15,数值稳定性、模型初始化和激活函数、Kaggle房价预测)

总结 14-数值稳定性&#xff08;梯度爆炸、梯度消失&#xff09; 尤其是对于深度神经网络&#xff08;即神经网络层数很多&#xff09;&#xff0c;最终的梯度就是每层进行累乘 理论 t&#xff1a;为第t层 y&#xff1a;不是之前的预测值&#xff0c;而是包括了损失函数L …

数据结构:搜索二叉树 | 红黑树 | 验证是否为红黑树

文章目录 1.红黑树的概述2.红黑树的性质3.红黑树的代码实现3.1.红黑树的节点定义3.2.红黑树的插入操作3.3.红黑树是否平衡 黑红树是一颗特殊的搜索二叉树&#xff0c;本文在前文的基础上&#xff0c;图解红黑树插入&#xff1a;前文 链接&#xff0c;完整对部分关键代码展示&a…

uni-app 微信小程序之红包雨活动

文章目录 1. 页面效果2. 页面样式代码 1. 页面效果 GIF录屏有点卡&#xff0c;实际比较丝滑 每0.5s掉落一个红包控制4s后自动移除红包点击红包消除红包&#xff08;或者自行1&#xff0c;或者弹窗需求&#xff09; 2. 页面样式代码 <!-- 红包雨活动 --> <template>…

Ultraleap 3Di示例Interactable Objects组件分析

该示例代码位置如下&#xff1a; 分析如下&#xff1a; Hover Enabled&#xff1a;悬停功能&#xff0c;手放在这个模型上&#xff0c;会触发我们手放在这个模型上的悬停功能。此时当手靠近模型的时候&#xff0c;手的模型的颜色会发生改变&#xff0c;反之&#xff0c;则不会…

防御保护----防火墙的安全策略、NAT策略实验

实验拓扑&#xff1a; 实验要求&#xff1a; 1.生产区在工作时间&#xff08;9&#xff1a;00-18&#xff1a;00&#xff09;内可以访问DMZ区&#xff0c;仅可以访问http服务器&#xff1b; 2.办公区全天可以访问DMZ区&#xff0c;其中10.0.2.10可以访问FTP服务器和HTTP服务器…

【C++】类和对象(中篇)(全网最细!!!)

文章目录 &#x1f354;一、类的六个默认成员函数&#x1f354;二、构造函数&#x1f35f;1、概念&#x1f35f;2、特性&#x1f369;默认构造函数 &#x1f354;三、析构函数&#x1f35f;1、概念&#x1f35f;2、特性&#x1f369;默认析构函数 &#x1f354;四、拷贝构造函数…

了解WPF控件:ToggleButton和Separator常用属性与用法(十三)

掌握WPF控件&#xff1a;熟练ToggleButton和Separator常用属性&#xff08;十三&#xff09; ToggleButton 一个按钮类UI元素&#xff0c;它的特点是拥有两种状态&#xff1a;选中&#xff08;Checked&#xff09;和未选中&#xff08;Unchecked&#xff09;。当用户单击Togg…

用ChatGPT写申请文书写进常春藤联盟?

一年前&#xff0c;ChatGPT 的发布引发了教育工作者的恐慌。现在&#xff0c;各大学正值大学申请季&#xff0c;担心学生会利用人工智能工具伪造入学论文。但是&#xff0c;聊天机器人创作的论文足以骗过大学招生顾问吗&#xff1f; ChatGPT简介 ChatGPT&#xff0c;全称聊天生…

Docker 容器内运行 mysqldump 命令来导出 MySQL 数据库,自动化备份

备份容器数据库命令&#xff1a; docker exec 容器名称或ID mysqldump -u用户名 -p密码 数据库名称 > 导出文件.sql请替换以下占位符&#xff1a; 容器名称或ID&#xff1a;您的 MySQL 容器的名称或ID。用户名&#xff1a;您的 MySQL 用户名。密码&#xff1a;您的 MySQL …

SpringMVC-对静态资源的访问

1.工程中加入静态资源 在webapp下创建static文件夹&#xff0c;此文件夹专门放入静态资源 2.使项目可以处理静态资源的请求 在SpringMVC配置文件中添加以下语句 1.引入命名空间 xmlns:mvc"http://www.springframework.org/schema/mvc" xsi:schemaLocation“http…

npm i 报一堆版本问题

1&#xff0c;先npm cache clean --force 再下载 插件后缀加上 --legacy-peer-deps 2&#xff0c; npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/yorkie/download/yorkie-2.0.0.tgz failed, reason…

Nginx编译安装以及负载均衡配置(Ubuntu 22.04)

目录 Nginx编译安装以及负载均衡配置 Ubuntu 22.04.1 LTS 编译安装 nginx-1.22.1 1.安装依赖包 2. 下载nginx 3. 编译安装 报错解决 解决问题2 4.安装 5启动Nginx&#xff1a; 负载均衡 负载均衡算法 轮询 加权负载均衡 ip_hash算法 算法进行配置演示 加权负载均衡 轮询 IP 哈希…