欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

openssl 1.0.2版本 协议处理初始化接口

程序员文章站 2022-03-05 12:13:35
...

1.0.2版本的openssl接口很多都是通过回调函数处理,例如 SSL_read 内部 s->method->ssl_read,其ssl_read回调定义在哪里?

比如客户端程序中通过调用 meth = SSLv23_client_method( ); 进行关联

其在ssl/s23_clnt.c中定义

IMPLEMENT_ssl23_meth_func(SSLv23_client_method,                  
                          ssl_undefined_function,                
                          ssl23_connect, ssl23_get_client_method)

IMPLEMENT_ssl23_meth_func 为宏,在ssl_locl.h中有展开

#define IMPLEMENT_ssl23_meth_func(func_name, s_accept, s_connect, s_get_meth) \
const SSL_METHOD *func_name(void)  \                                             
         { \                                                                      
         static const SSL_METHOD func_name##_data= { \                            
         TLS1_2_VERSION, \                                                        
         tls1_new, \                                                              
         tls1_clear, \                                                            
         tls1_free, \                                                             
         s_accept, \                                                              
         s_connect, \                                                             
         ssl23_read, \                                                            
         ssl23_peek, \                                                            
       	 ...
       	 ...
         ssl23_default_timeout, \                                                 
         &TLSv1_2_enc_data, \                                                     
         ssl_undefined_void_function, \                                           
         ssl3_callback_ctrl, \                                                    
         ssl3_ctx_callback_ctrl, \                                                
         }; \                                                                     
         return &func_name##_data; \                                              
         }                                                                        

这里有个##的特殊用法,连接符,在预编译的时候进行。

简化该宏的实现

const SSL_METHOD *SSLv23_client_method(void) 
{
    static const SSL_METHOD SSLv23_client_method_data = {
        ...
    };
    return &SSLv23_client_method_data;
}

ssl_read的就是调用的ssl23_read

实际上用宏生成一个函数,在函数内部用static初始化一个结构,返回这个结构。
宏的参数是结构中特有的一些回调处理。

相关标签: openssl