Aller au contenu

Dossier de conformité — Gate 8 CLOSURE v1

Story : PD-282 — ProofEnvelope : scellement HSM + matériel validation eIDAS Gate : 8 (CLOSURE) Itération : v1 Date : 2026-03-02

Synthèse

Gate 8 évalue la conformité de l'implémentation par rapport à la spécification, la couverture de tests, la sécurité et la maintenabilité. L'acceptabilité (étape 7) a rendu un verdict NON ACCEPTABLE avec 3 écarts BLOQUANTS et 5 MAJEURS. La confrontation Claude (Phase 2) confirme ces écarts.

Écarts identifiés

BLOQUANTS

ID Type Description Source
DIV-01 ECT Double-hash crypto : seal() pré-hash SHA3-384 puis HSM signe (ECDSA). verify() passe le hash pré-calculé à createVerify('SHA3-384') qui re-hash avant vérification. Chaîne de hachage incohérente entre scellement et vérification. Review code + Confrontation
DIV-02 ECT Structure DB imbriquée : La colonne envelope_seal stocke le wrapper SealedProofEnvelope complet au lieu de EnvelopeSeal seul. Le vérificateur ne peut pas reconstruire l'enveloppe correctement à partir de la DB. Review code + Confrontation
DIV-03 SEC Bypass trust anchor Mode A : trustedRoots est optionnel dans verify(). Sans trusted roots, un certificat auto-signé passe la vérification Mode A, compromettant la chaîne de confiance. Review sécurité + Confrontation

MAJEURS

ID Type Description Source
DIV-04 ECT Policy OCSP incohérente : validationPolicy assemblée dans le service mais pas cohérente avec les OCSP responses réellement collectées. Review code
DIV-05 ECT Mode B non implémenté : verifyOnlineOcsp() vérifie uniquement la validité temporelle du certificat, pas de requête OCSP live réelle. Review code + Confrontation
DIV-06 ECT Triple duplication verificationMaterial : Le matériel de vérification apparaît dans l'enveloppe, dans le seal, et dans la colonne DB séparément. Review code
DIV-07 SEC SSRF OCSP : Les URLs de répondeurs OCSP extraites des certificats ne sont pas filtrées (risque SSRF vers réseau interne). Review sécurité + Confrontation
DIV-09 ECT Test PD-280 absent : Pas de test d'intégration cross-story PD-280 (ProofEnvelope base) + PD-282 (seal). Confrontation

MINEURS

ID Type Description Source
DIV-08 ECT Parsing OCSP heuristique : Extraction du status OCSP par recherche d'octets magiques plutôt que parsing ASN.1 conforme. Confrontation

Scoring par critère

Critère Base Déductions Score
conformity 10 DIV-01 (-2), DIV-02 (-2), DIV-04 (-1), DIV-06 (-1) 4.0
test_coverage 10 DIV-09 (-1), DIV-08 (-0.25) 8.75
security 10 DIV-03 (-2), DIV-07 (-1) 7.0
maintainability 10 DIV-05 (-1) 9.0

Moyenne : (4.0 + 8.75 + 7.0 + 9.0) / 4 = 7.1875

Application des règles de verdict

  • conformity = 4.0 < 6 → NON_CONFORME (règle "au moins un score < 6")
  • Moyenne = 7.1875 ≥ 7 mais un score < 6 → NON_CONFORME prime

Verdict : NON_CONFORME

Actions requises avant v2

  1. DIV-01 : Corriger verifyEcdsaSignature() — passer canonicalJson brut au lieu du hash pré-calculé, OU utiliser crypto.verify() avec algorithme NULL (raw ECDSA)
  2. DIV-02 : Vérifier la structure stockée en DB — envelope_seal doit contenir EnvelopeSeal seul
  3. DIV-03 : Rendre trustedRoots obligatoire en Mode A, ou fail explicite si absent
  4. DIV-05 : Implémenter la requête OCSP live en Mode B (ou documenter comme STUB PD-XXX)
  5. DIV-07 : Filtrer les URLs OCSP (allowlist de domaines, ou restriction aux URLs publiques)