|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июл 5, 2004 11:52:55 Кто работает с crypto api, подскажите решение. Нужно получить хендл провайдера (HCRYPTPROV) имея хендл контекста сертификата (PCCERT_CONTEXT). |
|
|
Дата: Июл 5, 2004 13:42:06 В MSDN вычитал , что CryptAcquireCertificatePrivateKey открывает HCRYPTPROV для CERT_CONTEXT . Но тебе наверное надо получить уже открытый хендл ? Нарыл ещё в mssign32.dll ф-цию GetCryptProvFromCert (её юзает makecert.exe) . Чёрт знает оно или нет , я сертификаты не кодил . |
|
|
Дата: Июл 5, 2004 15:09:04 CryptAcquireCertificatePrivateKey теоретически да но практически не подходит. Смысл в том что-бы задать провайдеру пин-код смарт карты ручками а не через UI. А эта функция сама лезет за ключем на карту... А про GetCryptProvFromCert мсдн молчит как рыба об лед. Судя по названию самое оно... |
|
|
Дата: Июл 5, 2004 15:30:05 А про GetCryptProvFromCert мсдн молчит как рыба об лед Это видимо не документированная , гугль тоже ничего не знает . Я её нашёл тут , вот кусок : GetCryptProvFromCert (HWND hwnd, PCCERT_CONTEXT pCert, HCRYPTPROV *phCryptProv,
DWORD *pdwKeySpec, BOOL *pfDidCryptAcquire,
LPWSTR *ppwszTmpContainer, LPWSTR *ppwszProviderName,
DWORD *pdwProviderType); |
|
|
Дата: Июл 5, 2004 16:06:03 как бы она не оказалась NT-специфичной... вообще должно быть более простое решение, задача-то стандартная... |
|
|
Дата: Июл 5, 2004 16:32:04 эх. В итоге все равно наломали. PP_KEYEXCHANGE_PIN доступен только для чтения. При попытке CryptSetProvParam обламывется с жалобой NTE_BAD_TYPE. Я расстроен... ps: bogrus спасибо |
|
|
Дата: Июл 5, 2004 16:51:20 Ты это читал : Т.е. если твой провайдер поддерживает такую возможность (флаг CRYPT_SILENT) , то можно . |
|
|
Дата: Июл 5, 2004 17:42:13 читал. Для того что-бы это сделать надо иметь хэндл провайдера (с чего все и началось). Это можно сделать тремя путями. 1. CryptAcquireContext 2. CertGetCertificateContextProperty(... CERT_KEY_PROV_HANDLE_PROP_ID ...) 3. CryptAcquireCertificatePrivateKey Случай 3 сразу запрашивает пин через UI, случай 2 выдает ошибку CRYPT_E_NOT_FOUND, случай 1 имеет несколько вариантов. 1.1 pszContainer = NULL, флаги = CRYPT_VERIFYCONTEXT в таком случае возврат NTE_BAD_TYPE при попытке CryptSetProvParam 1.2 pszContainer = NULL, флаги нулевые - сразу вылазить UI с вопросом о пин 1.3 pszContainer = NULL, флаги = CRYPT_SILENT долго думаем, в итоге UI с вопросом о пин 1.4 pszContainer != NULL, но в таком случае его надо знать, а оно для каждой карточки разное (проверял), а я не знаю какая карточка всунута будет (и будет ли вообще в данный момент) итого - ЖОПА. Я устал перечитывать мсдн... |
|
|
Дата: Июл 5, 2004 17:44:48 ps: а _реального_ _РАБОТАЮЩЕГО_ примера нигде в сети нет. Все только на эти флаги и ссылаются. А если внимально мсдн глянуть, то там написано вот так: The CryptSetProvParam function customizes the operations of a cryptographic service provider (CSP). [skip] dwParam [in] Currently defined settings are as follows. PP_CLIENT_HWND PP_KEYSET_SEC_DESCR PP_USE_HARDWARE_RNG и все... |
|
|
Дата: Июл 5, 2004 18:54:33 infern0 Смысл в том что-бы задать провайдеру пин-код смарт карты ручками а не через UI. А эта функция сама лезет за ключем на карту... Некотрые драйвера для смарт карт кэшируют пароль(eToken). Не пробывал "ввести" PIN черех SCardTransmit? Опиши по подробнее задачу - может смогу помочь |
|
|
Дата: Июл 5, 2004 19:51:32 случай 2 выдает ошибку CRYPT_E_NOT_FOUND Случай 2 отпадает , т.к. возможно , что надо сперва "открыть" провайдер (хендл) . Это можно сделать через CryptAcquire* (т.е. случай 1,3) А случай 1,3 если указывать CRYPT_SILENT,CRYPT_ACQUIRE_SILENT_FLAG на 9х не работает . и все... Не всё , есть ещё чтиво : The Smart Card Cryptographic Service Provider Cookbook Smart Card Cryptographic Server Provider Notes в аттаче _517024378__scardcsp.zip |
|
|
Дата: Июл 6, 2004 00:43:57 · Поправил: infern0 случай 2 точно отпадает - это совйство появляется только если один раз CryptAcquireContext сделать с флагом ..._CACHE_... Это я в мсдн нашел. Так что либо боротся с CryptAcquireContext либо забить и сказать что просто кривой провайдер. Будут вместо моего через стандартный UI пины вводить... зы: The Smart Card Cryptographic Service Provider Cookbook нашел в мсдн, прочитал. перевариваю... |
|
|
Дата: Июл 6, 2004 00:57:15 · Поправил: infern0 Во встретил такую фразу The cryptographic functions CryptDecryptMessage, CryptSignMessage, CryptDecryptAndVerifyMessageSignature, and CryptSignAndEncryptMessage, internally perform CryptAcquireContext operations using the CRYPT_KEY_PROV_INFO from a certificate. When the CERT_SET_KEY_CONTEXT_PROP_ID or CERT_SET_KEY_PROV_HANDLE_PROP_ID flag is set, these cryptographic functions then can call CertSetCertificateContextProperty (CERT_KEY_CONTEXT_PROP_ID). This call enables the handle to the key provider to be kept open for subsequent calls to the cryptographic functions mentioned that use that same certificate, which eliminates the need to perform another CryptAcquireContext, improving efficiency я как раз использую CryptSignMessage и CryptDecryptessage. Так что судя по всему на контекст провайдера я повлиять не в силах. Либо использовать Low-Level Message Functions (что не хочется делать) либо попробовать порулить смарт картой вручную на предмет кеширования пина. |
|
|
Дата: Июл 6, 2004 12:03:06 · Поправил: bogrus internally perform CryptAcquireContext operations А , теперь я понял . А то думал , как вообще без CryptAcquire* у тебя получаеться , ведь она ищет и подгружает к твоему процессу необходимый провайдер (csp.dll) и crypt32.dll . Короче в любом случае , хоть один раз , но надо передать ПИН . А программно , если через CryptAcquireContext с флагом CRYPT_SILENT ( для последующего CryptSetProvParam с PP_KEYEXCHANGE_PIN), то Windows Me/98/95 or Internet Explorer 5: This flag is not supported. Или в CRYPT_SIGN_MESSAGE_PARA.dwFlags выставить флаг CRYPT_MESSAGE_SILENT_KEYSET_FLAG , но пишут , что только для XP . Блин у меня мсдн вообще старый , там PP_KEYEXCHANGE_PIN в помине нету . Получаеться такая функциональность (PIN без UI) слишком зависит от оси . Вот ещё статья , ты уже наверное читал . И по GemSAFE pdf-ка . Если ты его юзаешь , то в ресурсах gpkrsrc.dll видно диалог ввода ПИНа и в виндовой scarddlg.dll есть диалог . Т.е смотря чей диалог вылетает можно определить , кто являеться инициатором , кому не хватает ПИНа :) В принципе можна отдизасмить и посмотреть как он вызываеться . А вообще пропатчить провайдер на винте нельзя (это 99,9 %) и его функции напрямую (без advapi32.dll) вызывать тоже нельзя (где-то читал и поверил т.к. у меня не получалось , а может я плохо пробывал) , патчить скорее можна в памяти , но это на х. кому надо такие извращения . |
|
|
Дата: Июл 6, 2004 16:42:22 Статью читал, окно вываливает провайдер (Dekart RSA Cryptographic provider 1.0). Разработчики его молчат как партизаны. Напримую карте передать я хз как, т.к. систему команд ее не знаю. Так что пришлось отступить, теперь леплю отмазку почему то окно круче того, которое я не сумел отобразить :) Так что всем большое спасибо. ps: с утра боролся с другой проблемой - как закешировать секретный ключ, что-бы на карту каждый раз не лазил при пакетной обработке данных - победил таки, хотя тоже с большим гимором. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.078 |