| ||||
| ||||
Уважаемые знатоки, подскажите пожалуйста. Используя CryptSignAndEncryptMessage подписывается и зашифровывается сообщение, при этом в него не включается сертификат того, кто подписывает. При проверке первый вызов к CryptDecryptAndVerifyMessageSignature проходит без ошибки и возвращает правильный размер, но при повторном вызове возвращается ошибка CRYPT_E_NOT_FOUND=$80092004. Если же включить в сообщение сертификат подписавшего лица, все работает нормально. В чем проблема? Заранее благодарен. | ||||
Ответы: | ||||
| ||||
А нет ли в данной функции указателя на callback, который должен возвращать сертификат для проверки. И этот callback по умолчанию пользует сообщение как справочник для поиска сертификата. А его там нет. Может в этом проблем? | ||||
| ||||
Спасибо большое за ответ. Для тех кто столкнулся с подобной проблемой, вот как я ее решил: VerifyPara^.pfnGetSignerCertificate := CryptGetSignerCertificateCallback; VerifyPara^.pvGetArg := @abHandle; //Здесь хэндл хранилища в котором будет производиться поиск сертифката отправителя function CryptGetSignerCertificateCallback(pvGetArg :Pointer; dwCertEncodingType : DWORD; pSignerId : PCERT_INFO; hMsgCertStore : HCERTSTORE) : PCCERT_CONTEXT; stdcall; var CertSignerContext : PCCERT_CONTEXT; begin CertSignerContext:=nil; CertSignerContext := CertFindCertificateInStore(DWORD(pvGetArg^), MY_TYPE, 0, CERT_FIND_SUBJECT_CERT, pSignerId, nil); Result:=CertSignerContext; end; | ||||