@@ -4,53 +4,86 @@ import (
4
4
"github.com/pkg/errors"
5
5
6
6
crypto "github.com/tendermint/go-crypto"
7
+ "github.com/tendermint/go-crypto/nano"
7
8
)
8
9
9
10
var (
10
11
// GenEd25519 produces Ed25519 private keys
11
12
GenEd25519 Generator = GenFunc (genEd25519 )
12
13
// GenSecp256k1 produces Secp256k1 private keys
13
14
GenSecp256k1 Generator = GenFunc (genSecp256 )
15
+ // GenLedgerEd25519 used Ed25519 keys stored on nano ledger s with cosmos app
16
+ GenLedgerEd25519 Generator = GenFunc (genLedgerEd25519 )
14
17
)
15
18
16
19
// Generator determines the type of private key the keystore creates
17
20
type Generator interface {
18
- Generate (secret []byte ) crypto.PrivKey
21
+ Generate (secret []byte ) ( crypto.PrivKey , error )
19
22
}
20
23
21
24
// GenFunc is a helper to transform a function into a Generator
22
- type GenFunc func (secret []byte ) crypto.PrivKey
25
+ type GenFunc func (secret []byte ) ( crypto.PrivKey , error )
23
26
24
- func (f GenFunc ) Generate (secret []byte ) crypto.PrivKey {
27
+ func (f GenFunc ) Generate (secret []byte ) ( crypto.PrivKey , error ) {
25
28
return f (secret )
26
29
}
27
30
28
- func genEd25519 (secret []byte ) crypto.PrivKey {
29
- return crypto .GenPrivKeyEd25519FromSecret (secret ).Wrap ()
31
+ func genEd25519 (secret []byte ) (crypto.PrivKey , error ) {
32
+ key := crypto .GenPrivKeyEd25519FromSecret (secret ).Wrap ()
33
+ return key , nil
30
34
}
31
35
32
- func genSecp256 (secret []byte ) crypto.PrivKey {
33
- return crypto .GenPrivKeySecp256k1FromSecret (secret ).Wrap ()
36
+ func genSecp256 (secret []byte ) (crypto.PrivKey , error ) {
37
+ key := crypto .GenPrivKeySecp256k1FromSecret (secret ).Wrap ()
38
+ return key , nil
34
39
}
35
40
36
- func getGenerator (algo string ) (Generator , error ) {
41
+ // secret is completely ignored for the ledger...
42
+ // just for interface compatibility
43
+ func genLedgerEd25519 (secret []byte ) (crypto.PrivKey , error ) {
44
+ return nano .NewPrivKeyLedgerEd25519Ed25519 ()
45
+ }
46
+
47
+ type genInvalidByte struct {
48
+ typ byte
49
+ }
50
+
51
+ func (g genInvalidByte ) Generate (secret []byte ) (crypto.PrivKey , error ) {
52
+ err := errors .Errorf ("Cannot generate keys for algorithm: %X" , g .typ )
53
+ return crypto.PrivKey {}, err
54
+ }
55
+
56
+ type genInvalidAlgo struct {
57
+ algo string
58
+ }
59
+
60
+ func (g genInvalidAlgo ) Generate (secret []byte ) (crypto.PrivKey , error ) {
61
+ err := errors .Errorf ("Cannot generate keys for algorithm: %s" , g .algo )
62
+ return crypto.PrivKey {}, err
63
+ }
64
+
65
+ func getGenerator (algo string ) Generator {
37
66
switch algo {
38
67
case crypto .NameEd25519 :
39
- return GenEd25519 , nil
68
+ return GenEd25519
40
69
case crypto .NameSecp256k1 :
41
- return GenSecp256k1 , nil
70
+ return GenSecp256k1
71
+ case nano .NameLedgerEd25519 :
72
+ return GenLedgerEd25519
42
73
default :
43
- return nil , errors . Errorf ( "Cannot generate keys for algorithm: %s" , algo )
74
+ return genInvalidAlgo { algo }
44
75
}
45
76
}
46
77
47
- func getGeneratorByType (typ byte ) ( Generator , error ) {
78
+ func getGeneratorByType (typ byte ) Generator {
48
79
switch typ {
49
80
case crypto .TypeEd25519 :
50
- return GenEd25519 , nil
81
+ return GenEd25519
51
82
case crypto .TypeSecp256k1 :
52
- return GenSecp256k1 , nil
83
+ return GenSecp256k1
84
+ case nano .TypeLedgerEd25519 :
85
+ return GenLedgerEd25519
53
86
default :
54
- return nil , errors . Errorf ( "Cannot generate keys for algorithm: %X" , typ )
87
+ return genInvalidByte { typ }
55
88
}
56
89
}
0 commit comments