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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Randoom  
#1 Оставлено : 17 июня 2009 г. 17:51:41(UTC)
Randoom

Статус: Активный участник

Группы: Участники
Зарегистрирован: 15.06.2009(UTC)
Сообщений: 89
Откуда: Уфа, РРЦ "АйТи"

Есть код на c# внутри которого очень интересно узнать стоит ли на машине КриптоПро.
Подскажите пожалуйста как
Offline Челпанов А.  
#2 Оставлено : 17 июня 2009 г. 18:08:42(UTC)
Челпанов А.

Статус: Активный участник

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

Поблагодарили: 2 раз в 2 постах
КриптоПро CSP или КриптоПро Sharpei? Какой-то определенной версии? Как Вы потом с ним будете работать, через P/Invoke?
Цитата:
CryptAcquireContext( ref hProv, 0, 0, 75, CRYPT_VERIFYCONTEXT )

Так можно узнать, что на компьютере установлен Крипто-провайдер поддерживающий ГОСТ Р 34.10-2001.
С уважением, Александр.
Offline Randoom  
#3 Оставлено : 17 июня 2009 г. 18:13:26(UTC)
Randoom

Статус: Активный участник

Группы: Участники
Зарегистрирован: 15.06.2009(UTC)
Сообщений: 89
Откуда: Уфа, РРЦ "АйТи"

Челпанов А. написал:
КриптоПро CSP или КриптоПро Sharpei? Какой-то определенной версии? Как Вы потом с ним будете работать, через P/Invoke?
Цитата:
CryptAcquireContext( ref hProv, 0, 0, 75, CRYPT_VERIFYCONTEXT )

Так можно узнать, что на компьютере установлен Крипто-провайдер поддерживающий ГОСТ Р 34.10-2001.

Именно КриптоПро CSP, версии >= const.
Нужно просто булево значение установлена\не установлена
Offline Челпанов А.  
#4 Оставлено : 17 июня 2009 г. 18:24:57(UTC)
Челпанов А.

Статус: Активный участник

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

Поблагодарили: 2 раз в 2 постах
Для версий CSP старше 2.0, номер версии можно узнать через
Цитата:
DWORD &ver;
DWORD dwLen = sizeof( ver );
CryptGetProvParam( hProv, PP_VERSION, (BYTE*)&ver, &dwLen, 0 );

Без установленного CSP
Цитата:
CryptAcquireContext( ref hProv, 0, 0, 75, CRYPT_VERIFYCONTEXT )
вернет FALSE
С уважением, Александр.
Offline Randoom  
#5 Оставлено : 17 июня 2009 г. 18:27:22(UTC)
Randoom

Статус: Активный участник

Группы: Участники
Зарегистрирован: 15.06.2009(UTC)
Сообщений: 89
Откуда: Уфа, РРЦ "АйТи"

Челпанов А. написал:
Для версий CSP старше 2.0, номер версии можно узнать через
Цитата:
DWORD &ver;
DWORD dwLen = sizeof( ver );
CryptGetProvParam( hProv, PP_VERSION, (BYTE*)&ver, &dwLen, 0 );

Без установленного CSP
Цитата:
CryptAcquireContext( ref hProv, 0, 0, 75, CRYPT_VERIFYCONTEXT )
вернет FALSE

Возможно глупый вопрос - но есть ли пример вызова этого функционала из .net ?
Offline Челпанов А.  
#6 Оставлено : 17 июня 2009 г. 18:40:08(UTC)
Челпанов А.

Статус: Активный участник

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

Поблагодарили: 2 раз в 2 постах
Точного кода нет. Но написанного выше должно хватить.
С уважением, Александр.
Offline vnsuzdalev  
#7 Оставлено : 19 ноября 2009 г. 18:41:29(UTC)
vnsuzdalev

Статус: Активный участник

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

Постарался реализовать предложеннное на C#

Вот рез-т
Цитата:

// #define CRYPT_VERIFYCONTEXT 0xF0000000
public const Int32 CRYPT_VERIFYCONTEXT = -268435456; //No private key access required

