PDFium Delphi Component Docs

Unidade FPdfCrypto

Unidade: FPdfCrypto
Fachada de provedor de signatário PAdES e de validação de certificados para back-ends de plataforma, integrações PKCS#11, repositórios de confiança, buscadores de revogação e validação de caminho limitada

Sintaxe

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;

Descrição

FPdfCrypto é a porta de entrada para a pilha de assinatura PAdES. PadesCryptoAvailable relata se um back-end criptográfico está configurado na plataforma atual e PadesCryptoBackendName o identifica; no Windows o back-end Cryptography Next Generation em FPdfCryptoWin é vinculado automaticamente

ResolvePadesSigner recebe uma impressão digital de certificado e um esquema de preenchimento e retorna um TPadesResolvedSigner totalmente preenchido: a implementação de ICmsSigner que executa a operação de chave privada, o certificado DER do signatário e os certificados da cadeia emissora. O resultado é passado diretamente para FPdfCms.BuildSignedData

Integrações personalizadas podem registrar um IPadesSignerProvider, incluindo um IPdfPkcs11SignerProvider que enumera slots e certificados de token, ou usar PadesSignerResolverOverride como uma costura de resolvedor determinística

A validação de caminho de certificação é baseada em provedores e limitada por orçamentos: os chamadores configuram IPdfCertificatePathValidator, fornecem opcionalmente âncoras de confiança explícitas, um IPdfTrustStore e um IPdfValidationFetcher, e então inspecionam TPdfCertificatePathReport

Funções

FunctionDescription
PadesCryptoAvailableRetorna True quando um back-end criptográfico está disponível para assinatura PAdES na plataforma atual
PadesCryptoBackendNameRetorna o nome de exibição do back-end criptográfico ativo
ResolvePadesSignerResolve uma impressão digital de certificado e um esquema de preenchimento em um signatário, um certificado do signatário e uma cadeia
ConfigurePdfCertificatePathValidatorDefine ou limpa o IPdfCertificatePathValidator em todo o processo usado por ValidatePdfCertificatePath
ValidatePdfCertificatePathValida um certificado folha contra intermediários e as âncoras explícitas e do trust store combinadas, após impor orçamentos de contagem, tamanho, busca e profundidade de caminho de certificados
ConfigurePadesSignerProviderDefine ou limpa o provedor de signatário em todo o processo usado antes do back-end da plataforma
ConfigurePadesCmsVerifierInstala o backend de verificação CMS usado pelo validador PAdES; limpá-lo restaura a CryptoAPI do Windows no Windows. Outras plataformas exigem uma chamada explícita a ConfigureSslCmsVerifier ou ConfigureKeychainCmsVerifier
PadesCmsVerificationAvailableRetorna True quando algum backend consegue verificar CMS nesta compilação, seja registrado ou interno
PadesCmsVerificationBackendNameRetorna o nome de exibição do backend de verificação ativo, ou uma string vazia quando não há nenhum

Interfaces de provedor

Membro de interfaceDescrição
IPdfTrustStore.LoadTrustAnchorsRetorna âncoras de confiança codificadas em DER adicionais, sujeitas aos orçamentos de certificados configurados
IPdfValidationFetcher.FetchBusca material de validação em Uri sem exceder MaxBytes
IPdfCertificatePathValidator.ValidateConstrói e avalia o caminho de certificação e preenche TPdfCertificatePathReport
IPadesSignerProvider.BackendNameRetorna o nome de exibição do provedor exposto por PadesCryptoBackendName
IPadesSignerProvider.ResolveRetorna material de signatário completo para as TPadesSignerOptions fornecidas
IPdfPkcs11SignerProvider.EnumerateSlotsRetorna os slots PKCS#11 disponíveis e os metadados de presença de token
IPdfPkcs11SignerProvider.EnumerateCertificatesRetorna os certificados e mecanismos de assinatura visíveis em um slot PKCS#11
IPdfPkcs11SignerProvider.CloseProtectedSessionsFecha sessões PKCS#11 protegidas ou autenticadas pertencentes ao provedor
IPdfCmsVerifier.BackendNameRetorna o nome de exibição do backend de verificação informado por PadesCmsVerificationBackendName
IPdfCmsVerifier.VerifyDetachedVerifica uma assinatura PDF cujo conteúdo assinado são as duas faixas de bytes dos lados do buraco /Contents
IPdfCmsVerifier.VerifyAttachedVerifica um token de timestamp, que carrega o próprio conteúdo e não precisa de segmentos separados

