status-go/api/utils_test.go

103 lines
2.6 KiB
Go

package api
import (
"fmt"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/status-im/status-go/eth-node/crypto"
"github.com/status-im/status-go/params"
"github.com/status-im/status-go/services/personal"
"github.com/status-im/status-go/t/utils"
)
func TestHashMessage(t *testing.T) {
utils.Init()
backend, stop1, stop2, stopWallet, err := setupGethStatusBackend()
defer func() {
err := stop1()
if err != nil {
require.NoError(t, backend.StopNode())
}
}()
defer func() {
err := stop2()
if err != nil {
require.NoError(t, backend.StopNode())
}
}()
defer func() {
err := stopWallet()
if err != nil {
require.NoError(t, backend.StopNode())
}
}()
require.NoError(t, err)
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
require.NoError(t, err)
require.NoError(t, backend.AccountManager().InitKeystore(config.KeyStoreDir))
err = backend.StartNode(config)
require.NoError(t, err)
defer func() {
require.NoError(t, backend.StopNode())
}()
key, err := crypto.GenerateKey()
require.NoError(t, err)
addr := crypto.PubkeyToAddress(key.PublicKey)
scenarios := []struct {
message string
expectedHash string
recoverMessage string
}{
{
message: "XYZ",
expectedHash: "634349abf2de883d23e8b46972896c7652a06670c990410d3436d9b44db09e6b",
recoverMessage: fmt.Sprintf("0x%x", "XYZ"),
},
{
message: "0xXYZ",
expectedHash: "f9c57a8998c71a2c8d74d70abe6561838f0d6cb6d82bc85bd70afcc82368055c",
recoverMessage: fmt.Sprintf("0x%x", "0xXYZ"),
},
{
message: "1122",
expectedHash: "3f07e02a153f02bdf97d77161746257626e9c39e4c3cf59896365fd1e6a9c7c3",
recoverMessage: fmt.Sprintf("0x%x", "1122"),
},
{
message: "0x1122",
expectedHash: "86d79d0957efa9b7d91f1116e70d0ee934cb9cdeccefa07756aed2bee119a2f3",
recoverMessage: "0x1122",
},
}
for _, s := range scenarios {
t.Run(s.message, func(t *testing.T) {
hash, err := HashMessage(s.message)
require.Nil(t, err)
require.Equal(t, s.expectedHash, fmt.Sprintf("%x", hash))
// simulate signature from external signer like a keycard
sig, err := crypto.Sign(hash, key)
require.NoError(t, err)
sig[64] += 27 // Transform V from 0/1 to 27/28 according to the yellow paper
// check that the message was wrapped correctly before hashing it
recParams := personal.RecoverParams{
Message: s.recoverMessage,
Signature: fmt.Sprintf("0x%x", sig),
}
recoveredAddr, err := backend.Recover(recParams)
require.NoError(t, err)
assert.Equal(t, addr, recoveredAddr)
})
}
}