PDFium Delphi Component Docs

Unité FPdfCrypto

Unité : FPdfCrypto
Façade de fournisseur de signataires PAdES et de validation de certificats pour les backends de plateforme, les intégrations PKCS#11, les magasins de confiance, les récupérateurs de révocation et la validation de chaîne bornée

Syntaxe

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;

Description

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

Fonctions

FonctionDescription
PadesCryptoAvailableRenvoie True lorsqu’un backend cryptographique est disponible pour la signature PAdES sur la plateforme courante
PadesCryptoBackendNameRenvoie le nom d’affichage du backend cryptographique actif
ResolvePadesSignerRésout une empreinte de certificat et un schéma de remplissage en un signataire, un certificat de signataire et une chaîne
ConfigurePdfCertificatePathValidatorDéfinit ou efface le IPdfCertificatePathValidator à l’échelle du processus utilisé par ValidatePdfCertificatePath
ValidatePdfCertificatePathValide 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
ConfigurePadesSignerProviderDéfinit ou efface le fournisseur de signataires à l’échelle du processus utilisé avant le backend de plateforme
ConfigurePadesCmsVerifierInstalle 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
PadesCmsVerificationAvailableRenvoie True lorsqu’un backend, enregistré ou intégré, peut vérifier CMS dans ce build
PadesCmsVerificationBackendNameRenvoie le nom d’affichage du backend de vérification actif, ou une chaîne vide quand il n’y en a aucun

Interfaces des fournisseurs

Membre de l’interfaceDescription
IPdfTrustStore.LoadTrustAnchorsRenvoie des ancres de confiance supplémentaires encodées en DER sous réserve des budgets de certificats configurés
IPdfValidationFetcher.FetchRécupère le matériel de validation depuis Uri sans dépasser MaxBytes
IPdfCertificatePathValidator.ValidateConstruit et évalue la chaîne de certificats et renseigne TPdfCertificatePathReport
IPadesSignerProvider.BackendNameRenvoie le nom d’affichage du fournisseur exposé par PadesCryptoBackendName
IPadesSignerProvider.ResolveRenvoie le matériel de signataire complet pour les TPadesSignerOptions fournies
IPdfPkcs11SignerProvider.EnumerateSlotsRenvoie les emplacements PKCS#11 disponibles et les métadonnées de présence de jeton
IPdfPkcs11SignerProvider.EnumerateCertificatesRenvoie les certificats et mécanismes de signature visibles dans un emplacement PKCS#11
IPdfPkcs11SignerProvider.CloseProtectedSessionsFerme les sessions PKCS#11 protégées ou authentifiées détenues par le fournisseur
IPdfCmsVerifier.BackendNameRenvoie le nom d’affichage du backend de vérification rapporté par PadesCmsVerificationBackendName
IPdfCmsVerifier.VerifyDetachedVérifie une signature PDF dont le contenu signé est constitué des deux plages d’octets qui encadrent le trou /Contents
IPdfCmsVerifier.VerifyAttachedVérifie un jeton d’horodatage, qui porte son propre contenu et n’a besoin d’aucun segment détaché

Types

TypeDescription
EPadesCryptoException de base pour les défaillances du backend cryptographique
EPadesCryptoUnavailableLevée lorsqu’un backend de signataire requis ou un validateur de chaîne de certificats n’est pas configuré
TPadesPaddingSchemepsRsaPss, psRsaPkcs1v15 ou psEcdsa
TPadesSignerOptionsCertificateThumbprint sélectionne le certificat et PaddingScheme sélectionne le schéma de signature ; Default utilise une empreinte vide et psRsaPss
TPadesChainCertArrayTableau dynamique de certificats de chaîne encodés en DER
TPadesResolvedSignerSigner, SignerCertDer et ChainCertDer regroupent le signataire résolu et le matériel de certificat
TPdfRevocationModeprmNone, prmOffline, prmOnlineAllowed ou prmOnlineRequired
TPdfStringArrayTableau dynamique de chaînes utilisé pour les OID de politique et les noms de mécanismes des fournisseurs
TPdfCertificatePathOptionsValidationTime, 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
TPdfCertificatePathReportTrusted, PathBuilt, PolicyValid, RevocationChecked, PathCertificateCount, ErrorCode et ErrorMessage rapportent le résultat de la validation
TPdfPkcs11SlotSlotID, Description, TokenLabel et TokenPresent décrivent un emplacement PKCS#11
TPdfPkcs11SlotsTableau dynamique d’enregistrements TPdfPkcs11Slot
TPdfPkcs11CertificateSlotID, ObjectID, LabelText, CertificateDer et Mechanisms décrivent un certificat de jeton
TPdfPkcs11CertificatesTableau dynamique d’enregistrements TPdfPkcs11Certificate
TPadesSignerResolverProcType pointeur de fonction pour la var d’injection PadesSignerResolverOverride
TPdfCmsVerifyStatuspcvsUnavailable, pcvsValid, pcvsInvalid, pcvsUnsupported ou pcvsIndeterminate
TPdfCmsRevocationReasonpcrrNone, 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
TPdfCmsVerifyStagepcvstCryptographicSignature, pcvstChainBuild, pcvstOnlineRetrieval ou pcvstRevocationCheck
TPdfCmsVerifyCheckpointRappel de méthode d’objet recevant chaque TPdfCmsVerifyStage au fil de la vérification
TPdfCmsVerifyOptionsOnlineRetrieval, 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
TPdfCmsSignerVerifyResultSignerIndex 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
TPdfCmsSignerVerifyResultsTableau dynamique d’instantanés de signataire bornés
TPdfCmsVerifyResultLes é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

Diagnostic de révocation

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

Diagnostics par signataire

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

Backend de signature par défaut

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

Variables globales des fournisseurs

VariableDescription
PadesSignerResolverOverrideRappel de résolveur facultatif évalué avant les fournisseurs enregistrés et de plateforme
PadesCmsVerifierBackend de vérification CMS courant, normalement assigné via ConfigurePadesCmsVerifier
PdfCertificatePathValidatorValidateur de chaîne de certificats courant, normalement assigné via ConfigurePdfCertificatePathValidator
PadesSignerProviderFournisseur de signataires courant, normalement assigné via ConfigurePadesSignerProvider

Voir aussi

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