tendermint/account/priv_key.go

71 lines
1.8 KiB
Go
Raw Normal View History

package account
import (
2015-06-09 20:17:19 -07:00
"github.com/tendermint/tendermint/Godeps/_workspace/src/github.com/tendermint/ed25519"
2015-07-14 17:52:54 -07:00
"github.com/tendermint/tendermint/Godeps/_workspace/src/github.com/tendermint/ed25519/extra25519"
2015-07-25 15:45:45 -07:00
"github.com/tendermint/tendermint/wire"
2015-04-01 17:30:16 -07:00
. "github.com/tendermint/tendermint/common"
)
// PrivKey is part of PrivAccount and state.PrivValidator.
type PrivKey interface {
Sign(msg []byte) Signature
2015-01-13 21:03:01 -08:00
PubKey() PubKey
}
// Types of PrivKey implementations
const (
PrivKeyTypeEd25519 = byte(0x01)
)
2015-07-25 15:45:45 -07:00
// for wire.readReflect
var _ = wire.RegisterInterface(
struct{ PrivKey }{},
2015-07-25 15:45:45 -07:00
wire.ConcreteType{PrivKeyEd25519{}, PrivKeyTypeEd25519},
)
//-------------------------------------
// Implements PrivKey
2015-07-17 14:19:16 -07:00
type PrivKeyEd25519 [64]byte
2015-07-11 18:01:21 -07:00
func (key PrivKeyEd25519) Sign(msg []byte) Signature {
2015-07-17 14:19:16 -07:00
privKeyBytes := [64]byte(key)
signatureBytes := ed25519.Sign(&privKeyBytes, msg)
return SignatureEd25519(*signatureBytes)
}
2015-01-13 21:03:01 -08:00
2015-07-14 17:52:54 -07:00
func (privKey PrivKeyEd25519) PubKey() PubKey {
2015-07-17 14:19:16 -07:00
privKeyBytes := [64]byte(privKey)
return PubKeyEd25519(*ed25519.MakePublicKey(&privKeyBytes))
2015-07-14 17:52:54 -07:00
}
func (privKey PrivKeyEd25519) ToCurve25519() *[32]byte {
2015-07-17 14:19:16 -07:00
keyCurve25519 := new([32]byte)
privKeyBytes := [64]byte(privKey)
extra25519.PrivateKeyToCurve25519(keyCurve25519, &privKeyBytes)
2015-07-14 17:52:54 -07:00
return keyCurve25519
2015-01-13 21:03:01 -08:00
}
2015-01-16 00:31:34 -08:00
2015-07-14 17:52:54 -07:00
func (privKey PrivKeyEd25519) String() string {
2015-01-16 00:31:34 -08:00
return Fmt("PrivKeyEd25519{*****}")
}
2015-07-11 18:01:21 -07:00
// Deterministically generates new priv-key bytes from key.
func (key PrivKeyEd25519) Generate(index int) PrivKeyEd25519 {
2015-07-25 15:45:45 -07:00
newBytes := wire.BinarySha256(struct {
2015-07-17 14:19:16 -07:00
PrivKey [64]byte
2015-07-11 18:01:21 -07:00
Index int
}{key, index})
2015-07-17 14:19:16 -07:00
var newKey [64]byte
copy(newKey[:], newBytes)
return PrivKeyEd25519(newKey)
2015-07-11 18:01:21 -07:00
}
2015-07-16 00:55:04 -07:00
func GenPrivKeyEd25519() PrivKeyEd25519 {
privKeyBytes := new([64]byte)
copy(privKeyBytes[:32], CRandBytes(32))
ed25519.MakePublicKey(privKeyBytes)
2015-07-17 14:19:16 -07:00
return PrivKeyEd25519(*privKeyBytes)
}