mirror of
https://github.com/fluencelabs/tendermint
synced 2025-04-25 23:02:16 +00:00
Remove error from priv.PubKey() (#131)
* Remove error from priv.PubKey() * Update changelog
This commit is contained in:
parent
42c6a64e04
commit
8e273220a3
@ -1,5 +1,11 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 0.9.0
|
||||||
|
|
||||||
|
BREAKING CHANGES
|
||||||
|
|
||||||
|
- `priv.PubKey()` no longer returns an error. Any applicable errors (such as when fetching the public key from a hardware wallet) should be checked and returned when constructing the private key.
|
||||||
|
|
||||||
## 0.8.0
|
## 0.8.0
|
||||||
|
|
||||||
**TBD**
|
**TBD**
|
||||||
|
8
Gopkg.lock
generated
8
Gopkg.lock
generated
@ -99,8 +99,8 @@
|
|||||||
"assert",
|
"assert",
|
||||||
"require"
|
"require"
|
||||||
]
|
]
|
||||||
revision = "12b6f73e6084dad08a7c6e575284b177ecafbc71"
|
revision = "f35b8ab0b5a2cef36673838d662e249dd9c94686"
|
||||||
version = "v1.2.1"
|
version = "v1.2.2"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
@ -181,11 +181,11 @@
|
|||||||
branch = "master"
|
branch = "master"
|
||||||
name = "golang.org/x/sys"
|
name = "golang.org/x/sys"
|
||||||
packages = ["cpu"]
|
packages = ["cpu"]
|
||||||
revision = "9527bec2660bd847c050fda93a0f0c6dee0800bb"
|
revision = "a9e25c09b96b8870693763211309e213c6ef299d"
|
||||||
|
|
||||||
[solve-meta]
|
[solve-meta]
|
||||||
analyzer-name = "dep"
|
analyzer-name = "dep"
|
||||||
analyzer-version = 1
|
analyzer-version = 1
|
||||||
inputs-digest = "f20e34cd998442d4ffe2f9aa45ab87a55ba6e4cd19f29009adaadac3b5dccf26"
|
inputs-digest = "1731880d432026bbd22865582cf7c7dd6d5c65618149de586e30ce156d338c01"
|
||||||
solver-name = "gps-cdcl"
|
solver-name = "gps-cdcl"
|
||||||
solver-version = 1
|
solver-version = 1
|
||||||
|
@ -91,8 +91,7 @@ func TestKeyEncodings(t *testing.T) {
|
|||||||
assert.EqualValues(t, sig1, sig3)
|
assert.EqualValues(t, sig1, sig3)
|
||||||
|
|
||||||
// Check (de/en)codings of PubKeys.
|
// Check (de/en)codings of PubKeys.
|
||||||
pubKey, err := tc.privKey.PubKey()
|
pubKey := tc.privKey.PubKey()
|
||||||
assert.NoError(t, err)
|
|
||||||
var pub2, pub3 PubKey
|
var pub2, pub3 PubKey
|
||||||
checkAminoBinary(t, pubKey, &pub2, tc.pubSize)
|
checkAminoBinary(t, pubKey, &pub2, tc.pubSize)
|
||||||
assert.EqualValues(t, pubKey, pub2)
|
assert.EqualValues(t, pubKey, pub2)
|
||||||
|
@ -68,10 +68,7 @@ func (kb dbKeybase) CreateLedger(name string, path crypto.DerivationPath, algo S
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
pub, err := priv.PubKey()
|
pub := priv.PubKey()
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return kb.writeLedgerKey(pub, path, name), nil
|
return kb.writeLedgerKey(pub, path, name), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -169,10 +166,7 @@ func (kb dbKeybase) Sign(name, passphrase string, msg []byte) (sig crypto.Signat
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
pub, err = priv.PubKey()
|
pub = priv.PubKey()
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
return sig, pub, nil
|
return sig, pub, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -290,10 +284,7 @@ func (kb dbKeybase) writeLocalKey(priv crypto.PrivKey, name, passphrase string)
|
|||||||
// encrypt private key using passphrase
|
// encrypt private key using passphrase
|
||||||
privArmor := encryptArmorPrivKey(priv, passphrase)
|
privArmor := encryptArmorPrivKey(priv, passphrase)
|
||||||
// make Info
|
// make Info
|
||||||
pub, err := priv.PubKey()
|
pub := priv.PubKey()
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
info := newLocalInfo(name, pub, privArmor)
|
info := newLocalInfo(name, pub, privArmor)
|
||||||
kb.writeInfo(info, name)
|
kb.writeInfo(info, name)
|
||||||
return info
|
return info
|
||||||
|
@ -70,8 +70,7 @@ func TestKeyManagement(t *testing.T) {
|
|||||||
// create an offline key
|
// create an offline key
|
||||||
o1 := "offline"
|
o1 := "offline"
|
||||||
priv1 := crypto.GenPrivKeyEd25519()
|
priv1 := crypto.GenPrivKeyEd25519()
|
||||||
pub1, err := priv1.PubKey()
|
pub1 := priv1.PubKey()
|
||||||
require.Nil(t, err)
|
|
||||||
i, err = cstore.CreateOffline(o1, pub1)
|
i, err = cstore.CreateOffline(o1, pub1)
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
require.Equal(t, pub1, i.GetPubKey())
|
require.Equal(t, pub1, i.GetPubKey())
|
||||||
|
@ -44,10 +44,12 @@ type PrivKeyLedgerSecp256k1 struct {
|
|||||||
func NewPrivKeyLedgerSecp256k1(path DerivationPath) (PrivKey, error) {
|
func NewPrivKeyLedgerSecp256k1(path DerivationPath) (PrivKey, error) {
|
||||||
var pk PrivKeyLedgerSecp256k1
|
var pk PrivKeyLedgerSecp256k1
|
||||||
pk.Path = path
|
pk.Path = path
|
||||||
// getPubKey will cache the pubkey for later use,
|
// cache the pubkey for later use
|
||||||
// this allows us to return an error early if the ledger
|
pubKey, err := pk.getPubKey()
|
||||||
// is not plugged in
|
if err != nil {
|
||||||
_, err := pk.getPubKey()
|
return nil, err
|
||||||
|
}
|
||||||
|
pk.CachedPubKey = pubKey
|
||||||
return &pk, err
|
return &pk, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,8 +57,7 @@ func NewPrivKeyLedgerSecp256k1(path DerivationPath) (PrivKey, error) {
|
|||||||
// after loading it from disk
|
// after loading it from disk
|
||||||
func (pk PrivKeyLedgerSecp256k1) ValidateKey() error {
|
func (pk PrivKeyLedgerSecp256k1) ValidateKey() error {
|
||||||
// getPubKey will return an error if the ledger is not
|
// getPubKey will return an error if the ledger is not
|
||||||
// properly set up...
|
pub, err := pk.getPubKey()
|
||||||
pub, err := pk.forceGetPubKey()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -86,45 +87,22 @@ func (pk PrivKeyLedgerSecp256k1) Sign(msg []byte) (Signature, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
sig, err := signLedgerSecp256k1(dev, pk.Path, msg)
|
sig, err := signLedgerSecp256k1(dev, pk.Path, msg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
pub, err := pubkeyLedgerSecp256k1(dev, pk.Path)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// if we have no pubkey yet, store it for future queries
|
|
||||||
if pk.CachedPubKey == nil {
|
|
||||||
pk.CachedPubKey = pub
|
|
||||||
} else if !pk.CachedPubKey.Equals(pub) {
|
|
||||||
return nil, fmt.Errorf("stored key does not match signing key")
|
|
||||||
}
|
|
||||||
return sig, nil
|
return sig, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// PubKey returns the stored PubKey
|
// PubKey returns the stored PubKey
|
||||||
func (pk PrivKeyLedgerSecp256k1) PubKey() (PubKey, error) {
|
func (pk PrivKeyLedgerSecp256k1) PubKey() PubKey {
|
||||||
return pk.getPubKey()
|
return pk.CachedPubKey
|
||||||
}
|
}
|
||||||
|
|
||||||
// getPubKey reads the pubkey from cache or from the ledger itself
|
// getPubKey reads the pubkey the ledger itself
|
||||||
// since this involves IO, it may return an error, which is not exposed
|
// since this involves IO, it may return an error, which is not exposed
|
||||||
// in the PubKey interface, so this function allows better error handling
|
// in the PubKey interface, so this function allows better error handling
|
||||||
func (pk PrivKeyLedgerSecp256k1) getPubKey() (key PubKey, err error) {
|
func (pk PrivKeyLedgerSecp256k1) getPubKey() (key PubKey, err error) {
|
||||||
// if we have no pubkey, set it
|
|
||||||
if pk.CachedPubKey == nil {
|
|
||||||
pk.CachedPubKey, err = pk.forceGetPubKey()
|
|
||||||
}
|
|
||||||
return pk.CachedPubKey, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// forceGetPubKey is like getPubKey but ignores any cached key
|
|
||||||
// and ensures we get it from the ledger itself.
|
|
||||||
func (pk PrivKeyLedgerSecp256k1) forceGetPubKey() (key PubKey, err error) {
|
|
||||||
dev, err := getLedger()
|
dev, err := getLedger()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return key, fmt.Errorf("cannot connect to Ledger device - error: %v", err)
|
return key, fmt.Errorf("cannot connect to Ledger device - error: %v", err)
|
||||||
|
@ -19,8 +19,7 @@ func TestRealLedgerSecp256k1(t *testing.T) {
|
|||||||
|
|
||||||
priv, err := NewPrivKeyLedgerSecp256k1(path)
|
priv, err := NewPrivKeyLedgerSecp256k1(path)
|
||||||
require.Nil(t, err, "%+v", err)
|
require.Nil(t, err, "%+v", err)
|
||||||
pub, err := priv.PubKey()
|
pub := priv.PubKey()
|
||||||
require.Nil(t, err)
|
|
||||||
sig, err := priv.Sign(msg)
|
sig, err := priv.Sign(msg)
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
|
|
||||||
@ -33,8 +32,7 @@ func TestRealLedgerSecp256k1(t *testing.T) {
|
|||||||
require.Nil(t, err, "%+v", err)
|
require.Nil(t, err, "%+v", err)
|
||||||
|
|
||||||
// make sure we get the same pubkey when we load from disk
|
// make sure we get the same pubkey when we load from disk
|
||||||
pub2, err := priv2.PubKey()
|
pub2 := priv2.PubKey()
|
||||||
require.Nil(t, err)
|
|
||||||
require.Equal(t, pub, pub2)
|
require.Equal(t, pub, pub2)
|
||||||
|
|
||||||
// signing with the loaded key should match the original pubkey
|
// signing with the loaded key should match the original pubkey
|
||||||
|
10
priv_key.go
10
priv_key.go
@ -18,7 +18,7 @@ func PrivKeyFromBytes(privKeyBytes []byte) (privKey PrivKey, err error) {
|
|||||||
type PrivKey interface {
|
type PrivKey interface {
|
||||||
Bytes() []byte
|
Bytes() []byte
|
||||||
Sign(msg []byte) (Signature, error)
|
Sign(msg []byte) (Signature, error)
|
||||||
PubKey() (PubKey, error)
|
PubKey() PubKey
|
||||||
Equals(PrivKey) bool
|
Equals(PrivKey) bool
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,10 +39,10 @@ func (privKey PrivKeyEd25519) Sign(msg []byte) (Signature, error) {
|
|||||||
return SignatureEd25519(*signatureBytes), nil
|
return SignatureEd25519(*signatureBytes), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (privKey PrivKeyEd25519) PubKey() (PubKey, error) {
|
func (privKey PrivKeyEd25519) PubKey() PubKey {
|
||||||
privKeyBytes := [64]byte(privKey)
|
privKeyBytes := [64]byte(privKey)
|
||||||
pubBytes := *ed25519.MakePublicKey(&privKeyBytes)
|
pubBytes := *ed25519.MakePublicKey(&privKeyBytes)
|
||||||
return PubKeyEd25519(pubBytes), nil
|
return PubKeyEd25519(pubBytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Equals - you probably don't need to use this.
|
// Equals - you probably don't need to use this.
|
||||||
@ -115,11 +115,11 @@ func (privKey PrivKeySecp256k1) Sign(msg []byte) (Signature, error) {
|
|||||||
return SignatureSecp256k1(sig__.Serialize()), nil
|
return SignatureSecp256k1(sig__.Serialize()), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (privKey PrivKeySecp256k1) PubKey() (PubKey, error) {
|
func (privKey PrivKeySecp256k1) PubKey() PubKey {
|
||||||
_, pub__ := secp256k1.PrivKeyFromBytes(secp256k1.S256(), privKey[:])
|
_, pub__ := secp256k1.PrivKeyFromBytes(secp256k1.S256(), privKey[:])
|
||||||
var pub PubKeySecp256k1
|
var pub PubKeySecp256k1
|
||||||
copy(pub[:], pub__.SerializeCompressed())
|
copy(pub[:], pub__.SerializeCompressed())
|
||||||
return pub, nil
|
return pub
|
||||||
}
|
}
|
||||||
|
|
||||||
// Equals - you probably don't need to use this.
|
// Equals - you probably don't need to use this.
|
||||||
|
@ -11,8 +11,7 @@ func TestGeneratePrivKey(t *testing.T) {
|
|||||||
testPriv := crypto.GenPrivKeyEd25519()
|
testPriv := crypto.GenPrivKeyEd25519()
|
||||||
testGenerate := testPriv.Generate(1)
|
testGenerate := testPriv.Generate(1)
|
||||||
signBytes := []byte("something to sign")
|
signBytes := []byte("something to sign")
|
||||||
pub, err := testGenerate.PubKey()
|
pub := testGenerate.PubKey()
|
||||||
assert.NoError(t, err)
|
|
||||||
sig, err := testGenerate.Sign(signBytes)
|
sig, err := testGenerate.Sign(signBytes)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.True(t, pub.VerifyBytes(signBytes, sig))
|
assert.True(t, pub.VerifyBytes(signBytes, sig))
|
||||||
|
@ -33,8 +33,7 @@ func TestPubKeySecp256k1Address(t *testing.T) {
|
|||||||
var priv PrivKeySecp256k1
|
var priv PrivKeySecp256k1
|
||||||
copy(priv[:], privB)
|
copy(priv[:], privB)
|
||||||
|
|
||||||
pubKey, err := priv.PubKey()
|
pubKey := priv.PubKey()
|
||||||
assert.NoError(t, err)
|
|
||||||
pubT, _ := pubKey.(PubKeySecp256k1)
|
pubT, _ := pubKey.(PubKeySecp256k1)
|
||||||
pub := pubT[:]
|
pub := pubT[:]
|
||||||
addr := pubKey.Address()
|
addr := pubKey.Address()
|
||||||
|
@ -3,15 +3,14 @@ package crypto
|
|||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSignAndValidateEd25519(t *testing.T) {
|
func TestSignAndValidateEd25519(t *testing.T) {
|
||||||
|
|
||||||
privKey := GenPrivKeyEd25519()
|
privKey := GenPrivKeyEd25519()
|
||||||
pubKey, err := privKey.PubKey()
|
pubKey := privKey.PubKey()
|
||||||
require.Nil(t, err)
|
|
||||||
|
|
||||||
msg := CRandBytes(128)
|
msg := CRandBytes(128)
|
||||||
sig, err := privKey.Sign(msg)
|
sig, err := privKey.Sign(msg)
|
||||||
@ -30,8 +29,7 @@ func TestSignAndValidateEd25519(t *testing.T) {
|
|||||||
|
|
||||||
func TestSignAndValidateSecp256k1(t *testing.T) {
|
func TestSignAndValidateSecp256k1(t *testing.T) {
|
||||||
privKey := GenPrivKeySecp256k1()
|
privKey := GenPrivKeySecp256k1()
|
||||||
pubKey, err := privKey.PubKey()
|
pubKey := privKey.PubKey()
|
||||||
require.Nil(t, err)
|
|
||||||
|
|
||||||
msg := CRandBytes(128)
|
msg := CRandBytes(128)
|
||||||
sig, err := privKey.Sign(msg)
|
sig, err := privKey.Sign(msg)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user