Проблемы с использованием CNG и BCRYPT_KDF_SP80056A_CONCAT KDF - PullRequest
1 голос
/ 21 марта 2012

Я занимаюсь реализацией ECDH CNG, а затем пытаюсь использовать KCRF BCRYPT_KDF_SP80056A_CONCAT для получения симметричного ключа AES256 (BCryptDeriveKey ()).У меня проблема (я всегда получаю 0xc000000d возвращенное состояние.)

Я успешно сгенерировал общий секрет и создал буфер desc "BCryptBufferDesc", который имеет массив "BCryptBuffer" с 1 AlgorithmID,1 PartyU и 1 PartyV "Другая информация".Я думаю, что у меня есть все структуры, которые определены и заполнены правильно.Я просто выбираю некоторые «значения» для байтов PartyU и PartyV (я пробовал 1 байт и 16 байтов для каждого, но я получаю тот же результат).Документация NIST не дает подробных сведений о том, какой должна быть другая информация.

Я следовал за веб-сайтом Microsoft для создания этих структур, использования их строк, определений и т. Д. Я пытался использовать стандартный L "HASH" kdfи это работает, и я получаю один и тот же производный ключ с обеих "сторон", но с конкатенацией KDF я всегда получаю один и тот же статус 0xC000000D.

Кто-нибудь еще смог успешно использовать BCRYPT_KDF_SP80056A_CONCAT CNG KDF?Если вы это сделали, у вас есть какие-нибудь намеки?

1 Ответ

2 голосов
/ 10 июня 2012

Это сработало для меня:

    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*/}
...