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¶
- DIV-01 : Corriger
verifyEcdsaSignature()— passercanonicalJsonbrut au lieu du hash pré-calculé, OU utilisercrypto.verify()avec algorithme NULL (raw ECDSA) - DIV-02 : Vérifier la structure stockée en DB —
envelope_sealdoit contenirEnvelopeSealseul - DIV-03 : Rendre
trustedRootsobligatoire en Mode A, ou fail explicite si absent - DIV-05 : Implémenter la requête OCSP live en Mode B (ou documenter comme STUB PD-XXX)
- DIV-07 : Filtrer les URLs OCSP (allowlist de domaines, ou restriction aux URLs publiques)