Статус: Участник
Группы: Участники
Зарегистрирован: 19.09.2019(UTC) Сообщений: 28  Откуда: МСК
|
В общем на диске лежит текстовый файл с содержимым: Some Data. Если не читать файл и использовать: oSignedData.ContentEncoding := 1; {} oSignedData.Content := 'U29tZSBEYXRhLg=='; {} то файл результат правильный программа проверяет сертификат нормально.
Если не читать файл и использовать в качестве Content строку Some Data. oSignedData.ContentEncoding := 0; {} oSignedData.Content := 'Some Data.'; {} то файл результат не верный.
Если считывать файл в строку WideString: при проверке строка = Some Data. oSignedData.ContentEncoding := 0; {} oSignedData.Content := Buffer; {} то файл результат не верный.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 19.09.2019(UTC) Сообщений: 28  Откуда: МСК
|
Я использую алгоритм хэширования по умолчанию. Может это влияет?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,686   Сказал «Спасибо»: 573 раз Поблагодарили: 2303 раз в 1804 постах
|
Автор: Setix  Я использую алгоритм хэширования по умолчанию. Может это влияет? Очень сложно понять... А где его указываете? Мы это не обсуждали. Я проверил в 2х разных версиях (Delphi 7 и актуальной 10.3 RIO), всё работает, проверяется в любом софте (КриптоАРМ и т.п.). Мой код пробовали собрать, на чистом приложении, без своих исправлений? Вот готовое приложение: + поиск как по серийному номеру, так и по отпечатку Код:
uses ... COMOBJ, ActiveX..
function GetSignerCertificate (ThumbprintOrSerialNumber: AnsiString; var res: Olevariant): boolean;
var
Store: Olevariant;
Crts: OleVariant;
count: longint;
ii: longint;
Crt: OleVariant;
begin
Result := False;
Store := COMOBJ.CreateOleObject('CAdESCOM.Store');
Store.Open(2);
Crts := Store.Certificates;
count := Crts.Count;
for ii := 1 to count do
begin
Crt := Crts.item[ii];
if Crt.SerialNumber = ThumbprintOrSerialNumber then
begin
res := Crt;
Result := True;
break;
end;
if Crt.Thumbprint = ThumbprintOrSerialNumber then
begin
res := Crt;
Result := True;
break;
end;
end;
end;
procedure TForm2.Button2Click(Sender: TObject);
var
sSerialNumber: AnsiString;
oSigner: Olevariant;
outCTR: Olevariant;
oSignedData: OleVariant;
sSignedData: OleVariant;
Buffer: WideString;
FileStm: TFileStream;
begin
if OpenDialog1.Execute then
begin
FileStm := TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareDenyWrite);
try
Pointer(Buffer) := ActiveX.SysAllocStringByteLen(nil, FileStm.Size);
FileStm.ReadBuffer(Pointer(Buffer)^, FileStm.Size);
finally
FreeAndNil(FileStm);
end;
sSerialNumber := inputbox('Поиск сертификата', 'Введите серийный номер или отпечаток:', '01F349E07AC40CD480E8119BF4C5BB9FE2');
oSigner := COMOBJ.CreateOleObject('CAdESCOM.CPSigner'); {}
if GetSignerCertificate(sSerialNumber, outCTR) then {если нашли указанный сертификат}
begin
oSigner.Certificate := outCTR; {}
oSignedData := COMOBJ.CreateOleObject('CAdESCOM.CadesSignedData'); {}
oSignedData.ContentEncoding := 0; // или 1; {}
oSignedData.Content := Buffer; // или при ContentEncoding кодировать => 'U29tZSBEYXRhLg=='; {}
sSignedData := oSignedData.SignCades(oSigner, {CADES_BES}1, True, {CAPICOM_ENCODE_BASE64}0); {получаем подписанные данные}
Logs.Text := sSignedData;
Logs.Lines.SaveToFile(OpenDialog1.FileName+'.p7s');
Application.ProcessMessages;
try
oSignedData.VerifyCades(sSignedData, {CADES_BES}1, True); {проверяем подписанные данные}
ShowMessage('Подпись верна')
except
on E: Exception do
ShowMessage('Подпись не верна: ' + E.Message)
end;
end;
end;
end;
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 19.09.2019(UTC) Сообщений: 28  Откуда: МСК
|
В общем проблема оказалась в выделении памяти под Буфер. Файл читал методами WinApi, если не использовать выделение с помощью (Pointer(Buffer) := ActiveX.SysAllocStringByteLen(nil, FileStm.Size), то контент подписывается не верно.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close