EPdfKeychainError = class(Exception);
TPdfKeychainSignerProvider = class(TInterfacedObject, IPadesSignerProvider)
function BackendName: string;
function Resolve(const Options: TPadesSignerOptions): TPadesResolvedSigner;
end;
TPdfKeychainCmsVerifier = class(TInterfacedObject, IPdfCmsVerifier)
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;
function KeychainAvailable: Boolean;
function KeychainMissingSymbols: string;
function KeychainVerificationAvailable: Boolean;
function ConfigureKeychainSignerProvider: IPadesSignerProvider;
function ConfigureKeychainCmsVerifier: IPdfCmsVerifier;
FPdfCryptoMac é o back-end criptográfico do macOS consumido por FPdfCrypto e FPdfCms, e cobre as duas metades da integração com a plataforma: assinatura PAdES por meio de uma identidade do Keychain e verificação de CMS por meio do decodificador de CMS do sistema e da avaliação de confiança. Security.framework e CoreFoundation são carregados e resolvidos por nome em tempo de execução, e não vinculados, de modo que a unidade compila em qualquer alvo e relata em tempo de execução se os serviços da plataforma estão realmente acessíveis
No lado da assinatura, TPdfKeychainSignerProvider implementa IPadesSignerProvider. Seu método Resolve enumera as identidades do Keychain, seleciona aquela cujo certificado corresponde à impressão digital SHA-1 carregada em TPadesSignerOptions, lê o DER do certificado e a referência à chave privada correspondente, e retorna um TPadesResolvedSigner cujo ICmsSigner assina os CMS signed attributes por meio do Security.framework, de modo que a chave privada nunca deixa o Keychain. O esquema de preenchimento solicitado pelas opções é reconciliado com o que a chave realmente suporta, e os parâmetros RSASSA-PSS são os mesmos que os outros back-ends emitem, de modo que um documento assinado no macOS carrega um AlgorithmIdentifier idêntico. ConfigureKeychainSignerProvider constrói o provedor e o instala como o back-end de assinatura PAdES ativo, retornando a interface registrada
No lado da verificação, TPdfKeychainCmsVerifier implementa IPdfCmsVerifier sobre o CMSDecoder e o SecTrust. VerifyDetached junta as duas faixas de bytes assinadas dos dois lados da lacuna de assinatura no conteúdo destacado que o decodificador espera, e então verifica o valor CMS contra ele; VerifyAttached verifica um valor CMS que carrega o próprio conteúdo, que é o que um token de timestamp precisa. Ambos retornam um TPdfCmsVerifyResult que relata separadamente o status da assinatura, o status de confiança e o status de revogação, opcionalmente coletando o certificado do assinante e a cadeia avaliada, e ambos respeitam as configurações de revogação, recuperação online e checkpoints em TPdfCmsVerifyOptions. ConfigureKeychainCmsVerifier constrói o verificador e o instala como o back-end de verificação de CMS ativo
A validade da assinatura e a confiança no certificado permanecem resultados independentes, de modo que uma assinatura autêntica sob uma cadeia não confiável ou autoassinada continua distinguível de conteúdo adulterado
Para um token RFC 3161 anexado, a análise DER delimitada fornece os octetos TSTInfo encapsulados originais ao decodificador nativo sem alterar seu content type nem seus atributos assinados. A passagem comum de verificação de CMS exclui atributos não assinados de sua entrada nativa, de modo que o processamento automático de timestamp não possa substituir a integridade ou o resultado de cadeia da própria assinatura externa. Esta passagem não valida contrasassinaturas nem outros atributos não assinados; ValidatePadesTrust verifica separadamente cada token de timestamp original, a impressão de mensagem, o papel do certificado TSA, a confiança e o resultado de revogação
Passe um caminho de arquivo de Keychain para TPdfKeychainSignerProvider.Create para restringir a busca de identidade a esse Keychain por meio de uma lista de busca local à consulta, depois registre o provedor com ConfigurePadesSignerProvider. Um caminho vazio usa o escopo de busca do usuário atual. Abrir ou pesquisar o Keychain selecionado não modifica o Keychain padrão, a lista de busca do usuário nem a configuração de confiança do sistema; caminhos inválidos e símbolos de busca com escopo indisponíveis disparam EPdfKeychainError
Resolve também exporta a cadeia de emissores disponível do certificado de assinatura por meio de uma busca de certificado offline local à consulta e de construção nativa de cadeia. Os certificados candidatos são limitados a 4096 itens, 1 MiB cada e 16 MiB no total; a cadeia construída é limitada a 32 certificados, incluindo a folha, que é retornada separadamente de ChainCertDer. Exportar material de certificado não estabelece confiança nem instala uma âncora de confiança, e um emissor indisponível não pode ser sintetizado
| Função | Descrição |
|---|---|
KeychainAvailable | Retorna True quando Security.framework e CoreFoundation foram carregados e todos os símbolos necessários para a assinatura foram resolvidos |
KeychainMissingSymbols | Retorna os nomes que não puderam ser resolvidos, separados por espaços, ou uma string vazia quando tudo foi vinculado |
ConfigureKeychainSignerProvider | Constrói um TPdfKeychainSignerProvider, instala-o como o back-end de assinatura PAdES e o retorna como IPadesSignerProvider |
TPdfKeychainSignerProvider.Create | Seleciona um arquivo de Keychain existente opcional para busca de identidade com escopo, rejeitando caracteres NUL embutidos e caminhos com mais de 4096 unidades de código de string |
TPdfKeychainSignerProvider.BackendName | Retorna o identificador de back-end relatado para o provedor de assinatura |
TPdfKeychainSignerProvider.Resolve | Corresponde TPadesSignerOptions às identidades do Keychain e retorna um TPadesResolvedSigner contendo o assinante, o DER do certificado e a cadeia |
| Função | Descrição |
|---|---|
KeychainVerificationAvailable | Retorna True quando os símbolos do decodificador de CMS, da política de confiança e da avaliação de confiança foram resolvidos |
ConfigureKeychainCmsVerifier | Constrói um TPdfKeychainCmsVerifier, instala-o como o back-end de verificação de CMS e o retorna como IPdfCmsVerifier |
ConfigureKeychainTrustAnchors | Clona âncoras DER explícitas para cada avaliação de confiança posterior, complementando as âncoras do sistema sem modificar o Keychain; os limites são 64 certificados, 4 MiB cada e 16 MiB no total, e um array vazio as limpa |
ConfigureKeychainOcspResponses | Clona evidência OCSP DER explícita para avaliação nativa do Security.framework; os limites são 8 respostas, 1 MiB cada e 4 MiB no total, e um array vazio as limpa |
TPdfKeychainCmsVerifier.BackendName | Retorna o identificador de back-end relatado para o back-end de verificação |
TPdfKeychainCmsVerifier.VerifyDetached | Verifica um valor CMS destacado contra os dois segmentos de conteúdo de propriedade do chamador descritos por Segment1, Segment1Length, Segment2 e Segment2Length, usando as TPdfCmsVerifyOptions fornecidas |
TPdfKeychainCmsVerifier.VerifyAttached | Verifica um valor CMS anexado que carrega o próprio conteúdo assinado, usando as TPdfCmsVerifyOptions fornecidas |
| Tipo | Membros e finalidade |
|---|---|
EPdfKeychainError | Exceção lançada quando o Security.framework não está disponível, quando nenhuma identidade do Keychain corresponde ao assinante solicitado ou quando a chamada de assinatura da plataforma falha |
TPdfKeychainSignerProvider | Back-end de assinatura PAdES que implementa IPadesSignerProvider, com BackendName e Resolve |
TPdfKeychainCmsVerifier | Back-end de verificação de CMS que implementa IPdfCmsVerifier, com BackendName, VerifyDetached e VerifyAttached |
KeychainAvailable e KeychainVerificationAvailable relatam assinatura e verificação separadamente, porque as duas metades precisam de símbolos de framework diferentes; um sistema pode vincular um e não o outroKeychainMissingSymbols nomeia cada símbolo que não pôde ser resolvido, o que torna um framework ausente distinguível de um problema de vinculação: um resultado vazio significa que tudo foi vinculado, um resultado que nomeia os caminhos dos frameworks significa que os frameworks não foram carregados, e um resultado que nomeia entry points individuais significa que os frameworks foram carregados, mas um nome não pôde ser resolvidoKeychainAvailable e KeychainVerificationAvailable retornam False, KeychainMissingSymbols retorna uma string vazia e as funções de configuração lançam EPdfKeychainErrorTPadesSignerOptions não carrega uma impressão digital de certificado, a primeira identidade utilizável no Keychain é selecionada, o que serve para um teste e não para uma assinatura de produçãopcvsUnsupported, mantendo os diagnósticos nativos, em vez de reportar integridade válida ou inválida. Use o verificador CMS do OpenSSL para esses valores; diagnósticos de signatários mistos mantêm o resultado de algoritmo separado de cada signatárioFreshOcspResponse, seguido por checagens nativas de assinatura do respondedor, autoridade e certificado. O desvio permitido é de 300 segundos, e producedAt e thisUpdate são limitados a um dia de idadeOnlineRetrieval=False desabilita a busca nativa na rede de confiança. A avaliação online nativa do Security.framework segue o comportamento da plataforma; UrlRetrievalTimeoutMs não fornece o prazo delimitado do transporte OpenSSL neste backendCollectSignerDiagnostics=True retorna snapshots separados de signatário, limitados por MaxSignerCount e por um limite rígido de 64. O material de certificado retornado é limitado a 4 MiB por certificado e 64 MiB no total; uma coleta incompleta reporta pcvsIndeterminateSignerDiagnosticsStatus=pcvsValid significa que a coleta está completa, incluindo vereditos de signatário com falha. RevocationError carrega o status nativo do Security.framework, enquanto RevocationCertificate permanece vazio neste backend