OpenSSL

密码学和SSL/TLS工具包

EVP_KDF-SSHKDF

名称

EVP_KDF-SSHKDF - SSHKDF EVP_KDF 实现

描述

支持通过EVP_KDF API 计算SSHKDF KDF。

EVP_KDF-SSHKDF 算法实现了 SSHKDF 密钥派生函数。它在 RFC 4253 第 7.2 节中定义,并由 SSH 用于派生 IV、加密密钥和完整性密钥。执行密钥派生需要五个输入:散列函数(例如 SHA256)、初始密钥、交换散列、会话 ID 和派生密钥类型。

标识

"SSHKDF" 是此实现的名称;它可以与 EVP_KDF_fetch() 函数一起使用。

支持的参数

支持的参数为

"properties" (OSSL_KDF_PARAM_PROPERTIES) <UTF8 字符串>
"digest" (OSSL_KDF_PARAM_DIGEST) <UTF8 字符串>
"key" (OSSL_KDF_PARAM_KEY) <八位字节串>

这些参数的工作方式如 "EVP_KDF(3) 中的参数" 中所述。

"xcghash" (OSSL_KDF_PARAM_SSHKDF_XCGHASH) <八位字节串>
"session_id" (OSSL_KDF_PARAM_SSHKDF_SESSION_ID) <八位字节串>

这些参数设置 KDF 的相应值。如果已设置值,则内容将被替换。

"type" (OSSL_KDF_PARAM_SSHKDF_TYPE) <UTF8 字符串>

此参数设置 SSHKDF 操作的类型。有六种支持的类型

EVP_KDF_SSHKDF_TYPE_INITIAL_IV_CLI_TO_SRV

从客户端到服务器的初始 IV。一个值为 65(ASCII 字符 'A')的单个字符。

EVP_KDF_SSHKDF_TYPE_INITIAL_IV_SRV_TO_CLI

从服务器到客户端的初始 IV。一个值为 66(ASCII 字符 'B')的单个字符。

EVP_KDF_SSHKDF_TYPE_ENCRYPTION_KEY_CLI_TO_SRV

从客户端到服务器的加密密钥。一个值为 67(ASCII 字符 'C')的单个字符。

EVP_KDF_SSHKDF_TYPE_ENCRYPTION_KEY_SRV_TO_CLI

从服务器到客户端的加密密钥。一个值为 68(ASCII 字符 'D')的单个字符。

EVP_KDF_SSHKDF_TYPE_INTEGRITY_KEY_CLI_TO_SRV

从客户端到服务器的完整性密钥。一个值为 69(ASCII 字符 'E')的单个字符。

EVP_KDF_SSHKDF_TYPE_INTEGRITY_KEY_SRV_TO_CLI

从客户端到服务器的完整性密钥。一个值为 70(ASCII 字符 'F')的单个字符。

注意

可以通过调用以下方法获取 SSHKDF 的上下文

EVP_KDF *kdf = EVP_KDF_fetch(NULL, "SSHKDF", NULL);
EVP_KDF_CTX *kctx = EVP_KDF_CTX_new(kdf);

SSHKDF 派生的输出长度通过 EVP_KDF_derive(3) 函数的 keylen 参数指定。由于 SSHKDF 输出长度是可变的,因此调用 EVP_KDF_CTX_get_kdf_size(3) 获取所需长度没有意义。调用者必须分配所需长度的缓冲区,并将该缓冲区与所需的长度一起传递给 EVP_KDF_derive(3) 函数。

示例

此示例使用 SHA-256、1K “密钥” 和适当的 “xcghash” 和 “session_id” 值派生 8 字节 IV

EVP_KDF *kdf;
EVP_KDF_CTX *kctx;
char type = EVP_KDF_SSHKDF_TYPE_INITIAL_IV_CLI_TO_SRV;
unsigned char key[1024] = "01234...";
unsigned char xcghash[32] = "012345...";
unsigned char session_id[32] = "012345...";
unsigned char out[8];
size_t outlen = sizeof(out);
OSSL_PARAM params[6], *p = params;

kdf = EVP_KDF_fetch(NULL, "SSHKDF", NULL);
kctx = EVP_KDF_CTX_new(kdf);
EVP_KDF_free(kdf);

*p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST,
                                        SN_sha256, strlen(SN_sha256));
*p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY,
                                         key, (size_t)1024);
*p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SSHKDF_XCGHASH,
                                         xcghash, (size_t)32);
*p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SSHKDF_SESSION_ID,
                                         session_id, (size_t)32);
*p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_SSHKDF_TYPE,
                                        &type, sizeof(type));
*p = OSSL_PARAM_construct_end();
if (EVP_KDF_derive(kctx, out, outlen, params) <= 0)
    /* Error */

符合标准

RFC 4253

参见

EVP_KDF(3)EVP_KDF_CTX_new(3)EVP_KDF_CTX_free(3)EVP_KDF_CTX_set_params(3)EVP_KDF_CTX_get_kdf_size(3)EVP_KDF_derive(3)"EVP_KDF(3) 中的参数"

历史

此功能在 OpenSSL 3.0 中添加。

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

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