PDFium Delphi Component Docs

Unit FPdfCrypto

Unit: FPdfCrypto
PAdES-Fassade für Signer-Provider und Zertifikatsvalidierung für Plattform-Backends, PKCS#11-Integrationen, Trust Stores, Sperr-Datenquellen und begrenzte Pfadvalidierung

Syntax

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;

Beschreibung

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

Funktionen

FunktionBeschreibung
PadesCryptoAvailableGibt True zurück, wenn auf der aktuellen Plattform ein Krypto-Backend für die PAdES-Signatur verfügbar ist
PadesCryptoBackendNameGibt den Anzeigenamen des aktiven Krypto-Backends zurück
ResolvePadesSignerLöst einen Zertifikats-Fingerprint und ein Padding-Schema in einen Signer, ein Signer-Zertifikat und eine Kette auf
ConfigurePdfCertificatePathValidatorSetzt oder löscht den prozessweiten IPdfCertificatePathValidator, der von ValidatePdfCertificatePath verwendet wird
ValidatePdfCertificatePathValidiert ein Leaf-Zertifikat gegen Zwischenzertifikate und die kombinierten expliziten und Trust-Store-Anker, nachdem Zertifikatsanzahl-, Größen-, Abruf- und Pfadtiefen-Budgets erzwungen wurden
ConfigurePadesSignerProviderSetzt oder löscht den prozessweiten Signer-Provider, der vor dem Plattform-Backend verwendet wird
ConfigurePadesCmsVerifierInstalliert den CMS-Verifikationsbackend des PAdES-Validators; Entfernen stellt unter Windows CryptoAPI wieder her; andere Plattformen verlangen explizit ConfigureSslCmsVerifier oder ConfigureKeychainCmsVerifier
PadesCmsVerificationAvailableGibt True zurück, wenn in diesem Build irgendein Backend CMS verifizieren kann, ob registriert oder eingebaut
PadesCmsVerificationBackendNameLiefert den Anzeigenamen des aktiven Verifizierungs-Backends oder einen leeren String, wenn keins vorhanden ist

Provider-Schnittstellen

Schnittstellen-MemberBeschreibung
IPdfTrustStore.LoadTrustAnchorsLiefert zusätzliche DER-kodierte Trust Anchors unter den konfigurierten Zertifikats-Budgets
IPdfValidationFetcher.FetchRuft Validierungsmaterial von Uri ab, ohne MaxBytes zu überschreiten
IPdfCertificatePathValidator.ValidateErstellt und bewertet den Zertifikatspfad und füllt TPdfCertificatePathReport
IPadesSignerProvider.BackendNameLiefert den Providernamen, den PadesCryptoBackendName verfügbar macht
IPadesSignerProvider.ResolveLiefert vollständiges Signer-Material für die übergebenen TPadesSignerOptions
IPdfPkcs11SignerProvider.EnumerateSlotsLiefert die verfügbaren PKCS#11-Slots und Token-Präsenz-Metadaten
IPdfPkcs11SignerProvider.EnumerateCertificatesLiefert die in einem PKCS#11-Slot sichtbaren Zertifikate und Signatur-Mechanismen
IPdfPkcs11SignerProvider.CloseProtectedSessionsSchließt geschützte oder authentifizierte PKCS#11-Sessions, die dem Provider gehören
IPdfCmsVerifier.BackendNameLiefert den Anzeigenamen des Verifizierungs-Backends, den auch PadesCmsVerificationBackendName meldet
IPdfCmsVerifier.VerifyDetachedVerifiziert eine PDF-Signatur, deren signierter Inhalt die zwei Byte-Bereiche zu beiden Seiten des /Contents-Lochs sind
IPdfCmsVerifier.VerifyAttachedVerifiziert ein Zeitstempel-Token, das seinen eigenen Inhalt trägt und keine losgelösten Segmente benötigt

Typen