[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool CryptGetProvParam(
IntPtr hProv,
uint dwParam,
out byte[] pbData,
ref uint dwDataLen,
uint dwFlags);

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool CryptAcquireContext(
ref IntPtr hProv,
String pszContainer,
String pszProvider,
Int32 dwProvType,
Int32 dwFlags
);

private void btn_Click(object sender, EventArgs e)
{

IntPtr dProvider = new IntPtr();
if (CryptAcquireContext(ref dProvider, null, null, 75, CRYPT_VERIFYCONTEXT))
{
MessageBox.Show("Контекст провайдера получен");
StringBuilder sb = new StringBuilder();
byte[] ss;
uint ll = 0;
bool r = CryptGetProvParam(dProvider, 5, out ss, ref ll, 0);
...
}
else
{
MessageBox.Show("не установлен");
}
}


Определяет наличие правильно, а вот получить версию ну никак. Функция CryptGetProvParam возвращает false. GetLastError() выдает ошибку 234.
Не поможете понять, в чем причина? (Установлен КриптоПро CSP 3.6)
Pray Pray

Отредактировано пользователем 19 ноября 2009 г. 18:52:49(UTC)  | Причина: Не указана

Offline Челпанов А.  
#8 Оставлено : 19 ноября 2009 г. 18:56:15(UTC)
Челпанов А.

Статус: Активный участник

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

Поблагодарили: 2 раз в 2 постах
Код:

...
[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool CryptGetProvParam(
IntPtr hProv,
uint dwParam,
[In, Out] byte[] pbData, ref uint dwDataLen, 
uint dwFlags);
...
byte[] ss = new byte[4];
uint ll = 4;
bool r = CryptGetProvParam(dProvider, 5, ss, ref ll, 0);
...
С уважением, Александр.
Offline vnsuzdalev  
#9 Оставлено : 19 ноября 2009 г. 19:08:53(UTC)
vnsuzdalev

Статус: Активный участник

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

Спасибо заработало, но она вернула версию 3.6 (в массиве 6,3,0,0). А можно ли получить полнее например 3.6.5329
Offline Челпанов А.  
#10 Оставлено : 19 ноября 2009 г. 19:30:33(UTC)
Челпанов А.

Статус: Активный участник

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

Поблагодарили: 2 раз в 2 постах
Из результата 6 (младший байт DWORD) подверсия, 3 (3 старших байта версия).

Выдержка из WinCryptEx.h для csp версий 3.6 и выше.
Код:
#define PP_VERSION_EX 138
typedef struct _PROV_PP_VERSION_EX {
    DWORD PKZI_Build;	/*!< Версия ПКЗИ. */
    DWORD SKZI_Build;	/*!< Версия СКЗИ. */
    DWORD TypeDebRel;	/*!< Тип сборки: VER_TYPE_DEBUG, VER_TYPE_RELEASE. */
    DWORD Architecture;	/*!< Аппаратная архитектура: VER_ARCH_IA32, 
			 * VER_ARCH_IA64, VER_ARCH_SPARC32, VER_ARCH_SPARC64,
			 * VER_ARCH_AMD64, VER_ARCH_ARM, VER_ARCH_PPC32,
			 * VER_ARCH_PPC64.
			 */
    DWORD OS;		/*!< Тип ОС: VER_OS_WINDOWS, VER_OS_SOLARIS,
			 * VER_OS_FREEBSD, VER_OS_LINUX, VER_OS_AIX.
			 */
} PROV_PP_VERSION_EX;

PKZI_Build - build версии продукта
SKZI_Build - build версии ядра СКЗИ
начало изменений 20.05 {
Выдержка из WinCryptEx.h для csp 3.0
Код:
typedef struct PROV_PP_VERSION_EX_ {

    DWORD Version;
    DWORD Build;
    DWORD TypeDebRel;
    DWORD Architecture;
    DWORD OS;
} PROV_PP_VERSION_EX;

Version - версия Csp (0x30000)
Build - номер сборки СКЗИ

Для определения номера сборки ПКЗИ используйте код
Код:
#define CPCSP_GUID _TEXT("247F4CC0-723C-40A5-9A38-E2E2C24DEB46")
TCHAR lpValueBuf[11];
DWORD pcchValueBuf = 11;
retvalue  = MsiGetProductInfo(_TEXT("{") CPCSP_GUID _TEXT("}"),INSTALLPROPERTY_VERSIONSTRING,lpValueBuf, &pcchValueBuf);

} конец изменений 20.05

Для csp 2.0 (только 2.0)
Код:

#define CRYPT_VERSION_BUILD  0x20
DWORD subver;
if( !CryptGetProvParam( hProv_, PP_VERSION, (BYTE*)&subver, &dwLen, CRYPT_VERSION_BUILD ) )
build_ = ((subver >> 28) & 0xf) * 10000
    + ((subver >> 24) & 0xf) * 1000
    + ((subver >> 20) & 0xf) * 100
    + ((subver >> 16) & 0xf) * 10
    + ((subver >> 12) & 0xf) * 1;
 priv_ = ((subver >> 8) & 0xf) * 100
    + ((subver >> 4) & 0xf) * 10
    + (subver & 0xf) * 1;

Отредактировано пользователем 20 мая 2010 г. 17:57:50(UTC)  | Причина: Не указана

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