Aller au contenu

PD-265 — Scénarios de tests contractuels (TESTS CORRIGÉS COMPLETS)

1. Références

  • Spécification : PD-265-specification.md
  • Epic : EPIC-XX (référence non renseignée dans la spécification)

2. Matrice de couverture

ID Invariant ID Critère ID Test Couverture Commentaire
INV-265-01 CA-03 TC-NOM-01 Oui NTS en échec/offset > seuil => flag NTS + état dégradé + blocage émission TST
INV-265-01 CA-02 TC-ERR-01 Oui Monitoring NTS en timeout + état/flags dégradés + alerte critique immédiate
INV-265-02 CA-02 TC-ERR-02 Oui OCSP REVOKED => flag REVOCATION + état dégradé
INV-265-02 CA-02 TC-ERR-03 Oui CRL LISTED / OCSP UNKNOWN / fraîcheur dépassée => flag REVOCATION
INV-265-03 CA-04 TC-NOM-04 Oui Label prod conforme + rotation observable
INV-265-03 CA-07 TC-ERR-08 Oui Label non conforme rejeté en CI
INV-265-04 CA-07 TC-ERR-08 Oui Pipeline KO sur non-conformité label
INV-265-05 CA-04 TC-ERR-05 Oui Âge clé > keyRotationPeriod => flag KEY_LIFECYCLE + état dégradé + alerte overdue
INV-265-06 CA-05 TC-NOM-05 Oui TST éligible re-horodaté avec lien supersedesTstId
INV-265-06 CA-05 TC-ERR-10 Oui TST éligible non traité dans rehorodatageProcessingDeadline => alerte critique
INV-265-07 CA-06 TC-NOM-06 Oui Autorité présente TL ETSI valide
INV-265-07 CA-06 TC-ERR-04 Oui TTL dépassé + refresh KO => flag TRUSTLIST + état dégradé
INV-265-08 CA-09 TC-ERR-09 Oui Aucun secret crypto temporaire en clair au repos
INV-265-09 CA-05 TC-ERR-11 Oui Crash post-commit, rattrapage idempotent sans duplication
INV-265-10 CA-10 TC-NOM-07 Oui Roundtrip sign+verify obligatoire en CI
INV-265-11 CA-02 TC-ERR-12 Oui Transition/commande d’état non autorisée refusée (ex: set direct de tsaServiceState)
INV-265-12 CA-08 TC-ERR-06 Oui Config hors bornes rejetée
INV-265-12 CA-08 TC-ERR-07 Oui Formats invalides rejetés sans hypothèse implicite
INV-265-13 CA-01 TC-NOM-08 Oui Rapport d’audit signé sur payload JCS (RFC 8785) + signatureKeyId présent
INV-265-14 CA-12 TC-NEG-09 Oui Toggle MAINTENANCE refusé sans rôle + journalisé
CA-01 TC-NOM-08 Oui Audit Prolog completeness >= ⅚ OK
TC-NOM-09 Oui Entrée en MAINTENANCE nominale + blocage TST + motif normé
TC-NOM-10 Oui Sortie MAINTENANCE nominale vers HEALTHY/DEGRADED selon flags
TC-CROSS-01 Oui Contrainte croisée maxDegradedDuration >= 3 * ntsCheckInterval rejet si violée
TC-CROSS-02 Oui Contrainte croisée rehorodatageProcessingDeadline < rehorodatageLeadTime*24 rejet si violée
TC-NOM-CLEAR-TRUSTLIST Oui Clearing TRUSTLIST : retour HEALTHY uniquement si TL valide + autorité présente
TC-NOM-CLEAR-KEY-LIFECYCLE Oui Clearing KEY_LIFECYCLE : retour HEALTHY après rotation valide + retrait ancienne active
TC-ERR-15 Oui Tentative de réactivation clé depuis RETIRED/ARCHIVED/DESTROYED refusée + audit event
TC-NOM-11 Oui NTS reference servers: min 2, mesure s’appuie sur liste autorisée
TC-NOM-12 Oui Nomenclature métriques: préfixe tsa_ + minimum présent

3. Scénarios de test – Flux nominaux

