Método THotPDF.ValidatePDFMACChain
Valida cada revisión de PDF MAC desde la sección de cross-reference más antigua hasta la revisión activa y devuelve diagnósticos de integridad específicos por revisión
Declaración
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;
Modelo de validación
- Los índices de revisión son base cero y van ordenados desde la revisión original hasta la activa
- La primera revisión que contiene
AuthCodese convierte en el ancla de la cadena, y cada revisión posterior debe contener un PDF MAC válido - Cada MAC se verifica contra el prefijo de bytes exacto que termina en el boundary
startxrefy%%EOFcorrespondiente a esa revisión - El validador rechaza un MAC histórico reemplazado incluso cuando el MAC de una revisión activa más nueva sigue siendo válido
KDFSaltdebe permanecer estable después del ancla, y la fuerza del digest no puede bajar entre las revisiones de MAC validadas- Los valores autenticados
/Py/Permsse verifican por revisión, incluido el bit de permiso que exige PDF MAC
Records de resultado
THPDFPDFMACChainValidationInfo reporta RevisionCount, FirstMACRevisionIndex, ValidatedRevisionCount, FailureRevisionIndex, FailureXRefOffset, la cobertura de permisos, la estabilidad del salt, la monotonía del digest y un record THPDFPDFMACRevisionValidation por revisión
THPDFPDFMACChainFailure distingue errores de boundary de revisión, MACs faltantes, MACs inválidos o reemplazados, KDFSalt cambiado, downgrade de digest y downgrade de permisos autenticados
La implementación enumera la cadena de revisiones una sola vez y actualiza un único estado acumulado de cross-reference, evitando copias temporales del PDF e indexados repetidos de objetos, a la vez que preserva la verificación criptográfica independiente de cada revisión protegida
Ejemplo en 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 expone el mismo resultado como PDFMACRevisionChain, lo que permite a los flujos automatizados distinguir la validez de la revisión activa de la validez de toda la cadena de revisiones
Vea ValidatePDFMAC cuando solo haya que verificar la revisión activa, o PDF MAC Algorithm Agility and Policy Profiles para la semántica de la política de digests