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.