From 26b7d8728f684a3df4bd931be2400a4dee5c85c4 Mon Sep 17 00:00:00 2001 From: Matthew Leon Date: Wed, 27 Mar 2019 23:13:42 -0400 Subject: [PATCH] KeyChainGroup: Fix NullPointerExceptions in encrypt() for the case of only a basic keychain. --- .../main/java/org/bitcoinj/wallet/KeyChainGroup.java | 12 +++++++----- .../java/org/bitcoinj/wallet/KeyChainGroupTest.java | 10 ++++++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/org/bitcoinj/wallet/KeyChainGroup.java b/core/src/main/java/org/bitcoinj/wallet/KeyChainGroup.java index 586b88be..e4e757cd 100644 --- a/core/src/main/java/org/bitcoinj/wallet/KeyChainGroup.java +++ b/core/src/main/java/org/bitcoinj/wallet/KeyChainGroup.java @@ -667,17 +667,19 @@ public class KeyChainGroup implements KeyBag { public void encrypt(KeyCrypter keyCrypter, KeyParameter aesKey) { checkNotNull(keyCrypter); checkNotNull(aesKey); - checkState(chains == null || !chains.isEmpty() || basic.numKeys() != 0, "can't encrypt entirely empty wallet"); + checkState((chains != null && !chains.isEmpty()) || basic.numKeys() != 0, "can't encrypt entirely empty wallet"); // This code must be exception safe. + BasicKeyChain newBasic = basic.toEncrypted(keyCrypter, aesKey); + this.basic = newBasic; List newChains = new ArrayList<>(); - if (chains != null) + if (chains != null) { for (DeterministicKeyChain chain : chains) newChains.add(chain.toEncrypted(keyCrypter, aesKey)); + this.chains.clear(); + this.chains.addAll(newChains); + } this.keyCrypter = keyCrypter; - basic = newBasic; - this.chains.clear(); - this.chains.addAll(newChains); } /** diff --git a/core/src/test/java/org/bitcoinj/wallet/KeyChainGroupTest.java b/core/src/test/java/org/bitcoinj/wallet/KeyChainGroupTest.java index 33761656..880d3d9e 100644 --- a/core/src/test/java/org/bitcoinj/wallet/KeyChainGroupTest.java +++ b/core/src/test/java/org/bitcoinj/wallet/KeyChainGroupTest.java @@ -713,4 +713,14 @@ public class KeyChainGroupTest { group.currentAddress(KeyPurpose.RECEIVE_FUNDS).toString()); assertEquals("bc1qw8sf3mwuwn74qnhj83gjg0cwkk78fun2pxl9t2", group.currentAddress(KeyPurpose.CHANGE).toString()); } + + @Test + public void onlyBasicKeyEncryption() { + group = KeyChainGroup.createBasic(MAINNET); + final ECKey key = ECKey.fromPrivate(BigInteger.TEN); + group.importKeys(key); + KeyCrypterScrypt scrypt = new KeyCrypterScrypt(2); + KeyParameter aesKey = scrypt.deriveKey("password"); + group.encrypt(scrypt, aesKey); + } }