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  }