24.02.2005 15:01:00расшифровка и проверка ЭЦП Ответов: 2
Adilet
Уважаемые знатоки, подскажите пожалуйста. Используя CryptSignAndEncryptMessage подписывается и зашифровывается сообщение, при этом в него не включается сертификат того, кто подписывает. При проверке первый вызов к CryptDecryptAndVerifyMessageSignature проходит без ошибки и возвращает правильный размер, но при повторном вызове возвращается ошибка CRYPT_E_NOT_FOUND=$80092004. Если же включить в сообщение сертификат подписавшего лица, все работает нормально. В чем проблема?
Заранее благодарен.
 
Ответы:
25.02.2005 14:22:25kure
А нет ли в данной функции указателя на callback, который должен возвращать сертификат для проверки. И этот callback по умолчанию пользует сообщение как справочник для поиска сертификата. А его там нет. Может в этом проблем?
28.02.2005 14:01:20Adilet
Спасибо большое за ответ. Для тех кто столкнулся с подобной проблемой, вот как я ее решил:
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;