OpenSSL

密码学和SSL/TLS工具包

EVP_KDF-X942-ASN1

名称

EVP_KDF-X942-ASN1 - X9.42-2003 asn1 EVP_KDF 实现

描述

EVP_KDF-X942-ASN1 算法实现了密钥派生函数 X942KDF-ASN1。它由 DH 密钥协商使用,用于使用共享密钥和其他信息派生密钥。其他信息是 DER 编码的数据,其中包含一个 32 位计数器以及可选字段“partyu-info”、“partyv-info”、“supp-pubinfo”和“supp-privinfo”。此 kdf 由密码消息语法 (CMS) 使用。

标识

“X942KDF-ASN1”或“X942KDF”是此实现的名称;它可以与 EVP_KDF_fetch() 函数一起使用。

支持的参数

支持的参数为:

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

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

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

用于密钥派生的共享密钥。此参数设置密钥。

"acvp-info" (OSSL_KDF_PARAM_X942_ACVPINFO) <八位字节串>

此值不应在生产环境中使用,而应仅用于 ACVP 测试。它是一个可选的八位字节串,包含与“partyu-info”、“partyv-info”、“supp-pubinfo”和“supp-privinfo”相关的任何可选字段的组合 DER 编码 Blob。如果指定了它,则不应使用这些其他字段。

"partyu-info" (OSSL_KDF_PARAM_X942_PARTYUINFO) <八位字节串>

一个可选的八位字节串,包含发起方提供的公共信息。

"ukm" (OSSL_KDF_PARAM_UKM) <八位字节串>

"partyu-info" 的别名。在 CMS 中,这是用户密钥材料。

"partyv-info" (OSSL_KDF_PARAM_X942_PARTYVINFO) <八位字节串>

一个可选的八位字节串,包含响应方提供的公共信息。

"supp-pubinfo" (OSSL_KDF_PARAM_X942_SUPP_PUBINFO) <八位字节串>

一个可选的八位字节串,包含一些其他相互已知的公共信息。设置此值还会将“use-keybits”设置为 0。

"use-keybits" (OSSL_KDF_PARAM_X942_USE_KEYBITS) <整数>

默认值为 1,它将使用 KEK 密钥长度(以位为单位)作为“supp-pubinfo”。值为 0 将禁用设置“supp-pubinfo”。

"supp-privinfo" (OSSL_KDF_PARAM_X942_SUPP_PRIVINFO) <八位字节串>

一个可选的八位字节串,包含一些其他相互已知的私有信息。

"cekalg" (OSSL_KDF_PARAM_CEK_ALG) <UTF8 字符串>

此参数设置 CEK 包装算法名称。有效值为“AES-128-WRAP”、“AES-192-WRAP”、“AES-256-WRAP”和“DES3-WRAP”。

备注

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

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

X942KDF 的输出长度通过 EVP_KDF_derive(3) 函数的 keylen 参数指定。

示例

此示例使用密钥“secret”和随机用户密钥材料派生 24 个字节。

EVP_KDF_CTX *kctx;
EVP_KDF_CTX *kctx;
unsigned char out[192/8];
unsignred char ukm[64];
OSSL_PARAM params[5], *p = params;

if (RAND_bytes(ukm, sizeof(ukm)) <= 0)
    error("RAND_bytes");

kdf = EVP_KDF_fetch(NULL, "X942KDF", NULL);
if (kctx == NULL)
    error("EVP_KDF_fetch");
kctx = EVP_KDF_CTX_new(kdf);
EVP_KDF_free(kdf);
if (kctx == NULL)
    error("EVP_KDF_CTX_new");

*p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, "SHA256", 0);
*p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SECRET,
                                         "secret", (size_t)6);
*p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_UKM, ukm, sizeof(ukm));
*p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_CEK_ALG, "AES-256-WRAP, 0);
*p = OSSL_PARAM_construct_end();
if (EVP_KDF_derive(kctx, out, sizeof(out), params) <= 0)
    error("EVP_KDF_derive");

EVP_KDF_CTX_free(kctx);

符合标准

ANS1 X9.42-2003 RFC 2631

参见

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 中添加的。

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

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