75 lines
1.7 KiB
Go
75 lines
1.7 KiB
Go
|
package key
|
||
|
|
||
|
import (
|
||
|
"crypto/ecdsa"
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/nspcc-dev/neo-go/cli/flags"
|
||
|
"github.com/nspcc-dev/neo-go/cli/input"
|
||
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||
|
"github.com/nspcc-dev/neo-go/pkg/wallet"
|
||
|
"github.com/spf13/viper"
|
||
|
)
|
||
|
|
||
|
// Key-related errors.
|
||
|
var (
|
||
|
ErrInvalidKey = errors.New("provided key is incorrect")
|
||
|
ErrInvalidAddress = errors.New("--address option must be specified and valid")
|
||
|
ErrInvalidPassword = errors.New("invalid password for the encrypted key")
|
||
|
)
|
||
|
|
||
|
// FromWallet returns private key of the wallet account.
|
||
|
func FromWallet(w *wallet.Wallet, addrStr string) (*ecdsa.PrivateKey, error) {
|
||
|
var (
|
||
|
addr util.Uint160
|
||
|
err error
|
||
|
)
|
||
|
|
||
|
if addrStr == "" {
|
||
|
printVerbose("Using default wallet address")
|
||
|
addr = w.GetChangeAddress()
|
||
|
} else {
|
||
|
addr, err = flags.ParseAddress(addrStr)
|
||
|
if err != nil {
|
||
|
printVerbose("Can't parse address: %s", addrStr)
|
||
|
return nil, ErrInvalidAddress
|
||
|
}
|
||
|
}
|
||
|
|
||
|
acc := w.GetAccount(addr)
|
||
|
if acc == nil {
|
||
|
printVerbose("Can't find wallet account for %s", addrStr)
|
||
|
return nil, ErrInvalidAddress
|
||
|
}
|
||
|
|
||
|
pass, err := getPassword()
|
||
|
if err != nil {
|
||
|
printVerbose("Can't read password: %v", err)
|
||
|
return nil, ErrInvalidPassword
|
||
|
}
|
||
|
|
||
|
if err := acc.Decrypt(pass, keys.NEP2ScryptParams()); err != nil {
|
||
|
printVerbose("Can't decrypt account: %v", err)
|
||
|
return nil, ErrInvalidPassword
|
||
|
}
|
||
|
|
||
|
return &acc.PrivateKey().PrivateKey, nil
|
||
|
}
|
||
|
|
||
|
func getPassword() (string, error) {
|
||
|
// this check allows empty passwords
|
||
|
if viper.IsSet("password") {
|
||
|
return viper.GetString("password"), nil
|
||
|
}
|
||
|
|
||
|
return input.ReadPassword("Enter password > ")
|
||
|
}
|
||
|
|
||
|
func printVerbose(format string, a ...interface{}) {
|
||
|
if viper.GetBool("verbose") {
|
||
|
fmt.Printf(format+"\n", a...)
|
||
|
}
|
||
|
}
|