openssl之BIO系列之7---BIO鏈的操作

    我在介紹BIO結構的時候說過,BIO結構其實是一個鏈式結構,單個BIO是隻有一個環節的BIO鏈的特例,那麼我們怎麼構造或在一個BIO鏈中增加一個BIO,怎麼從一個BIO鏈中刪除一個BIO呢,那麼本節就是專門講述這個問題的。
    其實,在openssl中,針對BIO鏈的操作還是很簡單的,僅僅包括兩個函數(openssl/bio.h):
     BIO * BIO_push(BIO *b,BIO *append);
     BIO * BIO_pop(BIO *b);
    
    【BIO_push】
    該函數把參數中名爲append的BIO附加到名爲b的BIO上,並返回b。其實,openssl作者本身也認識到,BIO_push的函數名字可能會導致誤會,因爲BIO_push函數其實只是將兩個BIO連接起來,而不是Push的功能,應該是join纔對。
    我們舉幾個簡單的例子說明BIO_push的作用,假設md1、md2是digest類型的BIO,b64是Base64類型的BIO,而f是file類型的BIO,那麼如果執行操作
     BIO_push(b64, f);
    那麼就會形成一個b64-f的鏈。然後再執行下面的操作:
     BIO_push(md2, b64);
     BIO_push(md1, md2);
    那麼就會形成md1-md2-b64-f的BIO鏈,大家可以看到,在構造完一個BIO後,頭一個BIO就代表了整個BIO鏈,這根鏈表的概念幾乎是一樣的。
    這時候,任何寫往md1的數據都會經過md1,md2的摘要(或說hush運算),然後經過base64編碼,最後寫入文件f。可以看到,構造一條好的BIO鏈後,操作是非常方便的,你不用再關心具體的事情了,整個BIO鏈會自動將數據進行指定操作的系列處理。
    需要注意的是,如果是讀操作,那麼數據會從相反的方向傳遞和處理,對於上面的BIO鏈,數據會從f文件讀出,然後經過base64解碼,然後經過md1,md2編碼,最後讀出。
    【BIO_pop】
    該函數把名爲b的BIO從一個BIO鏈中移除並返回下一個BIO,如果沒有下一個BIO,那麼就返回NULL。被移除的BIO就成爲一個單個的BIO,跟原來的BIO鏈就沒有關係了,這樣你可以把它釋放或連接到另一個BIO上去。可以看到,如果是單個BIO的時候,該操作是沒有任何意義的。
    如果你執行操作:
     BIO_pop(md2);
    那麼返回值將爲b64,而md2從上述的鏈中移除,形成一個新的md1-b64-f的BIO鏈,對於數據操作來說,還是往md1讀寫,沒有什麼變化,但是底層處理過程已經發生變化了,這就是封裝與透明的概念。可以看到,雖然BIO_pop參數只是一個BIO,但該操作直接的後果會對該BIO所在的鏈產生影響,所以,當BIO所在的鏈不一樣的時候,其結果是不一樣的。
    

    此外:BIO_push和BIO_pop操作還可能導致其它一些附加的結果,一些相關的BIO可能會調用一些控制操作,這些具體的細節因爲各個類型的BIO不一樣,在他們各自的說明中會有說明。


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

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