openssl之BIO系列之9---BIO对的创建和应用

OpenSSL_BIO接口整理以及Base64编码代码 阅读详情
BIO对是BIO中专门创建的一对缓存BIO,要创建BIO对,调用下面定义的函数(openssl/bio.h):
    int BIO_new_bio_pair(BIO **bio1, size_t writebuf1, BIO **bio2, size_t writebuf2);
    这个函数调用成功后返回1,这时候bio1和bio2都是有效的了;否则就返回0,而bio1和bio2就会设为NULL,这是后可以检测出错堆栈以得到更多错误信息。
    这个BIO对创建之后,它的两端都能作为数据缓冲的输入和输出。典型的应用是它一端和SSL的IO连接,而另一端则被应用控制,这样,应用程序就不需要直接和网络连接打交道了。
    这两个BIO对的功能是完全对称的,它们的缓冲区的大小由参数writebuf1和writebuf2决定,如果给定的大小是0,那么该函数就会使用缺省的缓存大小。BIO_new_bio_pair不会检查bio1和bio2是否真的指向其它BIO,bio1和bio2的值都被重写,但是在此之前不会调用BIO_free()函数。所以,在使用bio1和bio2之前,必须自己保证这两个变量是空的BIO,否则可能造成内存泄漏。
    值得注意的是,虽然这两个BIO是一对的和一起创建的,但是却必须分别释放。之所以这样做,是有其重要原因的,因为有些SSL函数,如SSL_set_bio或BIO_free会隐含调用BIO_free函数,所以这时候另一端的BIO就只能单独释放了。
    为了让大家对BIO对的应用模型有一个感性的认识,下面举一个简单的例子说明问题。
    BIO对能给提供应用程序中对网络处理的完全控制能力,程序可以对根据需要调用soket的select()函数,同时却可以避免直接处理SSL接口。下面是使用BIO_new_bio_pair的简单代码模型:
     BIO *internal_bio, *network_bio;
     ...
     BIO_new_bio_pair(internal_bio, 0, network_bio, 0);
     SSL_set_bio(ssl, internal_bio);
     SSL_operations();
     ...
    
     application | TLS-engine
     | |
     +----------> SSL_operations()
     | // ||
     | || //
     | BIO-pair (internal_bio)
     +----------< BIO-pair (network_bio)
     | |
     socket |
    
     ...
     SSL_free(ssl); /* 隐式释放 internal_bio */
     BIO_free(network_bio); /* 显式释放 network_bio*/
     ...
    因为BIO对只会简单的缓存数据,而不会直接涉及到连接,所以它看起来就想非阻塞型的接口,如果写缓存满了或读缓存空的时候,调用IO函数就会立刻返回。也就是说,应用程序必须自己对写缓存执行flush操作或对读缓存执行fill操作。可以使用前面介绍过的BIO_ctrl_pending函数看看是否有数据在缓存里面并需要传输到网络上去;为了下面的SSL_operation能够正确执行,可以调用BIO_ctrl_get_read_request函数,以决定需要在写缓存写入多少数据。上面两个函数可以保证正确的SSL操作的进行。

    需要注意的是,SSL_operation的调用可能会出现返回ERROR_SSL_WANT_READ值,但这时候写缓存却还有数据的情况,所以应用程序不能简单的根据这个错误代码进行判断,而必须保证写缓存以及执行过flush操作了,否则就会造成死锁现象,因为另一端可能知道等到有数据了才会继续进行下面的操作。 


FW : http://blog.youkuaiyun.com/gdwzh/article/details/19206

【OpenSSL】OpenSSL实现Base64 Base64就是将二进制数据转换为字符串的一种算法。 阅读详情

相关推荐

OpenSSL-0.9.8r库与头文件完整资源包

OpenSSL 0.9.8r 虽然老旧,但它教会我们一件事:真正的安全来自于对每一个细节的掌控。在这个动辄依赖几十个 npm 包的时代,回头看看这样一个轻量、透明、可审计的密码库,或许能让我们重新思考“什么是可靠的系统”。🔐 “复杂性是安全的最大敌人。下次当你面对一个新的安全需求时,不妨问问自己:我真的需要那么多抽象层吗?还是说,有时候回归本质才是最稳妥的选择?毕竟,那些藏在.a文件里的汇编指令,才是真正守护数据的最后一道防线。🛡️本文还有配套的精品资源,点击获取。

