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

NCryptDeriveKeyFn

コールバック

シグネチャ

HRESULT NCryptDeriveKeyFn(
    NCRYPT_PROV_HANDLE hProvider,
    NCRYPT_SECRET_HANDLE hSharedSecret,
    LPWSTR pwszKDF,
    BCryptBufferDesc* pParameterList,
    BYTE* pbDerivedKey,
    DWORD cbDerivedKey,
    DWORD* pcbResult,
    DWORD dwFlags
);

パラメーター

フィールド型説明
hProviderNCRYPT_PROV_HANDLE
hSharedSecretNCRYPT_SECRET_HANDLE鍵の作成元となるシークレットのハンドルです。現在、このハンドルは NCryptSecretAgreement 関数から取得します。
pwszKDFLPWSTR

鍵の派生に使用する 鍵導出関数 (KDF) を示す、null で終わる Unicode 文字列へのポインターです。次のいずれかの文字列を指定できます。

BCRYPT_KDF_HASH (L"HASH")

ハッシュ鍵導出関数を使用します。

cbDerivedKey パラメーターが派生鍵のサイズより小さい場合、この関数は指定されたバイト数だけを pbDerivedKey バッファーにコピーします。cbDerivedKey パラメーターが派生鍵のサイズより大きい場合、この関数は鍵を pbDerivedKey バッファーにコピーし、pcbResult が指す変数に実際にコピーしたバイト数を設定します。

pParameterList パラメーターで指定するパラメーターには、次のパラメーターを含めることができます (または含める必要があります)。必須か省略可能かは「必須/省略可能」列を参照してください。

パラメーター 説明 必須/省略可能
KDF_HASH_ALGORITHM 使用するハッシュ アルゴリズムを示す、null で終わる Unicode 文字列です。CNG Algorithm Identifiers に記載された標準のハッシュ アルゴリズム識別子、または登録された他のハッシュ アルゴリズムの識別子を指定できます。

このパラメーターを指定しない場合は、SHA1 ハッシュ アルゴリズムが使用されます。
省略可能
KDF_SECRET_PREPEND ハッシュ関数へのメッセージ入力の先頭に追加する値です。詳細については、解説 を参照してください。 省略可能
KDF_SECRET_APPEND ハッシュ関数へのメッセージ入力の末尾に追加する値です。詳細については、解説 を参照してください。 省略可能

KDF の呼び出しは、次の疑似コードのように行われます。

KDF-Output = Hash(
    KDF-Prepend + 
    hSharedSecret + 
    KDF-Append)

BCRYPT_KDF_HMAC (L"HMAC")

ハッシュ ベース メッセージ認証コード (HMAC) 鍵導出関数を使用します。

cbDerivedKey パラメーターが派生鍵のサイズより小さい場合、この関数は指定されたバイト数だけを pbDerivedKey バッファーにコピーします。cbDerivedKey パラメーターが派生鍵のサイズより大きい場合、この関数は鍵を pbDerivedKey バッファーにコピーし、pcbResult が指す変数に実際にコピーしたバイト数を設定します。

pParameterList パラメーターで指定するパラメーターには、次のパラメーターを含めることができます (または含める必要があります)。必須か省略可能かは「必須/省略可能」列を参照してください。

パラメーター 説明 必須/省略可能
KDF_HASH_ALGORITHM 使用するハッシュ アルゴリズムを示す、null で終わる Unicode 文字列です。CNG Algorithm Identifiers に記載された標準のハッシュ アルゴリズム識別子、または登録された他のハッシュ アルゴリズムの識別子を指定できます。

このパラメーターを指定しない場合は、SHA1 ハッシュ アルゴリズムが使用されます。
省略可能
KDF_HMAC_KEY 疑似乱数関数 (PRF) に使用する鍵です。 省略可能
KDF_SECRET_PREPEND ハッシュ関数へのメッセージ入力の先頭に追加する値です。詳細については、解説を参照してください。 省略可能
KDF_SECRET_APPEND ハッシュ関数へのメッセージ入力の末尾に追加する値です。詳細については、解説を参照してください。 省略可能

KDF の呼び出しは、次の疑似コードのように行われます。

KDF-Output = HMAC-Hash(
    KDF_HMAC_KEY,
    KDF-Prepend + 
    hSharedSecret + 
    KDF-Append)

BCRYPT_KDF_TLS_PRF (L"TLS_PRF")

トランスポート層セキュリティ (TLS) の 疑似乱数関数 (PRF) 鍵導出関数を使用します。派生鍵のサイズは常に 48 バイトであるため、cbDerivedKey パラメーターには 48 を指定する必要があります。

pParameterList パラメーターで指定するパラメーターには、次のパラメーターを含めることができます (または含める必要があります)。必須か省略可能かは「必須/省略可能」列を参照してください。

パラメーター 説明 必須/省略可能
KDF_TLS_PRF_LABEL PRF ラベルを格納する ANSI 文字列です。 必須
KDF_TLS_PRF_SEED PRF のシードです。シードの長さは 64 バイトである必要があります。 必須
KDF_TLS_PRF_PROTOCOL PRF アルゴリズムを使用する TLS プロトコルのバージョンを指定する DWORD 値です。

