|
|
@ -3,6 +3,7 @@ package cryptostore_test |
|
|
|
import ( |
|
|
|
"bytes" |
|
|
|
"fmt" |
|
|
|
"os" |
|
|
|
"testing" |
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert" |
|
|
@ -14,6 +15,7 @@ import ( |
|
|
|
"github.com/tendermint/go-crypto/keys" |
|
|
|
"github.com/tendermint/go-crypto/keys/cryptostore" |
|
|
|
"github.com/tendermint/go-crypto/keys/storage/memstorage" |
|
|
|
"github.com/tendermint/go-crypto/nano" |
|
|
|
) |
|
|
|
|
|
|
|
// TestKeyManagement makes sure we can manipulate these keys well
|
|
|
@ -150,6 +152,59 @@ func TestSignVerify(t *testing.T) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// TestSignWithLedger makes sure we have ledger compatibility with
|
|
|
|
// the crypto store.
|
|
|
|
//
|
|
|
|
// This test will only succeed with a ledger attached to the computer
|
|
|
|
// and the cosmos app open
|
|
|
|
func TestSignWithLedger(t *testing.T) { |
|
|
|
assert, require := assert.New(t), require.New(t) |
|
|
|
if os.Getenv("WITH_LEDGER") == "" { |
|
|
|
t.Skip("Set WITH_LEDGER to run code on real ledger") |
|
|
|
} |
|
|
|
|
|
|
|
// make the storage with reasonable defaults
|
|
|
|
cstore := cryptostore.New( |
|
|
|
cryptostore.SecretBox, |
|
|
|
memstorage.New(), |
|
|
|
keys.MustLoadCodec("english"), |
|
|
|
) |
|
|
|
n := "nano-s" |
|
|
|
p := "hard2hack" |
|
|
|
|
|
|
|
// create a nano user
|
|
|
|
c, _, err := cstore.Create(n, p, nano.NameLedger) |
|
|
|
require.Nil(err, "%+v", err) |
|
|
|
assert.Equal(c.Name, n) |
|
|
|
_, ok := c.PubKey.Unwrap().(nano.PubKeyLedger) |
|
|
|
require.True(ok) |
|
|
|
|
|
|
|
// make sure we can get it back
|
|
|
|
info, err := cstore.Get(n) |
|
|
|
require.Nil(err, "%+v", err) |
|
|
|
assert.Equal(info.Name, n) |
|
|
|
key := info.PubKey |
|
|
|
require.False(key.Empty()) |
|
|
|
|
|
|
|
// let's try to sign some messages
|
|
|
|
d1 := []byte("welcome to cosmos") |
|
|
|
d2 := []byte("please turn on the app") |
|
|
|
|
|
|
|
// try signing both data with the ledger...
|
|
|
|
s1 := keys.NewMockSignable(d1) |
|
|
|
err = cstore.Sign(n, p, s1) |
|
|
|
require.Nil(err) |
|
|
|
s2 := keys.NewMockSignable(d2) |
|
|
|
err = cstore.Sign(n, p, s2) |
|
|
|
require.Nil(err) |
|
|
|
|
|
|
|
// now, let's check those signatures work
|
|
|
|
assert.True(key.VerifyBytes(d1, s1.Signature)) |
|
|
|
assert.True(key.VerifyBytes(d2, s2.Signature)) |
|
|
|
// and mismatched signatures don't
|
|
|
|
assert.False(key.VerifyBytes(d1, s2.Signature)) |
|
|
|
} |
|
|
|
|
|
|
|
func assertPassword(assert *assert.Assertions, cstore cryptostore.Manager, name, pass, badpass string) { |
|
|
|
err := cstore.Update(name, badpass, pass) |
|
|
|
assert.NotNil(err) |
|
|
|