OpenSSL

密碼學和 SSL/TLS 工具組

EVP_KDF-SSHKDF

名稱

EVP_KDF-SSHKDF - SSHKDF EVP_KDF 實作

說明

透過 EVP_KDF API 支援運算 SSHKDF KDF。

EVP_KDF-SSHKDF 演算法實作 SSHKDF 金鑰衍生函數。它定義在 RFC 4253 第 7.2 節,SSH 使用它來衍生 IV、加密金鑰和完整性金鑰。執行金鑰衍生需要五個輸入:雜湊函數(例如 SHA256)、初始金鑰、交換雜湊、工作階段 ID 和衍生金鑰類型。

身分

「SSHKDF」是此實作的名稱;它可以用於 EVP_KDF_fetch() 函數。

支援的參數

支援的參數為

「屬性」 (OSSL_KDF_PARAM_PROPERTIES) <UTF8 字串>
「摘要」 (OSSL_KDF_PARAM_DIGEST) <UTF8 字串>
「金鑰」 (OSSL_KDF_PARAM_KEY) <八位元組字串>

這些參數的運作方式如 EVP_KDF(3) 中的「參數」 所述。

「xcghash」 (OSSL_KDF_PARAM_SSHKDF_XCGHASH) <八位元組字串>
「工作階段_ID」 (OSSL_KDF_PARAM_SSHKDF_SESSION_ID) <八位元組字串>

這些參數設定 KDF 的各個值。如果已設定值,則內容會被取代。

「類型」 (OSSL_KDF_PARAM_SSHKDF_TYPE) <UTF8 字串>

此參數設定 SSHKDF 作業的類型。有六種支援的類型

EVP_KDF_SSHKDF_TYPE_INITIAL_IV_CLI_TO_SRV

從用戶端到伺服器的初始 IV。單一字元,值為 65(ASCII 字元「A」)。

EVP_KDF_SSHKDF_TYPE_INITIAL_IV_SRV_TO_CLI

從伺服器到用戶端的初始 IV。單一字元,值為 66(ASCII 字元「B」)。

EVP_KDF_SSHKDF_TYPE_ENCRYPTION_KEY_CLI_TO_SRV

從用戶端到伺服器的加密金鑰。單一字元,值為 67(ASCII 字元「C」)。

EVP_KDF_SSHKDF_TYPE_ENCRYPTION_KEY_SRV_TO_CLI

從伺服器到用戶端的加密金鑰。單一字元,值為 68(ASCII 字元「D」)。

EVP_KDF_SSHKDF_TYPE_INTEGRITY_KEY_CLI_TO_SRV

從用戶端到伺服器的完整性金鑰。單一字元,值為 69(ASCII 字元「E」)。

EVP_KDF_SSHKDF_TYPE_INTEGRITY_KEY_SRV_TO_CLI

從用戶端到伺服器的完整性金鑰。單一字元,值為 70(ASCII 字元「F」)。

備註

可透過呼叫取得 SSHKDF 的內容

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

SSHKDF 衍生的輸出長度是透過 EVP_KDF_derive(3) 函式的 keylen 參數來指定的。由於 SSHKDF 輸出長度是變動的,呼叫 EVP_KDF_CTX_get_kdf_size(3) 來取得必要的長度是沒有意義的。呼叫者必須配置一個所需長度的緩衝區,並將該緩衝區傳遞給 EVP_KDF_derive(3) 函式,同時傳遞所需的長度。

範例

此範例使用 SHA-256、1K「金鑰」以及適當的「xcghash」和「session_id」值,衍生出 8 位元組的 IV

EVP_KDF *kdf;
EVP_KDF_CTX *kctx;
char type = EVP_KDF_SSHKDF_TYPE_INITIAL_IV_CLI_TO_SRV;
unsigned char key[1024] = "01234...";
unsigned char xcghash[32] = "012345...";
unsigned char session_id[32] = "012345...";
unsigned char out[8];
size_t outlen = sizeof(out);
OSSL_PARAM params[6], *p = params;

kdf = EVP_KDF_fetch(NULL, "SSHKDF", 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,
                                         key, (size_t)1024);
*p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SSHKDF_XCGHASH,
                                         xcghash, (size_t)32);
*p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SSHKDF_SESSION_ID,
                                         session_id, (size_t)32);
*p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_SSHKDF_TYPE,
                                        &type, sizeof(type));
*p = OSSL_PARAM_construct_end();
if (EVP_KDF_derive(kctx, out, outlen, params) <= 0)
    /* Error */

遵循規範

RFC 4253

另請參閱

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。

版權所有 2016-2022 The OpenSSL Project Authors。保留所有權利。

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