PDFium Delphi Component Docs

Unidad FPdfCrypto

Unidad: FPdfCrypto
Fachada de proveedores de firma PAdES y validación de certificados para backends de plataforma, integraciones PKCS#11, almacenes de confianza, recuperación de revocación y validación de rutas con límites definidos

Sintaxis

TPadesPaddingScheme = (psRsaPss, psRsaPkcs1v15, psEcdsa);

TPadesSignerOptions = record
  CertificateThumbprint: string;
  PaddingScheme: TPadesPaddingScheme;
  class function Default: TPadesSignerOptions; static;
end;

TPadesChainCertArray = array of TBytes;

TPadesResolvedSigner = record
  Signer: ICmsSigner;
  SignerCertDer: TBytes;
  ChainCertDer: TPadesChainCertArray;
end;

TPdfRevocationMode = (prmNone, prmOffline, prmOnlineAllowed,
  prmOnlineRequired);
TPdfStringArray = array of string;

TPdfCertificatePathOptions = record
  ValidationTime: TDateTime;
  RevocationMode: TPdfRevocationMode;
  RequiredPolicyOids: TPdfStringArray;
  MaxCertificates: Integer;
  MaxCertificateBytes: Integer;
  MaxFetchBytes: Integer;
  MaxPathDepth: Integer;
  class function Default: TPdfCertificatePathOptions; static;
end;

TPdfCertificatePathReport = record
  Trusted: Boolean;
  PathBuilt: Boolean;
  PolicyValid: Boolean;
  RevocationChecked: Boolean;
  PathCertificateCount: Integer;
  ErrorCode: Integer;
  ErrorMessage: string;
end;

IPdfTrustStore = interface
  function LoadTrustAnchors: TPadesChainCertArray;
end;

IPdfValidationFetcher = interface
  function Fetch(const Uri: string; MaxBytes: Integer;
    out Data: TBytes): Boolean;
end;

IPdfCertificatePathValidator = interface
  function Validate(const LeafCertificate: TBytes;
    const Intermediates, TrustAnchors: TPadesChainCertArray;
    TrustStore: IPdfTrustStore; Fetcher: IPdfValidationFetcher;
    const Options: TPdfCertificatePathOptions;
    out Report: TPdfCertificatePathReport): Boolean;
end;

IPadesSignerProvider = interface
  function BackendName: string;
  function Resolve(const Options: TPadesSignerOptions): TPadesResolvedSigner;
end;

TPdfPkcs11Slot = record
  SlotID: UInt64;
  Description: string;
  TokenLabel: string;
  TokenPresent: Boolean;
end;
TPdfPkcs11Slots = array of TPdfPkcs11Slot;

TPdfPkcs11Certificate = record
  SlotID: UInt64;
  ObjectID: TBytes;
  LabelText: string;
  CertificateDer: TBytes;
  Mechanisms: TPdfStringArray;
end;
TPdfPkcs11Certificates = array of TPdfPkcs11Certificate;

IPdfPkcs11SignerProvider = interface(IPadesSignerProvider)
  function EnumerateSlots: TPdfPkcs11Slots;
  function EnumerateCertificates(SlotID: UInt64): TPdfPkcs11Certificates;
  procedure CloseProtectedSessions;
end;

TPdfCmsVerifyStatus = (pcvsUnavailable, pcvsValid, pcvsInvalid,
  pcvsUnsupported, pcvsIndeterminate);
TPdfCmsRevocationReason = (pcrrNone, pcrrCertificateRevoked, pcrrCrlExpired,
  pcrrCrlNotYetValid, pcrrCrlUnavailable, pcrrCrlSignatureInvalid,
  pcrrCrlInvalid, pcrrChainUntrusted, pcrrUnknown, pcrrOcspUnavailable,
  pcrrOcspInvalid, pcrrOcspStatusUnknown);
TPdfCmsVerifyStage = (pcvstCryptographicSignature, pcvstChainBuild,
  pcvstOnlineRetrieval, pcvstRevocationCheck);
TPdfCmsVerifyCheckpoint = procedure(Stage: TPdfCmsVerifyStage) of object;