有効な値は次のとおりです。
SSL2_PROTOCOL_VERSION (0x0002)
SSL3_PROTOCOL_VERSION (0x0300)
TLS1_PROTOCOL_VERSION (0x0301)
TLS1_0_PROTOCOL_VERSION (0x0301)
TLS1_1_PROTOCOL_VERSION (0x0302)
TLS1_2_PROTOCOL_VERSION (0x0303)
DTLS1_0_PROTOCOL_VERSION (0xfeff)

Windows Server 2008 および Windows Vista: TLS1_1_PROTOCOL_VERSION、TLS1_2_PROTOCOL_VERSION、DTLS1_0_PROTOCOL_VERSION はサポートされません。

Windows Server 2008 R2、Windows 7、Windows Server 2008、Windows Vista: DTLS1_0_PROTOCOL_VERSION はサポートされません。
省略可能
KDF_HASH_ALGORITHM TLS 1.2 プロトコル バージョンにおいて、PRF 内の HMAC と共に使用するハッシュの CNG アルゴリズム ID です。有効な選択肢は SHA-256 と SHA-384 です。指定しない場合は SHA-256 が使用されます。 省略可能

KDF の呼び出しは、次の疑似コードのように行われます。

KDF-Output = PRF(
    hSharedSecret, 
    KDF_TLS_PRF_LABEL, 
    KDF_TLS_PRF_SEED)

BCRYPT_KDF_SP80056A_CONCAT (L"SP800_56A_CONCAT")

SP800-56A 鍵導出関数を使用します。

これは、シークレット ハンドルの生成に使用したアルゴリズムに対応する強度を持つ承認済みハッシュ関数を用いた、SP800-56C rev2 の one-step KDF (セクション 4.1) としても知られています。

pParameterList パラメーターで指定するパラメーターには、次のパラメーターを含めることができます (または含める必要があります)。必須か省略可能かは「必須/省略可能」列を参照してください。すべてのパラメーター値は、不透明なバイト配列として扱われます。

パラメーター 説明 必須/省略可能
KDF_ALGORITHMID SP800-56A 鍵導出関数における OtherInfo フィールドの AlgorithmID サブフィールドを指定します。派生鍵の用途を示します。 必須
KDF_PARTYUINFO SP800-56A 鍵導出関数における OtherInfo フィールドの PartyUInfo サブフィールドを指定します。このフィールドには、イニシエーターが提供する公開情報が格納されます。 必須
KDF_PARTYVINFO SP800-56A 鍵導出関数における OtherInfo フィールドの PartyVInfo サブフィールドを指定します。このフィールドには、レスポンダーが提供する公開情報が格納されます。 必須
KDF_SUPPPUBINFO SP800-56A 鍵導出関数における OtherInfo フィールドの SuppPubInfo サブフィールドを指定します。このフィールドには、イニシエーターとレスポンダーの双方が知っている公開情報が格納されます。 省略可能
KDF_SUPPPRIVINFO SP800-56A 鍵導出関数における OtherInfo フィールドの SuppPrivInfo サブフィールドを指定します。 共有シークレットなど、イニシエーターとレスポンダーの双方が知っている秘密情報が格納されます。 省略可能

KDF の呼び出しは、次の疑似コードのように行われます。

KDF-Output = SP_800-56A_KDF(
    hSharedSecret,
    KDF_ALGORITHMID,
    KDF_PARTYUINFO,
    KDF_PARTYVINFO,
    KDF_SUPPPUBINFO,
    KDF_SUPPPRIVINFO)

Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: この値はサポートされません。

BCRYPT_KDF_RAW_SECRET (L"TRUNCATE")

生のシークレットを、変更を加えずにリトル エンディアン表現で返します。

cbDerivedKey パラメーターが派生鍵のサイズより小さい場合、この関数は指定されたバイト数だけを pbDerivedKey バッファーにコピーします。cbDerivedKey パラメーターが派生鍵のサイズより大きい場合、この関数は鍵を pbDerivedKey バッファーにコピーし、pcbResult が指す変数に実際にコピーしたバイト数を設定します。

Windows 8、Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: この値はサポートされません。

BCRYPT_KDF_HKDF (L"HKDF")

RFC 5869 の HKDF (HMAC ベースの Extract-and-Expand KDF) 関数を使用します。

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

  1. シークレット アグリーメント関数の出力。これは一様ランダムではなく、入力鍵素材 (IKM) と見なされます。BCryptDeriveKey の利用者のほとんどは、この形式のシークレット ハンドルを持ちます。
  2. 一様ランダムなシークレット値。
第 1 段階では、シークレット ハンドルから疑似乱数鍵 (PRK) を「Extract (抽出)」します。

この段階は、シークレット ハンドルに対して BCRYPT_HKDF_HASH_ALGORITHM を指定して BCryptSetProperty を呼び出し、HKDF の HMAC 計算で使用するハッシュ アルゴリズムを設定することで行います。

続いて、次のいずれかを指定して BCryptSetProperty を 2 回目に呼び出します。

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

