aboutsummaryrefslogtreecommitdiffstats
path: root/cmd
diff options
context:
space:
mode:
authorPaul Berg <hello@paulrberg.com>2019-02-06 15:30:49 +0800
committerMartin Holst Swende <martin@swende.se>2019-02-06 15:30:49 +0800
commit572baae10a28da2d02085df7e2f3a282883f5d6e (patch)
tree3e5424ac64dbeae440604d32aed4293199179c99 /cmd
parent7c60d0a6a2d3925c2862cbbb188988475619fd0d (diff)
downloadgo-tangerine-572baae10a28da2d02085df7e2f3a282883f5d6e.tar
go-tangerine-572baae10a28da2d02085df7e2f3a282883f5d6e.tar.gz
go-tangerine-572baae10a28da2d02085df7e2f3a282883f5d6e.tar.bz2
go-tangerine-572baae10a28da2d02085df7e2f3a282883f5d6e.tar.lz
go-tangerine-572baae10a28da2d02085df7e2f3a282883f5d6e.tar.xz
go-tangerine-572baae10a28da2d02085df7e2f3a282883f5d6e.tar.zst
go-tangerine-572baae10a28da2d02085df7e2f3a282883f5d6e.zip
signer, clef: implement EIP191/712 (#17789)
* Named functions and defined a basic EIP191 content type list * Written basic content type functions * Added ecRecover method in the clef api * Updated the extapi changelog and addded indications in the README * Changed the version of the external API * Added tests for 0x45 * Implementing UnmarshalJSON() for TypedData * Working on TypedData * Solved the auditlog issue * Changed method to signTypedData * Changed mimes and implemented the 'encodeType' function for EIP-712 * Polished docstrings, ran goimports and swapped fmt.Errorf with errors.New where possible * Drafted recursive encodeData * Ran goimports and gofmt * Drafted first version of EIP-712, including tests * Temporarily switched to using common.Address in tests * Drafted text/validator and and rewritten []byte as hexutil.Bytes * Solved stringified address encoding issue * Changed the property type required by signData from bytes to interface{} * Fixed bugs in 'data/typed' signs * Brought legal warning back after temporarily disabling it for development * Added example RPC calls for account_signData and account_signTypedData * Named functions and defined a basic EIP191 content type list * Written basic content type functions * Added ecRecover method in the clef api * Updated the extapi changelog and addded indications in the README * Added tests for 0x45 * Implementing UnmarshalJSON() for TypedData * Working on TypedData * Solved the auditlog issue * Changed method to signTypedData * Changed mimes and implemented the 'encodeType' function for EIP-712 * Polished docstrings, ran goimports and swapped fmt.Errorf with errors.New where possible * Drafted recursive encodeData * Ran goimports and gofmt * Drafted first version of EIP-712, including tests * Temporarily switched to using common.Address in tests * Drafted text/validator and and rewritten []byte as hexutil.Bytes * Solved stringified address encoding issue * Changed the property type required by signData from bytes to interface{} * Fixed bugs in 'data/typed' signs * Brought legal warning back after temporarily disabling it for development * Added example RPC calls for account_signData and account_signTypedData * Polished and fixed PR * Polished and fixed PR * Solved malformed data panics and also wrote tests * Solved malformed data panics and also wrote tests * Added alphabetical sorting to type dependencies * Added alphabetical sorting to type dependencies * Added pretty print to data/typed UI * Added pretty print to data/typed UI * signer: more tests for typed data * signer: more tests for typed data * Fixed TestMalformedData4 errors and renamed IsValid to Validate * Fixed TestMalformedData4 errors and renamed IsValid to Validate * Fixed more new failing tests and deanonymised some functions * Fixed more new failing tests and deanonymised some functions * Added types to EIP712 output in cliui * Added types to EIP712 output in cliui * Fixed regexp issues * Fixed regexp issues * Added pseudo-failing test * Added pseudo-failing test * Fixed false positive test * Fixed false positive test * Added PrettyPrint method * Added PrettyPrint method * signer: refactor formatting and UI * signer: make ui use new message format for signing * Fixed breaking changes * Fixed rules_test failing test * Added extra regexp for reference types * signer: more hard types * Fixed failing test, formatted files * signer: use golang/x keccak * Fixed goimports error * clef, signer: address some review concerns * Implemented latest recommendations * Fixed comments and uintint256 issue * accounts, signer: fix mimetypes, add interface to sign data with passphrase * signer, accounts: remove duplicated code, pass hash preimages to signing * signer: prevent panic in type assertions, make cliui print rawdata as quotable-safe * signer: linter fixes, remove deprecated crypto dependency * accounts: fix goimport
Diffstat (limited to 'cmd')
-rw-r--r--cmd/clef/README.md134
-rw-r--r--cmd/clef/extapi_changelog.md10
-rw-r--r--cmd/clef/intapi_changelog.md4
-rw-r--r--cmd/clef/main.go38
4 files changed, 169 insertions, 17 deletions
diff --git a/cmd/clef/README.md b/cmd/clef/README.md
index c9461be10..2e1dac299 100644
--- a/cmd/clef/README.md
+++ b/cmd/clef/README.md
@@ -189,7 +189,9 @@ None
"method": "account_new",
"params": []
}
-
+```
+Response
+```
{
"id": 0,
"jsonrpc": "2.0",
@@ -222,7 +224,9 @@ None
"jsonrpc": "2.0",
"method": "account_list"
}
-
+```
+Response
+```
{
"id": 1,
"jsonrpc": "2.0",
@@ -285,8 +289,8 @@ Response
```json
{
+ "id": 2,
"jsonrpc": "2.0",
- "id": 67,
"error": {
"code": -32000,
"message": "Request denied"
@@ -298,6 +302,7 @@ Response
```json
{
+ "id": 67,
"jsonrpc": "2.0",
"method": "account_signTransaction",
"params": [
@@ -311,8 +316,7 @@ Response
"data": "0x4401a6e40000000000000000000000000000000000000000000000000000000000000012"
},
"safeSend(address)"
- ],
- "id": 67
+ ]
}
```
Response
@@ -346,15 +350,18 @@ Bash example:
{"jsonrpc":"2.0","id":67,"result":{"raw":"0xf88380018203339407a565b7ed7d7a678680a4c162885bedbb695fe080a44401a6e4000000000000000000000000000000000000000000000000000000000000001226a0223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20ea02aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663","tx":{"nonce":"0x0","gasPrice":"0x1","gas":"0x333","to":"0x07a565b7ed7d7a678680a4c162885bedbb695fe0","value":"0x0","input":"0x4401a6e40000000000000000000000000000000000000000000000000000000000000012","v":"0x26","r":"0x223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20e","s":"0x2aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663","hash":"0xeba2df809e7a612a0a0d444ccfa5c839624bdc00dd29e3340d46df3870f8a30e"}}}
```
-
-### account_sign
+### account_signData
#### Sign data
Signs a chunk of data and returns the calculated signature.
#### Arguments
+ - content type [string]: type of signed data
+ - `text/validator`: hex data with custom validator defined in a contract
+ - `application/clique`: [clique](https://github.com/ethereum/EIPs/issues/225) headers
+ - `text/plain`: simple hex data validated by `account_ecRecover`
- account [address]: account to sign with
- - data [data]: data to sign
+ - data [object]: data to sign
#### Result
- calculated signature [data]
@@ -364,8 +371,9 @@ Bash example:
{
"id": 3,
"jsonrpc": "2.0",
- "method": "account_sign",
+ "method": "account_signData",
"params": [
+ "data/plain",
"0x1923f626bb8dc025849e00f99c25fe2b2f7fb0db",
"0xaabbccdd"
]
@@ -381,11 +389,109 @@ Response
}
```
+### account_signTypedData
+
+#### Sign data
+ Signs a chunk of structured data conformant to [EIP712]([EIP-712](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md)) and returns the calculated signature.
+
+#### Arguments
+ - account [address]: account to sign with
+ - data [object]: data to sign
+
+#### Result
+ - calculated signature [data]
+
+#### Sample call
+```json
+{
+ "id": 68,
+ "jsonrpc": "2.0",
+ "method": "account_signTypedData",
+ "params": [
+ "0xcd2a3d9f938e13cd947ec05abc7fe734df8dd826",
+ {
+ "types": {
+ "EIP712Domain": [
+ {
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "name": "version",
+ "type": "string"
+ },
+ {
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "name": "verifyingContract",
+ "type": "address"
+ }
+ ],
+ "Person": [
+ {
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "name": "wallet",
+ "type": "address"
+ }
+ ],
+ "Mail": [
+ {
+ "name": "from",
+ "type": "Person"
+ },
+ {
+ "name": "to",
+ "type": "Person"
+ },
+ {
+ "name": "contents",
+ "type": "string"
+ }
+ ]
+ },
+ "primaryType": "Mail",
+ "domain": {
+ "name": "Ether Mail",
+ "version": "1",
+ "chainId": 1,
+ "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC"
+ },
+ "message": {
+ "from": {
+ "name": "Cow",
+ "wallet": "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826"
+ },
+ "to": {
+ "name": "Bob",
+ "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB"
+ },
+ "contents": "Hello, Bob!"
+ }
+ }
+ ]
+}
+```
+Response
+
+```json
+{
+ "id": 1,
+ "jsonrpc": "2.0",
+ "result": "0x4355c47d63924e8a72e509b65029052eb6c299d53a04e167c5775fd466751c9d07299936d304c153f6443dfa05f40ff007d72911b6f72307f996231605b915621c"
+}
+```
+
### account_ecRecover
-#### Recover address
- Derive the address from the account that was used to sign data from the data and signature.
-
+#### Sign data
+
+Derive the address from the account that was used to sign data with content type `text/plain` and the signature.
+
#### Arguments
- data [data]: data that was signed
- signature [data]: the signature to verify
@@ -400,6 +506,7 @@ Response
"jsonrpc": "2.0",
"method": "account_ecRecover",
"params": [
+ "data/plain",
"0xaabbccdd",
"0x5b6693f153b48ec1c706ba4169960386dbaa6903e249cc79a8e6ddc434451d417e1e57327872c7f538beeb323c300afa9999a3d4a5de6caf3be0d5ef832b67ef1c"
]
@@ -413,7 +520,6 @@ Response
"jsonrpc": "2.0",
"result": "0x1923f626bb8dc025849e00f99c25fe2b2f7fb0db"
}
-
```
### account_import
@@ -458,7 +564,7 @@ Response
},
"id": "09bccb61-b8d3-4e93-bf4f-205a8194f0b9",
"version": 3
- },
+ }
]
}
```
diff --git a/cmd/clef/extapi_changelog.md b/cmd/clef/extapi_changelog.md
index 6c2c3e819..25f819bdd 100644
--- a/cmd/clef/extapi_changelog.md
+++ b/cmd/clef/extapi_changelog.md
@@ -1,5 +1,15 @@
### Changelog for external API
+#### 5.0.0
+
+* The external `account_EcRecover`-method was reimplemented.
+* The external method `account_sign(address, data)` was replaced with `account_signData(contentType, address, data)`.
+The addition of `contentType` makes it possible to use the method for different types of objects, such as:
+ * signing data with an intended validator (not yet implemented)
+ * signing clique headers,
+ * signing plain personal messages,
+* The external method `account_signTypedData` implements [EIP-712](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md) and makes it possible to sign typed data.
+
#### 4.0.0
* The external `account_Ecrecover`-method was removed.
diff --git a/cmd/clef/intapi_changelog.md b/cmd/clef/intapi_changelog.md
index 92a39a268..6388af730 100644
--- a/cmd/clef/intapi_changelog.md
+++ b/cmd/clef/intapi_changelog.md
@@ -1,5 +1,9 @@
### Changelog for internal API (ui-api)
+### 3.1.0
+
+* Add `ContentType string` to `SignDataRequest` to accommodate the latest EIP-191 and EIP-712 implementations.
+
### 3.0.0
* Make use of `OnInputRequired(info UserInputRequest)` for obtaining master password during startup
diff --git a/cmd/clef/main.go b/cmd/clef/main.go
index e2b85288d..38821102d 100644
--- a/cmd/clef/main.go
+++ b/cmd/clef/main.go
@@ -28,6 +28,7 @@ import (
"fmt"
"io"
"io/ioutil"
+ "math/big"
"os"
"os/signal"
"os/user"
@@ -39,9 +40,11 @@ import (
"github.com/ethereum/go-ethereum/cmd/utils"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/console"
+ "github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/node"
+ "github.com/ethereum/go-ethereum/rlp"
"github.com/ethereum/go-ethereum/rpc"
"github.com/ethereum/go-ethereum/signer/core"
"github.com/ethereum/go-ethereum/signer/rules"
@@ -623,10 +626,40 @@ func testExternalUI(api *core.SignerAPI) {
}
var err error
+ cliqueHeader := types.Header{
+ common.HexToHash("0000H45H"),
+ common.HexToHash("0000H45H"),
+ common.HexToAddress("0000H45H"),
+ common.HexToHash("0000H00H"),
+ common.HexToHash("0000H45H"),
+ common.HexToHash("0000H45H"),
+ types.Bloom{},
+ big.NewInt(1337),
+ big.NewInt(1337),
+ 1338,
+ 1338,
+ big.NewInt(1338),
+ []byte("Extra data Extra data Extra data Extra data Extra data Extra data Extra data Extra data"),
+ common.HexToHash("0x0000H45H"),
+ types.BlockNonce{},
+ }
+ cliqueRlp, err := rlp.EncodeToBytes(cliqueHeader)
+ if err != nil {
+ utils.Fatalf("Should not error: %v", err)
+ }
+ addr, err := common.NewMixedcaseAddressFromString("0x0011223344556677889900112233445566778899")
+ if err != nil {
+ utils.Fatalf("Should not error: %v", err)
+ }
+ _, err = api.SignData(ctx, "application/clique", *addr, cliqueRlp)
+ checkErr("SignData", err)
+
_, err = api.SignTransaction(ctx, core.SendTxArgs{From: common.MixedcaseAddress{}}, nil)
checkErr("SignTransaction", err)
- _, err = api.Sign(ctx, common.MixedcaseAddress{}, common.Hex2Bytes("01020304"))
- checkErr("Sign", err)
+ _, err = api.SignData(ctx, "text/plain", common.MixedcaseAddress{}, common.Hex2Bytes("01020304"))
+ checkErr("SignData", err)
+ //_, err = api.SignTypedData(ctx, common.MixedcaseAddress{}, core.TypedData{})
+ //checkErr("SignTypedData", err)
_, err = api.List(ctx)
checkErr("List", err)
_, err = api.New(ctx)
@@ -646,7 +679,6 @@ func testExternalUI(api *core.SignerAPI) {
} else {
log.Info("No errors")
}
-
}
// getPassPhrase retrieves the password associated with clef, either fetched