Extract real wallet SDK keys instead of generating random credentials

**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
This commit is contained in:
NicolasCantu 2025-10-29 22:38:46 +01:00
parent 3ee99dea5a
commit 930b46fa00
2 changed files with 54 additions and 10 deletions

View File

@ -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()

View File

@ -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');