Win32 API 日本語リファレンス
ホーム › Security.Cryptography › BCryptKeyDerivationFn

BCryptKeyDerivationFn

コールバック

シグネチャ

NTSTATUS BCryptKeyDerivationFn(
    BCRYPT_KEY_HANDLE hKey,
    BCryptBufferDesc* pParameterList,
    BYTE* pbDerivedKey,
    DWORD cbDerivedKey,
    DWORD* pcbResult,
    DWORD dwFlags
);

パラメーター

フィールド型説明
hKeyBCRYPT_KEY_HANDLE鍵導出関数 (KDF) キーのハンドルです。「解説」を参照してください。
pParameterListBCryptBufferDesc*

KDF のパラメーターを格納した BCryptBufferDesc 構造体のアドレスです。このパラメーターは省略可能で、不要な場合は NULL を指定できます。

パラメーターには、鍵導出関数 (KDF) 固有のものと汎用のものがあります。次の表は、Microsoft Primitive プロバイダーが実装する個々の KDF について、必須および省略可能なパラメーターを示しています。補足情報は BCryptBuffer のドキュメントにもあります。

KDF パラメーター 必須 既定値
SP800-108 HMAC (カウンター モード) KDF_LABEL はい
KDF_CONTEXT はい
KDF_HASH_ALGORITHM はい
SP800-56A KDF_ALGORITHMID はい
KDF_PARTYUINFO はい
KDF_PARTYVINFO はい
KDF_HASH_ALGORITHM はい
KDF_SUPPPUBINFO いいえ ""
KDF_SUPPPRIVINFO いいえ ""
PBKDF2 KDF_HASH_ALGORITHM はい
KDF_SALT はい
KDF_ITERATION_COUNT いいえ 10000
CAPI_KDF KDF_HASH_ALGORITHM はい
TLS1_1_PRF KDF_TLS_PRF_LABEL はい
KDF_TLS_PRF_SEED はい
TLS1_2_PRF KDF_TLS_PRF_LABEL はい
KDF_TLS_PRF_SEED はい
KDF_HASH_ALGORITHM はい
HKDF KDF_HKDF_INFO いいえ ""

一部のアルゴリズムでは、複数のパラメーターを指定する代わりに KDF_GENERIC_PARAMETER を使用できます。これは KDF 固有のパラメーターに次のように対応します。

SP800-108 HMAC (カウンター モード):

SP800-56A:

PBKDF2:

pbDerivedKeyBYTE*キーを受け取るバッファーのアドレスです。cbDerivedKey パラメーターには、このバッファーのサイズを指定します。
cbDerivedKeyDWORDpbDerivedKey パラメーターが指すバッファーのサイズ (バイト単位) です。
pcbResultDWORD*pbDerivedKey パラメーターが指すバッファーにコピーされたバイト数を受け取る ULONG へのポインターです。
dwFlagsDWORD

この関数の動作を変更するフラグです。Microsoft Primitive プロバイダーでは次の値を使用できます。

値 意味
BCRYPT_CAPI_AES_FLAG 対象のアルゴリズムが AES であり、そのためキーを二重に展開する必要があることを指定します。このフラグは CAPI_KDF アルゴリズムでのみ有効です。

公式ドキュメント

BCryptKeyDerivation 関数は、すべてのパラメーターを明示的に指定した状態で鍵導出関数 (KDF) を呼び出すことにより、キーを派生させます。

BCryptDeriveKey と機能は似ていますが、KDF アルゴリズムを直接呼び出すため、入力として BCRYPT_SECRET_HANDLE 値を必要としません。

戻り値

関数の成功または失敗を示すステータス コードを返します。

解説(Remarks)

BCryptKeyDerivation を使用する流れは次のとおりです。

  1. 使用する KDF アルゴリズムを決定し、そのアルゴリズム ハンドルを取得します。BCryptOpenAlgorithmProvider では次のアルゴリズム識別子を使用できます。
  1. キーの派生元となるシークレット データを決定し、アルゴリズム ハンドルとともに BCryptGenerateSymmetricKey に渡して、KDF キー ハンドルを生成します。

  2. KDF キー ハンドルを指定して BCryptKeyDerivation を呼び出します。

この関数をカーネル モードで呼び出すには、Driver Development Kit (DDK) に含まれる Cng.lib を使用します。 Windows Server 2008 および Windows Vista: この関数をカーネル モードで呼び出すには、Ksecdd.lib を使用します。

HKDF

HKDF では、次のどちらからキーを派生させるかが区別されます。

  1. シークレット アグリーメント関数の出力。これは一様にランダムではなく、入力キー マテリアル (IKM) と見なされます。
  2. 一様にランダムなシークレット値。
第 1 段階は、指定されたシークレット データから疑似乱数キー (PRK) を「抽出 (Extract)」することです。

この手順では、KDF キー ハンドルに対して BCRYPT_HKDF_HASH_ALGORITHM を指定して BCryptSetProperty を呼び出し、HKDF の HMAC 計算で使用するハッシュ アルゴリズムを設定します。 続いて、次のいずれかを指定して BCryptSetProperty をもう一度呼び出します。

  1. 指定したシークレット データが IKM を表す場合は、BCRYPT_HKDF_SALT_AND_FINALIZE を使用して省略可能なソルト値を指定し、IKM から PRK を抽出して KDF キー ハンドルを確定します。
  2. それ以外の場合は、BCRYPT_HKDF_PRK_AND_FINALIZE を使用して、指定したシークレットを HKDF の PRK に直接変換し、KDF キー ハンドルを確定します。
第 2 段階は、PRK を出力の派生キーへと「拡張 (Expand)」することです。

この手順では、確定済みの KDF キー ハンドルに対して BCryptKeyDerivation を呼び出します。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)