PD-282 - Scenarios de tests contractuels
1. References
- Specification :
PD-282-specification.md - Epic : Pas d'epic parent (story independante, labels: crypto, legal-compliance, rfc-pv-proof)
2. Matrice de couverture
| ID Invariant | ID Critere | ID Test | Couverture | Commentaire |
| INV-282-01 | CA-01, CA-02 | TC-NOM-01, TC-ERR-01, TC-ERR-03 | Oui | Presence + validite crypto du envelopeSeal |
| INV-282-02 | CA-02 | TC-NOM-01, TC-ERR-02 | Oui | Exclusion stricte de envelopeSeal du payload signe |
| INV-282-03 | CA-03 | TC-NOM-02 | Oui | Alteration 1 octet => valid=false |
| INV-282-04 | CA-04, CA-08 | TC-NOM-03, TC-NOM-04, TC-ERR-04 | Oui | Suffisance du verificationMaterial en Mode A |
| INV-282-05 | CA-10 | TC-NOM-03, TC-NOM-04, TC-NEG-05 | Oui | validationPolicy explicite et contrainte enum |
| INV-282-06 | CA-06 | TC-INV-06, TC-NEG-08 | Oui | Verification heuristique anti-secrets sur patterns interdits |
| INV-282-07 | - | TC-INV-07 | Oui (partiel) | Testable techniquement sur artefacts persistes, perimetre runtime/HSM requis |
| INV-282-08 | CA-07 | TC-NOM-05, TC-ERR-07 | Oui | Immutabilite post-persistance |
| INV-282-09 | CA-11 | TC-NOM-06, TC-INV-09 | Oui | SEALED -> * interdit |
| INV-282-10 | CA-11 | TC-INV-10 | Oui | SEALED -> UNSEALED interdit explicitement |
| INV-282-11 | CA-09 | TC-NOM-07 | Oui | Verification historique apres rotation de cle |
| INV-282-12 | CA-12 | TC-ERR-06, TC-NEG-01..TC-NEG-07 | Oui (partiel) | Bornes format testables; performance P95 depend de l'environnement de reference |
3. Scenarios de test - Flux nominaux
TEST-ID: TC-NOM-01
Reference spec: INV-282-01, INV-282-02, CA-01, CA-02
GIVEN
- Une ProofEnvelope valide, finalisable, sans champ envelopeSeal initial
- Jeu de cles HSM actif avec algorithme attendu ECDSA-P384-SHA3-384
WHEN
- La finalisation produit envelopeSeal
- Un verificateur tiers recalcule JCS (hors envelopeSeal), hash et verify
THEN
- valid=true
- envelopeSeal est present et conforme au contrat de format
TEST-ID: TC-NOM-02
Reference spec: INV-282-03, CA-03
GIVEN
- Une ProofEnvelope scellee valide
WHEN
- Un seul octet du JSON canonicalisable est modifie
- La verification est relancee
THEN
- valid=false
TEST-ID: TC-NOM-03
Reference spec: INV-282-04, INV-282-05, CA-04, CA-10
GIVEN
- OCSP disponible au moment de generation
WHEN
- Une enveloppe est finalisee
THEN
- verificationMaterial contient tsaCertificateChain, eidasCertificateChain, ocspResponses, validationTimestamp, validationPolicy
- validationPolicy=GENERATION_TIME_SNAPSHOT
AND
- producedAt de chaque OCSP est <= validationTimestamp
TEST-ID: TC-NOM-04
Reference spec: INV-282-04, CA-08, H-01
GIVEN
- Une enveloppe scellee avec verificationMaterial complet
- Environnement air-gapped sans reseau, sans acces aux services ProbatioVault
- Trust-store du verificateur contenant la racine de confiance requise
WHEN
- Un tiers execute la verification Mode A
THEN
- La verification cryptographique et de chaine aboutit selon policy embarquee
AND
- Aucune dependance reseau ProbatioVault n'est observee
TEST-ID: TC-NOM-05
Reference spec: INV-282-08, CA-07
GIVEN
- Une enveloppe persistee a l'etat SEALED
WHEN
- Une mutation metier est tentee (UPDATE ou DELETE)
THEN
- Rejet strict de l'operation
AND
- Aucune modification d'etat ni de payload persiste
TEST-ID: TC-NOM-06
Reference spec: INV-282-09, INV-282-10, CA-11, §5.4, §5.6, PD-272
GIVEN
- Une enveloppe en construction en memoire au niveau service (etat transitoire UNSEALED non persiste)
WHEN
- Le service finalise le scellement (calcul/hash/signature/envelope_seal) puis execute une persistance atomique en INSERT direct SEALED
THEN
- Aucune ecriture DB en etat UNSEALED n'existe
AND
- L'INSERT initial persiste uniquement un enregistrement SEALED (payload complet incluant envelope_seal)
AND
- Toute tentative ulterieure de mutation de cet enregistrement est refusee (pattern INSERT-only impose par PD-272)
TEST-ID: TC-NOM-07
Reference spec: INV-282-11, CA-09
GIVEN
- Une enveloppe historique signee avec kid K1
- Rotation realisee vers K2
WHEN
- Verification de l'enveloppe historique apres rotation
THEN
- valid=true via kid K1 + certificateChain embarquee
AND
- Absence de dependance a la cle courante K2
TEST-ID: TC-NOM-08
Reference spec: §5.5 Atomicite multi-composant
GIVEN
- Transaction de finalisation en cours
WHEN
- Crash simule avant commit puis apres commit (deux executions distinctes)
THEN
- Pre-commit: rollback total, aucun artefact persistant
- Post-commit: etat DB autoritatif conserve, reconciliation asynchrone possible
AND
- Immutabilite non contournee
TC-NOM-09 — Verification nominale Mode B (online publique)
TEST-ID: TC-NOM-09
Reference spec: §2 Inclus (Mode B), INV-282-04
GIVEN
- Une enveloppe scellee valide avec verificationMaterial complet
- Repondeurs OCSP publics accessibles
WHEN
- Un tiers execute la verification Mode B (online, sans service ProbatioVault)
THEN
- La verification cryptographique reussit
- La verification OCSP en ligne confirme la non-revocation des certificats
4. Scenarios de test - Cas d'erreur
TEST-ID: TC-ERR-01
Reference spec: ERR-01, INV-282-01
GIVEN
- Enveloppe marquee finalisee sans envelopeSeal
WHEN
- Validation contractuelle executee
THEN
- Rejet non conforme explicite
- Aucun statut "valide" retourne
TEST-ID: TC-ERR-02
Reference spec: ERR-02, INV-282-02
GIVEN
- Payload provoquant echec de canonicalisation JCS
WHEN
- Finalisation demandee
THEN
- Rejet finalisation avec erreur metier explicite
- Aucune persistance SEALED
TEST-ID: TC-ERR-03
Reference spec: ERR-03, INV-282-01
GIVEN
- envelopeSeal.algorithm hors valeur fixe ou signature invalide
WHEN
- Validation/verification executee
THEN
- Rejet finalisation ou valid=false
- Cause crypto explicite
TEST-ID: TC-ERR-04
Reference spec: ERR-04, INV-282-04
GIVEN
- verificationMaterial incomplet (champ requis absent)
WHEN
- Finalisation demandee
THEN
- Rejet finalisation
- Aucun artefact probatoire publie
TEST-ID: TC-ERR-05
Reference spec: ERR-05, CA-05
GIVEN
- Timeout OCSP atteint selon valeur contractuelle
WHEN
- Finalisation lancee
THEN
- Autorisee uniquement si validationPolicy=OCSP_UNAVAILABLE et ocspResponses=[]
- Sinon rejet explicite
TEST-ID: TC-ERR-06
Reference spec: ERR-06, INV-282-12, CA-12
GIVEN
- Une valeur violant regex/longueur/casse contractuelle
WHEN
- Finalisation demandee
THEN
- Rejet explicite de finalisation
- Aucun scellement produit
TEST-ID: TC-ERR-07
Reference spec: ERR-07, INV-282-08
GIVEN
- Enveloppe SEALED persistee
WHEN
- Mutation post-scellement tentee
THEN
- Refus strict
- Absence d'effets secondaires persistes
TEST-ID: TC-ERR-08
Reference spec: ERR-08
GIVEN
- Chaine cert incomplete/non ancrable trust-store
WHEN
- Verification tierce Mode A et Mode B executee
THEN
- Echec de verification dans les deux modes
- Motif "chaine non verifiable" explicite
5. Tests d'invariants (non negociables)
| Invariant | Test(s) dedies | Observable | Commentaire |
| INV-282-01 | TC-NOM-01, TC-ERR-01, TC-ERR-03 | envelopeSeal present + verify | Obligatoire sur toute finalisation |
| INV-282-02 | TC-NOM-01, TC-ERR-02 | Succes nominal / echec JCS | Exclusion de champ auto-referent |
| INV-282-03 | TC-NOM-02 | valid=false apres mutation 1 octet | Integrite E2E |
| INV-282-04 | TC-NOM-03, TC-NOM-04, TC-ERR-04 | Verification Mode A possible | Hors ancrage blockchain |
| INV-282-05 | TC-NOM-03, TC-NOM-04, TC-NEG-05 | Enum policy strict | Pas d'ambiguite probatoire |
| INV-282-06 | TC-INV-06 | Rejet si pattern secret detecte | Controle heuristique base patterns interdits |
| INV-282-07 | TC-INV-07 | Artefacts temporaires chiffres au repos | Verification stockage/config crypto |
| INV-282-08 | TC-NOM-05, TC-ERR-07 | UPDATE/DELETE refuses | Immutabilite persistee |
| INV-282-09 | TC-INV-09 | SEALED -> * tous refuses | Terminalite globale |
| INV-282-10 | TC-INV-10 | SEALED -> UNSEALED refuse | Pas de downgrade |
| INV-282-11 | TC-NOM-07 | Verification historique OK | Resilience rotation cles |
| INV-282-12 | TC-ERR-06 + TC-NEG-* | Rejet explicite hors contrat | Formats/tailles/casse |
TEST-ID: TC-INV-06
Reference spec: INV-282-06, CA-06
GIVEN
- Une enveloppe candidate contenant au moins un champ/valeur matchant un pattern interdit
- Liste de patterns interdits active: privateKey, secretKey, sessionToken, hmacSecret, dek
WHEN
- Le controle heuristique anti-secrets est execute avant finalisation
THEN
- La finalisation est rejetee
- Le motif indique une detection de pattern interdit
TEST-ID: TC-INV-07
Reference spec: INV-282-07, §5.4
GIVEN
- Le flux PD-282 manipule des artefacts crypto temporaires uniquement en memoire (ex: canonicalJson, hash SHA3-384 Buffer) et la signature ECDSA est realisee dans le HSM
WHEN
- Un audit statique du code et des assertions de tests service verifient les chemins d'E/S (DB, disque local, blobs, fichiers temporaires)
THEN
- Aucun artefact crypto temporaire n'est persiste au repos
AND
- Aucune ecriture en clair d'artefact crypto n'est detectee en base, sur disque, ni en blob
AND
- Les tests confirment l'absence d'API/chemin de persistance pour ces artefacts temporaires
TEST-ID: TC-INV-09
Reference spec: INV-282-09, CA-11, §5.4, PD-272
GIVEN
- Une enveloppe deja persistee en base a l'etat SEALED
WHEN
- Des operations de mutation DB sont tentees sur cette ligne (UPDATE, DELETE)
THEN
- Le trigger PD-272 rejette toutes les mutations (SEALED terminal en base)
AND
- Le service n'expose aucun flux/metier permettant une transition SEALED -> * via modification de l'enveloppe existante
TEST-ID: TC-INV-10
Reference spec: INV-282-10, CA-11, §5.4, PD-272
GIVEN
- Une enveloppe persistee en SEALED et une API/service applicatif de gestion d'enveloppe
WHEN
- Une demande explicite de retour SEALED -> UNSEALED est formulee
THEN
- Le service ne fournit aucune methode de descellement (absence d'operation unseal)
AND
- Toute tentative de contournement par mutation DB est bloquee par PD-272 (UPDATE/DELETE refuses)
6. Tests de non-regression
| Test ID | Objet | Observable | Commentaire |
| TC-NR-01 | Compatibilite PD-272 immutabilite trigger | Aucun relachement des refus mutation | Non-regression critique |
| TC-NR-02 | Compatibilite PD-280 modele d'etats | Transitions autorisees/interdites inchangees | Alignement etats globaux |
| TC-NR-03 | Verification enveloppes pre-rotation | Anciennes enveloppes restent verifiables | Perennite preuves |
| TC-NR-04 | Contrat API de rejet explicite | Rejet explicite stable (sans assert sur un code exact) | Regression client evitee |
| TC-NR-05 | Overhead enveloppe P95 <= borne | Mesure perf/taille conforme au contrat | Requiert env de reference defini |
7. Tests negatifs et adversariaux
| Test ID | Entree invalide / abus | Resultat attendu | Observable |
| TC-NEG-01 | algorithm different de ECDSA-P384-SHA3-384 | Rejet finalisation | Erreur format/contrat |
| TC-NEG-02 | signature base64url avec = ou taille hors [80,200] | Rejet finalisation | Motif regex/longueur |
| TC-NEG-03 | kid hors regex ou longueur hors bornes | Rejet finalisation | Motif kid invalide |
| TC-NEG-04 | Timestamp non RFC3339 ms UTC (+01:00, pas de ms, etc.) | Rejet finalisation | Motif date invalide |
| TC-NEG-05 | validationPolicy hors enum | Rejet finalisation | Enum stricte |
| TC-NEG-06 | ocspResponses absent | Rejet finalisation | Presence requise |
| TC-NEG-07 | ocspResponses > 20 elements | Rejet finalisation | Borne max appliquee |
| TC-NEG-08 | Injection champs potentiellement secrets (privateKey, secretKey, sessionToken, hmacSecret, dek) | Rejet strict de l'enveloppe | Aucun export final de l'enveloppe rejetee |
| TC-NEG-09 | Tentative de substitution inter-enveloppes (copie envelopeSeal) | Verification invalide | Echec d'integrite |
| TC-NEG-10 | Cert chain malformee base64-DER | Rejet ou echec verify | Motif chaine invalide |
8. Observabilite requise pour les tests
- Etat systeme : etat metier transitoire UNSEALED observable uniquement dans les logs/traces service en memoire ; en base de donnees, seul l'etat SEALED est observable (avec horodatages, identifiant enveloppe, version).
- Reponse API : statut, message explicite, indicateur
valid si applicable. - Journal technique : trace d'echec crypto/format disponible pour diagnostic.
- Evenement signe / horodate : presence
signedAt, validationTimestamp, correlation avec kid. - Export probatoire : JSON envelope complet canonicalisable +
verificationMaterial embarque.
9. Regles non testables
| Regle | Raison | Impact |
| Borne perf P95 (latence scellement, overhead) sans environnement de reference (Q-02) | Mesure non objectivable sans hote/profil charge contractuel | Majeur |
| Recevabilite juridique eIDAS des sources cert/OCSP (H-04) | Necessite expertise legale/reglementaire externe au test technique | Majeur |
| Exhaustivite trust-store verificateur tiers (H-01, Q-05) | Depend d'un referentiel externe non fixe dans la specification | Majeur |
10. Verdict QA
- ⚠️ Testable partiellement (avec reserves listees)
Couverture fonctionnelle/crypto/etats/erreurs est complete et automatisable.
Reserve principale : metriques P95 et recevabilite juridique ne sont pas demontrables objectivement sans cadrage externe explicite.