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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline soap  
#1 Оставлено : 21 августа 2009 г. 19:04:14(UTC)
soap

Статус: Новичок

Группы: Участники
Зарегистрирован: 25.03.2009(UTC)
Сообщений: 9

День добрый. Есть сертификат, пытаюсь вытащить из него "использование ключа"

Код:

// читаем расширения сертификата
	PCERT_EXTENSION pExtension = NULL;
	pExtension = CertFindExtension(szOID_KEY_USAGE,
		pUserCert->pCertInfo->cExtension,
		pUserCert->pCertInfo->rgExtension);

	PCRYPT_DATA_BLOB usages = NULL;
	DWORD dwSize= 0;
	BYTE bUsage;

	if(pExtension)
	{
		CryptDecodeObject(ENCODING, X509_KEY_USAGE,
			pExtension->Value.pbData, pExtension->Value.cbData,
			0, 0, &dwSize);

		usages = (CRYPT_DATA_BLOB*)malloc(dwSize);	
		usages->cbData = dwSize;

		CryptDecodeObject(ENCODING, X509_KEY_USAGE,
			pExtension->Value.pbData, pExtension->Value.cbData,										
			0, (LPVOID)usages, &dwSize);			

		bUsage = (BYTE)usages->pbData;
		if( (bUsage & CERT_DIGITAL_SIGNATURE_KEY_USAGE) > 0)
			MessageBox("такой тип использования есть");
				
		if(usages) free(usages);
	}		


ну вот как то так. Вытащить текстовые значения из полей расширения у меня получается,
а вот BYTE (каковым, как я понимаю является szOID_KEY_USAGE) не получается.

Заранее спасибо.
Offline nikita1  
#2 Оставлено : 21 августа 2009 г. 21:58:40(UTC)
nikita1

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

Группы: Участники
Зарегистрирован: 11.03.2008(UTC)
Сообщений: 17
Откуда: г. Москва, Россия

soap, лучше используйте функцию CertGetEnhancedKeyUsage(), ее описание смотрите в MSDN.
Offline Kirill Sobolev  
#3 Оставлено : 24 августа 2009 г. 14:38:00(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
soap, после декодирования szOID_KEY_USAGE получается структура CRYPT_BIT_BLOB а не CRYPT_DATA_BLOB.
nikita1 - CertGetEnhancedKeyUsage используется для получения совершенно другого расширения - Enhanced Key Usage ("Улучшенный ключ"), а не Key Usage ("Использование ключа").
Техническую поддержку оказываем тут
Наша база знаний
Offline soap  
#4 Оставлено : 24 августа 2009 г. 16:45:30(UTC)
soap

Статус: Новичок

Группы: Участники
Зарегистрирован: 25.03.2009(UTC)
Сообщений: 9

Поменял структуру, но все равно, не могу вычленить тип использования. То как я делаю
Код:

bUsage = (BYTE)usages->pbData;
        if( (bUsage & CERT_DIGITAL_SIGNATURE_KEY_USAGE) > 0)
            MessageBox("такой тип использования есть");


не проходит. Как тогда можно узнать?
Offline Kirill Sobolev  
#5 Оставлено : 24 августа 2009 г. 17:21:34(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Что значит не проходит? CryptDecodeObject отрабатывает без ошибок? Что лежит в usages->pbData после декодирования?
Техническую поддержку оказываем тут
Наша база знаний
Offline soap  
#6 Оставлено : 24 августа 2009 г. 17:36:12(UTC)
soap

Статус: Новичок

Группы: Участники
Зарегистрирован: 25.03.2009(UTC)
Сообщений: 9

в usages->pbData что то лежит =))
в usages->сbData = 1

то есть, как я понимаю, там лежит один байт, который определяет использование ключа.
Но когда я произвожу сравнения
Цитата:

bUsage = (BYTE)usages->pbData;
if( (bUsage & CERT_DIGITAL_SIGNATURE_KEY_USAGE) > 0)
MessageBox("такой тип использования есть");

то результаты получаю неверные (ну в плане того, что я знаю, что ключ для этого
не используется, а показывает messagebox)
Может я просто не так сравниваю?
Offline Kirill Sobolev  
#7 Оставлено : 24 августа 2009 г. 17:40:40(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
судя по тому что usages->сbData = 1 декодируется все правильно.
какое значение лежит в usages->pbData? или там все время разные значения?
Техническую поддержку оказываем тут
Наша база знаний
Offline soap  
#8 Оставлено : 24 августа 2009 г. 17:45:12(UTC)
soap

Статус: Новичок

Группы: Участники
Зарегистрирован: 25.03.2009(UTC)
Сообщений: 9

usages->pbData = 254 ('ю')
если перевести, то получается -2. Теперь я совсем сбит с толку.


Кажется разобрался. В usages->pbData было 254, в
bUsage = (BYTE)usages->pbData[0] было нормальное значение. Большое спасибо за помощь.

Отредактировано пользователем 24 августа 2009 г. 18:05:32(UTC)  | Причина: Не указана

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