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, error) } // GenFunc is a helper to transform a function into a Generator type GenFunc func(secret []byte) (crypto.PrivKey, error) func (f GenFunc) Generate(secret []byte) (crypto.PrivKey, error) { return f(secret) } func genEd25519(secret []byte) (crypto.PrivKey, error) { key := crypto.GenPrivKeyEd25519FromSecret(secret).Wrap() return key, nil } func genSecp256(secret []byte) (crypto.PrivKey, error) { key := crypto.GenPrivKeySecp256k1FromSecret(secret).Wrap() return key, nil } // secret is completely ignored for the ledger... // just for interface compatibility func genLedger(secret []byte) (crypto.PrivKey, error) { return nano.NewPrivKeyLedger() } type genInvalidByte struct { typ byte } func (g genInvalidByte) Generate(secret []byte) (crypto.PrivKey, error) { err := errors.Errorf("Cannot generate keys for algorithm: %X", g.typ) return crypto.PrivKey{}, err } type genInvalidAlgo struct { algo string } func (g genInvalidAlgo) Generate(secret []byte) (crypto.PrivKey, error) { err := errors.Errorf("Cannot generate keys for algorithm: %s", g.algo) return crypto.PrivKey{}, err } func getGenerator(algo string) Generator { switch algo { case crypto.NameEd25519: return GenEd25519 case crypto.NameSecp256k1: return GenSecp256k1 case nano.NameLedgerEd25519: return GenLedger default: return genInvalidAlgo{algo} } } func getGeneratorByType(typ byte) Generator { switch typ { case crypto.TypeEd25519: return GenEd25519 case crypto.TypeSecp256k1: return GenSecp256k1 case nano.TypeLedgerEd25519: return GenLedger default: return genInvalidByte{typ} } }