BIO结构和BIO相关文件介绍

    (作者:DragonKing Mail:wzhah@263.net 公布于:http://gdwzh.126.com openssl专业论坛)

    

    BIO的结构定义和相关项解析例如以下:

    (包括在bio.h文件里。其主文件为bio_lib.c)

    typedef struct bio_st BIO;

    

    struct bio_st

     {

     BIO_METHOD *method;//BIO方法结构。是决定BIO类型和行为的重要參数,各种BIO的不同之处主要也正在于此项。

     /* bio, mode, argp, argi, argl, ret */

     long (*callback)(struct bio_st *,int,const char *,int, long,long);//BIO回调函数

     char *cb_arg; /* first argument for the callback *//回调函数的第一个參量

    

     int init;//初始化标志,初始化了为1。否则为0

     int shutdown;//BIO开关标志,假设为1,则处于关闭状态,假设为0,则处于打开的状态。

int flags; /* extra storage */

     int retry_reason;

     int num;

     void *ptr;

     struct bio_st *next_bio; /* used by filter BIOs */BIO下联

     struct bio_st *prev_bio; /* used by filter BIOs */BIO上联

     int references;

     unsigned long num_read;//读出的数据长度

     unsigned long num_write;//写入的数据长度

    

     CRYPTO_EX_DATA ex_data;

     };

    在BIO的所用成员中。method能够说是最关键的一个成员,它决定了BIO的类型,能够看到。在声明一个新的BIO结构时。总是使用以下的声明:

    BIO* BIO_new(BIO_METHOD *type);

    在源码能够看出,BIO_new函数除了给一些初始变量赋值外,主要就是把type中的各个变量赋值给BIO结构中的method成员。

    一般来说,上述type參数是以一个类型生成函数的形式提供的。如生成一个mem型的BIO结构,就使用以下的语句:

    BIO *mem = BIO_new(BIO_s_mem());

    这种函数有下面一些:

    【source/sink型】

    BIO_s_accept():是一个封装了类似TCP/IP socket Accept规则的接口,而且使TCP/IP操作对于BIO接口是透明的。

BIO_s_bio():封装了一个BIO对,数据从当中一个BIO写入。从另外一个BIO读出

    BIO_s_connect():是一个封装了类似TCP/IP socket Connect规则的接口,而且使TCP/IP操作对于BIO接口是透明的

    BIO_s_fd():是一个封装了文件描写叙述符的BIO接口,提供类似文件读写操作的功能

    BIO_s_file():封装了标准的文件接口的BIO,包含标志的输入输出设备如stdin等

    BIO_s_mem():封装了内存操作的BIO接口,包含了对内存的读写操作

    BIO_s_null():返回空的sink型BIO接口,写入这样的接口的全部数据读被丢弃,读的时候总是返回EOF

    BIO_s_socket():封装了socket接口的BIO类型

    【filter型】

    BIO_f_base64():封装了base64编码方法的BIO,写的时候进行编码。读的时候解码

    BIO_f_buffer():封装了缓冲区操作的BIO,写入该接口的数据通常是准备传入下一个BIO接口的,从该接口读出的数据一般也是从还有一个BIO传过来的。

BIO_f_cipher():封装了加解密方法的BIO。写的时候加密,读的时候解密

    BIO_f_md():封装了信息摘要方法的BIO。通过该接口读写的数据都是已经经过摘要的。

    BIO_f_null():一个不作不论什么事情的BIO,对它的操作都简单传到下一个BIO去了,相当于不存在。

BIO_f_ssl():封装了openssl 的SSL协议的BIO类型,也就是为SSL协议添加了一些BIO操作方法。

    上述各种类型的函数正是构成BIO强大功能的基本单元。所以,要了解BIO的各种结构和功能。也就应该了解这些函数类型相关的操作函数。

全部这些源文件。都基本上包括于/crypto/bio/文件夹下的同名.c文件(大部分是同名的)中。

    在BIO_METHOD里面,定义了一组行为函数,上述不通类型的BIO_METHOD行为函数的定义是不同的。其结构例如以下(以非16位系统为例):

    typedef struct bio_method_st

     {

     int type;

     const char *name;

     int (*bwrite)(BIO *, const char *, int);

     int (*bread)(BIO *, char *, int);

     int (*bputs)(BIO *, const char *);

     int (*bgets)(BIO *, char *, int);

     long (*ctrl)(BIO *, int, long, void *);

     int (*create)(BIO *);

     int (*destroy)(BIO *);

     long (*callback_ctrl)(BIO *, int, bio_info_cb *);

     } BIO_METHOD;

    

    在BIO的成员中。callback也是比較重要的,它可以用于程序调试用或者自己定义改变BIO的行为。具体会在以后相关的部分介绍。

    BIO的非常多操作,都是BIO_ctrl系列函数依据不通參数组成的宏定义来完毕的。

所以要了解BIO的行为。了解BIO_ctrl系列函数以及其各个參数的意义也是非常重要的。

    

    【BIO文件夹文件的简要说明】

    bio.h:主定义的头文件。包含了非常多通用的宏的定义。

    bio_lib.c基本的BIO操作定义文件,是比較上层的函数了。

    bss_*系列:是soruce/sink型BIO详细的操作实现文件

    bf_*系列:是filter型BIO详细的操作实现文件

    bio_err.c:是错误信息处理文件

    bio_cb.c:是callback函数的相关文件

    b_print.c:是信息输出的处理函数文件

    b_socket.c:是Socket连接的一些相关信息处理文件

    b_dump.c:是对内存内容的存储操作处理

    

    因为时间和能力有限,这个概述就写到这儿了。以后的文章主要依据openssl的帮助文档。并结合源码做一些分析。

opensslBIO系列之2---BIO结构和BIO相关文件介绍的更多相关文章

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

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

  2. 【Xamarin开发 Android 系列 7】 Android 结构基础(下)

    原文:[Xamarin开发 Android 系列 7] Android 结构基础(下) *******前期我们不打算进行太深入的东西,省的吓跑刚进门的,感觉门槛高,so,我们一开始就是跑马灯一样,向前 ...

  3. 【Xamarin开发 Android 系列 6】 Android 结构基础(上)

    原文:[Xamarin开发 Android 系列 6] Android 结构基础(上) 前面大家已经熟悉了什么是Android,而且在 [Xamarin开发 Android 系列 4] Android ...

  4. Java BIO、NIO与AIO的介绍(学习过程)

    Java BIO.NIO与AIO的介绍 因为netty是一个NIO的框架,所以在学习netty的过程中,开始之前.针对于BIO,NIO,AIO进行一个完整的学习. 学习资源分享: Netty学习:ht ...

  5. 密码学系列之:Merkle–Damgård结构和长度延展攻击

    密码学系列之:Merkle–Damgård结构和长度延展攻击 简介 Merkle–Damgård结构简称为MD结构,主要用在hash算法中抵御碰撞攻击.这个结构是一些优秀的hash算法,比如MD5,S ...

  6. vue 快速入门 系列 —— Vue(自身) 项目结构

    其他章节请看: vue 快速入门 系列 Vue(自身) 项目结构 前面我们已经陆续研究了 vue 的核心原理:数据侦测.模板和虚拟 DOM,都是偏底层的.本篇将和大家一起来看一下 vue 自身这个项目 ...

  7. Numpy 系列(九)- 结构化数组

      简介 之前我们操作Numpy的数组时,都是通过索引来操作的.针对二维数组,使用索引可以完成对行.列的操作.但是这是非常不直观的.可以把二维数组想象成一个excel表格,如果表格没有列名,操作起来会 ...

  8. 【转】Android总结篇系列:Activity Intent Flags及Task相关属性

    [转]Android总结篇系列:Activity Intent Flags及Task相关属性 同上文一样,本文主要引用自网上现有博文,并加上一些自己的理解,在此感谢原作者. 原文地址: http:// ...

  9. .net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能

    原文:.net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能         接上篇,上篇已经学习了界面的各种功能以及各种配置,这篇准备学习下代码控制许可证. ...

随机推荐

  1. 阿里云ecs遭到频繁的ddos攻击始末

    苦逼熬夜近俩月的时间搞出来个小东东,还指望它能给自己捞点~  结果刚上线没多久就遭到竞争对手疯狂的ddos攻击. 可怜的阿里云默认只能抗住5G的攻击,超出的直接黑洞,也是很无奈,然而能免费抗5G这在国 ...

  2. localstorage本地定时缓存

    在做一个网站时,起初直接就是从服务器获取数据进行交互,没有用一些本地缓存做优化,项目做下来就特别卡,并且对服务器造成了很大的压力,经过请教,查询,找到这样一个定时缓存的例子.html5定时缓存,从数据 ...

  3. Breadth-first search 算法(Swift版)

    在讲解Breadth-first search 算法之前,我们先简单介绍两种数据类型Graph和Queue. Graph 这就是一个图,它由两部分组成: 节点, 使用圆圈表示的部分 边, 使用线表示的 ...

  4. 《天书夜读:从汇编语言到windows内核编程》十 线程与事件

    1)驱动中使用到的线程是系统线程,在system进程中.创建线程API函数:PsCreateSystemThread:结束线程(线程内自行调用)API函数:PsTerminateSystemThrea ...

  5. [转载] Redis系统性介绍

    转载自http://blog.nosqlfan.com/html/3139.html?ref=rediszt 虽然Redis已经很火了,相信还是有很多同学对Redis只是有所听闻或者了解并不全面,下面 ...

  6. Xshell 的安装教程

    Xshell就是一个远程控制RHEL的软件:其他的还有很多,用什么都无所谓(根据公司情况). 下面我们来安装下这个工具: 双击exe 点下一步: 选 免费的 然后下一步:(免费的功能足够用了) 点接受 ...

  7. 从编辑距离、BK树到文本纠错

    搜索引擎里有一个很重要的话题,就是文本纠错,主要有两种做法,一是从词典纠错,一是分析用户搜索日志,今天我们探讨使用基于词典的方式纠错,核心思想就是基于编辑距离,使用BK树.下面我们来逐一探讨: 编辑距 ...

  8. 手 Q 人脸识别动画实现详解

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 前言 开门见山,先来看下效果吧. 看到这么酷炫的效果图,不得不赞叹一下我们的设计师.然而,站在程序员的角度上看,除了酷炫之外更多的是复杂.但是 ...

  9. python坑之input获取字符串

    space = input("set user quotation:").strip() quotation = int(space* 1024 * 1024) print(quo ...

  10. 吞吐量(TPS)、QPS、并发数、响应时间(RT)概念

    开发的原因,需要对吞吐量(TPS).QPS.并发数.响应时间(RT)几个概念做下了解,查自百度百科,记录如下:1. 响应时间(RT)  响应时间是指系统对请求作出响应的时间.直观上看,这个指标与人对软 ...