github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/crypto/keys/private_key_test.go (about)

     1  package keys
     2  
     3  import (
     4  	"encoding/hex"
     5  	"math/big"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/nspcc-dev/neo-go/internal/keytestcases"
    10  	"github.com/nspcc-dev/neo-go/pkg/crypto/hash"
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func TestPrivateKey(t *testing.T) {
    16  	for _, testCase := range keytestcases.Arr {
    17  		privKey, err := NewPrivateKeyFromHex(testCase.PrivateKey)
    18  		if testCase.Invalid {
    19  			assert.Error(t, err)
    20  			continue
    21  		}
    22  
    23  		assert.Nil(t, err)
    24  		address := privKey.Address()
    25  		assert.Equal(t, testCase.Address, address)
    26  
    27  		wif := privKey.WIF()
    28  		assert.Equal(t, testCase.Wif, wif)
    29  		pubKey := privKey.PublicKey()
    30  		assert.Equal(t, hex.EncodeToString(pubKey.Bytes()), testCase.PublicKey)
    31  		oldD := new(big.Int).Set(privKey.D)
    32  		privKey.Destroy()
    33  		assert.NotEqual(t, oldD, privKey.D)
    34  	}
    35  }
    36  
    37  func TestNewPrivateKeyOnCurve(t *testing.T) {
    38  	msg := []byte{1, 2, 3}
    39  	h := hash.Sha256(msg).BytesBE()
    40  	t.Run("Secp256r1", func(t *testing.T) {
    41  		p, err := NewPrivateKey()
    42  		require.NoError(t, err)
    43  		p.PublicKey().Verify(p.Sign(msg), h)
    44  	})
    45  	t.Run("Secp256k1", func(t *testing.T) {
    46  		p, err := NewSecp256k1PrivateKey()
    47  		require.NoError(t, err)
    48  		p.PublicKey().Verify(p.Sign(msg), h)
    49  	})
    50  }
    51  
    52  func TestPrivateKeyFromWIF(t *testing.T) {
    53  	for _, testCase := range keytestcases.Arr {
    54  		key, err := NewPrivateKeyFromWIF(testCase.Wif)
    55  		if testCase.Invalid {
    56  			assert.Error(t, err)
    57  			continue
    58  		}
    59  
    60  		assert.Nil(t, err)
    61  		assert.Equal(t, testCase.PrivateKey, key.String())
    62  	}
    63  }
    64  
    65  func TestSigning(t *testing.T) {
    66  	// These were taken from the rfcPage:https://tools.ietf.org/html/rfc6979#page-33
    67  	//   public key: U = xG
    68  	//Ux = 60FED4BA255A9D31C961EB74C6356D68C049B8923B61FA6CE669622E60F29FB6
    69  	//Uy = 7903FE1008B8BC99A41AE9E95628BC64F2F1B20C2D7E9F5177A3C294D4462299
    70  	PrivateKey, _ := NewPrivateKeyFromHex("C9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721")
    71  
    72  	data := PrivateKey.Sign([]byte("sample"))
    73  
    74  	r := "EFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716"
    75  	s := "F7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4AB2F843ACDA8"
    76  	assert.Equal(t, strings.ToLower(r+s), hex.EncodeToString(data))
    77  }