@@ -22,12 +22,14 @@ import (
22
22
"crypto/rand"
23
23
"encoding/hex"
24
24
"errors"
25
+ "fmt"
25
26
"io"
26
27
"io/ioutil"
27
28
"math/big"
28
29
"os"
29
30
30
31
"github.com/ethereum/go-ethereum/common"
32
+ "github.com/ethereum/go-ethereum/common/math"
31
33
"github.com/ethereum/go-ethereum/crypto/sha3"
32
34
"github.com/ethereum/go-ethereum/rlp"
33
35
)
@@ -76,23 +78,22 @@ func CreateAddress(b common.Address, nonce uint64) common.Address {
76
78
}
77
79
78
80
// ToECDSA creates a private key with the given D value.
79
- func ToECDSA (prv []byte ) * ecdsa.PrivateKey {
80
- if len (prv ) == 0 {
81
- return nil
82
- }
83
-
81
+ func ToECDSA (d []byte ) (* ecdsa.PrivateKey , error ) {
84
82
priv := new (ecdsa.PrivateKey )
85
83
priv .PublicKey .Curve = S256 ()
86
- priv .D = new (big.Int ).SetBytes (prv )
87
- priv .PublicKey .X , priv .PublicKey .Y = priv .PublicKey .Curve .ScalarBaseMult (prv )
88
- return priv
84
+ if 8 * len (d ) != priv .Params ().BitSize {
85
+ return nil , fmt .Errorf ("invalid length, need %d bits" , priv .Params ().BitSize )
86
+ }
87
+ priv .D = new (big.Int ).SetBytes (d )
88
+ priv .PublicKey .X , priv .PublicKey .Y = priv .PublicKey .Curve .ScalarBaseMult (d )
89
+ return priv , nil
89
90
}
90
91
91
92
func FromECDSA (prv * ecdsa.PrivateKey ) []byte {
92
93
if prv == nil {
93
94
return nil
94
95
}
95
- return prv .D . Bytes ( )
96
+ return math . PaddedBigBytes ( prv .D , 32 )
96
97
}
97
98
98
99
func ToECDSAPub (pub []byte ) * ecdsa.PublicKey {
@@ -116,10 +117,7 @@ func HexToECDSA(hexkey string) (*ecdsa.PrivateKey, error) {
116
117
if err != nil {
117
118
return nil , errors .New ("invalid hex string" )
118
119
}
119
- if len (b ) != 32 {
120
- return nil , errors .New ("invalid length, need 256 bits" )
121
- }
122
- return ToECDSA (b ), nil
120
+ return ToECDSA (b )
123
121
}
124
122
125
123
// LoadECDSA loads a secp256k1 private key from the given file.
@@ -139,8 +137,7 @@ func LoadECDSA(file string) (*ecdsa.PrivateKey, error) {
139
137
if err != nil {
140
138
return nil , err
141
139
}
142
-
143
- return ToECDSA (key ), nil
140
+ return ToECDSA (key )
144
141
}
145
142
146
143
// SaveECDSA saves a secp256k1 private key to the given file with
0 commit comments