Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

4 Страницы«<234
Опции
К последнему сообщению К первому непрочитанному
Offline Setix  
#31 Оставлено : 25 сентября 2019 г. 12:58:51(UTC)
Setix

Статус: Участник

Группы: Участники
Зарегистрирован: 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; {}
то файл результат не верный.

Offline Setix  
#32 Оставлено : 25 сентября 2019 г. 13:03:52(UTC)
Setix

Статус: Участник

Группы: Участники
Зарегистрирован: 19.09.2019(UTC)
Сообщений: 28
Российская Федерация
Откуда: МСК

Я использую алгоритм хэширования по умолчанию. Может это влияет?
Offline Андрей Писарев  
#33 Оставлено : 25 сентября 2019 г. 13:13:14(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,691
Мужчина
Российская Федерация

Сказал «Спасибо»: 500 раз
Поблагодарили: 2044 раз в 1585 постах
Автор: 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;
Техническую поддержку оказываем тут
Наша база знаний
Offline Setix  
#34 Оставлено : 25 сентября 2019 г. 18:37:30(UTC)
Setix

Статус: Участник

Группы: Участники
Зарегистрирован: 19.09.2019(UTC)
Сообщений: 28
Российская Федерация
Откуда: МСК

В общем проблема оказалась в выделении памяти под Буфер. Файл читал методами WinApi, если не использовать выделение с помощью (Pointer(Buffer) := ActiveX.SysAllocStringByteLen(nil, FileStm.Size), то контент подписывается не верно.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
4 Страницы«<234
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.