arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
hermez-node/common/accountcreationauths_test.go
common/accountcreationauths_test.goRaw
  1package common
  2
  3import (
  4	"encoding/hex"
  5	"testing"
  6
  7	ethCommon "github.com/ethereum/go-ethereum/common"
  8	ethCrypto "github.com/ethereum/go-ethereum/crypto"
  9	"github.com/iden3/go-iden3-crypto/babyjub"
 10	"github.com/stretchr/testify/assert"
 11	"github.com/stretchr/testify/require"
 12)
 13
 14func TestAccountCreationAuthSignVerify(t *testing.T) {
 15	// Ethereum key
 16	ethSk, err :=
 17		ethCrypto.HexToECDSA("fad9c8855b740a0b7ed4c221dbad0f33a83a49cad6b3fe8d5817ac83d38b6a19")
 18	require.NoError(t, err)
 19	ethAddr := ethCrypto.PubkeyToAddress(ethSk.PublicKey)
 20
 21	// BabyJubJub key
 22	var sk babyjub.PrivateKey
 23	_, err = hex.Decode(sk[:],
 24		[]byte("0001020304050607080900010203040506070809000102030405060708090001"))
 25	require.NoError(t, err)
 26
 27	chainID := uint16(0)
 28	hermezContractAddr := ethCommon.HexToAddress("0xc344E203a046Da13b0B4467EB7B3629D0C99F6E6")
 29	a := AccountCreationAuth{
 30		EthAddr: ethAddr,
 31		BJJ:     sk.Public().Compress(),
 32	}
 33
 34	// Sign using the Sign function (stores signature in a.Signature)
 35	err = a.Sign(func(hash []byte) ([]byte, error) {
 36		return ethCrypto.Sign(hash, ethSk)
 37	}, chainID, hermezContractAddr)
 38	require.NoError(t, err)
 39
 40	// Hash and sign manually and compare the generated signature
 41	hash, err := a.HashToSign(chainID, hermezContractAddr)
 42	require.NoError(t, err)
 43	assert.Equal(t, "9414667457e658dd31949b82996b75c65a055512244c3bbfd22ff56add02ba65",
 44		hex.EncodeToString(hash))
 45	sig, err := ethCrypto.Sign(hash, ethSk)
 46	require.NoError(t, err)
 47	sig[64] += 27
 48	assert.Equal(t, sig, a.Signature)
 49
 50	assert.True(t, a.VerifySignature(chainID, hermezContractAddr))
 51}
 52
 53func TestKeccak256JSComp(t *testing.T) {
 54	// check keccak256 compatible with js version
 55	h := ethCrypto.Keccak256([]byte("test"))
 56	assert.Equal(t, "9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658",
 57		hex.EncodeToString(h))
 58}
 59
 60func TestAccountCreationAuthJSComp(t *testing.T) {
 61	// The values of this test have been tested with the js implementation
 62	type testVector struct {
 63		ethSk              string
 64		expectedAddress    string
 65		pkCompStr          string
 66		chainID            uint16
 67		hermezContractAddr string
 68		toHashExpected     string
 69		hashExpected       string
 70		sigExpected        string
 71	}
 72	var tvs []testVector
 73	//nolint:lll
 74	tv0 := testVector{
 75		ethSk:              "0000000000000000000000000000000000000000000000000000000000000001",
 76		expectedAddress:    "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf",
 77		pkCompStr:          "21b0a1688b37f77b1d1d5539ec3b826db5ac78b2513f574a04c50a7d4f8246d7",
 78		chainID:            uint16(4),
 79		hermezContractAddr: "0x7e5f4552091a69125d5dfcb7b8c2659029395bdf",
 80		toHashExpected:     "190189658bba487e11c7da602676ee32bc90b77d3f32a305b147e4f3c3b35f19672e5d84ccc38d0ab245c469b719549d837113465c2abf9972c49403ca6fd10ed3dc",
 81		hashExpected:       "c56eba41e511df100c804c5c09288f35887efea4f033be956481af335df3bea2",
 82		sigExpected:        "dbedcc5ce02db8f48afbdb2feba9a3a31848eaa8fca5f312ce37b01db45d2199208335330d4445bd2f51d1db68dbc0d0bf3585c4a07504b4efbe46a69eaae5a21b",
 83	}
 84	//nolint:lll
 85	tv1 := testVector{
 86		ethSk:              "0000000000000000000000000000000000000000000000000000000000000002",
 87		expectedAddress:    "0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF",
 88		pkCompStr:          "093985b1993d9f743f9d7d943ed56f38601cb8b196db025f79650c4007c3054d",
 89		chainID:            uint16(0),
 90		hermezContractAddr: "0x2b5ad5c4795c026514f8317c7a215e218dccd6cf",
 91		toHashExpected:     "1901dafbc253dedf90d6421dc6e25d5d9efc6985133cb2a8d363d0a081a0e3eddddc65f603a88de36aaeabd3b4cf586538c7f3fd50c94780530a3707c8c14ad9fd11",
 92		hashExpected:       "deb9afa479282cf27b442ce8ba86b19448aa87eacef691521a33db5d0feb9959",
 93		sigExpected:        "6a0da90ba2d2b1be679a28ebe54ee03082d44b836087391cd7d2607c1e4dafe04476e6e88dccb8707c68312512f16c947524b35c80f26c642d23953e9bb84c701c",
 94	}
 95	//nolint:lll
 96	tv2 := testVector{
 97		ethSk:              "c5e8f61d1ab959b397eecc0a37a6517b8e67a0e7cf1f4bce5591f3ed80199122",
 98		expectedAddress:    "0xc783df8a850f42e7F7e57013759C285caa701eB6",
 99		pkCompStr:          "22870c1bcc451396202d62f566026eab8e438c6c91decf8ddf63a6c162619b52",
100		chainID:            uint16(31337), // =0x7a69
101		hermezContractAddr: "0xf4e77E5Da47AC3125140c470c71cBca77B5c638c",
102		toHashExpected:     "190167617949b934d7e01add4009cd3d47415a26727b7d6288e5dce33fb3721d5a1a9ce511b19b694c9aaf8183f4987ed752f24884c54c003d11daa2e98c7547a79e",
103		hashExpected:       "157b570c597e615b8356ce008ac39f43bc9b6d50080bc07d968031b9378acbbb",
104		sigExpected:        "a0766181102428b5672e523dc4b905c10ddf025c10dbd0b3534ef864632a14652737610041c670b302fc7dca28edd5d6eac42b72d69ce58da8ce21287b244e381b",
105	}
106	tvs = append(tvs, tv0)
107	tvs = append(tvs, tv1)
108	tvs = append(tvs, tv2)
109
110	for _, tv := range tvs {
111		// Ethereum key
112		ethSk, err := ethCrypto.HexToECDSA(tv.ethSk)
113		require.NoError(t, err)
114		ethAddr := ethCrypto.PubkeyToAddress(ethSk.PublicKey)
115		assert.Equal(t, tv.expectedAddress, ethAddr.Hex())
116
117		// BabyJubJub key
118		pkCompStr := tv.pkCompStr
119		pkComp, err := BJJFromStringWithChecksum(pkCompStr)
120		require.NoError(t, err)
121
122		chainID := tv.chainID
123		hermezContractAddr := ethCommon.HexToAddress(tv.hermezContractAddr)
124		a := AccountCreationAuth{
125			EthAddr: ethAddr,
126			BJJ:     pkComp,
127		}
128
129		toHash, err := a.toHash(chainID, hermezContractAddr)
130		require.NoError(t, err)
131		assert.Equal(t, tv.toHashExpected,
132			hex.EncodeToString(toHash))
133
134		msg, err := a.HashToSign(chainID, hermezContractAddr)
135		require.NoError(t, err)
136		assert.Equal(t, tv.hashExpected,
137			hex.EncodeToString(msg))
138
139		// sign AccountCreationAuth with eth key
140		sig, err := ethCrypto.Sign(msg, ethSk)
141		require.NoError(t, err)
142		sig[64] += 27
143		assert.Equal(t, tv.sigExpected,
144			hex.EncodeToString(sig))
145		a.Signature = sig
146
147		assert.True(t, a.VerifySignature(chainID, hermezContractAddr))
148	}
149}