18.02.2005 10:42:49Simplified message functions Ответов: 1
Dilmar
Уважаемые Гуру, подскажите пожалуйста что я делаю не так.
Есть такой код:
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. Причем этот же код на Си отлично работает. Может у кого-нить есть рабочий пример, зашлите пожалуйста на мыло.
Заранее спасибо.
 
Ответы:
31.08.2007 16:12:26Cryogen
Сумели ли Вы вы сделать так, чтобы код стал работать? Просто очень нужно решение.