EPdfKeychainError = class(Exception);
TPdfKeychainSignerProvider = class(TInterfacedObject, IPadesSignerProvider)
constructor Create(const KeychainPath: string = '');
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;
procedure ConfigureKeychainTrustAnchors(const Anchors: TPadesChainCertArray);
procedure ConfigureKeychainOcspResponses(const Responses: TPadesChainCertArray);
FPdfCryptoMac est le backend cryptographique macOS consommé par FPdfCrypto et FPdfCms, et il couvre les deux moitiés de l’intégration de plateforme : la signature PAdES via une identité Keychain, et la vérification CMS via le décodeur CMS système et l’évaluation de confiance. Security.framework et CoreFoundation sont chargés et résolus par nom à l’exécution plutôt que liés, l’unité se compile donc sur chaque cible et signale à l’exécution si les services de la plateforme sont réellement joignables
Côté signature, TPdfKeychainSignerProvider implémente IPadesSignerProvider. Sa méthode Resolve énumère les identités Keychain, sélectionne celle dont le certificat correspond à l’empreinte SHA-1 portée par TPadesSignerOptions, lit le DER du certificat et la référence de clé privée correspondante, et renvoie un TPadesResolvedSigner dont l’ICmsSigner signe les attributs signés CMS via Security.framework, de sorte que la clé privée ne quitte jamais le Keychain. Le schéma de remplissage demandé via les options est mis en accord avec ce que la clé sait réellement faire, et les paramètres RSASSA-PSS sont les mêmes que ceux que les autres backends émettent, si bien qu’un document signé sur macOS porte un AlgorithmIdentifier identique. ConfigureKeychainSignerProvider construit le fournisseur et l’installe comme backend de signature PAdES actif, en renvoyant l’interface qu’il a enregistrée
Pour la vérification, TPdfKeychainCmsVerifier implémente IPdfCmsVerifier avec CMSDecoder et SecTrust ; VerifyDetached réunit les deux plages signées entourant le trou de signature en contenu détaché attendu par le décodeur, puis vérifie le CMS ; VerifyAttached vérifie un CMS portant son contenu, comme un jeton d’horodatage ; les deux renvoient un TPdfCmsVerifyResult séparant signature, confiance et révocation, avec collecte facultative du certificat signataire et de la chaîne évaluée, et respectent révocation, récupération en ligne et checkpoints de TPdfCmsVerifyOptions ; ConfigureKeychainCmsVerifier construit et installe le backend actif
La validité de la signature et la confiance dans le certificat restent des résultats indépendants, de sorte qu’une signature authentique sous une chaîne non fiable ou auto-signée demeure distinguable d’un contenu altéré
Pour un jeton RFC 3161 attaché, l’analyse DER bornée fournit au décodeur natif les octets encapsulés originaux de TSTInfo, sans changer leur type de contenu ni attributs signés ; la vérification CMS ordinaire exclut les attributs non signés de son entrée native afin que le traitement automatique de l’horodatage ne remplace pas l’intégrité ou la chaîne de la signature externe ; elle ne valide ni contresignatures ni autres attributs non signés ; ValidatePadesTrust vérifie séparément chaque jeton original, empreinte, rôle du certificat TSA, confiance et révocation
Passez le chemin d’un fichier Keychain à TPdfKeychainSignerProvider.Create pour limiter la recherche d’identité à ce Keychain avec une liste locale à la requête, puis enregistrez le fournisseur avec ConfigurePadesSignerProvider ; un chemin vide utilise la portée de recherche de l’utilisateur courant ; ouvrir ou rechercher ce Keychain ne modifie ni Keychain par défaut, ni liste utilisateur, ni configuration de confiance système ; un chemin invalide ou des symboles de recherche limitée indisponibles lèvent EPdfKeychainError
Resolve exporte aussi la chaîne d’émetteurs disponible du certificat signataire via une recherche hors ligne locale à la requête et une construction native de chaîne ; les candidats sont limités à 4096 certificats, 1 MiB chacun et 16 MiB au total ; la chaîne construite est limitée à 32 certificats, feuille comprise, celle-ci étant renvoyée séparément de ChainCertDer ; exporter des certificats n’établit pas leur confiance et n’installe aucune ancre ; un émetteur absent ne peut pas être synthétisé
| Fonction | Description |
|---|---|
KeychainAvailable | Renvoie True lorsque Security.framework et CoreFoundation sont chargés et que chaque symbole requis pour la signature est résolu |
KeychainMissingSymbols | Renvoie les noms qui n’ont pas pu être résolus, séparés par des espaces, ou une chaîne vide lorsque tout est lié |
ConfigureKeychainSignerProvider | Construit un TPdfKeychainSignerProvider, l’installe comme backend de signature PAdES et le renvoie comme IPadesSignerProvider |
TPdfKeychainSignerProvider.Create | Sélectionne un fichier Keychain existant facultatif pour limiter la recherche d’identité ; refuse les NUL incorporés et les chemins de plus de 4096 unités de chaîne |
TPdfKeychainSignerProvider.BackendName | Renvoie l’identifiant de backend signalé pour le fournisseur de signature |
TPdfKeychainSignerProvider.Resolve | Met en correspondance TPadesSignerOptions avec les identités Keychain et renvoie un TPadesResolvedSigner contenant le signataire, le DER du certificat et la chaîne |
| Fonction | Description |
|---|---|
KeychainVerificationAvailable | Renvoie True lorsque les symboles du décodeur CMS, de la politique de confiance et de l’évaluation de confiance sont résolus |
ConfigureKeychainCmsVerifier | Construit un TPdfKeychainCmsVerifier, l’installe comme backend de vérification CMS et le renvoie comme IPdfCmsVerifier |
ConfigureKeychainTrustAnchors | Clone les ancres DER explicites pour les évaluations ultérieures, en complément des ancres système sans modifier le Keychain ; limites : 64 certificats, 4 MiB chacun et 16 MiB au total ; un tableau vide les supprime |
ConfigureKeychainOcspResponses | Clone les preuves OCSP DER explicites pour l’évaluation native Security.framework ; limites : 8 réponses, 1 MiB chacune et 4 MiB au total ; un tableau vide les supprime |
TPdfKeychainCmsVerifier.BackendName | Renvoie l’identifiant de backend signalé pour le backend de vérification |
TPdfKeychainCmsVerifier.VerifyDetached | Vérifie une valeur CMS détachée par rapport aux deux segments de contenu possédés par l’appelant décrits par Segment1, Segment1Length, Segment2 et Segment2Length, en utilisant les TPdfCmsVerifyOptions fournies |
TPdfKeychainCmsVerifier.VerifyAttached | Vérifie une valeur CMS attachée qui porte son propre contenu signé, en utilisant les TPdfCmsVerifyOptions fournies |
| Type | Membres et rôle |
|---|---|
EPdfKeychainError | Exception levée lorsque Security.framework est indisponible, lorsqu’aucune identité Keychain ne correspond au signataire demandé ou lorsque l’appel de signature de la plateforme échoue |
TPdfKeychainSignerProvider | Backend de signature PAdES implémentant IPadesSignerProvider, avec BackendName et Resolve |
TPdfKeychainCmsVerifier | Backend de vérification CMS implémentant IPdfCmsVerifier, avec BackendName, VerifyDetached et VerifyAttached |
KeychainAvailable et KeychainVerificationAvailable signalent la signature et la vérification séparément parce que les deux moitiés ont besoin de symboles de framework différents, un système peut donc lier l’une et pas l’autreKeychainMissingSymbols nomme chaque symbole qui n’a pas pu être résolu, ce qui permet de distinguer un framework absent d’un problème de liaison : un résultat vide signifie que tout est lié, un résultat nommant les chemins des frameworks signifie que les frameworks ne se sont pas chargés, et un résultat nommant des points d’entrée individuels signifie que les frameworks se sont chargés mais qu’un nom n’a pas pu être résoluKeychainAvailable et KeychainVerificationAvailable, un KeychainMissingSymbols vide et lèvent EPdfKeychainError dans les fonctions de configurationTPadesSignerOptions ne porte aucune empreinte de certificat, la première identité utilisable du Keychain est sélectionnée, ce qui convient à un test plutôt qu’à une signature de productionpcvsUnsupported avec diagnostics natifs, plutôt qu’une intégrité valide ou invalide ; utilisez OpenSSL pour ces valeurs ; les diagnostics mixtes conservent le résultat d’algorithme propre à chaque signataireFreshOcspResponse, puis les vérifications natives de signature du répondeur, d’autorité et de certificat ; la dérive admise est de 300 secondes et producedAt et thisUpdate ne doivent pas dater de plus d’un jourOnlineRetrieval=False désactive la récupération réseau native de confiance ; l’évaluation en ligne Security.framework suit le comportement plateforme ; UrlRetrievalTimeoutMs ne fournit pas ici le délai de transport borné d’OpenSSLCollectSignerDiagnostics=True renvoie des instantanés distincts limités par MaxSignerCount et un plafond de 64 ; les certificats renvoyés sont limités à 4 MiB chacun et 64 MiB au total ; une collecte incomplète indique pcvsIndeterminateSignerDiagnosticsStatus=pcvsValid signifie que la collecte est complète, verdicts échoués compris ; RevocationError contient le statut natif Security.framework, et RevocationCertificate reste vide ici