THotPDF.ValidatePDFMACChain Method
校验从最早的 xref 节到当前修订版本之间的每个 PDF MAC 修订版本,并返回针对各修订版本的完整性诊断
声明
function ValidatePDFMACChain(const FileName: TFileName; const Password: AnsiString; out ValidationInfo: THPDFPDFMACChainValidationInfo): boolean; overload;
function ValidatePDFMACChain(const FileName: TFileName; const Password: AnsiString; const Options: THPDFPDFMACOptions; out ValidationInfo: THPDFPDFMACChainValidationInfo): boolean; overload;
Validation model
- 修订版本索引从 0 开始,按从原始修订版本到当前修订版本的顺序排列
- 第一个包含
AuthCode的修订版本成为链的锚点,之后的每个修订版本都必须包含有效的 PDF MAC - 每个 MAC 都针对精确的字节前缀进行校验,该前缀止于该修订版本对应的
startxref和%%EOF边界 - 即使更新的当前修订版本 MAC 仍然有效,校验器也会拒绝被替换过的历史 MAC
KDFSalt在锚点之后必须保持不变,且相邻的已校验 MAC 修订版本之间,摘要强度不得降低- 每个修订版本都会检查经过认证的
/P和/Perms值,包括 PDF MAC 要求的权限位
Result records
THPDFPDFMACChainValidationInfo reports RevisionCount, FirstMACRevisionIndex, ValidatedRevisionCount, FailureRevisionIndex, FailureXRefOffset, permission coverage, salt stability, digest monotonicity, and one THPDFPDFMACRevisionValidation record per revision
THPDFPDFMACChainFailure distinguishes revision-boundary errors, missing MACs, invalid or replaced MACs, changed KDFSalt, digest downgrade, and authenticated permission downgrade
实现只枚举一次修订版本链,并更新同一个累积的 xref 状态,避免生成临时的 PDF 副本和重复建立对象索引,同时对每个受保护的修订版本仍保持独立的密码学校验
Delphi 示例
var
ChainInfo: THPDFPDFMACChainValidationInfo;
begin
if not PDF.ValidatePDFMACChain('authenticated.pdf', 'user-password',
ChainInfo) then
raise Exception.CreateFmt('Revision %d at xref %d failed: %s',
[ChainInfo.FailureRevisionIndex, ChainInfo.FailureXRefOffset,
ChainInfo.Message]);
end;
Preflight
CreatePreflightReport 通过 PDFMACRevisionChain 暴露同样的结果,使自动化流程能区分“当前修订版本有效”和“完整修订版本链有效”
只需检查当前修订版本时,请参阅 ValidatePDFMAC;摘要策略的语义请参阅 PDF MAC Algorithm Agility and Policy Profiles