Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход. Новые регистрации запрещены.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Дмитрий Портненков  
#1 Оставлено : 26 ноября 2009 г. 19:00:09(UTC)
Дмитрий Портненков

Статус: Участник

Группы: Участники
Зарегистрирован: 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 функция подписи срабатывает, буфер подписи заполняется. Мне кажется что где-то подвох Think Может я чего-то неправильно понимаю или делаю? Подскажите пожалуйста, уважаемые знатоки.
Offline Kirill Sobolev  
#2 Оставлено : 26 ноября 2009 г. 19:55:49(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Выбор сертификата подписчика (инициализация pCertContext) нужно производить до заполнения структура SigParam.
Явная инициализация провайдера (CryptAcquireContext, CryptAcquireCertificatePrivateKey) в случае использования упрощенных функций типа CryptSignMessage не нужна.
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.