diff --git a/accounts/scwallet/wallet.go b/accounts/scwallet/wallet.go index 548bc9e2e2..0496ccc15c 100644 --- a/accounts/scwallet/wallet.go +++ b/accounts/scwallet/wallet.go @@ -635,7 +635,7 @@ func (w *Wallet) SelfDerive(base accounts.DerivationPath, chain ethereum.ChainSt w.deriveChain = chain } -// SignHash requests the wallet to sign the given hash. +// SignData requests the wallet to sign the hash of the given data. // // It looks up the account specified either solely via its address contained within, // or optionally with the aid of any location metadata from the embedded URL field. @@ -644,9 +644,13 @@ func (w *Wallet) SelfDerive(base accounts.DerivationPath, chain ethereum.ChainSt // a password to decrypt the account, or a PIN code o verify the transaction), // an AuthNeededError instance will be returned, containing infos for the user // about which fields or actions are needed. The user may retry by providing -// the needed details via SignHashWithPassphrase, or by other means (e.g. unlock +// the needed details via SignDataWithPassphrase, or by other means (e.g. unlock // the account in a keystore). -func (w *Wallet) SignHash(account accounts.Account, hash []byte) ([]byte, error) { +func (w *Wallet) SignData(account accounts.Account, mimeType string, data []byte) ([]byte, error) { + return w.signHash(account, crypto.Keccak256(data)) +} + +func (w *Wallet) signHash(account accounts.Account, hash []byte) ([]byte, error) { w.lock.Lock() defer w.lock.Unlock() @@ -672,26 +676,51 @@ func (w *Wallet) SignHash(account accounts.Account, hash []byte) ([]byte, error) func (w *Wallet) SignTx(account accounts.Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { signer := types.NewEIP155Signer(chainID) hash := signer.Hash(tx) - sig, err := w.SignHash(account, hash[:]) + sig, err := w.signHash(account, hash[:]) if err != nil { return nil, err } return tx.WithSignature(signer, sig) } -// SignHashWithPassphrase requests the wallet to sign the given hash with the +// SignDataWithPassphrase requests the wallet to sign the given hash with the // given passphrase as extra authentication information. // // It looks up the account specified either solely via its address contained within, // or optionally with the aid of any location metadata from the embedded URL field. -func (w *Wallet) SignHashWithPassphrase(account accounts.Account, passphrase string, hash []byte) ([]byte, error) { +func (w *Wallet) SignDataWithPassphrase(account accounts.Account, passphrase, mimeType string, data []byte) ([]byte, error) { + return w.signHashWithPassphrase(account, passphrase, crypto.Keccak256(data)) +} + +func (w *Wallet) signHashWithPassphrase(account accounts.Account, passphrase string, hash []byte) ([]byte, error) { if !w.session.verified { if err := w.Open(passphrase); err != nil { return nil, err } } - return w.SignHash(account, hash) + return w.signHash(account, hash) +} + +// SignText requests the wallet to sign the hash of a given piece of data, prefixed +// by the Ethereum prefix scheme +// It looks up the account specified either solely via its address contained within, +// or optionally with the aid of any location metadata from the embedded URL field. +// +// If the wallet requires additional authentication to sign the request (e.g. +// a password to decrypt the account, or a PIN code o verify the transaction), +// an AuthNeededError instance will be returned, containing infos for the user +// about which fields or actions are needed. The user may retry by providing +// the needed details via SignHashWithPassphrase, or by other means (e.g. unlock +// the account in a keystore). +func (w *Wallet) SignText(account accounts.Account, text []byte) ([]byte, error) { + return w.signHash(account, accounts.TextHash(text)) +} + +// SignTextWithPassphrase implements accounts.Wallet, attempting to sign the +// given hash with the given account using passphrase as extra authentication +func (w *Wallet) SignTextWithPassphrase(account accounts.Account, passphrase string, text []byte) ([]byte, error) { + return w.signHashWithPassphrase(account, passphrase, crypto.Keccak256(accounts.TextHash(text))) } // SignTxWithPassphrase requests the wallet to sign the given transaction, with the diff --git a/console/bridge.go b/console/bridge.go index e90991dc6b..b022a465dd 100644 --- a/console/bridge.go +++ b/console/bridge.go @@ -175,7 +175,6 @@ func (b *bridge) OpenWallet(call otto.FunctionCall) (response otto.Value) { throwJSException(err.Error()) } return val ->>>>>>> accounts/scwallet, console: user friendly card opening } func (b *bridge) readPassphraseAndReopenWallet(call otto.FunctionCall) (otto.Value, error) {