1
0

keystore: API changes for from_seed/from_bip43_rootseed/bip39_to_seed

- force kwargs
- add type hints
This commit is contained in:
SomberNight
2024-02-21 15:08:19 +00:00
parent 96f28607f2
commit 8ab3dcce5d
7 changed files with 88 additions and 76 deletions

View File

@@ -77,7 +77,7 @@ class QEBip39RecoveryListModel(QAbstractListModel):
assert wallet_type == 'standard'
self._root_seed = keystore.bip39_to_seed(seed, seed_extra_words)
self._root_seed = keystore.bip39_to_seed(seed, passphrase=seed_extra_words)
self.clear()

View File

@@ -712,7 +712,7 @@ class WCScriptAndDerivation(WalletWizardComponent, Logger):
passphrase = self.wizard_data['seed_extra_words'] if self.wizard_data['seed_extend'] else ''
if self.wizard_data['seed_variant'] == 'bip39':
root_seed = bip39_to_seed(self.wizard_data['seed'], passphrase)
root_seed = bip39_to_seed(self.wizard_data['seed'], passphrase=passphrase)
elif self.wizard_data['seed_variant'] == 'slip39':
root_seed = self.wizard_data['seed'].decrypt(passphrase)

View File

@@ -374,7 +374,7 @@ class Deterministic_KeyStore(Software_KeyStore):
def format_seed(self, seed: str) -> str:
pass
def add_seed(self, seed):
def add_seed(self, seed: str) -> None:
if self.seed:
raise Exception("a seed exists")
self.seed = self.format_seed(seed)
@@ -577,7 +577,7 @@ class Xpub(MasterPublicKeyMixin):
deriv_path=strpath,
)
def add_key_origin_from_root_node(self, *, derivation_prefix: str, root_node: BIP32Node):
def add_key_origin_from_root_node(self, *, derivation_prefix: str, root_node: BIP32Node) -> None:
assert self.xpub
# try to derive ourselves from what we were given
child_node1 = root_node.subkey_at_private_derivation(derivation_prefix)
@@ -677,18 +677,18 @@ class BIP32_KeyStore(Xpub, Deterministic_KeyStore):
def is_watching_only(self):
return self.xprv is None
def add_xpub(self, xpub):
def add_xpub(self, xpub: str) -> None:
assert is_xpub(xpub)
self.xpub = xpub
root_fingerprint, derivation_prefix = bip32.root_fp_and_der_prefix_from_xkey(xpub)
self.add_key_origin(derivation_prefix=derivation_prefix, root_fingerprint=root_fingerprint)
def add_xprv(self, xprv):
def add_xprv(self, xprv: str) -> None:
assert is_xprv(xprv)
self.xprv = xprv
self.add_xpub(bip32.xpub_from_xprv(xprv))
def add_xprv_from_seed(self, bip32_seed, xtype, derivation):
def add_xprv_from_seed(self, bip32_seed: bytes, *, xtype: str, derivation: str) -> None:
rootnode = BIP32Node.from_rootseed(bip32_seed, xtype=xtype)
node = rootnode.subkey_at_private_derivation(derivation)
self.add_xprv(node.to_xprv())
@@ -735,12 +735,12 @@ class Old_KeyStore(MasterPublicKeyMixin, Deterministic_KeyStore):
d['mpk'] = self.mpk
return d
def add_seed(self, seedphrase):
Deterministic_KeyStore.add_seed(self, seedphrase)
def add_seed(self, seed):
Deterministic_KeyStore.add_seed(self, seed)
s = self.get_hex_seed(None)
self.mpk = self.mpk_from_seed(s)
def add_master_public_key(self, mpk):
def add_master_public_key(self, mpk) -> None:
self.mpk = mpk
def format_seed(self, seed):
@@ -978,11 +978,13 @@ KeyStoreWithMPK = Union[KeyStore, MasterPublicKeyMixin] # intersection really..
AddressIndexGeneric = Union[Sequence[int], str] # can be hex pubkey str
def bip39_normalize_passphrase(passphrase):
def bip39_normalize_passphrase(passphrase: str):
return normalize('NFKD', passphrase or '')
def bip39_to_seed(mnemonic, passphrase):
import hashlib, hmac
def bip39_to_seed(mnemonic: str, *, passphrase: Optional[str]) -> bytes:
import hashlib
passphrase = passphrase or ""
PBKDF2_ROUNDS = 2048
mnemonic = normalize('NFKD', ' '.join(mnemonic.split()))
passphrase = bip39_normalize_passphrase(passphrase)
@@ -1024,11 +1026,16 @@ def bip39_is_checksum_valid(
return checksum == calculated_checksum, True
def from_bip43_rootseed(root_seed, derivation, xtype=None):
def from_bip43_rootseed(
root_seed: bytes,
*,
derivation: str,
xtype: Optional[str] = None,
):
k = BIP32_KeyStore({})
if xtype is None:
xtype = xtype_from_derivation(derivation)
k.add_xprv_from_seed(root_seed, xtype, derivation)
k.add_xprv_from_seed(root_seed, xtype=xtype, derivation=derivation)
return k
@@ -1156,7 +1163,8 @@ def purpose48_derivation(account_id: int, xtype: str) -> str:
return normalize_bip32_derivation(der)
def from_seed(seed, passphrase, is_p2sh=False):
def from_seed(seed: str, *, passphrase: Optional[str], for_multisig: bool = False):
passphrase = passphrase or ""
t = seed_type(seed)
if t == 'old':
if passphrase:
@@ -1172,9 +1180,9 @@ def from_seed(seed, passphrase, is_p2sh=False):
der = "m/"
xtype = 'standard'
else:
der = "m/1'/" if is_p2sh else "m/0'/"
xtype = 'p2wsh' if is_p2sh else 'p2wpkh'
keystore.add_xprv_from_seed(bip32_seed, xtype, der)
der = "m/1'/" if for_multisig else "m/0'/"
xtype = 'p2wsh' if for_multisig else 'p2wpkh'
keystore.add_xprv_from_seed(bip32_seed, xtype=xtype, derivation=der)
else:
raise BitcoinException('Unexpected seed type {}'.format(repr(t)))
return keystore

View File

@@ -27,7 +27,7 @@ network.start()
async def f():
try:
def get_account_xpub(account_path):
root_seed = bip39_to_seed(mnemonic, passphrase)
root_seed = bip39_to_seed(mnemonic, passphrase=passphrase)
root_node = BIP32Node.from_rootseed(root_seed, xtype="standard")
account_node = root_node.subkey_at_private_derivation(account_path)
account_xpub = account_node.to_xpub()

View File

@@ -3909,7 +3909,7 @@ def create_new_wallet(*, path, config: SimpleConfig, passphrase=None, password=N
db = WalletDB('', storage=storage, upgrade=True)
seed = Mnemonic('en').make_seed(seed_type=seed_type)
k = keystore.from_seed(seed, passphrase)
k = keystore.from_seed(seed, passphrase=passphrase)
db.put('keystore', k.dump())
db.put('wallet_type', 'standard')
if k.can_have_deterministic_lightning_xprv():
@@ -3967,7 +3967,7 @@ def restore_wallet_from_text(
if keystore.is_master_key(text):
k = keystore.from_master_key(text)
elif keystore.is_seed(text):
k = keystore.from_seed(text, passphrase)
k = keystore.from_seed(text, passphrase=passphrase)
if k.can_have_deterministic_lightning_xprv():
db.put('lightning_xprv', k.get_lightning_xprv(None))
else:

View File

@@ -415,15 +415,15 @@ class NewWalletWizard(AbstractWizard):
def keystore_from_data(self, wallet_type: str, data: dict):
if data['keystore_type'] in ['createseed', 'haveseed'] and 'seed' in data:
if data['seed_variant'] == 'electrum':
return keystore.from_seed(data['seed'], data['seed_extra_words'], True)
return keystore.from_seed(data['seed'], passphrase=data['seed_extra_words'], for_multisig=True)
elif data['seed_variant'] == 'bip39':
root_seed = keystore.bip39_to_seed(data['seed'], data['seed_extra_words'])
root_seed = keystore.bip39_to_seed(data['seed'], passphrase=data['seed_extra_words'])
derivation = normalize_bip32_derivation(data['derivation_path'])
if wallet_type == 'multisig':
script = data['script_type'] if data['script_type'] != 'p2sh' else 'standard'
else:
script = data['script_type'] if data['script_type'] != 'p2pkh' else 'standard'
return keystore.from_bip43_rootseed(root_seed, derivation, xtype=script)
return keystore.from_bip43_rootseed(root_seed, derivation=derivation, xtype=script)
elif data['seed_variant'] == 'slip39':
root_seed = data['seed'].decrypt(data['seed_extra_words'])
derivation = normalize_bip32_derivation(data['derivation_path'])
@@ -431,7 +431,7 @@ class NewWalletWizard(AbstractWizard):
script = data['script_type'] if data['script_type'] != 'p2sh' else 'standard'
else:
script = data['script_type'] if data['script_type'] != 'p2pkh' else 'standard'
return keystore.from_bip43_rootseed(root_seed, derivation, xtype=script)
return keystore.from_bip43_rootseed(root_seed, derivation=derivation, xtype=script)
else:
raise Exception('Unsupported seed variant %s' % data['seed_variant'])
elif data['keystore_type'] == 'masterkey' and 'master_key' in data:
@@ -548,11 +548,11 @@ class NewWalletWizard(AbstractWizard):
elif data['keystore_type'] in ['createseed', 'haveseed']:
if data['seed_type'] in ['old', 'standard', 'segwit']:
self._logger.debug('creating keystore from electrum seed')
k = keystore.from_seed(data['seed'], data['seed_extra_words'], data['wallet_type'] == 'multisig')
k = keystore.from_seed(data['seed'], passphrase=data['seed_extra_words'], for_multisig=data['wallet_type'] == 'multisig')
elif data['seed_type'] in ['bip39', 'slip39']:
self._logger.debug('creating keystore from %s seed' % data['seed_type'])
if data['seed_type'] == 'bip39':
root_seed = keystore.bip39_to_seed(data['seed'], data['seed_extra_words'])
root_seed = keystore.bip39_to_seed(data['seed'], passphrase=data['seed_extra_words'])
else:
root_seed = data['seed'].decrypt(data['seed_extra_words'])
derivation = normalize_bip32_derivation(data['derivation_path'])
@@ -560,7 +560,7 @@ class NewWalletWizard(AbstractWizard):
script = data['script_type'] if data['script_type'] != 'p2sh' else 'standard'
else:
script = data['script_type'] if data['script_type'] != 'p2pkh' else 'standard'
k = keystore.from_bip43_rootseed(root_seed, derivation, xtype=script)
k = keystore.from_bip43_rootseed(root_seed, derivation=derivation, xtype=script)
elif is_any_2fa_seed_type(data['seed_type']):
self._logger.debug('creating keystore from 2fa seed')
k = keystore.from_xprv(data['x1']['xprv'])