Tipos

TypeDescription
EPadesCryptoExceção base para falhas do back-end criptográfico
EPadesCryptoUnavailableDisparada quando um back-end de signatário exigido ou um validador de caminho de certificação não está configurado
TPadesPaddingSchemepsRsaPss, psRsaPkcs1v15 ou psEcdsa
TPadesSignerOptionsCertificateThumbprint seleciona o certificado e PaddingScheme seleciona o esquema de assinatura; Default usa uma impressão digital vazia e psRsaPss
TPadesChainCertArrayArray dinâmico de certificados da cadeia codificados em DER
TPadesResolvedSignerSigner, SignerCertDer e ChainCertDer agrupam o signatário resolvido e o material de certificado
TPdfRevocationModeprmNone, prmOffline, prmOnlineAllowed ou prmOnlineRequired
TPdfStringArrayArray dinâmico de strings usado para OIDs de política e nomes de mecanismos do provedor
TPdfCertificatePathOptionsValidationTime, RevocationMode, RequiredPolicyOids, MaxCertificates, MaxCertificateBytes, MaxFetchBytes e MaxPathDepth controlam a validação e os orçamentos de recursos; Default seleciona revogação offline com limites de 64 certificados, 4 MiB por certificado, 16 MiB de dados buscados e profundidade de caminho 16
TPdfCertificatePathReportTrusted, PathBuilt, PolicyValid, RevocationChecked, PathCertificateCount, ErrorCode e ErrorMessage informam o resultado da validação
TPdfPkcs11SlotSlotID, Description, TokenLabel e TokenPresent descrevem um slot PKCS#11
TPdfPkcs11SlotsArray dinâmico de records TPdfPkcs11Slot
TPdfPkcs11CertificateSlotID, ObjectID, LabelText, CertificateDer e Mechanisms descrevem um certificado de token
TPdfPkcs11CertificatesArray dinâmico de records TPdfPkcs11Certificate
TPadesSignerResolverProcTipo de ponteiro de função para a var de injeção PadesSignerResolverOverride
TPdfCmsVerifyStatuspcvsUnavailable, pcvsValid, pcvsInvalid, pcvsUnsupported ou pcvsIndeterminate
TPdfCmsRevocationReasonpcrrNone, pcrrCertificateRevoked, pcrrCrlExpired, pcrrCrlNotYetValid, pcrrCrlUnavailable, pcrrCrlSignatureInvalid, pcrrCrlInvalid, pcrrChainUntrusted, pcrrUnknown, pcrrOcspUnavailable, pcrrOcspInvalid ou pcrrOcspStatusUnknown explica a evidência de revogação separadamente do status de verificação
TPdfCmsVerifyStagepcvstCryptographicSignature, pcvstChainBuild, pcvstOnlineRetrieval ou pcvstRevocationCheck
TPdfCmsVerifyCheckpointCallback de método de objeto que recebe cada TPdfCmsVerifyStage conforme a verificação avança
TPdfCmsVerifyOptionsOnlineRetrieval, CheckRevocation, CollectChainCertificates, UrlRetrievalTimeoutMs e OnCheckpoint conduzem uma verificação; CollectSignerDiagnostics solicita snapshots por signatário e MaxSignerCount limita sua contagem. Default desliga a recuperação, a revogação e os diagnósticos por signatário, define um orçamento de recuperação de 15 segundos e limita os snapshots de signatário a 64
TPdfCmsSignerVerifyResultSignerIndex identifica a ordem de SignerInfo codificada; status de assinatura, confiança e revogação e erros nativos descrevem esse signatário de forma independente. SignerCertificate é seu certificado DER, enquanto RevocationCertificate identifica o certificado associado a um erro de revogação capturado quando o backend consegue fornecê-lo
TPdfCmsSignerVerifyResultsArray dinâmico de snapshots delimitados de signatário
TPdfCmsVerifyResultOs status agregados de assinatura, confiança e revogação permanecem independentes. O record também retorna SignatureError, TrustError, SignerCertificate, ChainCertificates, RevocationReason, RevocationError, RevocationCertificate, SignerResults, SignerDiagnosticsStatus e SignerCount

Diagnósticos de revogação

Recompile quem consome ao atualizar, porque os records públicos de opções e de resultado cresceram. Verifiers customizados devem inicializar records de resultado gerenciados com Default(TPdfCmsVerifyResult) e deixar campos de snapshot não suportados indisponíveis; não limpe com FillChar um record vivo que contém strings ou arrays dinâmicos

