openssl3.2 - exp - class warp for sha3-512
文章目录
- openssl3.2 - exp - class warp for sha3-512
- 概述
- 笔记
- 调用方代码
- 子类 - cipher_sha3_512.h
- 子类 - cipher_sha3_512.cpp
- 基类 - cipher_md_base.h
- 基类 - cipher_md_base.cpp
- 备注
- END
openssl3.2 - exp - class warp for sha3-512
概述
前面实验整了一个对buffer进行sha3-512算hash的函数。
实际用的时候,要对几个buffer连续做hash. 前面封装的统一做hash的函数不适用。
重新封装了一个类,只要在类的生命周期中,就可以随时对连续的buffer(可能不在一个函数中)做hash的update.
笔记
调用方代码
bool CPeFileCheck::calc_hash_SHA3_512()
{bool b_rc = false;CCipherSha3_512 hash;do {if (!hash.begin()){break;}// 如果buffer不在一个函数中,将hash的指针传给那些函数做hash.updateif (!hash.update(this->m_pu8_map_file, this->m_u32_file_size)){break;}if (!hash.end()){break;}m_digest_length = hash.get_md_len();if (m_digest_length > sizeof(m_ary_digest_value)){break;}memcpy(m_ary_digest_value, hash.get_md(), hash.get_md_len());b_rc = true;} while (false);return b_rc;
}
子类 - cipher_sha3_512.h
//! \file cipher_sha3_512.h#ifndef __CIPHER_SHA3_512_H__
#define __CIPHER_SHA3_512_H__#include "cipher_md_base.h"class CCipherSha3_512 : public CCipherMdBase
{
public:CCipherSha3_512();virtual ~CCipherSha3_512();
};#endif // #ifndef __CIPHER_SHA3_512_H__
子类 - cipher_sha3_512.cpp
//! \file cipher_sha3_512.cpp#include "pch.h"
#include "cipher_sha3_512.h"CCipherSha3_512::CCipherSha3_512()
{setCiphherName("SHA3-512");
}CCipherSha3_512::~CCipherSha3_512()
{
}
基类 - cipher_md_base.h
//! \file cipher_md_base.h#ifndef __CIPHER_MD_BASE_H__
#define __CIPHER_MD_BASE_H__#include <openssl/evp.h>
#include <string>//! \ref https://blog.csdn.net/LostSpeed/article/details/135581192
class CCipherMdBase
{
public:CCipherMdBase();virtual ~CCipherMdBase();bool begin();bool update(uint8_t* pBuf, int lenBuf);bool end();unsigned int get_md_len() { return m_digest_length; }uint8_t* get_md() { return m_p_digest_value; }void setCiphherName(const char* pszNmae) { m_strCipherName = ((NULL != pszNmae) ? pszNmae : ""); }private:void clear();private:std::string m_strCipherName;OSSL_LIB_CTX* m_ossl_lib_ctx;EVP_MD* m_evp_md;EVP_MD_CTX* m_evp_md_ctx;unsigned int m_digest_length;uint8_t* m_p_digest_value;
};#endif // #ifndef __CIPHER_MD_BASE_H__
基类 - cipher_md_base.cpp
//! \file cipher_md_base.cpp#include "pch.h"
#include "cipher_md_base.h"CCipherMdBase::CCipherMdBase(): m_ossl_lib_ctx(NULL),m_evp_md(NULL),m_evp_md_ctx(NULL),m_digest_length(0),m_p_digest_value(NULL)
{}CCipherMdBase::~CCipherMdBase()
{clear();
}void CCipherMdBase::clear()
{if (NULL != m_evp_md_ctx){EVP_MD_CTX_free(m_evp_md_ctx);m_evp_md_ctx = NULL;}m_digest_length = 0;if (NULL != m_p_digest_value){OPENSSL_free(m_p_digest_value);m_p_digest_value = NULL;}if (NULL != m_evp_md){EVP_MD_free(m_evp_md);m_evp_md = NULL;}if (NULL != m_ossl_lib_ctx){OSSL_LIB_CTX_free(m_ossl_lib_ctx);m_ossl_lib_ctx = NULL;}
}bool CCipherMdBase::begin()
{bool b_rc = false;const char* _psz_option_properties = NULL;do {clear();m_ossl_lib_ctx = OSSL_LIB_CTX_new();if (NULL == m_ossl_lib_ctx) {// fprintf(stderr, "OSSL_LIB_CTX_new() returned NULL\n");break;}/** Fetch a message digest by name* The algorithm name is case insensitive.* See providers(7) for details about algorithm fetching*/if (m_strCipherName.empty()){break;}m_evp_md = EVP_MD_fetch(m_ossl_lib_ctx, m_strCipherName.data(), _psz_option_properties);if (NULL == m_evp_md) {// fprintf(stderr, "EVP_MD_fetch could not find SHA3-512.");break;}/** Make a message digest context to hold temporary state* during digest creation*/m_evp_md_ctx = EVP_MD_CTX_new();if (NULL == m_evp_md_ctx) {// fprintf(stderr, "EVP_MD_CTX_new failed.\n");break;}/** Initialize the message digest context to use the fetched* digest provider*/if (EVP_DigestInit(m_evp_md_ctx, m_evp_md) != 1) {// fprintf(stderr, "EVP_DigestInit failed.\n");break;}b_rc = true;} while (false);return b_rc;
}bool CCipherMdBase::update(uint8_t* pBuf, int lenBuf)
{bool b_rc = false;do {if (EVP_DigestUpdate(m_evp_md_ctx, pBuf, lenBuf) != 1) {// fprintf(stderr, "EVP_DigestUpdate(hamlet_1) failed.\n");break;}b_rc = true;} while (false);return b_rc;}bool CCipherMdBase::end()
{bool b_rc = false;int digest_length = 0;do {/* Determine the length of the fetched digest type */m_digest_length = EVP_MD_get_size(m_evp_md);if (m_digest_length <= 0) {// fprintf(stderr, "EVP_MD_get_size returned invalid size.\n");break;}m_p_digest_value = (uint8_t*)OPENSSL_malloc(m_digest_length);if (NULL == m_p_digest_value) {// fprintf(stderr, "No memory.\n");break;}if (EVP_DigestFinal(m_evp_md_ctx, m_p_digest_value, &m_digest_length) != 1) {// fprintf(stderr, "EVP_DigestFinal() failed.\n");break;}b_rc = true;} while (false);return b_rc;
}
备注
这个封装类用的很舒服。
如果要做其他种类的hash, 只需要继承一个子类,给定新的hash算法名称就行。
END
相关文章:
openssl3.2 - exp - class warp for sha3-512
文章目录 openssl3.2 - exp - class warp for sha3-512概述笔记调用方代码子类 - cipher_sha3_512.h子类 - cipher_sha3_512.cpp基类 - cipher_md_base.h基类 - cipher_md_base.cpp备注END openssl3.2 - exp - class warp for sha3-512 概述 前面实验整了一个对buffer进行sha…...
cog predict docker unknown flag: --file
如图: 使用cog predict -i image“link-to-image” 出现docker unknown flag: --file的问题。 解决方法(对我可行):切换cog版本。 这个是我一开始的cog安装命令(大概是下的最新版?)࿱…...
SpringMVC接收参数方式讲解
PathVariable 该注解用于接收具有Restful风格的参数,如/api/v1/1001,最终userId的值为1001。 如下代码中,使用name属性可以指定GetMapping中的id名称与之对应,从而可以自定义参数名称userId,而不是使用默认名称id G…...
JavaScript 中arguments 对象详细解析与案例
在JavaScript中,每个函数都有一个内部对象arguments,它包含了函数调用时传递的所有参数。arguments对象类似一个数组,但是它并不是真正的数组,它没有数组的方法,只有length属性和索引访问元素的能力。 以下是对argume…...
消除 BEV 空间中的跨模态冲突,实现 LiDAR 相机 3D 目标检测
Eliminating Cross-modal Conflicts in BEV Space for LiDAR-Camera 3D Object Detection 消除 BEV 空间中的跨模态冲突,实现 LiDAR 相机 3D 目标检测 摘要Introduction本文方法Single-Modal BEV Feature ExtractionSemantic-guided Flow-based AlignmentDissolved…...
【免安装的MATLAB--MATLAB online】
目录: 前言账号的注册图片处理的示例准备图片脚本函数 总结 前言 在计算机、数学等相关专业中,或多或少都会与MATLAB产生藕断丝连的联系,如果你需要使用MATLAB,但是又不想要安装到自己的电脑上(它实在是太大了啊&#…...
Flyway 数据库版本管理
一、Flyway简介 Flyway是一款开源的数据库迁移工具,可以管理和版本化数据库架构。通过Flyway,可以跟踪数据库的变化,并将这些变化作为版本控制的一部分。Flyway支持SQL和NoSQL数据库,并且可以与现有的开发流程无缝集成࿰…...
lua学习笔记19(面相对象学习的一点总结)
print("*****************************面相对象总结*******************************") object{} --实例化方法 function object:new()local obj{}self.__indexselfsetmetatable(obj,self)return obj end-------------------------如何new一个对象 function object:…...
视觉SLAM学习打卡【10】-后端·滑动窗口法位姿图
本节是对上一节BA的进一步简化,旨在提高优化实时性.难点在于位姿图部分的雅可比矩阵求解(涉及李代数扰动模型求导),书中的相关推导存在跳步(可能数学功底强的人认为过渡的理所当然),笔者参考了知…...
【动态规划 区间dp 位运算】100259. 划分数组得到最小的值之和
本文涉及知识点 动态规划 区间dp 位运算 LeetCode100259. 划分数组得到最小的值之和 给你两个数组 nums 和 andValues,长度分别为 n 和 m。 数组的 值 等于该数组的 最后一个 元素。 你需要将 nums 划分为 m 个 不相交的连续 子数组,对于第 ith 个子数…...
CSS核心样式-02-盒模型属性及扩展应用
目录 三、盒模型属性 常见盒模型区域 盒模型图 盒模型五大属性 1. 宽度 width 2. 高度 height 3. 内边距 padding 四值法 三值法 二值法 单值法 案例 4. 边框 border 按照属性值的类型划分为三个单一属性 ①线宽 border-width ②线型 border-style ③边框颜色 bo…...
在 Google Cloud 上轻松部署开放大语言模型
今天,“在 Google Cloud 上部署”功能正式上线! 这是 Hugging Face Hub 上的一个新功能,让开发者可以轻松地将数千个基础模型使用 Vertex AI 或 Google Kubernetes Engine (GKE) 部署到 Google Cloud。 Model Garden (模型库) 是 Google Clou…...
005Node.js模块URL的使用
引入 URL 模块 要使用 URL 模块,首先需要在代码中引入它。可以使用以下代码将 URL 模块导入到你的脚本中: const url require(url);实例代码 const urlrequire(url); var apihttp://www.baidu.com?nameshixiaobin&age20; console.log(url.parse(…...
美团笔试复盘
昨天做了美团的笔试,现在复盘一下。 1、将数组按照绝对值大小排序 有道算法题解决思路需要将数组按照绝对值大小进行排序,我使用的是sort方法Comparator比较器实现的,这里记录一下: public static void main(String[] args) {In…...
IntelliJ IDEA - Since Maven 3.8.1 http repositories are blocked
问题描述 新下载的 IDEA 在构建项目时,在下载引用的包时出现 “Since Maven 3.8.1 http repositories are blocked” 的问题。 原因分析 从 Maven 3.8.1 开始,不再支持 http 的包了。由于现在对网络安全的日益重视,都在向 https 转变&#…...
Django的APP应用更名(重命名)流程
将Django中的一个现有APP更名是一个需要谨慎操作的过程,因为它涉及到多个文件和配置的更新。下面是详细的步骤和一些补充细节,帮助你更顺利地完成APP重命名: 1. 修改APP名称及相关引用 更改APP目录名称: 首先,重命名…...
ChatGLM3-6B大语言模型离线执行
ChatGLM3-6B大语言模型离线执行 模型准备 一般而言,模型和模型参数可以通过如下三个模型源进行相应的下载: HuggingFace | ModelScope | WiseModel 本实例中,使用的是HuggingFace的源下载,相应的地址如下: HuggingFa…...
了解大语言模型的参数高效微调(Parameter-Effcient Fine-Tuning)
🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 大语言模型在众多应用领域实现了突破性的进步,显著提升了各种任务的完成度。然而,其庞大的规模也带来了高昂的计算成本。这些模型往往包含数十亿甚至上千亿参数,需要…...
2024.4.14力扣每日一题——设计哈希集合
2024.4.14 题目来源我的题解方法一 链表数组 题目来源 力扣每日一题;题序:705 我的题解 方法一 链表数组 由于给定限制次数为10000,所以构造一个长度为10001的链表数组。对于add操作先看数组对应的位置是否为null或者为空,若是…...
SQL explain 显示子查询A类型为ALL怎么优化
当 SQL EXPLAIN 显示子查询 A 的类型为 ALL 时,这意味着数据库系统正在执行全表扫描,而不是使用索引来执行子查询。全表扫描可能会导致性能下降,特别是在大型表上。 为了优化这种情况,您可以考虑以下几点: 1. **索引…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
