Статус: Участник
Группы: Участники
Зарегистрирован: 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: Это все нужно для смежного функционала где происходит парсинг уникального имени контейнера и попытки получить тип устройства на котором был сгенерирован данный контейнер
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,398  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 719 раз в 623 постах
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 16.04.2015(UTC) Сообщений: 27  Откуда: Ярославль Сказал(а) «Спасибо»: 2 раз
|
Я тут заметил что это увы далеко не две строки... тыца то какое то "фу" решение получается. Ну или хоть объясните что за третью строку вы туда вставили и почему так МНОГО null-terminated символов добавлено в конец строки...
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,398  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 719 раз в 623 постах
|
Повторюсь, используйте первую. Мы не очищаем входной буфер. Нули и третья строка - скорее всего мусор.
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close