この段階は、確定済みのシークレット ハンドルに対して BCryptDeriveKey を呼び出すことで行います。

pParameterList パラメーターで指定するパラメーターには、次のパラメーターを含めることができます (または含める必要があります)。必須か省略可能かは「必須/省略可能」列を参照してください。すべてのパラメーター値は、不透明なバイト配列として扱われます。

パラメーター 説明 必須/省略可能
KDF_HKDF_INFO HKDF の Expand 段階における info フィールドを指定します。省略可能なコンテキスト情報とアプリケーション固有の情報を示します。 省略可能

KDF の呼び出しは、次の疑似コードのように行われます。

KDF-Output = HKDF-Expand(
    hSharedSecret.PRK,
    info,
    cbDerivedKey)

Windows 10: HKDF のサポートが開始されました。

pParameterListBCryptBufferDesc*KDF パラメーターを格納した NCryptBufferDesc 構造体のアドレスです。このパラメーターは省略可能で、不要な場合は NULL を指定できます。
pbDerivedKeyBYTE*鍵を受け取るバッファーのアドレスです。cbDerivedKey パラメーターには、このバッファーのサイズを指定します。このパラメーターが NULL の場合、この関数は必要なサイズをバイト単位で、pcbResult パラメーターが指す DWORD に格納します。
cbDerivedKeyDWORDpbDerivedKey バッファーのサイズ (バイト単位) です。
pcbResultDWORD*pbDerivedKey バッファーにコピーされたバイト数を受け取る DWORD へのポインターです。pbDerivedKey パラメーターが NULL の場合、この関数は必要なサイズをバイト単位で、このパラメーターが指す DWORD に格納します。
dwFlagsDWORD

この関数の動作を変更するフラグのセットです。

ゼロ、または次の値を指定できます。

値 意味
KDF_USE_SECRET_AS_HMAC_KEY_FLAG hSharedSecret の値が HMAC 鍵としても使用されます。このフラグを指定する場合、pParameterList パラメーターのパラメーター セットに KDF_HMAC_KEY パラメーターを含めないでください。このフラグは、BCRYPT_KDF_HMAC 鍵導出関数でのみ使用されます。

公式ドキュメント

NCryptDeriveKey 関数は、NCRYPT_SECRET_HANDLE から鍵を派生させます。この関数は、永続化されたシークレット アグリーメント鍵を使用するシークレット アグリーメント手続きの一部として使用することを想定しています。

永続化されたシークレットを使用して鍵素材を派生させるには、代わりに NCryptKeyDerivation 関数を使用してください。

戻り値

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

返される可能性のあるコードには、次のものが含まれます (これらに限定されません)。

戻り値 説明
ERROR_SUCCESS 関数は成功しました。
NTE_INVALID_HANDLE hSharedSecret パラメーターのハンドルが無効です。
NTE_INVALID_PARAMETER 1 つ以上のパラメーターが無効です。

解説(Remarks)

pParameterList パラメーターに指定する NCryptBufferDesc 構造体には、KDF_SECRET_PREPEND および KDF_SECRET_APPEND パラメーターを複数含めることができます。これらのパラメーターが複数指定された場合、KDF が呼び出される前に、配列に格納されている順序でパラメーター値が連結されます。たとえば、次のパラメーター値が指定されたとします。

BYTE abValue0[] = {0x01};
BYTE abValue1[] = {0x04, 0x05};
BYTE abValue2[] = {0x10, 0x11, 0x12};
BYTE abValue3[] = {0x20, 0x21, 0x22, 0x23};

Parameter[0].type = KDF_SECRET_APPEND
Parameter[0].value = abValue0;
Parameter[0].length = sizeof (abValue0);
Parameter[1].type = KDF_SECRET_PREPEND
Parameter[1].value = abValue1;
Parameter[1].length = sizeof (abValue1);
Parameter[2].type = KDF_SECRET_APPEND
Parameter[2].value = abValue2;
Parameter[2].length = sizeof (abValue2);
Parameter[3].type = KDF_SECRET_PREPEND
Parameter[3].value = abValue3;
Parameter[3].length = sizeof (abValue3);

上記のパラメーター値が指定された場合、実際に KDF へ渡される連結後の値は次のようになります。

Type: KDF_SECRET_PREPEND
Value: {0x04, 0x05, 0x20, 0x21, 0x22, 0x23}, length 6

Type: KDF_SECRET_APPEND
Value: {0x01, 0x10, 0x11, 0x12}, length 4

pwszKDF パラメーターに BCRYPT_KDF_RAW_SECRET を指定した場合、返されるシークレットは (他の pwszKDF の値とは異なり) リトル エンディアン形式でエンコードされます。他の CNG 関数のほとんどはビッグ エンディアンでエンコードされた入力を受け取るため、生のシークレットをそれらの関数で使用する際は、この点に注意することが重要です。

サービスは、StartService 関数からこの関数を呼び出してはいけません。サービスが StartService 関数からこの関数を呼び出すと、デッドロックが発生し、サービスが応答しなくなる可能性があります。

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