Форум КриптоПро
	 » 
	Средства криптографической защиты информации
	 » 
	КриптоПро .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 - номер сборки СКЗИ Для определения номера сборки ПКЗИ используйте код  Код:} конец изменений 20.05#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);
 Для 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