PDFium Delphi Component Docs

Unità FPdfCrypto

Unità: FPdfCrypto
Facade di provider di firmatario PAdES e di validazione dei certificati per backend di piattaforma, integrazioni PKCS#11, trust store, fetcher di revoca e validazione delimitata del percorso di certificazione

Sintassi

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;

Descrizione

FPdfCrypto è il punto di accesso allo stack di firma PAdES. PadesCryptoAvailable indica la disponibilità di materiale di firma e backend e PadesCryptoBackendName identifica il backend selezionato; Windows usa per impostazione predefinita Cryptography Next Generation, mentre le altre piattaforme risolvono chiave privata e certificato OpenSSL configurati esplicitamente in FPdfCryptoSsl

ResolvePadesSigner accetta un'identificazione personale (thumbprint) di certificato e uno schema di padding e restituisce un TPadesResolvedSigner completamente popolato: l'implementazione di ICmsSigner che esegue l'operazione a chiave privata, il DER del certificato del firmatario e i certificati della catena emittente. Il risultato è passato direttamente a FPdfCms.BuildSignedData

Le integrazioni personalizzate possono registrare un IPadesSignerProvider, incluso un IPdfPkcs11SignerProvider che enumera slot e certificati dei token, oppure usare PadesSignerResolverOverride come punto d'aggancio deterministico del resolver

La validazione del percorso di certificazione è basata su provider e limitata da budget: i chiamanti configurano IPdfCertificatePathValidator, forniscono facoltativamente trust anchor espliciti, un IPdfTrustStore e un IPdfValidationFetcher, quindi esaminano TPdfCertificatePathReport

Funzioni

FunzioneDescrizione
PadesCryptoAvailableRestituisce True quando è disponibile un backend di crittografia per la firma PAdES sulla piattaforma corrente
PadesCryptoBackendNameRestituisce il nome visualizzato del backend di crittografia attivo
ResolvePadesSignerRisolve un'identificazione personale (thumbprint) di certificato e uno schema di padding in un firmatario, un certificato del firmatario e una catena
ConfigurePdfCertificatePathValidatorImposta o azzera l'IPdfCertificatePathValidator a livello di processo usato da ValidatePdfCertificatePath
ValidatePdfCertificatePathValida un certificato foglia rispetto agli intermedi e agli anchor combinati espliciti e del trust store dopo aver applicato i budget su numero di certificati, dimensioni, fetch e profondità del percorso
ConfigurePadesSignerProviderImposta o azzera il provider di firmatario a livello di processo usato prima del backend di piattaforma
ConfigurePadesCmsVerifierInstalla il backend di verifica CMS usato dal validatore PAdES; azzerarlo ripristina Windows CryptoAPI su Windows. Sulle altre piattaforme è necessaria una chiamata esplicita a ConfigureSslCmsVerifier o ConfigureKeychainCmsVerifier
PadesCmsVerificationAvailableRestituisce True quando qualche backend può verificare CMS in questa build, sia registrato che integrato
PadesCmsVerificationBackendNameRestituisce il nome visualizzato del backend di verifica attivo, o una stringa vuota quando non ce n'è nessuno

Interfacce provider

Membro di interfacciaDescrizione
IPdfTrustStore.LoadTrustAnchorsRestituisce trust anchor aggiuntivi codificati DER soggetti ai budget di certificati configurati
IPdfValidationFetcher.FetchRecupera materiale di validazione da Uri senza superare MaxBytes
IPdfCertificatePathValidator.ValidateCostruisce e valuta il percorso di certificazione e popola TPdfCertificatePathReport
IPadesSignerProvider.BackendNameRestituisce il nome visualizzato del provider esposto da PadesCryptoBackendName
IPadesSignerProvider.ResolveRestituisce il materiale completo del firmatario per le TPadesSignerOptions fornite
IPdfPkcs11SignerProvider.EnumerateSlotsRestituisce gli slot PKCS#11 disponibili e i metadati sulla presenza dei token
IPdfPkcs11SignerProvider.EnumerateCertificatesRestituisce i certificati e i meccanismi di firma visibili in uno slot PKCS#11
IPdfPkcs11SignerProvider.CloseProtectedSessionsChiude le sessioni PKCS#11 protette o autenticate di proprietà del provider
IPdfCmsVerifier.BackendNameRestituisce il nome visualizzato del backend di verifica riportato da PadesCmsVerificationBackendName
IPdfCmsVerifier.VerifyDetachedVerifica una firma PDF il cui contenuto firmato è costituito dai due intervalli di byte ai lati del buco /Contents
IPdfCmsVerifier.VerifyAttachedVerifica un token di timestamp, che contiene il proprio contenuto e non richiede segmenti separati

