EVP_KDF-SS
名称
EVP_KDF-SS - 单步/一步 EVP_KDF 实现
描述
EVP_KDF-SS 算法实现了单步密钥派生函数 (SSKDF)。SSKDF 使用输入来派生密钥,例如共享密钥(在执行密钥建立方案期间生成)和固定信息。SSKDF 也非正式地称为“Concat KDF”。
辅助函数
该实现使用可选择的辅助函数 H,它可以是以下之一:
- H(x) = hash(x, digest=md)
- H(x) = HMAC_hash(x, key=salt, digest=md)
- H(x) = KMACxxx(x, key=salt, custom="KDF", outlen=mac_size)
HMAC 和 KMAC 实现都使用“salt”值设置密钥。哈希和 HMAC 还要求设置摘要。
标识
"SSKDF" 是此实现的名称;它可以与 EVP_KDF_fetch() 函数一起使用。
支持的参数
支持的参数是
- "properties" (OSSL_KDF_PARAM_PROPERTIES) <UTF8 字符串>
- "digest" (OSSL_KDF_PARAM_DIGEST) <UTF8 字符串>
-
此参数对于 KMAC 被忽略。
- "mac" (OSSL_KDF_PARAM_MAC) <UTF8 字符串>
- "maclen" (OSSL_KDF_PARAM_MAC_SIZE) <无符号整数>
- "salt" (OSSL_KDF_PARAM_SALT) <八位字节字符串>
-
这些参数的工作方式如 "PARAMETERS" in EVP_KDF(3) 中所述。
- "key" (OSSL_KDF_PARAM_SECRET) <八位字节字符串>
-
此参数设置用于密钥派生的共享密钥。
- "info" (OSSL_KDF_PARAM_INFO) <八位字节字符串>
-
此参数设置固定信息的可选值,也称为 otherinfo。
注意
可以通过调用以下方法获取 SSKDF 的上下文:
EVP_KDF *kdf = EVP_KDF_fetch(NULL, "SSKDF", NULL);
EVP_KDF_CTX *kctx = EVP_KDF_CTX_new(kdf);
SSKDF 的输出长度通过 keylen 参数指定给 EVP_KDF_derive(3) 函数。
示例
此示例使用 H(x) = SHA-256、密钥“secret”和固定信息值“label”派生 10 个字节。
EVP_KDF *kdf;
EVP_KDF_CTX *kctx;
unsigned char out[10];
OSSL_PARAM params[4], *p = params;
kdf = EVP_KDF_fetch(NULL, "SSKDF", 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,
"secret", (size_t)6);
*p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_INFO,
"label", (size_t)5);
*p = OSSL_PARAM_construct_end();
if (EVP_KDF_derive(kctx, out, sizeof(out), params) <= 0) {
error("EVP_KDF_derive");
}
EVP_KDF_CTX_free(kctx);
此示例使用 H(x) = HMAC(SHA-256)、密钥“secret”、固定信息值“label”和盐“salt”派生 10 个字节。
EVP_KDF *kdf;
EVP_KDF_CTX *kctx;
unsigned char out[10];
OSSL_PARAM params[6], *p = params;
kdf = EVP_KDF_fetch(NULL, "SSKDF", NULL);
kctx = EVP_KDF_CTX_new(kdf);
EVP_KDF_free(kdf);
*p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_MAC,
SN_hmac, strlen(SN_hmac));
*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_INFO,
"label", (size_t)5);
*p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SALT,
"salt", (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);
此示例使用 H(x) = KMAC128(x,salt,outlen)、密钥“secret”、固定信息值“label”、盐“salt”和 KMAC 输出长度 20 派生 10 个字节。
EVP_KDF *kdf;
EVP_KDF_CTX *kctx;
unsigned char out[10];
OSSL_PARAM params[6], *p = params;
kdf = EVP_KDF_fetch(NULL, "SSKDF", NULL);
kctx = EVP_KDF_CTX_new(kdf);
EVP_KDF_free(kdf);
*p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_MAC,
SN_kmac128, strlen(SN_kmac128));
*p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SECRET,
"secret", (size_t)6);
*p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_INFO,
"label", (size_t)5);
*p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SALT,
"salt", (size_t)4);
*p++ = OSSL_PARAM_construct_size_t(OSSL_KDF_PARAM_MAC_SIZE, (size_t)20);
*p = OSSL_PARAM_construct_end();
if (EVP_KDF_derive(kctx, out, sizeof(out), params) <= 0) {
error("EVP_KDF_derive");
}
EVP_KDF_CTX_free(kctx);
符合标准
NIST SP800-56Cr1。
另请参见
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), "PARAMETERS" in EVP_KDF(3)
历史
此功能是在 OpenSSL 3.0 中添加的。
版权
版权所有 2019-2023 The OpenSSL Project Authors。保留所有权利。版权所有 (c) 2019,Oracle 及其附属公司。保留所有权利。
根据 Apache 许可证 2.0 版(“许可证”)许可。除非符合许可证,否则您不得使用此文件。您可以在源代码分发中的 LICENSE 文件或 https://www.openssl.org/source/license.html 获取副本。