- package crypto
-
- import (
- "testing"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
- "github.com/tendermint/ed25519"
- amino "github.com/tendermint/go-amino"
- )
-
- func TestSignAndValidateEd25519(t *testing.T) {
-
- privKey := GenPrivKeyEd25519()
- pubKey := privKey.PubKey()
-
- msg := CRandBytes(128)
- sig := privKey.Sign(msg)
-
- // Test the signature
- assert.True(t, pubKey.VerifyBytes(msg, sig))
-
- // Mutate the signature, just one bit.
- sigEd := sig.(SignatureEd25519)
- sigEd[7] ^= byte(0x01)
- sig = sigEd
-
- assert.False(t, pubKey.VerifyBytes(msg, sig))
- }
-
- func TestSignAndValidateSecp256k1(t *testing.T) {
- privKey := GenPrivKeySecp256k1()
- pubKey := privKey.PubKey()
-
- msg := CRandBytes(128)
- sig := privKey.Sign(msg)
-
- assert.True(t, pubKey.VerifyBytes(msg, sig))
-
- // Mutate the signature, just one bit.
- sigEd := sig.(SignatureSecp256k1)
- sigEd[3] ^= byte(0x01)
- sig = sigEd
-
- assert.False(t, pubKey.VerifyBytes(msg, sig))
- }
-
- func TestSignatureEncodings(t *testing.T) {
- cases := []struct {
- privKey PrivKey
- sigSize int
- sigPrefix amino.PrefixBytes
- }{
- {
- privKey: GenPrivKeyEd25519(),
- sigSize: ed25519.SignatureSize,
- sigPrefix: [4]byte{0x3d, 0xa1, 0xdb, 0x2a},
- },
- {
- privKey: GenPrivKeySecp256k1(),
- sigSize: 0, // unknown
- sigPrefix: [4]byte{0x16, 0xe1, 0xfe, 0xea},
- },
- }
-
- for _, tc := range cases {
- // note we embed them from the beginning....
- pubKey := tc.privKey.PubKey()
-
- msg := CRandBytes(128)
- sig := tc.privKey.Sign(msg)
-
- // store as amino
- bin, err := cdc.MarshalBinaryBare(sig)
- require.Nil(t, err, "%+v", err)
- if tc.sigSize != 0 {
- // Q: where is 1 byte coming from?
- assert.Equal(t, tc.sigSize+amino.PrefixBytesLen+1, len(bin))
- }
- assert.Equal(t, tc.sigPrefix[:], bin[0:amino.PrefixBytesLen])
-
- // and back
- sig2 := Signature(nil)
- err = cdc.UnmarshalBinaryBare(bin, &sig2)
- require.Nil(t, err, "%+v", err)
- assert.EqualValues(t, sig, sig2)
- assert.True(t, pubKey.VerifyBytes(msg, sig2))
-
- /*
- // store as json
- js, err := data.ToJSON(sig)
- require.Nil(t, err, "%+v", err)
- assert.True(t, strings.Contains(string(js), tc.sigName))
-
- // and back
- sig3 := Signature{}
- err = data.FromJSON(js, &sig3)
- require.Nil(t, err, "%+v", err)
- assert.EqualValues(t, sig, sig3)
- assert.True(t, pubKey.VerifyBytes(msg, sig3))
-
- // and make sure we can textify it
- text, err := data.ToText(sig)
- require.Nil(t, err, "%+v", err)
- assert.True(t, strings.HasPrefix(text, tc.sigName))
- */
- }
- }
|