Merge pull request #14565 from karalabe/relax-privkey-checks
accounts/keystore, crypto: don't enforce key checks on existing keyfiles
This commit is contained in:
commit
f272879e5a
@ -182,10 +182,8 @@ func DecryptKey(keyjson []byte, auth string) (*Key, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
key, err := crypto.ToECDSA(keyBytes)
|
key := crypto.ToECDSAUnsafe(keyBytes)
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &Key{
|
return &Key{
|
||||||
Id: uuid.UUID(keyId),
|
Id: uuid.UUID(keyId),
|
||||||
Address: crypto.PubkeyToAddress(key.PublicKey),
|
Address: crypto.PubkeyToAddress(key.PublicKey),
|
||||||
|
@ -74,10 +74,8 @@ func decryptPreSaleKey(fileContent []byte, password string) (key *Key, err error
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
ethPriv := crypto.Keccak256(plainText)
|
ethPriv := crypto.Keccak256(plainText)
|
||||||
ecKey, err := crypto.ToECDSA(ethPriv)
|
ecKey := crypto.ToECDSAUnsafe(ethPriv)
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
key = &Key{
|
key = &Key{
|
||||||
Id: nil,
|
Id: nil,
|
||||||
Address: crypto.PubkeyToAddress(ecKey.PublicKey),
|
Address: crypto.PubkeyToAddress(ecKey.PublicKey),
|
||||||
|
@ -68,9 +68,6 @@ func Keccak512(data ...[]byte) []byte {
|
|||||||
return d.Sum(nil)
|
return d.Sum(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deprecated: For backward compatibility as other packages depend on these
|
|
||||||
func Sha3Hash(data ...[]byte) common.Hash { return Keccak256Hash(data...) }
|
|
||||||
|
|
||||||
// Creates an ethereum address given the bytes and the nonce
|
// Creates an ethereum address given the bytes and the nonce
|
||||||
func CreateAddress(b common.Address, nonce uint64) common.Address {
|
func CreateAddress(b common.Address, nonce uint64) common.Address {
|
||||||
data, _ := rlp.EncodeToBytes([]interface{}{b, nonce})
|
data, _ := rlp.EncodeToBytes([]interface{}{b, nonce})
|
||||||
@ -79,9 +76,24 @@ func CreateAddress(b common.Address, nonce uint64) common.Address {
|
|||||||
|
|
||||||
// ToECDSA creates a private key with the given D value.
|
// ToECDSA creates a private key with the given D value.
|
||||||
func ToECDSA(d []byte) (*ecdsa.PrivateKey, error) {
|
func ToECDSA(d []byte) (*ecdsa.PrivateKey, error) {
|
||||||
|
return toECDSA(d, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToECDSAUnsafe blidly converts a binary blob to a private key. It should almost
|
||||||
|
// never be used unless you are sure the input is valid and want to avoid hitting
|
||||||
|
// errors due to bad origin encoding (0 prefixes cut off).
|
||||||
|
func ToECDSAUnsafe(d []byte) *ecdsa.PrivateKey {
|
||||||
|
priv, _ := toECDSA(d, false)
|
||||||
|
return priv
|
||||||
|
}
|
||||||
|
|
||||||
|
// toECDSA creates a private key with the given D value. The strict parameter
|
||||||
|
// controls whether the key's length should be enforced at the curve size or
|
||||||
|
// it can also accept legacy encodings (0 prefixes).
|
||||||
|
func toECDSA(d []byte, strict bool) (*ecdsa.PrivateKey, error) {
|
||||||
priv := new(ecdsa.PrivateKey)
|
priv := new(ecdsa.PrivateKey)
|
||||||
priv.PublicKey.Curve = S256()
|
priv.PublicKey.Curve = S256()
|
||||||
if 8*len(d) != priv.Params().BitSize {
|
if strict && 8*len(d) != priv.Params().BitSize {
|
||||||
return nil, fmt.Errorf("invalid length, need %d bits", priv.Params().BitSize)
|
return nil, fmt.Errorf("invalid length, need %d bits", priv.Params().BitSize)
|
||||||
}
|
}
|
||||||
priv.D = new(big.Int).SetBytes(d)
|
priv.D = new(big.Int).SetBytes(d)
|
||||||
@ -89,11 +101,12 @@ func ToECDSA(d []byte) (*ecdsa.PrivateKey, error) {
|
|||||||
return priv, nil
|
return priv, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func FromECDSA(prv *ecdsa.PrivateKey) []byte {
|
// FromECDSA exports a private key into a binary dump.
|
||||||
if prv == nil {
|
func FromECDSA(priv *ecdsa.PrivateKey) []byte {
|
||||||
|
if priv == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return math.PaddedBigBytes(prv.D, 32)
|
return math.PaddedBigBytes(priv.D, priv.Params().BitSize/8)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ToECDSAPub(pub []byte) *ecdsa.PublicKey {
|
func ToECDSAPub(pub []byte) *ecdsa.PublicKey {
|
||||||
@ -121,7 +134,6 @@ func HexToECDSA(hexkey string) (*ecdsa.PrivateKey, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// LoadECDSA loads a secp256k1 private key from the given file.
|
// LoadECDSA loads a secp256k1 private key from the given file.
|
||||||
// The key data is expected to be hex-encoded.
|
|
||||||
func LoadECDSA(file string) (*ecdsa.PrivateKey, error) {
|
func LoadECDSA(file string) (*ecdsa.PrivateKey, error) {
|
||||||
buf := make([]byte, 64)
|
buf := make([]byte, 64)
|
||||||
fd, err := os.Open(file)
|
fd, err := os.Open(file)
|
||||||
|
@ -36,7 +36,7 @@ var testPrivHex = "289c2857d4598e37fb9647507e47a309d6133539bf21a8b9cb6df88fd5232
|
|||||||
// These tests are sanity checks.
|
// These tests are sanity checks.
|
||||||
// They should ensure that we don't e.g. use Sha3-224 instead of Sha3-256
|
// They should ensure that we don't e.g. use Sha3-224 instead of Sha3-256
|
||||||
// and that the sha3 library uses keccak-f permutation.
|
// and that the sha3 library uses keccak-f permutation.
|
||||||
func TestSha3Hash(t *testing.T) {
|
func TestKeccak256Hash(t *testing.T) {
|
||||||
msg := []byte("abc")
|
msg := []byte("abc")
|
||||||
exp, _ := hex.DecodeString("4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45")
|
exp, _ := hex.DecodeString("4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45")
|
||||||
checkhash(t, "Sha3-256-array", func(in []byte) []byte { h := Keccak256Hash(in); return h[:] }, msg, exp)
|
checkhash(t, "Sha3-256-array", func(in []byte) []byte { h := Keccak256Hash(in); return h[:] }, msg, exp)
|
||||||
|
Loading…
Reference in New Issue
Block a user