Форум КриптоПро
»
Средства криптографической защиты информации
»
КриптоПро .NET
»
Есть ли способ узнать установлена ли на компьютере КриптоПро из под .net ?
Статус: Активный участник
Группы: Участники
Зарегистрирован: 15.06.2009(UTC) Сообщений: 89 Откуда: Уфа, РРЦ "АйТи"
|
Есть код на c# внутри которого очень интересно узнать стоит ли на машине КриптоПро. Подскажите пожалуйста как
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.12.2007(UTC) Сообщений: 390  Откуда: КриптоПро Поблагодарили: 2 раз в 2 постах
|
КриптоПро CSP или КриптоПро Sharpei? Какой-то определенной версии? Как Вы потом с ним будете работать, через P/Invoke? Цитата:CryptAcquireContext( ref hProv, 0, 0, 75, CRYPT_VERIFYCONTEXT ) Так можно узнать, что на компьютере установлен Крипто-провайдер поддерживающий ГОСТ Р 34.10-2001. |
С уважением, Александр. |
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 15.06.2009(UTC) Сообщений: 89 Откуда: Уфа, РРЦ "АйТи"
|
Челпанов А. написал:КриптоПро CSP или КриптоПро Sharpei? Какой-то определенной версии? Как Вы потом с ним будете работать, через P/Invoke? Цитата:CryptAcquireContext( ref hProv, 0, 0, 75, CRYPT_VERIFYCONTEXT ) Так можно узнать, что на компьютере установлен Крипто-провайдер поддерживающий ГОСТ Р 34.10-2001. Именно КриптоПро CSP, версии >= const. Нужно просто булево значение установлена\не установлена
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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 |
С уважением, Александр. |
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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 ?
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.12.2007(UTC) Сообщений: 390  Откуда: КриптоПро Поблагодарили: 2 раз в 2 постах
|
Точного кода нет. Но написанного выше должно хватить. |
С уважением, Александр. |
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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) Отредактировано пользователем 19 ноября 2009 г. 18:52:49(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);
...
|
С уважением, Александр. |
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 05.05.2009(UTC) Сообщений: 42 
|
Спасибо заработало, но она вернула версию 3.6 (в массиве 6,3,0,0). А можно ли получить полнее например 3.6.5329
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана |
С уважением, Александр. |
|
|
|
Форум КриптоПро
»
Средства криптографической защиты информации
»
КриптоПро .NET
»
Есть ли способ узнать установлена ли на компьютере КриптоПро из под .net ?
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close