PDFium Component Docs

FPdfCrypto Moduł

Unit: FPdfCrypto
Fasada dostawców podpisujących PAdES i walidacji certyfikatów dla zapleczy platformowych, integracji PKCS#11, magazynów zaufania, pobieraczy unieważnień i ograniczonej walidacji ścieżki

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 to przednie drzwi stosu podpisywania PAdES. PadesCryptoAvailable raportuje, czy na bieżącej platformie podłączono zaplecze kryptograficzne, a PadesCryptoBackendName je identyfikuje; w systemie Windows zaplecze Cryptography Next Generation z FPdfCryptoWin jest wiązane automatycznie

ResolvePadesSigner przyjmuje odcisk palca certyfikatu i schemat dopełnienia, a zwraca w pełni wypełnioną strukturę TPadesResolvedSigner: implementację ICmsSigner wykonującą operację klucza prywatnego, certyfikat DER podpisującego oraz certyfikaty łańcucha wydawców. Wynik trafia bezpośrednio do FPdfCms.BuildSignedData

Własne integracje mogą zarejestrować IPadesSignerProvider, w tym IPdfPkcs11SignerProvider wyliczający gniazda tokenów i certyfikaty, albo użyć PadesSignerResolverOverride jako deterministycznego punktu zaczepienia resolvera

Walidacja ścieżki certyfikatów jest oparta na dostawcach i budżetowana: wywołujący konfigurują IPdfCertificatePathValidator, opcjonalnie dostarczają jawne kotwice zaufania, IPdfTrustStore i IPdfValidationFetcher, a następnie badają TPdfCertificatePathReport

Functions

FunctionDescription
PadesCryptoAvailableZwraca True, gdy zaplecze kryptograficzne do podpisywania PAdES jest dostępne na bieżącej platformie
PadesCryptoBackendNameZwraca nazwę wyświetlaną aktywnego zaplecza kryptograficznego
ResolvePadesSignerRozwiązuje odcisk palca certyfikatu i schemat dopełnienia w podpisującego, certyfikat podpisującego i łańcuch
ConfigurePdfCertificatePathValidatorUstawia lub czyści ogólnoprocesowy IPdfCertificatePathValidator używany przez ValidatePdfCertificatePath
ValidatePdfCertificatePathWaliduje certyfikat liścia względem certyfikatów pośrednich oraz połączonych jawnych kotwic i kotwic z magazynu zaufania po wymuszeniu budżetów liczby certyfikatów, rozmiaru, pobierania i głębokości ścieżki
ConfigurePadesSignerProviderUstawia lub czyści ogólnoprocesowego dostawcę podpisującego używanego przed zapleczem platformowym
ConfigurePadesCmsVerifierInstaluje zaplecze weryfikacji CMS używane przez walidator PAdES; jego wyczyszczenie przywraca Windows CryptoAPI na Windows. Inne platformy wymagają jawnego wywołania ConfigureSslCmsVerifier lub ConfigureKeychainCmsVerifier
PadesCmsVerificationAvailableZwraca True, gdy jakieś zaplecze potrafi weryfikować CMS w tej kompilacji, niezależnie od tego, czy jest zarejestrowane, czy wbudowane
PadesCmsVerificationBackendNameZwraca nazwę wyświetlaną aktywnego zaplecza weryfikacji albo pusty ciąg, gdy żadnego nie ma

Provider interfaces

Interface memberDescription
IPdfTrustStore.LoadTrustAnchorsZwraca dodatkowe kotwice zaufania zakodowane w DER, podlegające skonfigurowanym budżetom certyfikatów
IPdfValidationFetcher.FetchPobiera materiał walidacji z Uri bez przekraczania MaxBytes
IPdfCertificatePathValidator.ValidateBuduje i ocenia ścieżkę certyfikatów oraz wypełnia TPdfCertificatePathReport
IPadesSignerProvider.BackendNameZwraca nazwę wyświetlaną dostawcy udostępnianą przez PadesCryptoBackendName
IPadesSignerProvider.ResolveZwraca kompletny materiał podpisującego dla dostarczonych TPadesSignerOptions
IPdfPkcs11SignerProvider.EnumerateSlotsZwraca dostępne gniazda PKCS#11 i metadane obecności tokena
IPdfPkcs11SignerProvider.EnumerateCertificatesZwraca certyfikaty i mechanizmy podpisywania widoczne w jednym gnieździe PKCS#11
IPdfPkcs11SignerProvider.CloseProtectedSessionsZamyka chronione lub uwierzytelnione sesje PKCS#11 należące do dostawcy
IPdfCmsVerifier.BackendNameZwraca nazwę wyświetlaną zaplecza weryfikacji, raportowaną przez PadesCmsVerificationBackendName
IPdfCmsVerifier.VerifyDetachedWeryfikuje podpis PDF, którego podpisana treść to dwa zakresy bajtów po obu stronach dziury /Contents
IPdfCmsVerifier.VerifyAttachedWeryfikuje token znacznika czasu, który niesie własną treść i nie potrzebuje segmentów odłączonych

Types

TypeDescription
EPadesCryptoWyjątek bazowy dla niepowodzeń zaplecza kryptograficznego
EPadesCryptoUnavailableZgłaszany, gdy wymagane zaplecze podpisującego lub walidator ścieżki certyfikatów nie jest skonfigurowane
TPadesPaddingSchemepsRsaPss, psRsaPkcs1v15 lub psEcdsa
TPadesSignerOptionsCertificateThumbprint wybiera certyfikat, a PaddingScheme wybiera schemat podpisu; Default używa pustego odcisku i psRsaPss
TPadesChainCertArrayTablica dynamiczna certyfikatów łańcucha zakodowanych w DER
TPadesResolvedSignerSigner, SignerCertDer i ChainCertDer zestawiają rozwiązany materiał podpisującego i certyfikatów
TPdfRevocationModeprmNone, prmOffline, prmOnlineAllowed lub prmOnlineRequired
TPdfStringArrayTablica dynamiczna ciągów używana dla OID polityk i nazw mechanizmów dostawcy
TPdfCertificatePathOptionsValidationTime, RevocationMode, RequiredPolicyOids, MaxCertificates, MaxCertificateBytes, MaxFetchBytes i MaxPathDepth sterują walidacją i budżetami zasobów; Default wybiera unieważnienia offline z limitami 64 certyfikatów, 4 MiB na certyfikat, 16 MiB pobieranych danych i głębokości ścieżki 16
TPdfCertificatePathReportTrusted, PathBuilt, PolicyValid, RevocationChecked, PathCertificateCount, ErrorCode i ErrorMessage zgłaszają wynik walidacji
TPdfPkcs11SlotSlotID, Description, TokenLabel i TokenPresent opisują jedno gniazdo PKCS#11
TPdfPkcs11SlotsTablica dynamiczna rekordów TPdfPkcs11Slot
TPdfPkcs11CertificateSlotID, ObjectID, LabelText, CertificateDer i Mechanisms opisują jeden certyfikat tokena
TPdfPkcs11CertificatesTablica dynamiczna rekordów TPdfPkcs11Certificate
TPadesSignerResolverProcTyp wskaźnika funkcji dla zmiennej wstrzykiwania PadesSignerResolverOverride
TPdfCmsVerifyStatuspcvsUnavailable, pcvsValid, pcvsInvalid, pcvsUnsupported lub pcvsIndeterminate
TPdfCmsRevocationReasonpcrrNone, pcrrCertificateRevoked, pcrrCrlExpired, pcrrCrlNotYetValid, pcrrCrlUnavailable, pcrrCrlSignatureInvalid, pcrrCrlInvalid, pcrrChainUntrusted, pcrrUnknown, pcrrOcspUnavailable, pcrrOcspInvalid lub pcrrOcspStatusUnknown wyjaśnia dowody unieważnienia niezależnie od statusu weryfikacji
TPdfCmsVerifyStagepcvstCryptographicSignature, pcvstChainBuild, pcvstOnlineRetrieval lub pcvstRevocationCheck
TPdfCmsVerifyCheckpointWywołanie zwrotne metody obiektu otrzymujące każdy TPdfCmsVerifyStage w miarę postępu weryfikacji
TPdfCmsVerifyOptionsOnlineRetrieval, CheckRevocation, CollectChainCertificates, UrlRetrievalTimeoutMs i OnCheckpoint sterują weryfikacją; CollectSignerDiagnostics żąda migawek na podpisującego, a MaxSignerCount ogranicza ich liczbę. Default wyłącza pobieranie, unieważnienia i diagnostykę podpisujących, ustawia budżet pobierania 15 sekund i ogranicza migawki podpisujących do 64
TPdfCmsSignerVerifyResultSignerIndex identyfikuje kolejność zakodowanych SignerInfo; statusy podpisu, zaufania i unieważnienia oraz natywne błędy opisują tego podpisującego niezależnie. SignerCertificate to jego certyfikat DER, a RevocationCertificate identyfikuje certyfikat powiązany z przechwyconym błędem unieważnienia, gdy zaplecze potrafi go dostarczyć
TPdfCmsSignerVerifyResultsTablica dynamiczna ograniczonych migawek podpisujących
TPdfCmsVerifyResultZagregowane statusy podpisu, zaufania i unieważnienia pozostają niezależne. Rekord zwraca także SignatureError, TrustError, SignerCertificate, ChainCertificates, RevocationReason, RevocationError, RevocationCertificate, SignerResults, SignerDiagnosticsStatus i SignerCount

Diagnostyka unieważnień

Przy aktualizacji przebuduj kod konsumujący, bo publiczny rekord opcji i wyniku się rozrósł. Własne weryfikatory powinny inicjalizować zarządzane rekordy wyników przez Default(TPdfCmsVerifyResult) i pozostawiać nieobsługiwane pola migawek jako niedostępne; nie czyść aktywnego rekordu zawierającego ciągi ani tablice dynamiczne przez FillChar

Pola RevocationReason i RevocationError czytaj z TPdfCmsVerifyResult zwracanego przez IPdfCmsVerifier.VerifyDetached lub VerifyAttached. Walidacja zaufania PAdES zachowuje je jako RevocationReason i NativeRevocationError, a dla tokenów znaczników czasu przewidziano osobne pola TimeStampRevocationReason i NativeTimeStampRevocationError; raporty dowodowe zawierają obie pary

RevocationError to zależny od backendu natywny kod weryfikacji, przy czym zero oznacza, że nie przechwycono żadnej natywnej diagnostyki. OpenSSL używa przestrzeni błędów X509_V_ERR_*. Windows zachowuje surowy DWORD z CERT_REVOCATION_INFO.dwRevocationResult certyfikatu albo z GetLastError, gdy wywołanie łańcucha unieważnień się nie powiedzie; nie jest to jednolita przestrzeń błędów HRESULT ani zagregowana bitmaska zaufania łańcucha

OpenSSL rozróżnia potwierdzone unieważnienie od wygasłych, niedostępnych lub uszkodzonych dowodów CRL oraz od niedostępnych, uszkodzonych lub nieznanych dowodów OCSP. Windows zgłasza potwierdzone unieważnienie, niezaufane łańcuchy lub nieznaną natywną awarię. Weryfikator macOS ocenia integralność podpisu, zaufanie Basic X.509 i unieważnienie osobno, zwracając natywne błędy Security.framework bez tłumaczenia każdej awarii platformy na klasyfikację CRL lub OCSP

RevocationCertificate może wskazywać unieważniony certyfikat pośredni, a nie certyfikat podpisującego CMS; jest puste, gdy zaplecze nie potrafi przechwycić tego certyfikatu. OpenSSL potrafi go zebrać, natomiast obecne zaplecze macOS pozostawia je puste

Ani pcrrNone, ani zerowy kod błędu nie dowodzą, że sprawdzenie unieważnienia wykonano lub przeszło pomyślnie; zawsze oglądaj RevocationStatus

Per-signer diagnostics

Ustaw CollectSignerDiagnostics=True, aby zbadać ograniczone migawki w SignerResults. SignerCount to liczba zakodowanych SignerInfo, gdy została ustalona; wartość zero oznacza, że liczby nie ustalono

SignerDiagnosticsStatus=pcvsValid oznacza, że żądane migawki są kompletne, w tym migawki niepoprawnych podpisów; nie oznacza, że wszystkie podpisy przeszły. pcvsUnavailable oznacza, że zbieranie wyłączono lub go nie obsługiwano, a pcvsIndeterminate oznacza, że zaplecze nie zdołało ukończyć żądanego zbierania w ramach limitów parsowania lub zasobów

Implementacje OpenSSL i natywnego macOS ograniczają zbieranie do 64 podpisujących. OpenSSL dodatkowo ogranicza wejście diagnostyczne CMS do 4 MiB, a łączne prace wejścia/wyjścia diagnostyki do 64 MiB; macOS ogranicza zwracany materiał certyfikatów do 4 MiB na certyfikat i 64 MiB łącznie. Niższy MaxSignerCount dodatkowo zmniejsza żądaną liczbę wywołującego

Migawki podpisujących ponownie używają skonfigurowanych dowodów oraz dowodów pobranych podczas weryfikacji zbiorczej. OpenSSL nie wykonuje drugiego pobierania sieciowego dla każdej migawki diagnostycznej, a niekompletne pobranie zbiorcze nie może stać się udaną migawką unieważnienia offline

Default signing backend

PadesSignerResolverOverride ma priorytet, następnie jawnie zarejestrowany IPadesSignerProvider, a potem domyślne zaplecze platformy. Domyślne ustawienia inne niż Windows wymagają ConfigureSslSigningCredentials; sama dostępność libcrypto nie dostarcza klucza prywatnego ani certyfikatu

Domyślne zaplecze OpenSSL odrzuca niepusty CertificateThumbprint, ponieważ jego certyfikat wybrano jawną konfiguracją. Podpisywanie przez Keychain pozostaje dostępne przez ConfigureKeychainSignerProvider, gdy aplikacja wybierze tego dostawcę

Global provider variables

VariableDescription
PadesSignerResolverOverrideOpcjonalne wywołanie zwrotne resolvera oceniane przed dostawcami zarejestrowanymi i platformowymi
PadesCmsVerifierBieżące zaplecze weryfikacji CMS, normalnie przypisywane przez ConfigurePadesCmsVerifier
PdfCertificatePathValidatorBieżący walidator ścieżki certyfikatów, normalnie przypisywany przez ConfigurePdfCertificatePathValidator
PadesSignerProviderBieżący dostawca podpisującego, normalnie przypisywany przez ConfigurePadesSignerProvider

See Also

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