openssl 代码分析(1)

来源:互联网 发布:php入门书籍 知乎 编辑:程序博客网 时间:2024/06/07 03:03

原文:http://blog.csdn.net/hudaiqian/article/details/6211685

openssl支持的平台非常多,至少我就在windows,linux,以及mips上编译且运行过。而且按照openssl的整个设计,我想移植到任何平台都是没有多少障碍的,openssl已经很好的将平台依赖的部分独立开来,通过callback的方式来实现。比如内存分配函数,malloc,free等,就可以通过CRYPTO_set_mem_functions函数将目标平台的内存分配函数指针传入,这样openssl所有的内存分配就会最终调入到用户传入的函数里面。其他类似的callback机制还有很多,包括为了多任务,多线程而提供的设置锁的函数。

打开openssl的代码目录,我想最主要的就是这样几个。ssl,crypto,以及apps,他们分别代表了ssl协议(sslv2,sslv3,tls1.0)的实现,所有跟crypto功能(加解密,hash摘要算法等等)相关的实现,以及很多常用的application的code。最后这个apps我觉得非常好,它既提供了所有openssl常用的功能,你可以调用s_client,s_server来做一个简单的ssl server和ssl client,也可以调用x509,pkcs7等函数来查看证书,生成证书。此外,如果你只是想用到openssl的库来写一些应用,这个apps基本上你就是一个教材和sample code。你完全可以将其中的一些代码段用到自己的应用中。比如在openssl的根目录下,你就可以通过“openssl x509 -in certs/ca-cert.pem -text”命令来dump一个x509的证书。在apps目录下的所有.c文件就对应了一个apps,你也可以通过在shell下运行openssl来看到所有的apps。

因为openssl不像一个独立的应用程序,有一个统一的入口开始,所以做代码分析的话,似乎也比较麻烦,真的不知道从何处开始,因为openssl似乎有很多着入点,而且像ssl和crypto两个库看上去又是相对独立,当然ssl肯定是需要依赖于crypto的,因为ssl的通信握手过程中需要用到诸如非对称加密,hash摘要算法等,都由crypto来提供。所以也许从crypto开始并结合对应的app是个不错的选择。

最近被困在openssl多核上工作的问题上,openssl似乎在多核上还是有点问题的,在我们的多核平台上很容易crash,尤其是数据流量比较大,运行时间较长的时候。我们已经加了多核上的锁来保护openssl的共享资源,上周又发现openssl内部有一些static变量,在我们的平台上,static变量不能在多个core之间share,所以我通过openssl提供的机制把这块code在openssl之外实现了一遍,并将这几个变量转为全局变量,多个core share。情况好了很多,但是在跑了20个小时之后,仍然crash。真是郁闷之极,看来里面还有很多类似的问题需要解决。最近openssl的err.c文件都快被我翻烂了,但是仍然还没有更大的收获,下周需要继续努力。

0 0