tendermint/keys/cryptostore/generator.go

90 lines
2.2 KiB
Go
Raw Normal View History

package cryptostore
2017-02-28 19:43:18 +01:00
import (
"github.com/pkg/errors"
2017-02-28 19:43:18 +01:00
crypto "github.com/tendermint/go-crypto"
2017-09-13 12:41:54 +02:00
"github.com/tendermint/go-crypto/nano"
2017-02-28 19:43:18 +01:00
)
var (
// GenEd25519 produces Ed25519 private keys
GenEd25519 Generator = GenFunc(genEd25519)
// GenSecp256k1 produces Secp256k1 private keys
GenSecp256k1 Generator = GenFunc(genSecp256)
2017-10-24 11:23:09 +02:00
// GenLedgerEd25519 used Ed25519 keys stored on nano ledger s with cosmos app
GenLedgerEd25519 Generator = GenFunc(genLedgerEd25519)
)
// 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
}
2017-02-28 19:43:18 +01:00
2017-09-13 12:41:54 +02:00
// secret is completely ignored for the ledger...
// just for interface compatibility
2017-10-24 11:23:09 +02:00
func genLedgerEd25519(secret []byte) (crypto.PrivKey, error) {
return nano.NewPrivKeyLedgerEd25519Ed25519()
}
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
2017-09-13 12:41:54 +02:00
}
func getGenerator(algo string) Generator {
2017-02-28 19:43:18 +01:00
switch algo {
case crypto.NameEd25519:
return GenEd25519
2017-02-28 19:43:18 +01:00
case crypto.NameSecp256k1:
return GenSecp256k1
2017-10-23 16:38:57 +02:00
case nano.NameLedgerEd25519:
2017-10-24 11:23:09 +02:00
return GenLedgerEd25519
2017-02-28 19:43:18 +01:00
default:
return genInvalidAlgo{algo}
2017-02-28 19:43:18 +01:00
}
}
2017-07-22 05:53:46 -04:00
func getGeneratorByType(typ byte) Generator {
2017-07-22 05:53:46 -04:00
switch typ {
case crypto.TypeEd25519:
return GenEd25519
2017-07-22 05:53:46 -04:00
case crypto.TypeSecp256k1:
return GenSecp256k1
2017-10-23 16:38:57 +02:00
case nano.TypeLedgerEd25519:
2017-10-24 11:23:09 +02:00
return GenLedgerEd25519
2017-07-22 05:53:46 -04:00
default:
return genInvalidByte{typ}
2017-07-22 05:53:46 -04:00
}
}