PDFium Delphi Component Docs

Unidad FPdfCrypto

Unidad: FPdfCrypto
Fachada de proveedores de firmantes PAdES y de validación de certificados para backends de plataforma, integraciones PKCS#11, almacenes de confianza, captadores de revocación y validación de rutas acotada

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 el punto de entrada al sistema 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 por defecto, mientras que las demás plataformas resuelven la clave privada y el certificado OpenSSL configurados explícitamente en FPdfCryptoSsl

ResolvePadesSigner toma una huella de certificado y un esquema de relleno y devuelve un TPadesResolvedSigner totalmente relleno: la implementación de ICmsSigner que realiza la operación de clave privada, el DER del certificado del firmante y los certificados de la cadena emisora. El resultado se 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 costura determinista del resolvedor

La validación de rutas de certificados se basa en proveedores y está presupuestada: los llamadores configuran un IPdfCertificatePathValidator, opcionalmente suministran anclajes de confianza explícitos, un IPdfTrustStore y un IPdfValidationFetcher, y luego inspeccionan el TPdfCertificatePathReport

Funciones

FunciónDescripción
PadesCryptoAvailableDevuelve True cuando hay un backend criptográfico disponible para la firma PAdES en la plataforma actual
PadesCryptoBackendNameDevuelve el nombre visible del backend criptográfico activo
ResolvePadesSignerResuelve una huella de certificado y un esquema de relleno en un firmante, el certificado del firmante y la cadena
ConfigurePdfCertificatePathValidatorEstablece o borra el IPdfCertificatePathValidator a nivel de proceso usado por ValidatePdfCertificatePath
ValidatePdfCertificatePathValida un certificado hoja contra los intermedios y los anclajes combinados explícitos y del almacén de confianza tras imponer los presupuestos de recuento, tamaño, captura y profundidad de ruta de los certificados
ConfigurePadesSignerProviderEstablece o borra el proveedor de firmantes a nivel de proceso usado por delante del backend de plataforma
ConfigurePadesCmsVerifierInstala el backend de verificación CMS que utiliza el validador PAdES; al borrarlo, Windows restaura CryptoAPI. En otras plataformas se necesita una llamada explícita a ConfigureSslCmsVerifier o ConfigureKeychainCmsVerifier
PadesCmsVerificationAvailableDevuelve True cuando algún backend puede verificar CMS en esta compilación, ya esté registrado o integrado
PadesCmsVerificationBackendNameDevuelve el nombre visible del backend de verificación activo, o una cadena vacía si no hay ninguno

Interfaces de proveedor

Miembro de interfazDescripción
IPdfTrustStore.LoadTrustAnchorsDevuelve anclajes de confianza adicionales codificados en DER sujetos a los presupuestos de certificados configurados
IPdfValidationFetcher.FetchCaptura material de validación desde Uri sin exceder MaxBytes
IPdfCertificatePathValidator.ValidateConstruye y evalúa la ruta de certificados y rellena el TPdfCertificatePathReport
IPadesSignerProvider.BackendNameDevuelve el nombre visible 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 token
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 visible del backend de verificación que informa 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 lleva su propio contenido y no necesita segmentos separados

Tipos

TipoDescripción
EPadesCryptoExcepción base para los fallos del backend criptográfico
EPadesCryptoUnavailableSe lanza cuando un backend de firmante requerido o un validador de rutas de certificados no está configurado
TPadesPaddingSchemepsRsaPss, psRsaPkcs1v15 o psEcdsa
TPadesSignerOptionsCertificateThumbprint selecciona el certificado y PaddingScheme selecciona el esquema de firma; Default usa una huella vacía y psRsaPss
TPadesChainCertArrayMatriz dinámica de certificados de cadena codificados en DER
TPadesResolvedSignerSigner, SignerCertDer y ChainCertDer agrupan el firmante resuelto y el material del certificado
TPdfRevocationModeprmNone, prmOffline, prmOnlineAllowed o prmOnlineRequired
TPdfStringArrayMatriz dinámica de cadenas usada para OID de políticas y nombres de mecanismos de proveedores
TPdfCertificatePathOptionsValidationTime, RevocationMode, RequiredPolicyOids, MaxCertificates, MaxCertificateBytes, MaxFetchBytes y MaxPathDepth controlan los presupuestos de validación y de recursos; Default selecciona revocación sin conexión con límites de 64 certificados, 4 MiB por certificado, 16 MiB de datos capturados y profundidad de ruta 16
TPdfCertificatePathReportTrusted, PathBuilt, PolicyValid, RevocationChecked, PathCertificateCount, ErrorCode y ErrorMessage informan del resultado de la validación
TPdfPkcs11SlotSlotID, Description, TokenLabel y TokenPresent describen una ranura PKCS#11
TPdfPkcs11SlotsMatriz dinámica de registros TPdfPkcs11Slot
TPdfPkcs11CertificateSlotID, ObjectID, LabelText, CertificateDer y Mechanisms describen un certificado de token
TPdfPkcs11CertificatesMatriz dinámica de registros TPdfPkcs11Certificate
TPadesSignerResolverProcTipo puntero a función para el var de inyección PadesSignerResolverOverride
TPdfCmsVerifyStatuspcvsUnavailable, pcvsValid, pcvsInvalid, pcvsUnsupported o pcvsIndeterminate
TPdfCmsRevocationReasonpcrrNone, pcrrCertificateRevoked, pcrrCrlExpired, pcrrCrlNotYetValid, pcrrCrlUnavailable, pcrrCrlSignatureInvalid, pcrrCrlInvalid, pcrrChainUntrusted, pcrrUnknown, pcrrOcspUnavailable, pcrrOcspInvalid o pcrrOcspStatusUnknown explican 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 a medida que 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 desactiva la recuperación, la revocación y los diagnósticos por firmante, fija un presupuesto 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 y los errores nativos describen a ese firmante de forma independiente. SignerCertificate es su certificado DER, mientras que RevocationCertificate identifica el certificado asociado a un error de revocación capturado cuando el backend puede proporcionarlo
TPdfCmsSignerVerifyResultsArray dinámico de instantáneas acotadas por firmante
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

