19.09.2007 10:24:28Перечисление контейнеров с использованием CryptoAPI Ответов: 4
Леонид
Добрый день!

Поделитесь пожалуйста, ПОЛНЫМ рабочим кодом на Cи с перечислением контейнеров (используя CryptoAPI).
Куски кода я видел на этом форуме, все вроде бы просто, но что-то у меня не выходит (заткнулся на CryptGetProvParam). Можно с динамическим созданием pbData.
Да, по условиям задачи пишу не на Си, но Си знаю
Спасибо.

С уважением Мартюшев Леонид
 
Ответы:
19.09.2007 12:08:31Kirill Sobolev
А в чем именно затык?
19.09.2007 13:29:36Леонид
Затык в том, что перечисляются какие-то пустые контейнеры в Infotecs Criptographic Service Provider. Вот вырезка листинга провайдеров и контенеров:
* Infotecs Criptographic Service Provider
- C:\program files\infotecs\vipnet cryptoservice\d_station\abn_002\000d0000.lck
- все, потом идут пустые строки бесконечно...
* Microsoft Base Cryptographic Provider v1.0
- MSDELXCD
ну и т.д.

Я бы привел код, но он на Clarion-е, малораспостраненный язык. Меня собственно интересует организация цикла с CryptGetProvParam, т.е. полный код по перечислению (ниже кусок кода, который я где-то видел на этом форуме):
------------
while ( CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS, NULL, &size, fParam) )
{
// можно динамически выделить память под имя контейнера равную size
CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS, ContName, &size, fParam);
fParam = 0;
...
-----------------
Из полного кода, если Вы мне его приведете, мне будет ясно, как это сделать в Clarion-e

С уваженим Мартюшев Леонид
19.09.2007 14:31:47Kirill Sobolev
У меня готового примера нет, могу лишь набросать схему вызовов:
//определение длины имени контейнера
CryptGetProvParamStringT(hCryptProv, PP_ENUMCONTAINERS, NULL,
&size, CRYPT_FIRST);
char *szName = new CHAR[size];
bool bFirstPass = true, bRes;
while (1) {
szName[0] = 0; //делаем строку нулевой длины
//получение имени очередного контейнера
bRes = CryptGetProvParamString(hCryptProv, PP_ENUMCONTAINERS, szName, &size, (bFirstPass?CRYPT_FIRST:0));
// Все вызовы, кроме первого пойдут с нулем в dwFlags
if (!bRes)) {
//проверка - ошибка или конец перечисления
}
//...
//что-то делаем с именем контейнера
//...
if(bFirstPass)
bFirstPass = false;
}
19.09.2007 15:22:21Леонид
Добрый день!

Все, большое спасибо, то что нужно.

С уважением Мартюшев Леонид