Доброго времени суток!
Возникли проблемы с подписью. Первый же вызов функции 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;
}