2

我正在尝试使用 ANSI C API 使用 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));
4

1 回答 1

6

我可以为您提供我在跟踪 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_new)这个SSL_METHOD的函数在调用的时候是指的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)or SSL_CTX_use_certificate_file(c_ctx,client_cert, SSL_FILETYPE_PEM)。您可能还想研究SSL_CTX用法。

于 2013-11-11T06:17:34.293 回答