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 est le point d’entrée de la pile de signature PAdES ; PadesCryptoAvailable indique si les éléments de signature et leur backend sont disponibles, et PadesCryptoBackendName identifie le backend sélectionné ; Windows utilise par défaut Cryptography Next Generation, les autres plateformes résolvent la clé privée et le certificat OpenSSL configurés explicitement dans FPdfCryptoSsl
ResolvePadesSigner prend une empreinte de certificat et un schéma de remplissage et renvoie un TPadesResolvedSigner entièrement renseigné : l’implémentation de ICmsSigner qui effectue l’opération à clé privée, le certificat DER du signataire et les certificats de la chaîne émettrice. Le résultat est passé directement à FPdfCms.BuildSignedData
Les intégrations personnalisées peuvent enregistrer un IPadesSignerProvider, y compris un IPdfPkcs11SignerProvider qui énumère les emplacements et certificats de jetons, ou utiliser PadesSignerResolverOverride comme point d’ancrage de résolveur déterministe
La validation de chaîne de certificats est fondée sur des fournisseurs et budgétée : les appelants configurent IPdfCertificatePathValidator, fournissent facultativement des ancres de confiance explicites, un IPdfTrustStore et un IPdfValidationFetcher, puis inspectent TPdfCertificatePathReport
| Fonction | Description |
|---|---|
PadesCryptoAvailable | Renvoie True lorsqu’un backend cryptographique est disponible pour la signature PAdES sur la plateforme courante |
PadesCryptoBackendName | Renvoie le nom d’affichage du backend cryptographique actif |
ResolvePadesSigner | Résout une empreinte de certificat et un schéma de remplissage en un signataire, un certificat de signataire et une chaîne |
ConfigurePdfCertificatePathValidator | Définit ou efface le IPdfCertificatePathValidator à l’échelle du processus utilisé par ValidatePdfCertificatePath |
ValidatePdfCertificatePath | Valide un certificat feuille par rapport aux intermédiaires et aux ancres explicites et de magasin de confiance combinées après application des budgets de nombre, taille, récupération et profondeur de chaîne |
ConfigurePadesSignerProvider | Définit ou efface le fournisseur de signataires à l’échelle du processus utilisé avant le backend de plateforme |
ConfigurePadesCmsVerifier | Installe le backend de vérification CMS utilisé par le validateur PAdES ; le supprimer restaure Windows CryptoAPI sous Windows ; les autres plateformes exigent un appel explicite à ConfigureSslCmsVerifier ou ConfigureKeychainCmsVerifier |
PadesCmsVerificationAvailable | Renvoie True lorsqu’un backend, enregistré ou intégré, peut vérifier CMS dans ce build |
PadesCmsVerificationBackendName | Renvoie le nom d’affichage du backend de vérification actif, ou une chaîne vide quand il n’y en a aucun |
| Membre de l’interface | Description |
|---|---|
IPdfTrustStore.LoadTrustAnchors | Renvoie des ancres de confiance supplémentaires encodées en DER sous réserve des budgets de certificats configurés |
IPdfValidationFetcher.Fetch | Récupère le matériel de validation depuis Uri sans dépasser MaxBytes |
IPdfCertificatePathValidator.Validate | Construit et évalue la chaîne de certificats et renseigne TPdfCertificatePathReport |
IPadesSignerProvider.BackendName | Renvoie le nom d’affichage du fournisseur exposé par PadesCryptoBackendName |
IPadesSignerProvider.Resolve | Renvoie le matériel de signataire complet pour les TPadesSignerOptions fournies |
IPdfPkcs11SignerProvider.EnumerateSlots | Renvoie les emplacements PKCS#11 disponibles et les métadonnées de présence de jeton |
IPdfPkcs11SignerProvider.EnumerateCertificates | Renvoie les certificats et mécanismes de signature visibles dans un emplacement PKCS#11 |
IPdfPkcs11SignerProvider.CloseProtectedSessions | Ferme les sessions PKCS#11 protégées ou authentifiées détenues par le fournisseur |
IPdfCmsVerifier.BackendName | Renvoie le nom d’affichage du backend de vérification rapporté par PadesCmsVerificationBackendName |
IPdfCmsVerifier.VerifyDetached | Vérifie une signature PDF dont le contenu signé est constitué des deux plages d’octets qui encadrent le trou /Contents |
IPdfCmsVerifier.VerifyAttached | Vérifie un jeton d’horodatage, qui porte son propre contenu et n’a besoin d’aucun segment détaché |
| Type | Description |
|---|---|
EPadesCrypto | Exception de base pour les défaillances du backend cryptographique |
EPadesCryptoUnavailable | Levée lorsqu’un backend de signataire requis ou un validateur de chaîne de certificats n’est pas configuré |
TPadesPaddingScheme | psRsaPss, psRsaPkcs1v15 ou psEcdsa |
TPadesSignerOptions | CertificateThumbprint sélectionne le certificat et PaddingScheme sélectionne le schéma de signature ; Default utilise une empreinte vide et psRsaPss |
TPadesChainCertArray | Tableau dynamique de certificats de chaîne encodés en DER |
TPadesResolvedSigner | Signer, SignerCertDer et ChainCertDer regroupent le signataire résolu et le matériel de certificat |
TPdfRevocationMode | prmNone, prmOffline, prmOnlineAllowed ou prmOnlineRequired |
TPdfStringArray | Tableau dynamique de chaînes utilisé pour les OID de politique et les noms de mécanismes des fournisseurs |
TPdfCertificatePathOptions | ValidationTime, RevocationMode, RequiredPolicyOids, MaxCertificates, MaxCertificateBytes, MaxFetchBytes et MaxPathDepth contrôlent la validation et les budgets de ressources ; Default sélectionne la révocation hors ligne avec des limites de 64 certificats, 4 MiB par certificat, 16 MiB de données récupérées et une profondeur de chaîne de 16 |
TPdfCertificatePathReport | Trusted, PathBuilt, PolicyValid, RevocationChecked, PathCertificateCount, ErrorCode et ErrorMessage rapportent le résultat de la validation |
TPdfPkcs11Slot | SlotID, Description, TokenLabel et TokenPresent décrivent un emplacement PKCS#11 |
TPdfPkcs11Slots | Tableau dynamique d’enregistrements TPdfPkcs11Slot |
TPdfPkcs11Certificate | SlotID, ObjectID, LabelText, CertificateDer et Mechanisms décrivent un certificat de jeton |
TPdfPkcs11Certificates | Tableau dynamique d’enregistrements TPdfPkcs11Certificate |
TPadesSignerResolverProc | Type pointeur de fonction pour la var d’injection PadesSignerResolverOverride |
TPdfCmsVerifyStatus | pcvsUnavailable, pcvsValid, pcvsInvalid, pcvsUnsupported ou pcvsIndeterminate |
TPdfCmsRevocationReason | pcrrNone, pcrrCertificateRevoked, pcrrCrlExpired, pcrrCrlNotYetValid, pcrrCrlUnavailable, pcrrCrlSignatureInvalid, pcrrCrlInvalid, pcrrChainUntrusted, pcrrUnknown, pcrrOcspUnavailable, pcrrOcspInvalid ou pcrrOcspStatusUnknown explique la preuve de révocation séparément de l’état de vérification |
TPdfCmsVerifyStage | pcvstCryptographicSignature, pcvstChainBuild, pcvstOnlineRetrieval ou pcvstRevocationCheck |
TPdfCmsVerifyCheckpoint | Rappel de méthode d’objet recevant chaque TPdfCmsVerifyStage au fil de la vérification |
TPdfCmsVerifyOptions | OnlineRetrieval, CheckRevocation, CollectChainCertificates, UrlRetrievalTimeoutMs et OnCheckpoint pilotent la vérification ; CollectSignerDiagnostics demande des instantanés par signataire et MaxSignerCount en borne le nombre ; Default désactive récupération, révocation et diagnostics, fixe un budget réseau de 15 secondes et limite les instantanés à 64 |
TPdfCmsSignerVerifyResult | SignerIndex suit l’ordre des SignerInfo encodés ; les états de signature, confiance, révocation et erreurs natives décrivent ce signataire indépendamment ; SignerCertificate est son certificat DER, et RevocationCertificate celui associé à une erreur capturée si le backend peut le fournir |
TPdfCmsSignerVerifyResults | Tableau dynamique d’instantanés de signataire bornés |
TPdfCmsVerifyResult | Les états agrégés de signature, confiance et révocation restent indépendants ; l’enregistrement renvoie aussi SignatureError, TrustError, SignerCertificate, ChainCertificates, RevocationReason, RevocationError, RevocationCertificate, SignerResults, SignerDiagnosticsStatus et SignerCount |
Recompilez les consommateurs à la mise à niveau, les enregistrements publics d’options et de résultats ayant grandi ; un vérificateur personnalisé doit initialiser les résultats gérés avec Default(TPdfCmsVerifyResult) et laisser indisponibles les instantanés non pris en charge ; ne videz pas avec FillChar un enregistrement actif contenant chaînes ou tableaux dynamiques
Lisez RevocationReason et RevocationError dans le TPdfCmsVerifyResult renvoyé par IPdfCmsVerifier.VerifyDetached ou VerifyAttached. La validation de confiance PAdES les conserve en RevocationReason et NativeRevocationError, avec des champs TimeStampRevocationReason et NativeTimeStampRevocationError distincts pour les tokens d’horodatage ; les rapports de preuves incluent les deux paires
RevocationError est un code de vérification natif propre au backend, zéro signifiant qu’aucun diagnostic natif n’a été capturé. OpenSSL utilise l’espace d’erreurs X509_V_ERR_*. Windows préserve un DWORD brut provenant du CERT_REVOCATION_INFO.dwRevocationResult d’un certificat, ou de GetLastError si son appel de chaîne de révocation échoue ; il ne s’agit ni d’un espace d’erreurs HRESULT uniforme ni du masque de bits agrégé de confiance de chaîne
OpenSSL distingue une révocation confirmée des preuves CRL expirées, indisponibles ou invalides et des preuves OCSP indisponibles, invalides ou inconnues ; Windows indique une révocation confirmée, une chaîne non fiable ou un échec natif inconnu ; macOS évalue séparément intégrité, confiance Basic X.509 et révocation, renvoyant les erreurs Security.framework sans convertir chaque échec en catégorie CRL ou OCSP
RevocationCertificate peut identifier un intermédiaire révoqué plutôt que le certificat du signataire CMS ; il est vide si le backend ne peut pas le capturer ; OpenSSL le permet, le backend macOS actuel le laisse vide
Ni pcrrNone ni une erreur zéro ne prouvent que la révocation a été vérifiée ou qu’elle a réussi ; inspectez toujours RevocationStatus
Mettez CollectSignerDiagnostics=True pour inspecter les instantanés bornés dans SignerResults ; SignerCount est le nombre de SignerInfo encodés lorsqu’il peut être établi ; zéro signifie qu’il n’a pas été établi
SignerDiagnosticsStatus=pcvsValid signifie que les instantanés demandés sont complets, y compris ceux de signatures invalides, pas que toutes les signatures réussissent ; pcvsUnavailable indique une collecte désactivée ou non prise en charge, et pcvsIndeterminate une collecte impossible à terminer dans les limites d’analyse ou de ressources
OpenSSL et macOS natif limitent la collecte à 64 signataires ; OpenSSL limite aussi le CMS diagnostique à 4 MiB et le travail d’entrée/sortie cumulé à 64 MiB ; macOS borne les certificats renvoyés à 4 MiB chacun et 64 MiB au total ; un MaxSignerCount inférieur réduit encore la demande
Les instantanés réutilisent les preuves configurées et récupérées pendant la vérification agrégée ; OpenSSL ne lance pas une seconde récupération réseau par instantané, et une récupération agrégée incomplète ne peut pas devenir une révocation hors ligne réussie
PadesSignerResolverOverride est prioritaire, suivi d’un IPadesSignerProvider explicitement enregistré, puis du défaut plateforme ; hors Windows, le défaut exige ConfigureSslSigningCredentials ; libcrypto disponible ne fournit pas à lui seul de clé privée ou certificat
Le défaut OpenSSL refuse un CertificateThumbprint non vide, le certificat étant déjà sélectionné par configuration ; la signature Keychain reste accessible avec ConfigureKeychainSignerProvider lorsque l’application choisit ce fournisseur
| Variable | Description |
|---|---|
PadesSignerResolverOverride | Rappel de résolveur facultatif évalué avant les fournisseurs enregistrés et de plateforme |
PadesCmsVerifier | Backend de vérification CMS courant, normalement assigné via ConfigurePadesCmsVerifier |
PdfCertificatePathValidator | Validateur de chaîne de certificats courant, normalement assigné via ConfigurePdfCertificatePathValidator |
PadesSignerProvider | Fournisseur de signataires courant, normalement assigné via ConfigurePadesSignerProvider |