tendermint/account/privkey.go

64 lines
1.4 KiB
Go

package account
import (
"errors"
"reflect"
"github.com/tendermint/go-ed25519"
. "github.com/tendermint/tendermint/binary"
. "github.com/tendermint/tendermint/common"
)
// PrivKey is part of PrivAccount and state.PrivValidator.
type PrivKey interface {
Sign(msg []byte) Signature
}
// Types of PrivKey implementations
const (
PrivKeyTypeEd25519 = byte(0x01)
)
//-------------------------------------
// For binary.readReflect
func PrivKeyDecoder(r Unreader, n *int64, err *error) interface{} {
switch t := PeekByte(r, n, err); t {
case PrivKeyTypeEd25519:
return ReadBinary(PrivKeyEd25519{}, r, n, err)
default:
*err = Errorf("Unknown PrivKey type %X", t)
return nil
}
}
var _ = RegisterType(&TypeInfo{
Type: reflect.TypeOf((*PrivKey)(nil)).Elem(),
Decoder: PrivKeyDecoder,
})
//-------------------------------------
// Implements PrivKey
type PrivKeyEd25519 struct {
PubKey []byte
PrivKey []byte
}
func (key PrivKeyEd25519) TypeByte() byte { return PrivKeyTypeEd25519 }
func (key PrivKeyEd25519) ValidateBasic() error {
if len(key.PubKey) != ed25519.PublicKeySize {
return errors.New("Invalid PrivKeyEd25519 pubkey size")
}
if len(key.PrivKey) != ed25519.PrivateKeySize {
return errors.New("Invalid PrivKeyEd25519 privkey size")
}
return nil
}
func (key PrivKeyEd25519) Sign(msg []byte) Signature {
signature := ed25519.SignMessage(msg, key.PrivKey, key.PubKey)
return SignatureEd25519{signature}
}