openssl代码学习记录-SSL

通过Source Insight查看openssl的源代码,可发现SSL建立的来龙去脉。

1.    先看SSL_NEW.

static int ssl_new(BIO *bi)

{

BIO_SSL *bs;

bs = (BIO_SSL *)OPENSSL_malloc(sizeof(BIO_SSL));

if (bs == NULL) {

BIOerr(BIO_F_SSL_NEW, ERR_R_MALLOC_FAILURE);

return (0);

}

memset(bs, 0, sizeof(BIO_SSL));

bi->init = 0;

bi->ptr = (char *)bs;

bi->flags = 0;

return (1);

}

bs为BIO_SSL指针,指向OPENSSL_malloc的返回值,即地址,OPENSSL_malloc的作用是什么?再追踪:

# define OPENSSL_malloc(num)     CRYPTO_malloc((int)num,__FILE__,__LINE__),原来是CRYPTO_malloc,再追踪:

void *CRYPTO_malloc(int num, const char *file, int line)

{

void *ret = NULL;

if (num <= 0)

return NULL;

if (allow_customize)

allow_customize = 0;

if (malloc_debug_func != NULL) {

if (allow_customize_debug)

allow_customize_debug = 0;

malloc_debug_func(NULL, num, file, line, 0);

}

ret = malloc_ex_func(num, file, line);

#ifdef LEVITTE_DEBUG_MEM

fprintf(stderr, "LEVITTE_DEBUG_MEM:         > 0x%p (%d)\n", ret, num);

#endif

if (malloc_debug_func != NULL)

malloc_debug_func(ret, num, file, line, 1);

#ifndef OPENSSL_CPUID_OBJ

/*

* Create a dependency on the value of ‘cleanse_ctr‘ so our memory

* sanitisation function can‘t be optimised out. NB: We only do this for

* >2Kb so the overhead doesn‘t bother us.

*/

if (ret && (num > 2048)) {

extern unsigned char cleanse_ctr;

((unsigned char *)ret)[0] = cleanse_ctr;

}

#endif

return ret;

}

实体函数出现了。关键代码就一句: ret = malloc_ex_func(num, file, line);

malloc_ex_func最终引向常用的malloc函数,但是openssl对内存管理提供了很方便的查询/管理接口,后话。

SSL-NEW的作用就是申请了一块存放  BIO_SSL的空间,并初始化bi;

2.  再看ssl_free。

static int ssl_free(BIO *a)

{

BIO_SSL *bs;

if (a == NULL)

return (0);

bs = (BIO_SSL *)a->ptr;

if (bs->ssl != NULL)

SSL_shutdown(bs->ssl);

if (a->shutdown) {

if (a->init && (bs->ssl != NULL))

SSL_free(bs->ssl);

a->init = 0;

a->flags = 0;

}

if (a->ptr != NULL)

OPENSSL_free(a->ptr);

return (1);

}

这个函数应该是释放内存空间的,追踪验证一下。

int SSL_shutdown(SSL *s)

{

/*

* Note that this function behaves differently from what one might

* expect.  Return values are 0 for no success (yet), 1 for success; but

* calling it once is usually not enough, even if blocking I/O is used

* (see ssl3_shutdown).

*/

if (s->handshake_func == 0) {

SSLerr(SSL_F_SSL_SHUTDOWN, SSL_R_UNINITIALIZED);

return -1;

}

if ((s != NULL) && !SSL_in_init(s))

return (s->method->ssl_shutdown(s));

else

return (1);

}

看代码,发现函数的目的与预想的很不同;有趣的是,这个函数需多个调用才能完成ssl链接的关闭。why? 再追踪,

到了int ssl3_shutdown(SSL *s)这里;目的是确保SSL链接确实结束。这个函数似乎没有回收内存的代码,只是关闭SSL链接。

时间: 2024-10-13 16:14:38

openssl代码学习记录-SSL的相关文章

如鹏网HTML代码学习记录

HTML常用标签--字体 字体标签 <font> 例:<font color="red">HTML字体标签</font>,常见属性size color,还有其它属性,比如:face 标题标签 <H1></H1>...<H6></H6> 特殊字符 如果要在网页上显示一些特殊符号,比如< > & 等.因为这些符号在代码中会被浏览器识别并解释,所以用一些特殊的方式来表示. < <

