/
keys.go
87 lines (72 loc) · 2.48 KB
/
keys.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package cmd
import (
"bufio"
"crypto/ecdsa"
"fmt"
cosmosFlags "github.com/cosmos/cosmos-sdk/client/flags"
"github.com/cosmos/cosmos-sdk/client/input"
sdkCrypto "github.com/cosmos/cosmos-sdk/crypto"
"github.com/cosmos/cosmos-sdk/crypto/keyring"
ethermintKeys "github.com/evmos/ethermint/client/keys"
"github.com/evmos/ethermint/crypto/ethsecp256k1"
evmoskr "github.com/evmos/evmos/v6/crypto/keyring"
"github.com/spf13/cobra"
)
func init() {
_rootCmd.AddCommand(ethermintKeys.Commands(_defaultNodeHome))
}
// This function receives a keyName with a cmd and retrieves its private key
// Please note that this is designed for `ethsecp256k1` algorithm
func getPrivateKeyFromCmd(cmd *cobra.Command, keyName string) (*ecdsa.PrivateKey, error) {
inBuf := bufio.NewReader(cmd.InOrStdin())
keyringBackend, _ := cmd.Flags().GetString(cosmosFlags.FlagKeyringBackend)
keyringDir, _ := cmd.Flags().GetString(cosmosFlags.FlagKeyringDir)
decryptPassword := ""
conf := true
var err error
switch keyringBackend {
case keyring.BackendFile:
decryptPassword, err = input.GetPassword(
"**WARNING this is unsafe, use it only for test**\nEnter key password:",
inBuf)
case keyring.BackendOS:
conf, err = input.GetConfirmation(
"**WARNING this is unsafe, use it only for test**\nEnter key password:",
inBuf, cmd.ErrOrStderr())
}
if err != nil || !conf {
return nil, err
}
return ExportPrivateKey(keyName, keyringBackend, keyringDir, decryptPassword, AppName, bufio.NewReader(cmd.InOrStdin()))
}
// This function receives keyName, keyringBackend, keyringDir, decryptPassword, appName
// and provides the private key
func ExportPrivateKey(keyName, keyringBackend, keyringDir, decryptPassword, appName string, inBuf *bufio.Reader) (*ecdsa.PrivateKey, error) {
kr, err := keyring.New(
appName,
keyringBackend,
keyringDir,
inBuf,
evmoskr.Option(),
)
if err != nil {
return nil, err
}
armor, err := kr.ExportPrivKeyArmor(keyName, decryptPassword)
if err != nil {
return nil, err
}
privKey, algo, err := sdkCrypto.UnarmorDecryptPrivKey(armor, decryptPassword)
if err != nil {
return nil, err
}
if algo != ethsecp256k1.KeyType {
return nil, fmt.Errorf("invalid key algorithm, got %s, expected %s", algo, ethsecp256k1.KeyType)
}
// Converts key to Ethermint secp256k1 implementation
ethPrivKey, ok := privKey.(*ethsecp256k1.PrivKey)
if !ok {
return nil, fmt.Errorf("invalid private key type %T, expected %T", privKey, ðsecp256k1.PrivKey{})
}
return ethPrivKey.ToECDSA()
}