Aller au contenu

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

  1. 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.

  2. INV-07 (partiel) : Le niveau de journalisation n'est pas spécifié ; le test vérifie l'existence d'une trace, pas son format.

  3. 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

  1. Clarifier §10 (durées, claims JWT, niveau de trace)
  2. Implémenter les tests automatisés
  3. Exécuter et documenter les résultats TC-* PASS/FAIL
  4. Mettre à jour PD-25-acceptability.md

Fin du document de tests contractuels PD-25.