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 è 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
| Funzione | Descrizione |
|---|---|
PadesCryptoAvailable | Restituisce True quando è disponibile un backend di crittografia per la firma PAdES sulla piattaforma corrente |
PadesCryptoBackendName | Restituisce il nome visualizzato del backend di crittografia attivo |
ResolvePadesSigner | Risolve un'identificazione personale (thumbprint) di certificato e uno schema di padding in un firmatario, un certificato del firmatario e una catena |
ConfigurePdfCertificatePathValidator | Imposta o azzera l'IPdfCertificatePathValidator a livello di processo usato da ValidatePdfCertificatePath |
ValidatePdfCertificatePath | Valida 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 |
ConfigurePadesSignerProvider | Imposta o azzera il provider di firmatario a livello di processo usato prima del backend di piattaforma |
ConfigurePadesCmsVerifier | Installa 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 |
PadesCmsVerificationAvailable | Restituisce True quando qualche backend può verificare CMS in questa build, sia registrato che integrato |
PadesCmsVerificationBackendName | Restituisce il nome visualizzato del backend di verifica attivo, o una stringa vuota quando non ce n'è nessuno |
| Membro di interfaccia | Descrizione |
|---|---|
IPdfTrustStore.LoadTrustAnchors | Restituisce trust anchor aggiuntivi codificati DER soggetti ai budget di certificati configurati |
IPdfValidationFetcher.Fetch | Recupera materiale di validazione da Uri senza superare MaxBytes |
IPdfCertificatePathValidator.Validate | Costruisce e valuta il percorso di certificazione e popola TPdfCertificatePathReport |
IPadesSignerProvider.BackendName | Restituisce il nome visualizzato del provider esposto da PadesCryptoBackendName |
IPadesSignerProvider.Resolve | Restituisce il materiale completo del firmatario per le TPadesSignerOptions fornite |
IPdfPkcs11SignerProvider.EnumerateSlots | Restituisce gli slot PKCS#11 disponibili e i metadati sulla presenza dei token |
IPdfPkcs11SignerProvider.EnumerateCertificates | Restituisce i certificati e i meccanismi di firma visibili in uno slot PKCS#11 |
IPdfPkcs11SignerProvider.CloseProtectedSessions | Chiude le sessioni PKCS#11 protette o autenticate di proprietà del provider |
IPdfCmsVerifier.BackendName | Restituisce il nome visualizzato del backend di verifica riportato da PadesCmsVerificationBackendName |
IPdfCmsVerifier.VerifyDetached | Verifica una firma PDF il cui contenuto firmato è costituito dai due intervalli di byte ai lati del buco /Contents |
IPdfCmsVerifier.VerifyAttached | Verifica un token di timestamp, che contiene il proprio contenuto e non richiede segmenti separati |
| Tipo | Descrizione |
|---|---|
EPadesCrypto | Eccezione base per i fallimenti del backend di crittografia |
EPadesCryptoUnavailable | Sollevata quando un backend di firmatario richiesto o un validatore di percorso di certificazione non è configurato |
TPadesPaddingScheme | psRsaPss, psRsaPkcs1v15 o psEcdsa |
TPadesSignerOptions | CertificateThumbprint seleziona il certificato e PaddingScheme seleziona lo schema di firma; Default usa un'identificazione personale vuota e psRsaPss |
TPadesChainCertArray | Array dinamico di certificati della catena codificati DER |
TPadesResolvedSigner | Signer, SignerCertDer e ChainCertDer raggruppano il firmatario risolto e il materiale certificativo |
TPdfRevocationMode | prmNone, prmOffline, prmOnlineAllowed o prmOnlineRequired |
TPdfStringArray | Array dinamico di stringhe usato per gli OID di policy e i nomi dei meccanismi dei provider |
TPdfCertificatePathOptions | ValidationTime, 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 |
TPdfCertificatePathReport | Trusted, PathBuilt, PolicyValid, RevocationChecked, PathCertificateCount, ErrorCode e ErrorMessage riportano l'esito della validazione |
TPdfPkcs11Slot | SlotID, Description, TokenLabel e TokenPresent descrivono uno slot PKCS#11 |
TPdfPkcs11Slots | Array dinamico di record TPdfPkcs11Slot |
TPdfPkcs11Certificate | SlotID, ObjectID, LabelText, CertificateDer e Mechanisms descrivono un certificato del token |
TPdfPkcs11Certificates | Array dinamico di record TPdfPkcs11Certificate |
TPadesSignerResolverProc | Tipo function-pointer per la var di iniezione PadesSignerResolverOverride |
TPdfCmsVerifyStatus | pcvsUnavailable, pcvsValid, pcvsInvalid, pcvsUnsupported oppure pcvsIndeterminate |
TPdfCmsRevocationReason | pcrrNone, pcrrCertificateRevoked, pcrrCrlExpired, pcrrCrlNotYetValid, pcrrCrlUnavailable, pcrrCrlSignatureInvalid, pcrrCrlInvalid, pcrrChainUntrusted, pcrrUnknown, pcrrOcspUnavailable, pcrrOcspInvalid o pcrrOcspStatusUnknown spiegano le prove di revoca separatamente dallo stato della verifica |
TPdfCmsVerifyStage | pcvstCryptographicSignature, pcvstChainBuild, pcvstOnlineRetrieval oppure pcvstRevocationCheck |
TPdfCmsVerifyCheckpoint | Callback di metodo d'oggetto che riceve ogni TPdfCmsVerifyStage mentre la verifica procede |
TPdfCmsVerifyOptions | OnlineRetrieval, 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 |
TPdfCmsSignerVerifyResult | SignerIndex 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 |
TPdfCmsSignerVerifyResults | Array dinamico di snapshot dei firmatari con limiti di risorse |
TPdfCmsVerifyResult | Gli stati aggregati di firma, attendibilità e revoca restano indipendenti. Il record restituisce anche SignatureError, TrustError, SignerCertificate, ChainCertificates, RevocationReason, RevocationError, RevocationCertificate, SignerResults, SignerDiagnosticsStatus e SignerCount |
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
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
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
| Variabile | Descrizione |
|---|---|
PadesSignerResolverOverride | Callback di risoluzione facoltativa valutata prima dei provider registrati e di piattaforma |
PadesCmsVerifier | Backend di verifica CMS corrente, normalmente assegnato tramite ConfigurePadesCmsVerifier |
PdfCertificatePathValidator | Validatore del percorso di certificazione corrente, normalmente assegnato tramite ConfigurePdfCertificatePathValidator |
PadesSignerProvider | Provider di firmatario corrente, normalmente assegnato tramite ConfigurePadesSignerProvider |