PD-99 — Écran de connexion utilisateur (SRP-6a)¶
1. Objectif¶
Décrire de manière contractuelle et testable les règles fonctionnelles, de sécurité et d’expérience utilisateur relatives à l’écran de connexion de l’application mobile iOS ProbatioVault, permettant à un utilisateur déjà inscrit de s’authentifier via un mécanisme SRP-6a, dans le respect des exigences de sécurité, de conformité et de responsabilité utilisateur.
Cette spécification fait loi pour toute implémentation de la PD-99.
2. Périmètre / Hors périmètre¶
Inclus¶
- Authentification d’un utilisateur existant via email et mot de passe.
- Usage exclusif du protocole SRP-6a pour l’authentification.
- Écran de connexion principal de l’application mobile iOS.
- Connexion facilitée par biométrie, en tant qu’option.
- Gestion des messages d’erreur liés à la tentative de connexion.
- Paramétrage utilisateur relatif à l’activation/désactivation de la biométrie.
Exclu¶
- Inscription, création ou validation de compte utilisateur.
- Récupération, réinitialisation ou changement de mot de passe.
- Authentification via un autre mécanisme que SRP-6a.
- Gestion des politiques serveur (quotas, délais, verrouillage).
- Gestion des rôles et autorisations post-authentification.
- Optimisation des performances ou de la latence.
3. Définitions¶
| Terme | Définition |
|---|---|
| Utilisateur | Personne disposant d’un compte ProbatioVault déjà inscrit et validé |
| Mot de passe | Secret choisi par l’utilisateur lors de l’inscription |
| SRP-6a | Protocole d’authentification par mot de passe sans transmission du secret |
| Connexion fondatrice | Connexion réalisée via email + mot de passe |
| Connexion facilitée | Connexion réalisée via biométrie locale après authentification fondatrice |
| Biométrie | Mécanisme d’authentification locale fourni par le terminal |
| Écran de login | Tout écran de l’application mobile iOS depuis lequel un utilisateur peut initier une authentification (connexion fondatrice ou connexion facilitée), quel que soit le contexte d’accès (écran initial, reprise de session, écran intermédiaire, redirection après déconnexion). |
4. Invariants (non négociables)¶
| ID | Règle | Justification |
|---|---|---|
| INV-01 | Toute authentification DOIT utiliser SRP-6a. Un élément observable contractuel (identifiant de flux, type d’échange nommé, trace fonctionnelle ou artefact de preuve exposable en environnement de test) DOIT permettre d’attester l’usage de SRP-6a sans accès au code ni aux secrets. | Choix d’architecture acté |
| INV-02 | Le mot de passe NE DOIT JAMAIS être transmis en clair | Confidentialité utilisateur |
| INV-03 | Aucun humain (y compris ProbatioVault) NE DOIT pouvoir connaître le mot de passe — exigence de gouvernance juridique non testable par les scénarios applicatifs | Zero-knowledge |
| INV-04 | Le terme « mot de passe » DOIT être utilisé | Clarté utilisateur |
| INV-05 | La connexion fondatrice et la connexion facilitée DOIVENT être visuellement différenciées sur l’écran de login | Responsabilité utilisateur |
| INV-06 | La différenciation visuelle NE DOIT PAS persister après la connexion | Sobriété UX |
| INV-07 | La biométrie DOIT être optionnelle | Contrôle utilisateur |
| INV-08 | La biométrie DOIT pouvoir être désactivée globalement et/ou par appareil | Maîtrise utilisateur |
| INV-09 | Les messages d’erreur NE DOIVENT PAS permettre d’inférence exploitable | Sécurité |
| INV-10 | Intention non normative : le login est traité comme un acte engageant (hors périmètre de test applicatif) | Valeur probatoire |
| INV-11 | Tout écran de login DOIT afficher un rappel d’irrécupérabilité du mot de passe, avec le texte exact suivant : « Votre mot de passe est connu de vous seul. Il ne peut pas être récupéré ni communiqué, y compris à la demande. » | Responsabilisation |
4.1 Précisions sur la différenciation visuelle (INV-05 / INV-06)¶
- Les modes « connexion fondatrice » et « connexion facilitée » doivent présenter au moins un élément visuel distinct parmi : libellé, titre, message d’aide, icône.
- La distinction doit être perceptible sans ambiguïté sur l’écran de login.
- Une fois l’utilisateur authentifié, aucun de ces éléments distinctifs ne doit persister ni être visible sur les écrans post-login.
5. Flux nominaux¶
Flux FN-01 — Connexion fondatrice¶
- L’utilisateur accède à l’écran de login.
- L’utilisateur saisit son email et son mot de passe.
- Le système engage un échange SRP-6a.
- Si l’authentification réussit, l’utilisateur est connecté.
Flux FN-02 — Connexion facilitée (biométrie)¶
- L’utilisateur accède à l’écran de login.
- L’utilisateur choisit l’option de connexion facilitée.
- Une authentification biométrique locale est demandée.
- Si elle réussit, l’utilisateur est connecté.
Flux FN-03 — Désactivation biométrie¶
- L’utilisateur accède aux paramètres.
- L’utilisateur désactive la biométrie globalement ou par appareil.
- Toute connexion ultérieure requiert une connexion fondatrice.
5bis. Diagrammes Mermaid¶
Diagramme d’états — Écran de connexion¶
L’écran de login possède 5 états distincts. Les transitions reflètent les invariants INV-05 (différenciation visuelle fondatrice/facilitée), INV-07 (biométrie optionnelle) et INV-06 (pas de persistance post-login).
stateDiagram-v2
[*] --> EcranLogin : Ouverture app
state EcranLogin {
[*] --> ChoixMode
ChoixMode --> SaisieFondatrice : Connexion fondatrice [INV-05]
ChoixMode --> PromptBiometrie : Connexion facilitée [INV-05, INV-07]
SaisieFondatrice --> EchangeSRP6a : Soumission email + mdp
PromptBiometrie --> SaisieFondatrice : Biométrie refusée (ERR-03)
PromptBiometrie --> Authentifie : Biométrie réussie
}
EchangeSRP6a --> Authentifie : SRP-6a OK [INV-01, INV-02]
EchangeSRP6a --> EcranLogin : Échec (ERR-01 / ERR-02) [INV-09]
Authentifie --> [*] : Aucun indicateur de mode visible [INV-06] Diagramme de séquence — Connexion fondatrice SRP-6a (FN-01)¶
Le protocole SRP-6a implique un échange multi-étapes entre le client iOS et le backend. Le mot de passe ne quitte jamais le terminal (INV-02, INV-03).
sequenceDiagram
participant U as Utilisateur
participant App as App iOS
participant API as Backend API
participant SRP as Module SRP-6a
U->>App: Saisit email + mot de passe
Note over App: INV-04 — libellé « mot de passe »
Note over App: INV-11 — rappel irrécupérabilité affiché
App->>SRP: Dérive verifier local (email, mdp)
Note over SRP: INV-02 — mdp jamais transmis
Note over SRP: INV-03 — zero-knowledge
App->>API: SRP Step 1 — envoie identifiant + A (clé publique éphémère)
API-->>App: Retourne salt + B (clé publique serveur)
App->>SRP: Calcule preuve M1 (A, B, salt, mdp)
App->>API: SRP Step 2 — envoie M1
API->>API: Vérifie M1, calcule M2
alt Authentification réussie
API-->>App: Retourne M2 + session token
App->>SRP: Vérifie M2 (preuve mutuelle)
App-->>U: Écran principal (INV-06 — aucun indicateur de mode)
else Échec authentification
API-->>App: Erreur générique
App-->>U: « La connexion a échoué. » (INV-09, ERR-01)
end Diagramme de séquence — Connexion facilitée biométrie (FN-02)¶
sequenceDiagram
participant U as Utilisateur
participant App as App iOS
participant Bio as Biométrie OS
participant KS as Keychain Secure
U->>App: Choisit connexion facilitée
Note over App: INV-05 — écran visuellement distinct
App->>Bio: Demande authentification biométrique
Note over Bio: INV-07 — optionnel, INV-08 — désactivable
alt Biométrie réussie
Bio-->>App: OK
App->>KS: Récupère credentials chiffrés
KS-->>App: Credentials
Note over App: Reprend flux SRP-6a (INV-01)
App-->>U: Écran principal (INV-06)
else Biométrie échouée / annulée
Bio-->>App: Échec
App-->>U: Retour écran login (ERR-03)
end 6. Cas d’erreur¶
| ID | Situation | Comportement attendu |
|---|---|---|
| ERR-01 | Échec d’authentification | Message générique, non différenciant |
| ERR-02 | Indisponibilité technique | Message générique, non causal |
| ERR-03 | Biométrie refusée ou échouée | Retour à l’écran de login |
Tous les messages d’erreur DOIVENT être indiscernables du point de vue de la cause.
Texte exact obligatoire du message d’erreur générique unique :
La connexion a échoué. Vérifiez vos informations et réessayez.
7. Critères d’acceptation (testables)¶
| ID | Critère | Observable |
|---|---|---|
| CA-01 | La connexion fondatrice utilise SRP-6a | Traces de flux |
| CA-02 | Le mot de passe n’est jamais transmis en clair | Analyse réseau |
| CA-03 | Les écrans fondatrice et facilitée sont distincts | Inspection UI |
| CA-04 | Aucun indicateur de mode ne persiste après login | Navigation UI |
| CA-05 | La biométrie est désactivable globalement | Paramètres |
| CA-06 | La biométrie est désactivable par appareil | Paramètres |
| CA-07 | Les messages d’erreur sont identiques | Tests négatifs |
| CA-08 | Tout écran de login affiche le rappel d’irrécupérabilité du mot de passe avec le texte exact requis | Inspection UI |
| CA-09 | En cas d’échec, le message d’erreur générique affiché correspond exactement au texte requis | Inspection UI |
8. Scénarios de test (Given / When / Then)¶
TC-01 — Connexion fondatrice valide¶
- Given un utilisateur existant
- When il saisit email et mot de passe valides
- Then l’accès est accordé
TC-02 — Connexion fondatrice invalide¶
- Given un utilisateur
- When l’authentification échoue
- Then un message générique est affiché
TC-03 — Connexion biométrique¶
- Given une biométrie activée
- When la biométrie réussit
- Then l’accès est accordé
TC-04 — Désactivation biométrie¶
- Given une biométrie activée
- When l’utilisateur la désactive
- Then la connexion facilitée est impossible
9. Hypothèses explicites¶
| ID | Hypothèse | Impact si faux |
|---|---|---|
| H-01 | Le protocole SRP-6a est disponible côté backend | Blocage complet |
| H-02 | Les mécanismes biométriques sont fournis par l’OS | Fonction dégradée |