PDFium Component Docs

FPdfCrypto unit

Unit: FPdfCrypto
PAdES-signer-provider- en certificaatvalidatiefacade voor platformbackends, PKCS#11-integraties, trust stores, revocation-fetchers en begrensde padvalidatie

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);
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;

Description

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

Functions

FunctionDescription
PadesCryptoAvailableGeeft True terug wanneer er op het huidige platform een cryptobackend beschikbaar is voor PAdES-ondertekening
PadesCryptoBackendNameGeeft de weergavenaam van de actieve cryptobackend terug
ResolvePadesSignerZet een certificaat-thumbprint en padding-schema om in een signer, signercertificaat en keten
ConfigurePdfCertificatePathValidatorStelt de procesbrede IPdfCertificatePathValidator in of wist deze; deze wordt gebruikt door ValidatePdfCertificatePath
ValidatePdfCertificatePathValideert een leaf-certificaat tegen intermediates en de gecombineerde expliciete en trust-store-anchors, na handhaving van budgetten voor certificaataantal, -grootte, fetches en paddiepte
ConfigurePadesSignerProviderStelt de procesbrede signer-provider in of wist deze; deze wordt vóór de platformbackend gebruikt
ConfigurePadesCmsVerifierInstalleert 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
PadesCmsVerificationAvailableGeeft True terug wanneer er op deze build een backend is die CMS kan verifiëren, geregistreerd of ingebouwd
PadesCmsVerificationBackendNameGeeft de weergavenaam van de actieve verificatiebackend terug, of een lege string als er geen is

Provider interfaces

Interface memberDescription
IPdfTrustStore.LoadTrustAnchorsGeeft aanvullende DER-gecodeerde trust anchors terug, binnen de geconfigureerde certificaatbudgetten
IPdfValidationFetcher.FetchHaalt validatiemateriaal op van Uri zonder MaxBytes te overschrijden
IPdfCertificatePathValidator.ValidateBouwt en evalueert het certificaatpad en vult TPdfCertificatePathReport
IPadesSignerProvider.BackendNameGeeft de weergavenaam van de provider terug die door PadesCryptoBackendName ontsloten wordt
IPadesSignerProvider.ResolveGeeft volledig signermateriaal terug voor de aangeleverde TPadesSignerOptions
IPdfPkcs11SignerProvider.EnumerateSlotsGeeft de beschikbare PKCS#11-slots en de token-presence-metadata terug
IPdfPkcs11SignerProvider.EnumerateCertificatesGeeft de certificaten en ondertekenmechanismen terug die in één PKCS#11-slot zichtbaar zijn
IPdfPkcs11SignerProvider.CloseProtectedSessionsSluit beveiligde of geauthenticeerde PKCS#11-sessies die eigendom zijn van de provider
IPdfCmsVerifier.BackendNameGeeft de weergavenaam van de verificatiebackend terug die PadesCmsVerificationBackendName meldt
IPdfCmsVerifier.VerifyDetachedVerifieert een PDF-handtekening waarvan de ondertekende inhoud bestaat uit de twee bytebereiken aan weerszijden van het /Contents-gat
IPdfCmsVerifier.VerifyAttachedVerifieert een timestamp-token dat zijn eigen inhoud meedraagt en geen gescheiden segmenten nodig heeft

Types

TypeDescription
EPadesCryptoBasisexceptie voor fouten in de cryptobackend
EPadesCryptoUnavailableWordt verhoogd wanneer een vereiste signer-backend of certificaatpadvalidator niet is geconfigureerd
TPadesPaddingSchemepsRsaPss, psRsaPkcs1v15 of psEcdsa
TPadesSignerOptionsCertificateThumbprint kiest het certificaat en PaddingScheme kiest het handtekeningschema; Default gebruikt een lege thumbprint en psRsaPss
TPadesChainCertArrayDynamische array van DER-gecodeerde ketencertificaten
TPadesResolvedSignerSigner, SignerCertDer en ChainCertDer bundelen de opgeloste signer en het certificaatmateriaal
TPdfRevocationModeprmNone, prmOffline, prmOnlineAllowed of prmOnlineRequired
TPdfStringArrayDynamische stringarray die gebruikt wordt voor beleids-OIDs en mechanismenamen van providers
TPdfCertificatePathOptionsValidationTime, 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
TPdfCertificatePathReportTrusted, PathBuilt, PolicyValid, RevocationChecked, PathCertificateCount, ErrorCode en ErrorMessage rapporteren de validatie-uitkomst
TPdfPkcs11SlotSlotID, Description, TokenLabel en TokenPresent beschrijven één PKCS#11-slot
TPdfPkcs11SlotsDynamische array van TPdfPkcs11Slot-records
TPdfPkcs11CertificateSlotID, ObjectID, LabelText, CertificateDer en Mechanisms beschrijven één tokencertificaat
TPdfPkcs11CertificatesDynamische array van TPdfPkcs11Certificate-records
TPadesSignerResolverProcFunctiepointertype voor de injectievar PadesSignerResolverOverride
TPdfCmsVerifyStatuspcvsUnavailable, pcvsValid, pcvsInvalid, pcvsUnsupported of pcvsIndeterminate
TPdfCmsRevocationReasonpcrrNone, pcrrCertificateRevoked, pcrrCrlExpired, pcrrCrlNotYetValid, pcrrCrlUnavailable, pcrrCrlSignatureInvalid, pcrrCrlInvalid, pcrrChainUntrusted of pcrrUnknown, pcrrOcspUnavailable, pcrrOcspInvalid of pcrrOcspStatusUnknown legt revocatiebewijs apart naast de verificatiestatus
TPdfCmsVerifyStagepcvstCryptographicSignature, pcvstChainBuild, pcvstOnlineRetrieval of pcvstRevocationCheck
TPdfCmsVerifyCheckpointObjectmethode-callback die elke TPdfCmsVerifyStage ontvangt terwijl de verificatie vordert
TPdfCmsVerifyOptionsOnlineRetrieval, 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
TPdfCmsSignerVerifyResultSignerIndex 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
TPdfCmsSignerVerifyResultsDynamische array van begrensde signersnapshots
TPdfCmsVerifyResultDe geaggregeerde handtekening-, vertrouwens- en revocatiestatussen blijven onafhankelijk. Het record geeft ook SignatureError, TrustError, SignerCertificate, ChainCertificates, RevocationReason, RevocationError, RevocationCertificate, SignerResults, SignerDiagnosticsStatus en SignerCount terug

Revocation diagnostics

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

Diagnostiek per signer

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

Standaardondertekeningsbackend

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

Global provider variables

VariableDescription
PadesSignerResolverOverrideOptionele resolvercallback die vóór geregistreerde en platformproviders wordt geëvalueerd
PadesCmsVerifierHuidige CMS-verificatiebackend, normaal toegewezen via ConfigurePadesCmsVerifier
PdfCertificatePathValidatorHuidige certificaatpadvalidator, normaal toegewezen via ConfigurePdfCertificatePathValidator
PadesSignerProviderHuidige signer-provider, normaal toegewezen via ConfigurePadesSignerProvider

See Also

FPdfCms, FPdfCryptoWin, FPdfTsa, TPdf.SignPades