Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张蕾
Geth-Modification
Commits
02f785af
Commit
02f785af
authored
9 years ago
by
Jeffrey Wilcke
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1166 from Gustav-Simonsson/add_ec_sig_validations
Add EC signature validations before call to libsecp256k1
parents
827bccb6
edbd902a
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
31 additions
and
22 deletions
+31
-22
transaction_pool.go
core/transaction_pool.go
+0
-6
transaction.go
core/types/transaction.go
+15
-16
crypto.go
crypto/crypto.go
+16
-0
No files found.
core/transaction_pool.go
View file @
02f785af
...
...
@@ -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
}
...
...
This diff is collapsed.
Click to expand it.
core/types/transaction.go
View file @
02f785af
...
...
@@ -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
{},
err
ors
.
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
{
...
...
This diff is collapsed.
Click to expand it.
crypto/crypto.go
View file @
02f785af
...
...
@@ -10,6 +10,7 @@ import (
"fmt"
"io"
"io/ioutil"
"math/big"
"os"
"encoding/hex"
...
...
@@ -26,9 +27,12 @@ import (
"golang.org/x/crypto/ripemd160"
)
var
secp256k1n
*
big
.
Int
func
init
()
{
// specify the params for the s256 curve
ecies
.
AddParamsForCurve
(
S256
(),
ecies
.
ECIES_AES128_SHA256
)
secp256k1n
=
common
.
String2Big
(
"0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"
)
}
func
Sha3
(
data
...
[]
byte
)
[]
byte
{
...
...
@@ -151,6 +155,18 @@ func GenerateKey() (*ecdsa.PrivateKey, error) {
return
ecdsa
.
GenerateKey
(
S256
(),
rand
.
Reader
)
}
func
ValidateSignatureValues
(
v
byte
,
r
,
s
*
big
.
Int
)
bool
{
vint
:=
uint32
(
v
)
if
r
.
Cmp
(
common
.
Big0
)
==
0
||
s
.
Cmp
(
common
.
Big0
)
==
0
{
return
false
}
if
r
.
Cmp
(
secp256k1n
)
<
0
&&
s
.
Cmp
(
secp256k1n
)
<
0
&&
(
vint
==
27
||
vint
==
28
)
{
return
true
}
else
{
return
false
}
}
func
SigToPub
(
hash
,
sig
[]
byte
)
(
*
ecdsa
.
PublicKey
,
error
)
{
s
,
err
:=
Ecrecover
(
hash
,
sig
)
if
err
!=
nil
{
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment