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 ist der Einstieg in den PAdES-Signaturstack; PadesCryptoAvailable meldet verfügbare Signaturdaten und Backend, PadesCryptoBackendName benennt das Backend; Windows nutzt standardmäßig Cryptography Next Generation, andere Plattformen lösen explizit konfigurierte OpenSSL-Schlüssel und Zertifikate aus FPdfCryptoSsl auf
ResolvePadesSigner nimmt einen Zertifikats-Fingerprint und ein Padding-Schema entgegen und gibt einen vollständig gefüllten TPadesResolvedSigner zurück: die ICmsSigner-Implementierung, die die Private-Key-Operation ausführt, das Signer-Zertifikat als DER sowie die ausstellenden Kettenzertifikate. Das Ergebnis wird direkt an FPdfCms.BuildSignedData übergeben
Eigene Integrationen können einen IPadesSignerProvider registrieren, einschließlich eines IPdfPkcs11SignerProvider, der Token-Slots und Zertifikate aufzählt, oder PadesSignerResolverOverride als deterministische Resolver-Naht verwenden
Die Zertifikatspfad-Validierung ist providerbasiert und budgetiert: Aufrufer konfigurieren einen IPdfCertificatePathValidator, stellen optional explizite Trust Anchors, einen IPdfTrustStore und einen IPdfValidationFetcher bereit und werten dann TPdfCertificatePathReport aus
| Funktion | Beschreibung |
|---|---|
PadesCryptoAvailable | Gibt True zurück, wenn auf der aktuellen Plattform ein Krypto-Backend für die PAdES-Signatur verfügbar ist |
PadesCryptoBackendName | Gibt den Anzeigenamen des aktiven Krypto-Backends zurück |
ResolvePadesSigner | Löst einen Zertifikats-Fingerprint und ein Padding-Schema in einen Signer, ein Signer-Zertifikat und eine Kette auf |
ConfigurePdfCertificatePathValidator | Setzt oder löscht den prozessweiten IPdfCertificatePathValidator, der von ValidatePdfCertificatePath verwendet wird |
ValidatePdfCertificatePath | Validiert ein Leaf-Zertifikat gegen Zwischenzertifikate und die kombinierten expliziten und Trust-Store-Anker, nachdem Zertifikatsanzahl-, Größen-, Abruf- und Pfadtiefen-Budgets erzwungen wurden |
ConfigurePadesSignerProvider | Setzt oder löscht den prozessweiten Signer-Provider, der vor dem Plattform-Backend verwendet wird |
ConfigurePadesCmsVerifier | Installiert den CMS-Verifikationsbackend des PAdES-Validators; Entfernen stellt unter Windows CryptoAPI wieder her; andere Plattformen verlangen explizit ConfigureSslCmsVerifier oder ConfigureKeychainCmsVerifier |
PadesCmsVerificationAvailable | Gibt True zurück, wenn in diesem Build irgendein Backend CMS verifizieren kann, ob registriert oder eingebaut |
PadesCmsVerificationBackendName | Liefert den Anzeigenamen des aktiven Verifizierungs-Backends oder einen leeren String, wenn keins vorhanden ist |
| Schnittstellen-Member | Beschreibung |
|---|---|
IPdfTrustStore.LoadTrustAnchors | Liefert zusätzliche DER-kodierte Trust Anchors unter den konfigurierten Zertifikats-Budgets |
IPdfValidationFetcher.Fetch | Ruft Validierungsmaterial von Uri ab, ohne MaxBytes zu überschreiten |
IPdfCertificatePathValidator.Validate | Erstellt und bewertet den Zertifikatspfad und füllt TPdfCertificatePathReport |
IPadesSignerProvider.BackendName | Liefert den Providernamen, den PadesCryptoBackendName verfügbar macht |
IPadesSignerProvider.Resolve | Liefert vollständiges Signer-Material für die übergebenen TPadesSignerOptions |
IPdfPkcs11SignerProvider.EnumerateSlots | Liefert die verfügbaren PKCS#11-Slots und Token-Präsenz-Metadaten |
IPdfPkcs11SignerProvider.EnumerateCertificates | Liefert die in einem PKCS#11-Slot sichtbaren Zertifikate und Signatur-Mechanismen |
IPdfPkcs11SignerProvider.CloseProtectedSessions | Schließt geschützte oder authentifizierte PKCS#11-Sessions, die dem Provider gehören |
IPdfCmsVerifier.BackendName | Liefert den Anzeigenamen des Verifizierungs-Backends, den auch PadesCmsVerificationBackendName meldet |
IPdfCmsVerifier.VerifyDetached | Verifiziert eine PDF-Signatur, deren signierter Inhalt die zwei Byte-Bereiche zu beiden Seiten des /Contents-Lochs sind |
IPdfCmsVerifier.VerifyAttached | Verifiziert ein Zeitstempel-Token, das seinen eigenen Inhalt trägt und keine losgelösten Segmente benötigt |
| Typ | Beschreibung |
|---|---|
EPadesCrypto | Basis-Exception für Krypto-Backend-Fehler |
EPadesCryptoUnavailable | Wird ausgelöst, wenn ein erforderliches Signer-Backend oder ein Zertifikatspfad-Validator nicht konfiguriert ist |
TPadesPaddingScheme | psRsaPss, psRsaPkcs1v15 oder psEcdsa |
TPadesSignerOptions | CertificateThumbprint wählt das Zertifikat und PaddingScheme das Signatur-Schema; Default verwendet einen leeren Fingerprint und psRsaPss |
TPadesChainCertArray | Dynamisches Array aus DER-kodierten Kettenzertifikaten |
TPadesResolvedSigner | Signer, SignerCertDer und ChainCertDer bündeln das aufgelöste Signer- und Zertifikatsmaterial |
TPdfRevocationMode | prmNone, prmOffline, prmOnlineAllowed oder prmOnlineRequired |
TPdfStringArray | Dynamisches String-Array für Richtlinien-OIDs und Provider-Mechanismusnamen |
TPdfCertificatePathOptions | ValidationTime, RevocationMode, RequiredPolicyOids, MaxCertificates, MaxCertificateBytes, MaxFetchBytes und MaxPathDepth steuern Validierung und Ressourcen-Budgets; Default wählt Offline-Sperrprüfung mit Grenzen von 64 Zertifikaten, 4 MiB pro Zertifikat, 16 MiB abgerufenen Daten und Pfadtiefe 16 |
TPdfCertificatePathReport | Trusted, PathBuilt, PolicyValid, RevocationChecked, PathCertificateCount, ErrorCode und ErrorMessage melden das Validierungsergebnis |
TPdfPkcs11Slot | SlotID, Description, TokenLabel und TokenPresent beschreiben einen PKCS#11-Slot |
TPdfPkcs11Slots | Dynamisches Array von TPdfPkcs11Slot-Records |
TPdfPkcs11Certificate | SlotID, ObjectID, LabelText, CertificateDer und Mechanisms beschreiben ein Token-Zertifikat |
TPdfPkcs11Certificates | Dynamisches Array von TPdfPkcs11Certificate-Records |
TPadesSignerResolverProc | Funktionszeiger-Typ für die Injektions-Var PadesSignerResolverOverride |
TPdfCmsVerifyStatus | pcvsUnavailable, pcvsValid, pcvsInvalid, pcvsUnsupported oder pcvsIndeterminate |
TPdfCmsRevocationReason | pcrrNone, pcrrCertificateRevoked, pcrrCrlExpired, pcrrCrlNotYetValid, pcrrCrlUnavailable, pcrrCrlSignatureInvalid, pcrrCrlInvalid, pcrrChainUntrusted, pcrrUnknown, pcrrOcspUnavailable, pcrrOcspInvalid oder pcrrOcspStatusUnknown erklärt Widerrufsnachweise getrennt vom Verifikationsstatus |
TPdfCmsVerifyStage | pcvstCryptographicSignature, pcvstChainBuild, pcvstOnlineRetrieval oder pcvstRevocationCheck |
TPdfCmsVerifyCheckpoint | Object-Method-Callback, der bei fortschreitender Verifizierung jeden TPdfCmsVerifyStage empfängt |
TPdfCmsVerifyOptions | OnlineRetrieval, CheckRevocation, CollectChainCertificates, UrlRetrievalTimeoutMs und OnCheckpoint steuern die Prüfung; CollectSignerDiagnostics fordert Signatursnapshots an, MaxSignerCount begrenzt sie; Default deaktiviert Abruf, Widerruf und Diagnosen, setzt 15 Sekunden Abrufbudget und höchstens 64 Snapshots |
TPdfCmsSignerVerifyResult | SignerIndex folgt der codierten SignerInfo-Reihenfolge; Signatur-, Vertrauens-, Widerrufsstatus und native Fehler beschreiben den Signierer unabhängig; SignerCertificate ist sein DER-Zertifikat, RevocationCertificate das betroffene Zertifikat eines erfassten Widerrufsfehlers, sofern das Backend es liefern kann |
TPdfCmsSignerVerifyResults | Dynamisches Array begrenzter Signierersnapshots |
TPdfCmsVerifyResult | Aggregierte Signatur-, Vertrauens- und Widerrufsstatus bleiben unabhängig; das Record liefert außerdem SignatureError, TrustError, SignerCertificate, ChainCertificates, RevocationReason, RevocationError, RevocationCertificate, SignerResults, SignerDiagnosticsStatus und SignerCount |
Kompilieren Sie Verbraucher beim Upgrade neu, da öffentliche Options- und Ergebnisrecords gewachsen sind; eigene Verifikatoren sollten verwaltete Ergebnisse mit Default(TPdfCmsVerifyResult) initialisieren und nicht unterstützte Snapshots unavailable lassen; verwenden Sie kein FillChar für lebende Records mit Strings oder dynamischen Arrays
Lesen Sie RevocationReason und RevocationError aus dem TPdfCmsVerifyResult, das IPdfCmsVerifier.VerifyDetached oder VerifyAttached zurückgibt. Die PAdES-Trust-Validierung führt sie als RevocationReason und NativeRevocationError weiter, mit eigenen Feldern TimeStampRevocationReason und NativeTimeStampRevocationError für Zeitstempel-Token; Evidence-Reports enthalten beide Paare
RevocationError ist ein backend-spezifischer nativer Verifizierungscode, null bedeutet, dass keine native Diagnose erfasst wurde. OpenSSL nutzt den X509_V_ERR_*-Fehlerraum. Windows bewahrt einen rohen DWORD aus dem CERT_REVOCATION_INFO.dwRevocationResult eines Zertifikats auf, oder aus GetLastError, wenn sein Revocation-Chain-Aufruf fehlschlägt; das ist weder ein einheitlicher HRESULT-Fehlerraum noch die aggregierte Chain-Trust-Bitmaske
OpenSSL unterscheidet bestätigten Widerruf von abgelaufenen, fehlenden oder ungültigen CRLs und fehlenden, ungültigen oder unbekannten OCSP-Nachweisen; Windows meldet bestätigten Widerruf, nicht vertrauenswürdige Ketten oder unbekannte native Fehler; macOS prüft Integrität, Basic-X.509-Vertrauen und Widerruf separat und liefert Security.framework-Fehler ohne jeden Plattformfehler als CRL/OCSP zu klassifizieren
RevocationCertificate kann ein widerrufenes Zwischenzertifikat statt des CMS-Signaturzertifikats bezeichnen; es bleibt leer, wenn keine Erfassung möglich ist; OpenSSL unterstützt sie, macOS derzeit nicht
Weder pcrrNone noch ein Nullfehler beweisen, dass die Sperrprüfung durchgeführt oder bestanden wurde; sehen Sie sich immer RevocationStatus an
CollectSignerDiagnostics=True liefert begrenzte Snapshots in SignerResults; SignerCount ist die festgestellte codierte SignerInfo-Anzahl, null bedeutet nicht festgestellt
SignerDiagnosticsStatus=pcvsValid bedeutet vollständige angeforderte Snapshots, auch ungültiger Signaturen, nicht erfolgreiche Signaturen; pcvsUnavailable bedeutet deaktiviert oder nicht unterstützt, pcvsIndeterminate innerhalb der Parser-/Ressourcenlimits nicht abschließbar
OpenSSL und natives macOS begrenzen auf 64 Signierer; OpenSSL zusätzlich auf 4 MiB Diagnose-CMS und 64 MiB gesamte Diagnoseein-/ausgabe; macOS auf 4 MiB pro zurückgegebenem Zertifikat und 64 MiB insgesamt; kleineres MaxSignerCount reduziert die Anfrage weiter
Snapshots verwenden konfigurierte und während aggregierter Prüfung abgerufene Nachweise erneut; OpenSSL startet keinen zweiten Netzwerkabruf je Snapshot; unvollständiger aggregierter Abruf wird nicht zu erfolgreichem Offline-Widerruf
PadesSignerResolverOverride hat Vorrang, dann explizit registrierter IPadesSignerProvider, dann Plattformstandard; außerhalb Windows ist ConfigureSslSigningCredentials erforderlich; libcrypto allein liefert weder privaten Schlüssel noch Zertifikat
Der OpenSSL-Standard lehnt nicht leeren CertificateThumbprint ab, weil Konfiguration das Zertifikat bereits gewählt hat; Keychain-Signatur bleibt über ConfigureKeychainSignerProvider verfügbar, wenn die Anwendung diesen Provider wählt
| Variable | Beschreibung |
|---|---|
PadesSignerResolverOverride | Optionaler Resolver-Callback, der vor registrierten und Plattform-Providern ausgewertet wird |
PadesCmsVerifier | Aktuelles CMS-Verifizierungs-Backend, normalerweise über ConfigurePadesCmsVerifier zugewiesen |
PdfCertificatePathValidator | Aktueller Zertifikatspfad-Validator, normalerweise über ConfigurePdfCertificatePathValidator zugewiesen |
PadesSignerProvider | Aktueller Signer-Provider, normalerweise über ConfigurePadesSignerProvider zugewiesen |