openssl3.2 - exp - buffer to BIO

news2024/11/17 1:40:37

文章目录

    • openssl3.2 - exp - buffer to BIO
    • 概述
    • 笔记
    • END

openssl3.2 - exp - buffer to BIO

概述

openssl的资料看的差不多了, 准备将工程中用到的知识点整理一下.

openssl中很多API是以操作文件作为输入的, 也有很多API是以BIO作为输入的.
不管文件是不是受保护的, 如果有可能都在内存操作, 不落地.

为了防止要操作的内容落地, 最好是操作BIO.
为了操作BIO, 就需要将要操作的数据放到BIO中, 供openssl的API操作.

做了一个实验, 将工程中资源中包含的数据, 放到BIO中.
如果要操作的数据就是内存数据, 那么就先放到BIO中, 再用openssl的API来操作BIO.

笔记

在这里插入图片描述

/*!
* \file main.cpp
* \note openssl3.2 - exp - buffer to BIO
* vs2019 + vc++ + console
*/

#include "my_openSSL_lib.h"
#include "openssl/bio.h"

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <cstdint> // for uint8_t
#include "resource.h" // for IDR_X
#include <assert.h> // for assert()

bool LoadMyRc(const TCHAR* rc_type, int idr, uint8_t** ppdata, int* pLen);

int main(int argc, char** argv)
{
	uint8_t* pData = NULL;
	int len = 0;
	BIO* bio = NULL;
	long lLen = 0;
	int i_rc = 0;
	size_t sz_rc = 0;

	do {
		if (!LoadMyRc(TEXT("MY_APP"), IDR_MY_APP_PEM, &pData, &len))
		{
			break;
		}

		bio = BIO_new_ex(NULL, BIO_s_mem());
		if (NULL == bio)
		{
			break;
		}

		// buffer to BIO
		i_rc = BIO_write_ex(bio, pData, len, &sz_rc);
		assert(1 == i_rc); // i_rc = 1为成功
		assert(len == sz_rc); // 写入bio的数据长度应该和buffer中的数据长度相同

		// 要操作的数据已经在BIO中了, 现在可以拿BIO作为参数, 给其他可以接受BIO输入的API, 去干活了.

	} while (false);

	if (NULL != bio)
	{
		BIO_free(bio);
	}

	if (NULL != pData)
	{
		delete[] pData;
	}

	return 0;
}

bool LoadMyRc(const TCHAR* rc_type, int idr, uint8_t** ppdata, int* pLen)
{
	bool b_rc = false;
	HRSRC hrSrc = NULL;
	LPCWSTR lpcwstr = NULL;
	HGLOBAL hg = NULL;
	int nResSize = 0;
	LPVOID pResValue = NULL;

	do {
		if ((NULL == rc_type) ||(NULL == ppdata) || (NULL == pLen))
		{
			break;
		}

		// 参数1为NULL, 是找自己进程的资源
		// 参数2只能用MAKEINTRESOURCE来转ID到LPCWSTR, 这个指针既不是名称字符串, 也不是直接的内容
		hrSrc = ::FindResource(NULL, MAKEINTRESOURCE(idr), rc_type);
		if (NULL == hrSrc)
		{
			break;
		}

		hg = ::LoadResource(NULL, hrSrc);
		if (NULL == hg)
		{
			break;
		}

		LPVOID pResValue = LockResource(hg);
		if (NULL == pResValue)
		{
			break;
		}		
		
		nResSize = SizeofResource(NULL, hrSrc);
		if (0 == nResSize)
		{
			break;
		}

		// 如果是新建buffer, 传给openssl用, 必须用OPENSSL_malloc分配内存空间
		*ppdata = (uint8_t *)OPENSSL_malloc(nResSize);
		if (NULL == *ppdata)
		{
			break;
		}

		memcpy(*ppdata, pResValue, nResSize);
		*pLen = nResSize;

		b_rc = true;
	} while (false);

	if (NULL != hrSrc)
	{
		::FreeResource(hrSrc);
	}
	
	return b_rc;
}

/*!
\file my_openSSL_lib.h
*/

#ifndef __MY_OPENSSL_LIB_H__
#define __MY_OPENSSL_LIB_H__

