Доброго времени суток!
Возникли проблемы с подписью. Первый же вызов функции CryptSignHash возвращает 0x80090016. Keyset does not exist. Ключи храню в реестре, запускаю с правами администратора.
Не подскажете, что я делаю не так?
int main()
{
#pragma region _Init Var_
PCHAR pcData = "Test Sring";
DWORD dwLen = strlen(pcData);
#pragma endregion
// Получение контекста криптопровайдера
if ( !CryptAcquireContext (&hProv, "{Cont4Sign4}", "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider", 80, CRYPT_NEWKEYSET ) )
{
if ((gle = GetLastError()) == NTE_EXISTS)
{
if ( !CryptAcquireContext (&hProv, "{Cont4Sign4}", "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider", 80, 0 ) )
{
ErrorHandle("CryptAcquireContext failed", 2, 1);
}
}
else
{
ErrorHandle("CryptAcquireContext failed", 2, 1);
}
}
LOG("CryptAcquireContext");
// Ключ.
if (!CryptGenKey(hProv, AT_SIGNATURE, 512<<16|CRYPT_EXPORTABLE , &hKey))
{
ErrorHandle("CryptGenKey failed", 1, 1);
}
LOG("CryptGenKey");
// Хэш
if (!CryptCreateHash(hProv, 0x8022, 0, 0, &hHash))
{
ErrorHandle("CryptCreateHash", 1, 1);
}
LOG("CryptCreateHash");
// Подпись
if (!CryptSignHash(hHash, 0xaa42, NULL, 0, NULL, &dwLen))
{
ErrorHandle("CryptSignHash", 1, 1);
}
LOG("CryptSignHash");
printf("dwLen %i\n", dwLen);
Sign = (PBYTE)malloc(dwLen);
if (!CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, Sign, &dwLen))
{
ErrorHandle("CryptSignHash", 1, 1);
}
LOG("CryptSignHash");
system("PAUSE");
return EXIT_SUCCESS;
}