21.06.2004 16:20:29Помогите! Acsess violation при вызове CryptVerifyDetachedMessageSignature Ответов: 1
andrew
Люди,помогите разобраться!
вот что делаю:

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;

собственно и получаю сабж. чувствую, что-то не так делаю, но что? может кто-то видит?
 
Ответы:
26.10.2004 18:43:11Дмитрий
Используете wcrypt2 ?

Измените прототип функции CryptVerifyDetachedMessageSignature, там он не совсем корректно переведен с СИ.