TPdfCmsVerifyOptions = record
  OnlineRetrieval: Boolean;
  CheckRevocation: Boolean;
  CollectChainCertificates: Boolean;
  UrlRetrievalTimeoutMs: Cardinal;
  OnCheckpoint: TPdfCmsVerifyCheckpoint;
  CollectSignerDiagnostics: Boolean;
  MaxSignerCount: Integer;
  class function Default: TPdfCmsVerifyOptions; static;
end;

TPdfCmsSignerVerifyResult = record
  SignerIndex: Integer;
  SignatureStatus, TrustStatus, RevocationStatus: TPdfCmsVerifyStatus;
  SignatureError, TrustError: Cardinal;
  SignerCertificate: TBytes;
  RevocationReason: TPdfCmsRevocationReason;
  RevocationError: Cardinal;
  RevocationCertificate: TBytes;
end;
TPdfCmsSignerVerifyResults = array of TPdfCmsSignerVerifyResult;

TPdfCmsVerifyResult = record
  SignatureStatus: TPdfCmsVerifyStatus;
  TrustStatus: TPdfCmsVerifyStatus;
  RevocationStatus: TPdfCmsVerifyStatus;
  SignatureError: Cardinal;
  TrustError: Cardinal;
  SignerCertificate: TBytes;
  ChainCertificates: TPadesChainCertArray;
  RevocationReason: TPdfCmsRevocationReason;
  RevocationError: Cardinal;
  RevocationCertificate: TBytes;
  SignerResults: TPdfCmsSignerVerifyResults;
  SignerDiagnosticsStatus: TPdfCmsVerifyStatus;
  SignerCount: Integer;
end;

IPdfCmsVerifier = interface
  function BackendName: string;
  function VerifyDetached(const CmsDer: TBytes;
    Segment1: Pointer; Segment1Length: Cardinal;
    Segment2: Pointer; Segment2Length: Cardinal;
    const Options: TPdfCmsVerifyOptions): TPdfCmsVerifyResult;
  function VerifyAttached(const CmsDer: TBytes;
    const Options: TPdfCmsVerifyOptions): TPdfCmsVerifyResult;
end;

procedure ConfigurePadesCmsVerifier(const Verifier: IPdfCmsVerifier);
function PadesCmsVerificationAvailable: Boolean;
function PadesCmsVerificationBackendName: string;
function PadesCryptoAvailable: Boolean;
function PadesCryptoBackendName: string;
function ResolvePadesSigner(const Options: TPadesSignerOptions): TPadesResolvedSigner;
procedure ConfigurePdfCertificatePathValidator(
  const Validator: IPdfCertificatePathValidator);
function ValidatePdfCertificatePath(const LeafCertificate: TBytes;
  const Intermediates, TrustAnchors: TPadesChainCertArray;
  TrustStore: IPdfTrustStore; Fetcher: IPdfValidationFetcher;
  const Options: TPdfCertificatePathOptions;
  out Report: TPdfCertificatePathReport): Boolean;
procedure ConfigurePadesSignerProvider(const Provider: IPadesSignerProvider);

TPadesSignerResolverProc = function(const Options: TPadesSignerOptions): TPadesResolvedSigner;

PadesSignerResolverOverride: TPadesSignerResolverProc;
PdfCertificatePathValidator: IPdfCertificatePathValidator;
PadesSignerProvider: IPadesSignerProvider;
PadesCmsVerifier: IPdfCmsVerifier;

Descripción

FPdfCrypto es la entrada a la pila de firma PAdES; PadesCryptoAvailable indica si están disponibles el material de firma y su backend, y PadesCryptoBackendName identifica el backend seleccionado; Windows usa Cryptography Next Generation de forma predeterminada, mientras que las demás plataformas resuelven la clave privada y el certificado OpenSSL configurados explícitamente en FPdfCryptoSsl

ResolvePadesSigner recibe la huella digital de un certificado y un esquema de relleno, y devuelve un TPadesResolvedSigner completamente poblado: la implementación de ICmsSigner que ejecuta la operación de clave privada, el DER del certificado del firmante y los certificados de la cadena emisora. El resultado pasa directamente a FPdfCms.BuildSignedData

