Я пытаюсь обменяться ключами 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, если я его проверяю.