TEST-ID: TC-NOM-01
Référence spec: INV-265-01, CA-03, §5.4 refus API
<!-- CORRIGÉ-V3: DIV-02 -->

GIVEN
  - Service TSA en état HEALTHY
  - ntsAlertThreshold=100ms
WHEN
  - Une mesure NTS valide retourne ntsOffsetMs=150
THEN
  - tsaServiceDegradationFlags contient NTS
  - tsaServiceState devient DEGRADED_NTS (ou DEGRADED si d’autres flags sont actifs)  <!-- CORRIGÉ: ECT-01 -->
AND
  - Toute demande d’émission de nouveau TST est refusée (fail-closed)
  - Le refus expose refusalReasonCode="NTS_DEGRADED" et inclut tsaServiceState + tsaServiceDegradationFlags
  - Un événement d’état horodaté est tracé
TEST-ID: TC-NOM-02
Référence spec: §5.4 transitions retour (clearing NTS)

GIVEN
  - Service TSA en état DEGRADED_NTS
  - tsaServiceDegradationFlags contient NTS
WHEN
  - Deux contrôles NTS consécutifs retournent un offset <= ntsAlertThreshold
THEN
  - tsaServiceDegradationFlags ne contient plus NTS
  - tsaServiceState redevient HEALTHY
AND
  - L’émission de TST est réouverte
  - Les historiques d’état antérieurs restent consultables
TEST-ID: TC-NOM-03
Référence spec: INV-265-02, CA-02, §5.3/§5.4 fraîcheur

GIVEN
  - Certificat TSA actif
  - Service en DEGRADED_REVOCATION
  - ocspMaxAge et crlMaxAge configurés
WHEN
  - OCSP retourne GOOD avec fraîcheur <= ocspMaxAge
  - CRL retourne NOT_LISTED et fraîcheur <= crlMaxAge  <!-- CORRIGÉ: DIV-01 -->
THEN
  - tsaServiceDegradationFlags ne contient plus REVOCATION
  - tsaServiceState redevient HEALTHY
AND
  - Métriques OCSP/CRL mises à jour avec horodatage
TEST-ID: TC-NOM-04
Référence spec: INV-265-03, INV-265-05, CA-04, §5.5 archivage logique

GIVEN
  - Clé TSA active d’âge <= keyRotationPeriod
  - Nouvelle clé candidate avec label pv-tsa-signing-2026
WHEN
  - Une rotation planifiée est exécutée
THEN
  - La nouvelle clé devient active
AND
  - L’ancienne clé passe en archivage logique (ACTIVE -> RETIRED -> ARCHIVED selon procédure)  <!-- CORRIGÉ: AMB-04 -->
  - Les métriques âge clé / prochaine rotation sont publiées
TEST-ID: TC-NOM-05
Référence spec: INV-265-06, CA-05

GIVEN
  - Un TST existant avec certificat émetteur expirant dans <= rehorodatageLeadTime
WHEN
  - Le batch de re-horodatage est exécuté
THEN
  - Un nouveau TST est créé
AND
  - supersedesTstId du nouveau TST référence le TST d’origine
  - La traçabilité de la chaîne ancien->nouveau est vérifiable
TEST-ID: TC-NOM-06
Référence spec: INV-265-07, CA-06

GIVEN
  - Trusted List ETSI valide en cache ou rafraîchie
  - Autorité émettrice TSA présente dans cette Trusted List
WHEN
  - Un contrôle de confiance est exécuté
THEN
  - tsaServiceDegradationFlags ne contient pas TRUSTLIST
  - tsaServiceState est HEALTHY (ou y revient depuis DEGRADED_TRUSTLIST)
AND
  - Les métriques de refresh et de fraîcheur de cache sont exposées
TEST-ID: TC-NOM-07
Référence spec: INV-265-10, CA-10  <!-- CORRIGÉ: DIV-02 -->

GIVEN
  - Pipeline CI sur branche candidate
  - Opérations TSA impactées par la story
WHEN
  - Les tests contractuels sign+verify (roundtrip) sont exécutés
THEN
  - Le roundtrip réussit pour chaque opération couverte
AND
  - Le pipeline CI reste vert sur ce contrôle
