openssl 代码分析(1)
原文:http://blog.csdn.net/hudaiqian/article/details/6211685
openssl支持的平臺(tái)非常多,至少我就在windows,linux,以及mips上編譯且運(yùn)行過(guò)。而且按照openssl的整個(gè)設(shè)計(jì),我想移植到任何平臺(tái)都是沒(méi)有多少障礙的,openssl已經(jīng)很好的將平臺(tái)依賴(lài)的部分獨(dú)立開(kāi)來(lái),通過(guò)callback的方式來(lái)實(shí)現(xiàn)。比如內(nèi)存分配函數(shù),malloc,free等,就可以通過(guò)CRYPTO_set_mem_functions函數(shù)將目標(biāo)平臺(tái)的內(nèi)存分配函數(shù)指針傳入,這樣openssl所有的內(nèi)存分配就會(huì)最終調(diào)入到用戶(hù)傳入的函數(shù)里面。其他類(lèi)似的callback機(jī)制還有很多,包括為了多任務(wù),多線程而提供的設(shè)置鎖的函數(shù)。
打開(kāi)openssl的代碼目錄,我想最主要的就是這樣幾個(gè)。ssl,crypto,以及apps,他們分別代表了ssl協(xié)議(sslv2,sslv3,tls1.0)的實(shí)現(xiàn),所有跟crypto功能(加解密,hash摘要算法等等)相關(guān)的實(shí)現(xiàn),以及很多常用的application的code。最后這個(gè)apps我覺(jué)得非常好,它既提供了所有openssl常用的功能,你可以調(diào)用s_client,s_server來(lái)做一個(gè)簡(jiǎn)單的ssl server和ssl client,也可以調(diào)用x509,pkcs7等函數(shù)來(lái)查看證書(shū),生成證書(shū)。此外,如果你只是想用到openssl的庫(kù)來(lái)寫(xiě)一些應(yīng)用,這個(gè)apps基本上你就是一個(gè)教材和sample code。你完全可以將其中的一些代碼段用到自己的應(yīng)用中。比如在openssl的根目錄下,你就可以通過(guò)“openssl x509 -in certs/ca-cert.pem -text”命令來(lái)dump一個(gè)x509的證書(shū)。在apps目錄下的所有.c文件就對(duì)應(yīng)了一個(gè)apps,你也可以通過(guò)在shell下運(yùn)行openssl來(lái)看到所有的apps。
因?yàn)閛penssl不像一個(gè)獨(dú)立的應(yīng)用程序,有一個(gè)統(tǒng)一的入口開(kāi)始,所以做代碼分析的話,似乎也比較麻煩,真的不知道從何處開(kāi)始,因?yàn)閛penssl似乎有很多著入點(diǎn),而且像ssl和crypto兩個(gè)庫(kù)看上去又是相對(duì)獨(dú)立,當(dāng)然ssl肯定是需要依賴(lài)于crypto的,因?yàn)閟sl的通信握手過(guò)程中需要用到諸如非對(duì)稱(chēng)加密,hash摘要算法等,都由crypto來(lái)提供。所以也許從crypto開(kāi)始并結(jié)合對(duì)應(yīng)的app是個(gè)不錯(cuò)的選擇。
最近被困在openssl多核上工作的問(wèn)題上,openssl似乎在多核上還是有點(diǎn)問(wèn)題的,在我們的多核平臺(tái)上很容易crash,尤其是數(shù)據(jù)流量比較大,運(yùn)行時(shí)間較長(zhǎng)的時(shí)候。我們已經(jīng)加了多核上的鎖來(lái)保護(hù)openssl的共享資源,上周又發(fā)現(xiàn)openssl內(nèi)部有一些static變量,在我們的平臺(tái)上,static變量不能在多個(gè)core之間share,所以我通過(guò)openssl提供的機(jī)制把這塊code在openssl之外實(shí)現(xiàn)了一遍,并將這幾個(gè)變量轉(zhuǎn)為全局變量,多個(gè)core share。情況好了很多,但是在跑了20個(gè)小時(shí)之后,仍然crash。真是郁悶之極,看來(lái)里面還有很多類(lèi)似的問(wèn)題需要解決。最近openssl的err.c文件都快被我翻爛了,但是仍然還沒(méi)有更大的收獲,下周需要繼續(xù)努力。
總結(jié)
以上是生活随笔為你收集整理的openssl 代码分析(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: libusb usb设备访问接口库
- 下一篇: 最优非对称加密填充(OAEP)