1

私は CNG ECDH を実装する処理を行っており、BCRYPT_KDF_SP80056A_CONCAT KDF を使用して対称 AES256 キー (BCryptDeriveKey()) を導出しようとしています。問題が発生しています (常に 0xc000000d ステータスが返されます)。

共有シークレットを正常に生成し、1 つの AlgorithmID、1 つの PartyU および 1 つの PartyV の「その他の情報」を含む「BCryptBuffer」の配列を持つバッファー記述子「BCryptBufferDesc」を作成しました。構造がすべて適切に定義され、設定されていると思います。私は PartyU と PartyV バイトのいくつかの「値」を選んでいます (それぞれに 1 バイトと 16 バイトを試しましたが、同じ結果が得られました)。NIST のドキュメントには、他の情報がどうあるべきかについての詳細は記載されていません。

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

他の誰かが BCRYPT_KDF_SP80056A_CONCAT CNG KDF を正常に使用できましたか? もしそうなら、何かヒントはありますか?

4

1 に答える 1

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*/}
于 2012-06-10T16:56:24.427 に答える