04.09.2007 18:03:23CryptSignMessage и Access Violation Ответов: 2
Man
Вот такой вот код. При выполнении функции CryptSignMessage сваливается на AV in module crypt32. В чем может быть проблема? Поиск использовал, но ничего не нашел. Заранее спасибо.
var
hStoreHandle : HCERTSTORE;
pSignerCert: PCCERT_CONTEXT;
hProv: HCRYPTPROV;
err : string;
SIGNER_NAME: string;
CERT_STORE_NAME: string;
PROVIDER_NAME: string;
enctype: Cardinal;
SignParams: CRYPT_SIGN_MESSAGE_PARA;
MessageArray: array of PByte;
MessageSize : array of DWORD;
Signed_MessageBlob: PByte;
cbSignedMessageBlob: DWord;
f1:file;
pSignerName: PWideChar; //SIGNER
begin
CERT_STORE_NAME := 'MY';
SIGNER_NAME := 'Test';
PROVIDER_NAME := '';

hStoreHandle := CertOpenSystemStore(0,PChar(CERT_STORE_NAME));

if hStoreHandle = nil then
begin
Memo.Lines.Add('Ошибка: '+ CERT_STORE_NAME);
exit;
end
else Memo.Lines.Add('Открыто ' + CERT_STORE_NAME');

enctype := PKCS_7_ASN_ENCODING or X509_ASN_ENCODING;

GetMem(pSignerName,2*Length(SIGNER_NAME)+1);
StringToWideChar(SIGNER_NAME,pSignerName,2*Length(SIGNER_NAME)+1);
pSignerCert:= CertFindCertificateInStore(hStoreHandle,enctype,0,CERT_FIND_SUBJECT_STR,pSignerName,nil);
FreeMem(pSignerName);


if pSignerCert = nil then
begin
err := IntToStr(GetLastError);
Memo.Lines.Add('Не найден ' + SIGNER_NAME + ' ' + err);
exit;
end
else Memo.Lines.Add('Найден ' + SIGNER_NAME);


CertCloseStore(hStoreHandle,0);

if not CryptAcquireContext(@hProv, nil, PChar(PROVIDER_NAME), PROV_RSA_FULL,CRYPT_VERIFYCONTEXT) then
begin
Memo.Lines.Add('Провайдер не найден'+PROVIDER_NAME);
exit;
end
else
Memo.Lines.Add('Провайдер не найден'+PROVIDER_NAME);

FillChar(SignParams, sizeof(CRYPT_SIGN_MESSAGE_PARA), #0);

SignParams.cbSize := sizeof(CRYPT_SIGN_MESSAGE_PARA);
SignParams.dwMsgEncodingType := enctype;
SignParams.pSigningCert := pSignerCert;
SignParams.HashAlgorithm.pszObjId := szOID_PKCS;
SignParams.HashAlgorithm.Parameters.cbData := 0;
SignParams.pvHashAuxInfo := nil;
SignParams.cMsgCert := 0;//1;
SignParams.rgpMsgCert := nil;//@pSignerCert;
SignParams.cMsgCrl := 0;
SignParams.rgpMsgCrl := nil;
SignParams.cAuthAttr := 0;
SignParams.rgAuthAttr := nil;
SignParams.cUnauthAttr := 0;
SignParams.rgUnauthAttr := nil;
SignParams.dwFlags := 0;
SignParams.dwInnerContentType := 0;

if (srcFile.Execute) and (srcFile.FileName <> EmptyStr) then
begin
SetLength(MessageArray, 1*sizeof(PByte));
SetLength(MessageSize, 1*sizeof(DWORD));

AssignFile(f1,srcFile.FileName);
Reset(f1, 1);

MessageSize[0] := FileSize(f1);
GetMem(MessageArray[0], MessageSize[0]);

BlockRead(f1, MessageArray[0]^, MessageSize[0]);
CloseFile (f1);
end;

if CryptSignMessage(@SignParams,false,1,MessageArray,MessageSize,nil,@cbSignedMessageBlob) then
Memo.Lines.Add('Ok');
 
Ответы:
04.09.2007 18:21:05Kirill Sobolev
Да? А вот это не Ваш случай?
http://www.cryptopro.ru/cryptopro/forum/view.asp?q=2487
05.09.2007 9:37:32Man
Ой, а это я не заметил. Ошибка была в кривом WinCrypt2.pas скачанном с джедаев.
Спасибо :)