From 32e1b104f8fbc0f80bf2b6a93492aa01fa323e35 Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Mon, 1 Jun 2015 20:27:20 +0200 Subject: Add EC signature validations before call to libsecp256k1 --- core/transaction_pool.go | 6 ------ core/types/transaction.go | 31 +++++++++++++++---------------- 2 files changed, 15 insertions(+), 22 deletions(-) (limited to 'core') diff --git a/core/transaction_pool.go b/core/transaction_pool.go index c896488d1..ee6360614 100644 --- a/core/transaction_pool.go +++ b/core/transaction_pool.go @@ -112,12 +112,6 @@ func (pool *TxPool) ValidateTransaction(tx *types.Transaction) error { return ErrInvalidSender } - // Validate curve param - v, _, _ := tx.Curve() - if v > 28 || v < 27 { - return fmt.Errorf("tx.v != (28 || 27) => %v", v) - } - if !pool.currentState().HasAccount(from) { return ErrNonExistentAccount } diff --git a/core/types/transaction.go b/core/types/transaction.go index d8dcd7424..3d6d31ae7 100644 --- a/core/types/transaction.go +++ b/core/types/transaction.go @@ -8,7 +8,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/secp256k1" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/rlp" @@ -93,9 +92,9 @@ func (self *Transaction) SetNonce(AccountNonce uint64) { } func (self *Transaction) From() (common.Address, error) { - pubkey := self.PublicKey() - if len(pubkey) == 0 || pubkey[0] != 4 { - return common.Address{}, errors.New("invalid public key") + pubkey, err := self.PublicKey() + if err != nil { + return common.Address{}, err } var addr common.Address @@ -110,34 +109,34 @@ func (tx *Transaction) To() *common.Address { return tx.Recipient } -func (tx *Transaction) Curve() (v byte, r []byte, s []byte) { +func (tx *Transaction) GetSignatureValues() (v byte, r []byte, s []byte) { v = byte(tx.V) r = common.LeftPadBytes(tx.R.Bytes(), 32) s = common.LeftPadBytes(tx.S.Bytes(), 32) return } -func (tx *Transaction) Signature(key []byte) []byte { - hash := tx.Hash() - sig, _ := secp256k1.Sign(hash[:], key) - return sig -} +func (tx *Transaction) PublicKey() ([]byte, error) { + if !crypto.ValidateSignatureValues(tx.V, tx.R, tx.S) { + return nil, errors.New("invalid v, r, s values") + } -func (tx *Transaction) PublicKey() []byte { hash := tx.Hash() - v, r, s := tx.Curve() + v, r, s := tx.GetSignatureValues() sig := append(r, s...) sig = append(sig, v-27) - //pubkey := crypto.Ecrecover(append(hash[:], sig...)) - //pubkey, _ := secp256k1.RecoverPubkey(hash[:], sig) p, err := crypto.SigToPub(hash[:], sig) if err != nil { glog.V(logger.Error).Infof("Could not get pubkey from signature: ", err) - return nil + return nil, err } + pubkey := crypto.FromECDSAPub(p) - return pubkey + if len(pubkey) == 0 || pubkey[0] != 4 { + return nil, errors.New("invalid public key") + } + return pubkey, nil } func (tx *Transaction) SetSignatureValues(sig []byte) error { -- cgit