28.06.2004 16:57:52CAPICOM: The hash value is not correct - Но почему??? Ответов: 0
Vladimir Vornicescu
Попробовал на дельфи использовать CAPICOM, выбираю сертификат и подписываю текст, в результате получаю SMIME текст. Затем этот же текст проверяю и получаю сабжевую ошибку, совершенно не могу понять почему. Может кто натупал на эти грабли раньше?
Вот фрагменты кода:
unction isSigVerified(TEXT: WideString): Boolean; //проверка подписи
Var
SignedData,
Data: OleVariant;
Begin
SignedData:= CreateOLEObject(’CAPICOM.SignedData’);
OleCheck(SignedData.Verify(TEXT, False, CAPICOM_VERIFY_SIGNATURE_AND_CERTIFICATE));
Except
on E:EOleSysError do
if (e.ErrorCode <> CAPICOM_E_CANCELLED) then begin
ShowMessage(&rsquo;Трабла: &rsquo;+E.Message);
Result:= False;
Exit;
end;
End;
Result:= True;
End;


Function FindCertificateByHash(szThumbprint: WideString): OLEVariant;
Var
MyStore,
FilteredCertificates: OleVariant;
Begin
MyStore:= CreateOleObject(&rsquo;CAPICOM.Store&rsquo;);

try
MyStore.Open(CAPICOM_CURRENT_USER_STORE, &rsquo;My&rsquo;, CAPICOM_STORE_OPEN_READ_ONLY);
Except
On E: EOleSysError do
if (e.ErrorCode <> CAPICOM_E_CANCELLED) then begin
ShowMessage(&rsquo;Не могу открыть сертификат: &rsquo;+e.Message);
Exit;
end;
End;
FilteredCertificates := MyStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, szThumbprint);
Result:=FilteredCertificates.Item[1];

MyStore := null;
FilteredCertificates := null;
End;


function FilterCertificates: OleVariant;
Var
MyStore,
FilteredCertificates: OleVariant;
Begin
MyStore:= CreateOleObject(&rsquo;CAPICOM.Store&rsquo;);
FilteredCertificates:= CreateOleObject(&rsquo;CAPICOM.Certificates&rsquo;);
try
MyStore.Open(CAPICOM_CURRENT_USER_STORE, &rsquo;My&rsquo;, CAPICOM_STORE_OPEN_READ_ONLY);
Except
on E: EOleSysError Do
if (e.ErrorCode <> CAPICOM_E_CANCELLED) then begin
ShowMessage(&rsquo;Не могу открыть сертификат: &rsquo;+e.Message);
Exit;
end;
End;
FilteredCertificates:=MyStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_KEY_USAGE, CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE).
Find(CAPICOM_CERTIFICATE_FIND_TIME_VALID).
Find(CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY, 6);
Result:=FilteredCertificates;
MyStore := null;
FilteredCertificates := null;
end;

...

procedure TForm1.SignButtonClick(Sender: TObject);
var
SignedData, Signer,
TimeAttribute, szSignature, Cert: OLEVariant;
begin Dytljhj;ybrb
SignedData := CreateOleObject(&rsquo;CAPICOM.SignedData&rsquo;);
Signer := CreateOleObject(&rsquo;CAPICOM.Signer&rsquo;);
TimeAttribute:= CreateOleObject(&rsquo;CAPICOM.Attribute&rsquo;);

if H=&rsquo;&rsquo; Then ChooseSertButton.Click;

SignedData.Content := Memo2.Text;
Try
Cert:=FindCertificateByHash(H);
Signer.Certificate:=Cert;

TimeAttribute.Name := CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME;
TimeAttribute.Value:= NOW();
Signer.AuthenticatedAttributes.Add(TimeAttribute);

// Подписываем документ и шифруем в SMIME
szSignature := SignedData.Sign(Signer, true, CAPICOM_ENCODE_BASE64);

SignedData.Verify(szSignature, False, CAPICOM_VERIFY_SIGNATURE_AND_CERTIFICATE);
//______________________Тут получаю: The hash value is not correct______________________

Memo1.Text:=szSignature;
Except
on E: EOleSysError Do
if (e.ErrorCode <> CAPICOM_E_CANCELLED) then begin
ShowMessage(&rsquo;Запрос на сертификат был прерван пользователем: &rsquo;+E.Message);
Exit;
end;
End;
end;