mirror of
https://github.com/arnaucube/hermez-node.git
synced 2026-02-07 03:16:45 +01:00
Update AccountCreationAuth & fix auth.HashToSign
- Fix AccountCreationAuth.HashToSign (was using `[]byte("0x...")`, which
uses the bytes of the string. Now uses the bytearray of the compressed
BJJ public key (compatible with js implementation))
- Update AccountCreationAuth to last specification (add to hash
parameters ChainID & HermezAddress)
- Add missing test to AccountCreationAuth
This commit is contained in:
@@ -1,15 +1,20 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"time"
|
||||
|
||||
ethCommon "github.com/ethereum/go-ethereum/common"
|
||||
ethCrypto "github.com/ethereum/go-ethereum/crypto"
|
||||
"github.com/hermeznetwork/tracerr"
|
||||
"github.com/iden3/go-iden3-crypto/babyjub"
|
||||
)
|
||||
|
||||
// AccountCreationAuth authorizations sent by users to the L2DB, to be used for account creations when necessary
|
||||
// AccountCreationAuthMsg is the message that is signed to authorize an account
|
||||
// creation
|
||||
const AccountCreationAuthMsg = "I authorize this babyjubjub key for hermez rollup account creation"
|
||||
|
||||
// AccountCreationAuth authorizations sent by users to the L2DB, to be used for
|
||||
// account creations when necessary
|
||||
type AccountCreationAuth struct {
|
||||
EthAddr ethCommon.Address `meddler:"eth_addr"`
|
||||
BJJ babyjub.PublicKeyComp `meddler:"bjj"`
|
||||
@@ -18,21 +23,21 @@ type AccountCreationAuth struct {
|
||||
}
|
||||
|
||||
// HashToSign builds the hash to be signed using BJJ pub key and the constant message
|
||||
func (a *AccountCreationAuth) HashToSign() ([]byte, error) {
|
||||
func (a *AccountCreationAuth) HashToSign(chainID uint16,
|
||||
hermezContractAddr ethCommon.Address) ([]byte, error) {
|
||||
// Calculate message to be signed
|
||||
const msg = "I authorize this babyjubjub key for hermez rollup account creation"
|
||||
comp, err := a.BJJ.MarshalText()
|
||||
if err != nil {
|
||||
return nil, tracerr.Wrap(err)
|
||||
}
|
||||
// Hash message (msg || compressed-bjj)
|
||||
return ethCrypto.Keccak256Hash([]byte(msg), comp).Bytes(), nil
|
||||
var chainIDBytes [2]byte
|
||||
binary.BigEndian.PutUint16(chainIDBytes[:], chainID)
|
||||
// to hash: [AccountCreationAuthMsg | compressedBJJ | chainID | hermezContractAddr]
|
||||
return ethCrypto.Keccak256Hash([]byte(AccountCreationAuthMsg), a.BJJ[:], chainIDBytes[:],
|
||||
hermezContractAddr[:]).Bytes(), nil
|
||||
}
|
||||
|
||||
// VerifySignature ensures that the Signature is done with the specified EthAddr
|
||||
func (a *AccountCreationAuth) VerifySignature() bool {
|
||||
func (a *AccountCreationAuth) VerifySignature(chainID uint16,
|
||||
hermezContractAddr ethCommon.Address) bool {
|
||||
// Calculate hash to be signed
|
||||
msg, err := a.HashToSign()
|
||||
msg, err := a.HashToSign(chainID, hermezContractAddr)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
41
common/accountcreationauths_test.go
Normal file
41
common/accountcreationauths_test.go
Normal file
@@ -0,0 +1,41 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"encoding/hex"
|
||||
"testing"
|
||||
|
||||
ethCommon "github.com/ethereum/go-ethereum/common"
|
||||
ethCrypto "github.com/ethereum/go-ethereum/crypto"
|
||||
"github.com/iden3/go-iden3-crypto/babyjub"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestAccountCreationAuth(t *testing.T) {
|
||||
// Ethereum key
|
||||
ethSk, err := ethCrypto.HexToECDSA("fad9c8855b740a0b7ed4c221dbad0f33a83a49cad6b3fe8d5817ac83d38b6a19")
|
||||
require.NoError(t, err)
|
||||
ethAddr := ethCrypto.PubkeyToAddress(ethSk.PublicKey)
|
||||
|
||||
// BabyJubJub key
|
||||
var sk babyjub.PrivateKey
|
||||
_, err = hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
|
||||
assert.NoError(t, err)
|
||||
|
||||
chainID := uint16(0)
|
||||
hermezContractAddr := ethCommon.HexToAddress("0xc344E203a046Da13b0B4467EB7B3629D0C99F6E6")
|
||||
a := AccountCreationAuth{
|
||||
EthAddr: ethAddr,
|
||||
BJJ: sk.Public().Compress(),
|
||||
}
|
||||
msg, err := a.HashToSign(chainID, hermezContractAddr)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "cb5a7e44329ff430c81fec49fb2ac6741f02d5ec96cbcb618a6991f0a9c80ffd", hex.EncodeToString(msg))
|
||||
|
||||
// sign AccountCreationAuth with eth key
|
||||
sig, err := ethCrypto.Sign(msg, ethSk)
|
||||
assert.NoError(t, err)
|
||||
a.Signature = sig
|
||||
|
||||
assert.True(t, a.VerifySignature(chainID, hermezContractAddr))
|
||||
}
|
||||
Reference in New Issue
Block a user