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

opensslBIO系列之4---BIO控制函数介绍 BIO控制函数介绍    ---根据openssl doc/crypto/bio/bio_ctrl.pod翻译和自己的理解写成        (作者:DragonKing Mail:wzhah@263.net 发布于:http://gdwzh.126.com  openssl专业论坛)    BIO控制函数有许多,并且不同的BIO类型还有不同的控制函数,这里只简单介绍一些通用的BIO控制函数,至于 阅读详情
    前面我们已经介绍过BIO对的概念,其实更进一步,BIO对也是作为一种source/sink类型的BIO来处理的,也就是说,BIO里面还提供了一种专门的BIO_METHO方法来处理BIO对的各种操作。BIO对类型的BIO各种相关的函数定义如下(openssl/bio.h):
     BIO_METHOD *BIO_s_bio(void);
    
     #define BIO_make_bio_pair(b1,b2) (int)BIO_ctrl(b1,BIO_C_MAKE_BIO_PAIR,0,b2)
     #define BIO_destroy_bio_pair(b) (int)BIO_ctrl(b,BIO_C_DESTROY_BIO_PAIR,0,NULL)
    
     #define BIO_shutdown_wr(b) (int)BIO_ctrl(b, BIO_C_SHUTDOWN_WR, 0, NULL)
    
     #define BIO_set_write_buf_size(b,size) (int)BIO_ctrl(b,BIO_C_SET_WRITE_BUF_SIZE,size,NULL)
     #define BIO_get_write_buf_size(b,size) (size_t)BIO_ctrl(b,BIO_C_GET_WRITE_BUF_SIZE,size,NULL)
    
     int BIO_new_bio_pair(BIO **bio1, size_t writebuf1, BIO **bio2, size_t writebuf2);
    
     #define BIO_get_write_guarantee(b) (int)BIO_ctrl(b,BIO_C_GET_WRITE_GUARANTEE,0,NULL)
     size_t BIO_ctrl_get_write_guarantee(BIO *b);
    
     #define BIO_get_read_request(b) (int)BIO_ctrl(b,BIO_C_GET_READ_REQUEST,0,NULL)
     size_t BIO_ctrl_get_read_request(BIO *b);
    
     int BIO_ctrl_reset_read_request(BIO *b);
    可以看到,这些函数中大多数是宏定义函数并且都是基于BIO_ctrl函数的。
    BIO对类型的BIO是一对source/sink型的BIO,数据通常是从一个BIO缓冲写入,从另一个BIO读出。其实,从源代码(bss_bio.c)可以看出,所谓的BIO对只是将两个BIO的终端输出(BIO结构中参数peer的ptr成员)相互设置为对方,从而形成一种对称的结构,如下:
     bio1->peer->ptr=bio2
     bio2->peer->ptr=bio1
    
     数据流向1(写bio1,读bio2):--->bio1--->bio2--->
     数据流行2(写bio2,读bio1):--->bio2--->bio1--->
    
    因为没有提供内部数据结构的内存锁结构(lock),所以,一般来说这个BIO对的两个BIO都必须在一个线程下使用。因为BIO链通常是以一个source/sink BIO结束的,所以就可以实现应用程序通过控制BIO对的一个BIO从而控制整个BIO链的数据处理。其实,也就相当于BIO对给应用程序提供了一个处理整个BIO链的入口。上次我们说BIO对的时候就说过,BIO对的一个典型应用就是在应用程序里面控制TLS/SSL的I/O接口,一般来说,在应用程序想在TLS/SSL中使用非标准的传输方法或者不适合使用标准的socket方法的时候就可以采用这样的方法来实现。
    前面提过,BIO对释放的时候,需要分别释放两个BIO,如果在使用BIO_free或者BIO_free_all释放了其中一个BIO的时候,另一个BIO就也必须要释放。
    当BIO对使用在双向应用程序的时候,如TLS/SSL,一定要对写缓冲区里面的数据执行flush操作。当然,也可以通过在BIO对中的另一个BIO调用BIO_pending函数,如果有数据在缓冲区中,那么就将它们读出并发送到底层的传输通道中区。为了使请求或BIO_should_read函数调用成功(为true),在执行任何正常的操作(如select)之前,都必须这样做才行。
    下面举一个例子说明执行flush操作的重要性:
    考虑在TLS/SSL握手过程中,采用了BIO_write函数发送了数据,相应的操作应该使BIO_read。BIO_write操作成功执行并将数据写入到写缓冲区中。BIO_read调用开始会失败,BIO_should_retry返回true。如果此时对写缓冲区不执行flush操作,那么BIO_read调用永远不会成功,因为底层传输通道会一直等待直到数据有效(但数据却在写缓冲区里,没有传到底层通道)。
    
    【BIO_s_bio】
    该函数返回一个BIO对类型的BIO_METHOD,其定义如下:
    static BIO_METHOD methods_biop =
    { BIO_TYPE_BIO,
     "BIO pair",
     bio_write,
     bio_read,
     bio_puts,
     NULL /* 没有定义 bio_gets */,
     bio_ctrl,
     bio_new,
     bio_free,
     NULL /* 没有定义 bio_callback_ctrl */
    };
    从定义中可以看到,该类型的BIO不支持BIO_gets的功能。
    BIO_read函数从缓冲BIO中读取数据,如果没有数据,则发出一个重试请求。
    BIO_write函数往缓冲BIO中写入数据,如果缓冲区已满,则发出一个重试请求。
    BIO_ctrl_pending和BIO_ctrl_wpending函数可以用来查看在读或写缓冲区里面有效的数据的数量。
    BIO_reset函数将写缓冲区里面的数据清除。
    【BIO_make_bio_pair】
    该函数将两个单独的BIO连接起来成为一个BIO对。
    【BIO_destroy_pair】
    该函数跟上面的函数相反,它将两个连接起来的BIO对拆开;如果一个BIO对中的任何一个BIO被释放,该操作会自动执行。
    【BIO_shutdown_wr】
    该函数关闭BIO对的其中一个BIO,一个BIO被关闭后,针对该BIO的任何写操作都会返回错误。从另一个BIO读数据的时候要么返回剩余的有效数据,要么返回EOF。
    【BIO_set_write_buf_size】
    该函数设置BIO的缓冲区大小。如果该BIO的缓存区大小没有初始化,那么就会使用默认的值,大小为17k,这对于一个TLS记录来说是足够大的了。
    【BIO_get_write_buf_size】
    该函数返回写缓冲区的大小。
    【BIO_new_bio_pair】
    该函数我们在前面的《BIO系列之9---BIO对的创建和应用》中已经做了详细的介绍,其实,它是调用了BIO_new,BIO_make_bio_pair和BIO_set_write_buf_size函数来创建一对BIO对的。如果两个缓冲区长度的参数都为零,那么就会使用默认的缓冲区长度。
    【BIO_get_write_guarantee和BIO_ctrl_get_write_guarantee】
    这两个函数返回当前能够写入BIO的数据的最大长度。如果往BIO写入的数据长度比该函数返回的数据长度大,那么BIO_write返回的写入数据长度会小于要求写入的数据,如果缓冲区已经满了,则会发出一个重试的请求。这两个函数的唯一不同之处是一个使用函数实现的,一个是使用宏定义实现的。
    【BIO_get_read_request和BIO_ctrl_get_read_request】
    这两个函数返回要求发送的数据的长度,这通常是在对该BIO对的另一个BIO执行读操作时因为缓冲区数据为空导致失败时发出的请求。所以,这通常用来表明现在应该写入多少数据才能使接下来的读操作能够成功执行,这在TLS/SSL应用程序中是非常有用的,因为对于这个协议来说,读取的数据长度比缓冲区的数据长度通常要有意义的多。如果在读操作成功之后调用这两个函数会返回0,如果在调用该函数之前有新的数据写入(不管是部分还是全部满足需要读取的数据的要求),那么调用该函数也会返回0。理所当然,该函数返回的数据长度肯定不会大于BIO_get_write_guarantee函数返回的数据长度。
    【BIO_ctrl_reset_read_request】
    该函数就是把BIO_get_read_request要返回值设置为0。
    
    【参考文档】

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


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

ESP32-S3模组上兼容SCCB总线与I2C总线的解决方案(1) 阅读详情

相关推荐

从平衡车到寻迹小车:IMU963RA九轴陀螺仪实战避坑与四元数融合指南

本文详细解析了IMU963RA九轴陀螺仪在机器人姿态控制中的应用,重点探讨了从六轴升级到九轴系统的技术路径及四元数融合算法。通过实战案例,揭示了如何利用地磁计补偿陀螺积分漂移,并提供硬件集成、传感器校准及算法实现的完整解决方案,有效将8小时漂移控制在2度以内。

weixin_27219587的博客 253

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

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就会设

fryingpan的专栏 633

Viobot使用教程总贴

使用教程总贴

weixin_66666206的博客 1409

OpenSSL中文手册之BIO库详解

这一系文章参考了http://blog.youkuaiyun.com/xiaoting451292510/article/details/466495831 BIO 概述  其实包含了很多种接口,用通用的函数接口,主要控制在BIO_METHOD中的不同实现函数控制,包括6种filter型和8种source/sink型。   source/sink类型的BIO是数据源,例如,sokect BIO和文件BIO。

liao20081228的博客 4万+

BUUCTF reverse题解汇总

BUUCTF平台刷题过程中做的一些逆向题解的总结归类

于高山之巅,方见大河奔涌;于群峰之上,更觉长风浩荡。 1万+

华为面试手撕真题【判断是ipv4还是ipv6地址】

编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。

MISAYAONE的博客 1万+

使用OpenSSL的内存BIO

BIO

幽雨雨幽 1363

Android功耗系列专题分析之四:待机概率性功耗高的失效分析

本文分析了Android设备待机功耗异常高的问题。通过日志发现系统休眠失败,原因是PowerManagerService.Display唤醒锁未被释放。进一步排查发现,指纹解锁功能在灭屏时未正确释放屏幕锁定,导致DisplayReady状态异常。解决方案是将指纹功能的背光控制与DisplayReady状态控制分离,使用两个变量独立管理。经验表明,快速定位问题比解决问题更重要,修改原生流程时需谨慎评估风险。

451

Openssl之BIO系列

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

章志强的专栏 1万+

GEE:面对对象土地利用分类(结合SNIC、GLCM 和机器学习算法)

本文将介绍在Google Earth Engine中结合SNIC、GLCM和机器学习算法的的土地利用/土地覆盖(LULC)分类方法。结果如下图所示,

养乐多的博客 5616

Django 6.0:有哪些新特性以及它们对实际项目的重要性

Django 6.0 感觉像是一个成熟的版本,它基于实际应用案例而打造。它减少了不必要的复杂性,同时扩展了框架的开箱即用功能。升级到 Django 6.0 不仅仅是为了保持版本更新,更是为了构建更易于维护、更安全、更能适应未来发展的应用程序。

iCloudEnd的博客 341

openssl之BIO系列之4---BIO控制函数介绍

BIO控制函数介绍          BIO控制函数有许多,并且不同的BIO类型还有不同的控制函数,这里只简单介绍一些通用的BIO控制函数,至于某种类型BIO的特定控制函数,则参考后续的文件。     BIO的通用控制函数有以下几种,其声明如下(openssl/bio.h):      long BIO_ctrl(BIO *bp,int cmd,long larg,void *parg);

fryingpan的专栏 1332

Unity最强动作战斗框架?Combat System Framework 深度解析

Combat System Framework 并不是一个简单的角色控制器,而是一套完整的动作游戏战斗开发框架。它借鉴了现代 AAA 游戏常见的架构思想,以 Gameplay Tag 为核心,结合 ScriptableObject 数据驱动设计,将技能、属性、Buff、伤害、武器、动画通知等系统有机整合在一起。同时,配套的可视化动画时间轴、Root Motion 工具和实时预览窗口,大幅优化了动作开发流程。当然,这套框架也有一定的学习门槛。

2403_88403568的博客 680

Qt中undefined reference to报错的三种可能性和解决方法(以libgdal为例)

有一段代码很久没动了,今天想跑起来编译看看,突然发现出现一堆报错,如下: 好吧,首先我能保证的是,有之前调试代码过程中,这些报错一定是没有出现的。最近也没什么动作,怎么就忽然就出现了。 不管怎么说,解决问题是关键。 单纯这个报错内容来看,很典型的undefined reference to的报错,这个报错在调用第三方库的编程中,简直是家常便饭,代表的含义也很明确,就是找不到函数的定义。 用C++写代码的都知道,在C++中,代码是分为声明和定义的,声明就是告诉编译器有这个函数,换言之,就是个名字,而定义,就

baidu_31788709的博客 6万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

OpenSSL BIO源码简析

OpenSSL BIO源码简析

Starr 1858

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【C++】undefined reference to找不到符号问题汇总及解决方法

https://segmentfault.com/a/1190000006049907?utm_source=tuicool&utm_medium=referral https://blog.youkuaiyun.com/aiwoziji13/article/details/7330333 https://blog.youkuaiyun.com/qq_17835733/article/details/72521019

我的笔记本 3万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

《openssl编程》之BIO

第七章   抽象IO 7.1    openssl抽象IO openssl抽象IO(I/O abstraction,即BIO)是openssl对于io类型的抽象封装,包括:内存、文件、日志、标准输入输出、socket(TCP/UDP)、加/解密、摘要和ssl通道等。Openssl BIO通过回调函数为用户隐藏了底层实现细节,所有类型的bio的调用大体上是类似的。Bio中的数据能从一个B

liujiayu2的专栏 5344

openssl之BIO系列之11---文件(file)类型BIO

前面我们已经介绍了很多BIO的基本构造和操作,现在,我们开始针对每一个类型BIO进行进一步的介绍,这些介绍都是基本基于openssl的帮助文档的,我尽可能加入自己的一些理解,理清思路。在开始这部分之前,我一直在想该从哪一种类型的BIO开始比较合适,因为这些BIO类型之间有些还是有相互联系的,比如BIO_s_bio型就和BIO_f_ssl有关系,最后,考虑到大家对文件操作都比较熟悉,而且该类型BIO

fryingpan的专栏 3345

IO的类型(BIO、NIO、AIO)

首先,我们需要明白什么是IO?IO从字面意思可以理解为输入输出,对于Java进程来讲,输入就是将数据输入到Java内存的缓存区,供Java读取使用,输出就是Java进程将数据写入到缓存区,进而输出到文件或网络数据流。IO有两种:File IO和Stream IO,其中File IO缓存区图如下: I/O就是对缓存区的读写,可以看出InputStream.read()实际就是调用底层的“read()",将内核缓冲区的数据写入到Java进程的缓冲区,而OutputStream.write()就是

积水成多,水到渠成 2166

OpenSSL BIO

BIO 本质是一个多态的 I/O 抽象层。通过BIO_METHOD来封装各种数据源,BIO 结构体维护状态和数据链表。BUF_MEM。

loca1h0st 1434
上一篇: openssl之BIO系列之17---连接(connect)类型BIO
下一篇: L4操作系统(L4/Fiasco)
coo1fish
博客等级 码龄14年 22粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值