Jump to content
Sign in to follow this  
vl2019

Cryptgetprovparam Не Возвращает Спискок Контейнеров В Linux

Recommended Posts

VipNet CSP 4.2 для Linux.

С помощью функции CryptGetProvParam пытаюсь получить список установленных контейнеров.

Но она ничего не находит, хотя в систему с помощью certmgr-gui были импортированы 2 контейнера.

В CryptAcquireContext пробовал добавлять флаг CRYPT_MACHINE_KEYSET.

Ошибок тоже никаких не выходит.

Share this post


Link to post
Share on other sites

Добрый день!

Можете уточнить, где расположены контейнеры? Наши стандартные каталоги: ~/.itcs/vipnet-csp/containers или /var/opt/itcs/vipnet-csp/containers

Если искомые контейнеры находятся в других местах, то найти их не удастся.

Share this post


Link to post
Share on other sites

Переместил в /var/opt/itcs/vipnet-csp/containers

Видит только один контейнер

Перебор происходит следующим образом:


flag = CRYPT_FIRST | CRYPT_UNIQUE;
while(TRUE) {
if(CryptGetProvParam(hProv, PP_ENUMCONTAINERS, NULL, &buffer_len, flag)){
buffer = (BYTE*)emalloc(buffer_len);
if(!CryptGetProvParam(hProv, PP_ENUMCONTAINERS, buffer, &buffer_len, flag)){
if(ERROR_NO_MORE_ITEMS == GetLastError()) {
break;
} else {

goto cleanup;
break;
}
}
printf("%s",buffer);
flag = CRYPT_NEXT | CRYPT_UNIQUE;
} else {
if(ERROR_NO_MORE_ITEMS != GetLastError()) {

goto cleanup;
}
break;
}
}

Share this post


Link to post
Share on other sites

Утро доброе!

Есть небольшая ошибка в коде. Внимательно прочитайте описание функции CryptGetProvParam в MSDN(https://msdn.microsoft.com/en-us/library/windows/desktop/aa380196%28v=vs.85%29.aspx).

Обратите внимание на следующее замечание:

"If PP_ENUMCONTAINERS is set, the first call to the function returns the size of the maximum key-container allowed by the current provider. This is in contrast to other possible behaviors, like returning the length of the longest existing container, or the length of the current container. Subsequent enumerating calls will not change the dwLen parameter. For each enumerated container, the caller can determine the length of the null-terminated string programmatically, if desired. If one of the enumeration values is read and the pbData parameter is NULL, the CRYPT_FIRST flag must be specified for the size information to be correctly retrieved."

Пример перечисления контейнеров есть в SDK ViPNet CSP Linux, так и называется enum_containers.

Код из него:


DWORD dwMaxContainerLen = 0;
if( CryptGetProvParam( provider, PP_ENUMCONTAINERS, NULL, &dwMaxContainerLen, dwFlags ) )
{
std::vector<char> bufContainer( dwMaxContainerLen + 1, 0 );
while( true )
{
DWORD dwContainerLen = dwMaxContainerLen;

if( !CryptGetProvParam( provider, PP_ENUMCONTAINERS, ( BYTE* ) &bufContainer[0], &dwContainerLen, dwFlags ) )
{
if( ERROR_NO_MORE_ITEMS == GetLastError() )
{
isSuccess = true;
}
break;
}
std::cout << " " << index << ". "<< &bufContainer[0] << std::endl;
memset( &bufContainer[0], 0, bufContainer.size() );
dwFlags = CRYPT_NEXT | CRYPT_UNIQUE;
++index;
}
}
else
{
if( ERROR_NO_MORE_ITEMS == GetLastError() )
{
isSuccess = true;
}
}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site, you agree to our Terms of Use.