#ifdef  _WIN32
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib") // for select()

#include <windows.h>

#pragma comment(lib, "libcrypto.lib")
#pragma comment(lib, "libssl.lib")

#endif /* #ifdef  _WIN32 */

// --------------------------------------------------------------------------------
// 开关宏 - begin
// --------------------------------------------------------------------------------

#define MY_USE_APPLINK

// --------------------------------------------------------------------------------
// 开关宏 - END
// --------------------------------------------------------------------------------

#endif /* #ifndef __MY_OPENSSL_LIB_H__ */
/*!
* \file D:\my_dev\my_local_git_prj\study\openSSL\nmake_test\test_c\prj_005_afalgtest.c\my_openSSL_lib.c
*/

#include "my_openSSL_lib.h"

#ifdef MY_USE_APPLINK
#include <openssl/applink.c> /*! for OPENSSL_Uplink(00007FF8B7EF0FE8,08): no OPENSSL_Applink */
#endif // #ifdef MY_USE_APPLINK

END

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

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

相关文章

游戏服务器租赁多少钱一台?26元,服不服?

游戏服务器租用多少钱一年&#xff1f;1个月游戏服务器费用多少&#xff1f;阿里云游戏服务器26元1个月、腾讯云游戏服务器32元&#xff0c;游戏服务器配置从4核16G、4核32G、8核32G、16核64G等配置可选&#xff0c;可以选择轻量应用服务器和云服务器&#xff0c;阿腾云atengyu…

SpringCloud-搭建Nacos服务中心

Nacos 是一个开源的动态服务发现、配置管理和服务管理平台。它支持多种服务发现协议&#xff0c;包括基于 DNS 和 HTTP 的服务发现。Nacos 提供了强大的配置管理和服务发现功能&#xff0c;使得在微服务架构中轻松实现服务注册、发现和配置管理成为可能。在本篇博客中&#xff…

微信小程序(三十六)事件传参

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.传参步骤 2.传参接收解构步骤 源码&#xff1a; index.wxml <button type"primary" bind:tap"onclick" mark:index"{{0}}" mark:remb"{{1}}" class"But&quo…

【Axure高保真原型】计算日期区间的天数差

今天和大家分享计算日期区间的天数差的原型模板&#xff0c;选择开始日期和结束日期&#xff0c;点击等于按钮后&#xff0c;就可以计算出这两个日期之间相差了多少天&#xff0c;本案例提供中继器版的日期选择器&#xff0c;以及JS版的日期选择器&#xff0c;具体效果可以观看…

kafka-splunk数据通路实践

目的&#xff1a; 鉴于目前网络上没有完整的kafka数据投递至splunk教程&#xff0c;通过本文操作步骤&#xff0c;您将实现kafka数据投递至splunk日志系统 实现思路&#xff1a; 创建kafka集群部署splunk&#xff0c;设置HTTP事件收集器部署connector服务创建connector任务&a…

【工具】Android|Android Studio 长颈鹿版本安装下载使用详解

版本&#xff1a;2022.3.1.22&#xff0c; https://redirector.gvt1.com/edgedl/android/studio/install/2022.3.1.22/android-studio-2022.3.1.22-windows.exe 前言 笔者曾多次安装并卸载Android Studio&#xff0c;反复被安卓模拟器劝退。现在差不多是第三次安装&#xff0c…

LeetCode-第2469题=温度转换

1.题目描述 给你一个四舍五入到两位小数的非负浮点数 celsius 来表示温度&#xff0c;以 摄氏度&#xff08;Celsius&#xff09;为单位。 你需要将摄氏度转换为 开氏度&#xff08;Kelvin&#xff09;和 华氏度&#xff08;Fahrenheit&#xff09;&#xff0c;并以数组 ans …

canvas缩放坐标系(scale)

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

(篇九)MySQL常用内置函数

目录 ⌛数学函数 ⌛字符串函数 ⌛聚合函数 ⌛日期函数 &#x1f4d0;获取当前时间 &#x1f4d0;获取时间的某些内容 &#x1f4d0;​编辑 &#x1f4d0;格式化函数 &#x1f4cf;format类型&#xff1a; ⌛系统信息函数 ⌛类型转换函数 数学函数 字符串函数 聚合函…

