Browse Source

descriptor.py: do more validation in PubkeyProvider, and add tests

master
SomberNight 3 years ago
parent
commit
9127c12fa3
No known key found for this signature in database
GPG Key ID: B33B5F232C6271E9
  1. 4
      electrum/descriptor.py
  2. 25
      electrum/tests/test_descriptor.py

4
electrum/descriptor.py

@ -186,6 +186,8 @@ class PubkeyProvider(object):
if wildcard_count == 1:
if deriv_path[-1] != "*":
raise ValueError("wildcard in descriptor only allowed in last position")
if deriv_path[0] != "/":
raise ValueError(f"deriv_path suffix must start with a '/'. got {deriv_path!r}")
# Make ExtendedKey from pubkey if it isn't hex
self.extkey = None
try:
@ -194,6 +196,8 @@ class PubkeyProvider(object):
except Exception:
# Not hex, maybe xpub (but don't allow ypub/zpub)
self.extkey = BIP32Node.from_xkey(pubkey, allow_custom_headers=False)
if deriv_path and self.extkey is None:
raise ValueError("deriv_path suffix present for simple pubkey")
@classmethod
def parse(cls, s: str) -> 'PubkeyProvider':

25
electrum/tests/test_descriptor.py

@ -16,6 +16,7 @@ from electrum.descriptor import (
PKHDescriptor,
WPKHDescriptor,
WSHDescriptor,
PubkeyProvider,
)
from electrum import ecc
from electrum.util import bfh
@ -335,3 +336,27 @@ class TestDescriptor(ElectrumTestCase):
desc = parse_descriptor("wpkh([535e473f/0h]ypub6TLJVy4mZfqBJhoQBTgDR1TzM7s91WbVnMhZj31swV6xxPiwCqeGYrBn2dNHbDrP86qqxbM6FNTX3VjhRjNoXYyBAR5G3o75D3r2djmhZwM/0/*)")
with self.assertRaises(ValueError): # only standard xpub/xprv allowed
desc = parse_descriptor("wpkh([535e473f/0h]zpub6nAZodjgiMNf9zzX1pTqd6ZVX61ax8azhUDnWRumKVUr1VYATVoqAuqv3qKsb8WJXjxei4wei2p4vnMG9RnpKnen2kmgdhvZUmug2NnHNsr/0/*)")
def test_pubkey_provider_deriv_path(self):
xpub = "xpub68W3CJPrQzHhTQcHM6tbCvNVB9ih4tbzsFBLwe7zZUj5uHuhxBUhvnXe1RQhbKCTiTj3D7kXni6yAD88i2xnjKHaJ5NqTtHawKnPFCDnmo4"
# valid:
pp = PubkeyProvider(origin=None, pubkey=xpub, deriv_path="/1/7")
pp = PubkeyProvider(origin=None, pubkey=xpub, deriv_path="/1/*")
# invalid:
with self.assertRaises(ValueError):
pp = PubkeyProvider(origin=None, pubkey=xpub, deriv_path="1")
with self.assertRaises(ValueError):
pp = PubkeyProvider(origin=None, pubkey=xpub, deriv_path="1/7")
with self.assertRaises(ValueError):
pp = PubkeyProvider(origin=None, pubkey=xpub, deriv_path="m/1/7")
with self.assertRaises(ValueError):
pp = PubkeyProvider(origin=None, pubkey=xpub, deriv_path="*/7")
with self.assertRaises(ValueError):
pp = PubkeyProvider(origin=None, pubkey=xpub, deriv_path="*/*")
pubkey_hex = "02a0507c8bb3d96dfd7731bafb0ae30e6ed10bbadd6a9f9f88eaf0602b9cc99adc"
# valid:
pp = PubkeyProvider(origin=None, pubkey=pubkey_hex, deriv_path=None)
# invalid:
with self.assertRaises(ValueError):
pp = PubkeyProvider(origin=None, pubkey=pubkey_hex, deriv_path="/1/7")

Loading…
Cancel
Save