소스 검색

refuse to overwrite the master key of a previously initialized card

Guillaume Ballet 6 년 전
부모
커밋
79f4cfac2e
1개의 변경된 파일15개의 추가작업 그리고 3개의 파일을 삭제
  1. 15 3
      accounts/scwallet/wallet.go

+ 15 - 3
accounts/scwallet/wallet.go

@@ -589,9 +589,8 @@ func (w *Wallet) Contains(account accounts.Account) bool {
 
 // Initialize installs a keypair generated from the provided key into the wallet.
 func (w *Wallet) Initialize(seed []byte) error {
-	w.lock.Lock()
-	defer w.lock.Unlock()
-
+	// DO NOT lock at this stage, as the initialize
+	// function relies on Status()
 	return w.session.initialize(seed)
 }
 
@@ -877,6 +876,19 @@ type initializeData struct {
 
 // initialize initializes the card with new key data.
 func (s *Session) initialize(seed []byte) error {
+	// Check that the wallet isn't currently initialized,
+	// otherwise the key would be overwritten.
+	status, err := s.Wallet.Status()
+	if err != nil {
+		return err
+	}
+	if status == "Online" {
+		return fmt.Errorf("card is already initialized, cowardly refusing to proceed")
+	}
+
+	s.Wallet.lock.Lock()
+	defer s.Wallet.lock.Unlock()
+
 	// HMAC the seed to produce the private key and chain code
 	mac := hmac.New(sha512.New, []byte("Bitcoin seed"))
 	mac.Write(seed)