OPENSSL(SSL_CTRL函数与临时公钥设置)

使用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_RSA2 #define SSL_CTRL_SET_TMP_DH3 #define SSL_CTRL_SET_TMP_ECDH4 ...... #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临时公钥设置的处理细节

【OPENSSL(SSL_CTRL函数与临时公钥设置)】这样,我们就可以自己向CTRL中添加命令,更进一步的操纵SSL及SSL_CTX数据结构中的具体内容了。

    推荐阅读