Las integraciones personalizadas pueden registrar un IPadesSignerProvider, incluido un IPdfPkcs11SignerProvider que enumera ranuras y certificados de tokens, o usar PadesSignerResolverOverride como punto de inserción determinista del resolvedor

La validación de ruta de certificados se basa en proveedores y está sujeta a presupuestos: quien llama configura un IPdfCertificatePathValidator, opcionalmente suministra anclajes de confianza explícitos, un IPdfTrustStore y un IPdfValidationFetcher, y luego inspecciona el TPdfCertificatePathReport

Funciones

FunciónDescripción
PadesCryptoAvailableDevuelve True cuando hay un backend criptográfico disponible para firmar PAdES en la plataforma actual
PadesCryptoBackendNameDevuelve el nombre para mostrar del backend criptográfico activo
ResolvePadesSignerResuelve la huella digital de un certificado y un esquema de relleno en un firmante, el certificado del firmante y la cadena
ConfigurePdfCertificatePathValidatorEstablece o borra el IPdfCertificatePathValidator de todo el proceso usado por ValidatePdfCertificatePath
ValidatePdfCertificatePathValida un certificado hoja contra los intermediarios y los anclajes explícitos y del almacén de confianza combinados, tras aplicar los presupuestos de cantidad de certificados, tamaño, obtención y profundidad de ruta
ConfigurePadesSignerProviderEstablece o borra el proveedor de firmantes de todo el proceso usado con prioridad sobre el backend de la plataforma
ConfigurePadesCmsVerifierInstala el backend de verificación CMS del validador PAdES; al quitarlo, se restaura Windows CryptoAPI en Windows; las demás plataformas necesitan una llamada explícita a ConfigureSslCmsVerifier o ConfigureKeychainCmsVerifier
PadesCmsVerificationAvailableDevuelve True cuando algún backend puede verificar CMS en esta compilación, ya sea registrado o integrado
PadesCmsVerificationBackendNameDevuelve el nombre para mostrar del backend de verificación activo, o una cadena vacía cuando no hay ninguno

Interfaces de proveedores

Miembro de interfazDescripción
IPdfTrustStore.LoadTrustAnchorsDevuelve anclajes de confianza adicionales codificados en DER, sujetos a los presupuestos de certificados configurados
IPdfValidationFetcher.FetchObtiene material de validación desde Uri sin exceder MaxBytes
IPdfCertificatePathValidator.ValidateConstruye y evalúa la ruta de certificados y llena el TPdfCertificatePathReport
IPadesSignerProvider.BackendNameDevuelve el nombre para mostrar del proveedor expuesto por PadesCryptoBackendName
IPadesSignerProvider.ResolveDevuelve el material de firmante completo para las TPadesSignerOptions suministradas
IPdfPkcs11SignerProvider.EnumerateSlotsDevuelve las ranuras PKCS#11 disponibles y los metadatos de presencia de tokens
IPdfPkcs11SignerProvider.EnumerateCertificatesDevuelve los certificados y mecanismos de firma visibles en una ranura PKCS#11
IPdfPkcs11SignerProvider.CloseProtectedSessionsCierra las sesiones PKCS#11 protegidas o autenticadas propiedad del proveedor
IPdfCmsVerifier.BackendNameDevuelve el nombre para mostrar del backend de verificación que reporta PadesCmsVerificationBackendName
IPdfCmsVerifier.VerifyDetachedVerifica una firma PDF cuyo contenido firmado son los dos rangos de bytes a ambos lados del hueco /Contents
IPdfCmsVerifier.VerifyAttachedVerifica un token de timestamp, que contiene su propio contenido y no necesita segmentos separados

Tipos

