| ||||
| ||||
Возникла такая проблема - при enumerate контейнеров не видны ключи, которые созданы на SD-карту. При этом карта вставлена и видится как диск. Создать контекст криптопровайдера с именем контейнера, который находится на дискете можно. Заранее спасибо. | ||||
Ответы: | ||||
| ||||
а карта подключена как считыватель? панель управления - КриптоПро CSP - Оборудование - Настроить считыватели Если нет, нажимаете Добавить - Дисковод - выбираете букву, назначенную карте операционной системой. | ||||
| ||||
Да. Это я забыл сказать. ОС WinXP SP2, CryptoPro 2.0. SD-карта подключается через карт-ридер. В "Оборудование" -> "Настроить считыватели" в КриптоПро этот диск добавлен. И самое удивительное, что зная имя контейнера контекст можно создать. | ||||
| ||||
А дисковод А добавлен как считыватель? И есть ли он физически на машине? | ||||
| ||||
Да добавлен. Он физически есть на машине. | ||||
| ||||
Т.е., зная имя контейнера на карте можно успешно его открыть? (кстати, Вы используете CryptAcquireContext из собственной программы?), а при перечислении контейнеров его нет? Опять же, перечисление делаете самостоятельно (CryptGetProvParam(...PP_ENUMCONTAINERS...)) или другими средствами? | ||||
| ||||
Да. Именно так. Если знать имя контейнера, то через CryptAcquireContext создается контекст. А через CryptGetProvParam не появляется. | ||||
| ||||
Последний вопрос - билд CSP. И приведите кусок кода для перечисления контейнеров (проверить остальные параметры и флажки) | ||||
| ||||
Сборка 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; | ||||
| ||||
1. Насколько принципиально использование флажка CRYPT_MACHINEKEYSET ? 2. Вообще-то, я бы посоветовал посмотреть на последнюю ошибку, возвращаемую CryptGetProvParam | ||||
| ||||
1) Да в общем не принципиально 2) Постараюсь Спасибо за помощь | ||||
| ||||
Кстати, после выделения памяти следующий вызов CryptGetProvParam должен быть снова с флагом CRYPT_FIRST, а потом уже цикл с нулевым флагом. | ||||
| ||||
Ой..ёё Во я чудак! Все спасибо. | ||||