github.com/status-im/status-go@v1.1.0/api/utils_test.go (about) 1 package api 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/stretchr/testify/assert" 8 "github.com/stretchr/testify/require" 9 10 "github.com/status-im/status-go/eth-node/crypto" 11 "github.com/status-im/status-go/params" 12 "github.com/status-im/status-go/services/personal" 13 "github.com/status-im/status-go/t/utils" 14 ) 15 16 func TestHashMessage(t *testing.T) { 17 utils.Init() 18 19 backend, stop1, stop2, stopWallet, err := setupGethStatusBackend() 20 defer func() { 21 err := stop1() 22 if err != nil { 23 require.NoError(t, backend.StopNode()) 24 } 25 }() 26 defer func() { 27 err := stop2() 28 if err != nil { 29 require.NoError(t, backend.StopNode()) 30 } 31 }() 32 defer func() { 33 err := stopWallet() 34 if err != nil { 35 require.NoError(t, backend.StopNode()) 36 } 37 }() 38 require.NoError(t, err) 39 40 config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID) 41 require.NoError(t, err) 42 require.NoError(t, backend.AccountManager().InitKeystore(config.KeyStoreDir)) 43 err = backend.StartNode(config) 44 require.NoError(t, err) 45 defer func() { 46 require.NoError(t, backend.StopNode()) 47 }() 48 49 key, err := crypto.GenerateKey() 50 require.NoError(t, err) 51 addr := crypto.PubkeyToAddress(key.PublicKey) 52 53 scenarios := []struct { 54 message string 55 expectedHash string 56 recoverMessage string 57 }{ 58 { 59 message: "XYZ", 60 expectedHash: "634349abf2de883d23e8b46972896c7652a06670c990410d3436d9b44db09e6b", 61 recoverMessage: fmt.Sprintf("0x%x", "XYZ"), 62 }, 63 { 64 message: "0xXYZ", 65 expectedHash: "f9c57a8998c71a2c8d74d70abe6561838f0d6cb6d82bc85bd70afcc82368055c", 66 recoverMessage: fmt.Sprintf("0x%x", "0xXYZ"), 67 }, 68 { 69 message: "1122", 70 expectedHash: "3f07e02a153f02bdf97d77161746257626e9c39e4c3cf59896365fd1e6a9c7c3", 71 recoverMessage: fmt.Sprintf("0x%x", "1122"), 72 }, 73 { 74 message: "0x1122", 75 expectedHash: "86d79d0957efa9b7d91f1116e70d0ee934cb9cdeccefa07756aed2bee119a2f3", 76 recoverMessage: "0x1122", 77 }, 78 } 79 80 for _, s := range scenarios { 81 t.Run(s.message, func(t *testing.T) { 82 hash, err := HashMessage(s.message) 83 require.Nil(t, err) 84 require.Equal(t, s.expectedHash, fmt.Sprintf("%x", hash)) 85 86 // simulate signature from external signer like a keycard 87 sig, err := crypto.Sign(hash, key) 88 require.NoError(t, err) 89 sig[64] += 27 // Transform V from 0/1 to 27/28 according to the yellow paper 90 91 // check that the message was wrapped correctly before hashing it 92 recParams := personal.RecoverParams{ 93 Message: s.recoverMessage, 94 Signature: fmt.Sprintf("0x%x", sig), 95 } 96 97 recoveredAddr, err := backend.Recover(recParams) 98 require.NoError(t, err) 99 assert.Equal(t, addr, recoveredAddr) 100 }) 101 } 102 }