mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-24 12:57:36 +01:00
Merge bitcoin/bitcoin#31603: descriptor: check whitespace in keys within fragments
21e9d39a37docs: add release notes for 31603 (brunoerg)a8b548d75dtest: `getdescriptorinfo`/`importdescriptors` with whitespace in pubkeys (brunoerg)c7afca3d62test: descriptor: check whitespace into keys (brunoerg)cb722a3ceadescriptor: check whitespace in ParsePubkeyInner (brunoerg)50856695eftest: fix descriptors in `ismine_tests` (brunoerg) Pull request description: Currently, we successfully parse descriptors which contains spaces in the beginning or end of the public/private key within a fragment (e.g. `pk( KEY)`, `pk(KEY )` or `pk( KEY )`). I have noticed that one of the reasons is that the `DecodeBase58` function simply ignore these whitespaces. This PR changes the `ParsePubkeyInner ` to reject pubkeys that contain a whitespace at the beginning and/or at the end. We will only check the whitespace in some RPCs (e.g. `importdescriptors`), but an already imported descriptor won't be affected by this check, especially because we store descriptors from `ToString`. For context: https://github.com/brunoerg/bitcoinfuzz/issues/72 ACKs for top commit: rkrux: tACK21e9d39a37darosior: re-ACK21e9d39a37sipa: utACK21e9d39a37Tree-SHA512: 54f48a89a235517e5cdc29a46dceeb7dabbee93c7616a166288ff3f90131808eb0ece43b0797a11fe827a5f7bd51d65e3e75c16789b0a42020934cabb684cc8f
This commit is contained in:
@@ -11,6 +11,7 @@ from test_framework.util import (
|
||||
assert_equal,
|
||||
assert_raises_rpc_error,
|
||||
)
|
||||
from test_framework.wallet_util import generate_keypair
|
||||
|
||||
|
||||
class DescriptorTest(BitcoinTestFramework):
|
||||
@@ -36,6 +37,12 @@ class DescriptorTest(BitcoinTestFramework):
|
||||
assert_raises_rpc_error(-1, 'getdescriptorinfo', self.nodes[0].getdescriptorinfo)
|
||||
assert_raises_rpc_error(-3, 'JSON value of type number is not of expected type string', self.nodes[0].getdescriptorinfo, 1)
|
||||
assert_raises_rpc_error(-5, "'' is not a valid descriptor function", self.nodes[0].getdescriptorinfo, "")
|
||||
assert_raises_rpc_error(-5, "pk(): Key ' 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798' is invalid due to whitespace", self.nodes[0].getdescriptorinfo, "pk( 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798)")
|
||||
assert_raises_rpc_error(-5, "pk(): Key '0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 ' is invalid due to whitespace", self.nodes[0].getdescriptorinfo, "pk(0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 )")
|
||||
assert_raises_rpc_error(-5, "Multi: Key ' 03a0434d9e47f3c86235477c7b1ae6ae5d3442d49b1943c2b752a68e2a47e247c7' is invalid due to whitespace", self.nodes[0].getdescriptorinfo, "wsh(multi(2, 03a0434d9e47f3c86235477c7b1ae6ae5d3442d49b1943c2b752a68e2a47e247c7,03774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb,03d01115d548e7561b15c38f004d734633687cf4419620095bc5b0f47070afe85a))")
|
||||
assert_raises_rpc_error(-5, "Multi: Key ' 03774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb' is invalid due to whitespace", self.nodes[0].getdescriptorinfo, "wsh(multi(2,03a0434d9e47f3c86235477c7b1ae6ae5d3442d49b1943c2b752a68e2a47e247c7, 03774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb,03d01115d548e7561b15c38f004d734633687cf4419620095bc5b0f47070afe85a))")
|
||||
priv_key = generate_keypair(wif=True)[0]
|
||||
assert_raises_rpc_error(-5, f"pk(): Key ' {priv_key}' is invalid due to whitespace", self.nodes[0].getdescriptorinfo, f"pk( {priv_key})")
|
||||
|
||||
# P2PK output with the specified public key.
|
||||
self.test_desc('pk(0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798)', isrange=False, issolvable=True, hasprivatekeys=False)
|
||||
|
||||
@@ -128,6 +128,20 @@ class ImportDescriptorsTest(BitcoinTestFramework):
|
||||
assert_equal(info["ismine"], True)
|
||||
assert_equal(info["ischange"], True)
|
||||
|
||||
self.log.info("Should not import a descriptor with an invalid public key due to whitespace")
|
||||
self.test_importdesc({"desc": descsum_create("pkh( " + key.pubkey + ")"),
|
||||
"timestamp": "now",
|
||||
"internal": True},
|
||||
error_code=-5,
|
||||
error_message=f"pkh(): Key ' {key.pubkey}' is invalid due to whitespace",
|
||||
success=False)
|
||||
self.test_importdesc({"desc": descsum_create("pkh(" + key.pubkey + " )"),
|
||||
"timestamp": "now",
|
||||
"internal": True},
|
||||
error_code=-5,
|
||||
error_message=f"pkh(): Key '{key.pubkey} ' is invalid due to whitespace",
|
||||
success=False)
|
||||
|
||||
# # Test importing of a P2SH-P2WPKH descriptor
|
||||
key = get_generate_key()
|
||||
self.log.info("Should not import a p2sh-p2wpkh descriptor without checksum")
|
||||
|
||||
Reference in New Issue
Block a user