Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,190   Сказал «Спасибо»: 621 раз Поблагодарили: 2397 раз в 1886 постах
|
Автор: finex  Вот код из dll для проверки подписи (Delphi 7) Это в юзесах: Код: Windows,
SysUtils,
//System,
Classes,
GDifUtil in 'GDifUtil.pas',
GGlbUtil in 'GGlbUtil.pas', //снять коментарии тут
GCryApi in 'GCryApi.pas',
GConsts in 'GConsts.pas',
md5 in 'md5.pas',
GWinCryp,
CryptoUnit,
CAPICOM_TLB;
Это функция проверки aPStr1 - ЭП, aDat - данные, sSertSN - номер сертификата Код:
function CheckSignCert(aPStr1: PChar; aSize: Integer; aDat:PChar; dSize:Integer; sSertSN:PChar; sSize:Integer): PChar; stdcall;
var
s, ss, CertSN: string;
begin
SetString(Str1, aPStr1, aSize);
SetString(bStr, aDat, dSize);
SetString(CertSN, sSertSN, sSize);
Str2 := 'Не установлен КРИПТО-ПРО';
if CanCrypto then begin
try
{ CryptoAPI.SelectCertificate(0, 0, 'Select certificate', 'Certificate:',
CRYPTUI_SELECT_INTENDEDUSE_COLUMN or CRYPTUI_SELECT_FRIENDLYNAME_COLUMN or
CRYPTUI_SELECT_LOCATION_COLUMN, 0, 'MY', s);
CertSN:= CryptoAPI.CertField(s , false, 'SerialNumber'); }
//StrToFile('c:\temp\Dbufer1.tmp',bStr);
CryptoAPI.CertVerify(StrToAlg('GOST2001'),
'MY',
'MY', bStr,//'c:\temp\Dbufer1.tmp',
DecodeStr(Str1),
CertFindCfg('', CertSN, 0, X500Empty, X500Empty),
CertFindCfg('', CertSN, 0, X500Empty, X500Empty),
True {(EditCryptSerialNumber.Text <> '')}, False,
False, False, False, True, False, s, False, nil);
Str2 := 'Подпись достоверна';
except
on E: Exception do
begin
Str2 := 'Подпись не достоверна';
try
sigData := CoSignedData.Create;
sigData.Content := bStr;
sigData.Verify(Str1, true, CAPICOM_VERIFY_SIGNATURE_ONLY);
Str2 := 'Подпись достоверна';
except
on E: Exception do Str2 := 'Подпись не достоверна';
end;
end;
end;
end;
Str2:= Str2 +'@#$';
aSize := Length(Str2);
Move(Pointer(Str2)^, Buffer^, ASize);
Result:= Buffer;
end;
А тут файл и подписьГост 2001. Когда писалось ПО заказчика 2012 еще не придумали (2004 год + периодически обновляли путем допила костлей в проге и появления новых требований) Такая версия 3,6 стоит на всем парке заказчика. Почему не обновлялись, я не могу сказать, возможно что им хватало и этой версии т.к. документы с такими ЭП ходили только "внутри" в качестве доказательства неизменности Код ни о чём. Нужно: типы и значения переменных до передачи в CAPICOM что делается после подписания с данными (сама подпись), как записывается в файл. Во вложении подпись не CMS. |