cmd/ethkey: use accounts.TextHash (#25069)
This commit is contained in:
parent
1cf58c7b81
commit
6ad620d642
@ -21,6 +21,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/accounts"
|
||||||
"github.com/ethereum/go-ethereum/accounts/keystore"
|
"github.com/ethereum/go-ethereum/accounts/keystore"
|
||||||
"github.com/ethereum/go-ethereum/cmd/utils"
|
"github.com/ethereum/go-ethereum/cmd/utils"
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
@ -68,7 +69,7 @@ To sign a message contained in a file, use the --msgfile flag.
|
|||||||
utils.Fatalf("Error decrypting key: %v", err)
|
utils.Fatalf("Error decrypting key: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
signature, err := crypto.Sign(signHash(message), key.PrivateKey)
|
signature, err := crypto.Sign(accounts.TextHash(message), key.PrivateKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Fatalf("Failed to sign message: %v", err)
|
utils.Fatalf("Failed to sign message: %v", err)
|
||||||
}
|
}
|
||||||
@ -113,7 +114,7 @@ It is possible to refer to a file containing the message.`,
|
|||||||
utils.Fatalf("Signature encoding is not hexadecimal: %v", err)
|
utils.Fatalf("Signature encoding is not hexadecimal: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
recoveredPubkey, err := crypto.SigToPub(signHash(message), signature)
|
recoveredPubkey, err := crypto.SigToPub(accounts.TextHash(message), signature)
|
||||||
if err != nil || recoveredPubkey == nil {
|
if err != nil || recoveredPubkey == nil {
|
||||||
utils.Fatalf("Signature verification failed: %v", err)
|
utils.Fatalf("Signature verification failed: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/cmd/utils"
|
"github.com/ethereum/go-ethereum/cmd/utils"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
|
||||||
"gopkg.in/urfave/cli.v1"
|
"gopkg.in/urfave/cli.v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -46,18 +45,6 @@ func getPassphrase(ctx *cli.Context, confirmation bool) string {
|
|||||||
return utils.GetPassPhrase("", confirmation)
|
return utils.GetPassPhrase("", confirmation)
|
||||||
}
|
}
|
||||||
|
|
||||||
// signHash is a helper function that calculates a hash for the given message
|
|
||||||
// that can be safely used to calculate a signature from.
|
|
||||||
//
|
|
||||||
// The hash is calculated as
|
|
||||||
// keccak256("\x19Ethereum Signed Message:\n"${message length}${message}).
|
|
||||||
//
|
|
||||||
// This gives context to the signed message and prevents signing of transactions.
|
|
||||||
func signHash(data []byte) []byte {
|
|
||||||
msg := fmt.Sprintf("\x19Ethereum Signed Message:\n%d%s", len(data), data)
|
|
||||||
return crypto.Keccak256([]byte(msg))
|
|
||||||
}
|
|
||||||
|
|
||||||
// mustPrintJSON prints the JSON encoding of the given object and
|
// mustPrintJSON prints the JSON encoding of the given object and
|
||||||
// exits the program with an error message when the marshaling fails.
|
// exits the program with an error message when the marshaling fails.
|
||||||
func mustPrintJSON(jsonObject interface{}) {
|
func mustPrintJSON(jsonObject interface{}) {
|
||||||
|
@ -169,7 +169,7 @@ func (api *SignerAPI) determineSignatureFormat(ctx context.Context, contentType
|
|||||||
req = &SignDataRequest{ContentType: mediaType, Rawdata: cliqueRlp, Messages: messages, Hash: sighash}
|
req = &SignDataRequest{ContentType: mediaType, Rawdata: cliqueRlp, Messages: messages, Hash: sighash}
|
||||||
default: // also case TextPlain.Mime:
|
default: // also case TextPlain.Mime:
|
||||||
// Calculates an Ethereum ECDSA signature for:
|
// Calculates an Ethereum ECDSA signature for:
|
||||||
// hash = keccak256("\x19${byteVersion}Ethereum Signed Message:\n${message length}${message}")
|
// hash = keccak256("\x19Ethereum Signed Message:\n${message length}${message}")
|
||||||
// We expect it to be a string
|
// We expect it to be a string
|
||||||
if stringData, ok := data.(string); !ok {
|
if stringData, ok := data.(string); !ok {
|
||||||
return nil, useEthereumV, fmt.Errorf("input for text/plain must be an hex-encoded string")
|
return nil, useEthereumV, fmt.Errorf("input for text/plain must be an hex-encoded string")
|
||||||
@ -194,7 +194,7 @@ func (api *SignerAPI) determineSignatureFormat(ctx context.Context, contentType
|
|||||||
return req, useEthereumV, nil
|
return req, useEthereumV, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// SignTextWithValidator signs the given message which can be further recovered
|
// SignTextValidator signs the given message which can be further recovered
|
||||||
// with the given validator.
|
// with the given validator.
|
||||||
// hash = keccak256("\x19\x00"${address}${data}).
|
// hash = keccak256("\x19\x00"${address}${data}).
|
||||||
func SignTextValidator(validatorData apitypes.ValidatorData) (hexutil.Bytes, string) {
|
func SignTextValidator(validatorData apitypes.ValidatorData) (hexutil.Bytes, string) {
|
||||||
@ -271,11 +271,11 @@ func (api *SignerAPI) EcRecover(ctx context.Context, data hexutil.Bytes, sig hex
|
|||||||
//
|
//
|
||||||
// Note, this function is compatible with eth_sign and personal_sign. As such it recovers
|
// Note, this function is compatible with eth_sign and personal_sign. As such it recovers
|
||||||
// the address of:
|
// the address of:
|
||||||
// hash = keccak256("\x19${byteVersion}Ethereum Signed Message:\n${message length}${message}")
|
// hash = keccak256("\x19Ethereum Signed Message:\n${message length}${message}")
|
||||||
// addr = ecrecover(hash, signature)
|
// addr = ecrecover(hash, signature)
|
||||||
//
|
//
|
||||||
// Note, the signature must conform to the secp256k1 curve R, S and V values, where
|
// Note, the signature must conform to the secp256k1 curve R, S and V values, where
|
||||||
// the V value must be be 27 or 28 for legacy reasons.
|
// the V value must be 27 or 28 for legacy reasons.
|
||||||
//
|
//
|
||||||
// https://github.com/ethereum/go-ethereum/wiki/Management-APIs#personal_ecRecover
|
// https://github.com/ethereum/go-ethereum/wiki/Management-APIs#personal_ecRecover
|
||||||
if len(sig) != 65 {
|
if len(sig) != 65 {
|
||||||
|
Loading…
Reference in New Issue
Block a user