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 TestAccountCreationAuthVerification(t *testing.T) {
 15	// Ethereum key
 16	ethSk, err := ethCrypto.HexToECDSA("fad9c8855b740a0b7ed4c221dbad0f33a83a49cad6b3fe8d5817ac83d38b6a19")
 17	require.NoError(t, err)
 18	ethAddr := ethCrypto.PubkeyToAddress(ethSk.PublicKey)
 19
 20	// BabyJubJub key
 21	var sk babyjub.PrivateKey
 22	_, err = hex.Decode(sk[:],
 23		[]byte("0001020304050607080900010203040506070809000102030405060708090001"))
 24	assert.NoError(t, err)
 25
 26	chainID := uint16(0)
 27	hermezContractAddr := ethCommon.HexToAddress("0xc344E203a046Da13b0B4467EB7B3629D0C99F6E6")
 28	a := AccountCreationAuth{
 29		EthAddr: ethAddr,
 30		BJJ:     sk.Public().Compress(),
 31	}
 32	msg, err := a.HashToSign(chainID, hermezContractAddr)
 33	assert.NoError(t, err)
 34	assert.Equal(t, "4f8df75e96fdce1ac90bb2f8d81c42047600f85bfcef80ce3b91c2a2afc58c1e",
 35		hex.EncodeToString(msg))
 36
 37	// sign AccountCreationAuth with eth key
 38	sig, err := ethCrypto.Sign(msg, ethSk)
 39	assert.NoError(t, err)
 40	sig[64] += 27
 41	a.Signature = sig
 42
 43	assert.True(t, a.VerifySignature(chainID, hermezContractAddr))
 44}
 45
 46func TestKeccak256JSComp(t *testing.T) {
 47	// check keccak256 compatible with js version
 48	h := ethCrypto.Keccak256Hash([]byte("test")).Bytes()
 49	assert.Equal(t, "9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658",
 50		hex.EncodeToString(h))
 51}
 52
 53func TestAccountCreationAuthJSComp(t *testing.T) {
 54	// The values of this test have been tested with the js implementation
 55	type testVector struct {
 56		ethSk              string
 57		expectedAddress    string
 58		pkCompStr          string
 59		chainID            uint16
 60		hermezContractAddr string
 61		toHashExpected     string
 62		hashExpected       string
 63		sigExpected        string
 64	}
 65	var tvs []testVector
 66	tv0 := testVector{
 67		ethSk:              "0000000000000000000000000000000000000000000000000000000000000001",
 68		expectedAddress:    "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf",
 69		pkCompStr:          "21b0a1688b37f77b1d1d5539ec3b826db5ac78b2513f574a04c50a7d4f8246d7",
 70		chainID:            uint16(4),
 71		hermezContractAddr: "0x7e5f4552091a69125d5dfcb7b8c2659029395bdf",
 72		toHashExpected:     "19457468657265756d205369676e6564204d6573736167653a0a3132304920617574686f72697a65207468697320626162796a75626a7562206b657920666f72206865726d657a20726f6c6c7570206163636f756e74206372656174696f6e21b0a1688b37f77b1d1d5539ec3b826db5ac78b2513f574a04c50a7d4f8246d700047e5f4552091a69125d5dfcb7b8c2659029395bdf",
 73		hashExpected:       "39afea52d843a4de905b6b5ebb0ee8c678141f711d96d9b429c4aec10ef9911f",
 74		sigExpected:        "73d10d6ecf06ee8a5f60ac90f06b78bef9c650f414ba3ac73e176dc32e896159147457e9c86f0b4bd60fdaf2c0b2aec890a7df993d69a4805e242a6b845ebf231c",
 75	}
 76	tv1 := testVector{
 77		ethSk:              "0000000000000000000000000000000000000000000000000000000000000002",
 78		expectedAddress:    "0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF",
 79		pkCompStr:          "093985b1993d9f743f9d7d943ed56f38601cb8b196db025f79650c4007c3054d",
 80		chainID:            uint16(0),
 81		hermezContractAddr: "0x2b5ad5c4795c026514f8317c7a215e218dccd6cf",
 82		toHashExpected:     "19457468657265756d205369676e6564204d6573736167653a0a3132304920617574686f72697a65207468697320626162796a75626a7562206b657920666f72206865726d657a20726f6c6c7570206163636f756e74206372656174696f6e093985b1993d9f743f9d7d943ed56f38601cb8b196db025f79650c4007c3054d00002b5ad5c4795c026514f8317c7a215e218dccd6cf",
 83		hashExpected:       "89a3895993a4736232212e59566294feb3da227af44375daf3307dcad5451d5d",
 84		sigExpected:        "bb4156156c705494ad5f99030342c64657e51e2994750f92125717c40bf56ad632044aa6bd00979feea92c417b552401e65fe5f531f15010d9d1c278da8be1df1b",
 85	}
 86	tv2 := testVector{
 87		ethSk:              "c5e8f61d1ab959b397eecc0a37a6517b8e67a0e7cf1f4bce5591f3ed80199122",
 88		expectedAddress:    "0xc783df8a850f42e7F7e57013759C285caa701eB6",
 89		pkCompStr:          "22870c1bcc451396202d62f566026eab8e438c6c91decf8ddf63a6c162619b52",
 90		chainID:            uint16(31337), // =0x7a69
 91		hermezContractAddr: "0xf4e77E5Da47AC3125140c470c71cBca77B5c638c",
 92		toHashExpected:     "19457468657265756d205369676e6564204d6573736167653a0a3132304920617574686f72697a65207468697320626162796a75626a7562206b657920666f72206865726d657a20726f6c6c7570206163636f756e74206372656174696f6e22870c1bcc451396202d62f566026eab8e438c6c91decf8ddf63a6c162619b527a69f4e77e5da47ac3125140c470c71cbca77b5c638c",
 93		hashExpected:       "4f6ead01278ba4597d4720e37482f585a713497cea994a95209f4c57a963b4a7",
 94		sigExpected:        "43b5818802a137a72a190c1d8d767ca507f7a4804b1b69b5e055abf31f4f2b476c80bb1ba63260d95610f6f831420d32130e7f22fec5d76e16644ddfcedd0d441c",
 95	}
 96	tvs = append(tvs, tv0)
 97	tvs = append(tvs, tv1)
 98	tvs = append(tvs, tv2)
 99
100	for _, tv := range tvs {
101		// Ethereum key
102		ethSk, err := ethCrypto.HexToECDSA(tv.ethSk)
103		require.NoError(t, err)
104		ethAddr := ethCrypto.PubkeyToAddress(ethSk.PublicKey)
105		assert.Equal(t, tv.expectedAddress, ethAddr.Hex())
106
107		// BabyJubJub key
108		pkCompStr := tv.pkCompStr
109		pkComp, err := BJJFromStringWithChecksum(pkCompStr)
110		assert.NoError(t, err)
111
112		chainID := tv.chainID
113		hermezContractAddr := ethCommon.HexToAddress(tv.hermezContractAddr)
114		a := AccountCreationAuth{
115			EthAddr: ethAddr,
116			BJJ:     pkComp,
117		}
118
119		toHash := a.toHash(chainID, hermezContractAddr)
120		assert.Equal(t, tv.toHashExpected,
121			hex.EncodeToString(toHash))
122		assert.Equal(t, 120+len(EthMsgPrefix)+len([]byte("120")), len(toHash))
123
124		msg, err := a.HashToSign(chainID, hermezContractAddr)
125		assert.NoError(t, err)
126		assert.Equal(t, tv.hashExpected,
127			hex.EncodeToString(msg))
128
129		// sign AccountCreationAuth with eth key
130		sig, err := ethCrypto.Sign(msg, ethSk)
131		assert.NoError(t, err)
132		sig[64] += 27
133		assert.Equal(t, tv.sigExpected,
134			hex.EncodeToString(sig))
135		a.Signature = sig
136
137		assert.True(t, a.VerifySignature(chainID, hermezContractAddr))
138	}
139}