openssl3.2 - exp - buf to bio

news/2024/4/19 17:41:27/

文章目录

    • openssl3.2 - exp - buf to bio
    • 概述
    • 笔记
    • bio_get_length
      • 调用端代码
      • 函数实现
      • bio_to_buffer
    • END

openssl3.2 - exp - buf to bio

概述

不想让程序调用openssl API时, 有文件落地的动作.
如果程序有配置文件要用, 也是自己读文件到buffer, 然后转成BIO给openssl的相关有BIO入参的API用.
如果在程序中用数组定义了一些PEM内容的数组, 也可以将数组转成BIO来用.

从openssl测试代码中, 找到了BIO_new_mem_buf(), 可以做这个事情.
那么程序需要的文件输入, 都可以读入buffer, 转成BIO, 后续都用BIO来处理.

笔记

/*!
* \file main.cpp
* \note buffer to bio
*/#include "my_openSSL_lib.h"#include <stdlib.h>
#include <stdio.h>
#include <cstdint>
#include <assert.h>#include <openssl/bio.h>int test_bio_new_mem_buf(void);int main(int argc, char** argv)
{test_bio_new_mem_buf();return 0;
}int test_bio_new_mem_buf(void)
{int ok = 0;BIO* bio = NULL;BUF_MEM* bufmem = NULL;char data[16];int i_rc = 0;do {// BIO_free(bio); // openssl做了处理, 即使入参为NULL, 也不会报错// BIO_new_mem_buf是直接将入参的buffer指到内部指针上, 所以入参指针如果是自己new出来的, 就需要自己释放// 如果是文件输入, 可以自己读文件到buffer中, 然后就用BIO来操作.bio = BIO_new_mem_buf("Hello World\n", 12);if (NULL == bio){break; }i_rc = BIO_get_mem_ptr(bio, &bufmem);if (i_rc <= 0){break;}memset(data, 0, sizeof(data));if (5 != BIO_read(bio, data, 5)) { break; }if (0 != strncmp(data, "Hello", 5)){break;}// b->flags & BIO_FLAGS_MEM_RDONLY// bio默认是只读的, 是写不进去的.i_rc = BIO_write(bio, "test", 4);assert(i_rc <= 0);memset(data, 0, sizeof(data));i_rc = BIO_read(bio, data, 16); // 连续调用BIO_read时, 是继续往后读, 读一点, 内容就少一点assert(7 == i_rc); // 返回值是读了多少个字节if (0 != strncmp(data, " World\n", 7)){break;}i_rc = BIO_reset(bio); // 只读的bio可以恢复到刚创建时的状态, 可以从头开始读.assert(i_rc > 0);i_rc = BIO_read(bio, data, 16);assert(12 == i_rc);if (0 != strncmp(data, "Hello World\n", 12)){break;}ok = 1;} while (false);if (NULL != bio){BIO_free_all(bio);bio = NULL;}return ok;
}

bio_get_length

openssl 并不提供如何得到BIO对象内容的size.
因为很多BIO是不知道有多长的(e.g. bio for ssl)
但是对于由buffer转成BIO之后, 其实BIO内的数据长度是确定的.
翻翻openssl实现, 感觉也就只能通过试读来确定BIO的数据长度.
封装了一个函数bio_get_length(), 好使.

调用端代码

        // 如果是文件输入, 可以自己读文件到buffer中, 然后就用BIO来操作.bio = BIO_new_mem_buf("Hello World\n", 12);if (NULL == bio){break; }bio_length = bio_get_length(bio);assert(bio_length == 12);

函数实现

long bio_get_length(BIO* bio)
{long bio_length = 0;uint8_t* pBuf = NULL;int buf_len = 1024 * 1024;int i_rc = 0;// 只适合与已经全部装载了mem buffer内容的BIO// 因为 BIO_BUF_MEM 没有对外, 所以只能通过试读来确定BIO内容的长度do {if (NULL == bio){break;}pBuf = (uint8_t*)OPENSSL_malloc(buf_len);if (NULL == pBuf){break;}BIO_reset(bio);do {i_rc = BIO_read(bio, pBuf, buf_len);if (i_rc <= 0){break;}bio_length += i_rc;if (i_rc != buf_len){break;}} while (true);BIO_reset(bio);} while (false);if (NULL != pBuf){OPENSSL_free(pBuf);pBuf = NULL;}return bio_length;
}

bio_to_buffer

如果想对一个已经包含了内容的BIO中的内容, 转为buffer. 以下代码好使.

int test_bio_to_buffer(void)
{int ok = 0;BIO* bio = NULL;char data[16];int i_rc = 0;long bio_length = 0;uint8_t* pBufToLoadBIO = NULL;do {bio = BIO_new_mem_buf("Hello World\n", 12);if (NULL == bio){break;}// 得到BIO的数据长度, 才好去开bufferbio_length = bio_get_length(bio);assert(bio_length == 12);// 多开一个字节, 留一个'\0'的位置, 如果内容是可见字符, 看字符串方便pBufToLoadBIO = new uint8_t[bio_length + 1];if (NULL == pBufToLoadBIO){break;}pBufToLoadBIO[bio_length] = '\0';i_rc = BIO_read(bio, pBufToLoadBIO, bio_length);// 如果 bio_length 太大(> imax), 再分段读来处理, 现在先这样, 就当一次就读完了assert(i_rc == bio_length);// 现在可以拿pBufToLoadBIO去干活了(自己存文件, 或作其他处理)ok = 1;} while (false);if (NULL != bio){BIO_free_all(bio);bio = NULL;}if (NULL != pBufToLoadBIO){delete []pBufToLoadBIO;pBufToLoadBIO = NULL;}return ok;
}

END


http://www.ppmy.cn/news/1364193.html

相关文章

【Python编程+数据清洗+Pandas库+数据分析】

数据分析的第一步往往是数据清洗&#xff0c;这个过程关键在于理解、整理和清洗原始数据&#xff0c;为进一步分析做好准备。Python 语言通过Pandas库提供了一系列高效的数据清洗工具。接下来&#xff0c;该文章将通过一个简单的案例演示如何利用 Pandas 进行数据清洗&#xff…

MySQL之大表删除(基于硬链接方式)

在DROP TABLE的时候&#xff0c;所有进程不管是DDL还是DML都被HANG起&#xff1b;直到DROP结束才继续执行&#xff1b;这是因为INNODB会维护一个全局独占锁&#xff08;在table cache上面&#xff09;&#xff0c;直到DROP TABLE完成才释放。在我们常用的ext3,ext4&#xff0c;…

adb pull 使用

adb pull 是 Android Debug Bridge (ADB) 工具提供的一个命令&#xff0c;用于将设备上的文件拷贝到计算机上。通过 adb pull 命令&#xff0c;实现从 Android 设备上获取文件并保存到本地计算机上。 使用 adb pull 命令的基本语法如下&#xff1a; adb pull <设备路径>…

在 Ubuntu 中, 使用 fsck 命令来修复磁盘文件系统

在 Ubuntu 中&#xff0c;可以使用 fsck 命令来修复磁盘文件系统。fsck 是用于检查和修复文件系统的工具。 使用 fsck 命令修复磁盘文件系统的步骤如下&#xff1a; 首先&#xff0c;您需要在命令行终端窗口中以 root 用户身份登录。 使用 fdisk -l 命令列出所有磁盘设备。 …

unity发布webGL压缩方式的gzip,使用nginx作为web服务器时的配置文件

unity发布webGL压缩方式的gzip&#xff0c;使用nginx作为web服务器时的配置文件 Unity版本是&#xff1a;2021.3 nginx的版本是&#xff1a;nginx-1.25.4 Unity发布webgl时的测试 设置压缩方式是gzip nginx配置文件 worker_processes 1;events {worker_connections 102…

LVGL 环境搭建-基于WSL

背景说明 小白刚开始接触LVGL&#xff0c;前些日子狠心花198元入手了一块堪称LVGL 入门利器~HMI-Board 开发板&#xff0c;虽然有RT-Thread 集成好的LVGL 环境&#xff0c;只需要几个步骤就能成功把lvgl 的示例运行起来&#xff0c;对于爱折腾的我来说&#xff0c;过于简单也并…

BUUCTF crypto做题记录(9)新手向

一、rsa2 得到题目代码如下&#xff1a; N 101991809777553253470276751399264740131157682329252673501792154507006158434432009141995367241962525705950046253400188884658262496534706438791515071885860897552736656899566915731297225817250639873643376310103992170…

Android res/values/locale_config.xml文件

Android res/values/locale_config.xml文件 各个国家/地区在android系统里面的缩写代码。最典型的用途是本地化。 <?xml version"1.0" encoding"utf-8"?> <!-- Copyright (C) 2015 The Android Open Source ProjectLicensed under the Apache L…

用39块钱的全志V851se视觉开发板做了个小相机,还可以物品识别、自动追焦!

用39块钱的V851se视觉开发板做了个小相机。 可以进行物品识别、自动追焦&#xff01; 这个超低成本的小相机是在V851se上移植使用全志在线开源版本的Tina Linux与OpenCV框架开启摄像头拍照捕获视频&#xff0c;并结合NPU实现Mobilenet v2目标分类识别以及运动追踪等功能…并最终…

Github 2024-02-23 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-02-23统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量非开发语言项目4Python项目3TypeScript项目1HTML项目1Dart项目1Rust项目1 从零开始构建你喜爱的技术 创建周…

2月26日做题总结(C/C++真题)

今天是2024年2月16日&#xff0c;新学期开学第一天。在大三这个重要阶段&#xff0c;我决定参加24年秋招。在准备项目的同时&#xff0c;也先做一些入门的笔试题吧&#xff0c;慢慢积累。如果你也是处于这个阶段&#xff0c;欢迎来找我交流讨论&#xff01; 今天是做题第一天&a…

SQL注入漏洞解析-less-8(布尔盲注)

我们来看一下第八关 当我们进行尝试时&#xff0c;他只有You are in...........或者没有显示。 他只有对和错显示&#xff0c;那我们只能用对或者错误来猜他这个数据库 ?id1%27%20and%20ascii(substr(database(),1,1))>114-- ?id1%27%20and%20ascii(substr(database(),1,…

SQL注入漏洞解析--less-46

我们先看一下46关 他说让我们先输入一个数字作为sort,那我们就先输入数字看一下 当我们分别输入1&#xff0c;2&#xff0c;3可以看到按照字母顺序进行了排序&#xff0c;所以它便是一个使用了order by语句进行排序的查询的一种查询输出方式 当输入时出现报错提示&#xff0c;说…

css transform 会影响position 定位

比如通过以下代码.实现导航条上的每个li栏目,以不同的时间间隔,从上向下移动进来并显示 .my-navbar ul li {position: relative;opacity: 0;transform: translateY(-30px);transition: transform .6s cubic-bezier(.165,.84,.44,1),opacity .6s cubic-bezier(.165,.84,.44,1);…

JWT学习笔记

了解 JWT Token 释义及使用 | Authing 文档 JSON Web Token Introduction - jwt.io JSON Web Token (JWT&#xff0c;RFC 7519 (opens new window))&#xff0c;是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准&#xff08;(RFC 7519)。该 token 被设计为紧凑…

python爬虫实战:获取电子邮件和联系人信息

引言 在数字时代&#xff0c;电子邮件和联系人信息成为了许多企业和个人重要的资源&#xff0c;在本文中&#xff0c;我们将探讨如何使用Python爬虫从网页中提取电子邮件和联系人信息&#xff0c;并附上示例代码。 目录 引言 二、准备工作 你可以使用以下命令来安装这些库&a…

批量获取图片(上)

1.文件的路径 在Windows系统的路径中&#xff0c;我们使用反斜线 ( \ ) 分隔各个文件夹和文件名。 而在macOS系统中&#xff0c;文件夹和文件名使用正斜线 ( / ) 进行分隔。 2.打开文件 在Python语言中&#xff0c;open()函数表示要打开一个文件&#xff0c;对文件进行处理的…

【pytorch】常用代码

文章目录 条件与概率torch.tensor()torch.rand()torch.randn()torch.randint()torch.multinominal() 逻辑运算torch.argmax()torch.max()torch.sum()torch.tanh()torch.pow() 功能性操作 torch.nn.functionalF.normalize()F.elu()F.relu()F.softmax() 张量计算torch.zeros()tor…

移动端rem适配

如果需要使用 rem 单位&#xff0c;推荐使用以下两个工具&#xff1a; postcss-pxtorem 是一款 postcss 插件&#xff0c;用于将单位转化为 rem lib-flexible 用于设置 rem 基准值 下面我们分别将这两个工具配置到项目中完成 REM 适配。 一、使用 lib-flexible 动态设置 RE…

YOLOv9尝鲜测试五分钟极简配置

pip安装python包&#xff1a; pip install yolov9pip在https://github.com/WongKinYiu/yolov9/tree/main中下载好权重文件yolov9-c.pt。 运行下面代码&#xff1a; import yolov9model yolov9.load("yolov9-c.pt", device"cpu") # load pretrained or c…