openssl之BIO系列之9---BIO对的创建和应用
BIO对的创建和应用
---依据openssl doc/crypto/bio/bio_new_bio_pair.pod翻译和自己的理解写成
(作者:DragonKing Mail:wzhah@263.net 公布于:http://gdwzh.126.com之open
ssl专业论坛)
BIO对是BIO中专门创建的一对缓存BIO。要创建BIO对。调用以下定义的函数(open
ssl\bio.h):
int BIO_new_bio_pair(BIO **bio1, size_t writebuf1, BIO **bio2, size_t wr
itebuf2);
这个函数调用成功后返回1,这时候bio1和bio2都是有效的了。否则就返回0。而bi
o1和bio2就会设为NULL,这是后能够检測出错堆栈以得到很多其它错误信息。
这个BIO对创建之后,它的两端都能作为数据缓冲的输入和输出。
典型的应用是它一
端和SSL的IO连接,而还有一端则被应用控制,这样,应用程序就不须要直接和网络连接打
交道了。
这两个BIO对的功能是全然对称的,它们的缓冲区的大小由參数writebuf1和writeb
uf2决定,假设给定的大小是0,那么该函数就会使用缺省的缓存大小。BIO_new_bio_pa
ir不会检查bio1和bio2是否真的指向其他BIO,bio1和bio2的值都被重写,可是在此之前
不会调用BIO_free()函数。所以。在使用bio1和bio2之前,必须自己保证这两个变量是
空的BIO,否则可能造成内存泄漏。
值得注意的是,尽管这两个BIO是一对的和一起创建的,可是却必须分别释放。之所
以这样做,是有其重要原因的,由于有些SSL函数,如SSL_set_bio或BIO_free会隐含调
用BIO_free函数,所以这时候还有一端的BIO就仅仅能单独释放了。
为了让大家对BIO对的应用模型有一个感性的认识,以下举一个简单的样例说明问题
。
BIO对能给提供应用程序中对网络处理的全然控制能力,程序能够对依据须要调用s
oket的select()函数,同一时候却能够避免直接处理SSL接口。以下是使用BIO_new_bio_pai
r的简单代码模型:
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操作了,否则就会造成死锁现象,由于还有一端可能
知道等到有数据了才会继续进行以下的操作。
openssl之BIO系列之9---BIO对的创建和应用的更多相关文章
- openssl之BIO系列之18---接受(accept)类型BIO
接受(accept)类型BIO ---依据openssl doc\crypto\bio_s_accept.pod翻译和自己的理解写成 (作者:DragonKing, Mail: wzhah@263.n ...
- openssl之BIO系列之22---Cipher类型的BIO
Cipher类型BIO ---依据openssl doc\crypto\bio_f_cipher.pod翻译和自己的理解写成 (作者:DragonKing, Mail: wzhah@263.net , ...
- openssl之BIO系列之20---缓冲(buffer)类型BIO
缓冲(buffer)类型BIO ---依据openssl doc\crypto\bio_f_buffer.pod翻译和自己的理解写成 (作者:DragonKing, Mail: wzhah@263.n ...
- openssl之BIO系列之24---SSL类型的BIO
SSL类型的BIO ---依据openssl doc\crypto\bio_f_ssl.pod翻译和自己的理解写成 (作者:DragonKing, Mail: wzhah@263.net ,公布于:h ...
- OpenSSL之X509系列
OpenSSL之X509系列之1---引言和X509概述 [引言] X509是系列的函数在我们开发与PKI相关的应用的时候我们都会用到,但是OpenSSL中对X509的描述并不是很多,鉴于些,我 ...
- openssl之EVP系列之1---算法封装
openssl之EVP系列之1---算法封装 ---依据openssl doc/crypto/EVP.pod翻译和自己的理解写成 (作者:DragonKing, Mail: wzhah ...
- openssl之EVP系列之13---EVP_Open系列函数介绍
openssl之EVP系列之13---EVP_Open系列函数介绍 ---依据openssl doc/crypto/EVP_OpenInit.pod翻译和自己的理解写成 (作者:Dra ...
- openssl之EVP系列之9---EVP_Digest系列函数的一个样例
openssl之EVP系列之9---EVP_Digest系列函数的一个样例 ---依据openssl doc/crypto/EVP_DigestInit.pod翻译 (作者:Drago ...
- openssl之EVP系列之8---EVP_Digest系列函数具体解释
openssl之EVP系列之8---EVP_Digest系列函数具体解释 ---依据openssl doc/crypto/EVP_DigestInit.pod翻译和自己的理解写成 (作 ...
随机推荐
- Python的生成器Generator小结
一. 生成器的介绍 在介绍生成器(Generator)之前,我们首先需要熟悉列表生成式,列表生成式是Python内置的简单又强大的用来创建列表的生成式. 举个例子, 如果我们想生成[1*1,2*2,3 ...
- cmake导出的visual studio工程带头文件
file(GLOB_RECURSE CURRENT_HEADERS *.h *.hpp) 分组显示 source_group("Include" FILES ${CURRENT_H ...
- BZOJ3999 [TJOI2015]旅游 【树剖 + 线段树】
题目 为了提高智商,ZJY准备去往一个新世界去旅游.这个世界的城市布局像一棵树.每两座城市之间只有一条路径可 以互达.每座城市都有一种宝石,有一定的价格.ZJY为了赚取最高利益,她会选择从A城市买入再 ...
- iframe+json
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.PropertyFilter; impor ...
- 字符串(bzoj 1856)
Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgw ...
- 【HDOJ5972】Regular Number(Bitset,ShiftAnd)
题意:给你N位数,接下来有N行,第i行先输入n,表示这个数的第i 位上可以在接下来的n个数中挑选,然后i 行再输n个数. 然后输入需要匹配的母串,让你输出母串中有多少个可行的N位子串. n<=1 ...
- Error-invalid project description(转)
导入android工程时有时会出现下面错误: 按照提示,说是当前的工作空间内已经有同名的工程了,但实际是没有的. 多次碰到这种问题后,无意间找到解决办法.导入工程时,不要选择Android,而是选择G ...
- mybatis 判断参数有没有传入
<!--审核展示列表--> <select id="auditResList" resultType="java.util.HashMap"& ...
- selenium入门教程c#
一. 简述 1. 介绍 Selenium是ThoughtWorks专门为Web应用程序编写的一个验收测试工具. Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE. ...
- 安装glibc错误链接导致系统崩溃,u盘启动紧急救援模式下修复系统。
Sln 命令 创建动态符号链接 用法 sln source dest 故障案例:一个误操作 导致了一个不小的故障,输入所有命令都无效,直接系统无法启动. 故障描述 sln /usr/lib64/l ...