openssl之BIO系列之2---BIO結構和BIO相關文件介紹

BIO結構和BIO相關文件介紹
    
    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的幫助文檔,並結合源代碼做一些分析。


FW: http://blog.csdn.net/gdwzh/article/details/19195

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章