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);
TPdfCmsVerifyStage = (pcvstCryptographicSignature, pcvstChainBuild,
pcvstOnlineRetrieval, pcvstRevocationCheck);
TPdfCmsVerifyCheckpoint = procedure(Stage: TPdfCmsVerifyStage) of object;
TPdfCmsVerifyOptions = record
OnlineRetrieval: Boolean;
CheckRevocation: Boolean;
CollectChainCertificates: Boolean;
UrlRetrievalTimeoutMs: Cardinal;
OnCheckpoint: TPdfCmsVerifyCheckpoint;
class function Default: TPdfCmsVerifyOptions; static;
end;
TPdfCmsVerifyResult = record
SignatureStatus: TPdfCmsVerifyStatus;
TrustStatus: TPdfCmsVerifyStatus;
RevocationStatus: TPdfCmsVerifyStatus;
SignatureError: Cardinal;
TrustError: Cardinal;
SignerCertificate: TBytes;
ChainCertificates: TPadesChainCertArray;
RevocationReason: TPdfCmsRevocationReason;
RevocationError: Cardinal;
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;
FPdfCrypto is de toegangspoort tot de PAdES-ondertekenstack. PadesCryptoAvailable rapporteert of er een cryptobackend is aangesloten op het huidige platform en PadesCryptoBackendName identificeert deze; op Windows wordt de Cryptography Next Generation-backend in FPdfCryptoWin automatisch gebonden
ResolvePadesSigner neemt een certificaat-thumbprint en een padding-schema en geeft een volledig gevulde TPadesResolvedSigner terug: de ICmsSigner-implementatie die de private-key-bewerking uitvoert, het DER van het signercertificaat en de uitgiftende ketencertificaten. Het resultaat gaat rechtstreeks naar FPdfCms.BuildSignedData
Aangepaste integraties kunnen een IPadesSignerProvider registreren, waaronder een IPdfPkcs11SignerProvider die tokenslots en certificaten enumerateert, of PadesSignerResolverOverride gebruiken als deterministische resolvernaad
Certificaatpadvalidatie is providergebaseerd en begrensd: aanroepers configureren IPdfCertificatePathValidator, leveren optioneel expliciete trust anchors, een IPdfTrustStore en een IPdfValidationFetcher, en inspecteren vervolgens TPdfCertificatePathReport
| Function | Description |
|---|---|
PadesCryptoAvailable | Geeft True terug wanneer er op het huidige platform een cryptobackend beschikbaar is voor PAdES-ondertekening |
PadesCryptoBackendName | Geeft de weergavenaam van de actieve cryptobackend terug |
ResolvePadesSigner | Zet een certificaat-thumbprint en padding-schema om in een signer, signercertificaat en keten |
ConfigurePdfCertificatePathValidator | Stelt de procesbrede IPdfCertificatePathValidator in of wist deze; deze wordt gebruikt door ValidatePdfCertificatePath |
ValidatePdfCertificatePath | Valideert een leaf-certificaat tegen intermediates en de gecombineerde expliciete en trust-store-anchors, na handhaving van budgetten voor certificaataantal, -grootte, fetches en paddiepte |
ConfigurePadesSignerProvider | Stelt de procesbrede signer-provider in of wist deze; deze wordt vóór de platformbackend gebruikt |
ConfigurePadesCmsVerifier | Installeert de CMS-verificatiebackend die de PAdES-validator gebruikt; wissen ervan herstelt Windows CryptoAPI op Windows. Op andere platforms is een expliciete aanroep van ConfigureSslCmsVerifier of ConfigureKeychainCmsVerifier vereist |
PadesCmsVerificationAvailable | Geeft True terug wanneer er op deze build een backend is die CMS kan verifiëren, geregistreerd of ingebouwd |
PadesCmsVerificationBackendName | Geeft de weergavenaam van de actieve verificatiebackend terug, of een lege string als er geen is |
| Interface member | Description |
|---|---|
IPdfTrustStore.LoadTrustAnchors | Geeft aanvullende DER-gecodeerde trust anchors terug, binnen de geconfigureerde certificaatbudgetten |
IPdfValidationFetcher.Fetch | Haalt validatiemateriaal op van Uri zonder MaxBytes te overschrijden |
IPdfCertificatePathValidator.Validate | Bouwt en evalueert het certificaatpad en vult TPdfCertificatePathReport |
IPadesSignerProvider.BackendName | Geeft de weergavenaam van de provider terug die door PadesCryptoBackendName ontsloten wordt |
IPadesSignerProvider.Resolve | Geeft volledig signermateriaal terug voor de aangeleverde TPadesSignerOptions |
IPdfPkcs11SignerProvider.EnumerateSlots | Geeft de beschikbare PKCS#11-slots en de token-presence-metadata terug |
IPdfPkcs11SignerProvider.EnumerateCertificates | Geeft de certificaten en ondertekenmechanismen terug die in één PKCS#11-slot zichtbaar zijn |
IPdfPkcs11SignerProvider.CloseProtectedSessions | Sluit beveiligde of geauthenticeerde PKCS#11-sessies die eigendom zijn van de provider |
IPdfCmsVerifier.BackendName | Geeft de weergavenaam van de verificatiebackend terug die PadesCmsVerificationBackendName meldt |
IPdfCmsVerifier.VerifyDetached | Verifieert een PDF-handtekening waarvan de ondertekende inhoud bestaat uit de twee bytebereiken aan weerszijden van het /Contents-gat |
IPdfCmsVerifier.VerifyAttached | Verifieert een timestamp-token dat zijn eigen inhoud meedraagt en geen gescheiden segmenten nodig heeft |
| Type | Description |
|---|---|
EPadesCrypto | Basisexceptie voor fouten in de cryptobackend |
EPadesCryptoUnavailable | Wordt verhoogd wanneer een vereiste signer-backend of certificaatpadvalidator niet is geconfigureerd |
TPadesPaddingScheme | psRsaPss, psRsaPkcs1v15 of psEcdsa |
TPadesSignerOptions | CertificateThumbprint kiest het certificaat en PaddingScheme kiest het handtekeningschema; Default gebruikt een lege thumbprint en psRsaPss |
TPadesChainCertArray | Dynamische array van DER-gecodeerde ketencertificaten |
TPadesResolvedSigner | Signer, SignerCertDer en ChainCertDer bundelen de opgeloste signer en het certificaatmateriaal |
TPdfRevocationMode | prmNone, prmOffline, prmOnlineAllowed of prmOnlineRequired |
TPdfStringArray | Dynamische stringarray die gebruikt wordt voor beleids-OIDs en mechanismenamen van providers |
TPdfCertificatePathOptions | ValidationTime, RevocationMode, RequiredPolicyOids, MaxCertificates, MaxCertificateBytes, MaxFetchBytes en MaxPathDepth sturen validatie en resourcebudgetten; Default kiest offline revocation met limieten van 64 certificaten, 4 MiB per certificaat, 16 MiB opgehaalde data en paddiepte 16 |
TPdfCertificatePathReport | Trusted, PathBuilt, PolicyValid, RevocationChecked, PathCertificateCount, ErrorCode en ErrorMessage rapporteren de validatie-uitkomst |
TPdfPkcs11Slot | SlotID, Description, TokenLabel en TokenPresent beschrijven één PKCS#11-slot |
TPdfPkcs11Slots | Dynamische array van TPdfPkcs11Slot-records |
TPdfPkcs11Certificate | SlotID, ObjectID, LabelText, CertificateDer en Mechanisms beschrijven één tokencertificaat |
TPdfPkcs11Certificates | Dynamische array van TPdfPkcs11Certificate-records |
TPadesSignerResolverProc | Functiepointertype voor de injectievar PadesSignerResolverOverride |
TPdfCmsVerifyStatus | pcvsUnavailable, pcvsValid, pcvsInvalid, pcvsUnsupported of pcvsIndeterminate |
TPdfCmsRevocationReason | pcrrNone, pcrrCertificateRevoked, pcrrCrlExpired, pcrrCrlNotYetValid, pcrrCrlUnavailable, pcrrCrlSignatureInvalid, pcrrCrlInvalid, pcrrChainUntrusted of pcrrUnknown, pcrrOcspUnavailable, pcrrOcspInvalid of pcrrOcspStatusUnknown legt revocatiebewijs apart naast de verificatiestatus |
TPdfCmsVerifyStage | pcvstCryptographicSignature, pcvstChainBuild, pcvstOnlineRetrieval of pcvstRevocationCheck |
TPdfCmsVerifyCheckpoint | Objectmethode-callback die elke TPdfCmsVerifyStage ontvangt terwijl de verificatie vordert |
TPdfCmsVerifyOptions | OnlineRetrieval, CheckRevocation, CollectChainCertificates, UrlRetrievalTimeoutMs en OnCheckpoint sturen één verificatie; CollectSignerDiagnostics vraagt om snapshots per signer en MaxSignerCount begrenst hun aantal. Default schakelt ophalen, intrekking en signer-diagnostiek uit, zet een ophaalbudget van 15 seconden en beperkt signersnapshots tot 64 |
TPdfCmsSignerVerifyResult | SignerIndex identificeert de volgorde van de gecodeerde SignerInfo; handtekening-, vertrouwens- en revocatiestatussen en native fouten beschrijven die signer afzonderlijk. SignerCertificate is het DER-certificaat ervan, terwijl RevocationCertificate het certificaat identificeert dat hoort bij een vastgelegde revocatiefout wanneer de backend dat kan leveren |
TPdfCmsSignerVerifyResults | Dynamische array van begrensde signersnapshots |
TPdfCmsVerifyResult | De geaggregeerde handtekening-, vertrouwens- en revocatiestatussen blijven onafhankelijk. Het record geeft ook SignatureError, TrustError, SignerCertificate, ChainCertificates, RevocationReason, RevocationError, RevocationCertificate, SignerResults, SignerDiagnosticsStatus en SignerCount terug |
Bouw verbruikende code opnieuw bij de upgrade, want de publieke optie- en resultaatrecords zijn gegroeid. Eigen verifier-implementaties moeten beheerde resultaatrecords initialiseren met Default(TPdfCmsVerifyResult) en niet-ondersteunde snapshotvelden onbeschikbaar laten; wis een levend record met strings of dynamische arrays niet met FillChar
Lees RevocationReason en RevocationError uit de TPdfCmsVerifyResult die IPdfCmsVerifier.VerifyDetached of VerifyAttached teruggeeft. PAdES-trustvalidatie geeft die door als RevocationReason en NativeRevocationError, met aparte velden TimeStampRevocationReason en NativeTimeStampRevocationError voor timestamp-tokens; evidencerapporten nemen beide paren op
RevocationError is een backendspecifieke native-verificatiecode, waarbij nul betekent dat er geen native diagnose is vastgelegd. OpenSSL gebruikt de X509_V_ERR_*-foutruimte. Windows bewaart een ruwe DWORD uit CERT_REVOCATION_INFO.dwRevocationResult van een certificaat, of uit GetLastError als de revocatieketenaanroep faalt; dit is geen uniforme HRESULT-foutruimte en ook niet de geaggregeerde chain-trust-bitmask
OpenSSL onderscheidt bevestigde intrekking van verlopen, onbereikbare of ongeldige CRL-bewijzen en van onbereikbaar, ongeldig of onbekend OCSP-bewijs. Windows meldt bevestigde intrekking, onbetrouwbare ketens of een onbekende native fout. De macOS-verifier evalueert handtekeningintegriteit, Basic X.509-trust en intrekking afzonderlijk en geeft native Security.framework-fouten terug zonder elke platformfout in een CRL- of OCSP-classificatie te vertalen
RevocationCertificate kan een ingetrokken intermediate identificeren in plaats van het CMS-signercertificaat; het is leeg wanneer de backend dat certificaat niet kan vastleggen. OpenSSL kan het verzamelen, terwijl de huidige macOS-backend het leeg laat
Weder pcrrNone noch een nulfout bewijst dat revocatie gecontroleerd is of geslaagd; kijk altijd naar RevocationStatus
Zet CollectSignerDiagnostics=True om begrensde snapshots in SignerResults te inspecteren. SignerCount is het gecodeerde SignerInfo-aantal zodra dat vaststaat; de waarde nul betekent dat het aantal niet is vastgesteld
SignerDiagnosticsStatus=pcvsValid betekent dat de gevraagde snapshots compleet zijn, ook snapshots van ongeldige handtekeningen; het betekent niet dat alle handtekeningen geslaagd zijn. pcvsUnavailable betekent dat verzameling uitgeschakeld of niet ondersteund was, en pcvsIndeterminate betekent dat de backend de gevraagde verzameling niet binnen zijn parse- of resourcelimieten kon afronden
De OpenSSL- en native macOS-implementaties begrenzen de verzameling op 64 signers. OpenSSL beperkt daarnaast de diagnostische CMS-invoer tot 4 MiB en het geaggregeerde diagnostische in-/uitvoerwerk tot 64 MiB; macOS begrenst teruggegeven certificaatmateriaal tot 4 MiB per certificaat en 64 MiB in totaal. Een lagere MaxSignerCount verlaagt het door de aanroeper gevraagde aantal verder
Signersnapshots hergebruiken geconfigureerd bewijs en bewijs dat tijdens de geaggregeerde verificatie is opgehaald. OpenSSL doet geen tweede netwerkophaling per diagnostische snapshot, en een onvolledige geaggregeerde ophaling kan geen geslaagde offline revocatiesnapshot worden
PadesSignerResolverOverride heeft prioriteit, gevolgd door een expliciet geregistreerde IPadesSignerProvider, en dan de platformstandaard. Niet-Windows-standaarden vereisen ConfigureSslSigningCredentials; de beschikbaarheid van alleen libcrypto levert geen privésleutel of certificaat
De OpenSSL-standaard wijst een niet-lege CertificateThumbprint af omdat het certificaat via expliciete configuratie is gekozen. Keychain-ondertekening blijft beschikbaar via ConfigureKeychainSignerProvider wanneer de applicatie die provider kiest
| Variable | Description |
|---|---|
PadesSignerResolverOverride | Optionele resolvercallback die vóór geregistreerde en platformproviders wordt geëvalueerd |
PadesCmsVerifier | Huidige CMS-verificatiebackend, normaal toegewezen via ConfigurePadesCmsVerifier |
PdfCertificatePathValidator | Huidige certificaatpadvalidator, normaal toegewezen via ConfigurePdfCertificatePathValidator |
PadesSignerProvider | Huidige signer-provider, normaal toegewezen via ConfigurePadesSignerProvider |