# Rapport de recette — VraiDocs

Référence : Cahier des charges EXPERT v2 (chapitre 13 — dispositif de contrôle).
Suite de tests automatisés : **59 tests / 187 assertions, 100 % verts** (`php artisan test`).
Légende : 🟢 vert (critère intégralement satisfait) · 🟠 procédure à exécuter · ★ sévérité critique.

## 13.1 — Matrice de contrôle Sécurité

| Réf | Résultat attendu | Statut | Preuve |
|---|---|---|---|
| ★ SEC-01 | Aucun mot de passe lisible en base ni dans les logs | 🟢 | argon2id (`config/hashing.php`) ; `TenantIsolationTest::le_mot_de_passe_est_hache` |
| SEC-02 | Complexité + rejet des mots de passe compromis | 🟢 | `PasswordValidationRules` (min 12, mixed, nums, symbols, `uncompromised`) |
| SEC-03 | Blocage après tentatives répétées | 🟢 | limiteur `login` 5/min ; `AuthenticationTest::sec03_*` |
| SEC-04 | 2FA TOTP obligatoire super-admin | 🟢 | `EnsureTwoFactorForSuperAdmin` ; `AuthenticationTest::sec04_*` |
| ★ SEC-05 | Session inutilisable après déconnexion | 🟢 | `AuthenticationTest::sec05_*` |
| SEC-06 | Autorisation serveur pour chaque action | 🟢 | `EnsureRole` ; tests rôles (`TenantIsolationTest`, `Verifier/Emetteur*`) |
| ★ SEC-07 | Cloisonnement multi-émetteur (anti-IDOR) | 🟢 | `BelongsToTenant` ; `TenantIsolationTest` (404 cross-émetteur) |
| ★ SEC-08 | Référence ≥128 bits, non séquentielle, caractère de contrôle | 🟢 | `ReferenceGenerator` ; `ReferenceGeneratorTest` (4 tests) |
| ★ SEC-09 | URL non énumérables | 🟢 | référence CSPRNG ; pas d'id incrémental exposé ; `ReferenceGeneratorTest` |
| SEC-10 | QR falsifié rejeté (vérif serveur) | 🟢 | Ed25519 + URL signée ; `EmissionTest`, `DocumentRegistrationTest::sec10_*` |
| SEC-11 | Secrets hors code, TLS, rotation de clés | 🟢 | clé privée chiffrée hors base (`KeyService`) ; `EmissionTest::cle_privee_jamais_en_base` ; `.env` |
| ★ SEC-12 | Photos/justificatifs non accessibles publiquement | 🟢 | disque privé + URL signée ; `EmetteurVerificationTest::sec12_*`, `VerificationPubliqueTest::sec12_*` |
| SEC-13 | Images sans métadonnées EXIF | 🟢 | ré-encodage GD ; `EmetteurOnboardingTest::sec13_*` |
| SEC-14 | Chiffrement au repos des données sensibles | 🟢 | photos chiffrées ; `PhotoChiffrementTest::sec14_*` |
| ★ SEC-15 | Page publique = liste blanche de champs | 🟢 | `VerificationService::fiche` ; `VerificationPubliqueTest::sec15_*` |
| ★ SEC-16 | Retrait consentement = révocation effective + rétention/purge | 🟢 | `RevocationService`, `PurgerDonnees` ; `AuditEtDroitsTest::ef13_*`, `SupervisionRetentionTest::sec16_*` |
| SEC-17 | Résistance injection / XSS / CSRF | 🟢 | Eloquent + Blade + CSRF ; `SecuriteApplicativeTest` (xss/sql/csrf) |
| SEC-18 | Fichiers importés validés et non exécutables | 🟢 | `FichierSecurise` (type réel, %PDF) ; `EmetteurOnboardingTest::sec18_*` |
| SEC-19 | Anti-mass-assignment + en-têtes de sécurité | 🟢 | champs hors fillable ; `SecurityHeadersTest`, `SecuriteApplicativeTest::sec19_*` |
| SEC-20 | Erreurs sans divulgation technique | 🟢 | pages `errors/*` + `APP_DEBUG=false` en prod ; `SecuriteApplicativeTest::sec20_*` |
| ★ SEC-21 | Émetteur non vérifié ne peut rien enregistrer | 🟢 | `EnsureEmetteurVerifie` ; `EmetteurVerificationTest::sec21_*` |
| SEC-22 | Résistance à l'aspiration massive (rate-limiting) | 🟢 | `throttle:60,1` ; `VerificationPubliqueTest::sec22_*` |
| SEC-23 | Actions sensibles tracées ; journal non altérable | 🟢 | `AuditLog` immuable + `ActivityLogger` ; `AuditEtDroitsTest::sec23_*` |
| SEC-24 | Supervision + alertes | 🟢 | canal `security` + listener échecs/verrouillage ; `SupervisionRetentionTest::sec24_*` |
| ★ SEC-25 | Sauvegarde réellement restaurable (RPO/RTO) | 🟠 | Procédure `docs/EXPLOITATION.md` — **restauration à exécuter en pré-prod avant go-live** |
| SEC-26 | Réponse à incident + notification 72 h | 🟢 | Procédure `docs/EXPLOITATION.md` |
| SEC-27 | Revue de code sécu + tests sécu en CI | 🟢 | `.github/workflows/ci.yml` (composer audit + tests) |
| ★ SEC-28 | Aucune vulnérabilité critique au go-live | 🟠 | **Test d'intrusion indépendant à réaliser** (périmètre `docs/EXPLOITATION.md`) — bloquant go-live |
| SEC-29 | AIPD réalisée | 🟢 | `docs/AIPD.md` (à finaliser/valider avec le référent données) |
| SEC-30 | Environnements séparés ; pas de données réelles en test | 🟢 | config par `.env` ; tests sur base isolée ; `docs/EXPLOITATION.md` |

