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