Tipi

TipoDescrizione
EPadesCryptoEccezione base per i fallimenti del backend di crittografia
EPadesCryptoUnavailableSollevata quando un backend di firmatario richiesto o un validatore di percorso di certificazione non è configurato
TPadesPaddingSchemepsRsaPss, psRsaPkcs1v15 o psEcdsa
TPadesSignerOptionsCertificateThumbprint seleziona il certificato e PaddingScheme seleziona lo schema di firma; Default usa un'identificazione personale vuota e psRsaPss
TPadesChainCertArrayArray dinamico di certificati della catena codificati DER
TPadesResolvedSignerSigner, SignerCertDer e ChainCertDer raggruppano il firmatario risolto e il materiale certificativo
TPdfRevocationModeprmNone, prmOffline, prmOnlineAllowed o prmOnlineRequired
TPdfStringArrayArray dinamico di stringhe usato per gli OID di policy e i nomi dei meccanismi dei provider
TPdfCertificatePathOptionsValidationTime, RevocationMode, RequiredPolicyOids, MaxCertificates, MaxCertificateBytes, MaxFetchBytes e MaxPathDepth controllano validazione e budget di risorse; Default seleziona revoca offline con limiti di 64 certificati, 4 MiB per certificato, 16 MiB di dati recuperati e profondità del percorso 16
TPdfCertificatePathReportTrusted, PathBuilt, PolicyValid, RevocationChecked, PathCertificateCount, ErrorCode e ErrorMessage riportano l'esito della validazione
TPdfPkcs11SlotSlotID, Description, TokenLabel e TokenPresent descrivono uno slot PKCS#11
TPdfPkcs11SlotsArray dinamico di record TPdfPkcs11Slot
TPdfPkcs11CertificateSlotID, ObjectID, LabelText, CertificateDer e Mechanisms descrivono un certificato del token
TPdfPkcs11CertificatesArray dinamico di record TPdfPkcs11Certificate
TPadesSignerResolverProcTipo function-pointer per la var di iniezione PadesSignerResolverOverride
TPdfCmsVerifyStatuspcvsUnavailable, pcvsValid, pcvsInvalid, pcvsUnsupported oppure pcvsIndeterminate
TPdfCmsRevocationReasonpcrrNone, pcrrCertificateRevoked, pcrrCrlExpired, pcrrCrlNotYetValid, pcrrCrlUnavailable, pcrrCrlSignatureInvalid, pcrrCrlInvalid, pcrrChainUntrusted, pcrrUnknown, pcrrOcspUnavailable, pcrrOcspInvalid o pcrrOcspStatusUnknown spiegano le prove di revoca separatamente dallo stato della verifica
TPdfCmsVerifyStagepcvstCryptographicSignature, pcvstChainBuild, pcvstOnlineRetrieval oppure pcvstRevocationCheck
TPdfCmsVerifyCheckpointCallback di metodo d'oggetto che riceve ogni TPdfCmsVerifyStage mentre la verifica procede
TPdfCmsVerifyOptionsOnlineRetrieval, CheckRevocation, CollectChainCertificates, UrlRetrievalTimeoutMs e OnCheckpoint guidano la verifica; CollectSignerDiagnostics richiede snapshot per firmatario e MaxSignerCount ne limita il numero. Default disabilita recupero, revoca e diagnostica dei firmatari, imposta 15 secondi per il recupero e limita gli snapshot a 64
TPdfCmsSignerVerifyResultSignerIndex indica l'ordine SignerInfo codificato; stati di firma, attendibilità, revoca ed errori nativi descrivono quel firmatario indipendentemente. SignerCertificate è il certificato DER, mentre RevocationCertificate identifica il certificato associato a un errore di revoca catturato, se il backend può fornirlo
TPdfCmsSignerVerifyResultsArray dinamico di snapshot dei firmatari con limiti di risorse
TPdfCmsVerifyResultGli stati aggregati di firma, attendibilità e revoca restano indipendenti. Il record restituisce anche SignatureError, TrustError, SignerCertificate, ChainCertificates, RevocationReason, RevocationError, RevocationCertificate, SignerResults, SignerDiagnosticsStatus e SignerCount

