diff options
author | Gustav Simonsson <gustav.simonsson@gmail.com> | 2015-06-02 02:27:20 +0800 |
---|---|---|
committer | Gustav Simonsson <gustav.simonsson@gmail.com> | 2015-06-02 03:06:52 +0800 |
commit | 32e1b104f8fbc0f80bf2b6a93492aa01fa323e35 (patch) | |
tree | a9725f648bdd47d3e5b72b21ddf728e90656a974 /core/types/transaction.go | |
parent | 5b14fdb94b61af9f17f53593766a706c9780a7be (diff) | |
download | go-tangerine-32e1b104f8fbc0f80bf2b6a93492aa01fa323e35.tar go-tangerine-32e1b104f8fbc0f80bf2b6a93492aa01fa323e35.tar.gz go-tangerine-32e1b104f8fbc0f80bf2b6a93492aa01fa323e35.tar.bz2 go-tangerine-32e1b104f8fbc0f80bf2b6a93492aa01fa323e35.tar.lz go-tangerine-32e1b104f8fbc0f80bf2b6a93492aa01fa323e35.tar.xz go-tangerine-32e1b104f8fbc0f80bf2b6a93492aa01fa323e35.tar.zst go-tangerine-32e1b104f8fbc0f80bf2b6a93492aa01fa323e35.zip |
Add EC signature validations before call to libsecp256k1
Diffstat (limited to 'core/types/transaction.go')
-rw-r--r-- | core/types/transaction.go | 31 |
1 files changed, 15 insertions, 16 deletions
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 { |