OpenSSL

密码学与 SSL/TLS 工具包

EVP_KDF-TLS1_PRF

名称

EVP_KDF-TLS1_PRF - TLS1 PRF 的 EVP_KDF 实现

描述

通过 **EVP_KDF** API 支持计算 **TLS1** PRF。

EVP_KDF-TLS1_PRF 算法实现了 TLS 版本(包括 TLS 1.2)使用的 PRF。

身份

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

支持的参数

支持的参数为

"properties" (**OSSL_KDF_PARAM_PROPERTIES**) <UTF8 字符串>
"digest" (**OSSL_KDF_PARAM_DIGEST**) <UTF8 字符串>

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

**OSSL_KDF_PARAM_DIGEST** 参数用于设置与 TLS PRF 关联的消息摘要。EVP_md5_sha1() 被视为一个特殊情况,它使用 PRF 算法,该算法使用 **MD5** 和 **SHA1** 作为 TLS 1.0 和 1.1 中使用的算法。

"secret" (**OSSL_KDF_PARAM_SECRET**) <八位字节串>

此参数设置 TLS PRF 的秘密值。任何现有的秘密值都将被替换。

"seed" (**OSSL_KDF_PARAM_SEED**) <八位字节串>

此参数设置上下文种子。上下文种子的长度不能超过 1024 字节;这对于 TLS PRF 的任何正常使用都应该足够了。

注意事项

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

EVP_KDF *kdf = EVP_KDF_fetch(NULL, "TLS1-PRF", NULL);
EVP_KDF_CTX *kctx = EVP_KDF_CTX_new(kdf);

必须在派生密钥之前设置摘要、秘密值和种子,否则将发生错误。

PRF 的输出长度由 EVP_KDF_derive() 函数的 keylen 参数指定。

示例

此示例使用 SHA-256、秘密密钥 "secret" 和种子值 "seed" 派生 10 个字节。

EVP_KDF *kdf;
EVP_KDF_CTX *kctx;
unsigned char out[10];
OSSL_PARAM params[4], *p = params;

kdf = EVP_KDF_fetch(NULL, "TLS1-PRF", 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_SECRET,
                                         "secret", (size_t)6);
*p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SEED,
                                         "seed", (size_t)4);
*p = OSSL_PARAM_construct_end();
if (EVP_KDF_derive(kctx, out, sizeof(out), params) <= 0) {
    error("EVP_KDF_derive");
}
EVP_KDF_CTX_free(kctx);

符合标准

RFC 2246、RFC 5246 和 NIST SP 800-135 r1

另请参阅

EVP_KDF(3), EVP_KDF_CTX_new(3), EVP_KDF_CTX_free(3), EVP_KDF_CTX_set_params(3), EVP_KDF_derive(3), "PARAMETERS" in EVP_KDF(3)

历史

此功能是在 OpenSSL 3.0 中添加的。

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

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