aboutsummaryrefslogtreecommitdiffstats
path: root/accounts
diff options
context:
space:
mode:
authorJeffrey Wilcke <jeffrey@ethereum.org>2016-05-23 20:17:46 +0800
committerJeffrey Wilcke <jeffrey@ethereum.org>2016-05-23 20:17:46 +0800
commit7f515b0e88d864c8ef272c16ea51a1f17e3472d1 (patch)
tree45aa901ac6c44596859cf1c5731f5592a607d7cc /accounts
parentb4dd3209b29870d58f5ba60831005ccdd9ea0f79 (diff)
parent64a6c2c1b6c81fddccc7d3d728b7a05c5814124b (diff)
downloaddexon-7f515b0e88d864c8ef272c16ea51a1f17e3472d1.tar
dexon-7f515b0e88d864c8ef272c16ea51a1f17e3472d1.tar.gz
dexon-7f515b0e88d864c8ef272c16ea51a1f17e3472d1.tar.bz2
dexon-7f515b0e88d864c8ef272c16ea51a1f17e3472d1.tar.lz
dexon-7f515b0e88d864c8ef272c16ea51a1f17e3472d1.tar.xz
dexon-7f515b0e88d864c8ef272c16ea51a1f17e3472d1.tar.zst
dexon-7f515b0e88d864c8ef272c16ea51a1f17e3472d1.zip
Merge pull request #2564 from bas-vk/submit-tx
eth: add new RPC method (personal.) SignAndSendTransaction
Diffstat (limited to 'accounts')
-rw-r--r--accounts/account_manager.go16
-rw-r--r--accounts/accounts_test.go28
2 files changed, 42 insertions, 2 deletions
diff --git a/accounts/account_manager.go b/accounts/account_manager.go
index 3afadf6b2..bfb7556d6 100644
--- a/accounts/account_manager.go
+++ b/accounts/account_manager.go
@@ -147,9 +147,21 @@ func (am *Manager) Sign(addr common.Address, hash []byte) (signature []byte, err
return crypto.Sign(hash, unlockedKey.PrivateKey)
}
+// SignWithPassphrase signs hash if the private key matching the given address can be
+// decrypted with the given passphrase.
+func (am *Manager) SignWithPassphrase(addr common.Address, passphrase string, hash []byte) (signature []byte, err error) {
+ _, key, err := am.getDecryptedKey(Account{Address: addr}, passphrase)
+ if err != nil {
+ return nil, err
+ }
+
+ defer zeroKey(key.PrivateKey)
+ return crypto.Sign(hash, key.PrivateKey)
+}
+
// Unlock unlocks the given account indefinitely.
-func (am *Manager) Unlock(a Account, keyAuth string) error {
- return am.TimedUnlock(a, keyAuth, 0)
+func (am *Manager) Unlock(a Account, passphrase string) error {
+ return am.TimedUnlock(a, passphrase, 0)
}
// Lock removes the private key with the given address from memory.
diff --git a/accounts/accounts_test.go b/accounts/accounts_test.go
index 829cf3968..2e5f2b44a 100644
--- a/accounts/accounts_test.go
+++ b/accounts/accounts_test.go
@@ -81,6 +81,34 @@ func TestSign(t *testing.T) {
}
}
+func TestSignWithPassphrase(t *testing.T) {
+ dir, am := tmpManager(t, true)
+ defer os.RemoveAll(dir)
+
+ pass := "passwd"
+ acc, err := am.NewAccount(pass)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if _, unlocked := am.unlocked[acc.Address]; unlocked {
+ t.Fatal("expected account to be locked")
+ }
+
+ _, err = am.SignWithPassphrase(acc.Address, pass, testSigData)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if _, unlocked := am.unlocked[acc.Address]; unlocked {
+ t.Fatal("expected account to be locked")
+ }
+
+ if _, err = am.SignWithPassphrase(acc.Address, "invalid passwd", testSigData); err == nil {
+ t.Fatal("expected SignHash to fail with invalid password")
+ }
+}
+
func TestTimedUnlock(t *testing.T) {
dir, am := tmpManager(t, true)
defer os.RemoveAll(dir)