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初始化一个结构,返回这个结构。
宏的参数是结构中特有的一些回调处理。