| ||||
| ||||
Люди,помогите разобраться! вот что делаю: var hProv : HCRYPTPROV; hStoreHandle : HCERTSTORE; CERT_STORE_NAME, SERT_NAME : Pchar; Signer_Name : PWideChar; pSignerCert : PCCERT_CONTEXT; VerifyParams : CRYPT_VERIFY_MESSAGE_PARA; SignatureBuffer : PByte; MessageBuffer : PByte; SignatureSt,MessageSt : TMemoryStream; begin SERT_NAME:= ’Crypto-Pro Cryptographic Service Provider’; CERT_STORE_NAME := ’MY’; SIGNER_NAME := ’CP CSP Test CA’; //Открываем хранилище hStoreHandle:=CertOpenSystemStore(0,CERT_STORE_NAME); if hStoreHandle = nil then Status.Lines.Add(’ошибка’) else Status.Lines.Add (’Хранилище открыто’); //получаем сертификат pSignerCert:= CertFindCertificateInStore( hStoreHandle, PKCS_7_ASN_ENCODING or X509_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR, SIGNER_NAME, nil); if pSignerCert = nil then Status.Lines.Add(’серт. не найден’) else Status.Lines.Add (’сертифик.найден’); //получаем провайдер if not CryptAcquireContext(@hProv, nil, SERT_NAME, 2, CRYPT_VERIFYCONTEXT) then FileMemo.Lines.Add(’ошибка CSP’) else Status.Lines.Add(’CSP найден’); // Заполняем структуру CRYPT_VERIFY_MESSAGE_PARA VerifyParams.cbSize := sizeof(CRYPT_VERIFY_MESSAGE_PARA); VerifyParams.dwMsgAndCertEncodingType := PKCS_7_ASN_ENCODING or X509_ASN_ENCODING; VerifyParams.hCryptProv := hProv; VerifyParams.pfnGetSignerCertificate := @MySignerCertificateCallback; VerifyParams.pvGetArg := pSignerCert; SignatureSt:=TMemoryStream.Create; MessageSt:=TMemoryStream.Create; //забираем письмо Mess.Clear; pop.Retrieve(lvHeaders.Selected.Index+1,Mess); TIDText(Mess.MessageParts[lvAttach.Selected.Index]).Body.SaveToStream(MessageSt); MessageSt.Position:=0; MessageBuffer := AllocMem(MessageSt.Size); MessageSt.Read(MessageBuffer^,MessageSt.Size); MessageSt.Position:=0; FileMemo.Lines.SetText(Pchar(MessageBuffer)); TIdAttachment(Mess.MessageParts.Items[lvAttach.Selected.Index+1]).SaveToStream(SignatureSt); SignatureSt.Position:=0; SignatureBuffer := AllocMem(SignatureSt.Size); SignatureSt.Read(SignatureBuffer^,SignatureSt.Size); SignatureSt.Position:=0; Memo1.Lines.Clear; Memo1.Lines.SetText(Pchar(SignatureBuffer)); if(CryptVerifyDetachedMessageSignature( @VerifyParams, 0, SignatureBuffer, SignatureSt.Size, 1, MessageBuffer, [MessageSt.Size], pSignerCert)) then Status.Lines.Add(’Успешно’) else Status.Lines.Add(’не прошла’); end; // Callback функция для // CRYPT_VERIFY_MESSAGE_PARA VerifyParams; function MySignerCertificateCallback( pvGetArg : pvoid; dwCertEncodingType : DWORD; pSignerId : PCERT_INFO; hMsgCertStore : HCERTSTORE): PCCERT_CONTEXT ; begin result:=PCCERT_CONTEXT(pvGetArg); end; собственно и получаю сабж. чувствую, что-то не так делаю, но что? может кто-то видит? | ||||
Ответы: | ||||
| ||||
Используете wcrypt2 ? Измените прототип функции CryptVerifyDetachedMessageSignature, там он не совсем корректно переведен с СИ. | ||||