三里屯摇滚 发表于 2011-12-28 10:18

Linux安全体系学习笔记之四:OpenSSL源代码分析(3) .

Linux安全体系学习笔记之四:OpenSSL源代码分析(3) .






BIO是对IO操作的封装,OpenSSL的BIO抽象接口不仅可以对SSL连接的I/O使用,也可以对非加密的网络连接和文件的I/O使用。BIO的相关源代码在crypto/bio文件夹下。

BIO的相关数据结构列出如下。

BIO结构:


view plaincopy to clipboardprint?01.struct bio_st
02.    {
03.    BIO_METHOD *method;
04.    /* bio, mode, argp, argi, argl, ret */
05.    long (*callback)(struct bio_st *,int,const char *,int, long,long);
06.    char *cb_arg; /* first argument for the callback */
07.
08.    int init;
09.    int shutdown;
10.    int flags;/* extra storage */
11.    int retry_reason;
12.    int num;
13.    void *ptr;
14.    struct bio_st *next_bio;    /* used by filter BIOs */
15.    struct bio_st *prev_bio;    /* used by filter BIOs */
16.    int references;
17.    unsigned long num_read;
18.    unsigned long num_write;
19.
20.    CRYPTO_EX_DATA ex_data;
21.    };
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操作的结构:


view plaincopy to clipboardprint?01.typedef struct bio_method_st
02.    {
03.    int type;
04.    const char *name;
05.    int (*bwrite)(BIO *, const char *, int);
06.    int (*bread)(BIO *, char *, int);
07.    int (*bputs)(BIO *, const char *);
08.    int (*bgets)(BIO *, char *, int);
09.    long (*ctrl)(BIO *, int, long, void *);
10.    int (*create)(BIO *);
11.    int (*destroy)(BIO *);
12.      long (*callback_ctrl)(BIO *, int, bio_info_cb *);
13.    } BIO_METHOD;
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接口类型分为源/接收类型和过滤类型两种。

view plaincopy to clipboardprint?01.#define BIO_TYPE_DESCRIPTOR0x0100 /* socket, fd, connect or accept */   
02.#define BIO_TYPE_FILTER 0x0200   
03.#define BIO_TYPE_SOURCE_SINK 0x0400
#define BIO_TYPE_DESCRIPTOR0x0100 /* socket, fd, connect or accept */
#define BIO_TYPE_FILTER 0x0200
#define BIO_TYPE_SOURCE_SINK 0x04001、源/接收类型

view plaincopy to clipboardprint?01.#define BIO_TYPE_MEM(1|0x0400)   
02.#define BIO_TYPE_FILE (2|0x0400)   
03.#define BIO_TYPE_FD (4|0x0400|0x0100)   
04.#define BIO_TYPE_SOCKET (5|0x0400|0x0100)   
05.#define BIO_TYPE_NULL (6|0x0400)   
06.#define BIO_TYPE_CONNECT(12|0x0400|0x0100)/* socket - connect */   
07.#define BIO_TYPE_ACCEPT(13|0x0400|0x0100)/* socket for accept */   
08.#define BIO_TYPE_BIO(19|0x0400)/* (half a) BIO pair */   
09.#define BIO_TYPE_DGRAM(21|0x0400|0x0100)
#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、过滤类型

view plaincopy to clipboardprint?01.#define BIO_TYPE_SSL(7|0x0200)   
02.#define BIO_TYPE_MD(8|0x0200) /* passive filter */   
03.#define BIO_TYPE_BUFFER (9|0x0200)/* filter */   
04.#define BIO_TYPE_CIPHER (10|0x0200)/* filter */   
05.#define BIO_TYPE_BASE64 (11|0x0200)/* filter */   
06.#define BIO_TYPE_PROXY_CLIENT (14|0x0200)/* client proxy BIO */   
07.#define BIO_TYPE_PROXY_SERVER (15|0x0200)/* server proxy BIO */   
08.#define BIO_TYPE_NBIO_TEST (16|0x0200)/* server proxy BIO */   
09.#define BIO_TYPE_NULL_FILTER (17|0x0200)   
10.#define BIO_TYPE_BER (18|0x0200)/* BER -> bin filter */   
11.#define BIO_TYPE_LINEBUFFER (20|0x0200)/* filter */   
12.#define BIO_TYPE_ASN1 (22|0x0200)/* filter */   
13.#define BIO_TYPE_COMP (23|0x0200)/* filter */
#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过滤缓冲结构:


view plaincopy to clipboardprint?01.typedef struct bio_f_buffer_ctx_struct
02.    {
03.    /* BIO *bio; */ /* this is now in the BIO struct */
04.    int ibuf_size;/* how big is the input buffer */
05.    int obuf_size;/* how big is the output buffer */
06.
07.    char *ibuf;   /* the char array */
08.    int ibuf_len;       /* how many bytes are in it */
09.    int ibuf_off;       /* write/read offset */
10.
11.    char *obuf;   /* the char array */
12.    int obuf_len;       /* how many bytes are in it */
13.    int obuf_off;       /* write/read offset */
14.    } BIO_F_BUFFER_CTX;

小忻黑夜 发表于 2011-12-28 10:18

谢谢分享
页: [1]
查看完整版本: Linux安全体系学习笔记之四:OpenSSL源代码分析(3) .