weixin_30248619的博客 692

openssl之BIO系列之16---BIO对(pair)类型BIO

BIO对(pair)类型BIO     ---根据openssl doc\crypto\bio_s_bio.pod翻译和自己的理解写成     (作者:DragonKing, Mail: wzhah@263.net ,发布于:http://gdwzh.126.com之o penssl专业论坛)     前面我们已经介绍过BIO对的概念,其实更进一步,BIO对也是作为一种source/sin

潇汀 8059

HC-05蓝牙模块AT指令配置避坑全记录:从配对失败到稳定主从通信

本文详细记录了HC-05蓝牙模块AT指令配置的全过程,从基础认知到主从通信的稳定实现。涵盖了进入AT模式的方法、关键AT指令详解、主从配对流程及常见故障排除,帮助开发者快速掌握蓝牙串口模块的配置技巧,避免常见配对失败问题。

weixin_42632434的博客 416

Openssl之BIO系列

1.BIO-抽象的IO接口 其实包含了很多种接口,用通用的函数接口,主要控制在BIO_METHOD中的不同实现函数控制,我初步估计了一下,大概有14种,包括4种filter型和10种source/sink型。 BIO是在底层覆盖了许多类型I/O接口细节的一种应用接口,如果你在程序中使用BIO,那么就可以和SSL、非加密的网络以及文件IO进行透明的连接。有两种不通的BIO接口,一种是sour

章志强的专栏 1万+

新手小白入门编程第2讲 JAVA编程环境搭建 JDK与环境变量、Eclipse

1 JDK 1.1 JDK概述 JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。 JDK是整个java开发的核心,它包含了: JAVA开发工具(jdk\bin) 基础开发库(jdk\jre\lib\rt.jar) 基础开发库的源码(jdk\src.zip) 1.2 JDK下载与安装 本次使用的是JDK1.8,详细安装步骤可以参见”JDK培优安装手册”. 注意事项: 同时安装多个JDK时需要使用执行环境变量来确认使用的是哪个jdk 安装时选择默认选项安装到默认

程序媛泡泡的博客 4万+

ABAP传输自定义IDOC实例

首先确定出站方和入站方,本例中我使用150作为发送方将200作为接收方。 发送端系统配置 进入tcode-SALE,点击定义逻辑系统,这里我定义D01CLNT150为发送端, D01CLNT200为接收端 2,将逻辑系统分配给对应的client 3,进入tcode-WE31,创建IDOC开发段(segment)这里可以按照实际需求创建想要传输的结构,为求简单我创建了ZKNA1并选取了几个客户主数据的字段作为示例 4,进入tcode-WE30,创建Idoc Ty...

Nathan的博客 4078

从限速牌上的80.0看数据清洗:用Python识别OSM字段异常

在数据处理中,字段精度问题常因“数值相同但格式不同”的脏数据而引发统计偏差与异常识别困难。以高速公路限速牌上的“80.0 mph”为例,这并非真实速度,而是里程标记混入限速字段的典型数据误用。借助Python与OpenStreetMap的maxspeed标签,通过Overpass API抓取道路数据,在字符串阶段解析小数点,即可批量识别此类异常,并利用可视化分析其分布规律。这套方法适用于配置管理、日志解析、金融金额校验等场景,帮助数据工程师快速定位“看起来一样”的潜在故障源。最终,一个完整的实战项目将展示如

weixin_34059951的博客 228

智能气象站:ESP32驱动的心知天气数据可视化实践

本文详细介绍了基于ESP32微控制器和心知天气API构建智能气象站的完整实践。通过Arduino开发环境,实现天气数据的获取、JSON解析与OLED屏可视化展示,涵盖硬件连接、API配置、低功耗优化及部署问题排查,为物联网开发者提供实用指南。

jump7的博客 212

openssl之BIO系列之15---内存(mem)类型BIO

mem类型BIO    ---根据openssl doc/crypto/bio_s_mem.pod翻译和自己的理解写成        (作者:DragonKing, Mail: wzhah@263.net ,发布于:http://gdwzh.126.com 之openssl专业论坛)        内存(mem)类型BIO所定义的相关系列函数如下(openssl/bio.h):     BIO_M

内网安全与OpenSSL专栏 1万+

Jenkins插件下载慢?3分钟搞定国内镜像加速(含华为/腾讯/清华源对比)

本文详细介绍了如何通过国内镜像源加速Jenkins插件下载,包括华为云、腾讯云和清华源等主流镜像站的性能对比及一键配置方案。通过实测数据展示华为云镜像站表现最佳,下载速度达19.4MB/s,并提供sed命令、管理界面配置和Docker定制三种高效加速方案,帮助开发者快速解决插件下载慢的问题。

sql99的博客 320

整理 钢琴 约翰汤普森-简易钢琴(小汤)

文件名:(小汤1)约翰-汤普森钢琴1 超清PDF (原版引进)文件名:(小汤2)约翰-汤普森钢琴2 超清PDF (原版引进)文件名:(小汤3)约翰-汤普森钢琴3 超清PDF (原版引进)文件名:(小汤4)约翰-汤普森钢琴4 超清PDF (原版引进)文件名:(小汤5)约翰-汤普森钢琴5 超清PDF (原版引进)文件大小:20.1 MB。文件大小:23.7 MB。文件大小:45.7 MB。文件大小:51.7 MB。文件大小:72.0 MB。

TS的博客 5万+

openssl之BIO系列之10---BIO链的定位操作

BIO链的定位操作     ---根据openssl doc/crypto/bio/bio_find_type.pod翻译和自己的理解写成          (作者:DragonKing Mail:wzhah@263.net 发布于:http://gdwzh.126.com之openssl专业论坛)          前面的一篇文章讲过BIO链的构造方法,这里讲的是在一个BIO链中,怎么

潇汀 8185

优秀的 Verilog/FPGA开源项目介绍(二十七)- 小型CPU

介绍在FPGA上实现一个CPU是一个令人兴奋的事情,但是太复杂的CPU实现起来太难,而且不适合去了解计算机的架构,所以今天介绍一些小型的CPU,比如8051、MIPS、MSP430等~关于RISC-V的项目,请查看《优秀的 Verilog/FPGA开源项目介绍(二)-RISC-V》ZipCPUhttp://zipcpu.com/about/zipcpu.html项目介绍Z...

OpenFPGA的博客 2576

使用openssl BIO接口实现base64编解码

#include <iostream> #include <openssl/bio.h> #include <openssl/evp.h> #include <openssl/buffer.h> using namespace std; int Base64Encode(const unsigned char* in, int len, char* out_base64) { if (!in || len <= 0 || !out_base64)

Lee notes 2021

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

OpenSSL Library - BIO 概论

转自:http://blog.roodo.com/rocksaying/archives/16263025.html BIO 是 OpenSSL 庫為了處理資料輸出入所設計的輸出入抽象層,參考《bio(3) 》的說明。 OpenSSL 的程式碼經常利用 BIO 的多形性,故在使用 OpenSSL 開發應用程式時,必須先熟悉 BIO。 BIO 的設計模式是 C 語言 (不是C

yasi_xi的专栏 2204

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

fatal error: openssl/bio.h: No such file or directory 解决方法

后,发现编译错误消除,问题解决。

u011029104的专栏 2640

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

(整理)openssl之BIO.

(整理)openssl之BIO. https://wenku.baidu.com/view/5cf9e5318ad63186bceb19e8b8f67c1cfbd6ee60.html

weixin_44740398的博客 286

openssl RSA 内存读取密钥

openssl RSA 内存读取密钥 主要注意一下密钥的格式 #include <openssl/pem.h> #include <openssl/err.h> bool CEncipher::CreatePubKey() { BIO* bp = NULL; string strPublicKey = "MIGfMA0GCSqGSIb3DQE...

我的博客 2004

openssl3.2 - 官方demo学习 - digest - BIO_f_md.c

计算buffer的摘要(例子中使用的摘要算法为 SHA3-512)

博客标题不能为空 598
上一篇: openssl之BIO系列之8---读写出错控制
下一篇: openssl之BIO系列之10---BIO链的定位操作
coo1fish
博客等级 码龄14年 22粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值