有人可以解释一下“ecdh_tmp_cb”回调的用法吗?

时间:2016-08-26 13:03:43

标签: ssl openssl cryptography tls1.2 elliptic-curve

我正在寻找有关“ecdh_tmp_cb”回调的使用及其使用方法的信息?我搜索得足够多但没有得到任何信息。

1 个答案:

答案 0 :(得分:1)

  

有人可以帮忙提供有关“ecdhe_tmp_cb”回调的使用及其使用方式的信息吗?

我相信有些功能是在1.0.2添加的,在1.1.0时删除了。它们在1.0.2处被添加为带状辅助,因为由于模数尺寸(IIRC)的预测,常规回调是不合适的。它们在1.1.0被移除,因为库的接口可能会发生变化,足以提供所需的内容。

我似乎记得这两个函数(来自ssl.h)会发送keylength的伪造值:

#ifndef OPENSSL_NO_ECDH
void SSL_CTX_set_tmp_ecdh_callback(SSL_CTX *ctx,
                         EC_KEY *(*ecdh)(SSL *ssl,int is_export,
                                 int keylength));
void SSL_set_tmp_ecdh_callback(SSL *ssl,
                         EC_KEY *(*ecdh)(SSL *ssl,int is_export,
                                 int keylength));
#endif

keylength是确定字段(种类)所需要的。但是,没有办法区分素数曲线或二元曲线。

回调中真正需要的是商定的曲线。或者您需要在服务器上选择曲线之前挂钩该过程,以便您可以影响选择。据我所知,该流程和信息从未可用。

人们过去常常在1.0.1中做的只是使用secp256r1,因为它几乎无处不在。更有安全意识的雄心勃勃的人会使用secp521r1secp384r1有点奇怪的曲线选择偶尔出现。另请参阅InfoSec.SE上的Which elliptic curve should I use?

选择曲线后,如secp256r1,您生成的临时值是该字段中的短暂密钥对。您可以在每个连接上生成新值;你可以每小时产生一次价值;你可以每天产生一次价值;如果你一直使用相同的值,它实际上是一个静态密钥。

第{53行}周围的Change Log状态类似。如果向上滚动,您会看到它适用于1.1.0及更高版本。 (声明“1.0.2h和1.1.0之间的变化”表示它适用于1.1.0,而不是1.0.2i及以上)。

  
      
  • SSL_ {CTX_} set_ecdh_auto()已被删除,ECDH支持是    现在总是启用。如果要禁用支持,则应该    使用支持的密码列表将其排除。这也意味着    “-no_ecdhe”选项已从s_server中删除    [Kurt Roeckx]

  •   
  • SSL_ {CTX} _set_tmp_ecdh(),可在内部设置1 EC曲线   调用
       SSL_ {CTX_} set1_curves()可以设置列表    [Kurt Roeckx]

  •   
  • 删除对SSL_ {CTX_} set_tmp_ecdh_callback()的支持。你应该   设置    您希望使用SSL_ {CTX_} set1_curves()支持的曲线   [Kurt Roeckx]

  •   

更改日志还声明1.1.0使用:

  
      
  • 按顺序将ECC默认曲线列表更改为:x25519,secp256r1,secp521r1,secp384r1。
       [Rich Salz]
  •   
  

我搜索得足够多但没有得到任何信息。

通常,当您发现未充分记录的内容时,您希望查看OpenSSL源代码。要查看的来源是s_clients_server。您可以在<openssl src>/apps/目录中找到它们。 [不出所料]源文件名为s_client.cs_server.c

从下面的搜索中,ssl/ssl_conf.c看起来也很有趣。下面的 *.pod 文件是手册页的来源。如果 *.pod 文件有点击,那么您知道可以输入man SSL_CTX_set_tmp_dh_callback并获取该功能的手册页。

