灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3650回复:0

[系统教程]Linux安全体系学习笔记之四:OpenSSL源代码分析(3)

楼主#
更多 发布于:2011-12-29 21:25
BIO是对IO操作的封装,OpenSSL的BIO抽象接口不仅可以对SSL连接的I/O使用,也可以对非加密的网络连接和文件的I/O使用。BIO的相关源代码在crypto/bio文件夹下。
 
 
 
BIO的相关数据结构列出如下。
 
 
 
BIO结构:
 
 
 
struct bio_st
 
    {
 
    BIO_METHOD *method;
 
    /* bio, mode, argp, argi, argl, ret */
 
    long (*callback)(struct bio_st *,int,const char *,int, long,long);
 
    char *cb_arg; /* first argument for the callback */
 
 
 
    int init;
 
    int shutdown;
 
    int flags;  /* extra storage */
 
    int retry_reason;
 
    int num;
 
    void *ptr;
 
    struct bio_st *next_bio;    /* used by filter Bios */
 
    struct bio_st *prev_bio;    /* used by filter BIOs */
 
    int references;
 
    unsigned long num_read;
 
    unsigned long num_write;
 
 
 
    CRYPTO_EX_DATA ex_data;
 
    };
 
 
 
BIO操作的结构:
 
 
 
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接口类型分为源/接收类型和过滤类型两种。
 
 
 
#define BIO_TYPE_DESCRIPTOR0x0100 /* socket, fd, connect or accept */
 
#define BIO_TYPE_FILTER 0x0200
 
#define BIO_TYPE_SOURCE_SINK 0x0400
 
1、源/接收类型
 
 
 
#define BIO_TYPE_MEM(1|0x0400)
 
#define BIO_TYPE_FILE (2|0x0400)
 
#define BIO_TYPE_FD (4|0x0400|0x0100)
 
#define BIO_TYPE_SOCKET (5|0x0400|0x0100)
 
#define BIO_TYPE_NULL (6|0x0400)
 
#define BIO_TYPE_CONNECT(12|0x0400|0x0100)/* socket - connect */
 
#define BIO_TYPE_ACCEPT(13|0x0400|0x0100)/* socket for accept */
 
#define BIO_TYPE_BIO(19|0x0400)/* (half a) BIO pair */
 
#define BIO_TYPE_DGRAM(21|0x0400|0x0100)
 
2、过滤类型
 
 
 
#define BIO_TYPE_SSL(7|0x0200)
 
#define BIO_TYPE_MD(8|0x0200) /* passive filter */
 
#define BIO_TYPE_BUFFER (9|0x0200)/* filter */
 
#define BIO_TYPE_CIPHER (10|0x0200)/* filter */
 
#define BIO_TYPE_BASE64 (11|0x0200)/* filter */
 
#define BIO_TYPE_PROXY_CLIENT (14|0x0200)/* client proxy BIO */
 
#define BIO_TYPE_PROXY_SERVER (15|0x0200)/* server proxy BIO */
 
#define BIO_TYPE_NBIO_TEST (16|0x0200)/* server proxy BIO */
 
#define BIO_TYPE_NULL_FILTER (17|0x0200)
 
#define BIO_TYPE_BER (18|0x0200)/* BER -> bin filter */
 
#define BIO_TYPE_LINEBUFFER (20|0x0200)/* filter */
 
#define BIO_TYPE_ASN1 (22|0x0200)/* filter */
 
#define BIO_TYPE_COMP (23|0x0200)/* filter */
 
BIO过滤缓冲结构:
 
 
 
typedef struct bio_f_buffer_ctx_struct
 
    {
 
    /* BIO *bio; */ /* this is now in the BIO struct */
 
    int ibuf_size;  /* how big is the input buffer */
 
    int obuf_size;  /* how big is the output buffer */
 
 
 
    char *ibuf;     /* the char array */
 
    int ibuf_len;       /* how many bytes are in it */
 
    int ibuf_off;       /* write/read offset */
 
 
 
    char *obuf;     /* the char array */
 
    int obuf_len;       /* how many bytes are in it */
 
    int obuf_off;       /* write/read offset */
 
    } BIO_F_BUFFER_CTX;
 
 


喜欢0 评分0
游客

返回顶部