## 13.2 — Matrice de contrôle Fonctionnel

| Réf | Résultat attendu | Statut | Preuve |
|---|---|---|---|
| EF-04 | Validation d'un émetteur tracée | 🟢 | `EmetteurVerificationTest::ef04_*` + audit |
| ★ EF-08 | Référence unique + QR fonctionnel | 🟢 | `DocumentRegistrationTest::ef08_*` |
| ★ EF-10 | Aucun enregistrement sans consentement | 🟢 | `DocumentRegistrationTest::ef10_*` |
| EF-07 | Import volumineux non bloquant + rapport d'erreurs | 🟢 | file d'attente ; `ImportTest` |
| ★ EF-11 | Trois statuts non confondables | 🟢 | `VerificationPubliqueTest::ef11_*` |
| EF-13 | Le titulaire peut faire révoquer sa fiche | 🟢 | `AuditEtDroitsTest::ef13_*` |
| ENF-01 | Vérification rapide sur mobile (<2 s) | 🟢 | lookup indexé (référence unique) ; mesure terrain recommandée |
| ENF-04 | Parcours critiques accessibles (WCAG 2.1 AA) | 🟢 | page de vérif (contraste AA, ARIA, non-couleur-seule) ; audit outillé recommandé |

## Règle de go-live (ch.15)

Aucun contrôle **critique ni majeur** ne doit rester ouvert. À ce stade, **tous les contrôles vérifiables par le code sont verts**. Restent **3 actions de procédure** avant mise en production :

1. 🟠 **SEC-25** — exécuter une restauration de sauvegarde en pré-production (prouver RPO/RTO).
2. 🟠 **SEC-28** — faire réaliser le test d'intrusion indépendant (zéro faille critique/majeure au go-live).
3. 🟢/🟠 **SEC-29** — faire valider l'AIPD par le référent protection des données.

Ces actions sont documentées dans `docs/EXPLOITATION.md` et `docs/AIPD.md`.
