diff --git a/API.md b/API.md index d7cc3168..80aa6650 100644 --- a/API.md +++ b/API.md @@ -584,13 +584,27 @@ This endpoint will sign the provided data. * `name` (`string: `) - Specifies the name of the account to use for signing. This is specified as part of the URL. * `data` (`string: `) - Some data. +* `encoding` (`string: `) - The encoding of the data. #### Sample Payload +##### UTF8 Payload + ```sh { - "data": "this is very important" + "data": "this is very important", + "encoding": "utf8" +} +``` + +##### Hexadecimal Payload (remove `0x` prefix) + +```sh + +{ + "data": "de0B295669a9FD93d5F28D9Ec85E40f4cb697BAe", + "encoding": "hex" } ``` diff --git a/path_accounts.go b/path_accounts.go index bd257331..fc5f7cbb 100644 --- a/path_accounts.go +++ b/path_accounts.go @@ -262,6 +262,10 @@ Sign data using a given Ethereum account. Type: framework.TypeString, Description: "The data to hash (keccak) and sign.", }, + "encoding": &framework.FieldSchema{ + Type: framework.TypeString, + Description: "Encoding of the provided data.", + }, }, ExistenceCheck: b.pathExistenceCheck, Callbacks: map[logical.Operation]framework.OperationFunc{ @@ -857,7 +861,22 @@ func (b *EthereumBackend) pathSign(ctx context.Context, req *logical.Request, da } name := data.Get("name").(string) - dataToSign := data.Get("data").(string) + rawData := data.Get("data").(string) + encoding := data.Get("encoding").(string) + + var dataToSign []byte + + if encoding == "hex" { + dataToSign, err = Decode([]byte(rawData)) + if err != nil { + return nil, err + } + } else if encoding == "utf8" { + dataToSign = []byte(rawData) + } else { + return nil, fmt.Errorf("invalid encoding encountered - %s", encoding) + } + account, err := b.readAccount(ctx, req, name) if err != nil { return nil, fmt.Errorf("error reading account")