Сертификационные подписи и блокировки полей

HotPDF может создавать структуры прав PDF, привязанные к сертификационным подписям и подписанным блокировкам полей, а затем инспектировать те же структуры в загруженном документе

API производителя

procedure AddCertificationSignatureField(
  const FieldName: AnsiString;
  Rectangle: TRect;
  Permission: THPDFDocMDPPermission;
  ContentsBytes: Integer = 8192;
  const SubFilter: AnsiString = 'adbe.pkcs7.detached';
  const Reason: AnsiString = '';
  const Location: AnsiString = '';
  const ContactName: AnsiString = '';
  Flags: THPDFFormFieldFlags = []);

procedure ConfigureCertificationSignature(
  const FieldName: AnsiString;
  Permission: THPDFDocMDPPermission);

procedure AttachSignatureFieldLock(
  const FieldName: AnsiString;
  Action: THPDFFieldLockAction;
  const Fields: array of AnsiString);

AddCertificationSignatureField объединяет создание подписанного заполнителя с настройкой сертификации

ConfigureCertificationSignature предназначен для существующего созданного подписанного заполнителя и требует, чтобы это поле было первым полем, несущим словарь подписи

Документ может содержать только одну сертификационную подпись, поэтому второй запрос на настройку отклоняется до изменения графа объектов

Эти API автоматически согласуют вывод в формате PDF 1.5

Уровни прав DocMDP

Значение Право сертификации
dmpNoChangesПосле сертификации изменения не разрешены
dmpFormFillAndSignРазрешены заполнение формы, создание экземпляра шаблона и подписание
dmpFormFillSignAndAnnotateРазрешены предыдущие изменения, а также создание, удаление и изменение аннотаций

dmpNone зарезервирован для результатов инспекции без преобразования DocMDP и отклоняется методами производителя

Области блокировки полей

Значение Аргумент Fields Действие после подписания
flaAllДолжен быть пустымБлокирует каждое поле формы
flaIncludeОдно или несколько уникальных имён полейБлокирует только перечисленные поля
flaExcludeОдно или несколько уникальных имён полейБлокирует каждое поле, кроме перечисленных

AttachSignatureFieldLock отклоняет пустые имена, повторяющиеся имена, недопустимые значения действия, несовместимую структуру Fields, неподписанное целевое поле или поле, которое уже несёт блокировку или политику FieldMDP

Формируемая структура

Пример на Delphi

var
  LockedFields: THPDFAnsiStringArray;
begin
  HotPDF.CurrentPage.AddTextField(
    'InternalCode', '', Rect(40, 80, 220, 108));

  HotPDF.CurrentPage.AddCertificationSignatureField(
    'CertSig', Rect(40, 140, 260, 190),
    dmpFormFillAndSign, 8192,
    'adbe.pkcs7.detached', 'Document approval');

  SetLength(LockedFields, 1);
  LockedFields[0] := 'InternalCode';
  HotPDF.CurrentPage.AttachSignatureFieldLock(
    'CertSig', flaInclude, LockedFields);
end;

Загруженная инспекция

function GetLoadedSignaturePermissions(
  SigIndex: Integer;
  out Info: THPDFSignaturePermissionInfo): Boolean;

Модуль чтения сообщает право DocMDP, связь Catalog, область SigFieldLock, область FieldMDP, имена полей, структурную корректность и строку диагностической проблемы

Проверяются требуемые прямые и непрямые формы, цели /Perms Catalog, версии transform, дублирующиеся ссылки, ограничения UR против UR3 и опциональный /P 2 default

Если присутствуют и SigFieldLock, и FieldMDP, их действия и списки полей должны совпадать

Модуль чтения выполняет ограниченную инспекцию словарей и массивов и не выполняет JavaScript, действия или содержимое подписи

Граница проверки

МетодСообщаемая политика
DocMDPПраво сертификации и совпадающая цель Catalog /Perms /DocMDP
URПрава на документ, аннотации, форму, подписи и встроенные файлы плюс legacy /UR или побайтовый диапазон /UR3
FieldMDPОбласть блокировки полей All, Include или Exclude и скопированное соглашение SigFieldLock
IdentityЦиклобезопасные транзитивные номера объектов, достижимые из требуемого непрямого /Data корня

Неизвестные имена методов сохраняются в UnknownTransformMethods и делают структуру прав недействительной, чтобы критичный transform нельзя было упустить

Граница валидации

GetLoadedSignaturePermissions сообщает только о структуре политики

VerifyLoadedSignature продолжает отдельно сообщать о криптографической целостности

AnalyzeLoadedSignatureRevisions выполняет поревизионный анализ семантических изменений для политик DocMDP, FieldMDP, UR3 и Identity с диапазоном байтов, тогда как устаревшие подписи UR object digest без диапазона байтов остаются доступны структурному осмотру

SaveIncrementalUpdateAuthenticated превращает осмотр в принуждение: читает политики из их подписанных снимков, аутентифицирует управляющие подписи, валидирует все последующие ревизии и публикует через атомарную замену только после успеха всех политик

Производительность

Проверка производителя сканирует только созданные поля AcroForm и небольшой массив ссылок на подписи, тогда как загруженная инспекция считывает только выбранную подпись, её блокировку, её ссылки и элемент прав каталога

Ни одно содержимое страницы, поток изображений, программа шрифта или несвязанный косвенный объект не декодируется

См. также