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 中获取副本。