package cryptostore import ( "github.com/pkg/errors" crypto "github.com/tendermint/go-crypto" "github.com/tendermint/go-crypto/nano" ) var ( // GenEd25519 produces Ed25519 private keys GenEd25519 Generator = GenFunc(genEd25519) // GenSecp256k1 produces Secp256k1 private keys GenSecp256k1 Generator = GenFunc(genSecp256) // GenLedger used Ed25519 keys stored on nano ledger s with cosmos app GenLedger Generator = GenFunc(genLedger) ) // Generator determines the type of private key the keystore creates type Generator interface { Generate(secret []byte) crypto.PrivKey } // GenFunc is a helper to transform a function into a Generator type GenFunc func(secret []byte) crypto.PrivKey func (f GenFunc) Generate(secret []byte) crypto.PrivKey { return f(secret) } func genEd25519(secret []byte) crypto.PrivKey { return crypto.GenPrivKeyEd25519FromSecret(secret).Wrap() } func genSecp256(secret []byte) crypto.PrivKey { return crypto.GenPrivKeySecp256k1FromSecret(secret).Wrap() } // secret is completely ignored for the ledger... // just for interface compatibility func genLedger(secret []byte) crypto.PrivKey { key, err := nano.NewPrivKeyLedger() if err != nil { // TODO: cleaner error handling panic(err) } return key } func getGenerator(algo string) (Generator, error) { switch algo { case crypto.NameEd25519: return GenEd25519, nil case crypto.NameSecp256k1: return GenSecp256k1, nil case nano.NameLedger: return GenLedger, nil default: return nil, errors.Errorf("Cannot generate keys for algorithm: %s", algo) } } func getGeneratorByType(typ byte) (Generator, error) { switch typ { case crypto.TypeEd25519: return GenEd25519, nil case crypto.TypeSecp256k1: return GenSecp256k1, nil case nano.TypeLedger: return GenLedger, nil default: return nil, errors.Errorf("Cannot generate keys for algorithm: %X", typ) } }