Enterprise édition
Validation — référence approfondie
Le module Validation exécute des politiques de conformité structurelles prédéfinies, en lecture seule, sur les octets bruts d’un PDF. Compliance::assess() applique exactement une CompliancePolicy et renvoie un ComplianceReport contenant des constats partitionnés par gravité et une clause de non-responsabilité juridique obligatoire. Des politiques sont fournies pour PDF/A-4 (ainsi que les variantes e et f), la structure PAdES baseline, un profil structurel eIDAS, la santé LTV/DSS, ZUGFeRD / Factur-X, la FDA 21 CFR Part 11 et l’archivage WORM au titre de la règle SEC 17a-4. Chaque politique est une fonction pure : des octets en entrée, des constats en sortie. La validation ne modifie jamais le document et n’effectue jamais de vérification cryptographique.
Disponibilité et licence
Section intitulée « Disponibilité et licence »Cette fonctionnalité est fournie dans NextPDF Enterprise (nextpdf/enterprise) et s’active avec une enveloppe de licence de niveau Enterprise. Un déploiement dépourvu de ce droit ne charge pas les classes de la fonctionnalité. Compare les éditions et obtiens une licence.
La surface Validation/Evidence est concédée sous licence par la capacité enterprise.compliance.evidence. Un droit refusé refuse la fonctionnalité plutôt que de se dégrader silencieusement.
| Niveau | Surface de validation |
|---|---|
| Core | Validateurs de flux d’octets en cours de processus et vérification croisée de la grammaire ; un résultat sans constat est un résultat vérifié, pas un certificat. |
| Pro | Validation EN 16931 / Factur-X / ZUGFeRD en cours de processus au niveau de la facture électronique ; aucune politique prédéfinie PDF/A-4, PAdES, LTV, FDA ou SEC. |
| Enterprise | Politiques structurelles prédéfinies pour PDF/A-4, PAdES, LTV, ZUGFeRD, FDA Part 11 et SEC 17a-4 avec un rapport unifié (ce module). |
La passerelle sidecar externe Enterprise Compliance est un module séparé et distinct.
Surface d’API publique
Section intitulée « Surface d’API publique »composer require nextpdf/enterprise:^3| Symbole | Paramètres | Comportement par défaut | Retourne | Lève ou échoue avec | Remarques |
|---|---|---|---|---|---|
Compliance::__construct | ?ClockInterface $clock = null | Horloge système lorsqu’aucune horloge n’est injectée | — | — | Forme d’instance compatible avec l’injection de dépendances ; l’horloge horodate validatedAt |
Compliance::run | string $pdfData, CompliancePolicy $policy, array $context = [] | Applique exactement une politique et mesure la durée d’horloge murale | ComplianceReport | Propage les exceptions des politiques personnalisées ; les politiques intégrées collectent les constats au lieu de lever une exception | Méthode d’instance |
Compliance::assess (statique) | string $pdfData, CompliancePolicy $policy, array $context = [] | Construit une instance par défaut et délègue à run() | ComplianceReport | Identique à run() | Voie rapide sans configuration |
Policies::pdfA4 / ::pdfA4e / ::pdfA4f (statique) | — | Politique structurelle PDF/A-4 selon ISO 19005-4:2020 | CompliancePolicy | — | e autorise les annotations 3D/rich-media ; f ajoute des vérifications de relation de fichiers incorporés |
Policies::padesBaseline (statique) | — | Vérifications structurelles PAdES B-B | CompliancePolicy | — | Structure uniquement ; aucune vérification cryptographique |
Policies::eidasQualified (statique) | — | Vérifications structurelles PAdES sous un profil étiqueté eIDAS | CompliancePolicy | — | La qualification dépend du TSP et du certificat qualifié |
Policies::ltvHealth (statique) | — | Vérification de santé structurelle du DSS | CompliancePolicy | — | Présence du DSS résolue à partir du graphe d’objets actif, sécurisation par défaut |
Policies::zugferd (statique) | string $profile = 'BASIC' | Normalise l’alias de profil et construit le validateur ZUGFeRD | CompliancePolicy | \ValueError (profil inconnu) | Profils : MINIMUM, BASIC, BASIC_WL, EN16931, EXTENDED |
Policies::fdaPart11 (statique) | — | Politique structurelle FDA 21 CFR Part 11 | CompliancePolicy | — | Sept vérifications structurelles, dont l’intégrité de la chaîne de hachage de la piste d’audit |
Policies::sec17a4 / ::sec17a4Compatible / ::sec17a4Structural / ::sec17a4PreSign (statique) | — | Politique WORM SEC 17a-4 au niveau de rigueur nommé | CompliancePolicy | — | La rigueur correspond à WormComplianceLevel |
CompliancePolicy (interface) | — | Contrat de stratégie pour une norme | — | — | getName(), getIdentifier(), getStandardReference(), validate() ; implémentable par le client |
ComplianceReport | Objet-valeur en lecture seule | Constats partitionnés par gravité à la construction | — | — | passes(), fails(), totalFindings(), getDisclaimer() ; findings, errors, warnings, infos, policyName, policyId, standard, validatedAt, durationMs publics |
ComplianceFinding | Severity $severity, string $ruleId, string $message, string $clause = '', string $suggestion = '' | Résultat d’une règle avec référence de clause et conseil de remédiation | — | — | error() / warning() / info() statiques ; isError() |
Severity (enum) | 3 cas adossés à des chaînes | Error, Warning, Info | — | — | Seul Error fait échouer un rapport |
WormComplianceLevel (enum) | 4 cas adossés à des chaînes | Full, Compatible, Structural, PreSign | — | — | requiresSignature(), requiresDocMdp(), requiresLtv(), maxDocMdpLevel() |
PdfAPolicy, PadesValidator, LtvHealthCheck, ZugferdValidator, Sec17a4WormPolicy, Fda\FdaPart11Policy | Constructeurs propres à chaque classe | Implémentent CompliancePolicy pour une norme chacune | list<ComplianceFinding> depuis validate() | — | À obtenir via Policies ; Sec17a4WormPolicy::getLevel() expose la rigueur configurée |
Fda\FdaSigningIntent (enum) | 6 cas adossés à des chaînes | Authoring, Review, Approval, Certification, Verification, Rejection | — | — | toPdfReasonString() produit la chaîne /Reason canonique |
Fda\FdaAuditEvent::__construct | DateTimeImmutable $timestamp, string $actor, FdaSigningIntent $action, string $documentHash, string $certificateSerial, string $previousEventHash = '' | Calcule le hachage de chaîne SHA-256 à la construction | — | InvalidArgumentException (horodatage non-UTC) | eventHash public ; toXmpRdf() sérialise un élément de liste XMP |
Fda\FdaAuditTrail::addEvent | FdaAuditEvent $event | Ajoute l’événement lorsque son maillon de chaîne correspond à la fin de la piste | self | InvalidArgumentException (chaîne de hachage rompue) | Également createEvent(), verifyChain(), getLastEventHash(), getEvents(), embedInMetadata() |
Fda\FdaSignatureEnforcer::configureSeedValue | FdaSigningIntent $intent, string $tsaUrl | Construit une configuration de valeurs de départ de signature contrainte par la FDA | SeedValueConfig | — | Exige l’ensemble de motifs FDA, un horodatage et des condensats SHA-256 ou plus robustes |
Fda\FdaSignatureEnforcer::applyTo | SequentialSigner $signer, SigningStrategy $strategy, string $signerName, FdaSigningIntent $intent, string $tsaUrl, string $fieldName = '', ?string $reason = null | Ajoute un signataire contraint par la FDA à un SequentialSigner Pro | SequentialSigner | — | Sérialise les contraintes dans le champ de signature produit |
namespace NextPDF\Enterprise\Validation;
final readonly class Compliance{ public function __construct(?ClockInterface $clock = null);
/** @param array<string, mixed> $context */ public function run(string $pdfData, CompliancePolicy $policy, array $context = []): ComplianceReport;
/** @param array<string, mixed> $context */ public static function assess(string $pdfData, CompliancePolicy $policy, array $context = []): ComplianceReport;}final class Policies{ public static function pdfA4(): CompliancePolicy; // also pdfA4e(), pdfA4f() public static function padesBaseline(): CompliancePolicy; public static function eidasQualified(): CompliancePolicy; public static function ltvHealth(): CompliancePolicy; public static function zugferd(string $profile = 'BASIC'): CompliancePolicy; public static function fdaPart11(): CompliancePolicy; public static function sec17a4(): CompliancePolicy; // also sec17a4Compatible(), sec17a4Structural(), sec17a4PreSign()}interface CompliancePolicy{ public function getName(): string;
public function getIdentifier(): string;
public function getStandardReference(): string;
/** * @param array<string, mixed> $context * @return list<ComplianceFinding> */ public function validate(string $pdfData, array $context = []): array;}
final readonly class ComplianceReport{ public const string LEGAL_DISCLAIMER;
public function passes(): bool;
public function fails(): bool;
public function totalFindings(): int;
public function getDisclaimer(): string;}Contrat de comportement
Section intitulée « Contrat de comportement »Compliance::assess() (statique) et Compliance::run() (instance, avec un Psr\Clock\ClockInterface injectable) appliquent exactement une politique et renvoient un ComplianceReport. Règles observables de l’extérieur :
- Lecture seule pure. Chaque
CompliancePolicy::validate()est une fonction pure : des octets en entrée, des constats en sortie. Une politique ne modifie jamais les octets d’un PDF. Cet invariant architectural garde la validation distincte de la correction automatique et du module Evidence. - Filtre de gravité.
ComplianceReport::passes()n’est vrai que lorsqueerrors === []. Les avertissements et les infos ne font jamais échouer un rapport.fails()est le complément. - Clause de non-responsabilité obligatoire.
ComplianceReport::getDisclaimer()renvoie le texte constant de la clause de non-responsabilité juridique. Le contrat exige de l’afficher dans toute sortie destinée à l’utilisateur. - Provenance du rapport. Le rapport porte le nom, l’identifiant et la référence de norme de la politique, l’horodatage de validation issu de l’horloge injectée ou système, et la durée mesurée en millisecondes.
- Collecter, ne pas interrompre. Les politiques intégrées exécutent toutes les vérifications applicables et collectent chaque constat plutôt que de s’arrêter à la première erreur.
- DSS uniquement atteignable via le catalogue.
LtvHealthCheckrésout la présence du DSS à partir du graphe d’objets actif : trailer actif, puis catalogue/Root, puis/DSSet ses sous-clés. Les octets-marqueurs plantés dans des commentaires, des chaînes, des objets orphelins ou des révisions remplacées ne comptent pas. Une entrée non analysable est traitée comme une absence de DSS, si bien que la vérification se sécurise par défaut. La vérification est structurelle ; elle ne vérifie pas cryptographiquement les données OCSP/CRL incorporées. - Vérifications structurelles de signature.
Policies::padesBaseline()etPolicies::eidasQualified()valident la structure PAdES au seul niveau du PDF. La qualification au titre d’eIDAS dépend du TSP et du certificat qualifié, qui sont hors de ce module. - Les politiques des secteurs réglementés sont structurelles.
FdaPart11Policyvérifie la présence de signature, l’intention/Reason, l’heure de signature/M, l’identité/Name, l’absence de JavaScript, l’espace de noms de la piste d’audit FDA et l’intégrité de la chaîne de hachage.Sec17a4WormPolicyvérifie jusqu’à 13 règles WORM ;WormComplianceLevelsélectionne la rigueur.Fullexige DocMDP niveau 1,Compatibleaccepte le niveau 2, etStructural/PreSignignorent les règles de signature, DocMDP et DSS. Aucune de ces politiques n’établit une conformité juridique. - Contexte ZUGFeRD.
Policies::zugferd()vérifie toujours les exigences au niveau du PDF. Elle valide le XML de facture uniquement lorsque l’appelant passe['xml' => $xmlData]dans$context; sinon elle émet le constat d’informationzugferd-xml-skipped. - Piste d’audit inviolable.
FdaAuditTrailest une chaîne de hachage SHA-256 à ajout seul.addEvent()rejette un maillon rompu,verifyChain()redérive chaque hachage, etembedInMetadata()écrit la piste dans le XMP soushttp://ns.nextpdf.dev/fda/1.0/avec un schéma d’extension PDF/A.
Cas limites et modes de défaillance
Section intitulée « Cas limites et modes de défaillance »- Une entrée non-PDF ou vide produit des constats d’erreur plutôt qu’une exception dans les politiques intégrées. Vérifie toujours
passes()et affiche la clause de non-responsabilité. Policies::zugferd()normalise les alias de profil (BASIC_WL,EN16931,EN_16931). Un profil inconnu lève\ValueErrorau moment de la fabrique, avant l’exécution de toute validation.- Un DSS avec des CRL mais sans réponses OCSP satisfait la vérification du matériel de révocation ; le constat indique l’alternative acceptable. L’absence des deux constitue une erreur.
- Un dictionnaire
/VRIou un tableau/Certsmanquant produit des avertissements, pas des erreurs ; le rapport peut tout de même réussir. FdaAuditEventrejette tout horodatage non-UTC avecInvalidArgumentExceptionà la construction.FdaAuditTrail::verifyChain()renvoie faux pour tout événement altéré ou réordonné ; elle ne lève jamais d’exception.- Les implémentations personnalisées de
CompliancePolicypeuvent lever une exception depuisvalidate();Compliance::run()ne l’intercepte pas, si bien que ces exceptions se propagent à l’appelant.
Comportement en mode FIPS
Section intitulée « Comportement en mode FIPS »Ce module n’effectue aucune signature, aucune vérification cryptographique et aucune conservation de clé. La politique d’algorithmes en mode FIPS est régie par les modules Security et Signature. Les valeurs de départ de FdaSignatureEnforcer contraignent les champs de signature liés à la FDA aux méthodes de condensation SHA-256, SHA-384 ou SHA-512.
Conformité
Section intitulée « Conformité »Ces politiques vérifient des attributs structurels par rapport aux normes citées. Le verdict de conformité pour les profils ISO/ETSI reste une propriété du fichier final combiné à un validateur externe.
| Comportement | Référence |
|---|---|
| Conformité déterminée par rapport à la norme, pas au producteur | ISO 19005-4:2020 §5.2 |
| Dictionnaire de signature numérique / DSS pour la validation à long terme | ISO 32000-2:2020 §12.8 |
Le DSS est un dictionnaire détenu par la clé DSS du catalogue du document | ISO 32000-2:2020 §12.8.4.3 |
| Niveaux de signature PAdES baseline | ETSI EN 319 142-1 §5.4.3 |
| Modèle sémantique du profil EN 16931 (référence de soutien) | Factur-X 1.08 (EN 16931) |
Les politiques FDA 21 CFR Part 11 et SEC 17a-4 vérifient uniquement des attributs structurels ; ces réglementations sont hors du corpus de vérification et ne portent aucune affirmation de conformité vérifiée. Les chaînes de clause figurant dans les constats FDA (par exemple §11.50, §11.10(e)) sont des références de règle émises par le produit. La ligne EN 16931 est une référence de soutien située sous le seuil de récupération ; ce n’est pas une affirmation de conformité ferme. La prise en charge d’une norme n’est pas la conformité à celle-ci, et la conformité n’est pas la certification — NextPDF ne détient aucune certification et n’en accorde aucune. Cette référence n’est pas un avis juridique ; consulte ton équipe de conformité pour la suffisance juridique.
Notes de développement
Section intitulée « Notes de développement »- La validation s’exécute en cours de processus et en local, sans E/S réseau. Une politique ne peut pas altérer l’entrée.
- Traite les octets d’un PDF issu de sources non fiables comme hostiles. Les politiques intégrées sont totales sur des octets arbitraires et se sécurisent par défaut lorsque la structure ne peut pas être résolue.
- Affiche
ComplianceReport::getDisclaimer()dans chaque rendu d’un rapport destiné à l’utilisateur. - Les rapports et les constats peuvent porter des données personnelles issues des documents signés et des métadonnées de la piste d’audit (noms des signataires, numéros de série des certificats). L’exploitant est responsable des contrôles de rétention et de minimisation.
- Les politiques personnalisées implémentent
CompliancePolicy; gardegetIdentifier()unique pour toutes les politiques afin d’assurer la sérialisation et la mise en cache. - Ce module concerne une fonctionnalité cryptographique ; traite-le comme sensible du point de vue de la sécurité dans ta propre revue.
- Le détail des mécanismes internes reste dans la documentation interne du dépôt source et sort du périmètre de ce manuel.
Périmètre de publication
Section intitulée « Périmètre de publication »Cette page documente uniquement le comportement observable de l’extérieur et la surface d’API publique prise en charge. Les chemins d’espaces de noms internes, les classes utilitaires, les tables de mécanismes, les noms de fichiers de runbook et les préfixes de tickets sont hors périmètre.