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;
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
| Función | Descripción |
|---|---|
PadesCryptoAvailable | Devuelve True cuando hay un backend criptográfico disponible para firmar PAdES en la plataforma actual |
PadesCryptoBackendName | Devuelve el nombre para mostrar del backend criptográfico activo |
ResolvePadesSigner | Resuelve la huella digital de un certificado y un esquema de relleno en un firmante, el certificado del firmante y la cadena |
ConfigurePdfCertificatePathValidator | Establece o borra el IPdfCertificatePathValidator de todo el proceso usado por ValidatePdfCertificatePath |
ValidatePdfCertificatePath | Valida 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 |
ConfigurePadesSignerProvider | Establece o borra el proveedor de firmantes de todo el proceso usado con prioridad sobre el backend de la plataforma |
ConfigurePadesCmsVerifier | Instala 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 |
PadesCmsVerificationAvailable | Devuelve True cuando algún backend puede verificar CMS en esta compilación, ya sea registrado o integrado |
PadesCmsVerificationBackendName | Devuelve el nombre para mostrar del backend de verificación activo, o una cadena vacía cuando no hay ninguno |
| Miembro de interfaz | Descripción |
|---|---|
IPdfTrustStore.LoadTrustAnchors | Devuelve anclajes de confianza adicionales codificados en DER, sujetos a los presupuestos de certificados configurados |
IPdfValidationFetcher.Fetch | Obtiene material de validación desde Uri sin exceder MaxBytes |
IPdfCertificatePathValidator.Validate | Construye y evalúa la ruta de certificados y llena el TPdfCertificatePathReport |
IPadesSignerProvider.BackendName | Devuelve el nombre para mostrar del proveedor expuesto por PadesCryptoBackendName |
IPadesSignerProvider.Resolve | Devuelve el material de firmante completo para las TPadesSignerOptions suministradas |
IPdfPkcs11SignerProvider.EnumerateSlots | Devuelve las ranuras PKCS#11 disponibles y los metadatos de presencia de tokens |
IPdfPkcs11SignerProvider.EnumerateCertificates | Devuelve los certificados y mecanismos de firma visibles en una ranura PKCS#11 |
IPdfPkcs11SignerProvider.CloseProtectedSessions | Cierra las sesiones PKCS#11 protegidas o autenticadas propiedad del proveedor |
IPdfCmsVerifier.BackendName | Devuelve el nombre para mostrar del backend de verificación que reporta PadesCmsVerificationBackendName |
IPdfCmsVerifier.VerifyDetached | Verifica una firma PDF cuyo contenido firmado son los dos rangos de bytes a ambos lados del hueco /Contents |
IPdfCmsVerifier.VerifyAttached | Verifica un token de timestamp, que contiene su propio contenido y no necesita segmentos separados |
| Tipo | Descripción |
|---|---|
EPadesCrypto | Excepción base para fallos del backend criptográfico |
EPadesCryptoUnavailable | Se genera cuando un backend de firmante requerido o un validador de ruta de certificados no está configurado |
TPadesPaddingScheme | psRsaPss, psRsaPkcs1v15 o psEcdsa |
TPadesSignerOptions | CertificateThumbprint selecciona el certificado y PaddingScheme selecciona el esquema de firma; Default usa una huella digital vacía y psRsaPss |
TPadesChainCertArray | Arreglo dinámico de certificados de cadena codificados en DER |
TPadesResolvedSigner | Signer, SignerCertDer y ChainCertDer agrupan el firmante resuelto y el material de certificados |
TPdfRevocationMode | prmNone, prmOffline, prmOnlineAllowed o prmOnlineRequired |
TPdfStringArray | Arreglo dinámico de cadenas usado para OID de políticas y nombres de mecanismos de proveedores |
TPdfCertificatePathOptions | ValidationTime, 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 |
TPdfCertificatePathReport | Trusted, PathBuilt, PolicyValid, RevocationChecked, PathCertificateCount, ErrorCode y ErrorMessage informan el resultado de la validación |
TPdfPkcs11Slot | SlotID, Description, TokenLabel y TokenPresent describen una ranura PKCS#11 |
TPdfPkcs11Slots | Arreglo dinámico de registros TPdfPkcs11Slot |
TPdfPkcs11Certificate | SlotID, ObjectID, LabelText, CertificateDer y Mechanisms describen un certificado de token |
TPdfPkcs11Certificates | Arreglo dinámico de registros TPdfPkcs11Certificate |
TPadesSignerResolverProc | Tipo de puntero a función para la variable de inyección PadesSignerResolverOverride |
TPdfCmsVerifyStatus | pcvsUnavailable, pcvsValid, pcvsInvalid, pcvsUnsupported o pcvsIndeterminate |
TPdfCmsRevocationReason | pcrrNone, 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 |
TPdfCmsVerifyStage | pcvstCryptographicSignature, pcvstChainBuild, pcvstOnlineRetrieval o pcvstRevocationCheck |
TPdfCmsVerifyCheckpoint | Callback de método de objeto que recibe cada TPdfCmsVerifyStage conforme avanza la verificación |
TPdfCmsVerifyOptions | OnlineRetrieval, 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 |
TPdfCmsSignerVerifyResult | SignerIndex 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 |
TPdfCmsSignerVerifyResults | Arreglo dinámico de instantáneas de firmantes con límites definidos |
TPdfCmsVerifyResult | Los 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 |
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
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
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
| Variable | Descripción |
|---|---|
PadesSignerResolverOverride | Devolución de llamada de resolución opcional evaluada antes que los proveedores registrados y de plataforma |
PadesCmsVerifier | Backend de verificación CMS actual, normalmente asignado mediante ConfigurePadesCmsVerifier |
PdfCertificatePathValidator | Validador de ruta de certificados actual, normalmente asignado mediante ConfigurePdfCertificatePathValidator |
PadesSignerProvider | Proveedor de firmantes actual, normalmente asignado mediante ConfigurePadesSignerProvider |