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 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
| Function | Description |
|---|---|
PadesCryptoAvailable | Zwraca True, gdy zaplecze kryptograficzne do podpisywania PAdES jest dostępne na bieżącej platformie |
PadesCryptoBackendName | Zwraca nazwę wyświetlaną aktywnego zaplecza kryptograficznego |
ResolvePadesSigner | Rozwiązuje odcisk palca certyfikatu i schemat dopełnienia w podpisującego, certyfikat podpisującego i łańcuch |
ConfigurePdfCertificatePathValidator | Ustawia lub czyści ogólnoprocesowy IPdfCertificatePathValidator używany przez ValidatePdfCertificatePath |
ValidatePdfCertificatePath | Waliduje 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 |
ConfigurePadesSignerProvider | Ustawia lub czyści ogólnoprocesowego dostawcę podpisującego używanego przed zapleczem platformowym |
ConfigurePadesCmsVerifier | Instaluje zaplecze weryfikacji CMS używane przez walidator PAdES; jego wyczyszczenie przywraca Windows CryptoAPI na Windows. Inne platformy wymagają jawnego wywołania ConfigureSslCmsVerifier lub ConfigureKeychainCmsVerifier |
PadesCmsVerificationAvailable | Zwraca True, gdy jakieś zaplecze potrafi weryfikować CMS w tej kompilacji, niezależnie od tego, czy jest zarejestrowane, czy wbudowane |
PadesCmsVerificationBackendName | Zwraca nazwę wyświetlaną aktywnego zaplecza weryfikacji albo pusty ciąg, gdy żadnego nie ma |
| Interface member | Description |
|---|---|
IPdfTrustStore.LoadTrustAnchors | Zwraca dodatkowe kotwice zaufania zakodowane w DER, podlegające skonfigurowanym budżetom certyfikatów |
IPdfValidationFetcher.Fetch | Pobiera materiał walidacji z Uri bez przekraczania MaxBytes |
IPdfCertificatePathValidator.Validate | Buduje i ocenia ścieżkę certyfikatów oraz wypełnia TPdfCertificatePathReport |
IPadesSignerProvider.BackendName | Zwraca nazwę wyświetlaną dostawcy udostępnianą przez PadesCryptoBackendName |
IPadesSignerProvider.Resolve | Zwraca kompletny materiał podpisującego dla dostarczonych TPadesSignerOptions |
IPdfPkcs11SignerProvider.EnumerateSlots | Zwraca dostępne gniazda PKCS#11 i metadane obecności tokena |
IPdfPkcs11SignerProvider.EnumerateCertificates | Zwraca certyfikaty i mechanizmy podpisywania widoczne w jednym gnieździe PKCS#11 |
IPdfPkcs11SignerProvider.CloseProtectedSessions | Zamyka chronione lub uwierzytelnione sesje PKCS#11 należące do dostawcy |
IPdfCmsVerifier.BackendName | Zwraca nazwę wyświetlaną zaplecza weryfikacji, raportowaną przez PadesCmsVerificationBackendName |
IPdfCmsVerifier.VerifyDetached | Weryfikuje podpis PDF, którego podpisana treść to dwa zakresy bajtów po obu stronach dziury /Contents |
IPdfCmsVerifier.VerifyAttached | Weryfikuje token znacznika czasu, który niesie własną treść i nie potrzebuje segmentów odłączonych |
| Type | Description |
|---|---|
EPadesCrypto | Wyjątek bazowy dla niepowodzeń zaplecza kryptograficznego |
EPadesCryptoUnavailable | Zgłaszany, gdy wymagane zaplecze podpisującego lub walidator ścieżki certyfikatów nie jest skonfigurowane |
TPadesPaddingScheme | psRsaPss, psRsaPkcs1v15 lub psEcdsa |
TPadesSignerOptions | CertificateThumbprint wybiera certyfikat, a PaddingScheme wybiera schemat podpisu; Default używa pustego odcisku i psRsaPss |
TPadesChainCertArray | Tablica dynamiczna certyfikatów łańcucha zakodowanych w DER |
TPadesResolvedSigner | Signer, SignerCertDer i ChainCertDer zestawiają rozwiązany materiał podpisującego i certyfikatów |
TPdfRevocationMode | prmNone, prmOffline, prmOnlineAllowed lub prmOnlineRequired |
TPdfStringArray | Tablica dynamiczna ciągów używana dla OID polityk i nazw mechanizmów dostawcy |
TPdfCertificatePathOptions | ValidationTime, 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 |
TPdfCertificatePathReport | Trusted, PathBuilt, PolicyValid, RevocationChecked, PathCertificateCount, ErrorCode i ErrorMessage zgłaszają wynik walidacji |
TPdfPkcs11Slot | SlotID, Description, TokenLabel i TokenPresent opisują jedno gniazdo PKCS#11 |
TPdfPkcs11Slots | Tablica dynamiczna rekordów TPdfPkcs11Slot |
TPdfPkcs11Certificate | SlotID, ObjectID, LabelText, CertificateDer i Mechanisms opisują jeden certyfikat tokena |
TPdfPkcs11Certificates | Tablica dynamiczna rekordów TPdfPkcs11Certificate |
TPadesSignerResolverProc | Typ wskaźnika funkcji dla zmiennej wstrzykiwania PadesSignerResolverOverride |
TPdfCmsVerifyStatus | pcvsUnavailable, pcvsValid, pcvsInvalid, pcvsUnsupported lub pcvsIndeterminate |
TPdfCmsRevocationReason | pcrrNone, pcrrCertificateRevoked, pcrrCrlExpired, pcrrCrlNotYetValid, pcrrCrlUnavailable, pcrrCrlSignatureInvalid, pcrrCrlInvalid, pcrrChainUntrusted, pcrrUnknown, pcrrOcspUnavailable, pcrrOcspInvalid lub pcrrOcspStatusUnknown wyjaśnia dowody unieważnienia niezależnie od statusu weryfikacji |
TPdfCmsVerifyStage | pcvstCryptographicSignature, pcvstChainBuild, pcvstOnlineRetrieval lub pcvstRevocationCheck |
TPdfCmsVerifyCheckpoint | Wywołanie zwrotne metody obiektu otrzymujące każdy TPdfCmsVerifyStage w miarę postępu weryfikacji |
TPdfCmsVerifyOptions | OnlineRetrieval, 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 |
TPdfCmsSignerVerifyResult | SignerIndex 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ć |
TPdfCmsSignerVerifyResults | Tablica dynamiczna ograniczonych migawek podpisujących |
TPdfCmsVerifyResult | Zagregowane statusy podpisu, zaufania i unieważnienia pozostają niezależne. Rekord zwraca także SignatureError, TrustError, SignerCertificate, ChainCertificates, RevocationReason, RevocationError, RevocationCertificate, SignerResults, SignerDiagnosticsStatus i SignerCount |
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
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
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ę
| Variable | Description |
|---|---|
PadesSignerResolverOverride | Opcjonalne wywołanie zwrotne resolvera oceniane przed dostawcami zarejestrowanymi i platformowymi |
PadesCmsVerifier | Bieżące zaplecze weryfikacji CMS, normalnie przypisywane przez ConfigurePadesCmsVerifier |
PdfCertificatePathValidator | Bieżący walidator ścieżki certyfikatów, normalnie przypisywany przez ConfigurePdfCertificatePathValidator |
PadesSignerProvider | Bieżący dostawca podpisującego, normalnie przypisywany przez ConfigurePadesSignerProvider |