status-im/status-go

View on GitHub
api/utils_test.go

Summary

Maintainability
A
0 mins
Test Coverage
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)
        })
    }
}