开放SSL

密码学和 SSL/TLS 工具包

EVP_KEYEXCH-ECDH

名称

EVP_KEYEXCH-ECDH - ECDH 密钥交换算法支持

描述

ECDH 密钥类型的密钥交换支持。

ECDH 密钥交换参数

"ecdh-cofactor-mode" (OSSL_EXCHANGE_PARAM_EC_ECDH_COFACTOR_MODE) <整数>

设置或获取与关联密钥交换 ctx 相关的 ECDH 操作模式。

在椭圆曲线 Diffie-Hellman 密钥交换的上下文中,此参数可用于在密钥交换算法的普通 Diffie-Hellman (DH) 或 Cofactor Diffie-Hellman (CDH) 变体之间进行选择。

设置时,值应分别为 1、0 或 -1,分别强制打开、关闭或重置与给定密钥交换 ctx 关联的私钥的默认协因子模式。

获取时,值应为 1 或 0,分别表示协因子模式是否打开。

另请参见 provider-keymgmt(7),了解可以在每个密钥的基础上设置的相关 OSSL_PKEY_PARAM_USE_COFACTOR_ECDH 参数。

"kdf-type" (OSSL_EXCHANGE_PARAM_KDF_TYPE) <UTF8 字符串>

请参见 provider-keyexch(7) 中的“通用密钥交换参数”

"kdf-digest" (OSSL_EXCHANGE_PARAM_KDF_DIGEST) <UTF8 字符串>

请参见 provider-keyexch(7) 中的“通用密钥交换参数”

"kdf-digest-props" (OSSL_EXCHANGE_PARAM_KDF_DIGEST_PROPS) <UTF8 字符串>

请参见 provider-keyexch(7) 中的“通用密钥交换参数”

"kdf-outlen" (OSSL_EXCHANGE_PARAM_KDF_OUTLEN) <无符号整数>

请参见 provider-keyexch(7) 中的“通用密钥交换参数”

"kdf-ukm" (OSSL_EXCHANGE_PARAM_KDF_UKM) <八位字节字符串>

请参见 provider-keyexch(7) 中的“通用密钥交换参数”

示例

密钥协商示例可在 demos/keyexch 中找到。

主机和对等体的密钥必须如 EVP_PKEY-EC(7) 中的“示例” 所示使用相同的曲线名称生成。

生成普通情况下的共享密钥的代码与 EVP_KEYEXCH-DH(7) 中的“示例” 相同。

要使用主机的密钥和对等体的公钥以及 X963KDF 和用户密钥材料在主机上导出共享密钥

/* It is assumed that the host_key, peer_pub_key and ukm are set up */
void derive_secret(EVP_PKEY *host_key, EVP_PKEY *peer_key,
                   unsigned char *ukm, size_t ukm_len)
{
    unsigned char secret[64];
    size_t out_len = sizeof(secret);
    size_t secret_len = out_len;
    unsigned int pad = 1;
    OSSL_PARAM params[6];
    EVP_PKEY_CTX *dctx = EVP_PKEY_CTX_new_from_pkey(NULL, host_key, NULL);

    EVP_PKEY_derive_init(dctx);

    params[0] = OSSL_PARAM_construct_uint(OSSL_EXCHANGE_PARAM_PAD, &pad);
    params[1] = OSSL_PARAM_construct_utf8_string(OSSL_EXCHANGE_PARAM_KDF_TYPE,
                                                 "X963KDF", 0);
    params[2] = OSSL_PARAM_construct_utf8_string(OSSL_EXCHANGE_PARAM_KDF_DIGEST,
                                                 "SHA1", 0);
    params[3] = OSSL_PARAM_construct_size_t(OSSL_EXCHANGE_PARAM_KDF_OUTLEN,
                                            &out_len);
    params[4] = OSSL_PARAM_construct_octet_string(OSSL_EXCHANGE_PARAM_KDF_UKM,
                                                  ukm, ukm_len);
    params[5] = OSSL_PARAM_construct_end();
    EVP_PKEY_CTX_set_params(dctx, params);

    EVP_PKEY_derive_set_peer(dctx, peer_pub_key);
    EVP_PKEY_derive(dctx, secret, &secret_len);
    ...
    OPENSSL_clear_free(secret, secret_len);
    EVP_PKEY_CTX_free(dctx);
}

另请参见

EVP_PKEY-EC(7) EVP_PKEY(3)provider-keyexch(7)provider-keymgmt(7)OSSL_PROVIDER-default(7)OSSL_PROVIDER-FIPS(7),

版权所有 2020-2022 OpenSSL 项目作者。保留所有权利。

根据 Apache 许可证 2.0(“许可证”)授权。除非符合许可证,否则您不得使用此文件。您可以在源代码分发中的 LICENSE 文件或 https://www.openssl.org/source/license.html 中获取副本。