func arm_stealth(p string) { var buf, b2 [256]byte create := p != "" fmt.Print("Enter seed password of the stealth key (empty line to abort) : ") le := sys.ReadPassword(buf[:]) if le <= 0 { fmt.Println("Aborted") return } if create { fmt.Print("Re-enter the seed password : "******"The passwords you entered do not match") return } } nw := make([]byte, 32) btc.ShaHash(buf[:le], nw) // seed sys.ClearBuffer(buf[:le]) btc.ShaHash(nw, nw) // 1st key wallet.ArmedStealthSecrets = append(wallet.ArmedStealthSecrets, nw) if create { fmt.Println("You have created a new stealth scan-key. Make sure to not forget this password!") pk := btc.PublicFromPrivate(nw, true) fmt.Println("Public hexdump:", hex.EncodeToString(pk)) fmt.Println(" Go to your wallet machine and execute:") fmt.Println(" wallet -scankey", hex.EncodeToString(pk), "-prefix 0") fmt.Println(" (change the prefix to a different value if you want)") } fmt.Println("Stealth key number", len(wallet.ArmedStealthSecrets)-1, "has been stored in memory") fmt.Println("Reloading the current wallet...") usif.ExecUiReq(&usif.OneUiReq{Handler: func(p string) { wallet.LoadWallet(wallet.MyWallet.FileName) }}) show_prompt = false }
func getpass() []byte { var pass [1024]byte var n int var e error var f *os.File if !*ask4pass { f, e = os.Open(PassSeedFilename) if e == nil { n, e = f.Read(pass[:]) f.Close() if n <= 0 { return nil } goto check_pass } fmt.Println("Seed file", PassSeedFilename, "not found") } fmt.Print("Enter your wallet's seed password: "******"" { if !*singleask { fmt.Print("Re-enter the seed password (to be sure): ") var pass2 [1024]byte p2len := sys.ReadPassword(pass2[:]) if p2len != n || !bytes.Equal(pass[:n], pass2[:p2len]) { sys.ClearBuffer(pass[:n]) sys.ClearBuffer(pass2[:p2len]) println("The two passwords you entered do not match") return nil } sys.ClearBuffer(pass2[:p2len]) } if *list { // Maybe he wants to save the password? if ask_yes_no("Save the password on disk, so you won't be asked for it later?") { e = ioutil.WriteFile(PassSeedFilename, pass[:n], 0600) if e != nil { fmt.Println("WARNING: Could not save the password", e.Error()) } else { fmt.Println("The seed password has been stored in", PassSeedFilename) } } } } check_pass: for i := 0; i < n; i++ { if pass[i] < ' ' || pass[i] > 126 { fmt.Println("WARNING: Your secret contains non-printable characters") break } } outpass := make([]byte, n+len(secret_seed)) if len(secret_seed) > 0 { copy(outpass, secret_seed) } copy(outpass[len(secret_seed):], pass[:n]) sys.ClearBuffer(pass[:n]) return outpass }
// Input the password (that is the secret seed to your wallet) func getseed(seed []byte) bool { var pass [1024]byte var n int var e error var f *os.File if !*ask4pass { f, e = os.Open(PassSeedFilename) if e == nil { n, e = f.Read(pass[:]) f.Close() if n <= 0 { return false } goto calc_seed } fmt.Println("Seed file", PassSeedFilename, "not found") } fmt.Print("Enter your wallet's seed password: "******"" { if !*singleask { fmt.Print("Re-enter the seed password (to be sure): ") var pass2 [1024]byte p2len := sys.ReadPassword(pass2[:]) if p2len != n || !bytes.Equal(pass[:n], pass2[:p2len]) { sys.ClearBuffer(pass2[:p2len]) println("The two passwords you entered do not match") return false } sys.ClearBuffer(pass2[:p2len]) } if *dump { // Maybe he wants to save the password? if ask_yes_no("Save the password on disk, so you won't be asked for it later?") { e = ioutil.WriteFile(PassSeedFilename, pass[:n], 0600) if e != nil { fmt.Println("WARNING: Could not save the password", e.Error()) } else { fmt.Println("The seed password has been stored in", PassSeedFilename) } } } } calc_seed: for i := 0; i < n; i++ { if pass[i] < ' ' || pass[i] > 126 { fmt.Println("WARNING: Your secret contains non-printable characters") break } } if len(secret_seed) > 0 { x := append(secret_seed, pass[:n]...) sys.ClearBuffer(secret_seed) btc.ShaHash(x, seed) sys.ClearBuffer(x) } else { btc.ShaHash(pass[:n], seed) } sys.ClearBuffer(pass[:n]) return true }