**Motivations:** - Implement BIP39 mnemonic import for identity creation - Add password-based key protection for enhanced security - Improve pairing workflow with QR code and URL display - Migrate hash cache from LocalStorage to IndexedDB for better scalability - Update signet-dashboard and mempool components **Root causes:** - N/A (feature implementations) **Correctifs:** - N/A (no bug fixes in this commit) **Evolutions:** - BIP39 mnemonic import: Support for 12/24 word English mnemonics with BIP32 derivation path m/44'/0'/0'/0/0 - Key protection: Password-based encryption of private keys at rest with unlock/lock functionality - Pairing workflow: QR code and URL display for device pairing, form-based word exchange between devices - IndexedDB migration: Hash cache moved from LocalStorage to IndexedDB to avoid size limitations - Global action bar: URL parameter support for navigation - Pairing connection: Enhanced pairing status management **Pages affectées:** - userwallet/src/utils/identity.ts - userwallet/src/utils/keyProtection.ts - userwallet/src/utils/sessionUnlockedKey.ts - userwallet/src/utils/indexedDbStorage.ts - userwallet/src/utils/cache.ts - userwallet/src/utils/pairing.ts - userwallet/src/components/UnlockScreen.tsx - userwallet/src/components/PairingDisplayScreen.tsx - userwallet/src/components/PairingSetupBlock.tsx - userwallet/src/components/GlobalActionBar.tsx - userwallet/src/components/HomeScreen.tsx - userwallet/src/components/ImportIdentityScreen.tsx - userwallet/src/components/DataExportImportScreen.tsx - userwallet/src/hooks/useIdentity.ts - userwallet/src/hooks/usePairingConnected.ts - userwallet/src/services/syncService.ts - userwallet/src/services/pairingConfirm.ts - userwallet/src/App.tsx - userwallet/package.json - userwallet/docs/specs.md - userwallet/docs/storage.md - userwallet/docs/synthese.md - signet-dashboard/public/*.html - signet-dashboard/public/app.js - signet-dashboard/public/styles.css - mempool (submodule updates) - hash_list.txt, hash_list_cache.txt, utxo_list.txt, utxo_list_cache.txt, fees_list.txt - features/*.md (documentation files)
53 lines
3.6 KiB
Markdown
53 lines
3.6 KiB
Markdown
# Pairing "Connecté" — confirmation croisée et affichage
|
||
|
||
## Objectif
|
||
|
||
Afficher "Connecté" sur chaque device une fois que le flux de confirmation signé de l’autre device a été reçu et traité. La confirmation repose sur un message "membre finaliser" signé par les deux devices, publié sur le relais avec version incrémentée, et stockée en IndexedDB.
|
||
|
||
## Rappel
|
||
|
||
Les messages sont envoyés essentiellement chiffrés. Il faut avoir reçu des messages de clé (Diffie-Hellman) pour déchiffrer la clé de chiffrement et, via le hash, récupérer sur le relais le message qui nous concerne.
|
||
|
||
## Flux attendu
|
||
|
||
### Premier device
|
||
|
||
1. Après "Associer le pair", le 1er device a ajouté la clé publique du 2e (pair distant).
|
||
2. Le 1er device envoie un **message "membre finaliser"** qu’il signe.
|
||
3. Ce message doit aussi être signé par le 2e device.
|
||
4. Le 1er device **attend la signature du 2e device** sur ce contrat.
|
||
5. Une fois reçue, il l’ajoute aux signatures du contrat, vérifie que toutes les signatures attendues sont présentes, puis **publie le contrat sur le relais** (à nouveau), avec une **version incrémentée**.
|
||
6. Il garde la version (et le contrat) dans **IndexedDB**.
|
||
7. Quand tout est OK (flux signé du 2e reçu et traité) → afficher **"Connecté"** sur le 1er device.
|
||
|
||
### Deuxième device
|
||
|
||
1. Après "Associer le pair", le 2e device a ajouté la clé publique du 1er (pair distant).
|
||
2. Le 2e device envoie un **message "membre finalisé"** qu’il signe.
|
||
3. Il **envoie sa signature au 1er device** (via relais : message/clé/signature).
|
||
4. Il complète le contrat avec sa signature, **incrémente la version**, et le garde dans **IndexedDB**.
|
||
5. Quand tout est OK (flux signé du 1er reçu et traité) → afficher **"Connecté"** sur le 2e device.
|
||
|
||
## Impacts
|
||
|
||
- **Contrats** : format "membre finaliser" / "membre finalisé", validateurs, signatures multiples.
|
||
- **Relais** : publication message + signatures + clés (chiffrement, DH).
|
||
- **IndexedDB** : stockage des versions et des contrats signés.
|
||
- **Sync** : récupération des messages chiffrés, clés DH, déchiffrement, mise à jour du graphe et détection des confirmations croisées.
|
||
|
||
## Modalités de déploiement
|
||
|
||
- Déploiement classique du front userwallet.
|
||
- Les relais doivent exposer POST message, POST signatures, POST keys (déjà prévus).
|
||
- Aucune migration IndexedDB imposée pour l’existant tant que le protocole n’est pas implémenté.
|
||
|
||
## Modalités d’analyse
|
||
|
||
- Vérifier les logs (console) pour les pairs et contrats.
|
||
- Tester le parcours "Associer le pair" sur les deux devices puis vérifier l’affichage "Connecté" une fois les signatures croisées reçues et le contrat publié.
|
||
|
||
## Statut
|
||
|
||
- **Documentation** : présente.
|
||
- **Implémentation** : faite (message "membre finaliser", échange de signatures, publication relais, stockage IndexedDB, affichage "Connecté"). Version incrémentée : device 1 re-publie M2 (version "2") après réception de la signature du 2e. Détection au Sync : si device 1 a timeout au poll, un « Synchroniser maintenant » vérifie messages + signatures et enregistre la confirmation. **Chiffrement ECDH** : échange de clés publiques (QR/URL `pubkey`, formulaire « Clé du 2e »), `PairConfig.publicKey`, chiffrement `encryptWithECDH`, POST `MsgCle` (algo `AES-GCM-ECDH`, `df_ecdh_scannable` = clé du signataire), déchiffrement au fetch. Type "membre finalisé" (device 2) : non implémenté, les deux signent le même "membre finaliser". **Export/import** : `pairing_confirm` inclus dans l’export, restauré à l’import ; suppression (« Supprimer ») vide aussi `userwallet_pairing_confirm`.
|