TipoDescripción
EPadesCryptoExcepción base para fallos del backend criptográfico
EPadesCryptoUnavailableSe genera cuando un backend de firmante requerido o un validador de ruta de certificados no está configurado
TPadesPaddingSchemepsRsaPss, psRsaPkcs1v15 o psEcdsa
TPadesSignerOptionsCertificateThumbprint selecciona el certificado y PaddingScheme selecciona el esquema de firma; Default usa una huella digital vacía y psRsaPss
TPadesChainCertArrayArreglo dinámico de certificados de cadena codificados en DER
TPadesResolvedSignerSigner, SignerCertDer y ChainCertDer agrupan el firmante resuelto y el material de certificados
TPdfRevocationModeprmNone, prmOffline, prmOnlineAllowed o prmOnlineRequired
TPdfStringArrayArreglo dinámico de cadenas usado para OID de políticas y nombres de mecanismos de proveedores
TPdfCertificatePathOptionsValidationTime, RevocationMode, RequiredPolicyOids, MaxCertificates, MaxCertificateBytes, MaxFetchBytes y MaxPathDepth controlan la validación y los presupuestos de recursos; Default selecciona revocación sin conexión con límites de 64 certificados, 4 MiB por certificado, 16 MiB de datos obtenidos y profundidad de ruta 16
TPdfCertificatePathReportTrusted, PathBuilt, PolicyValid, RevocationChecked, PathCertificateCount, ErrorCode y ErrorMessage informan el resultado de la validación
TPdfPkcs11SlotSlotID, Description, TokenLabel y TokenPresent describen una ranura PKCS#11
TPdfPkcs11SlotsArreglo dinámico de registros TPdfPkcs11Slot
TPdfPkcs11CertificateSlotID, ObjectID, LabelText, CertificateDer y Mechanisms describen un certificado de token
TPdfPkcs11CertificatesArreglo dinámico de registros TPdfPkcs11Certificate
TPadesSignerResolverProcTipo de puntero a función para la variable de inyección PadesSignerResolverOverride
TPdfCmsVerifyStatuspcvsUnavailable, pcvsValid, pcvsInvalid, pcvsUnsupported o pcvsIndeterminate
TPdfCmsRevocationReasonpcrrNone, pcrrCertificateRevoked, pcrrCrlExpired, pcrrCrlNotYetValid, pcrrCrlUnavailable, pcrrCrlSignatureInvalid, pcrrCrlInvalid, pcrrChainUntrusted, pcrrUnknown, pcrrOcspUnavailable, pcrrOcspInvalid o pcrrOcspStatusUnknown describen la evidencia de revocación por separado del estado de verificación
TPdfCmsVerifyStagepcvstCryptographicSignature, pcvstChainBuild, pcvstOnlineRetrieval o pcvstRevocationCheck
TPdfCmsVerifyCheckpointCallback de método de objeto que recibe cada TPdfCmsVerifyStage conforme avanza la verificación
TPdfCmsVerifyOptionsOnlineRetrieval, CheckRevocation, CollectChainCertificates, UrlRetrievalTimeoutMs y OnCheckpoint controlan la verificación; CollectSignerDiagnostics solicita instantáneas por firmante y MaxSignerCount limita su número; Default deshabilita recuperación, revocación y diagnósticos de firmantes, fija un plazo de recuperación de 15 segundos y limita las instantáneas a 64
TPdfCmsSignerVerifyResultSignerIndex identifica el orden codificado de SignerInfo; los estados de firma, confianza y revocación, junto con los errores nativos, describen ese firmante por separado; SignerCertificate es su certificado DER y RevocationCertificate identifica el certificado asociado a un error de revocación capturado, si el backend puede proporcionarlo
TPdfCmsSignerVerifyResultsArreglo dinámico de instantáneas de firmantes con límites definidos
TPdfCmsVerifyResultLos estados agregados de firma, confianza y revocación siguen siendo independientes; el registro también devuelve SignatureError, TrustError, SignerCertificate, ChainCertificates, RevocationReason, RevocationError, RevocationCertificate, SignerResults, SignerDiagnosticsStatus y SignerCount

Diagnósticos de revocación

Al actualizar hay que recompilar los consumidores, porque crecieron los registros públicos de opciones y resultados; los verificadores personalizados deben inicializar los registros administrados con Default(TPdfCmsVerifyResult) y dejar no disponibles los campos de instantánea que no admitan; no borre con FillChar un registro activo que contenga cadenas o arreglos dinámicos

