diff --git a/core/src/main/java/org/bitcoinj/core/Wallet.java b/core/src/main/java/org/bitcoinj/core/Wallet.java index 0a469cfe..d133fa6e 100644 --- a/core/src/main/java/org/bitcoinj/core/Wallet.java +++ b/core/src/main/java/org/bitcoinj/core/Wallet.java @@ -1144,6 +1144,28 @@ public class Wallet extends BaseTaggableObject implements Serializable, BlockCha return getEncryptionType() != EncryptionType.UNENCRYPTED; } + /** Changes wallet encryption password, this is atomic operation. */ + public void changeEncryptionPassword(CharSequence currentPassword, CharSequence newPassword){ + keychainLock.lock(); + try { + decrypt(currentPassword); + encrypt(newPassword); + } finally { + keychainLock.unlock(); + } + } + + /** Changes wallet AES encryption key, this is atomic operation. */ + public void changeEncryptionKey(KeyCrypter keyCrypter, KeyParameter currentAesKey, KeyParameter newAesKey){ + keychainLock.lock(); + try { + decrypt(currentAesKey); + encrypt(keyCrypter, newAesKey); + } finally { + keychainLock.unlock(); + } + } + //endregion /******************************************************************************************************************/ diff --git a/core/src/test/java/org/bitcoinj/core/WalletTest.java b/core/src/test/java/org/bitcoinj/core/WalletTest.java index 50b444a6..062212fa 100644 --- a/core/src/test/java/org/bitcoinj/core/WalletTest.java +++ b/core/src/test/java/org/bitcoinj/core/WalletTest.java @@ -1564,6 +1564,33 @@ public class WalletTest extends TestWithWallet { } } + @Test + public void changePasswordTest() { + Wallet encryptedWallet = new Wallet(params); + encryptedWallet.encrypt(PASSWORD1); + CharSequence newPassword = "My name is Tom"; + encryptedWallet.changeEncryptionPassword(PASSWORD1, newPassword); + assertTrue(encryptedWallet.checkPassword(newPassword)); + assertFalse(encryptedWallet.checkPassword(WRONG_PASSWORD)); + } + + @Test + public void changeAesKeyTest() { + Wallet encryptedWallet = new Wallet(params); + encryptedWallet.encrypt(PASSWORD1); + + KeyCrypter keyCrypter = encryptedWallet.getKeyCrypter(); + KeyParameter aesKey = keyCrypter.deriveKey(PASSWORD1); + + CharSequence newPassword = "My name is Tom"; + KeyParameter newAesKey = keyCrypter.deriveKey(newPassword); + + encryptedWallet.changeEncryptionKey(keyCrypter, aesKey, newAesKey); + + assertTrue(encryptedWallet.checkAESKey(newAesKey)); + assertFalse(encryptedWallet.checkAESKey(aesKey)); + } + @Test public void encryptionDecryptionCheckExceptions() throws Exception { Wallet encryptedWallet = new Wallet(params);