开放SSL

密码学和 SSL/TLS 工具包

EVP_KDF-KRB5KDF

名称

EVP_KDF-KRB5KDF - RFC3961 Krb5 KDF EVP_KDF 实现

描述

通过 EVP_KDF API 支持计算 KRB5KDF KDF。

EVP_KDF-KRB5KDF 算法实现了 RFC 3961 第 5.1 节中定义的密钥派生函数,并由 Krb5 用于派生会话密钥。执行密钥派生需要三个输入:一个密码(例如 AES-128-CBC)、初始密钥和一个常量。

身份

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

支持的参数

支持的参数为

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

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

"constant" (OSSL_KDF_PARAM_CONSTANT) <八位字节字符串>

此参数设置 KDF 的常量值。如果已设置值,则会替换其内容。

注释

可以通过调用以下命令获取 KRB5KDF 的上下文

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

KRB5KDF 派生的输出长度通过 keylen 参数指定给 EVP_KDF_derive(3) 函数,并且必须与所选密码的密钥长度匹配,否则会返回错误。此外,常量的长度不能超过密码的块大小。由于 KRB5KDF 输出长度取决于所选密码,因此调用 EVP_KDF_CTX_get_kdf_size(3) 以获取所需长度,仅在设置密码后才能返回正确长度。在此之前,将返回 EVP_MAX_KEY_LENGTH。调用者必须为所选密码分配一个正确长度的缓冲区,并将该缓冲区与该长度一起传递给 EVP_KDF_derive(3) 函数。

示例

此示例使用 AES-128-CBC 密码派生密钥

EVP_KDF *kdf;
EVP_KDF_CTX *kctx;
unsigned char key[16] = "01234...";
unsigned char constant[] = "I'm a constant";
unsigned char out[16];
size_t outlen = sizeof(out);
OSSL_PARAM params[4], *p = params;

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

*p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_CIPHER,
                                        SN_aes_128_cbc,
                                        strlen(SN_aes_128_cbc));
*p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY,
                                         key, (size_t)16);
*p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_CONSTANT,
                                         constant, strlen(constant));
*p = OSSL_PARAM_construct_end();
if (EVP_KDF_derive(kctx, out, outlen, params) <= 0)
    /* Error */

EVP_KDF_CTX_free(kctx);

符合

RFC 3961

另请参见

EVP_KDF(3), EVP_KDF_CTX_free(3), EVP_KDF_CTX_get_kdf_size(3), EVP_KDF_derive(3), "PARAMETERS" in EVP_KDF(3)

历史记录

此功能在 OpenSSL 3.0 中添加。

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

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