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

Уведомление

Icon
Error

2 Страницы<12
Опции
К последнему сообщению К первому непрочитанному
Offline Setix  
#11 Оставлено : 21 июля 2022 г. 15:12:11(UTC)
Setix

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

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

Автор: two_oceans Перейти к цитате

Еще кажется не разыменовали pCert в коде выше (так как PCERT_CONTEXT суть указатель и прежде чем работать с полями контекста сертификата надо ставить крышечку).

Delphi само разыменует, крышка обязательна в том случае если элемент конечный. Т.е. если бы я находил значение ссылки и pCert был последним элементом то:
Код:

var CERT:CERT_CONTEXT;
    pCERT:PCERT_CONTEXT;
begin 
  //если нужно значение ссылки/адреса/указателя.
  CERT:=pCERT^;
  //но для полей класса можно применять оба варианта они равнозначны:
  CERT.pbCertEncoded=pCERT^.pbCertEncoded;
  CERT.pbCertEncoded=pCERT.pbCertEncoded;
end;

Delphi в этом плане не требует строгости.

Автор: two_oceans Перейти к цитате

Честно, я не рекомендую обращаться по индексу к символам в типе PAnsiChar. Причина в том, что этот тип "прыгает" в памяти если что-то делать с символами, еще и преобразования string в PAnsiChar потом еще и char в byte, выйдет мешанина из случайного заполнения памяти. Необходимости копировать из контекста сертификата нет.

функция BytesToHex взята с поста на форуме. Я добавил лишь проверку на корректность поданных параметров.
Теперь по поводу вашего аналога:
Автор: two_oceans Перейти к цитате

type bytearr=array[0..262143] of byte; -ставите ограничение в ~300кб.... А если размер больше?


Если уже на то пошло, то тогда проще делать так:
Код:

Function CertificateToHEX(pCert:PCERT_CONTEXT):String;
var
  i: integer;
  certValue: string;
begin
  Result:='';
  if Assigned(pCert) then
    if pCert.cbCertEncoded>0 then
      for I:=0 to pCert.cbCertEncoded-1 do
        Result:=Result+IntToHex(pCert.pbCertEncoded[i],2);
end;

Отредактировано пользователем 21 июля 2022 г. 18:08:54(UTC)  | Причина: Не указана

Offline Setix  
#12 Оставлено : 22 июля 2022 г. 16:02:55(UTC)
Setix

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

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

Так как нет ответа, то копаю дальше...
При вызове функции CPSign: согласно постам на форуме выполняется JS: CPPDFDSig.js.
Хотелось бы уточнить какой из?
1. C:\Program Files (x86)\Adobe\...\Acrobat\Javascripts\CPPDFDSig.js
2. C:\Program Files (x86)\Crypto Pro\PDF\CPPDFDSig.js
3. ... .
Offline Новожилова Елена  
#13 Оставлено : 25 июля 2022 г. 9:53:07(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Здравствуйте!
В нашей документации указано:

Цитата:
При запуске программы Adobe Acrobat будут автоматически загружены все доступные файлы с расширением *.js из директории <путь установки приложения Adobe Acrobat>\Acrobat\Javascripts


Сложно оценить корректность кода "из поста на форуме", советую брать за основу наши примеры из документации:

Цитата:
Ниже приведен пример кода JavaScript, осуществляющий формирование невидимой ЭП в документе:
Код:
// объект текущего документ
var doc = this;
// создать объект невидимой подписи
var f = doc.addField('MySignature', 'signature', 0, [0,0,0,0]);
// получить обработчик КриптоПро PDF
var engine = security.getHandler('CryptoPro PDF');
// загрузить сертификат из файла c:\path\mycert.cer
var c = security.importFromFile({ cType:'Certificate', cDIPath:'/c/path/mycert.cer', bUI:false });
// инициализация
engine.login({ oParams:{ oEndUserSignCert:c } });
// дополнительная информация
var s = { reason: 'MyReason', location: 'Moscow' };
// вычисление ЭП
f.signatureSign({ oSig: engine, oInfo: s, bUI: false }))

Отредактировано пользователем 25 июля 2022 г. 9:58:33(UTC)  | Причина: Не указана

Offline Setix  
#14 Оставлено : 25 июля 2022 г. 10:57:32(UTC)
Setix

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

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

