OpenSSL

密碼學和 SSL/TLS 工具組

EVP_KDF-SS

名稱

EVP_KDF-SS - 單步驟/一步 EVP_KDF 實作

說明

EVP_KDF-SS 演算法實作單步驟金鑰衍生函數 (SSKDF)。SSKDF 使用輸入(例如在金鑰建立方案執行期間產生的共用秘密金鑰)和 fixedinfo 衍生金鑰。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() 函數。

支援的參數

支援的參數為

「屬性」 (OSSL_KDF_PARAM_PROPERTIES) <UTF8 字串>
「摘要」 (OSSL_KDF_PARAM_DIGEST) <UTF8 字串>

此參數會忽略 KMAC。

「mac」 (OSSL_KDF_PARAM_MAC) <UTF8 字串>
「maclen」 (OSSL_KDF_PARAM_MAC_SIZE) <無符號整數>
「salt」 (OSSL_KDF_PARAM_SALT) <八位元組字串>

這些參數會依照 EVP_KDF(3) 中的「參數」 所述運作。

「金鑰」 (OSSL_KDF_PARAM_SECRET) <八位元組字串>

此參數設定用於金鑰衍生的共用秘密。

「資訊」 (OSSL_KDF_PARAM_INFO) <八位元組字串>

此參數設定 fixedinfo 的選用值,也稱為 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」和 fixedinfo 值「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」、fixedinfo 值「label」和 salt「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」、fixedinfo 值「label」、salt「salt」和 KMAC outlen 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)EVP_KDF(3) 中的「參數」

歷史

此功能已新增至 OpenSSL 3.0。

版權所有 2019-2023 OpenSSL 專案作者。保留所有權利。版權所有 (c) 2019,Oracle 及其關係企業。保留所有權利。

根據 Apache 授權條款 2.0 (「授權條款」) 授權。您只能根據授權條款使用此檔案。您可以在原始程式碼散佈中的 LICENSE 檔案或 https://www.openssl.org/source/license.html 取得一份副本。