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