TEST-ID: TC-NOM-08
Référence spec: CA-01, §5.9 règles de signature (RFC 8785 JCS), auditSignatureKeyId
<!-- CORRIGÉ-V3: R-02/R-07 -->

GIVEN
  - Build candidate avec contrôles PD-265 actifs
WHEN
  - L’audit Prolog completeness RFC 3161 est lancé
THEN
  - Le rapport signé affiche un score >= 5/6 OK
AND
  - Le rapport contient signatureKeyId et une signature vérifiable sur payload canonicalisé RFC 8785 (JCS)
  - Le rapport est archivé comme preuve d’audit
TEST-ID: TC-NOM-09
Référence spec: §5.4 MAINTENANCE (RBAC + refus), CA-12
<!-- CORRIGÉ-V3: R-12/DIV-02 -->

GIVEN
  - Service TSA en état HEALTHY
  - Un opérateur authentifié avec rôle TSA_OPERATOR
WHEN
  - L’exploitation active maintenanceMode=true (action manuelle)
THEN
  - tsaServiceState devient MAINTENANCE
AND
  - Toute demande d’émission de nouveau TST est refusée avec motif normé refusalReasonCode="MAINTENANCE"  <!-- CORRIGÉ: MIN-01/AMB-01 -->
  - Le refus inclut tsaServiceState + tsaServiceDegradationFlags
  - Les contrôles (NTS/OCSP/CRL/TL) peuvent continuer à mettre à jour les flags sans sortir de MAINTENANCE
TEST-ID: TC-NOM-10
Référence spec: §5.4 sortie MAINTENANCE, ECT-01

GIVEN
  - Service TSA en MAINTENANCE
  - tsaServiceDegradationFlags contient NTS et REVOCATION (ex: incidents survenus pendant maintenance)  <!-- CORRIGÉ: ECT-01 -->
  - Un opérateur authentifié avec rôle TSA_OPERATOR
WHEN
  - L’exploitation désactive maintenanceMode=false (action manuelle)
THEN
  - tsaServiceState devient DEGRADED (composite)
AND
  - L’émission de TST reste refusée tant que les flags ne sont pas cleared
TEST-ID: TC-NOM-11
Référence spec: §5.2 ntsReferenceServers (MIN 2), monitoring NTS
<!-- CORRIGÉ-V3: R-15/16 -->

GIVEN
  - Configuration avec ntsReferenceServers contenant exactement 2 entrées autorisées
WHEN
  - Le monitoring NTS s’exécute
THEN
  - Les mesures NTS sont effectuées uniquement contre les serveurs de ntsReferenceServers
AND
  - L’absence ou la présence d’un seul serveur dans la config est rejetée (voir TC-ERR-16)
TEST-ID: TC-NOM-12
Référence spec: §5.9 nomenclature métriques `tsa_*`
<!-- CORRIGÉ-V3: R-15/16 -->

GIVEN
  - Service PD-265 actif en environnement de test
WHEN
  - Les métriques sont exposées
THEN
  - Toutes les métriques spécifiques à cette story respectent le préfixe tsa_
AND
  - Au minimum, les métriques contractuelles (state, flags, nts_offset, ocsp_age, crl_age, tl_cache_age, active_key_age, backlog, degraded_duration_seconds) sont présentes
TEST-ID: TC-NOM-CLEAR-TRUSTLIST
Référence spec: §5.4 règles de clearing TRUSTLIST
<!-- CORRIGÉ-V3: R-08 -->

GIVEN
  - Service en DEGRADED_TRUSTLIST
  - tsaServiceDegradationFlags contient TRUSTLIST
WHEN
  - Une Trusted List ETSI valide est rafraîchie et l’autorité émettrice TSA est confirmée présente
THEN
  - tsaServiceDegradationFlags ne contient plus TRUSTLIST
  - tsaServiceState redevient HEALTHY (si aucun autre flag actif)
AND
  - Un événement PV_TSA_STATE_TRANSITION est journalisé
TEST-ID: TC-NOM-CLEAR-KEY-LIFECYCLE
Référence spec: §5.4 règles de clearing KEY_LIFECYCLE
<!-- CORRIGÉ-V3: R-08 -->

GIVEN
  - Service en DEGRADED_KEY_LIFECYCLE
  - tsaServiceDegradationFlags contient KEY_LIFECYCLE
