| ||||
| ||||
Вот такой вот код. При выполнении функции 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'); | ||||
Ответы: | ||||
| ||||
Да? А вот это не Ваш случай? http://www.cryptopro.ru/cryptopro/forum/view.asp?q=2487 | ||||
| ||||
Ой, а это я не заметил. Ошибка была в кривом WinCrypt2.pas скачанном с джедаев. Спасибо :) | ||||