keystore: API changes for from_seed/from_bip43_rootseed/bip39_to_seed
- force kwargs - add type hints
This commit is contained in:
@@ -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()
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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'])
|
||||
|
||||
Reference in New Issue
Block a user