Автор: Новожилова Елена Перейти к цитате
советую брать за основу наши примеры из документации

В выходные пришлось изучать JS чтобы понять, что там написано Вашей компанией, выяснилось что в этой строчке происходит exception в результате подачи не корректной подписи:
Код:

var res = signatureField.signatureSign({ oSig: theEngine, oInfo: signatureParameters, bUI: bShowSignDialogs });

При этом возвращается фраза ("документ не подписан.") - причину удалось выяснить методом перебора. Теперь читаю инструкцию Adobe, как корректно описать параметр подписи. Согласно Вашему JS он может быть подан 2 способами: в виде строки или в виде объекта. В виде строки необходимо указать ряд обязательных полей и значений к ним. В виде объекта еще не разбирался...

Отредактировано пользователем 25 июля 2022 г. 10:59:52(UTC)  | Причина: Не указана

Offline Новожилова Елена  
#15 Оставлено : 25 июля 2022 г. 11:04:40(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Конечно же, для того, чтобы использовать JS - его нужно изучать. Это относится к любому языку.
И разумеется, используя JS API от Adobe, нужно уметь работать и с ним.

Для пользователей - есть готовые утилиты.
Offline Setix  
#16 Оставлено : 25 июля 2022 г. 11:15:19(UTC)
Setix

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

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

Автор: Новожилова Елена Перейти к цитате
Конечно же, для того, чтобы использовать JS - его нужно изучать. Это относится к любому языку.
И разумеется, используя JS API от Adobe, нужно уметь работать и с ним.

Для пользователей - есть готовые утилиты.


У меня задача интегрировать подписание документов формата PDF в собственное ПО. Использую Acrobat_TLB + КриптоПро PDF. Так как часть ошибок в Вашем JS съедается (true, не подписан), становится не понятно, какие из параметров поданы не корректно.
Вот кусок кода с CPPDFDSig.js:
Код:

    try {
        switch (pdfLockMode) {
            case 0:
                break;
            case 1:
                signatureField.signatureSetSeedValue({ lockDocument: "true", flags: 128});
                break;
            case 2:
                signatureField.signatureSetSeedValue({ mdp: "allowNone" });
                break;
            case 3:
                signatureField.signatureSetSeedValue({ mdp: "default" });
                break;
            case 4:
                signatureField.signatureSetSeedValue({ mdp: "defaultAndComments" });
                break;
        }
        var res = signatureField.signatureSign({ oSig: theEngine, oInfo: signatureParameters, bUI: bShowSignDialogs });
        if (res != true) {
            throw false;
        }
        signResult = true;
    }
    catch (ex) {
        app.endPriv();

        var exceptionMessage = "Документ не подписан. ";
        if (typeof (ex.message) !== 'undefined') {
            exceptionMessage += ex.message + " ";
        }
        if (typeof (ErrorInfo.Message) !== 'undefined') {
            exceptionMessage += ErrorInfo.Message;
        }
        return exceptionMessage;
    }

Вот в этом куске кода: если не удалось подписать вы создаете Exception. Неужели в Acrobat не возможно отследить ошибку?
Код:

var res = signatureField.signatureSign({ oSig: theEngine, oInfo: signatureParameters, bUI: bShowSignDialogs });
    if (res != true) {throw false;}

Отредактировано пользователем 25 июля 2022 г. 11:27:53(UTC)  | Причина: Не указана

Offline two_oceans  
#17 Оставлено : 1 августа 2022 г. 11:33:57(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 395 раз в 366 постах
Автор: Setix Перейти к цитате
Цитата:
type bytearr=array[0..262143] of byte;
-ставите ограничение в ~300кб.... А если размер больше?
Во-первых, потому и ставлю, что это скорее невозможно получить такой огромный сертификат. На данный момент времени есть огромные списки отзыва, соответственно есть огромные же результаты подписания с приложением списков отзыва на момент подписания - для них нужно ставить больше, несколько МБ не редкость.

