// Lock will erase all keys from memory and prevent the wallet from spending // coins until it is unlocked. func (w *Wallet) Lock() error { lockID := w.mu.RLock() defer w.mu.RUnlock(lockID) if !w.unlocked { return modules.ErrLockedWallet } w.log.Println("INFO: Locking wallet.") // Wipe all of the seeds and secret keys, they will be replaced upon // calling 'Unlock' again. 'for i := range' must be used to prevent copies // of secret data from being made. for i := range w.keys { for j := range w.keys[i].secretKeys { crypto.SecureWipe(w.keys[i].secretKeys[j][:]) } } for i := range w.seeds { crypto.SecureWipe(w.seeds[i][:]) } crypto.SecureWipe(w.primarySeed[:]) w.seeds = w.seeds[:0] w.unlocked = false // Save the wallet data. err := w.saveSettings() if err != nil { return err } return nil }
// wipeSecrets erases all of the seeds and secret keys in the wallet. func (w *Wallet) wipeSecrets() { // 'for i := range' must be used to prevent copies of secret data from // being made. for i := range w.keys { for j := range w.keys[i].SecretKeys { crypto.SecureWipe(w.keys[i].SecretKeys[j][:]) } } for i := range w.seeds { crypto.SecureWipe(w.seeds[i][:]) } crypto.SecureWipe(w.primarySeed[:]) w.seeds = w.seeds[:0] }