Leia RevocationReason e RevocationError do TPdfCmsVerifyResult devolvido por IPdfCmsVerifier.VerifyDetached ou VerifyAttached. A validação de trust PAdES os preserva como RevocationReason e NativeRevocationError, com campos separados TimeStampRevocationReason e NativeTimeStampRevocationError para tokens de timestamp; os evidence reports incluem os dois pares

RevocationError é um código nativo de verificação específico do backend, onde zero significa que nenhum diagnóstico nativo foi capturado. O OpenSSL usa o espaço de erros X509_V_ERR_*. O Windows preserva um DWORD bruto vindo de CERT_REVOCATION_INFO.dwRevocationResult do certificado, ou de GetLastError se a chamada da cadeia de revogação falhar; não é um espaço de erros HRESULT uniforme nem a máscara agregada de trust da cadeia

O OpenSSL distingue revogação confirmada de evidência de CRL expirada, indisponível ou inválida e de evidência OCSP indisponível, inválida ou desconhecida. O Windows reporta revogação confirmada, cadeias não confiáveis ou uma falha nativa desconhecida. O verificador do macOS avalia integridade de assinatura, confiança X.509 básica e revogação separadamente, retornando erros nativos do Security.framework sem traduzir toda falha de plataforma para uma classificação de CRL ou OCSP

RevocationCertificate pode identificar um intermediário revogado em vez do certificado do signatário CMS; ele fica vazio quando o backend não consegue capturar esse certificado. O OpenSSL consegue coletá-lo, enquanto o backend atual do macOS o deixa vazio

Nem pcrrNone nem um erro zero provam que a revogação foi verificada ou que passou; sempre inspecione RevocationStatus

Diagnósticos por signatário

Defina CollectSignerDiagnostics=True para inspecionar snapshots delimitados em SignerResults. SignerCount é a contagem de SignerInfo codificada quando estabelecida; um valor zero significa que a contagem não foi estabelecida

SignerDiagnosticsStatus=pcvsValid significa que os snapshots solicitados estão completos, incluindo snapshots de assinaturas inválidas; não significa que todas as assinaturas passaram. pcvsUnavailable significa que a coleta foi desabilitada ou não é suportada, e pcvsIndeterminate significa que o backend não conseguiu concluir a coleta solicitada dentro de seus limites de análise ou de recursos

As implementações OpenSSL e macOS nativa limitam a coleta a 64 signatários. O OpenSSL ainda limita a entrada CMS de diagnóstico a 4 MiB e o trabalho agregado de entrada/saída de diagnóstico a 64 MiB; o macOS limita o material de certificado retornado a 4 MiB por certificado e 64 MiB no total. Um MaxSignerCount menor reduz ainda mais a contagem solicitada por quem chama

Os snapshots de signatário reutilizam evidências configuradas e evidências recuperadas durante a verificação agregada. O OpenSSL não realiza uma segunda recuperação de rede para cada snapshot de diagnóstico, e uma recuperação agregada incompleta não pode se tornar um snapshot de revogação offline bem-sucedido

Backend de assinatura padrão

PadesSignerResolverOverride tem prioridade, seguido por um IPadesSignerProvider registrado explicitamente e então o padrão da plataforma. Os padrões não Windows exigem ConfigureSslSigningCredentials; a disponibilidade apenas de libcrypto não fornece uma chave privada ou um certificado

O padrão do OpenSSL rejeita um CertificateThumbprint não vazio porque seu certificado foi selecionado por configuração explícita. A assinatura por Keychain permanece disponível por meio de ConfigureKeychainSignerProvider quando a aplicação escolhe esse provedor

Variáveis globais de provedor

VariávelDescrição
PadesSignerResolverOverrideCallback de resolvedor opcional avaliado antes dos provedores registrados e da plataforma
PadesCmsVerifierBackend de verificação CMS atual, normalmente atribuído por meio de ConfigurePadesCmsVerifier
PdfCertificatePathValidatorValidador de caminho de certificação atual, normalmente atribuído por meio de ConfigurePdfCertificatePathValidator
PadesSignerProviderProvedor de signatário atual, normalmente atribuído por meio de ConfigurePadesSignerProvider

Consulte também

FPdfCms, FPdfCryptoWin, FPdfTsa, TPdf.SignPades