Fix broken low-R signing with a password encrypted wallet #7242
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #7241
Prevent
KeyIsEncryptedException
from being thrown when signing with aLowRSigningKey
-wrapped, encrypted HD key, due to breakage of the apparent invariant that thekeyCrypter
field ofECKey
should be null whenever the key isn't encrypted.When signing with a wrapped, encrypted HD key, the original key is decrypted and then re-wrapped as a
LowRSigningKey
instance. This was blindly copying thekeyCrypter
property of the decrypted key. ButDeterministicKey::getKeyCrypter
returns non-null if its parent does, even if the actual field is null, and the decrypted HD key has the same parent as the encrypted original. Thus, blindly copying the property (rather than the field) breaks the above invariant.--
I've tested the fix on regtest, and proposals, blind votes and vote reveals now appear to publish OK with both encrypted and unencrypted wallets. The unfixed code produced the following exception stack trace on regtest, when making a reimbursement request with a password encrypted wallet: