Какие параметры для NCryptDeriveKey я должен установить равными JavaScript ecdh.computeSecret - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь обменяться ключами ECDH между клиентской системой (используя MS CNG) и сервером (используя JavaScript). У меня есть пример кода на стороне сервера, который используется для создания секрета, однако, когда я пытаюсь повторить код (используя те же закрытые / открытые ключи) с CNG, секретное значение не совпадает.

IПредположим, это потому, что я неправильно устанавливаю параметры для NCryptDeriveKey. Кто-нибудь знает, какими должны быть параметры для NCryptDeriveKey.

Я попытался указать параметр в качестве хэша SHA-256, но возвращенный общий секрет не совпадает с тем, что дает мне JavaScript.

//specify hash algorithm
BufferArray[0].BufferType = KDF_HASH_ALGORITHM;
BufferArray[0].cbBuffer = (DWORD)((wcslen(BCRYPT_SHA256_ALGORITHM) + 1) * sizeof(WCHAR));
BufferArray[0].pvBuffer = (PVOID)BCRYPT_SHA256_ALGORITHM;


ParameterList.cBuffers = 1;
ParameterList.pBuffers = BufferArray;
ParameterList.ulVersion = NCRYPTBUFFER_VERSION;


_nCryptError = NCryptDeriveKey(
    secretHandle,         // Secret agreement handle
    BCRYPT_KDF_HASH,      // Key derivation function
    &ParameterList,       // KDF parameters
    agreedSecret,         // Buffer that recieves the derived key 
    agreedSecretLength,   // Length of the buffer
    &agreedSecretLength,  // Number of bytes copied to the buffer
    0);   // Flags

NCryptDeriveKey работает (даёт успех), однако значение в "согласованномСхарезе" не совпадает со значением, которое дает мне JavaScript, если я его проверяю.

...