4 "github.com/pkg/errors"
5 crypto "github.com/tendermint/go-crypto"
6 "github.com/tendermint/go-crypto/nano"
10 // GenEd25519 produces Ed25519 private keys
11 GenEd25519 Generator = GenFunc(genEd25519)
12 // GenSecp256k1 produces Secp256k1 private keys
13 GenSecp256k1 Generator = GenFunc(genSecp256)
14 // GenLedgerEd25519 used Ed25519 keys stored on nano ledger s with cosmos app
15 GenLedgerEd25519 Generator = GenFunc(genLedgerEd25519)
18 // Generator determines the type of private key the keystore creates
19 type Generator interface {
20 Generate(secret []byte) (crypto.PrivKey, error)
23 // GenFunc is a helper to transform a function into a Generator
24 type GenFunc func(secret []byte) (crypto.PrivKey, error)
26 func (f GenFunc) Generate(secret []byte) (crypto.PrivKey, error) {
30 func genEd25519(secret []byte) (crypto.PrivKey, error) {
31 key := crypto.GenPrivKeyEd25519FromSecret(secret).Wrap()
35 func genSecp256(secret []byte) (crypto.PrivKey, error) {
36 key := crypto.GenPrivKeySecp256k1FromSecret(secret).Wrap()
40 // secret is completely ignored for the ledger...
41 // just for interface compatibility
42 func genLedgerEd25519(secret []byte) (crypto.PrivKey, error) {
43 return nano.NewPrivKeyLedgerEd25519Ed25519()
46 type genInvalidByte struct {
50 func (g genInvalidByte) Generate(secret []byte) (crypto.PrivKey, error) {
51 err := errors.Errorf("Cannot generate keys for algorithm: %X", g.typ)
52 return crypto.PrivKey{}, err
55 type genInvalidAlgo struct {
59 func (g genInvalidAlgo) Generate(secret []byte) (crypto.PrivKey, error) {
60 err := errors.Errorf("Cannot generate keys for algorithm: %s", g.algo)
61 return crypto.PrivKey{}, err
64 func getGenerator(algo string) Generator {
66 case crypto.NameEd25519:
68 case crypto.NameSecp256k1:
70 case nano.NameLedgerEd25519:
71 return GenLedgerEd25519
73 return genInvalidAlgo{algo}
77 func getGeneratorByType(typ byte) Generator {
79 case crypto.TypeEd25519:
81 case crypto.TypeSecp256k1:
83 case nano.TypeLedgerEd25519:
84 return GenLedgerEd25519
86 return genInvalidByte{typ}