Recompile los consumidores al actualizar, porque los registros públicos de opciones y resultados han crecido. Los verificadores personalizados deben inicializar los registros de resultado gestionados con Default(TPdfCmsVerifyResult) y dejar como no disponibles los campos de instantáneas que no admitan; no borre con FillChar un registro activo que contenga cadenas o arrays 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 TimeStampRevocationReason y NativeTimeStampRevocationError para los tokens de timestamp; los informes de evidencia incluyen ambos pares

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

OpenSSL distingue la revocación confirmada de las evidencias CRL caducadas, no disponibles o inválidas y de las evidencias OCSP no disponibles, inválidas o de estado desconocido. Windows informa de revocación confirmada, cadenas no fiables o un fallo nativo desconocido. El verificador de macOS evalúa por separado la integridad de la firma, la confianza Basic X.509 y la revocación, y devuelve errores nativos de Security.framework sin convertir cada fallo de plataforma en una clasificación CRL u OCSP

RevocationCertificate puede identificar un certificado intermedio revocado, en lugar del certificado del firmante CMS; queda vacío cuando el backend no puede capturarlo. OpenSSL puede recogerlo, mientras que el backend actual de macOS lo deja vacío

Ni pcrrNone ni un error cero demuestran que la revocación se comprobó o que tuvo éxito; examine siempre RevocationStatus

Diagnósticos por firmante

Active CollectSignerDiagnostics=True para inspeccionar instantáneas acotadas en SignerResults. SignerCount es el número codificado de SignerInfo cuando se ha podido determinar; cero significa que no se ha determinado

SignerDiagnosticsStatus=pcvsValid indica que las instantáneas solicitadas están completas, incluidas las de firmas inválidas; no indica que todas las firmas hayan pasado. pcvsUnavailable significa que la recogida estaba desactivada o no se admite, y pcvsIndeterminate que el backend no pudo completarla dentro de sus límites de análisis o recursos

Las implementaciones OpenSSL y nativa de macOS limitan la recogida a 64 firmantes. OpenSSL también limita la entrada CMS de diagnóstico a 4 MiB y el trabajo agregado de entrada/salida de diagnóstico a 64 MiB; macOS limita el material de certificados devuelto a 4 MiB por certificado y 64 MiB en total. Un MaxSignerCount menor reduce aún más el número solicitado por el llamador

Las instantáneas reutilizan la evidencia configurada y la recuperada durante la verificación agregada. OpenSSL no hace una segunda recuperación por red para cada instantánea de diagnóstico, y una recuperación agregada incompleta no puede convertirse en una instantánea de revocación offline satisfactoria

Backend de firma predeterminado

PadesSignerResolverOverride tiene prioridad, seguido de un IPadesSignerProvider registrado explícitamente y, después, del predeterminado de la plataforma. Fuera de Windows se necesita ConfigureSslSigningCredentials; disponer de libcrypto no proporciona por sí solo una clave privada ni un certificado

El backend OpenSSL predeterminado rechaza un CertificateThumbprint no vacío porque el certificado se eligió mediante configuración explícita. La firma con Keychain sigue disponible mediante ConfigureKeychainSignerProvider cuando la aplicación elige ese proveedor

Variables globales de proveedor

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 a través de ConfigurePadesCmsVerifier
PdfCertificatePathValidatorValidador de rutas de certificados actual, normalmente asignado a través de ConfigurePdfCertificatePathValidator
PadesSignerProviderProveedor de firmantes actual, normalmente asignado a través de ConfigurePadesSignerProvider

Véase también

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