开放SSL

密码学与 SSL/TLS 工具包

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