OpenSSL中那些方法之ssl_method_st

       在ssl_locl.h中定义了整个协议栈结构的三个非常重要的结构体ssl_ctx_st,ssl_st以及ssl_method_st。本次主要分析结构体变量ssl_method_st,因此其他的结构暂且不表。

       在结构体ssl_ctx_st,ssl_st中均定义了const SSL_METHOD *method,即ssl_method_st类型变量,这个变量在协议栈的主流程中频繁的出现,主要是定义了整个流程过程中遇到的一些函数,例如报文数据读写函数等。由于ssl_method_st结构体中的变量均是函数指针,因此需要搞清楚这些函数指针在什么地方赋值。

       通常使用openssl接口都会先调用SSL_CTX_new以及SSL_new来生成ssl_ctx_st,ssl_st着两种类型的变量,其中在SSL_CTX_new,发现SSL_CTX_new的入参是一个ssl_method_st结构类型变量,该入参会被赋值给ssl_ctx中相应的变量const SSL_METHOD *method,SSL_new的入参为ssl_ctx_st类型变量,因此ssl_st中相应的变量const SSL_METHOD *method也会被赋值。通常SSL_CTX_new的调用如下SSL_CTX_new(TLS_server_method())或者SSL_CTX_new(TLS_client_method()),但是 TLS_server_method或者 TLS_client_method函数只能够找到其声明,找不到其定义。

        前面在分析sk以及lhash这两中基本数据结构的时候,也是找不到sk_以及lhash_开头的函数定义,当时是为了实现相当于面向对象结构中的继承效果,采用了宏定义的方式。 这次同样采用了宏定义的方式。因为ssl_method_st结构体中的函数用于处理ssl数据交互,但是由于ssl版本的不同,因此方法便存在着差异。因此除了在include/openssl/ssl.h中声明的函数外,

 __owur const SSL_METHOD *TLS_method(void); 
__owur const SSL_METHOD *TLS_client_method(void); 

       include中的文件主要用于对外提供接口使用 在ssl/ssl_locl.h中也存在着如下声明 :

__owur const SSL_METHOD *sslv3_method(void); 
__owur const SSL_METHOD *sslv3_server_method(void); 
__owur const SSL_METHOD *sslv3_client_method(void); 
__owur const SSL_METHOD *tlsv1_method(void); 
__owur const SSL_METHOD *tlsv1_server_method(void); 
__owur const SSL_METHOD *tlsv1_client_method(void);
 __owur const SSL_METHOD *tlsv1_1_method(void); 
 __owur const SSL_METHOD *tlsv1_2_method(void); 
__owur const SSL_METHOD *tlsv1_3_method(void); 
__owur const SSL_METHOD *tlsv1_3_server_method(void); 
__owur const SSL_METHOD *tlsv1_3_client_method(void); 

       表示各种版本的函数声明。 前面已经提到,对于这种类似与继承用法函数定义,一般是应用了宏定义。 在ssl/methods.h中出现了IMPLEMENT_tls_meth_func宏,例如: MPLEMENT_tls_meth_func(TLS_ANY_VERSION, 0, 0, TLS_server_method, ossl_statem_accept, ssl_undefined_function, TLSv1_2_enc_data) 而该宏的第四个参数对应的则是前面所提到的函数声明TLS_server_method等, 而该宏则定义在ssl/ssl_locl.h,如下:

define IMPLEMENT_tls_meth_func(version, flags, mask, func_name, s_accept, \

s_connect, enc_data) \
const SSL_METHOD *func_name(void) 
{ 
static const SSL_METHOD func_name##_data= { 
    version, 
    flags, 
    mask, 
    tls1_new, 
    tls1_clear, 
    tls1_free, 
    s_accept, 
    s_connect, 
    ssl3_read, 
    ssl3_peek, 
    ssl3_write, 
    ssl3_shutdown, 
    ssl3_renegotiate, 
    ssl3_renegotiate_check, 
    ssl3_read_bytes, 
    ssl3_write_bytes, 
    ssl3_dispatch_alert, 
    ssl3_ctrl, 
    ssl3_ctx_ctrl, 
    ssl3_get_cipher_by_char, 
    ssl3_put_cipher_by_char, 
    ssl3_pending, 
    ssl3_num_ciphers, 
    ssl3_get_cipher, 
    tls1_default_timeout, 
    &enc_data, 
    ssl_undefined_void_function, 
    ssl3_callback_ctrl, 
    ssl3_ctx_callback_ctrl, 
    }; 
return &func_name##_data; 
} 

       可以看到当入参为TLS_server_method,则实现了对于SSL_METHOD *TLS_server_method(void);的定义,前面所述的其余函数则同理会有相应的定义。

       而在SSL_METHOD *TLS_server_method(void)函数中,可以看到返回了一个静态常量 static const SSL_METHOD TLS_server_method_data,而该常量则会在SSL_CTX_new(TLS_server_method())中,初始化ssl_ctx_st结构体类型中的const SSL_METHOD *method变量。至此,可以看到整个ssl握手过程中所使用到的一些函数均存在于 static const SSL_METHOD TLS_server_method_data中,这些函数包括tls1_new, tls1_clear, tls1_free, 初始化以及清理函数,主要针对SSL3_STATE类型变量;s_accept, s_connect, 服务器和客户端连接的状态机函数。ssl3_read, ssl3_peek, ssl3_write,ssl3_renegotiate, ssl3_renegotiate_check, ssl3_read_bytes, ssl3_write_bytes, 报文读写以及重协商相关函数;ssl3_ctrl, ssl3_ctx_ctrl, 一些控制函数;ssl3_callback_ctrl,ssl3_ctx_callback_ctrl, 用户可以设置的控制回调函数,enc_data变量主要是 IMPLEMENT_tls_meth_func(TLS_ANY_VERSION, 0, 0, TLS_server_method, ossl_statem_accept, ssl_undefined_function, TLSv1_2_enc_data) 这类宏传进的最后一个参数 TLSv1_2_enc_data来决定的,可以看到这是一个全局变量,定义在ssl/t1_lib.c中,该变量主要定义了ssl3_enc_method结构体中加解密和摘要等相关算法的封装。在涉及到加解密以及摘要相关部分,再详细说明。

       本文为CSDN村中少年原创文章,转载记得加上小尾巴偶,博主链接这里

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村中少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值