Доброго времени суток!
Заранее прошу извинить, если с данным вопросом уже обращались, но в поиске не нашел, а с КриптоПро и криптографией вообще раньше не работал
Подписать текстовое сообщение (файл, xml). Есть сертификат + закрытый ключ на Rutoken`е
Версия КриптоПро 3.6.4071 КС1 (3.6.5236)
вызываю
HCRYPTPROV hProv = 0;
hProv = GetAcquireContext(hProv, SelectCertificate());
GetHash(hProv);
функция SelectCertificate() - отдает имя контейнера (выбираю из диалога сертификат, из его свойств получаю имя контейнера с закрытым ключом)
LPCTSTR SelectCertificate()
функцией GetAcquireContext(..) - получаю контекст криптопровайдера (появляется диалог выбора рутокена и ввода пина), возвращает hprov отдличный от 0
HCRYPTPROV GetAcquireContext(HCRYPTPROV hProv, LPCTSTR aContainer) {
if(CryptAcquireContext(&hProv, aContainer, NULL, 75, 0)) {
printf("CSP context acquired.\n");
return hProv;
}
else {
printf("CSP context not acquired.\n");
return hProv;
}
}
далее пытаюсь подписать данные как в примере на сайте
static HCRYPTHASH hHash = 0;
static BYTE *pbSignature = NULL;
BYTE *pbBuffer = (BYTE *)"The data that is to be hashed and signed";
DWORD dwBufferLen = (DWORD)(strlen((char *)pbBuffer) + 1);
DWORD dwSigLen = 0;
FILE *signature;
if (CryptCreateHash(hProv, CALG_GR3411, 0, 0, &hHash))
printf("Hash object created. \n");
else
MyHandleError(TEXT("Error during CryptCreateHash"));
if (CryptHashData(hHash, pbBuffer, dwBufferLen, 0))
printf("The data has been hashed.\n");
else
MyHandleError(TEXT("Error during CryptHashData"));
dwSigLen = 0;
if (CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, 0, &dwSigLen))
printf("Signature length %d found.\n", dwSigLen);
else
MyHandleError(TEXT("Error during CryptSignHash"));
pbSignature = (BYTE *)malloc(dwSigLen);
if (!pbSignature)
MyHandleError(TEXT("pbSignature: out of memory"));
if (CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, pbSignature, &dwSigLen))
printf("pbSignature is the hash signature.\n");
else
MyHandleError(TEXT("Error during CryptSignHash."));
if (!(signature = fopen("signature.txt", "w+b")))
MyHandleError(TEXT("Problem opening the file signature.txt\n"));
fwrite(pbSignature, 1, dwSigLen, signature);
if (hHash) CryptDestroyHash(hHash);
программа выпадает с ошибкой " Error number 80090016 " на вызове функции CryptSignHash(..).
Причем, явно видно, что при выполнении этой функции происходит обращение к ключу (моргает прилично по времени),
а затем возвращается данный код с ошибкой.
В чём может быть проблема?