PCB正片和负片的区别与使用

PCB正片和负片的区别与使用 简单解释详细解释 简单解释 简单的来说&#xff0c;正片在电路板的表面&#xff08;指定是顶层和底层&#xff09;上保留我们绘图工具所画的线&#xff08;图案&#xff09;。 而负片则是将我们绘制的线&#xff08;图案&#xff09;进行腐蚀掉&am…

transformers之agent

Hugging Face 发布了 Transformers Agent&#xff0c;一种利用自然语言从精选工具集合中选择工具并完成各种任务的代理。此举使其与 LangChain 作为构建企业通用人工智能 (AGI) 应用程序的新兴框架直接竞争&#xff0c;因为它很像 LangChain 工具和代理。 什么是 Transformers…

python将Word页面纸张方向设置为横向

通过python-docx的章节属性&#xff0c;就可以更改纸张方向、纸张尺寸。 import docx from docx.enum.section import WD_ORIENT from docx.shared import Cmdocument docx.Document() section document.sections[0]# 设置纸张大小为A4大小 section.page_width Cm(21) sect…

AI人工智能怎么自动抠图去除背景

抠图在许多场合中都发挥着重要的作用&#xff0c;它可以帮助我们去除图片的背景&#xff0c;从而将图片转换成透明底色&#xff0c;方便我们为图片更换其他的背景。为了实现照片去除背景只提取人物&#xff0c;我们需要使用专业的图片处理工具&#xff0c;并进行一系列的操作。…

万界星空科技低代码平台:快速搭建MES系统

低代码MES系统&#xff1a;制造业数字化转型的捷径 随着制造业的数字化转型&#xff0c;企业对生产管理系统的需求逐渐提高。传统的MES系统实施过程复杂、成本高昂&#xff0c;已经无法满足现代企业的快速发展需求。而低代码搭建MES系统的出现&#xff0c;为企业提供了一种高…

公共用例库计划--个人版(七)Excel导入功能开发与导出功能改造

1、任务概述 本次计划的核心任务是开发一个&#xff0c;个人版的公共用例库&#xff0c;旨在将各系统和各类测试场景下的通用、基础以及关键功能的测试用例进行系统性地归纳整理&#xff0c;并以提高用例的复用率为目标&#xff0c;力求最大限度地减少重复劳动&#xff0c;提升…

巴尔加瓦算法图解:K最近邻算法

巴尔加瓦算法图解&#xff1a;K最近邻算法 目录 巴尔加瓦算法图解&#xff1a;K最近邻算法判断水果创建推荐系统1. 判断相似程度练习 回归&#xff08;预测结果&#xff09;机器学习总结 本章内容 ❑ 学习使用K最近邻算法创建分类系统。❑ 学习特征抽取。❑ 学习回归&#xff0…

JAVA建造者模式详解

建造者模式 1 建造者模式介绍 建造者模式 (builder pattern), 也被称为生成器模式 , 是一种创建型设计模式. 定义: 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 **建造者模式要解决的问题 ** 建造者模式可以将部件和其组装过程分开…

代码编辑器垂直选中列选择

一、vscode 1. alt shift 鼠标左键 效果如下&#xff1a;&#xff08;可框选字符&#xff0c;也可仅垂直编辑&#xff09; 2. ctrl alt 方向键 这个不像上个操作那样可以框选字符&#xff0c;只能上下&#xff08;并不总垂直&#xff09; 二、VS 1. alt 鼠标左键 或…

动态规划解决棋盘覆盖问题:一步步教你理解

从简单到复杂:理解动态规划通过矩形覆盖问题 动态规划是解决各种算法问题的一种强大方法,特别是当问题可以分解成重叠的子问题时。为了深入理解这个概念,我们将先从一个简单的矩形覆盖问题开始,然后逐步过渡到更复杂的二维棋盘覆盖问题。 简单问题:用2x1的小矩形覆盖2xn…

Linux实验记录:使用DHCP动态管理主机地址

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注&#xff1a; 动态主机配置协议&#xff08;DHCP&…