PD-25 — Scénarios de tests contractuels
Authentification SRP-6a (Phase 2 : preuve, clé de session, token)
Navigation User Story
| Document | | | -------- | -- | | Spécification | [PD-25-specification.md](PD-25-specification.md) | | Plan d'implémentation | [PD-25-plan.md](PD-25-plan.md) | | **Tests contractuels** | *(ce document)* | | Critères d'acceptation | [PD-25-acceptability.md](PD-25-acceptability.md) | | Retour d'expérience | [PD-25-rex.md](PD-25-rex.md) | [← Retour à crypto-proof](../PD-189-epic.md) · [↑ Index User Story](index.md)
1. Références
| Document | Lien |
| Spécification | PD-25-specification.md |
| Epic | PD-189 — CRYPTO |
| Protocole de référence | RFC 5054 (SRP-6a) |
2. Matrice de couverture
2.1 Couverture des invariants
| ID | Invariant (spec §4) | ID Test(s) | Couverture | Commentaire |
| INV-01 | Serveur ne connaît/stocke jamais le mot de passe | TC-INV-01 | Oui | Inspection |
| INV-02 | Auth réussie = preuve SRP-6a valide | TC-NOM-01, TC-ERR-01 | Oui | |
| INV-03 | K non exposée/retournée avant validation M1 | TC-INV-03 | Oui | Inspection |
| INV-04 | K jamais persistée | TC-INV-04 | Oui | Inspection |
| INV-05 | JWT émis après auth SRP réussie uniquement | TC-NOM-01, TC-ERR-01 | Oui | |
| INV-06 | Échange SRP ne permet pas récupération secret | TC-INV-06 | Oui | Analyse protocole |
| INV-07 | Toute tentative traçable | TC-INV-07 | Partiel | Niveau de trace non spécifié (§10.4) |
2.2 Couverture des critères d'acceptation
| ID | Critère (spec §7) | ID Test(s) | Couverture |
| CA-01 | Preuve SRP valide → auth réussie | TC-NOM-01 | Oui |
| CA-02 | Preuve SRP invalide → pas de JWT | TC-ERR-01 | Oui |
| CA-03 | K jamais persistée | TC-INV-04 | Oui |
| CA-04 | Secret non exposé/dérivable | TC-INV-06 | Oui |
| CA-05 | Tentative invalide traçable | TC-INV-07 | Partiel |
| CA-06 | M2 permet vérification serveur | TC-NOM-02 | Oui |
2.3 Couverture des scénarios spec (§8)
| Scénario spec | ID Test | Couverture |
| Scénario 1 — Auth réussie | TC-NOM-01 | Oui |
| Scénario 2 — Preuve invalide | TC-ERR-01 | Oui |
| Scénario 3 — Session expirée | TC-ERR-02 | Oui |
3. Scénarios de test — Flux nominaux
TC-NOM-01 — Authentification SRP-6a réussie
TEST-ID: TC-NOM-01
Titre: Authentification SRP-6a réussie
Référence spec: INV-02, INV-05, CA-01, §5.1, §5.2, §5.3, Scénario 1
GIVEN
- Un utilisateur enregistré avec un verifier SRP valide
- Une session SRP Phase 1 correctement initiée (spec §2.2 hors périmètre)
- Le client a calculé une preuve M1 conforme au protocole SRP-6a
WHEN
- Le client soumet la preuve M1 pour vérification
THEN
- La preuve est validée conformément au protocole SRP-6a
- Une clé de session est établie (spec §5.2)
- Un JWT est émis (spec §5.3)
- Une preuve serveur M2 est retournée (spec §5.3)
AND
- La tentative d'authentification est tracée (INV-07, niveau non spécifié §10.4)
TC-NOM-02 — Vérification mutuelle (preuve serveur M2)
TEST-ID: TC-NOM-02
Titre: Validation mutuelle — preuve serveur M2
Référence spec: CA-06, §5.3
GIVEN
- TC-NOM-01 a réussi
- Le client possède les éléments nécessaires pour vérifier M2
WHEN
- Le client vérifie la preuve serveur M2 conformément à SRP-6a
THEN
- M2 est valide
- Le client peut authentifier le serveur (validation mutuelle)
4. Scénarios de test — Cas d'erreur
TC-ERR-01 — Rejet preuve M1 invalide
TEST-ID: TC-ERR-01
Titre: Rejet d'une preuve client invalide
Référence spec: INV-02, INV-05, CA-02, CA-05, §6 "preuve SRP invalide", Scénario 2
GIVEN
- Une session SRP valide initiée
- Une preuve M1 incorrecte (mot de passe erroné ou preuve altérée)
WHEN
- Le client soumet la preuve M1 invalide
THEN
- L'authentification échoue (spec §6)
- Aucun JWT n'est émis (INV-05, CA-02)
- Aucune clé de session n'est exposée/retournée
AND
- La tentative est tracée (INV-07)
TC-ERR-02 — Session SRP inexistante ou expirée
TEST-ID: TC-ERR-02
Titre: Rejet si session SRP inexistante ou expirée
Référence spec: §6 "session SRP inexistante ou expirée", Scénario 3
GIVEN
- Aucune session SRP active pour l'utilisateur
- OU session SRP expirée (durée définie §10.1, non spécifiée)
WHEN
- Une preuve M1 est soumise
THEN
- L'authentification échoue explicitement (spec Scénario 3)
- Aucun JWT émis
TC-ERR-03 — Incohérence paramètres cryptographiques
TEST-ID: TC-ERR-03
Titre: Rejet si paramètres cryptographiques incohérents
Référence spec: §6 "incohérence des paramètres cryptographiques"
GIVEN
- Une session SRP valide
- Des paramètres cryptographiques invalides selon SRP-6a
(ex: A mod N = 0, paramètre hors bornes)
WHEN
- La vérification est tentée
THEN
- L'authentification échoue
- Aucun JWT émis
- Réponse déterministe et contrôlée (spec §6)
TC-ERR-04 — Réutilisation de preuve
TEST-ID: TC-ERR-04
Titre: Rejet de réutilisation d'une preuve
Référence spec: §6 "tentative de réutilisation d'une preuve"
GIVEN
- Une authentification TC-NOM-01 a réussi avec une preuve M1
WHEN
- La même preuve M1 est soumise à nouveau
THEN
- L'authentification échoue (anti-replay)
- Aucun JWT émis
TC-ERR-05 — Erreur dérivation clé de session
TEST-ID: TC-ERR-05
Titre: Gestion erreur lors dérivation clé de session
Référence spec: §6 "erreur lors de la dérivation de la clé de session"
GIVEN
- Conditions provoquant une erreur de dérivation
(conditions techniques non spécifiées dans spec)
WHEN
- La dérivation échoue
THEN
- L'authentification échoue
- Aucun JWT émis
- Réponse contrôlée (pas de fuite d'information)
TC-ERR-06 — Erreur génération JWT
TEST-ID: TC-ERR-06
Titre: Gestion erreur lors génération JWT
Référence spec: §6 "erreur interne lors de la génération du JWT"
GIVEN
- Preuve M1 valide
- Erreur interne lors de la génération JWT
WHEN
- La génération JWT échoue
THEN
- L'authentification échoue
- Aucun JWT (partiel ou corrompu) retourné
- Réponse contrôlée et traçable (INV-07)
5. Tests d'invariants (non négociables)
| Invariant | Test(s) | Méthode | Statut |
| INV-01 | TC-INV-01 | Inspection code/DB | Testable |
| INV-02 | TC-NOM-01, TC-ERR-01 | Fonctionnel | Testable |
| INV-03 | TC-INV-03 | Inspection code | Testable |
| INV-04 | TC-INV-04 | Inspection code/storage | Testable |
| INV-05 | TC-NOM-01, TC-ERR-01 | Fonctionnel | Testable |
| INV-06 | TC-INV-06 | Analyse protocole | Testable |
| INV-07 | TC-INV-07 | Inspection traces | Partiel (§10.4 non clarifié) |
TC-INV-01 — Mot de passe jamais connu/stocké serveur
TEST-ID: TC-INV-01
Titre: Serveur ne connaît/stocke jamais le mot de passe
Référence spec: INV-01 (§4.1)
GIVEN
- Accès au schéma de stockage persistant
- Accès au code source du module d'authentification
WHEN
- Inspection des structures de données persistées
- Inspection du code de traitement des credentials
THEN
- Aucun mot de passe (clair ou hashé classique) n'est stocké
- Seuls les éléments SRP (salt, verifier) sont persistés
- Le mot de passe n'est jamais reçu ni manipulé côté serveur
TC-INV-03 — Non-exposition de K avant validation M1
TEST-ID: TC-INV-03
Titre: Clé de session non exposée avant validation M1
Référence spec: INV-03, §4.3
GIVEN
- Code source de verifyClientProof()
WHEN
- Inspection de l'ordre des opérations et des usages de K
THEN
- K peut être calculée pour la vérification cryptographique de M1
- K n'est pas exposée/retournée avant validation de M1
- K n'est pas utilisée hors vérification cryptographique avant validation
TC-INV-04 — Clé de session non persistée
TEST-ID: TC-INV-04
Titre: Clé de session jamais persistée
Référence spec: INV-04 (§4.4)
GIVEN
- Exécution de TC-NOM-01 (auth réussie)
- Accès au stockage persistant et aux logs
WHEN
- Inspection du stockage après authentification
- Inspection des journaux applicatifs
THEN
- La clé de session K n'apparaît dans aucun stockage persistant
- K n'apparaît pas dans les logs
- K n'existe qu'en mémoire pendant le traitement de la requête
TC-INV-06 — Échange SRP ne révèle pas le secret
TEST-ID: TC-INV-06
Titre: Aucun élément d'échange ne permet récupération du secret
Référence spec: INV-06 (§4.6)
GIVEN
- Capture de tous les éléments échangés durant l'authentification
(salt, A, B, M1, M2, JWT)
WHEN
- Analyse cryptographique des éléments échangés
THEN
- Conformément à SRP-6a (RFC 5054), aucun élément ne permet de :
- récupérer le mot de passe
- récupérer le verifier
- dériver la clé de session sans connaissance du secret
TC-INV-07 — Traçabilité des tentatives
TEST-ID: TC-INV-07
Titre: Toute tentative d'authentification est traçable
Référence spec: INV-07 (§4.7)
GIVEN
- Exécution de TC-NOM-01 (succès) et TC-ERR-01 (échec)
WHEN
- Inspection du système de traçabilité
THEN
- Chaque tentative (succès ou échec) génère une trace
- La trace ne contient pas de secrets (mot de passe, K)
⚠️ NOTE: Le niveau de journalisation attendu n'est pas spécifié (spec §10.4).
Ce test vérifie l'existence d'une trace, pas son format/contenu exact.
6. Tests de non-régression
| Test ID | Objet | Observable |
| TC-NR-01 | Compatibilité protocole SRP-6a | Interopérabilité client/serveur |
| TC-NR-02 | Format JWT | Structure JWT valide (spec §5.3) |
| TC-NR-03 | Expiration session SRP | Cohérence avec config (valeur §10.1 non spécifiée) |
7. Tests négatifs et adversariaux
| Test ID | Scénario d'abus | Résultat attendu | Référence |
| TC-NEG-01 | Paramètre A invalide (A mod N = 0) | Rejet, pas de calcul crypto | §6, INV-06 |
| TC-NEG-02 | Preuve M1 malformée | Rejet | §6 |
| TC-NEG-03 | Session ID inexistant | Rejet | §6 |
| TC-NEG-04 | Replay preuve M1 | Rejet | §6 |
8. Observabilité requise pour les tests
| Type | Élément | Requis pour | Spécifié ? |
| Réponse API | Succès/échec, JWT, M2 | TC-NOM-, TC-ERR- | Implicite (§5.3, §6) |
| JWT | Token valide signé | TC-NOM-01 | Oui (§5.3) |
| JWT claims | Contenu du token | — | Non (§10.3 à clarifier) |
| Stockage | Absence mot de passe, absence K | TC-INV-01, TC-INV-04 | Oui (§4.1, §4.4) |
| Traces | Événements d'audit | TC-INV-07 | Partiel (§4.7 sans détail §10.4) |
9. Règles non testables
| Règle | Raison | Impact |
| INV-07 (détail) | Niveau de trace non spécifié | MINEUR |
| Claims JWT | À clarifier (§10.3) | MINEUR |
9.1 Éléments à clarifier (spec §10)
| Point | Référence | Impact sur tests |
| Durée validité session SRP | §10.1 | TC-ERR-02 : seuil non vérifiable |
| Durée de vie JWT | §10.2 | Non testable précisément |
| Claims JWT obligatoires | §10.3 | Contenu JWT non vérifiable |
| Niveau journalisation | §10.4 | TC-INV-07 : format trace non vérifiable |
10. Verdict QA
| Verdict | |
| ⚠️ TESTABLE PARTIELLEMENT | Avec réserves |
Réserves
-
Points à clarifier (§10) : Plusieurs paramètres nécessaires aux tests ne sont pas spécifiés. Les tests correspondants ne peuvent vérifier que le comportement général, pas les valeurs exactes.
-
INV-07 (partiel) : Le niveau de journalisation n'est pas spécifié ; le test vérifie l'existence d'une trace, pas son format.
-
Scope strict : Ce document de tests est strictement dérivé de la spec PD-25. Il ne contient aucune exigence additionnelle (routes, codes HTTP, messages, claims JWT, noms d'événements).
Prochaines étapes
- Clarifier §10 (durées, claims JWT, niveau de trace)
- Implémenter les tests automatisés
- Exécuter et documenter les résultats TC-* PASS/FAIL
- Mettre à jour PD-25-acceptability.md
Fin du document de tests contractuels PD-25.