2019-08-27 13:29:42 +00:00
|
|
|
package keys
|
2018-03-21 16:11:04 +00:00
|
|
|
|
|
|
|
import (
|
2018-03-25 10:45:54 +00:00
|
|
|
"encoding/hex"
|
2019-11-24 15:40:07 +00:00
|
|
|
"math/rand"
|
|
|
|
"sort"
|
2018-03-21 16:11:04 +00:00
|
|
|
"testing"
|
|
|
|
|
2020-03-03 14:21:42 +00:00
|
|
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
2019-11-21 10:19:08 +00:00
|
|
|
"github.com/stretchr/testify/require"
|
2018-03-21 16:11:04 +00:00
|
|
|
)
|
|
|
|
|
2018-03-25 10:45:54 +00:00
|
|
|
func TestEncodeDecodeInfinity(t *testing.T) {
|
2019-09-04 21:12:39 +00:00
|
|
|
key := &PublicKey{}
|
2019-09-16 09:18:13 +00:00
|
|
|
buf := io.NewBufBinWriter()
|
2019-09-16 16:31:49 +00:00
|
|
|
key.EncodeBinary(buf.BinWriter)
|
2019-11-21 10:19:08 +00:00
|
|
|
require.NoError(t, buf.Err)
|
2019-09-16 09:18:13 +00:00
|
|
|
b := buf.Bytes()
|
2019-11-21 10:19:08 +00:00
|
|
|
require.Equal(t, 1, len(b))
|
2018-03-25 10:45:54 +00:00
|
|
|
|
|
|
|
keyDecode := &PublicKey{}
|
2019-11-21 10:19:08 +00:00
|
|
|
require.NoError(t, keyDecode.DecodeBytes(b))
|
|
|
|
require.Equal(t, []byte{0x00}, keyDecode.Bytes())
|
2018-03-25 10:45:54 +00:00
|
|
|
}
|
|
|
|
|
2018-03-21 16:11:04 +00:00
|
|
|
func TestEncodeDecodePublicKey(t *testing.T) {
|
|
|
|
for i := 0; i < 4; i++ {
|
2019-09-04 20:03:25 +00:00
|
|
|
k, err := NewPrivateKey()
|
2019-11-21 10:19:08 +00:00
|
|
|
require.NoError(t, err)
|
2019-09-05 06:35:02 +00:00
|
|
|
p := k.PublicKey()
|
2019-09-16 09:18:13 +00:00
|
|
|
buf := io.NewBufBinWriter()
|
2019-09-16 16:31:49 +00:00
|
|
|
p.EncodeBinary(buf.BinWriter)
|
2019-11-21 10:19:08 +00:00
|
|
|
require.NoError(t, buf.Err)
|
2019-09-16 09:18:13 +00:00
|
|
|
b := buf.Bytes()
|
2018-03-21 16:11:04 +00:00
|
|
|
|
|
|
|
pDecode := &PublicKey{}
|
2019-11-21 10:19:08 +00:00
|
|
|
require.NoError(t, pDecode.DecodeBytes(b))
|
|
|
|
require.Equal(t, p.X, pDecode.X)
|
2018-03-21 16:11:04 +00:00
|
|
|
}
|
2019-11-24 15:40:07 +00:00
|
|
|
|
|
|
|
errCases := [][]byte{{}, {0x02}, {0x04}}
|
|
|
|
|
|
|
|
for _, tc := range errCases {
|
|
|
|
r := io.NewBinReaderFromBuf(tc)
|
|
|
|
|
|
|
|
var pDecode PublicKey
|
|
|
|
pDecode.DecodeBinary(r)
|
|
|
|
require.Error(t, r.Err)
|
|
|
|
}
|
2018-03-21 16:11:04 +00:00
|
|
|
}
|
2018-03-25 10:45:54 +00:00
|
|
|
|
|
|
|
func TestDecodeFromString(t *testing.T) {
|
|
|
|
str := "03b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c"
|
|
|
|
pubKey, err := NewPublicKeyFromString(str)
|
2019-11-21 10:19:08 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, str, hex.EncodeToString(pubKey.Bytes()))
|
2019-11-24 15:40:07 +00:00
|
|
|
|
|
|
|
_, err = NewPublicKeyFromString(str[2:])
|
|
|
|
require.Error(t, err)
|
|
|
|
|
|
|
|
str = "zzb209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c"
|
|
|
|
_, err = NewPublicKeyFromString(str)
|
|
|
|
require.Error(t, err)
|
2018-03-25 10:45:54 +00:00
|
|
|
}
|
2019-08-27 13:29:42 +00:00
|
|
|
|
2019-12-25 14:44:30 +00:00
|
|
|
func TestDecodeFromStringBadCompressed(t *testing.T) {
|
|
|
|
str := "02ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
|
|
|
|
_, err := NewPublicKeyFromString(str)
|
|
|
|
require.Error(t, err)
|
|
|
|
}
|
|
|
|
|
2019-12-25 15:01:54 +00:00
|
|
|
func TestDecodeFromStringBadXMoreThanP(t *testing.T) {
|
|
|
|
str := "02ffffffff00000001000000000000000000000001ffffffffffffffffffffffff"
|
|
|
|
_, err := NewPublicKeyFromString(str)
|
|
|
|
require.Error(t, err)
|
|
|
|
}
|
|
|
|
|
2019-12-25 15:00:25 +00:00
|
|
|
func TestDecodeFromStringNotOnCurve(t *testing.T) {
|
|
|
|
str := "04ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
|
|
|
|
_, err := NewPublicKeyFromString(str)
|
|
|
|
require.Error(t, err)
|
|
|
|
}
|
|
|
|
|
2019-12-25 15:06:25 +00:00
|
|
|
func TestDecodeFromStringUncompressed(t *testing.T) {
|
|
|
|
str := "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5"
|
|
|
|
_, err := NewPublicKeyFromString(str)
|
|
|
|
require.NoError(t, err)
|
|
|
|
}
|
|
|
|
|
2019-08-27 13:29:42 +00:00
|
|
|
func TestPubkeyToAddress(t *testing.T) {
|
|
|
|
pubKey, err := NewPublicKeyFromString("031ee4e73a17d8f76dc02532e2620bcb12425b33c0c9f9694cc2caa8226b68cad4")
|
2019-11-21 10:19:08 +00:00
|
|
|
require.NoError(t, err)
|
2019-08-27 14:16:33 +00:00
|
|
|
actual := pubKey.Address()
|
2019-08-27 13:29:42 +00:00
|
|
|
expected := "AUpGsNCHzSimeMRVPQfhwrVdiUp8Q2N2Qx"
|
2019-11-21 10:19:08 +00:00
|
|
|
require.Equal(t, expected, actual)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestDecodeBytes(t *testing.T) {
|
|
|
|
pubKey := getPubKey(t)
|
|
|
|
decodedPubKey := &PublicKey{}
|
|
|
|
err := decodedPubKey.DecodeBytes(pubKey.Bytes())
|
|
|
|
require.NoError(t, err)
|
2019-12-02 07:10:50 +00:00
|
|
|
require.Equal(t, pubKey, decodedPubKey)
|
2019-11-21 10:19:08 +00:00
|
|
|
}
|
|
|
|
|
2019-11-24 15:40:07 +00:00
|
|
|
func TestSort(t *testing.T) {
|
|
|
|
pubs1 := make(PublicKeys, 10)
|
|
|
|
for i := range pubs1 {
|
|
|
|
priv, err := NewPrivateKey()
|
|
|
|
require.NoError(t, err)
|
|
|
|
pubs1[i] = priv.PublicKey()
|
|
|
|
}
|
|
|
|
|
|
|
|
pubs2 := make(PublicKeys, len(pubs1))
|
|
|
|
copy(pubs2, pubs1)
|
|
|
|
|
|
|
|
sort.Sort(pubs1)
|
|
|
|
|
|
|
|
rand.Shuffle(len(pubs2), func(i, j int) {
|
|
|
|
pubs2[i], pubs2[j] = pubs2[j], pubs2[i]
|
|
|
|
})
|
|
|
|
sort.Sort(pubs2)
|
|
|
|
|
|
|
|
// Check that sort on the same set of values produce the same result.
|
|
|
|
require.Equal(t, pubs1, pubs2)
|
|
|
|
}
|
|
|
|
|
2019-11-21 10:19:08 +00:00
|
|
|
func TestContains(t *testing.T) {
|
|
|
|
pubKey := getPubKey(t)
|
|
|
|
pubKeys := &PublicKeys{getPubKey(t)}
|
|
|
|
pubKeys.Contains(pubKey)
|
|
|
|
require.True(t, pubKeys.Contains(pubKey))
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestUnique(t *testing.T) {
|
|
|
|
pubKeys := &PublicKeys{getPubKey(t), getPubKey(t)}
|
|
|
|
unique := pubKeys.Unique()
|
|
|
|
require.Equal(t, 1, unique.Len())
|
|
|
|
}
|
|
|
|
|
|
|
|
func getPubKey(t *testing.T) *PublicKey {
|
|
|
|
pubKey, err := NewPublicKeyFromString("031ee4e73a17d8f76dc02532e2620bcb12425b33c0c9f9694cc2caa8226b68cad4")
|
|
|
|
require.NoError(t, err)
|
|
|
|
return pubKey
|
2019-08-27 13:29:42 +00:00
|
|
|
}
|