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 }