Array方面Js底层代码学习记录

一..clear() →Array function clear() { this.length = 0; return this; } 返回清除item的空数组. 例子: var fruits = ['Apple', 'Orange', 'Bananas', 'peach']; fruits.clear(); // -> [] fruits // -> [] 二..clone() →Array function clone() { return slice.call(this, 0); }

TP框架代码学习 学习记录 3.2.3

文件:think.class.php PHP提供register_shutdown_function()这个函数,能够在脚本终止前回调注册的函数,也就是当 PHP 程序执行完成后执行的函数.register_shutdown_function 执行机制是:PHP把要调用的函数调入内存.当页面所有PHP语句都执行完成时,再调用此 函数.注意,在这个时候从内存中调用,不是从PHP页面中调用,所以上面的例子不能使用相对路径,因为PHP已经当原来的页面不存在了.就没有什么相对路 径可言.注意:regis

Windows API 编程学习记录&lt;二&gt;

恩,开始写Windows API编程第二节吧. 上次介绍了几个关于Windows API编程最基本的概念,但是如果只是看这些概念,估计还是对Windows API不是很了解.这节我们就使用Windows API 让大家来了解下Windows API的用法. 第一个介绍的Windows API 当然是最经典的MessageBox,这个API 的作用就是在电脑上显示一个对话框,我们先来看看这个API的定义吧: int WINAPI MessageBox(HWND hWnd, LPCTSTR lpTe

Windows API 编程学习记录&lt;三&gt;

恩,开始写API编程的第三节,其实马上要考试了,但是不把这节写完,心里总感觉不舒服啊.写完赶紧去复习啊       在前两节中,我们介绍了Windows API 编程的一些基本概念和一个最基本API函数 MessageBox的使用,在这节中,我们就来正式编写一个Windows的窗口程序. 在具体编写代码之前,我们必须先要了解一下API 编写窗口程序具体的三个基本步骤:             1. 注册窗口类:             2.创建窗口:             3.显示窗口: 恩,

程序的机械级表示学习记录

程序的机械级表示学习记录 X86的三代寻址方式 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全. 8086的分段模式. IA32的带保护模式的平坦模式. 对于机械级编程的两种重要抽象 ISA:机械级程序的格式和行为,定义为指令集体系结构,它定义了处理器状态.指令的格式,以及每条指令对状态的影响. 虚拟地址:机器级程序使用的存储器地址,提供的存储器模型看上去是一个非常大的数组.存储器系统的实际实现是将多个硬件存储器和操作系统软件组合起来的. 在GCC中获得汇编代码与反汇编 获得汇编代码:

Java 静态内部类与非静态内部类 学习记录.

目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合,我并不是很清楚,留下一些值得思考的问题作为记录,说不定以后能自己来填.于是就会有这篇文章啦. 常规使用方法我也不想介绍,网上一大把,我就说说比较容易错的,值得注意的地方. 注意 这篇文章只是分享一下我对内部类的一些研究与困惑吧,说不定对大家有帮助,说不定能引导大家一起思考学习.Java语法知识其实

struts2 学习记录 过滤器 国际化

struts2接触不是一天两天了,但是一直没有用它做什么项目,但老师确一直说它有很大的学习价值,所以还是把我学习到的东西给记录一下,记录的东西没有规律,只是给自己留个备份, struts2中最关键的是action,action可以用来传值,用起来很方便,它可以用el表达式在jsp页面上展示出来,也可以用ognl,el只能表达作用域里面的值,而struts2里面还有个放数据的地方叫做ActionContext,这个类里面可以放不在作用域里的键值对,但是el表达式还是可以获取到,但是效率很低,所以尽

saltstack学习记录

安装 pip 安装 注意  依赖到zeromq3 minion过一段时间去请求master salt-api  可以访问salt去远程执行 ruby puppet   DSL配置   erb文件  模块  加载  模板支持最差 chef     定义直接是ruby代码   erb模板系统   原生支持 python saltstack   yaml配置文件    python程序模板   模板支持很好 python写模块 ipc 进程间通信 都使用key认证    安全 salt-key  -L