使用OPENSSL内置的函数,我们可以实现许多功能,比如向OPENSSL的SSL结构中添加一个ECDH的临时公钥,或者一个处理临时公钥的ECDH回调函数。
OPENSSL提供了以下四个函数来实现这一点:
SSL_CTX_set_tmp_ecdh(ctx,ecdh);//向SSL上下文结构中添加ECDH临时公钥
SSL_set_tmp_ecdh(ssl,ecdh);//直接向SSL结构中添加ECDH临时公钥
那么,这个函数具体是如何工作的呢?在ssl.h头文件中,我们可以找到以下的定义:
......
#define SSL_CTRL_SET_TMP_RSA 2
#define SSL_CTRL_SET_TMP_DH 3
#define SSL_CTRL_SET_TMP_ECDH 4
......
#define SSL_CTX_set_tmp_ecdh(ctx,ecdh) \
SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_ECDH,0,(char *)ecdh
......
#define SSL_set_tmp_ecdh(ssl,ecdh) \
SSL_ctrl(ssl,SSL_CTRL_SET_TMP_ECDH,0,(char *)ecdh)
也就是说,对于不同密钥交换算法的公钥设置,都可以通过SSL_ctrl以及SSL_CTX_ctrl这两个参数来进行操作,SSL_ctrl系列函数提供了一个可以操作SSL数据结构中成员的接口,第一个参数是需要作用的SSL或者SSL_CTX数据结构,第二个参数是CTRL命令,用于告诉CTRL需要怎么做,但是只限于ssl.h中规定的内容,第三个参数在我们刚才的例子中暂时为0,第四个参数为传入CTRL的具体参数,例子中为要添加进SSL的临时公钥数据。
SSL_CTRL函数针对于以上宏的工作细节,我们可以在s3_lib.c文件中找到:
long ssl3_ctrl(SSL *s, int cmd, long larg, void *parg)
{
......
#ifndef OPENSSL_NO_ECDH
case SSL_CTRL_SET_TMP_ECDH:
//接下来为ECDH临时公钥设置的处理细节
这样,我们就可以自己向CTRL中添加命令,更进一步的操纵SSL及SSL_CTX数据结构中的具体内容了。