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 é 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
| Function | Description |
|---|---|
PadesCryptoAvailable | Retorna True quando um back-end criptográfico está disponível para assinatura PAdES na plataforma atual |
PadesCryptoBackendName | Retorna o nome de exibição do back-end criptográfico ativo |
ResolvePadesSigner | Resolve uma impressão digital de certificado e um esquema de preenchimento em um signatário, um certificado do signatário e uma cadeia |
ConfigurePdfCertificatePathValidator | Define ou limpa o IPdfCertificatePathValidator em todo o processo usado por ValidatePdfCertificatePath |
ValidatePdfCertificatePath | Valida 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 |
ConfigurePadesSignerProvider | Define ou limpa o provedor de signatário em todo o processo usado antes do back-end da plataforma |
ConfigurePadesCmsVerifier | Instala 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 |
PadesCmsVerificationAvailable | Retorna True quando algum backend consegue verificar CMS nesta compilação, seja registrado ou interno |
PadesCmsVerificationBackendName | Retorna o nome de exibição do backend de verificação ativo, ou uma string vazia quando não há nenhum |
| Membro de interface | Descrição |
|---|---|
IPdfTrustStore.LoadTrustAnchors | Retorna âncoras de confiança codificadas em DER adicionais, sujeitas aos orçamentos de certificados configurados |
IPdfValidationFetcher.Fetch | Busca material de validação em Uri sem exceder MaxBytes |
IPdfCertificatePathValidator.Validate | Constrói e avalia o caminho de certificação e preenche TPdfCertificatePathReport |
IPadesSignerProvider.BackendName | Retorna o nome de exibição do provedor exposto por PadesCryptoBackendName |
IPadesSignerProvider.Resolve | Retorna material de signatário completo para as TPadesSignerOptions fornecidas |
IPdfPkcs11SignerProvider.EnumerateSlots | Retorna os slots PKCS#11 disponíveis e os metadados de presença de token |
IPdfPkcs11SignerProvider.EnumerateCertificates | Retorna os certificados e mecanismos de assinatura visíveis em um slot PKCS#11 |
IPdfPkcs11SignerProvider.CloseProtectedSessions | Fecha sessões PKCS#11 protegidas ou autenticadas pertencentes ao provedor |
IPdfCmsVerifier.BackendName | Retorna o nome de exibição do backend de verificação informado por PadesCmsVerificationBackendName |
IPdfCmsVerifier.VerifyDetached | Verifica uma assinatura PDF cujo conteúdo assinado são as duas faixas de bytes dos lados do buraco /Contents |
IPdfCmsVerifier.VerifyAttached | Verifica um token de timestamp, que carrega o próprio conteúdo e não precisa de segmentos separados |
| Type | Description |
|---|---|
EPadesCrypto | Exceção base para falhas do back-end criptográfico |
EPadesCryptoUnavailable | Disparada quando um back-end de signatário exigido ou um validador de caminho de certificação não está configurado |
TPadesPaddingScheme | psRsaPss, psRsaPkcs1v15 ou psEcdsa |
TPadesSignerOptions | CertificateThumbprint seleciona o certificado e PaddingScheme seleciona o esquema de assinatura; Default usa uma impressão digital vazia e psRsaPss |
TPadesChainCertArray | Array dinâmico de certificados da cadeia codificados em DER |
TPadesResolvedSigner | Signer, SignerCertDer e ChainCertDer agrupam o signatário resolvido e o material de certificado |
TPdfRevocationMode | prmNone, prmOffline, prmOnlineAllowed ou prmOnlineRequired |
TPdfStringArray | Array dinâmico de strings usado para OIDs de política e nomes de mecanismos do provedor |
TPdfCertificatePathOptions | ValidationTime, 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 |
TPdfCertificatePathReport | Trusted, PathBuilt, PolicyValid, RevocationChecked, PathCertificateCount, ErrorCode e ErrorMessage informam o resultado da validação |
TPdfPkcs11Slot | SlotID, Description, TokenLabel e TokenPresent descrevem um slot PKCS#11 |
TPdfPkcs11Slots | Array dinâmico de records TPdfPkcs11Slot |
TPdfPkcs11Certificate | SlotID, ObjectID, LabelText, CertificateDer e Mechanisms descrevem um certificado de token |
TPdfPkcs11Certificates | Array dinâmico de records TPdfPkcs11Certificate |
TPadesSignerResolverProc | Tipo de ponteiro de função para a var de injeção PadesSignerResolverOverride |
TPdfCmsVerifyStatus | pcvsUnavailable, pcvsValid, pcvsInvalid, pcvsUnsupported ou pcvsIndeterminate |
TPdfCmsRevocationReason | pcrrNone, 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 |
TPdfCmsVerifyStage | pcvstCryptographicSignature, pcvstChainBuild, pcvstOnlineRetrieval ou pcvstRevocationCheck |
TPdfCmsVerifyCheckpoint | Callback de método de objeto que recebe cada TPdfCmsVerifyStage conforme a verificação avança |
TPdfCmsVerifyOptions | OnlineRetrieval, 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 |
TPdfCmsSignerVerifyResult | SignerIndex 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 |
TPdfCmsSignerVerifyResults | Array dinâmico de snapshots delimitados de signatário |
TPdfCmsVerifyResult | Os 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 |
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
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
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ável | Descrição |
|---|---|
PadesSignerResolverOverride | Callback de resolvedor opcional avaliado antes dos provedores registrados e da plataforma |
PadesCmsVerifier | Backend de verificação CMS atual, normalmente atribuído por meio de ConfigurePadesCmsVerifier |
PdfCertificatePathValidator | Validador de caminho de certificação atual, normalmente atribuído por meio de ConfigurePdfCertificatePathValidator |
PadesSignerProvider | Provedor de signatário atual, normalmente atribuído por meio de ConfigurePadesSignerProvider |