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

同步辐射材料科学应用指南:从XAFS原位实验到数据处理 材料结构分析是材料研究的核心环节,但传统实验室X射线受限于能量固定、亮度不足,往往难以回答原子局域配位、非晶结构及动态演变等关键问题。同步辐射光源以高通量、连续可调、偏振可控及脉冲时间结构等特性,将材料表征从静态观察推进到原位动态追踪层次。基于X射线吸收精细结构谱(XAFS)、原位实验、X射线衍射与散射、微区成像等技术,研究人员可实现元素选择性分析、近邻原子环境解析及真实工况下的结构演变监测。本文从技术原理出发,覆盖实验方案设计、样品制备、现场对光、数据处理与常见故障排查,并结合典型应用场景,为材料科学领域 阅读详情

相关推荐

Zemax中场曲与畸变图的深度解析与应用场景对比

本文深度解析了Zemax中场曲/畸变图与网格畸变图的核心原理、计算逻辑与适用场景。通过对比常规成像镜头、扫描镜头、鱼眼镜头及变形宽银幕镜头等实际案例,详细阐述了如何根据系统对称性、视场角及核心需求选择正确的分析工具与畸变评价标准,为光学设计中的畸变诊断与优化提供清晰指导。

sand8的博客 482

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

最新版IAR9.40和注册工具

IAR最新版的IDE在编译速度和代码提示等各个方面上都有很大提升,软件这个东西果然还是越新越好。之前的时候,IAR v9系列网上很多人都说能用,但是又没有把 IAR v9系列的注册方法写的很清楚,导致我一直都用注册老版本v8的方法去注册v9。结果注册后都会提示。

xue_nuo的博客 4万+

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万+

数字电路与逻辑设计——组合逻辑篇

在数字电路中,根据逻辑功能的不同而分为两大类,组合逻辑电路与时序逻辑电路。 1、何为组合逻辑电路 我们只需铭记一点就是,这种电路的输出Y只与当时的输入X有关,而与之前的输入X’无关。所以这是一个可以随输入X的变化而瞬变输出Y的电路,如果用我们的Verilog代码来表示,则可能会出现在如下语句中: ①针对wire型变量,assign Y = X1 && X2; ②针对reg型变量,alway

蓝湖江船客的博客 1万+

TC3XX - MCAL知识点(四十二):AURIX™ TC3xx实现多相电机需要多核配合使用的场景与实操分析

本文探讨了多相电机控制系统中的关键技术问题,重点分析了多核处理器在电机控制中的应用。针对十二相电机等复杂应用场景,提出了同步采样、多核协同等解决方案。文章详细阐述了相电流同步采样原理及EBTresos配置方法,分析了ADC硬件触发机制和多核配合策略。通过Core0和Core1的协同工作设计,解决了位置信息采集与FOC算法执行的时序问题,并提供了代码实现示例。实验验证了采用ATOM0_7同时触发两个核ADC中断的可行性,为多相电机控制系统的实现提供了技术参考。

梦想技术家 497

使用OpenSSL的内存BIO

BIO

幽雨雨幽 1363

python批量调用大模型API:多线程和异步协程

本文介绍了利用多线程技术批量调用大模型API的实现方法。核心是通过并发请求提高处理效率,主要采用线程池管理并发数量、结果聚合等技术。文章提供了一个完整的Python实现示例,包含APIBatchCaller类及其single_api_call和batch_call方法,详细解析了并发控制、错误处理等关键点,并给出了使用注意事项,包括并发数设置、重试策略和超时处理等。该方案特别适合IO密集型任务,能显著提升批量API调用的效率。

Cachel Wood的博客 759

Openssl之BIO系列

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

章志强的专栏 1万+

12、多端神经形态晶体管:原理、应用与算法探索

本文综述了多端神经形态晶体管的原理、应用与算法探索。从神经元MOS晶体管的发展到基于电解质栅极晶体管(EGT)的新型器件设计,系统阐述了其在低电压、多功能逻辑运算和突触行为模拟方面的优势。重点介绍了其在化学生物传感器(如多巴胺和pH检测)中的高灵敏度应用,以及在树突整合、时空总和、动态逻辑和神经元算术等树突算法中的实现。文章还总结了该类器件在神经形态计算、智能传感等领域的广阔前景,并分析了当前面临的材料工艺、理论建模与系统集成挑战,展望了未来发展方向。

delta的博客 143

RK平台以太网设置中添加代理设置

以太网中配置Configuration的时候可以IpConfiguration的初始化函数来设置代理类型和代理参数。通过添加一个KEY_ETH_PROXY的选项来设置代理的配置,然后再设置以太网静态或者动态的类型时候下发给系统进行设置。

Android系统开发笔记 656

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

论文阅读:ICLR 2023 FINE-TUNING ALIGNED LANGUAGE MODELS COMPROMISES SAFETY, EVEN WHEN USERS DO NOT INTEND

对大型语言模型(LLMs)进行微调以适应特定用例通常涉及对预训练的LLMs进行进一步的定制。Meta公开发布Llama模型和OpenAI的API允许在自定义数据集上微调GPT-3.5 Turbo,也鼓励这种做法。但是,这种自定义微调与安全成本有何关联?我们注意到,尽管现有的安全对齐基础设施可以在推理时限制LLMs的有害行为,但它们并未涵盖将微调权限扩展到最终用户时的安全风险。我们的红队研究发现,即使是只有几个设计有敌意的训练示例进行微调,也可以破坏LLMs的安全对齐。

CSPhD-winston的博客 811

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

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

baidu_31788709的博客 6万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

OpenSSL BIO源码简析

OpenSSL BIO源码简析

Starr 1858

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【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万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

《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、付费专栏及课程。

余额充值