Статус: Участник
Группы: Участники
Зарегистрирован: 08.10.2009(UTC) Сообщений: 24  Откуда: Санкт-Петербург
|
Код:
DWORD dwProvType = 75;
wchar_t szContName[] = {L""};
wchar_t szProvName[] = {L"Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider"};
HCRYPTPROV_OR_NCRYPT_KEY_HANDLE hProv;
//--------------------------------------Контрольные значения---------------------------------
int iResult = 0;
DWORD dwError = 0;
//--------------------------------------Параметры криптоПровайдера---------------------------
PROV_ENUMALGS_EX ProvInfo;
DWORD dwProvInfoLen = sizeof(ProvInfo);
//--------------------------------------Хранилище сертификатов-------------------------------
HCERTSTORE hCertStore;
//--------------------------------------Сертификат-------------------------------------------
PCCERT_CONTEXT pCertContext = NULL;
DWORD dwKeySpec;
//--------------------------------------Цифровая подпись-------------------------------------
CRYPT_SIGN_MESSAGE_PARA SigParam;
memset(&SigParam,0,sizeof(SigParam));
SigParam.cbSize = sizeof(SigParam);
SigParam.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
SigParam.HashAlgorithm.pszObjId = (LPSTR)"1.2.643.2.2.19";
SigParam.pSigningCert = pCertContext;
SigParam.cMsgCert = 1;
SigParam.rgpMsgCert = &pCertContext;
//--------------------------------------Данные-----------------------------------------------
char szMessage[] = {"test"};
const BYTE *DataArray[] = {(BYTE*)szMessage};
DWORD SizeArray[] = {strlen(szMessage)};
DWORD dwSigLen = 0;
BYTE *pSigBuffer;
//------------------------Функции------------------------------------------------------------
hCertStore = CertOpenSystemStore(NULL, L"MY");
pCertContext = CertEnumCertificatesInStore(hCertStore,pCertContext);
iResult = CryptAcquireCertificatePrivateKey(pCertContext, 0, NULL, &hProv,&dwKeySpec, NULL);
dwError = GetLastError();
iResult = CryptSignMessage(&SigParam, false, 1, DataArray, SizeArray,NULL,&dwSigLen);
dwError = GetLastError();
pSigBuffer = (BYTE*)malloc(dwSigLen);
memset(pSigBuffer,0,dwSigLen);
iResult = CryptSignMessage(&SigParam, false, 1, DataArray, SizeArray,pSigBuffer, &dwSigLen);
dwError = GetLastError();
(Некоторые строки могут быть не нужны) C помощью такого кода я пытаюсь подписать тестовую строку. С CryptoAPI знаком не долго, MSDN не очень хорошо помог, хотя может плохо читал. Еще такой нюанс, во время подписи не происходит обращения к Rutoken, на котором хранится секретный ключ, только при вызове CryptAcuireCertificatePrivateKey выдает окошки КриптоПро. Но даже при отмене ввода Pin-code функция подписи срабатывает, буфер подписи заполняется. Мне кажется что где-то подвох  Может я чего-то неправильно понимаю или делаю? Подскажите пожалуйста, уважаемые знатоки.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Выбор сертификата подписчика (инициализация pCertContext) нужно производить до заполнения структура SigParam. Явная инициализация провайдера (CryptAcquireContext, CryptAcquireCertificatePrivateKey) в случае использования упрощенных функций типа CryptSignMessage не нужна. |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close