Цепочки сертификатов тоже могут быть из 3-5 сертификатов. Однако если говорить об одиночном квалифицированном сертификате без дополнительных данных, который получается из pCertEncoded, то там размер от примерно 600-800 байт до 5-6 КБ. Конкретно сертификаты актуальные в этом году в моем окружении от 2,16 до 2,62 КБ. 5-6 КБ было ранее с кучей оидов СУФД (33 вроде бы насчитывали у кого-то). Синтетически можно конечно добавить еще чего-то, но, например, обсуждали, что тех же оидов невозможно добавить больше примерно 1020, пусть длина у них 7 или 8 байт, плюс кодирование 2 байта. Получается синтетический тест на примерно 13 КБайт. Большинство аккредитованных УЦ не дают включать какие-то левые расширения и оиды не по шаблону сертификата. Серьезно, если кто видел реальный боевой квалифицированный сертификат 10 КБ или больше, актуальный в 2022 году, то пожалуйста покажите чем его так нагрузили. С учетом 3-5 сертификатов в цепочке, это максимум 50 Кбайт, так как сертификаты УЦ содержат меньше расширений и короче. Итого, мое ограничение в 256 КБ с запасом от 5 до 100 раз.

Во-вторых, если память выделяется getmem, то нам в принципе все равно какое определение у типа, выделить можно и больше памяти, сколько потребуется. В идеале наверно надо бы еще и cbCertEncoded проверять на вменяемое значение. Как Вы уже упоминали выше среды достаточно умны и дают адресовать больше памяти, если выделите больше памяти. Половина буферов под различные криптографические блобы в Winapi определена как [0..0] of byte; и работе с индексами 1, 2 и т.д. это не мешает.

В том же дельфи (или даже вообще в средах с паскалем) вся память сначала проходит через внутренний менеджер памяти, который выделяет у системы целую страницу памяти, потом режет маленькими кусочками по потребностям программы. Кусочек который реально расходуется немного больше чем у менеджера запросили, в начало пишет служебные данные о кусочке, в конец пишет специальное значение, адрес серединки возвращает прикладной программе. Если специальное значение после какой-то записи в буфер не совпало - значит буфер переполнился, ловите исключение от менеджера памяти. В то же время память, полученная от системы большим куском могла не переполнится и системного исключения не будет, программа испортила только свои данные. Если специальное значение не нарушено, то все зависит от включения/выключения проверки индекса. При включенной проверке конечно получите Subscript out of range, но если для конкретного участка кода проверки вырублена, то даже не пикнет как будто так и есть.

К слову, Assigned(pCert) в конкретном случае мне не внушает доверия. Память, возвращенная как контекст сертификата - системная, она выделена мимо менеджера памяти Дельфи, что именно Дельфи сможет проверить внутри Assigned(...) для меня остается под вопросом, предполагаю, что только неравенство nil. Память, выделенную через Дельфи, тестируйте Assigned() - вопросов нет. Системную же память на мой взгляд надежнее тестировать системной же функцией IsBadReadPtr(), так как и кроме nil большая часть адресного пространства процесса - это недопустимые адреса (ну сколько Ваша программа у системы выделит с учетом всех системных библиотек - пусть 100 МБ, а адресное пространство 32 бит до 4 ГБайт, 64 бит около 16000 ТБ).

Что касается создания исключения в коде JS, то мое впечатление: есть несколько источников ошибки - одни сразу в исключении, другие в ErrorInfo и создание "лишнего пустого" исключения при res!=true как раз позволяет данные от ErrorInfo обработать вместе с прочими исключениями, чтобы не писать код для добавления "Документ не подписан. " дважды.
Чисто декоративная техника как все исключения погасить в текст. Обработчик catch(ex) гасит это исключение (ведь инструкции на подъем исключения обработчику выше нет), то есть до уровней выше оно не дойдет, просто функция возвратит "Документ не подписан. " плюс какое-то описание. Вроде бы аналог того, как в Дельфи исключения срабатывают. Кто-то обходится без них, кто-то половину кода вписывает в обработчики.

Отредактировано пользователем 1 августа 2022 г. 11:38:41(UTC)  | Причина: Не указана

Offline Setix  
#18 Оставлено : 6 сентября 2022 г. 14:22:13(UTC)
Setix

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

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

Выяснилось, что только полная версия Adobe Acrobat DC подписывает документ, демонстрационная версия не обладает всеми возможностями. При установке полной версии подписание документа стало работать...

Отредактировано пользователем 6 сентября 2022 г. 14:23:06(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
2 Страницы<12
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.