我正在尝试使用ANSI用OpenSSL构建一个密码套件。我需要做的似乎是创建一个新的SSL_METHOD结构,并用各种函数指针填充到它需要调用的方法。我已经找到了源代码中定义SSL_METHOD结构元素的部分,但我没有找到任何引用,确切地说,每一个元素都包含哪些内容以使其与OpenSSL的其他部分正确接口。OpenSSL的预定义函数似乎是自动构建和填充其中一个函数的,例如SSLv23_method,但我也找不到这些函数的源代码。
任何人都可以指出某种资源,它可以告诉我SSL_METHOD结构?中每个指针后面的是什么。
下面是一个SSL_METHOD结构的所有元素的完整列表,我想找到它的目的。
int version;
int (*ssl_new)(SSL *s);
void (*ssl_clear)(SSL *s);
void (*ssl_free)(SSL *s);
int (*ssl_accept)(SSL *s);
int (*ssl_connect)(SSL *s);
int (*ssl_read)(SSL *s,void *buf,int len);
int (*ssl_peek)(SSL *s,void *buf,int len);
int (*ssl_write)(SSL *s,const void *buf,int len);
int (*ssl_shutdown)(SSL *s);
int (*ssl_renegotiate)(SSL *s);
int (*ssl_renegotiate_check)(SSL *s);
long (*ssl_get_message)(SSL *s, int st1, int stn, int mt, long
max, int *ok);
int (*ssl_read_bytes)(SSL *s, int type, unsigned char *buf, int len,
int peek);
int (*ssl_write_bytes)(SSL *s, int type, const void *buf_, int len);
int (*ssl_dispatch_alert)(SSL *s);
long (*ssl_ctrl)(SSL *s,int cmd,long larg,void *parg);
long (*ssl_ctx_ctrl)(SSL_CTX *ctx,int cmd,long larg,void *parg);
const SSL_CIPHER *(*get_cipher_by_char)(const unsigned char *ptr);
int (*put_cipher_by_char)(const SSL_CIPHER *cipher,unsigned char *ptr);
int (*ssl_pending)(const SSL *s);
int (*num_ciphers)(void);
const SSL_CIPHER *(*get_cipher)(unsigned ncipher);
const struct ssl_method_st *(*get_ssl_method)(int version);
long (*get_timeout)(void);
struct ssl3_enc_method *ssl3_enc; /* Extra SSLv3/TLS stuff */
int (*ssl_version)(void);
long (*ssl_callback_ctrl)(SSL *s, int cb_id, void (*fp)(void));
long (*ssl_ctx_callback_ctrl)(SSL_CTX *s, int cb_id, void (*fp)(void));发布于 2013-11-11 06:17:34
我可以向您提供我在跟踪OpenSSL代码方面的经验,以及它们如何定义SSL_METHOD结构。
以SSLv23_method为例,这个方法在ssl.h中定义
const SSL_METHOD *SSLv23_method(void); /* SSLv3 but can rollback to v2 */并在s23_meth.c中声明
IMPLEMENT_ssl23_meth_func(SSLv23_method,
ssl23_accept,
ssl23_connect,
ssl23_get_method)然后按如下所示跟踪IMPLEMENT_ssl23_meth_func (以ssl_locl.h表示)。它是一个#define,它指定由SSL_METHOD: SSLv23_method中的函数指针指向的每个函数实现。例如,当这个SSL_METHOD的(*ssl_new)函数被调用时,它引用tls1_new,当(*ssl_connect)被调用时,它引用s_accept,这是第二个参数ssl23_accept函数。
#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_write, \
ssl_undefined_function, \
ssl_undefined_function, \
ssl_ok, \
ssl3_get_message, \
ssl3_read_bytes, \
ssl3_write_bytes, \
ssl3_dispatch_alert, \
ssl3_ctrl, \
ssl3_ctx_ctrl, \
ssl23_get_cipher_by_char, \
ssl23_put_cipher_by_char, \
ssl_undefined_const_function, \
ssl23_num_ciphers, \
ssl23_get_cipher, \
s_get_meth, \
ssl23_default_timeout, \
&ssl3_undef_enc_method, \
ssl_undefined_void_function, \
ssl3_callback_ctrl, \
ssl3_ctx_callback_ctrl, \
}; \
return &func_name##_data; \
}您可以跟踪每个函数以达到它们的目的。另外,还使用了一种方法来初始化ctx。你可能见过这个,
meth=SSLv23_method();几行之后,
c_ctx=SSL_CTX_new(meth);之后,c_ctx作为参数传递给一些函数,如SSL_CTX_set_cipher_list(c_ctx,cipher)或SSL_CTX_use_certificate_file(c_ctx,client_cert, SSL_FILETYPE_PEM)。您可能也想学习SSL_CTX的用法。
https://stackoverflow.com/questions/19862507
复制相似问题