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 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
| Función | Descripción |
|---|---|
PadesCryptoAvailable | Devuelve True cuando hay un backend criptográfico disponible para la firma PAdES en la plataforma actual |
PadesCryptoBackendName | Devuelve el nombre visible del backend criptográfico activo |
ResolvePadesSigner | Resuelve una huella de certificado y un esquema de relleno en un firmante, el certificado del firmante y la cadena |
ConfigurePdfCertificatePathValidator | Establece o borra el IPdfCertificatePathValidator a nivel de proceso usado por ValidatePdfCertificatePath |
ValidatePdfCertificatePath | Valida 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 |
ConfigurePadesSignerProvider | Establece o borra el proveedor de firmantes a nivel de proceso usado por delante del backend de plataforma |
ConfigurePadesCmsVerifier | Instala 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 |
PadesCmsVerificationAvailable | Devuelve True cuando algún backend puede verificar CMS en esta compilación, ya esté registrado o integrado |
PadesCmsVerificationBackendName | Devuelve el nombre visible del backend de verificación activo, o una cadena vacía si 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 | Captura material de validación desde Uri sin exceder MaxBytes |
IPdfCertificatePathValidator.Validate | Construye y evalúa la ruta de certificados y rellena el TPdfCertificatePathReport |
IPadesSignerProvider.BackendName | Devuelve el nombre visible 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 token |
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 visible del backend de verificación que informa 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 lleva su propio contenido y no necesita segmentos separados |
| Tipo | Descripción |
|---|---|
EPadesCrypto | Excepción base para los fallos del backend criptográfico |
EPadesCryptoUnavailable | Se lanza cuando un backend de firmante requerido o un validador de rutas 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 vacía y psRsaPss |
TPadesChainCertArray | Matriz dinámica de certificados de cadena codificados en DER |
TPadesResolvedSigner | Signer, SignerCertDer y ChainCertDer agrupan el firmante resuelto y el material del certificado |
TPdfRevocationMode | prmNone, prmOffline, prmOnlineAllowed o prmOnlineRequired |
TPdfStringArray | Matriz dinámica de cadenas usada para OID de políticas y nombres de mecanismos de proveedores |
TPdfCertificatePathOptions | ValidationTime, 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 |
TPdfCertificatePathReport | Trusted, PathBuilt, PolicyValid, RevocationChecked, PathCertificateCount, ErrorCode y ErrorMessage informan del resultado de la validación |
TPdfPkcs11Slot | SlotID, Description, TokenLabel y TokenPresent describen una ranura PKCS#11 |
TPdfPkcs11Slots | Matriz dinámica de registros TPdfPkcs11Slot |
TPdfPkcs11Certificate | SlotID, ObjectID, LabelText, CertificateDer y Mechanisms describen un certificado de token |
TPdfPkcs11Certificates | Matriz dinámica de registros TPdfPkcs11Certificate |
TPadesSignerResolverProc | Tipo puntero a función para el var 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 explican 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 a medida que 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 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 |
TPdfCmsSignerVerifyResult | SignerIndex 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 |
TPdfCmsSignerVerifyResults | Array dinámico de instantáneas acotadas por firmante |
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 |
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
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
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
| 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 a través de ConfigurePadesCmsVerifier |
PdfCertificatePathValidator | Validador de rutas de certificados actual, normalmente asignado a través de ConfigurePdfCertificatePathValidator |
PadesSignerProvider | Proveedor de firmantes actual, normalmente asignado a través de ConfigurePadesSignerProvider |