天天看點

openssl架構閑談--BIO接口

在 OpenSSL中一共有兩種類型的BIO,一種是源/目的類型的,另一種是過濾類型的,其實可以統一到一種類型,那就是統一都是過濾類型,這種說法的前提 是一個古老的概念,早在unix時代,人們通常将程式看做一個過濾器,簡單的給它一個輸入就會得到一個輸出,具體會得到什麼輸出就看程式員的意圖了,那個 時候,程式沒有現在如此龐大,也沒有如此之多的智能和行為邏輯,就是簡單的過濾功能,unix提出的一切皆檔案的偉大思想就是在這個古老而又淳樸的概念之 上提出來的,unix将裝置抽象成檔案,将顯示器和鍵盤抽象成檔案,按照程式即過濾器的思想是十分合理的,程式的輸入和輸出兩端都連接配接一個檔案,資料從文 件中來經過過濾器到檔案中去,顯示器是檔案,磁盤是檔案,鍵盤也是檔案,甚至記憶體也是檔案,想想标準輸入和标準輸出的概念就會很容易了解了,程式是過濾 器,被過濾的東西的載體就是檔案,unix靠這個思想而穩定地運作到了今天。如此一來,考慮源/目的類型的BIO,其實也是一種過濾類型的BIO,所謂過 濾器就是一個輸入加上過濾邏輯得到一個輸出,源/目的類型的BIO的輸入就是源端,過濾邏輯就是直通,而輸出就是目的端,過濾邏輯不在乎輸出結構有沒有使 用者以及使用者是誰,它隻要将輸出放到一個地方就可以。了解是可以按照統一的方式去了解,但是事實上openssl還是區分了兩種類型的BIO,在過濾類 型的BIO資料結構中,一般都提供了一個緩沖區,比如加密/解密BIO,對于write,就是加密資料,然後放到緩沖區中,就到此為止了嗎?不,因為過濾 資料隻不過是IO的一個階段而已,openssl的BIO接口提供了BIO鍊機制,并且規定一個過濾類型的BIO必須是BIO鍊的一個中間環節,這就是 說,最終必須将這些資料寫入一個源/目的的BIO,因為在openssl中的BIO機制中,隻有源/目的類型的BIO才是真正的資料載體,而過濾類型的 BIO僅僅提供資料緩沖區作為中間資料載體,這在下面的代碼展現明顯: 

static int buffer_write(BIO *b, const char *in, int inl) 

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1273629

繼續閱讀