Merge bitcoin/bitcoin#23628: Check descriptors returned by external signers
pull/826/head5493e92501
Check descriptors returned by external signers (sstone) Pull request description: Check that descriptors returned by external signers have been parsed properly when creating a new wallet. See https://github.com/bitcoin/bitcoin/issues/23627 for context. The problem is that parsing an invalid descriptor will return `null` which is not checked for in `CWallet::SetupDescriptorScriptPubKeyMans()`. I'm not completely sure what the best fix is since there several strategies for dealing with errors in the current codebase but the proposed fix is very simple and consistent with other validation checks in `CWallet::SetupDescriptorScriptPubKeyMans()`. ACKs for top commit: jamesob: Code review ACK5493e92501
achow101: ACK5493e92501
Tree-SHA512: 63259f4aa519405a86c554b6813efdb741314bdaa18bf005b70ea8bb92a27abc6e2b65f7c584641dc257fc78a6499f42b51b5310c243e611c4663430dccf3d04
commit
09ad512369
@ -0,0 +1,65 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# Copyright (c) 2018-2021 The Bitcoin Core developers
|
||||||
|
# Distributed under the MIT software license, see the accompanying
|
||||||
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import argparse
|
||||||
|
import json
|
||||||
|
|
||||||
|
def perform_pre_checks():
|
||||||
|
mock_result_path = os.path.join(os.getcwd(), "mock_result")
|
||||||
|
if(os.path.isfile(mock_result_path)):
|
||||||
|
with open(mock_result_path, "r", encoding="utf8") as f:
|
||||||
|
mock_result = f.read()
|
||||||
|
if mock_result[0]:
|
||||||
|
sys.stdout.write(mock_result[2:])
|
||||||
|
sys.exit(int(mock_result[0]))
|
||||||
|
|
||||||
|
def enumerate(args):
|
||||||
|
sys.stdout.write(json.dumps([{"fingerprint": "b3c19bfc", "type": "trezor", "model": "trezor_t"}, {"fingerprint": "00000002"}]))
|
||||||
|
|
||||||
|
def getdescriptors(args):
|
||||||
|
xpub_pkh = "xpub6CRhJvXV8x2AKWvqi1ZSMFU6cbxzQiYrv3dxSUXCawjMJ1JzpqVsveH4way1yCmJm29KzH1zrVZmVwes4Qo6oXVE1HFn4fdiKrYJngqFFc6"
|
||||||
|
xpub_sh = "xpub6CoNoq3Tg4tGSpom2BSwL42gy864KHo3TXkHxLxBbhvCkgmdVXADQmiHbLZhX3Me1cYhRx7s25Lpm4LnT5zu395ANHsXB2QvT9tqJDAibTN"
|
||||||
|
xpub_wpkh = "xpub6DUcLgY1DfgDy2RV6q4djwwsLitaoZDumbribqrR8mP78fEtgZa1XEsqT5MWQ7gwLwKsTQPT28XLoVE5A97rDNTwMXjmzPaNijoCApCbWvp"
|
||||||
|
|
||||||
|
sys.stdout.write(json.dumps({
|
||||||
|
"receive": [
|
||||||
|
"pkh([b3c19bfc/44'/1'/" + args.account + "']" + xpub_pkh + "/0/*)#h26nxtl9",
|
||||||
|
"sh(wpkh([b3c19bfc/49'/1'/" + args.account + "']" + xpub_sh + "/0/*))#32ry02yp",
|
||||||
|
"wpkh([b3c19bfc/84'/1'/" + args.account + "']" + xpub_wpkh + "/0/*)#jftn8ppv"
|
||||||
|
],
|
||||||
|
"internal": [
|
||||||
|
"pkh([b3c19bfc/44'/1'/" + args.account + "']" + xpub_pkh + "/1/*)#x7ljm70a",
|
||||||
|
"sh(wpkh([b3c19bfc/49'/1'/" + args.account + "']" + xpub_sh + "/1/*))#ytdjh437",
|
||||||
|
"wpkh([b3c19bfc/84'/1'/" + args.account + "']" + xpub_wpkh + "/1/*)#rawj6535"
|
||||||
|
]
|
||||||
|
}))
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(prog='./invalid_signer.py', description='External invalid signer mock')
|
||||||
|
parser.add_argument('--fingerprint')
|
||||||
|
parser.add_argument('--chain', default='main')
|
||||||
|
parser.add_argument('--stdin', action='store_true')
|
||||||
|
|
||||||
|
subparsers = parser.add_subparsers(description='Commands', dest='command')
|
||||||
|
subparsers.required = True
|
||||||
|
|
||||||
|
parser_enumerate = subparsers.add_parser('enumerate', help='list available signers')
|
||||||
|
parser_enumerate.set_defaults(func=enumerate)
|
||||||
|
|
||||||
|
parser_getdescriptors = subparsers.add_parser('getdescriptors')
|
||||||
|
parser_getdescriptors.set_defaults(func=getdescriptors)
|
||||||
|
parser_getdescriptors.add_argument('--account', metavar='account')
|
||||||
|
|
||||||
|
if not sys.stdin.isatty():
|
||||||
|
buffer = sys.stdin.read()
|
||||||
|
if buffer and buffer.rstrip() != "":
|
||||||
|
sys.argv.extend(buffer.rstrip().split(" "))
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
perform_pre_checks()
|
||||||
|
|
||||||
|
args.func(args)
|
Loading…
Reference in new issue