Aller au contenu

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.