WHEN
  - Une rotation valide est réalisée (nouvelle clé conforme active) et l’ancienne n’est plus "active"
THEN
  - tsaServiceDegradationFlags ne contient plus KEY_LIFECYCLE
  - tsaServiceState redevient HEALTHY (si aucun autre flag actif)
AND
  - Un événement PV_TSA_STATE_TRANSITION est journalisé
TEST-ID: TC-CROSS-01
Référence spec: §5.2 contrainte croisée maxDegradedDuration vs ntsCheckInterval
<!-- CORRIGÉ-V3: R-03 -->

GIVEN
  - Configuration avec ntsCheckInterval=60s
WHEN
  - maxDegradedDuration est configuré à 100s (donc < 3*60=180)
THEN
  - Le chargement de configuration est rejeté explicitement
AND
  - Le motif mentionne la contrainte "maxDegradedDuration >= 3 × ntsCheckInterval"
TEST-ID: TC-CROSS-02
Référence spec: §5.2 contrainte croisée rehorodatageProcessingDeadline vs rehorodatageLeadTime
<!-- CORRIGÉ-V3: R-03 -->

GIVEN
  - Configuration avec rehorodatageLeadTime=1 jour (24h)
WHEN
  - rehorodatageProcessingDeadline est configuré à 24h (donc pas strictement < 24h)
THEN
  - Le chargement de configuration est rejeté explicitement
AND
  - Le motif mentionne la contrainte "rehorodatageProcessingDeadline < rehorodatageLeadTime × 24"

4. Scénarios de test – Cas d’erreur

TEST-ID: TC-ERR-01
Référence spec: INV-265-01, CA-02, CA-03, §5.9 alertes critiques, §6 cas d'erreur NTS
<!-- CORRIGÉ-V3: R-01 -->

GIVEN
  - Service en HEALTHY
WHEN
  - La sonde NTS échoue (timeout ou source invalide)
THEN
  - tsaServiceDegradationFlags contient NTS
  - tsaServiceState devient DEGRADED_NTS (ou DEGRADED si composite)
  - Émission de TST refusée
  - Alerte critique immédiate émise sous forme d’événement d’audit signé et horodaté  <!-- CORRIGÉ: DIV-04/MIN-02 -->
  - Aucune émission TST partielle ne doit être observée
TEST-ID: TC-ERR-02
Référence spec: INV-265-02, CA-02, §5.9

GIVEN
  - Certificat TSA actif
WHEN
  - OCSP retourne REVOKED
THEN
  - tsaServiceDegradationFlags contient REVOCATION
  - tsaServiceState devient DEGRADED_REVOCATION (ou DEGRADED si composite)  <!-- CORRIGÉ: ECT-01 -->
  - Alerte critique est émise (événement signé/horodaté)
  - Émission TST interdite
TEST-ID: TC-ERR-03
Référence spec: INV-265-02, CA-02, §5.3/§5.4 fraîcheur  <!-- CORRIGÉ: DIV-01 -->

GIVEN
  - Certificat TSA actif
WHEN
  - CRL retourne LISTED ou OCSP retourne UNKNOWN ou la fraîcheur OCSP/CRL dépasse ocspMaxAge/crlMaxAge
THEN
  - tsaServiceDegradationFlags contient REVOCATION
  - tsaServiceState devient DEGRADED_REVOCATION (ou DEGRADED si composite)
  - Les métriques de révocation reflètent le statut dégradé
  - Aucun TST nouveau n’est émis
TEST-ID: TC-ERR-04
Référence spec: INV-265-07, CA-06

GIVEN
  - Trusted List en cache expiré
WHEN
  - Le refresh échoue au-delà de trustedListCacheTtl
THEN
  - tsaServiceDegradationFlags contient TRUSTLIST
  - tsaServiceState devient DEGRADED_TRUSTLIST (ou DEGRADED si composite)  <!-- CORRIGÉ: ECT-01 -->
  - Alerte de conformité est exposée
  - Le statut trustlist est explicitement non valide
TEST-ID: TC-ERR-05
Référence spec: INV-265-05, CA-04, §5.9 canaux (KEY_OVERDUE)
<!-- CORRIGÉ-V3: DIV-04 -->

