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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Евгений Пряхин  
#1 Оставлено : 6 мая 2009 г. 16:09:47(UTC)
Евгений Пряхин

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

Группы: Участники
Зарегистрирован: 06.05.2009(UTC)
Сообщений: 28
Откуда: Москва

Здравствуйте.
Столкнулся с такой проблемой:
пытаюсь использовать CryptoPro SDK (как описано к документации к нему) путем написания следующего кода:
Offline Евгений Пряхин  
#2 Оставлено : 6 мая 2009 г. 16:17:15(UTC)
Евгений Пряхин

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

Группы: Участники
Зарегистрирован: 06.05.2009(UTC)
Сообщений: 28
Откуда: Москва

Код вставляться текстом не захотел поэтому картинкой.

UserPostedImage

При запуске выдает ошибку "Ошибка инициализации приложения (0хс0000005)". Для выхода нажмите "ОК". "
Если закоментирвоать вызов функции, то компилируется и выполняется без ошибок - значит проблема в самом вызове.

Может быть кто знает в чем проблема.

ОС WinXP + MediaKit + SP3

Заранее спасибо за помощь.
Offline Максим Коллегин  
#3 Оставлено : 6 мая 2009 г. 16:49:12(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 720 раз в 624 постах
PVTableProvStruc должна быть заполнена. А зачем Вам уровень CP?
Знания в базе знаний, поддержка в центре поддержки
Offline Евгений Пряхин  
#4 Оставлено : 6 мая 2009 г. 17:06:45(UTC)
Евгений Пряхин

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

Группы: Участники
Зарегистрирован: 06.05.2009(UTC)
Сообщений: 28
Откуда: Москва

В SDK описана именно эта функция, ее и решил использовать.
Хотя CryptAquireContext работает без проблем.
Но там непонятно как получить контекст не зная имени контейнера если указать только Reader по маске \\.\Reader то контейнер не находится.
Физически располагается на eToken.

Получилось получить ссылку на контейнер только задав полный путь - MEDIA\UNIQUE или \\.\Reader\MEDIA\UNIQUE. Но ведь такой вариант не универсален, необходимо получать ключи с любого вставленного eToken.
Offline Максим Коллегин  
#5 Оставлено : 6 мая 2009 г. 17:28:01(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 720 раз в 624 постах
Не на каждой карте есть ключ по умолчанию.
Тут обсуждалось: http://www.cryptopro.ru/....aspx?g=posts&t=1027

Отредактировано пользователем 6 мая 2009 г. 17:29:14(UTC)  | Причина: Не указана

Знания в базе знаний, поддержка в центре поддержки
Offline Евгений Пряхин  
#6 Оставлено : 8 мая 2009 г. 14:29:09(UTC)
Евгений Пряхин

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

Группы: Участники
Зарегистрирован: 06.05.2009(UTC)
Сообщений: 28
Откуда: Москва

Спасибо За помощь. Сделал так:

Код:

//имя криптопровайдера в системе
wchar_t cspName[] = L"Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider";
DWORD providerType = 75;


//выводит сообщение об ошибке
void HandleError(char *s);
//возвращает инициализированный контекст криптопровайдера с первым контейнером ключей
HCRYPTPROV getCspHandle(void);
/* char to wchar_t */
wchar_t* ctow(const char* c, size_t max);


int main(void) {
}

HCRYPTPROV getCspHandle(void) {
	HCRYPTPROV cspHandle;
	BYTE byteFirstContainerName[1000];
	DWORD firstContainerNameDataLength = 1000;
	wchar_t* firstContainerName;

	//инициализируем контекст, без контейнера для того чтобы получить список контейнеров
	if(!CryptAcquireContext(&cspHandle, NULL, cspName, providerType, CRYPT_VERIFYCONTEXT)) {
			HandleError("CryptAcquireContext");
	}

	//получим первйы контейнер из списка
	CryptGetProvParam(cspHandle, PP_ENUMCONTAINERS, byteFirstContainerName, &firstContainerNameDataLength, CRYPT_FIRST);
	//преобразуем в юникод
	firstContainerName = ctow((char*)byteFirstContainerName, firstContainerNameDataLength);
	//освободим контекст за ненадобностью
	CryptReleaseContext(cspHandle, 0);
		
	//инициализируем новый контекст - на этот раз с известным контейнером
	if(CryptAcquireContext(&cspHandle, firstContainerName, cspName, providerType, 0)) {
		printf("CryptAcquireContext succeeded.\n");
	} else {
		HandleError("A genral error runing CryptAcquireContext.");
	}
	return cspHandle;
}

wchar_t* ctow(const char* c, size_t max) {
  wchar_t* w = new wchar_t[max];
  mbstowcs(w,c,max);
  return w;
}

void HandleError(char *s) {
    printf("An error occurred in running the program.\n");
    printf("%s\n",s);
    printf("Error number %x.\n",GetLastError());
    printf("Program terminating.\n");
	char k;
	std::cin >> k;
    exit(1);
}

Отредактировано пользователем 8 мая 2009 г. 15:15:12(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.