TypBeschreibung
EPadesCryptoBasis-Exception für Krypto-Backend-Fehler
EPadesCryptoUnavailableWird ausgelöst, wenn ein erforderliches Signer-Backend oder ein Zertifikatspfad-Validator nicht konfiguriert ist
TPadesPaddingSchemepsRsaPss, psRsaPkcs1v15 oder psEcdsa
TPadesSignerOptionsCertificateThumbprint wählt das Zertifikat und PaddingScheme das Signatur-Schema; Default verwendet einen leeren Fingerprint und psRsaPss
TPadesChainCertArrayDynamisches Array aus DER-kodierten Kettenzertifikaten
TPadesResolvedSignerSigner, SignerCertDer und ChainCertDer bündeln das aufgelöste Signer- und Zertifikatsmaterial
TPdfRevocationModeprmNone, prmOffline, prmOnlineAllowed oder prmOnlineRequired
TPdfStringArrayDynamisches String-Array für Richtlinien-OIDs und Provider-Mechanismusnamen
TPdfCertificatePathOptionsValidationTime, 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
TPdfCertificatePathReportTrusted, PathBuilt, PolicyValid, RevocationChecked, PathCertificateCount, ErrorCode und ErrorMessage melden das Validierungsergebnis
TPdfPkcs11SlotSlotID, Description, TokenLabel und TokenPresent beschreiben einen PKCS#11-Slot
TPdfPkcs11SlotsDynamisches Array von TPdfPkcs11Slot-Records
TPdfPkcs11CertificateSlotID, ObjectID, LabelText, CertificateDer und Mechanisms beschreiben ein Token-Zertifikat
TPdfPkcs11CertificatesDynamisches Array von TPdfPkcs11Certificate-Records
TPadesSignerResolverProcFunktionszeiger-Typ für die Injektions-Var PadesSignerResolverOverride
TPdfCmsVerifyStatuspcvsUnavailable, pcvsValid, pcvsInvalid, pcvsUnsupported oder pcvsIndeterminate
TPdfCmsRevocationReasonpcrrNone, pcrrCertificateRevoked, pcrrCrlExpired, pcrrCrlNotYetValid, pcrrCrlUnavailable, pcrrCrlSignatureInvalid, pcrrCrlInvalid, pcrrChainUntrusted, pcrrUnknown, pcrrOcspUnavailable, pcrrOcspInvalid oder pcrrOcspStatusUnknown erklärt Widerrufsnachweise getrennt vom Verifikationsstatus
TPdfCmsVerifyStagepcvstCryptographicSignature, pcvstChainBuild, pcvstOnlineRetrieval oder pcvstRevocationCheck
TPdfCmsVerifyCheckpointObject-Method-Callback, der bei fortschreitender Verifizierung jeden TPdfCmsVerifyStage empfängt
TPdfCmsVerifyOptionsOnlineRetrieval, 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
TPdfCmsSignerVerifyResultSignerIndex 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
TPdfCmsSignerVerifyResultsDynamisches Array begrenzter Signierersnapshots
TPdfCmsVerifyResultAggregierte Signatur-, Vertrauens- und Widerrufsstatus bleiben unabhängig; das Record liefert außerdem SignatureError, TrustError, SignerCertificate, ChainCertificates, RevocationReason, RevocationError, RevocationCertificate, SignerResults, SignerDiagnosticsStatus und SignerCount

Sperrdiagnose

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

Diagnosen pro Signierer

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

Standard-Signaturbackend

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

Globale Provider-Variablen

VariableBeschreibung
PadesSignerResolverOverrideOptionaler Resolver-Callback, der vor registrierten und Plattform-Providern ausgewertet wird
PadesCmsVerifierAktuelles CMS-Verifizierungs-Backend, normalerweise über ConfigurePadesCmsVerifier zugewiesen
PdfCertificatePathValidatorAktueller Zertifikatspfad-Validator, normalerweise über ConfigurePdfCertificatePathValidator zugewiesen
PadesSignerProviderAktueller Signer-Provider, normalerweise über ConfigurePadesSignerProvider zugewiesen

Siehe auch

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