Diagnostica di revoca

Ricompilare i consumer dopo l'aggiornamento perché i record pubblici di opzioni e risultati sono stati ampliati. I verificatori personalizzati devono inizializzare record gestiti con Default(TPdfCmsVerifyResult) e lasciare indisponibili i campi snapshot non supportati; non azzerare con FillChar un record vivo che contiene stringhe o array dinamici

Leggere RevocationReason e RevocationError dal TPdfCmsVerifyResult restituito da IPdfCmsVerifier.VerifyDetached o VerifyAttached. La validazione di fiducia PAdES li preserva come RevocationReason e NativeRevocationError, con campi separati TimeStampRevocationReason e NativeTimeStampRevocationError per i token di timestamp; i report di evidence includono entrambe le coppie

RevocationError è un codice di verifica nativo specifico del backend, dove zero significa che non è stata acquisita nessuna diagnostica nativa. OpenSSL usa lo spazio di errori X509_V_ERR_*. Windows preserva un DWORD grezzo dal CERT_REVOCATION_INFO.dwRevocationResult di un certificato, oppure da GetLastError se la chiamata alla catena di revoca fallisce; non è uno spazio di errori HRESULT uniforme né la maschera di bit aggregata della fiducia della catena

OpenSSL distingue revoca confermata, prove CRL scadute, indisponibili o non valide e prove OCSP indisponibili, non valide o sconosciute. Windows segnala revoca confermata, catene non attendibili o errore nativo sconosciuto. Il verificatore macOS valuta separatamente integrità della firma, attendibilità Basic X.509 e revoca, restituendo errori Security.framework nativi senza ricondurre ogni errore di piattaforma a CRL o OCSP

RevocationCertificate può identificare un intermedio revocato anziché il certificato del firmatario CMS; è vuoto se il backend non può catturarlo. OpenSSL può raccoglierlo, mentre l'attuale backend macOS lo lascia vuoto

Né pcrrNone né un errore zero dimostrano che la revoca sia stata controllata o abbia avuto successo; controllare sempre RevocationStatus

Diagnostica per firmatario

Impostare CollectSignerDiagnostics=True per esaminare gli snapshot limitati in SignerResults. SignerCount è il numero SignerInfo codificato quando noto; zero indica che il conteggio non è stato determinato

SignerDiagnosticsStatus=pcvsValid indica che gli snapshot richiesti sono completi, anche per firme non valide; non significa che tutte le firme siano corrette. pcvsUnavailable indica raccolta disabilitata o non supportata e pcvsIndeterminate che il backend non ha potuto completarla entro i limiti di parsing o risorse

OpenSSL e macOS nativo limitano la raccolta a 64 firmatari. OpenSSL limita inoltre input CMS diagnostico a 4 MiB e lavoro cumulativo di input/output diagnostico a 64 MiB; macOS limita i certificati restituiti a 4 MiB ciascuno e 64 MiB totali. Un MaxSignerCount inferiore riduce ulteriormente il numero richiesto

Gli snapshot riutilizzano prove configurate e recuperate durante la verifica aggregata. OpenSSL non esegue un secondo recupero di rete per ogni snapshot e un recupero aggregato incompleto non può diventare uno snapshot offline di revoca riuscito

Backend di firma predefinito

PadesSignerResolverOverride ha priorità, seguito da un IPadesSignerProvider registrato esplicitamente e infine dal valore predefinito di piattaforma. Fuori da Windows serve ConfigureSslSigningCredentials; la sola disponibilità di libcrypto non fornisce chiave privata o certificato

Il valore predefinito OpenSSL rifiuta un CertificateThumbprint non vuoto perché il certificato è scelto dalla configurazione esplicita. La firma Keychain resta disponibile tramite ConfigureKeychainSignerProvider quando l'applicazione sceglie quel provider

Variabili provider globali

VariabileDescrizione
PadesSignerResolverOverrideCallback di risoluzione facoltativa valutata prima dei provider registrati e di piattaforma
PadesCmsVerifierBackend di verifica CMS corrente, normalmente assegnato tramite ConfigurePadesCmsVerifier
PdfCertificatePathValidatorValidatore del percorso di certificazione corrente, normalmente assegnato tramite ConfigurePdfCertificatePathValidator
PadesSignerProviderProvider di firmatario corrente, normalmente assegnato tramite ConfigurePadesSignerProvider

Vedi anche

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