$ grep -IR _set_tmp_ *
CHANGES:  *) SSL_{CTX}_set_tmp_ecdh() which can set 1 EC curve now internally calls
CHANGES:     'default key' from SSL_CTX_set_tmp_dh would always be lost, meaning
CHANGES:     are in detail: SSL_need_tmp_RSA, SSL_set_tmp_rsa, SSL_set_tmp_dh,
CHANGES:     SSL_set_tmp_rsa_callback and SSL_set_tmp_dh_callback.  Additionally a new
CHANGES:     SSL_CTX_set_tmp_{rsa,dh}_callback().
apps/s_server.c:        else if (!SSL_CTX_set_tmp_dh(ctx, dh)) {
apps/s_server.c:            else if (!SSL_CTX_set_tmp_dh(ctx2, dh)) {
doc/ssl/ssl.pod:=item long B<SSL_CTX_set_tmp_dh>(SSL_CTX* ctx, DH *dh);
doc/ssl/ssl.pod:=item long B<SSL_CTX_set_tmp_dh_callback>(SSL_CTX *ctx, DH *(*cb)(void));
doc/ssl/ssl.pod:L<SSL_CTX_set_tmp_dh_callback(3)>,
doc/ssl/SSL_CTX_set_cipher_list.pod:(see L<SSL_CTX_set_tmp_dh_callback(3)>).
doc/ssl/SSL_CTX_set_cipher_list.pod:(see L<SSL_CTX_set_tmp_dh_callback(3)>).
doc/ssl/SSL_CTX_set_cipher_list.pod:L<SSL_CTX_set_tmp_dh_callback(3)>,
doc/ssl/SSL_CTX_set_options.pod:(see L<SSL_CTX_set_tmp_dh_callback(3)>).
doc/ssl/SSL_CTX_set_options.pod:L<SSL_CTX_set_tmp_dh_callback(3)>,
doc/ssl/SSL_CTX_set_tmp_dh_callback.pod:SSL_CTX_set_tmp_dh_callback, SSL_CTX_set_tmp_dh, SSL_set_tmp_dh_callback, SSL_set_tmp_dh - handle DH keys for ephemeral key exchange
doc/ssl/SSL_CTX_set_tmp_dh_callback.pod: void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,
doc/ssl/SSL_CTX_set_tmp_dh_callback.pod: long SSL_CTX_set_tmp_dh(SSL_CTX *ctx, DH *dh);
doc/ssl/SSL_CTX_set_tmp_dh_callback.pod: void SSL_set_tmp_dh_callback(SSL *ctx,
doc/ssl/SSL_CTX_set_tmp_dh_callback.pod: long SSL_set_tmp_dh(SSL *ssl, DH *dh)
doc/ssl/SSL_CTX_set_tmp_dh_callback.pod:SSL_CTX_set_tmp_dh_callback() sets the callback function for B<ctx> to be
doc/ssl/SSL_CTX_set_tmp_dh_callback.pod:SSL_CTX_set_tmp_dh() sets DH parameters to be used to be B<dh>.
doc/ssl/SSL_CTX_set_tmp_dh_callback.pod:SSL_set_tmp_dh_callback() sets the callback only for B<ssl>.
doc/ssl/SSL_CTX_set_tmp_dh_callback.pod:SSL_set_tmp_dh() sets the parameters only for B<ssl>.
doc/ssl/SSL_CTX_set_tmp_dh_callback.pod:are advised to either use SSL_CTX_set_tmp_dh() or alternatively, use
doc/ssl/SSL_CTX_set_tmp_dh_callback.pod: if (SSL_CTX_set_tmp_dh(ctx, dh_2048) != 1) {
doc/ssl/SSL_CTX_set_tmp_dh_callback.pod:SSL_CTX_set_tmp_dh_callback() and SSL_set_tmp_dh_callback() do not return
doc/ssl/SSL_CTX_set_tmp_dh_callback.pod:SSL_CTX_set_tmp_dh() and SSL_set_tmp_dh() do return 1 on success and 0
include/openssl/ssl.h:# define SSL_CTX_set_tmp_dh(ctx,dh) \
include/openssl/ssl.h:# define SSL_CTX_set_tmp_ecdh(ctx,ecdh) \
include/openssl/ssl.h:# define SSL_set_tmp_dh(ssl,dh) \
include/openssl/ssl.h:# define SSL_set_tmp_ecdh(ssl,ecdh) \
include/openssl/ssl.h:# define SSL_CTX_set_tmp_rsa(ctx,rsa)             1
include/openssl/ssl.h:# define SSL_set_tmp_rsa(ssl,rsa)                 1
include/openssl/ssl.h:# define SSL_CTX_set_tmp_rsa_callback(ctx, cb)    while(0) (cb)(NULL, 0, 0)
include/openssl/ssl.h:# define SSL_set_tmp_rsa_callback(ssl, cb)        while(0) (cb)(NULL, 0, 0)
include/openssl/ssl.h:void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,
include/openssl/ssl.h:void SSL_set_tmp_dh_callback(SSL *ssl,
ssl/ssl_conf.c:        rv = SSL_CTX_set_tmp_ecdh(cctx->ctx, ecdh);
ssl/ssl_conf.c:        rv = SSL_set_tmp_ecdh(cctx->ssl, ecdh);
ssl/ssl_conf.c:        rv = SSL_CTX_set_tmp_dh(cctx->ctx, dh);
ssl/ssl_conf.c:        rv = SSL_set_tmp_dh(cctx->ssl, dh);
ssl/ssl_lib.c:void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,
ssl/ssl_lib.c:void SSL_set_tmp_dh_callback(SSL *ssl, DH *(*dh) (SSL *ssl, int is_export,
test/ssltest_old.c:        SSL_CTX_set_tmp_dh(s_ctx, dh);
test/ssltest_old.c:        SSL_CTX_set_tmp_dh(s_ctx2, dh);
util/libssl.num:SSL_set_tmp_dh_callback                 20  1_1_0   EXIST::FUNCTION:DH
util/libssl.num:SSL_CTX_set_tmp_dh_callback             156 1_1_0   EXIST::FUNCTION:DH