GIVEN
  - Clé TSA active avec âge > keyRotationPeriod
WHEN
  - Le contrôle lifecycle s’exécute
THEN
  - tsaServiceDegradationFlags contient KEY_LIFECYCLE
  - tsaServiceState devient DEGRADED_KEY_LIFECYCLE (ou DEGRADED si composite)  <!-- CORRIGÉ: ECT-01 -->
  - Une alerte critique "KEY_OVERDUE" est émise sur les canaux contractuels (métriques + événement signé/horodaté)
TEST-ID: TC-ERR-06
Référence spec: INV-265-12, CA-08

GIVEN
  - Configuration avec ntsCheckTimeout=20000ms
WHEN
  - Le chargement de configuration est demandé
THEN
  - La configuration est rejetée explicitement
  - Le motif de rejet inclut le paramètre et la borne max contractuelle
TEST-ID: TC-ERR-07
Référence spec: INV-265-12, §5.1 formats, CA-08

GIVEN
  - Entrées invalides (ex: ocspStatus="good", tstId non UUIDv4, certificateFingerprintSha256 longueur !=64)
WHEN
  - La validation de données est exécutée
THEN
  - Chaque entrée invalide est rejetée
  - Aucun enregistrement partiel n’est persistant
TEST-ID: TC-ERR-08
Référence spec: INV-265-03, INV-265-04, CA-07

GIVEN
  - Label HSM non conforme (ex: tsa-signing-2026)
WHEN
  - La validation CI de conformité labels est exécutée
THEN
  - Le pipeline échoue
  - La non-conformité est tracée dans le rapport CI
TEST-ID: TC-ERR-09
Référence spec: INV-265-08, CA-09

GIVEN
  - Artefacts cryptographiques temporaires persistés
WHEN
  - Un contrôle de conformité au repos est lancé
THEN
  - Aucun secret (clé/DEK/ReKey/fragment) en clair n’est détecté
  - Toute non-conformité déclenche un échec de contrôle
TEST-ID: TC-ERR-10
Référence spec: INV-265-06, §5.3/§5.4, CA-05

GIVEN
  - TST éligibles détectés dans la fenêtre rehorodatageLeadTime
  - rehorodatageProcessingDeadline configuré (ex: 24h)  <!-- CORRIGÉ: AMB-02 -->
WHEN
  - Le délai contractuel de traitement (rehorodatageProcessingDeadline) est dépassé sans re-horodatage
THEN
  - Alerte critique de conformité est émise (événement d’audit signé/horodaté)
  - Les TST en retard sont listés nominativement dans l’export probatoire
TEST-ID: TC-ERR-11
Référence spec: INV-265-09, §5.6 atomicité, CA-05

GIVEN
  - Transaction DB commitée pour un traitement asynchrone
WHEN
  - Un crash survient avant émission complète des événements async
THEN
  - L’état DB reste cohérent
  - Le mécanisme de rattrapage rejoue sans duplication logique
  - L’intégrité métier (ex: un seul lien supersedesTstId attendu) est conservée
TEST-ID: TC-ERR-12
Référence spec: INV-265-11, §5.4 transitions exhaustives  <!-- CORRIGÉ: ECT-01 -->

GIVEN
  - Service en DEGRADED (ou DEGRADED_NTS) avec tsaServiceDegradationFlags contenant NTS
WHEN
  - Une commande tente de forcer directement tsaServiceState="HEALTHY" sans clearing effectif du flag (ou tente d’écrire un état non dérivé en contournant les flags)
THEN
  - La commande est refusée explicitement
  - L’état/flags restent inchangés
  - Le refus est journalisé avec motif "transition interdite"
TEST-ID: TC-ERR-13
Référence spec: §5.4 modèle composite, ECT-01

GIVEN
  - Service en HEALTHY
WHEN
  - NTS échoue (timeout) ET OCSP retourne UNKNOWN dans la même fenêtre de surveillance
THEN
  - tsaServiceDegradationFlags contient NTS et REVOCATION
  - tsaServiceState devient DEGRADED (composite)
AND
  - L’émission de TST est refusée
