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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Алекей  
#1 Оставлено : 20 июня 2016 г. 17:07:23(UTC)
Алекей

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

Группы: Участники
Зарегистрирован: 16.04.2015(UTC)
Сообщений: 27
Российская Федерация
Откуда: Ярославль

Сказал(а) «Спасибо»: 2 раз
Заметил очень странное поведение в функционале. Допустим я хочу получить уникальное имя контейнера после того как я его создал:
Код:

   DWORD cont_name_size = 0;
   Logger::Instance().RegisterEvent( L"CreateCertificateRequest/CryptGetProvParam 0" );
   if ( !::CryptGetProvParam( container_handle, PP_UNIQUE_CONTAINER, NULL, &cont_name_size, CRYPT_UNIQUE ) )
      return Logger::Instance().RegisterError( eltWinApi );
   vector<unsigned char> cont_name_data( cont_name_size );
   Logger::Instance().RegisterEvent( L"CreateCertificateRequest/CryptGetProvParam 1" );
   if ( !::CryptGetProvParam( container_handle, PP_UNIQUE_CONTAINER, &cont_name_data[0], &cont_name_size, CRYPT_UNIQUE ) )
      return Logger::Instance().RegisterError( eltWinApi );

, в итоге получаю имя контейнера как
Цитата:
SCARD\rutoken_2d2a5a57\0A00\5E76
, ну думаю ок, если понадобится потом смогу найти в списке. Понадобилось, ищу в списке:
Код:

   log::RegisterEvent( L"GetContainerNames/Извлечение имён всех контейнеров криптопровайдера." );
   //Получаем описатель криптопровайдера
   Container ephem_container;
   if( !ephem_container.CreateTemporary( this->Type() ) )
      return false;

   //Узнаем, нужно ли добавлять флаг CRYPT_UNIQUE при переборе
   bool use_unique_container_names = !this->SupportFriendlyContainerNames();

   //Получаем значение максимально возможной длины имени контейнера
   DWORD max_name_size;
   DWORD search_flags = CRYPT_FIRST;

   //Если использован криптопровайдер VipNet или нас явно попросили возвращать уникальное имя контейнера
   if( use_unique_container_names || get_unique_cont_name )
      search_flags += CRYPT_UNIQUE;
   
   log::RegisterEvent( L"GetContainerNames/WinAPI::CryptGetProvParam 0" );
   if( !::CryptGetProvParam( ephem_container.Handle(), PP_ENUMCONTAINERS, NULL, &max_name_size, search_flags ) )
   {
      if( ::GetLastError() == ERROR_NO_MORE_ITEMS )
         return true;
      return RegisterError( eltWinApi );
   }
   if( max_name_size == 0 )
      return RegisterError( L"Максимальная длина имени контейнера данного криптопровайдера равна нулю." );

   //Привет разработчикам ViPNet CSP. Эти нехорошие люди во время последующих вызовов CryptGetProvParam каждый раз
   //меняют максимальную длину имени контейнера, хотя в MSDN написано прямо противоположное:
   //http://msdn.microsoft.com/en-us/library/windows/desktop/aa380196(v=vs.85).aspx
   //"...Subsequent enumerating calls will not change the dwLen parameter..."
   //Из-за их косяка приходится запоминать максимальную длину в безопасном месте и каждый раз восстанавливать её.
   const DWORD max_name_size_backup = max_name_size;

   //Извлекаем имена всех контейнеров данного криптопровайдера
   vector<char> name_data( max_name_size );
   for(;;)
   {
      log::RegisterEvent( L"GetContainerNames/CryptGetProvParam 1" );
      if( !::CryptGetProvParam( ephem_container.Handle(), PP_ENUMCONTAINERS, (BYTE*)&name_data[0], &max_name_size, search_flags ) )
      {
         if( ::GetLastError() == ERROR_NO_MORE_ITEMS )
            break;
         return RegisterError( eltWinApi );
      }
	  std::string curr_cont_name( name_data.begin(), name_data.end() );
. Ну тоже все ок. Пытаюсь найти в данном списке нужный мне контейнер а он имеет уже совершенно другой вид!
Цитата:
SCARD\rutoken_2d2a5a57\0A00\5E76 c4f4623b880d431eb2a19fc1dda0f7db 0ab21bb18c

С одной стороны это даже лучше что из уникального имени контейнера можно понять и его дружественное имя, но с другой - строки то различные получаются при одинаковых параметрах в функции CryptGetProvParam. Как быть то? Костыль писать особо не хочется а идентичную информацию пока получить особо и не получается.

PS: Это все нужно для смежного функционала где происходит парсинг уникального имени контейнера и попытки получить тип устройства на котором был сгенерирован данный контейнер
Offline Максим Коллегин  
#2 Оставлено : 21 июня 2016 г. 9:23:55(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 719 раз в 623 постах
Это две строки, разделенные нулем. Используйте первую: CRYPT_UNIQUE
http://cpdn.cryptopro.ru...37718acf2094bbd89df.html
Знания в базе знаний, поддержка в техподдержке
Offline Алекей  
#3 Оставлено : 22 июня 2016 г. 12:52:14(UTC)
Алекей

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

Группы: Участники
Зарегистрирован: 16.04.2015(UTC)
Сообщений: 27
Российская Федерация
Откуда: Ярославль

Сказал(а) «Спасибо»: 2 раз
Я тут заметил что это увы далеко не две строки...
тыц
а то какое то "фу" решение получается. Ну или хоть объясните что за третью строку вы туда вставили и почему так МНОГО null-terminated символов добавлено в конец строки...
Offline Максим Коллегин  
#4 Оставлено : 22 июня 2016 г. 13:04:29(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 719 раз в 623 постах
Повторюсь, используйте первую. Мы не очищаем входной буфер. Нули и третья строка - скорее всего мусор.

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