github.com/TrueCloudLab/frostfs-api-go/v2@v2.0.0-20230228134343-196241c4e79a/util/signature/walletconnect/sign_test.go (about)

     1  package walletconnect
     2  
     3  import (
     4  	"crypto/ecdsa"
     5  	"crypto/elliptic"
     6  	"crypto/rand"
     7  	"encoding/hex"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  func TestSignMessage(t *testing.T) {
    14  	p1, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
    15  	require.NoError(t, err)
    16  
    17  	msg := []byte("NEO")
    18  	result, err := SignMessage(p1, msg)
    19  	require.NoError(t, err)
    20  	require.Equal(t, elliptic.MarshalCompressed(elliptic.P256(), p1.PublicKey.X, p1.PublicKey.Y), result.PublicKey)
    21  	require.Equal(t, saltSize, len(result.Salt))
    22  	require.Equal(t, 64, len(result.Data))
    23  	require.Equal(t, 4+1+16*2+3+2, len(result.Message))
    24  
    25  	require.True(t, VerifyMessage(&p1.PublicKey, result))
    26  
    27  	t.Run("invalid public key", func(t *testing.T) {
    28  		p2, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
    29  		require.NoError(t, err)
    30  		require.False(t, VerifyMessage(&p2.PublicKey, result))
    31  	})
    32  	t.Run("invalid signature", func(t *testing.T) {
    33  		result := result
    34  		result.Data[0] ^= 0xFF
    35  		require.False(t, VerifyMessage(&p1.PublicKey, result))
    36  	})
    37  }
    38  
    39  func TestSign(t *testing.T) {
    40  	p1, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
    41  	require.NoError(t, err)
    42  
    43  	msg := []byte("NEO")
    44  	sign, err := Sign(p1, msg)
    45  	require.NoError(t, err)
    46  	require.True(t, Verify(&p1.PublicKey, msg, sign))
    47  
    48  	t.Run("invalid public key", func(t *testing.T) {
    49  		p2, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
    50  		require.NoError(t, err)
    51  		require.False(t, Verify(&p2.PublicKey, msg, sign))
    52  	})
    53  	t.Run("invalid signature", func(t *testing.T) {
    54  		sign[0] ^= 0xFF
    55  		require.False(t, Verify(&p1.PublicKey, msg, sign))
    56  	})
    57  }
    58  
    59  func TestVerifyNeonWallet(t *testing.T) {
    60  	testCases := [...]struct {
    61  		publicKey       string
    62  		data            string
    63  		salt            string
    64  		messageHex      string
    65  		messageOriginal string
    66  	}{
    67  		{ // Test values from this GIF https://github.com/CityOfZion/neon-wallet/pull/2390 .
    68  			publicKey:       "02ce6228ba2cb2fc235be93aff9cd5fc0851702eb9791552f60db062f01e3d83f6",
    69  			data:            "90ab1886ca0bece59b982d9ade8f5598065d651362fb9ce45ad66d0474b89c0b80913c8f0118a282acbdf200a429ba2d81bc52534a53ab41a2c6dfe2f0b4fb1b",
    70  			salt:            "d41e348afccc2f3ee45cd9f5128b16dc",
    71  			messageHex:      "010001f05c6434316533343861666363633266336565343563643966353132386231366463436172616c686f2c206d756c65712c206f2062616775697520656820697373756d65726d6f2074616978206c696761646f206e61206d697373e36f3f0000",
    72  			messageOriginal: "436172616c686f2c206d756c65712c206f2062616775697520656820697373756d65726d6f2074616978206c696761646f206e61206d697373e36f3f",
    73  		},
    74  		{ // Test value from wallet connect integration test
    75  			publicKey:       "03bd9108c0b49f657e9eee50d1399022bd1e436118e5b7529a1b7cd606652f578f",
    76  			data:            "510caa8cb6db5dedf04d215a064208d64be7496916d890df59aee132db8f2b07532e06f7ea664c4a99e3bcb74b43a35eb9653891b5f8701d2aef9e7526703eaa",
    77  			salt:            "2c5b189569e92cce12e1c640f23e83ba",
    78  			messageHex:      "010001f02632633562313839353639653932636365313265316336343066323365383362613132333435360000",
    79  			messageOriginal: "313233343536", // ascii string "123456"
    80  		},
    81  		{ // Test value from wallet connect integration test
    82  			publicKey:       "03bd9108c0b49f657e9eee50d1399022bd1e436118e5b7529a1b7cd606652f578f",
    83  			data:            "1e13f248962d8b3b60708b55ddf448d6d6a28c6b43887212a38b00bf6bab695e61261e54451c6e3d5f1f000e5534d166c7ca30f662a296d3a9aafa6d8c173c01",
    84  			salt:            "58c86b2e74215b4f36b47d731236be3b",
    85  			messageHex:      "010001f02035386338366232653734323135623466333662343764373331323336626533620000",
    86  			messageOriginal: "", // empty string
    87  		},
    88  	}
    89  
    90  	for _, testCase := range testCases {
    91  		rawPub, err := hex.DecodeString(testCase.publicKey)
    92  		require.NoError(t, err)
    93  		data, err := hex.DecodeString(testCase.data)
    94  		require.NoError(t, err)
    95  		salt, err := hex.DecodeString(testCase.salt)
    96  		require.NoError(t, err)
    97  		msg, err := hex.DecodeString(testCase.messageHex)
    98  		require.NoError(t, err)
    99  		orig, err := hex.DecodeString(testCase.messageOriginal)
   100  		require.NoError(t, err)
   101  
   102  		require.Equal(t, msg, createMessageWithSalt(orig, salt))
   103  
   104  		sm := SignedMessage{
   105  			Data:      data,
   106  			Message:   msg,
   107  			PublicKey: rawPub,
   108  			Salt:      salt,
   109  		}
   110  		require.True(t, VerifyMessage(nil, sm))
   111  	}
   112  
   113  }