TEST-ID: TC-ERR-14
Référence spec: §5.4 maxDegradedDuration scope/action, §5.9 canaux  <!-- CORRIGÉ: AMB-05/MIN-02 -->

GIVEN
  - Service avec tsaServiceDegradationFlags contenant TRUSTLIST depuis plus de maxDegradedDuration (durée continue par flag)
WHEN
  - Le contrôleur d’escalade évalue la durée de dégradation
THEN
  - Une alerte CRITICAL est émise
AND
  - Un événement d’audit PV_TSA_CRITICAL_ALERT signé/horodaté est produit
  - Une alerte métrique est exposée (consommable par Prometheus/alerting)
  - La notification exploitation (on-call) est déclenchée via le canal contractuel
TEST-ID: TC-ERR-15
Référence spec: §5.5 cycle de vie clés (réactivation interdite), §6 cas d'erreur
<!-- CORRIGÉ-V3: R-04 -->

GIVEN
  - Une clé TSA en statut RETIRED (ou ARCHIVED, ou DESTROYED)
WHEN
  - Une commande/opération tente de la repasser en ACTIVE (réactivation)
THEN
  - L’opération échoue explicitement (aucun changement de statut)
AND
  - Un événement d’audit est produit (tentative de réactivation interdite)
TEST-ID: TC-ERR-16
Référence spec: §5.2 ntsReferenceServers (MIN 2)
<!-- CORRIGÉ-V3: R-15/16 -->

GIVEN
  - Configuration avec ntsReferenceServers contenant 0 ou 1 entrée
WHEN
  - Le chargement de configuration est demandé
THEN
  - La configuration est rejetée explicitement
AND
  - Le motif indique "ntsReferenceServers MIN 2"

5. Tests d’invariants (non négociables)

Invariant Test(s) dédiés Observable Commentaire
INV-265-01 TC-NOM-01, TC-ERR-01 tsaServiceState, tsaServiceDegradationFlags, refus émission TST Fail-closed NTS vérifié en nominal et incident
INV-265-02 TC-NOM-03, TC-ERR-02, TC-ERR-03 Statuts OCSP/CRL + fraîcheur, flags, état dégradé Couvre GOOD et non-GOOD + fraîcheur
INV-265-03 TC-NOM-04, TC-ERR-08 Validation regex labels Séparation prod/test vérifiable
INV-265-04 TC-ERR-08 Résultat pipeline CI Échec obligatoire sur non-conformité
INV-265-05 TC-NOM-04, TC-ERR-05, TC-NOM-CLEAR-KEY-LIFECYCLE Âge clé, flag lifecycle Contrôle seuil + dépassement + clearing
INV-265-06 TC-NOM-05, TC-ERR-10 tstId/supersedesTstId, alertes Éligibilité + deadline de traitement
INV-265-07 TC-NOM-06, TC-ERR-04, TC-NOM-CLEAR-TRUSTLIST Validation TL ETSI, flag trustlist Présence autorité + TTL + clearing
INV-265-08 TC-ERR-09 Résultat scan conformité stockage Secret at-rest jamais en clair
INV-265-09 TC-ERR-11 Cohérence DB + replay idempotent Crash post-commit couvert
INV-265-10 TC-NOM-07 Rapport CI roundtrip Contrôle contractuel obligatoire
INV-265-11 TC-NOM-02, TC-ERR-12 Journal transitions + refus Exhaustivité et interdictions (pas de set direct d’état)
INV-265-12 TC-ERR-06, TC-ERR-07, TC-CROSS-01, TC-CROSS-02 Erreurs validation format/config Zéro hypothèse implicite + contraintes croisées
INV-265-13 TC-NOM-08 Signature + signatureKeyId + JCS Canonicalisation RFC 8785 systématique
INV-265-14 TC-NEG-09 Refus RBAC + audit event Empêche toggle MAINTENANCE non autorisé

6. Tests de non-régression