Lea RevocationReason y RevocationError del TPdfCmsVerifyResult que devuelven IPdfCmsVerifier.VerifyDetached o VerifyAttached. La validación de confianza PAdES los conserva como RevocationReason y NativeRevocationError, con campos aparte de TimeStampRevocationReason y NativeTimeStampRevocationError para los tokens de timestamp; los informes de evidencia incluyen ambos pares

RevocationError es un código nativo de verificación específico del backend; cero significa que no se capturó ningún diagnóstico nativo. OpenSSL usa el espacio de errores X509_V_ERR_*. Windows preserva un DWORD sin procesar tomado del CERT_REVOCATION_INFO.dwRevocationResult de un certificado, o de GetLastError si su llamada de cadena de revocación falla; no es un espacio de errores HRESULT uniforme ni la máscara de bits agregada de confianza de cadena

OpenSSL distingue la revocación confirmada de evidencia CRL vencida, no disponible o inválida, y de evidencia OCSP no disponible, inválida o de estado desconocido; Windows informa revocación confirmada, cadenas no confiables o una falla nativa desconocida; el verificador macOS evalúa por separado integridad de firma, confianza Basic X.509 y revocación, y devuelve errores nativos de Security.framework sin convertir toda falla de plataforma en una clasificación CRL u OCSP

RevocationCertificate puede identificar un certificado intermedio revocado, no necesariamente el firmante CMS; queda vacío si el backend no puede capturarlo; OpenSSL puede recopilarlo, mientras que el backend macOS actual lo deja vacío

Ni pcrrNone ni un error en cero prueban que la revocación se verificó o tuvo éxito; revise siempre RevocationStatus

Diagnósticos por firmante

Establezca CollectSignerDiagnostics=True para revisar instantáneas limitadas en SignerResults; SignerCount es la cantidad codificada de SignerInfo cuando se pudo determinar; cero indica que no se estableció ese conteo

SignerDiagnosticsStatus=pcvsValid indica que las instantáneas solicitadas están completas, incluidas las de firmas inválidas; no significa que todas las firmas sean válidas; pcvsUnavailable indica recopilación deshabilitada o no compatible, y pcvsIndeterminate que el backend no pudo completarla dentro de sus límites de análisis o recursos

OpenSSL y la implementación nativa macOS limitan la recopilación a 64 firmantes; OpenSSL también limita la entrada CMS de diagnóstico a 4 MiB y el trabajo agregado de entrada y salida a 64 MiB; macOS limita los certificados devueltos a 4 MiB por certificado y 64 MiB en total; un MaxSignerCount menor reduce además la cantidad solicitada

Las instantáneas reutilizan la evidencia configurada y la recuperada durante la verificación agregada; OpenSSL no vuelve a consultar la red por cada instantánea, y una recuperación agregada incompleta no puede convertirse en una instantánea offline de revocación exitosa

Backend de firma predeterminado

PadesSignerResolverOverride tiene prioridad, seguido de un IPadesSignerProvider registrado explícitamente y del backend predeterminado de plataforma; los destinos fuera de Windows necesitan ConfigureSslSigningCredentials; disponer de libcrypto no proporciona una clave privada ni un certificado

El backend OpenSSL predeterminado rechaza un CertificateThumbprint no vacío, porque el certificado ya fue seleccionado mediante configuración explícita; la firma Keychain sigue disponible con ConfigureKeychainSignerProvider si la aplicación elige ese proveedor

Variables globales de proveedores

VariableDescripción
PadesSignerResolverOverrideDevolución de llamada de resolución opcional evaluada antes que los proveedores registrados y de plataforma
PadesCmsVerifierBackend de verificación CMS actual, normalmente asignado mediante ConfigurePadesCmsVerifier
PdfCertificatePathValidatorValidador de ruta de certificados actual, normalmente asignado mediante ConfigurePdfCertificatePathValidator
PadesSignerProviderProveedor de firmantes actual, normalmente asignado mediante ConfigurePadesSignerProvider

Ver también

FPdfCms, FPdfCryptoWin, FPdfCryptoSsl, FPdfCryptoMac, FPdfCryptoOcsp, FPdfTsa, TPdf.SignPades