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对的创建和应用的更多相关文章

  1. openssl之BIO系列之18---接受(accept)类型BIO

    接受(accept)类型BIO ---依据openssl doc\crypto\bio_s_accept.pod翻译和自己的理解写成 (作者:DragonKing, Mail: wzhah@263.n ...

  2. openssl之BIO系列之22---Cipher类型的BIO

    Cipher类型BIO ---依据openssl doc\crypto\bio_f_cipher.pod翻译和自己的理解写成 (作者:DragonKing, Mail: wzhah@263.net , ...

  3. openssl之BIO系列之20---缓冲(buffer)类型BIO

    缓冲(buffer)类型BIO ---依据openssl doc\crypto\bio_f_buffer.pod翻译和自己的理解写成 (作者:DragonKing, Mail: wzhah@263.n ...

  4. openssl之BIO系列之24---SSL类型的BIO

    SSL类型的BIO ---依据openssl doc\crypto\bio_f_ssl.pod翻译和自己的理解写成 (作者:DragonKing, Mail: wzhah@263.net ,公布于:h ...

  5. OpenSSL之X509系列

    OpenSSL之X509系列之1---引言和X509概述 [引言]    X509是系列的函数在我们开发与PKI相关的应用的时候我们都会用到,但是OpenSSL中对X509的描述并不是很多,鉴于些,我 ...

  6. openssl之EVP系列之1---算法封装

    openssl之EVP系列之1---算法封装     ---依据openssl doc/crypto/EVP.pod翻译和自己的理解写成     (作者:DragonKing, Mail: wzhah ...

  7. openssl之EVP系列之13---EVP_Open系列函数介绍

    openssl之EVP系列之13---EVP_Open系列函数介绍     ---依据openssl doc/crypto/EVP_OpenInit.pod翻译和自己的理解写成     (作者:Dra ...

  8. openssl之EVP系列之9---EVP_Digest系列函数的一个样例

    openssl之EVP系列之9---EVP_Digest系列函数的一个样例     ---依据openssl doc/crypto/EVP_DigestInit.pod翻译     (作者:Drago ...

  9. openssl之EVP系列之8---EVP_Digest系列函数具体解释

    openssl之EVP系列之8---EVP_Digest系列函数具体解释     ---依据openssl doc/crypto/EVP_DigestInit.pod翻译和自己的理解写成     (作 ...

随机推荐

  1. 再次理解javascript的apply

    普通函数执行的时候,this指向函数执行的上下文  其实就是一个原型链的结构...    我一直没有搞懂原型链莫非它们像链条一样连在一起?    昂...   原型链可以理解成继承吗?   就像,ja ...

  2. 【bzoj2132】圈地计划 网络流最小割

    题目描述 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土地是一块矩形的区域,可以纵横划 ...

  3. Codeforces Round #323 (Div. 2) C 无敌gcd 数学/贪心

    C. GCD Table time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  4. 【一个比较bug free的二分写法】

    lower_bound: [l, r)区间内大于等于val的第一个位置 int lower_bound(int l, int r, int val){ while(l < r){ ); if(a ...

  5. mongodb学习(2)--- nodeJS与MongoDB的交互(使用mongodb/node-mongodb-native)

    转载:http://www.cnblogs.com/zhongweiv/p/node_mongodb.html 目录 简介 MongoDB安装(windows) MongoDB基本语法和操作入门(mo ...

  6. Mongodb学习(1)--- mongoose: Schema, Model, Entity

    Schema : 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力 Model : 由 Schema 发布生成的模型,具有抽象属性和行为的数据库操作 Entity : 由 Model 创建的 ...

  7. luogu 3407 散步

    题目链接 题意 按从左到右的顺序给出数轴上的一群人,有人向左走,有人向右走,一旦两人相遇就会停在当前位置,后来走到该位置的人也会停在该位置.问经过一段时间这些人分别在什么位置. 思路 可以将这些人分为 ...

  8. 写文章 TEE技术分析【转】

    转自:https://zhuanlan.zhihu.com/p/24222064 首先介绍一下TEE的主要关键技术: 1.安全启动(Secure Boot) 安全启动技术可以用于需要防止篡改系统镜像, ...

  9. hdu 5056(尺取法思路题)

    Boring count Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  10. hdu 3657 最小割的活用 / 奇偶方格取数类经典题 /最小割

    题意:方格取数,如果取了相邻的数,那么要付出一定代价.(代价为2*(X&Y))(开始用费用流,敲升级版3820,跪...) 建图:  对于相邻问题,经典方法:奇偶建立二分图.对于相邻两点连边2 ...