1

CNG ECDHを実装する処理中ですが、次にBCRYPT_KDF_SP80056A_CONCAT KDFを使用して対称AES256キー(BCryptDeriveKey())を取得しようとしています。私は問題を抱えています(私はいつも0xc000000dステータスが返されます)。CNGとBCRYPT_KDF_SP80056A_CONCATを使用する場合の問題KDF

私は共有秘密鍵を正常に生成しました。バッファアルゴリズム "BCryptBufferDesc"を作成しました。このバッファには、1アルゴリズムID、1 PartyU 1 PartyV "その他の情報"。私は構造がすべて定義され、適切に配置されていると思います。私はPartyUとPartyVバイトのためのいくつかの "値"を選んでいます(それぞれ1バイトと16バイトを試しましたが、同じ結果が得られます)。 NISTのドキュメントには、他の情報が何であるべきかについての詳細は記載されていません。

これらの構造の作成、文字列の使用、定義などについては、MicrosoftのWebサイトを参照しています。標準の "HASH" kdfを試してみました。作品と私は両方の "側"に同じ派生キーを取得しますが、連結のKDFと私はいつも同じ0xC000000Dのステータスを取得します..

他の誰もがBCRYPT_KDF_SP80056A_CONCAT CNG KDFを首尾よく使用できましたか?もしあなたがしたら、何かヒントはありますか?

答えて

2

これが私の仕事:

ULONG derivedKeySize = 32; 
    BCryptBufferDesc params; 
    params.ulVersion = BCRYPTBUFFER_VERSION; 
    params.cBuffers = 3; 
    params.pBuffers = new BCryptBuffer[params.cBuffers]; 
    params.pBuffers[0].cbBuffer = 0; 
    params.pBuffers[0].BufferType = KDF_ALGORITHMID; 
    params.pBuffers[0].pvBuffer = new byte[0]; 
    params.pBuffers[1].cbBuffer = 0; 
    params.pBuffers[1].BufferType = KDF_PARTYUINFO; 
    params.pBuffers[1].pvBuffer = new byte[0]; 
    params.pBuffers[2].cbBuffer = 0; 
    params.pBuffers[2].BufferType = KDF_PARTYVINFO; 
    params.pBuffers[2].pvBuffer = new byte[0]; 

    NTSTATUS rv = BCryptDeriveKey(secretHandle, L"SP800_56A_CONCAT", &params, NULL, 0, &derivedKeySize, 0); 
    if (rv != 0){/*fail*/} 

    UCHAR derivedKey = new UCHAR[derivedKeySize]; 

    rv = BCryptDeriveKey(secretHandle, L"SP800_56A_CONCAT", &params, derivedKey, derivedKeySize, &derivedKeySize, 0); 
    if (rv != 0){/*fail*/}