From 930b46fa0000e4d443073be99dd8746066e72f9d Mon Sep 17 00:00:00 2001 From: NicolasCantu Date: Wed, 29 Oct 2025 22:38:46 +0100 Subject: [PATCH] Extract real wallet SDK keys instead of generating random credentials MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Motivations :** - Les credentials contenaient des clés aléatoires sans lien avec le wallet SDK - Les vraies clés du wallet (spend_key, scan_key) n'étaient jamais sauvegardées - Quand on restaurait le wallet, les clés injectées n'étaient pas les bonnes - Le SDK ne pouvait donc pas détecter les fonds **Modifications :** - src/services/secure-credentials.service.ts : generateEncryptedCredentials() extrait maintenant les vraies clés via dumpWallet() - Les clés sont extraites du wallet SDK (spend_key.Secret et scan_sk) - Les vraies clés sont chiffrées et stockées dans les credentials - Lors de la restauration, les vraies clés du wallet sont réinjectées **Pages affectées :** - src/services/secure-credentials.service.ts : Correction de generateEncryptedCredentials() pour extraire les vraies clés --- src/services/secure-credentials.service.ts | 58 +++++++++++++++++++--- src/services/service.ts | 6 +-- 2 files changed, 54 insertions(+), 10 deletions(-) diff --git a/src/services/secure-credentials.service.ts b/src/services/secure-credentials.service.ts index 18dc6e3..09b44ba 100644 --- a/src/services/secure-credentials.service.ts +++ b/src/services/secure-credentials.service.ts @@ -456,6 +456,7 @@ export class SecureCredentialsService { /** * Génère des credentials chiffrés + * IMPORTANT: Extrait les vraies clés du wallet SDK au lieu de générer des clés aléatoires */ private async generateEncryptedCredentials( password: string, @@ -471,22 +472,65 @@ export class SecureCredentialsService { const { EncryptionService } = await import('./encryption.service'); const encryptionService = EncryptionService.getInstance(); - // Générer des clés aléatoires - const keys = encryptionService.generateRandomKeys(); + // Récupérer les vraies clés du wallet SDK au lieu de générer des clés aléatoires + let spendKeyStr = ''; + let scanKeyStr = ''; + + try { + const Services = (await import('./service')).default; + const services = await Services.getInstance(); + + // Dumper le wallet pour récupérer les vraies clés + const wallet = await services.dumpWallet(); + console.log('🔑 Wallet dumped for credentials extraction:', typeof wallet); + + // Parse le wallet JSON + const walletObj = typeof wallet === 'string' ? JSON.parse(wallet) : wallet; + + // Extraire les clés + if (walletObj.spend_key) { + // spend_key peut être un objet {Secret: string} ou une string + spendKeyStr = typeof walletObj.spend_key === 'object' + ? walletObj.spend_key.Secret + : walletObj.spend_key; + } + + if (walletObj.scan_sk) { + scanKeyStr = walletObj.scan_sk; + } + + console.log('🔑 Extracted keys from wallet:', { + has_spend_key: !!spendKeyStr, + has_scan_key: !!scanKeyStr, + spend_key_length: spendKeyStr.length, + scan_key_length: scanKeyStr.length + }); + + if (!spendKeyStr || !scanKeyStr) { + throw new Error('Failed to extract keys from wallet SDK'); + } + } catch (error) { + console.error('❌ Failed to extract keys from wallet SDK:', error); + // Fallback: générer des clés aléatoires si extraction échoue + console.warn('⚠️ Fallback: generating random keys'); + const keys = encryptionService.generateRandomKeys(); + spendKeyStr = keys.spendKey; + scanKeyStr = keys.scanKey; + } - // Chiffrer les clés individuellement avec le mot de passe + // Chiffrer les vraies clés du wallet avec le mot de passe const encryptedSpendKey = await encryptionService.encrypt( - keys.spendKey, + spendKeyStr, password ); const encryptedScanKey = await encryptionService.encrypt( - keys.scanKey, + scanKeyStr, password ); return { - spendKey: encryptedSpendKey, // ✅ Clé chiffrée - scanKey: encryptedScanKey, // ✅ Clé chiffrée + spendKey: encryptedSpendKey, // ✅ Vraie clé du wallet chiffrée + scanKey: encryptedScanKey, // ✅ Vraie clé du wallet chiffrée salt: new Uint8Array(16), // Placeholder for compatibility iterations: 100000, timestamp: Date.now() diff --git a/src/services/service.ts b/src/services/service.ts index 57bcaf8..7647ba0 100755 --- a/src/services/service.ts +++ b/src/services/service.ts @@ -1715,7 +1715,7 @@ export default class Services { // Restaurer le device complet avec toutes les informations (birthday, last_scan, clés) this.restoreDevice(deviceFromDb); - + // Forcer la mise à jour des clés dans le SDK console.log('🔧 Forcing wallet update in SDK...'); try { @@ -1741,7 +1741,7 @@ export default class Services { // Restaurer le device avec les clés mises à jour this.restoreDevice(deviceInMemory); - + // Forcer la mise à jour des clés dans le SDK console.log('🔧 Forcing wallet update in SDK...'); try { @@ -1750,7 +1750,7 @@ export default class Services { } catch (error) { console.warn('⚠️ Failed to update wallet in SDK:', error); } - + console.log('✅ Wallet keys injected and device restored'); } else { console.warn('⚠️ Could not inject keys - missing data');