diff options
author | Péter Szilágyi <peterke@gmail.com> | 2019-07-02 19:01:47 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-02 19:01:47 +0800 |
commit | a0943b8932f2fcd28dc103689f904a3c75ea07a4 (patch) | |
tree | c94898e32a2a755d962ab78eb2cddbc09f0fc02b /signer/core | |
parent | 6bf5555c4f79b8161b4cbedc19da9d29ca6e2305 (diff) | |
download | go-tangerine-a0943b8932f2fcd28dc103689f904a3c75ea07a4.tar go-tangerine-a0943b8932f2fcd28dc103689f904a3c75ea07a4.tar.gz go-tangerine-a0943b8932f2fcd28dc103689f904a3c75ea07a4.tar.bz2 go-tangerine-a0943b8932f2fcd28dc103689f904a3c75ea07a4.tar.lz go-tangerine-a0943b8932f2fcd28dc103689f904a3c75ea07a4.tar.xz go-tangerine-a0943b8932f2fcd28dc103689f904a3c75ea07a4.tar.zst go-tangerine-a0943b8932f2fcd28dc103689f904a3c75ea07a4.zip |
cmd/clef, signer: refresh tutorial, fix noticed issues (#19774)
* cmd/clef, signer: refresh tutorial, fix noticed issues
* cmd/clef, signer: support removing stored keys (delpw + rules)
* cmd/clef: polishes + Geth integration in the tutorial
Diffstat (limited to 'signer/core')
-rw-r--r-- | signer/core/api.go | 31 | ||||
-rw-r--r-- | signer/core/cliui.go | 8 | ||||
-rw-r--r-- | signer/core/signed_data.go | 21 |
3 files changed, 28 insertions, 32 deletions
diff --git a/signer/core/api.go b/signer/core/api.go index 251ee55dc..d68919c6f 100644 --- a/signer/core/api.go +++ b/signer/core/api.go @@ -24,7 +24,6 @@ import ( "math/big" "os" "reflect" - "strings" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts/keystore" @@ -44,7 +43,7 @@ const ( // ExternalAPIVersion -- see extapi_changelog.md ExternalAPIVersion = "6.0.0" // InternalAPIVersion -- see intapi_changelog.md - InternalAPIVersion = "6.0.0" + InternalAPIVersion = "7.0.0" ) // ExternalAPI defines the external API through which signing requests are made. @@ -234,7 +233,7 @@ type ( ContentType string `json:"content_type"` Address common.MixedcaseAddress `json:"address"` Rawdata []byte `json:"raw_data"` - Message []*NameValueType `json:"message"` + Messages []*NameValueType `json:"messages"` Hash hexutil.Bytes `json:"hash"` Meta Metadata `json:"meta"` } @@ -477,22 +476,24 @@ func logDiff(original *SignTxRequest, new *SignTxResponse) bool { return modified } -func (api *SignerAPI) lookupPassword(address common.Address) string { - return api.credentials.Get(strings.ToLower(address.String())) +func (api *SignerAPI) lookupPassword(address common.Address) (string, error) { + return api.credentials.Get(address.Hex()) } + func (api *SignerAPI) lookupOrQueryPassword(address common.Address, title, prompt string) (string, error) { - if pw := api.lookupPassword(address); pw != "" { + // Look up the password and return if available + if pw, err := api.lookupPassword(address); err == nil { return pw, nil - } else { - pwResp, err := api.UI.OnInputRequired(UserInputRequest{title, prompt, true}) - if err != nil { - log.Warn("error obtaining password", "error", err) - // We'll not forward the error here, in case the error contains info about the response from the UI, - // which could leak the password if it was malformed json or something - return "", errors.New("internal error") - } - return pwResp.Text, nil } + // Password unavailable, request it from the user + pwResp, err := api.UI.OnInputRequired(UserInputRequest{title, prompt, true}) + if err != nil { + log.Warn("error obtaining password", "error", err) + // We'll not forward the error here, in case the error contains info about the response from the UI, + // which could leak the password if it was malformed json or something + return "", errors.New("internal error") + } + return pwResp.Text, nil } // SignTransaction signs the given Transaction and returns it both as json and rlp-encoded form diff --git a/signer/core/cliui.go b/signer/core/cliui.go index cf7101441..46a13f1e4 100644 --- a/signer/core/cliui.go +++ b/signer/core/cliui.go @@ -169,13 +169,12 @@ func (ui *CommandlineUI) ApproveSignData(request *SignDataRequest) (SignDataResp fmt.Printf("-------- Sign data request--------------\n") fmt.Printf("Account: %s\n", request.Address.String()) - fmt.Printf("message:\n") - for _, nvt := range request.Message { + fmt.Printf("messages:\n") + for _, nvt := range request.Messages { fmt.Printf("%v\n", nvt.Pprint(1)) } - //fmt.Printf("message: \n%v\n", request.Message) fmt.Printf("raw data: \n%q\n", request.Rawdata) - fmt.Printf("message hash: %v\n", request.Hash) + fmt.Printf("data hash: %v\n", request.Hash) fmt.Printf("-------------------------------------------\n") showMetadata(request.Meta) if !ui.confirm() { @@ -187,7 +186,6 @@ func (ui *CommandlineUI) ApproveSignData(request *SignDataRequest) (SignDataResp // ApproveListing prompt the user for confirmation to list accounts // the list of accounts to list can be modified by the UI func (ui *CommandlineUI) ApproveListing(request *ListRequest) (ListResponse, error) { - ui.mu.Lock() defer ui.mu.Unlock() diff --git a/signer/core/signed_data.go b/signer/core/signed_data.go index 27eca9183..91e6cc7da 100644 --- a/signer/core/signed_data.go +++ b/signer/core/signed_data.go @@ -123,11 +123,10 @@ type TypedDataDomain struct { var typedDataReferenceTypeRegexp = regexp.MustCompile(`^[A-Z](\w*)(\[\])?$`) // sign receives a request and produces a signature - +// // Note, the produced signature conforms to the secp256k1 curve R, S and V values, // where the V value will be 27 or 28 for legacy reasons, if legacyV==true. func (api *SignerAPI) sign(addr common.MixedcaseAddress, req *SignDataRequest, legacyV bool) (hexutil.Bytes, error) { - // We make the request prior to looking up if we actually have the account, to prevent // account-enumeration via the API res, err := api.UI.ApproveSignData(req) @@ -169,7 +168,6 @@ func (api *SignerAPI) SignData(ctx context.Context, contentType string, addr com if err != nil { return nil, err } - signature, err := api.sign(addr, req, transformV) if err != nil { api.UI.ShowError(err.Error()) @@ -202,7 +200,7 @@ func (api *SignerAPI) determineSignatureFormat(ctx context.Context, contentType return nil, useEthereumV, err } sighash, msg := SignTextValidator(validatorData) - message := []*NameValueType{ + messages := []*NameValueType{ { Name: "This is a request to sign data intended for a particular validator (see EIP 191 version 0)", Typ: "description", @@ -224,7 +222,7 @@ func (api *SignerAPI) determineSignatureFormat(ctx context.Context, contentType Value: fmt.Sprintf("0x%x", msg), }, } - req = &SignDataRequest{ContentType: mediaType, Rawdata: []byte(msg), Message: message, Hash: sighash} + req = &SignDataRequest{ContentType: mediaType, Rawdata: []byte(msg), Messages: messages, Hash: sighash} case ApplicationClique.Mime: // Clique is the Ethereum PoA standard stringData, ok := data.(string) @@ -251,7 +249,7 @@ func (api *SignerAPI) determineSignatureFormat(ctx context.Context, contentType if err != nil { return nil, useEthereumV, err } - message := []*NameValueType{ + messages := []*NameValueType{ { Name: "Clique header", Typ: "clique", @@ -260,7 +258,7 @@ func (api *SignerAPI) determineSignatureFormat(ctx context.Context, contentType } // Clique uses V on the form 0 or 1 useEthereumV = false - req = &SignDataRequest{ContentType: mediaType, Rawdata: cliqueRlp, Message: message, Hash: sighash} + req = &SignDataRequest{ContentType: mediaType, Rawdata: cliqueRlp, Messages: messages, Hash: sighash} default: // also case TextPlain.Mime: // Calculates an Ethereum ECDSA signature for: // hash = keccak256("\x19${byteVersion}Ethereum Signed Message:\n${message length}${message}") @@ -272,21 +270,20 @@ func (api *SignerAPI) determineSignatureFormat(ctx context.Context, contentType return nil, useEthereumV, err } else { sighash, msg := accounts.TextAndHash(textData) - message := []*NameValueType{ + messages := []*NameValueType{ { Name: "message", Typ: accounts.MimetypeTextPlain, Value: msg, }, } - req = &SignDataRequest{ContentType: mediaType, Rawdata: []byte(msg), Message: message, Hash: sighash} + req = &SignDataRequest{ContentType: mediaType, Rawdata: []byte(msg), Messages: messages, Hash: sighash} } } } req.Address = addr req.Meta = MetadataFromContext(ctx) return req, useEthereumV, nil - } // SignTextWithValidator signs the given message which can be further recovered @@ -327,11 +324,11 @@ func (api *SignerAPI) SignTypedData(ctx context.Context, addr common.MixedcaseAd } rawData := []byte(fmt.Sprintf("\x19\x01%s%s", string(domainSeparator), string(typedDataHash))) sighash := crypto.Keccak256(rawData) - message, err := typedData.Format() + messages, err := typedData.Format() if err != nil { return nil, err } - req := &SignDataRequest{ContentType: DataTyped.Mime, Rawdata: rawData, Message: message, Hash: sighash} + req := &SignDataRequest{ContentType: DataTyped.Mime, Rawdata: rawData, Messages: messages, Hash: sighash} signature, err := api.sign(addr, req, true) if err != nil { api.UI.ShowError(err.Error()) |