07.04.2005 15:53:09enum ключей созданных на sd Ответов: 12
Борис Тюмнев
Возникла такая проблема - при enumerate контейнеров не видны ключи, которые созданы на SD-карту. При этом карта вставлена и видится как диск. Создать контекст криптопровайдера с именем контейнера, который находится на дискете можно. Заранее спасибо.
 
Ответы:
08.04.2005 10:00:07Василий
а карта подключена как считыватель? панель управления - КриптоПро CSP - Оборудование - Настроить считыватели
Если нет, нажимаете Добавить - Дисковод - выбираете букву, назначенную карте операционной системой.
08.04.2005 10:12:11Борис Тюмнев
Да. Это я забыл сказать. ОС WinXP SP2, CryptoPro 2.0. SD-карта подключается через карт-ридер. В "Оборудование" -> "Настроить считыватели" в КриптоПро этот диск добавлен. И самое удивительное, что зная имя контейнера контекст можно создать.
08.04.2005 16:26:50Василий
А дисковод А добавлен как считыватель? И есть ли он физически на машине?
08.04.2005 16:30:22Борис Тюмнев
Да добавлен. Он физически есть на машине.
11.04.2005 10:49:19Василий
Т.е., зная имя контейнера на карте можно успешно его открыть? (кстати, Вы используете CryptAcquireContext из собственной программы?), а при перечислении контейнеров его нет? Опять же, перечисление делаете самостоятельно (CryptGetProvParam(...PP_ENUMCONTAINERS...)) или другими средствами?
11.04.2005 10:54:15Борис Тюмнев
Да. Именно так. Если знать имя контейнера, то через CryptAcquireContext создается контекст. А через CryptGetProvParam не появляется.
11.04.2005 14:29:03Василий
Последний вопрос - билд CSP.
И приведите кусок кода для перечисления контейнеров (проверить остальные параметры и флажки)
11.04.2005 14:34:32Борис Тюмнев
Сборка 2089.
Вот код (сорри, но он на delphi):
if CryptAcquireContext(@Context, nil, nil, FCryptLibDialogProvider, CRYPT_VERIFYCONTEXT or CRYPT_MACHINE_KEYSET) then begin
if CryptGetProvParam(Context, PP_ENUMCONTAINERS, nil, @ContName.cbData, CRYPT_FIRST) then begin
GetMem(ContName.pbData, ContName.cbData);
while True do begin
if CryptGetProvParam(Context, PP_ENUMCONTAINERS, ContName.pbData, @ContName.cbData, 0) then begin
ContNameStr := PChar(ContName.pbData);
SendMessage(hwnd, LB_ADDSTRING, 0, LPARAM(ContNameStr));
end else begin
Break;
end;
end;
FreeMem(ContName.pbData);
ContName.pbData := nil;
end;
CryptReleaseContext(Context, 0);
end;
11.04.2005 15:32:17Василий
1. Насколько принципиально использование флажка CRYPT_MACHINEKEYSET ?
2. Вообще-то, я бы посоветовал посмотреть на последнюю ошибку, возвращаемую CryptGetProvParam
11.04.2005 15:37:17Борис Тюмнев
1) Да в общем не принципиально
2) Постараюсь
Спасибо за помощь
12.04.2005 9:48:10Василий
Кстати, после выделения памяти следующий вызов CryptGetProvParam должен быть снова с флагом CRYPT_FIRST, а потом уже цикл с нулевым флагом.
12.04.2005 10:20:00Борис Тюмнев
Ой..ёё
Во я чудак! Все спасибо.