**Motivations:** - Add new features and fixes for userwallet application - Update documentation for pairing, login state machine, and sync - Add new utilities for bloom filters, nonce store, and contract versioning - Fix mempool websocket offline issues **Root causes:** - N/A (feature additions and improvements) **Correctifs:** - Fix mempool websocket offline handling - Update ESLint configuration **Evolutions:** - Add login state machine service and hook - Add sync loop service - Add bloom filter utilities for anti-replay and state visibility - Add nonce store and contract version utilities - Update pairing confirmation and graph resolver services - Add new documentation for features and fixes - Update userwallet components (LoginScreen, SyncScreen) - Update types for contract, identity, and messages **Pages affectées:** - userwallet/src/components/LoginScreen.tsx - userwallet/src/components/SyncScreen.tsx - userwallet/src/hooks/useChannel.ts - userwallet/src/hooks/useLoginStateMachine.ts (new) - userwallet/src/services/graphResolver.ts - userwallet/src/services/pairingConfirm.ts - userwallet/src/services/syncService.ts - userwallet/src/services/syncLoop.ts (new) - userwallet/src/services/loginStateMachine.ts (new) - userwallet/src/types/contract.ts - userwallet/src/types/identity.ts - userwallet/src/types/message.ts - userwallet/src/utils/canonical.ts - userwallet/src/utils/identity.ts - userwallet/src/utils/indexedDbStorage.ts - userwallet/src/utils/relay.ts - userwallet/src/utils/verification.ts - userwallet/src/utils/bloom.ts (new) - userwallet/src/utils/contractVersion.ts (new) - userwallet/src/utils/nonceStore.ts (new) - userwallet/eslint.config.mjs - userwallet/package.json - userwallet/package-lock.json - userwallet/docs/synthese.md - userwallet/docs/specs-champs-obligatoires-cnil.md (new) - api-relay/README.md - features/userwallet-pairing-words-only-finalise.md - features/userwallet-anti-rejeu-etats-visibles-bloom.md (new) - features/userwallet-bloom-usage-sync.md (new) - features/userwallet-contrat-login-reste-a-faire.md (new) - features/userwallet-ecrans-login-a-valider.md (new) - features/userwallet-eslint-fix.md (new) - features/userwallet-login-state-machine.md (new) - features/userwallet-validation-conformite.md (new) - fixKnowledge/mempool-websocket-offline-fix.md (new) - mempool (submodule) - hash_list.txt - hash_list_cache.txt
7.5 KiB
Contrat et login – reste à faire
Author: Équipe 4NK
Date: 2026-01-26
1. Principe (rappel)
Le login décentralisé repose sur :
- Graphe contractuel : Service → Contrat → Champ → Action(login) → Membre → Pair ; contraintes « au moins 1 parent ».
- Validateurs : signatures requises pour l’action login, liées aux pairs/membres du graphe.
- Pairing mFA : obligatoire ; au moins un pair attendu par l’action login doit être disponible.
- Publication en trois temps : message chiffré (sans sig ni clés) → signatures → clés ; tout adressé par hash canonique, récupéré par GET (pull-only).
- Vérification locale : conformité graphe + signatures + anti-rejeu (nonce, fenêtre temporelle) ; pas d’autorité centrale.
Référence : userwallet/docs/specs.md (modèle, objets, machine à états, catalogue).
2. Déjà en place
- Identité : création secp256k1, import (hex ou BIP39), protection par mot de passe, déverrouillage.
- Pairing : 8 mots BIP32-style, WordInputGrid, confirmation croisée « membre finaliser », IndexedDB, statut « Connecté ».
- Relais : config, health, GET/POST messages/signatures/keys, GET /bloom ; sync, HashCache (IndexedDB), dédup, fetch clés/signatures.
- Graphe : GraphResolver, caches (services, contrats, champs, actions, membres, pairs),
resolveLoginPath. - Login : LoginBuilder (challenge, nonce, chiffrement « for all »), construction preuve, publication message → signatures → clés. Anti-rejeu : NonceStore (IndexedDB), vérification timestamp (fenêtre),
X_NONCE_REUSED/X_TIMESTAMP_OUT_OF_WINDOWavant publish. - Iframe : auth-request / auth-response / login-proof, useChannel, postMessage.
- Écrans : Home, CreateIdentity, ImportIdentity, RelaySettings, Sync, Manage Pairs, Pairing (setup + display), Services, Login, Data Export/Import, Unlock. Navigation via GlobalActionBar.
3. Reste à faire (principes contrat & login)
3.1 Machine à états formelle
- Fait :
loginStateMachine(états S_LOGIN_, événements E_),useLoginStateMachine, dispatch dans LoginScreen, Retour → E_BACK. Voirfeatures/userwallet-login-state-machine.md. - À prévoir : timeouts (réseau, collecte signatures), reprise sur erreur, backoff ; gardes explicites (G_PAIRING_SATISFIED, etc.) côté UI.
3.2 Écrans et UX alignés specs
À valider avant implémentation. Voir features/userwallet-ecrans-login-a-valider.md.
-
Service iframe : fourni par channel message (contrat + contrats fils). Si absent → contrat par défaut en dur dans le front jusqu’à réception.
-
Écrans login : déjà en place. Reste à faire : notifications selon événements relais (collecte signatures, clés de déchiffrement → hash à fetch → signatures, contrats, membres, pairs, actions, champs sur le relai).
-
Cette section évoluera avec l'avancement des tests une fois validée.
-
Sélection service / sélection membre : écrans dédiés « choisir le service cible du login » et « choisir le membre (quand plusieurs) » avec liste, statuts, validation des prérequis (action login, pairs).
-
Construction du chemin login : écran dédié avec résumé (service → contrat → action login → membre → pairs), tableau « signatures requises » (validateurs, qui doit signer, manquante/reçue/valide/invalide), boutons Synchroniser / Démarrer login.
-
Message de login à valider : écran avec résumé public (service, type, timestamp, relais), nonce (mode avancé), « signer ».
-
Collecte signatures mFA : écran listant les signatures requises (clé, pair/membre, état), actions « signer avec ce device », « demander signature sur autre pair », « rafraîchir » (fetch), « voir détail ».
-
Publication du login : écran dédié (ou étape claire) avec ordre strict message → signatures → clés, statut par relais, erreurs explicites.
-
Vérification locale + résultat : écran/étape « vérification locale finale » (hash, signatures, graphe, anti-rejeu) puis succès / échec avec diagnostics (signatures manquantes, objets manquants, etc.).
3.3 États et diagnostics visibles
- Message reçu mais indéchiffrable (clé manquante) et message déchiffré mais non validé (signature manquante) : fait. Sync retourne
indechiffrableetnonValide; SyncScreen affiche « Indéchiffrables (clé manquante) » et « Non validés (ex. signature manquante) ». - Contrat incomplet : affichage explicite lorsque le graphe est incomplet (LoginScreen :
path.statut === 'incomplet', erreur « Chemin incomplet »). - Statut par relais : fait. Sync retourne
relayStatus(endpoint + ok) ; SyncScreen affiche « Statut relais » (OK / indisponible par relais).
3.4 Anti-rejeu et nonce
- Nonce unique : fait. Chaque login utilise un nonce ; pas de republication du même nonce.
- Cache
nonce_vus: fait.NonceStore(IndexedDB,userwallet_nonce_cache), TTL 1 h ;init/hasUsed/markUsed. Vérification timestamp viaverifyTimestamp(fenêtre 5 min). - Erreurs : fait.
X_NONCE_REUSED,X_TIMESTAMP_OUT_OF_WINDOWavant publish ; messages explicites dans LoginScreen.
3.5 Validation et conformité
- Fait :
verifyMessageSignaturesStrict,filterSignaturesByAuthorizedPubkeys; avant publish login, sicle_publiquedans requirements → vérif stricte, sinon X_PUBKEY_NOT_AUTHORIZED. Contrats en version non supportée exclus du graphe (sync) ;contrat_versiondans LoginPath et affichage. Voirfeatures/userwallet-validation-conformite.md. - À renforcer : cardinalité, dépendances entre signatures ; résolution
cle_publiquedepuis graphe quand absente des requirements.
3.6 Scan et optimisation (optionnel)
- Bloom filter : fait.
getBloom(relay);utils/bloom→fetchAndLoadBloom; sync fetch les Bloom,fetchKeysskipgetKeysquand!bloom.has(hash)(pas de faux négatifs). Voirfeatures/userwallet-bloom-usage-sync.md. - Merkle trees : checkpointing / accélération de scan (optionnel, non implémenté).
3.7 Côté service (hors userwallet)
- Acceptation de session : le service (application qui consomme le login) doit vérifier la preuve en ne s’appuyant que sur contrats + signatures (sans serveur central). Rejouer la construction du graphe depuis les UUID/messages disponibles, vérifier hash, signatures, anti-rejeu.
- Politique anti-rejeu : TTL nonce, fenêtre timestamp, cache nonce_vus.
4. Synthèse
| Domaine | Statut | Priorité |
|---|---|---|
| Machine à états login | Fait (loginStateMachine, useLoginStateMachine, dispatch) | — |
| Écrans sélection service / membre, chemin login, collecte sig, publication, vérification | À valider avant implémentation (voir userwallet-ecrans-login-a-valider) ; notifications relais à implémenter | Haute |
| États « indéchiffrable » / « signature manquante » / statut relais visibles | Fait (Sync) | — |
| Anti-rejeu (nonce, fenêtre, cache) | Fait (NonceStore, verifyTimestamp, X_*) | — |
| Validation stricte validateurs + clé autorisée | Fait (strict verify, version contrats) | — |
| Version contrats | Fait (supported check, affichage) | — |
| Bloom API + usage sync | Fait (getBloom, fetchAndLoadBloom, skip key fetch) |
— |
| Merkle (scan) | Optionnel, non implémenté | Basse |
Les éléments de la section « Déjà en place » restent le socle ; les développements ci‑dessus les complètent pour coller au principe « contrat + login » décrit dans specs.md.