EVP_KEYEXCH-DH
名称
EVP_KEYEXCH-DH - DH密钥交换算法支持
描述
DH密钥类型的密钥交换支持。
DH密钥交换参数
- "pad" (OSSL_EXCHANGE_PARAM_PAD) <无符号整数>
-
设置关联的密钥交换上下文的填充模式。将值设置为1将开启填充。将值设置为0将关闭填充。如果填充关闭,则派生的共享密钥可能小于最大可能的密钥大小。如果填充开启,则派生的共享密钥的第一个字节将根据需要填充零,以使共享密钥的大小与最大可能的密钥大小相同。当KDF类型设置为“X942KDF-ASN1”(OSSL_KDF_NAME_X942KDF_ASN1)时,填充模式参数将被忽略(并且隐式启用填充)。
- "kdf-type" (OSSL_EXCHANGE_PARAM_KDF_TYPE) <UTF8字符串>
- "kdf-digest" (OSSL_EXCHANGE_PARAM_KDF_DIGEST) <UTF8字符串>
- "kdf-digest-props" (OSSL_EXCHANGE_PARAM_KDF_DIGEST_PROPS) <UTF8字符串>
- "kdf-outlen" (OSSL_EXCHANGE_PARAM_KDF_OUTLEN) <无符号整数>
- "kdf-ukm" (OSSL_EXCHANGE_PARAM_KDF_UKM) <八位字节字符串>
- "cekalg" (OSSL_KDF_PARAM_CEK_ALG) <八位字节字符串指针>
示例
这些示例假设主机和对等方都使用相同的命名组(或域参数)生成密钥。请参见EVP_PKEY-DH(7)中的“示例”。主机和对等方都将其公钥传输给对方。
将对等方生成的密钥对转换为DER格式的公钥,以便传输到主机
EVP_PKEY *peer_key; /* It is assumed this contains the peers generated key */
unsigned char *peer_pub_der = NULL;
int peer_pub_der_len;
peer_pub_der_len = i2d_PUBKEY(peer_key, &peer_pub_der);
...
OPENSSL_free(peer_pub_der);
将接收到的对等方的公钥从主机上的DER格式转换
const unsigned char *pd = peer_pub_der;
EVP_PKEY *peer_pub_key = d2i_PUBKEY(NULL, &pd, peer_pub_der_len);
...
EVP_PKEY_free(peer_pub_key);
使用主机的密钥和对等方的公钥在主机上派生共享密钥
/* It is assumed that the host_key and peer_pub_key are set up */
void derive_secret(EVP_KEY *host_key, EVP_PKEY *peer_pub_key)
{
unsigned int pad = 1;
OSSL_PARAM params[2];
unsigned char *secret = NULL;
size_t secret_len = 0;
EVP_PKEY_CTX *dctx = EVP_PKEY_CTX_new_from_pkey(NULL, host_key, NULL);
EVP_PKEY_derive_init(dctx);
/* Optionally set the padding */
params[0] = OSSL_PARAM_construct_uint(OSSL_EXCHANGE_PARAM_PAD, &pad);
params[1] = OSSL_PARAM_construct_end();
EVP_PKEY_CTX_set_params(dctx, params);
EVP_PKEY_derive_set_peer(dctx, peer_pub_key);
/* Get the size by passing NULL as the buffer */
EVP_PKEY_derive(dctx, NULL, &secret_len);
secret = OPENSSL_zalloc(secret_len);
EVP_PKEY_derive(dctx, secret, &secret_len);
...
OPENSSL_clear_free(secret, secret_len);
EVP_PKEY_CTX_free(dctx);
}
对等方可以使用主机的公钥和对等方生成的密钥对派生相同的共享密钥,可以使用非常类似的代码。
参见
EVP_PKEY-DH(7),EVP_PKEY-FFC(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中获取副本。