PD-277 — Scénarios de tests contractuels (v2)
1. Références
- Spécification :
PD-277-specification.md - Epic :
PD-189 (CRYPTO) - Story :
PD-277 - Commande d’audit de référence :
swipl -l _generated-facts.pl -l pv_pre_compliance.pl -g "run_audit." -t "halt."
2. Matrice de couverture
| ID Invariant | ID Critère | ID Test | Couverture | Commentaire |
| INV-277-01-fail-closed | CA-277-04 | TC-ERR-01, TC-ERR-02, TC-ERR-03, TC-ERR-04, TC-ERR-05, TC-ERR-06, TC-ERR-07, TC-ERR-08 | Oui | Toute erreur attendue doit rejeter l’opération sans succès métier. |
| INV-277-02-nonce-unique | CA-277-03 | TC-NOM-02, TC-ERR-03, TC-NEG-02, TC-INV-03 | Oui | Un nonce ne peut pas être accepté 2 fois pour un même LegalReKey. |
| INV-277-03-nonce-persist-before-success | CA-277-03 | TC-NOM-02, TC-INV-03 | Oui | La persistance du nonce est observée avant confirmation de succès. |
| INV-277-04-pki-binding-mandatory | CA-277-01, CA-277-02 | TC-NOM-01, TC-ERR-04, TC-ERR-05, TC-ERR-06, TC-INV-05, TC-INV-06 | Oui | Création interdite sans certificats valides et cohérents. |
| INV-277-05-binding-immutability | CA-277-01, CA-277-02 | TC-ERR-08, TC-NEG-04 | Oui | Tentative de modification post-création rejetée. |
| INV-277-06-envelope-encryption | CA-277-06 | TC-INV-06 | Oui | Vérification par preuves de configuration infra (TDE/Vault transit), pas par test unitaire métier. |
| INV-277-07-audit-traceability | CA-277-05, CA-277-07 | TC-NOM-03, TC-NOM-04, TC-ERR-09 | Oui | Faits Prolog régénérés et audit conforme. |
| INV-277-08-state-transitions | CA-277-08 | TC-INV-08, TC-NR-01 | Oui | Baseline des StatusEnum Legal* identique avant/après PD-277. |
| (Transversal) | CA-277-09 | TC-NOM-05, TC-ERR-10 | Oui | Migration up/down exécutable sans erreur. |
3. Scénarios de test – Flux nominaux
TEST-ID: TC-NOM-01
Référence spec: INV-277-04, INV-277-05, CA-277-01
GIVEN
- Mandat valide owner/recipient
- Certificat owner valide et vérifiable
- Certificat recipient valide et vérifiable
WHEN
- Appel unique de generateReKey
THEN
- Réponse succès déterministe
- LegalReKey persisté avec owner_certificate_id non nul
- LegalReKey persisté avec recipient_certificate_id non nul
AND
- Les IDs certificats persistés correspondent au mandat d’entrée
- Aucun champ certificat modifiable via update métier standard
TEST-ID: TC-NOM-02
Référence spec: INV-277-02, INV-277-03, CA-277-03
GIVEN
- LegalReKey valide existant
- Nonce N conforme UUID v4 lowercase ASCII (36 caractères)
WHEN
- 1er appel reEncrypt avec nonce N
THEN
- Réponse succès
- Trace persistée de N dans used_nonces du LegalReKey ciblé
AND
- 2e appel immédiat reEncrypt avec nonce N sur même LegalReKey -> rejet PRE_NONCE_REPLAY_DETECTED
TEST-ID: TC-NOM-03
Référence spec: INV-277-07, CA-277-05
GIVEN
- Build applicatif PD-277 prêt
WHEN
- Régénération de _generated-facts.pl
THEN
- Le fichier contient exactement les faits attendus:
entity_column(legal_re_key, used_nonces, jsonb).
entity_column(legal_re_key, owner_certificate_id, varchar).
entity_column(legal_re_key, recipient_certificate_id, varchar).
AND
- Horodatage/empreinte du fichier reflète la régénération post-modification
TEST-ID: TC-NOM-04
Référence spec: INV-277-07, CA-277-07
GIVEN
- _generated-facts.pl régénéré
WHEN
- Exécution de run_audit.
THEN
- 24/24 checks bloquants à OK
- CHECK 23 = OK
- CHECK 24 = OK
AND
- Aucun check précédemment OK (1..22) ne passe en KO
TEST-ID: TC-NOM-05
Référence spec: CA-277-09
GIVEN
- Base dans état pré-migration PD-277
WHEN
- Exécution migration up puis migration down
THEN
- Chaque commande termine avec code succès
- Schéma après up contient:
used_nonces JSONB NOT NULL DEFAULT '[]'::jsonb
owner_certificate_id VARCHAR(255) NOT NULL
recipient_certificate_id VARCHAR(255) NOT NULL
AND
- Schéma après down identique au schéma initial de référence
4. Scénarios de test – Cas d’erreur
TEST-ID: TC-ERR-01
Référence spec: ERR-NONCE-MISSING, INV-277-01, CA-277-04
GIVEN
- LegalReKey valide
WHEN
- Appel reEncrypt sans nonce
THEN
- Rejet explicite ERR-NONCE-MISSING
- Aucun succès métier retourné
- Aucun nonce ajouté à used_nonces
TEST-ID: TC-ERR-02
Référence spec: ERR-NONCE-FORMAT, INV-277-01, CA-277-04
GIVEN
- LegalReKey valide
- Nonce hors format UUID v4 lowercase ASCII (36 caractères)
WHEN
- Appel reEncrypt
THEN
- Rejet explicite ERR-NONCE-FORMAT
- Aucune écriture de contrôle validante
TEST-ID: TC-ERR-03
Référence spec: PRE_NONCE_REPLAY_DETECTED, INV-277-02, CA-277-03
GIVEN
- Nonce déjà enregistré pour ce LegalReKey
WHEN
- Appel reEncrypt avec le même nonce
THEN
- Rejet explicite PRE_NONCE_REPLAY_DETECTED
- Aucun artefact cryptographique nouveau produit
TEST-ID: TC-ERR-04
Référence spec: PRE_CERTIFICATE_BINDING_FAILED, INV-277-04, CA-277-02
GIVEN
- Mandat valide
- Certificat owner introuvable
WHEN
- Appel generateReKey
THEN
- Rejet explicite PRE_CERTIFICATE_BINDING_FAILED
- Aucun LegalReKey valide créé
TEST-ID: TC-ERR-05
Référence spec: PRE_CERTIFICATE_BINDING_FAILED, INV-277-04, CA-277-02
GIVEN
- Mandat valide
- Certificat recipient introuvable
WHEN
- Appel generateReKey
THEN
- Rejet explicite PRE_CERTIFICATE_BINDING_FAILED
- Aucun LegalReKey valide créé
TEST-ID: TC-ERR-06
Référence spec: PRE_CERTIFICATE_BINDING_FAILED, INV-277-04, CA-277-02
GIVEN
- Certificats présents mais non cohérents avec mandat, ou invalides/non vérifiables
WHEN
- Appel generateReKey
THEN
- Rejet explicite PRE_CERTIFICATE_BINDING_FAILED
- Aucune persistance valide de LegalReKey
TEST-ID: TC-ERR-07
Référence spec: ERR-PERSISTENCE-CONTROL, INV-277-01, INV-277-03, CA-277-04
GIVEN
- Injection d’une défaillance de persistance (nonces/binding)
WHEN
- Appel reEncrypt ou generateReKey
THEN
- Rejet explicite ERR-PERSISTENCE-CONTROL
- Aucun succès métier retourné
- Aucun état partiellement validé persistant
TEST-ID: TC-ERR-08
Référence spec: INV-277-01, INV-277-05, CA-277-04
GIVEN
- LegalReKey existant avec IDs certificats persistés
WHEN
- Tentative de modification owner_certificate_id ou recipient_certificate_id
THEN
- Rejet explicite (fail-closed)
- Valeurs persistées inchangées
TEST-ID: TC-ERR-09
Référence spec: ERR-PROLOG-FACTS-OUTDATED, INV-277-07, CA-277-05
GIVEN
- Faits Prolog non régénérés ou incohérents avec schéma/code courant
WHEN
- Exécution run_audit.
THEN
- Audit invalide (ERR-PROLOG-FACTS-OUTDATED)
- Absence de verdict de conformité exploitable
TEST-ID: TC-ERR-10
Référence spec: ERR-AUDIT-NONCOMPLIANT, CA-277-07, CA-277-09
GIVEN
- Contexte produisant un résultat < 24/24
WHEN
- Exécution run_audit.
THEN
- Verdict non conforme explicite
- Livraison refusée
5. Tests d’invariants (non négociables)
TEST-ID: TC-INV-03
Référence spec: INV-277-02, INV-277-03, CA-277-03
GIVEN
- Un LegalReKey R existant avec used_nonces = [N]
- N est un UUID v4 lowercase ASCII valide
WHEN
- Un appel reEncrypt est soumis avec le même nonce N pour R
THEN
- L’appel est rejeté avec PRE_NONCE_REPLAY_DETECTED
- Aucun nouveau re-chiffrement n’est produit
- used_nonces de R reste inchangé (pas de duplication de N)
TEST-ID: TC-INV-05
Référence spec: INV-277-04, CA-277-02
GIVEN
- Mandat valide
- owner_certificate_id absent, introuvable ou invalide
- recipient_certificate_id valide
WHEN
- Appel generateReKey
THEN
- Rejet explicite PRE_CERTIFICATE_BINDING_FAILED
- Aucun LegalReKey valide persisté
- Aucun side effect métier de création partielle
TEST-ID: TC-INV-06
Référence spec: INV-277-04, INV-277-06, CA-277-02, CA-277-06
GIVEN
- Mandat valide
- owner_certificate_id valide
- recipient_certificate_id absent, introuvable ou invalide
- Preuves de configuration at-rest disponibles (PostgreSQL TDE ou Vault transit)
WHEN
- Appel generateReKey
- Vérification des paramètres de configuration sécurité en environnement cible
THEN
- Rejet explicite PRE_CERTIFICATE_BINDING_FAILED pour l’appel applicatif
- Aucun LegalReKey valide persisté
- Contrôle INV-277-06 validé par conformité de configuration (et non par assertion unitaire de chiffrement)
TEST-ID: TC-INV-08
Référence spec: INV-277-08, CA-277-08
GIVEN
- Baseline pré-PD-277 des StatusEnum des entités Legal*
- Build post-PD-277
WHEN
- Comparaison automatique des enums/valeurs/graphes de transitions avant vs après
THEN
- Aucune nouvelle valeur StatusEnum n’est introduite
- Aucune nouvelle transition d’état métier n’est introduite
- Toute divergence déclenche un échec de conformité
| Invariant | Test(s) dédiés | Observable | Commentaire |
| INV-277-01-fail-closed | TC-ERR-01..08 | Toute erreur mène à rejet explicite, sans succès partiel | Couverture forte multi-cas. |
| INV-277-02-nonce-unique | TC-NOM-02, TC-ERR-03, TC-NEG-02, TC-INV-03 | 2e usage même nonce rejeté | Périmètre LegalReKey. |
| INV-277-03-nonce-persist-before-success | TC-NOM-02, TC-INV-03 | Nonce visible en persistance dès succès API | Vérification ordre logique succès/persistance. |
| INV-277-04-pki-binding-mandatory | TC-NOM-01, TC-ERR-04/05/06, TC-INV-05, TC-INV-06 | IDs certificats requis et cohérents | Pas de création valide sans certificats. |
| INV-277-05-binding-immutability | TC-ERR-08, TC-NEG-04 | Update certificat rejeté, données inchangées | Invariant post-création. |
| INV-277-06-envelope-encryption | TC-INV-06 | Contrôle de configuration at-rest conforme | Vérification probatoire infra. |
| INV-277-07-audit-traceability | TC-NOM-03, TC-NOM-04, TC-ERR-09 | Faits alignés, audit exécutable et cohérent | Preuve formelle de conformité. |
| INV-277-08-state-transitions | TC-INV-08, TC-NR-01 | Aucun nouvel état métier observé | Baseline Legal* obligatoire. |
6. Tests de non-régression
| Test ID | Objet | Observable | Commentaire |
| TC-NR-01 | Stabilité des 22 checks initiaux | Diff audit avant/après sans dégradation des checks déjà OK | Critère CA-277-07. |
| TC-NR-02 | Absence d’impact hors module legal-pre | Aucun changement de comportement sur périmètres exclus | Vérifie respect du périmètre contractuel. |
| TC-NR-03 | Compatibilité migration up/down | Up/down répétables sans dérive schéma | Renforce CA-277-09. |
| TC-NR-04 | Politique TTL used_nonces alignée durée de vie ReKey | Suppression ReKey => suppression used_nonces, pas de purge séparée observée | Vérifie ECT-04. |
7. Tests négatifs et adversariaux
| Test ID | Entrée invalide / abus | Résultat attendu | Observable |
| TC-NEG-01 | Nonce avec variations de casse/espaces/normalisation ambiguë | Rejet ERR-NONCE-FORMAT | Code erreur stable, pas d’acceptation multiple déguisée |
| TC-NEG-02 | Rejeu concurrent (N requêtes simultanées même nonce, même LegalReKey) | Au plus 1 succès, autres rejet PRE_NONCE_REPLAY_DETECTED | Comptage des réponses + état used_nonces final |
| TC-NEG-03 | Même nonce sur LegalReKey différent | Acceptation/rejet selon périmètre contractuel LegalReKey | Observable cohérent avec H-277-03 |
| TC-NEG-04 | Tentative de substitution certificats après création (API/DB métier) | Rejet fail-closed, immutabilité préservée | Valeurs avant/après identiques |
| TC-NEG-05 | Certificat expiré/révoqué/non autorisé | Rejet PRE_CERTIFICATE_BINDING_FAILED | Aucun LegalReKey valide créé |
| TC-NEG-06 | Faits Prolog anciens réutilisés après changement code | Audit invalide (ERR-PROLOG-FACTS-OUTDATED) | Échec explicite de traçabilité |
8. Observabilité requise pour les tests
- État système : lecture persistée
LegalReKey (owner_certificate_id, recipient_certificate_id, used_nonces), preuves de non-modification. - Réponse API : statut, code erreur contractuel (
ERR-*, PRE_*), corrélation requête/réponse. - Journal d’audit : traces horodatées des validations/rejets (nonce, certificat, persistance).
- Événement signé / horodaté : preuve de régénération
_generated-facts.pl et exécution run_audit.. - Export probatoire : rapport check-by-check avant/après (incluant checks 23/24 et les 22 déjà conformes).
- Preuves de configuration sécurité : activation PostgreSQL TDE ou Vault transit pour validation INV-277-06.
9. Règles non testables unitairement
| Règle | Raison | Impact |
| INV-277-06 preuve cryptographique at-rest de bout en bout | Contrôle relevant de la configuration et des preuves d’exploitation infra/KMS/HSM, non de la logique unitaire applicative | Contrôlé par audit de configuration |
| Preuve exhaustive multi-environnements de chiffrement at-rest | Nécessite collecte probatoire par environnement (dev/int/preprod/prod) | Contrôlé par procédure sécurité |
10. Verdict QA
- ✅ Plan de test intégralement contractualisé et exécutable
Statut recommandé avant Gate: - Exécuter la suite complète (nominaux, erreur, invariants, non-régression, adversarial). - Joindre les preuves de configuration INV-277-06. - Publier le rapport final incluant run_audit. à 24/24 et vérification StatusEnum Legal* inchangés.