Test ID Objet Observable Commentaire
TC-NR-01 Non-régression fail-closed NTS Blocage TST en DEGRADED_NTS Vérifie maintien d’un garde-fou critique
TC-NR-02 Non-régression révocation DEGRADED_REVOCATION sur REVOKED/LISTED/STALE Empêche régression conformité RFC 3161
TC-NR-03 Non-régression machine d’états Refus des transitions interdites (ex: set direct d’état) Verrouille les ambiguïtés futures
TC-NR-04 Non-régression roundtrip cryptographique CI sign+verify passe Couvre learning PD-282
TC-NR-05 Non-régression idempotence async Pas de duplication logique après replay Robustesse incident
TC-NR-06 Non-régression confidentialité at-rest Zéro secret temporaire en clair Invariant crypto structurel
TC-NR-07 Non-régression motifs de refus API refusalReasonCode normé pour chaque état bloquant Contrat refus API stable
TC-NR-08 Non-régression RBAC MAINTENANCE Refus sans rôle + journalisation Anti-DoS interne
TC-NR-09 Non-régression canonicalisation JCS Signatures audit déterministes Learning PD-40

7. Tests négatifs et adversariaux

Test ID Entrée invalide / abus Résultat attendu Observable
TC-NEG-01 certificateSerialHex avec caractère non hex (zz) Rejet validation Erreur explicite de format
TC-NEG-02 ocspStatus=good (mauvaise casse) Rejet Enum strict case-sensitive
TC-NEG-03 hsmKeyLabel prod = pv-tsa-signing-26 Rejet + alerte Non-conformité regex
TC-NEG-04 tstId non UUIDv4 Rejet Motif "UUIDv4 requis"
TC-NEG-05 rehorodatageBatchSize runtime > 10000 Rejet explicite (pas de clamp) Erreur "hors bornes" traçable
TC-NEG-06 trustedListDigestSha256 longueur 63 Rejet Validation longueur/hash
TC-NEG-07 Tentative de sortie de MAINTENANCE sans action manuelle (auto) Refus / pas de changement d’état Journal "interdite"
TC-NEG-08 Injection d’un secret temporaire en clair en base Contrôle conformité KO Échec test CA-09
TC-NEG-09 Activation/désactivation MAINTENANCE par un utilisateur sans rôle TSA_OPERATOR Refus explicite + événement audit denied Trace RBAC + absence de changement d’état

8. Observabilité requise pour les tests

  • État système : valeur courante tsaServiceState, tsaServiceDegradationFlags, historique de transitions, timestamp source.
  • Réponse API : codes de refus d’émission TST en mode dégradé/maintenance + motif normé (refusalReasonCode) + tsaServiceState/tsaServiceDegradationFlags.
  • Journal d’audit : événements de contrôle NTS/OCSP/CRL/TL, rotation clé, re-horodatage, refus de transition, transitions d’état (PV_TSA_STATE_TRANSITION), refus RBAC MAINTENANCE.
  • Événement signé / horodaté : alertes critiques uniquement (revocation, trustlist TTL dépassé, NTS KO, re-horodatage en retard, maxDegradedDuration, KEY_OVERDUE) selon §5.9.
  • Export probatoire : rapport CI, rapport audit Prolog, preuve de chiffrement at-rest, liste des TST traités/en retard.
  • Métriques minimales : fraîcheur OCSP/CRL, offset NTS, âge clé active, compteur TST re-horodatés, état trustlist cache/refresh, durée continue par flag (pour maxDegradedDuration).
  • Convention métriques : préfixe tsa_* (contrat).

9. Règles non testables

Règle Raison Impact
Référence épique exacte Valeur absente dans le document d’entrée Mineur
Liste normative des serveurs NTS de référence Désormais contractualisée via ntsReferenceServers (MIN 2) N/A
Politique détaillée d’exceptions en mode dégradé Spécification mentionne fail-closed mais laisse une ambiguïté côté exceptions Majeur
Nomenclature exacte des métriques (nom/labels/cardinalité) Désormais contractualisée (préfixe tsa_* + minimum) N/A
NTP fallback Clarifié comme hors périmètre et non utilisé pour HEALTHY (résolu) N/A
Format/canal alertes critiques Désormais défini contractuellement (§5.9) (résolu) N/A

10. Verdict QA

  • ⚠️ Testable partiellement (avec réserves listées)

La conformité est majoritairement testable et automatisable sur les invariants et critères d’acceptation, mais la fermeture contractuelle complète exige la levée des ambiguïtés listées en section 9.