PD-264 — Scénarios de test de référence¶
Préambule (périmètre de test)¶
- Environnement de référence :
- CI rapide avec TSA mock RFC 3161 déterministe (fixtures figées).
- Nightly avec TSA qualifiée réelle + archivage probatoire.
- Préconditions communes :
- Base de données initialisée avec schéma
timestamp_tokenset contrainte d'unicité surnonce. - Journal append-only et pipeline Merkle actifs.
- Outils disponibles :
openssl, suite Prolog RFC 3161. - Convention :
nonce_A= valeur binaire fixe de 16 octets (hex fixture).nonce_B= autre valeur binaire fixe de 16 octets.- Toute vérification est réalisée sans hypothèse implicite, sur artefacts horodatés et traçables.
1) Matrice de couverture INV/CA -> TC¶
| Exigence | Test(s) de couverture |
|---|---|
| INV-264-01 | TC-264-01, TC-264-08 |
| INV-264-02 | TC-264-02, TC-264-04 |
| INV-264-03 | TC-264-03, TC-264-04 |
| INV-264-04 | TC-264-07 |
| INV-264-05 | TC-264-05, TC-264-06 |
| INV-264-06 | TC-264-02, TC-264-03, TC-264-05 |
| INV-264-07 | TC-264-02, TC-264-03, TC-264-05 |
| INV-264-08 | TC-264-09 |
| INV-264-09 | TC-264-04, TC-264-14 |
| INV-264-10 | TC-264-14 |
| INV-264-11 | TC-264-04, TC-264-05 |
| INV-264-envelope-encryption | TC-264-18 |
| INV-264-12 | TC-264-11 |
| INV-264-13 | TC-264-19 | | CA-264-01 | TC-264-01 | | CA-264-02 | TC-264-02 | | CA-264-03 | TC-264-03 | | CA-264-04 | TC-264-04 | | CA-264-05 | TC-264-05, TC-264-06 | | CA-264-06 | TC-264-02, TC-264-03, TC-264-05, TC-264-19 | | CA-264-07 | TC-264-02, TC-264-03, TC-264-05, TC-264-13, TC-264-19 | | CA-264-08 | TC-264-04 | | CA-264-09 | TC-264-14 | | CA-264-10 | TC-264-15 | | CA-264-11 | TC-264-16 | | CA-264-12 | TC-264-17 |
2) Scénarios de test de référence¶
TC-264-01 — Requête sans nonce refusée¶
- Prérequis : requête RFC 3161 sans champ nonce.
- Action : soumettre la requête au flux probatoire (point d'entrée de l'automate).
- Résultat attendu : refus explicite (fail-closed) ; état
REQUEST_EMITTEDnon atteint ; aucun effet persistant ; confirmation que la requête n'entre pas dans le cycle d'états (garde d'entrée). - Couvre : INV-264-01, CA-264-01.
TC-264-02 — Réponse TSA sans nonce rejetée¶
- Prérequis : requête valide émise avec
nonce_A; réponse mock sans nonce. - Action : injecter la réponse dans la phase validation.
- Résultat attendu : transition
RESPONSE_RECEIVED -> RESPONSE_REJECTED; aucune écriture DB ; aucun append audit/Merkle. - Couvre : INV-264-02, INV-264-06, INV-264-07, CA-264-02, CA-264-06, CA-264-07.
TC-264-03 — Réponse TSA avec nonce mismatch rejetée¶
- Prérequis : requête avec
nonce_A; réponse avecnonce_B. - Action : valider la réponse.
- Résultat attendu : rejet déterministe ; motif mismatch ; aucun effet persistant (DB/audit/Merkle).
- Couvre : INV-264-03, INV-264-06, INV-264-07, CA-264-03, CA-264-06, CA-264-07.
TC-264-04 — Réponse TSA avec nonce identique inédit acceptée¶
- Prérequis : requête avec
nonce_Ainédit ; réponse RFC valide avecnonce_A. - Action : exécuter la validation complète.
- Résultat attendu :
RESPONSE_RECEIVED -> RESPONSE_ACCEPTED -> TOKEN_PERSISTED;noncestocké en BYTEA 16 octets ; token DER structurellement valide. - Couvre : INV-264-02, INV-264-03, INV-264-05, INV-264-09, INV-264-11, CA-264-04, CA-264-08.
TC-264-05 — Rejeu : nonce déjà persisté rejeté (voie métier)¶
- Prérequis : un token déjà accepté avec
nonce_Aexiste. - Action : tenter d'accepter une nouvelle réponse portant
nonce_A. - Résultat attendu : rejet avec motif duplication ; pas de nouvelle ligne
timestamp_tokens; pas d'append audit/Merkle. - Couvre : INV-264-05, INV-264-06, INV-264-07, INV-264-11, CA-264-05, CA-264-06, CA-264-07.
TC-264-06 — Défense en profondeur : collision concurrente et unicité DB¶
- Prérequis : deux validations concurrentes utilisent le même nonce inédit.
- Action : lancer les deux tentatives simultanément.
- Résultat attendu : exactement une acceptation ; l'autre rejetée (unicité effective) ; aucun état incohérent.
- Couvre : INV-264-05, CA-264-05.
TC-264-07 — Vérification usage primitive temps constant + contrôle statistique¶
- Prérequis :
- Implémentation instrumentée pour confirmer l'appel à
crypto.timingSafeEqual(ou primitive équivalente approuvée). - Deux lots de mesures (
equal,mismatch) deN = 100000comparaisons chacun, après warm-up de5000. - Infra stable (même machine, même charge, CPU pinning si disponible).
- Action :
- Vérifier par test unitaire/intégration que la primitive de comparaison en temps constant est utilisée.
- Mesurer les durées des deux lots et exécuter
Welch t-testbilatéral +Mann-Whitney U. - Calculer
Cliff's delta. - Si échec statistique, relancer une seule fois sur infra stable (CPU isolé).
- Résultat attendu :
- Usage de la primitive validé.
p_ttest >= 0.01ETp_mwu >= 0.01ET|Cliff's delta| < 0.147.- En cas de deuxième échec consécutif : verdict ESCALADE et audit obligatoire de fuite temporelle ; test bloquant pour Gate 8 (non bloquant Gate ⅗).
- Conclusion : aucun écart corrélé exploitable détecté dans le protocole défini (si critères atteints).
- Couvre : INV-264-04.
TC-264-08 — Génération nonce par CSPRNG uniquement¶
- Prérequis :
- Génération de nonce activée.
- Accès aux sources applicatives et à une commande d'analyse statique (grep/AST) en CI.
- Action :
- Vérifier statiquement que la génération nonce appelle
crypto.randomBytes(16)(Node.js) ou un équivalent CSPRNG explicitement documenté. - Vérifier statiquement l'absence de
Math.random()dans le chemin de génération. - Exécuter un test d'intégration générant un échantillon (ex.
N >= 10000) et mesurer :- taille exacte de chaque nonce (
16octets) ; - distribution des octets via test du Chi² (uniformité de premier ordre).
- taille exacte de chaque nonce (
- Résultat attendu :
- Observable code : preuve de l'usage CSPRNG (
crypto.randomBytes(16)ou équivalent approuvé) sur le chemin effectif. - Observable runtime : 100% des nonces à 16 octets.
- Observable statistique : test Chi² non rejeté au seuil
alpha = 0.01. - Absence de générateur pseudo-aléatoire non cryptographique.
- Couvre : INV-264-01.
TC-264-09 — Immutabilité post-insertion du nonce¶
- Prérequis : token accepté et persisté avec
nonce_A; accès SQL direct à la base de test. - Action :
- Simuler un vecteur d'attaque de contournement applicatif par accès DB direct.
- Exécuter
UPDATE timestamp_tokens SET nonce = :nonce_B WHERE id = :id_token. - Résultat attendu : modification refusée par le trigger d'immutabilité hérité PD-55 (erreur SQL explicite) ; valeur initiale inchangée ; trace d'échec présente.
- Couvre : INV-264-08.
TC-264-10 — Automate : transitions autorisées uniquement¶
- Prérequis : flux nominal complet.
- Action : exécuter
REQUEST_EMITTED -> RESPONSE_RECEIVED -> RESPONSE_ACCEPTED -> TOKEN_PERSISTED. - Résultat attendu : transitions autorisées acceptées sans transition parasite.
- Couvre : INV-264-06 (ordre de validation avant persistance).
TC-264-11 — Automate : transitions inverses interdites¶
- Prérequis : états atteints en nominal/rejet.
- Action : tenter chaque transition interdite décrite par la spécification :
RESPONSE_ACCEPTED -> RESPONSE_RECEIVEDRESPONSE_REJECTED -> RESPONSE_RECEIVEDTOKEN_PERSISTED -> RESPONSE_ACCEPTEDRESPONSE_ACCEPTED -> RESPONSE_REJECTEDRESPONSE_REJECTED -> RESPONSE_ACCEPTED- Résultat attendu : refus systématique ; aucun rollback d'état ; aucune altération de données.
- Couvre : INV-264-12.
TC-264-12 — Non-régression PD-55 : chemin accepté conserve l'intégration probatoire¶
- Prérequis : réponse conforme acceptée.
- Action : exécuter le flux jusqu'à agrégation Merkle/ancrage.
- Résultat attendu : comportement PD-55 inchangé pour un token valide ; traçabilité complète intacte.
- Couvre : non-régression fonctionnelle.
TC-264-13 — Non-régression PD-55 : chemin rejeté sans effet de bord¶
- Prérequis : réponse rejetée (absence nonce ou mismatch).
- Action : observer pipeline probatoire post-rejet.
- Résultat attendu : aucune entrée append-only, aucune inclusion Merkle, aucun ancrage indu.
- Couvre : INV-264-06, CA-264-07, non-régression fonctionnelle.
TC-264-14 — Interopérabilité : vérification openssl ts -verify¶
- Prérequis : token accepté et artefacts de vérification disponibles.
- Action : lancer
openssl ts -verifysur token accepté. - Résultat attendu : vérification réussie sans erreur ASN.1/DER.
- Couvre : INV-264-09, INV-264-10, CA-264-09.
TC-264-15 — Vérification formelle Prolog à 18/18¶
- Prérequis : règles RFC 3161 chargées ; cas PD-264 intégrés.
- Action : exécuter la suite formelle.
- Résultat attendu : score final 18/18 (aucune règle restante en échec).
- Couvre : CA-264-10.
TC-264-16 — CI rapide déterministe (mock TSA RFC)¶
- Prérequis : pipeline CI ; fixtures mock versionnées.
- Action : exécuter la suite de tests contractuels PD-264.
- Résultat attendu : résultats déterministes/reproductibles ; mêmes verdicts à exécution répétée.
- Couvre : CA-264-11.
TC-264-17 — Nightly TSA qualifiée réelle + archivage probatoire¶
- Prérequis : job nightly ; accès TSA qualifiée.
- Action : exécuter la vérification réelle puis archiver le token.
- Résultat attendu : token vérifié et archivé avec métadonnées probatoires horodatées.
- Couvre : CA-264-12.
TC-264-18 — Vérification de non-applicabilité envelope-encryption (PD-264)¶
- Prérequis : exécution d'un flux complet PD-264 (accepté et rejeté) avec traçabilité applicative activée.
- Action : auditer les artefacts temporaires produits par PD-264 et vérifier l'absence de secrets cryptographiques de type clé/fragment/DEK/ReKey dans ce périmètre.
- Résultat attendu : confirmation documentée que l'invariant
INV-264-envelope-encryptionest NON APPLICABLE ; le nonce est traité comme donnée probatoire non secrète (mémoire transitoire puis stockage contractuel). - Couvre : INV-264-envelope-encryption.
TC-264-19 — Crash entre ACCEPTED et PERSISTED : atomicité transactionnelle¶
- Prérequis : mécanisme de fault injection permettant un crash contrôlé autour du commit DB et observation DB + append-only + Merkle après redémarrage.
- Action :
- Cas A : déclencher
RESPONSE_RECEIVED -> RESPONSE_ACCEPTED, injecter un crash avant commit, redémarrer, inspecter les artefacts. - Cas B : injecter un crash après commit DB et avant append-only/Merkle, redémarrer, observer le rattrapage asynchrone.
- Résultat attendu :
- Cas A : absence de token persisté ; absence d'append-only/Merkle ; état cohérent (rollback).
- Cas B : token persisté présent et valide ; append-only/Merkle éventuellement absents immédiatement après redémarrage mais rattrapés par le worker de réconciliation PD-55 (idempotence, absence de doublon).
- Couvre : INV-264-13, CA-264-06, CA-264-07.
3) Tests de non-régression (PD-55)¶
- NR-264-01 : TC-264-12 valide que le flux probatoire nominal hérité (persistance -> Merkle -> ancrage) reste intact.
- NR-264-02 : TC-264-13 valide qu'un rejet nonce n'introduit aucun effet de bord dans append-only/Merkle/ancrage.
- NR-264-03 : TC-264-09 + TC-264-11 valident la conservation de l'immutabilité et des interdictions de retour d'état.
- NR-264-04 : conservation de la rétention existante (10 ans, hors changement PD-264) vérifiée par non-altération de configuration.
- NR-264-05 : TC-264-19 valide qu'un crash avant commit ne laisse aucun état partiellement accepté.
- Justification d'exhaustivité : ces 5 NR couvrent les 3 interfaces PD-55 impactées par PD-264 (persistance, append-only, agrégation Merkle) ainsi que les 2 propriétés transversales (immutabilité et transitions d'états). Les interfaces non impactées par PD-264 (ancrage blockchain, rétention 10 ans) sont hors scope de modification et ne nécessitent pas de NR dédiée additionnelle.
4) Tests d'interopérabilité (openssl ts -verify)¶
- Référence : TC-264-14.
- Critère de succès :
- Vérification
opensslréussie sur token accepté. - Aucune erreur de structure DER/ASN.1.
- Traçabilité de la commande, des entrées et de la sortie conservée dans les artefacts de test.
5) Tests de sécurité (timing attacks, CSPRNG, unicité)¶
- Timing attacks : TC-264-07 (usage obligatoire d'une primitive temps constant + validation statistique avec protocole
alpha=0.01,N=100000,|Cliff's delta|<0.147).
- Escalade timing : en cas d'échec statistique, rerun unique sur infra stable puis escalade/audit obligatoire si second échec ; blocage applicable à Gate 8.
- CSPRNG : TC-264-08 (source cryptographique obligatoire, exclusion explicite des PRNG non cryptographiques).
- Observable CSPRNG : preuve statique d'usage
crypto.randomBytes(16)(ou équivalent documenté), contrôle runtime de longueur 16 octets, et test Chi² sur échantillon. - Unicité / anti-rejeu : TC-264-05 et TC-264-06 (métier + contrainte DB en défense en profondeur).
- Envelope-encryption : TC-264-18 (constat de non-applicabilité au périmètre nonce PD-264, absence de secrets temporaires concernés).
6) Verdict de testabilité¶
| Exigence | Statut | Justification |
|---|---|---|
| INV-264-01 | TESTABLE | Vérifiable via cas de refus sans nonce + audit de génération. |
| INV-264-02 | TESTABLE | Vérifiable par injection de réponse sans nonce. |
| INV-264-03 | TESTABLE | Vérifiable via mismatch déterministe nonce_A/nonce_B. |
| INV-264-04 | TESTABLE (obligation de moyen) | Teste l'usage d'une primitive de comparaison temps constant + contrôle statistique encadré ; ne prétend pas prouver une propriété physique absolue. | | INV-264-05 | TESTABLE | Vérifiable en nominal, rejeu et concurrence. | | INV-264-06 | TESTABLE | Vérifiable par absence d'effets persistants avant validation. | | INV-264-07 | TESTABLE | Vérifiable par matrice de cas invalides (absence/mismatch/doublon). | | INV-264-08 | TESTABLE | Vérifiable par tentative de mutation post-insertion. | | INV-264-09 | TESTABLE | Vérifiable via validation structurelle token accepté. | | INV-264-10 | TESTABLE | Vérifiable via openssl ts -verify. | | INV-264-11 | TESTABLE | Vérifiable par composition des tests présence+égalité+unicité. |
| INV-264-envelope-encryption | NON APPLICABLE | Hors périmètre PD-264 : aucun artefact secret temporaire (clé/fragment/DEK/ReKey) n'est manipulé ; le nonce n'est pas un secret cryptographique. |
| INV-264-12 | TESTABLE | Vérifiable par exécution exhaustive des 5 transitions interdites (TC-264-11). |
| INV-264-13 | TESTABLE | Vérifiable par fault injection pré/post-commit : rollback sans persistance avant commit, puis persistance DB valide et rattrapage asynchrone append-only/Merkle après commit (TC-264-19). |
- Conclusion testabilité : couverture complète INV/CA assurée par les scénarios ci-dessus ; l'ancien absolu sur le temps constant est remplacé par une obligation de moyen testable, et
INV-264-envelope-encryptionest explicitement classé NON APPLICABLE au périmètre PD-264.