| ||||
| ||||
Уважаемые Гуру, подскажите пожалуйста что я делаю не так. Есть такой код: procedure TfrmMain.FormCreate(Sender: TObject); var StoreName : PWideChar; Title : PWideChar; dwKeySpec : DWORD; username : array[0..127] of char; begin Title:=’Âûáåðèòå ñåðòèôèêàò ïîëüçîâàòåëÿ’; StoreName:=’MY’; hCertStore:=CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER, StoreName); pSignerCertContext := CryptUIDlgSelectCertificateFromStore(hCertStore,0,nil,Title,CRYPTUI_SELECT_LOCATION_COLUMN, 0,nil); //Áëàòíàÿ ôóíêöèÿ, âûâîäèò íà ýêðàí ñïèñîê ñåðòèôèêàòîâ if pSignerCertContext=nil then begin Application.Terminate; Exit; end; CertGetNameString(pSignerCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0,nil, username, 128); Caption:=username; // Ïîëó÷èòü êîíòåêñò ñåðòèôèêàòà íàøåãî ïîëüçîâàòåëÿ // pSignerCertContext := CertFindCertificateInStore(hCertStore,MY_TYPE,0,CERT_FIND_SUBJECT_STR,uname,nil); // CryptUIDlgViewContext(CERT_STORE_CERTIFICATE_CONTEXT,pSignerCertContext,0,nil,0, nil); CryptAcquireCertificatePrivateKey(pSignerCertContext, 0,nil,@hCryptProv,dwKeySpec, nil); end; procedure TfrmMain.btnSignAndEncryptClick(Sender: TObject); var SignPara : PCRYPT_SIGN_MESSAGE_PARA; EncryptPara : PCRYPT_ENCRYPT_MESSAGE_PARA; cRecipientCert : DWORD; rgpRecipientCert : array[0..4] of PCCERT_CONTEXT; Title : PWideChar; StoreName : PWideChar; hAddressBook : PVOID; DataStr : PByte; OutDataSize : DWORD; DataSize : DWORD; begin ZeroMemory(@rgpRecipientCert,SizeOf(rgpRecipientCert)); GetMem(SignPara,SizeOf(CRYPT_SIGN_MESSAGE_PARA)); GetMem(EncryptPara,SizeOf(CRYPT_ENCRYPT_MESSAGE_PARA)); ZeroMemory(SignPara,SizeOf(CRYPT_SIGN_MESSAGE_PARA)); ZeroMemory(EncryptPara,SizeOf(CRYPT_ENCRYPT_MESSAGE_PARA)); OutDataSize:=0; GetMem(dataStr,15); DataSize:=15; Title:=’Âûáåðèòå ñåðòèôèêàò ïîëó÷àòåëÿ’; StoreName:=’MY’; hAddressBook:=CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER, StoreName); rgpRecipientCert[0] := CryptUIDlgSelectCertificateFromStore(hAddressBook,0,nil,Title,CRYPTUI_SELECT_LOCATION_COLUMN, 0,nil); if rgpRecipientCert[0]=nil then Exit; SignPara^.cbSize := sizeof(CRYPT_SIGN_MESSAGE_PARA); SignPara^.dwMsgEncodingType := MY_TYPE; SignPara^.pSigningCert := pSignerCertContext ; SignPara^.HashAlgorithm.pszObjId := szOID_CP_GOST_R3411; SignPara^.HashAlgorithm.Parameters.cbData := 0; SignPara^.pvHashAuxInfo := nil; SignPara^.cMsgCert := 0; SignPara^.rgpMsgCert :=nil;//@pSignerCertContext ; SignPara^.cMsgCrl := 0; SignPara^.rgpMsgCrl := nil; SignPara^.cAuthAttr := 0; SignPara^.rgAuthAttr := nil; SignPara^.cUnauthAttr := 0; SignPara^.rgUnauthAttr := nil; SignPara^.dwFlags := 0; SignPara^.dwInnerContentType := 0; EncryptPara^.cbSize := sizeof(CRYPT_ENCRYPT_MESSAGE_PARA); EncryptPara^.dwMsgEncodingType := MY_TYPE; EncryptPara^.hCryptProv := 0; // EncryptPara.ContentEncryptionAlgorithm.pszObjId := szOID_RSA_RC4; EncryptPara^.ContentEncryptionAlgorithm.pszObjId := szOID_CP_GOST_28147; EncryptPara^.ContentEncryptionAlgorithm.Parameters.cbData := 0; EncryptPara^.pvEncryptionAuxInfo := nil; EncryptPara^.dwFlags := 0; EncryptPara^.dwInnerContentType := 0; cRecipientCert := 1; try if CryptSignAndEncryptMessage( SignPara, EncryptPara, cRecipientCert, rgpRecipientCert, DataStr, DataSize, nil, // pbSignedAndEncryptedBlob @OutDataSize) then //Получили размер буфера else ShowMessage(’failed’); finally FreeMem(SignPara); Freemem(EncryptPara); CertFreeCertificateContext(rgpRecipientCert[0]); end; end; Заголовки Jedi, некоторые функции пришлось туда добавить самомуб но в основном это CryptUI. При вызове CryptSignAndEncryptMessage или другой функции Simplified всегда вылетает Access Violation in Crypt32.dll. Причем этот же код на Си отлично работает. Может у кого-нить есть рабочий пример, зашлите пожалуйста на мыло. Заранее спасибо. | ||||
Ответы: | ||||
| ||||
Сумели ли Вы вы сделать так, чтобы код стал работать? Просто очень нужно решение. | ||||