1
0

keystore: Old_KeyStore: distinguish between seed and hex_seed

This commit is contained in:
SomberNight
2025-07-18 00:32:52 +00:00
parent a257072391
commit f86bdc86a2

View File

@@ -732,10 +732,11 @@ class Old_KeyStore(MasterPublicKeyMixin, Deterministic_KeyStore):
def watching_only_keystore(self):
return Old_KeyStore({'mpk': self.mpk})
def get_hex_seed(self, password) -> bytes:
def _get_hex_seed(self, password) -> bytes:
# FIXME we return bytes that only contain hex characters.
hex_str = pw_decode(self.seed, password, version=self.pw_hash_version)
return hex_str.encode('utf8')
assert is_hex_str(hex_str), f"expected hex str, got {type(hex_str)} with {len(hex_str)=}"
return hex_str.encode('ascii')
def dump(self):
d = Deterministic_KeyStore.dump(self)
@@ -744,8 +745,8 @@ class Old_KeyStore(MasterPublicKeyMixin, Deterministic_KeyStore):
def add_seed(self, seed):
Deterministic_KeyStore.add_seed(self, seed)
s = self.get_hex_seed(None)
self.mpk = self.mpk_from_seed(s)
hex_seed = self._get_hex_seed(None)
self.mpk = self.mpk_from_seed(hex_seed)
def add_master_public_key(self, mpk: str) -> None:
self.mpk = mpk
@@ -768,23 +769,23 @@ class Old_KeyStore(MasterPublicKeyMixin, Deterministic_KeyStore):
def get_seed(self, password):
from . import old_mnemonic
s = self.get_hex_seed(password)
return ' '.join(old_mnemonic.mn_encode(s))
hex_seed = self._get_hex_seed(password)
return ' '.join(old_mnemonic.mn_encode(hex_seed))
@classmethod
def mpk_from_seed(cls, seed: bytes) -> str:
# FIXME `seed` is bytes that only contain hex characters.
secexp = cls.stretch_key(seed)
def mpk_from_seed(cls, hex_seed: bytes) -> str:
# FIXME `hex_seed` is bytes that only contain hex characters.
secexp = cls.stretch_key(hex_seed)
privkey = ecc.ECPrivkey.from_secret_scalar(secexp)
return privkey.get_public_key_hex(compressed=False)[2:]
@classmethod
def stretch_key(cls, seed: bytes) -> int:
# FIXME `seed` is bytes that only contain hex characters.
assert isinstance(seed, bytes), f"expected bytes, got {type(seed)}"
x = seed
def stretch_key(cls, hex_seed: bytes) -> int:
# FIXME `hex_seed` is bytes that only contain hex characters.
assert isinstance(hex_seed, bytes), f"expected bytes, got {type(hex_seed)}"
x = hex_seed
for i in range(100000):
x = hashlib.sha256(x + seed).digest()
x = hashlib.sha256(x + hex_seed).digest()
return string_to_number(x)
@classmethod
@@ -811,17 +812,19 @@ class Old_KeyStore(MasterPublicKeyMixin, Deterministic_KeyStore):
return pk
def get_private_key(self, sequence: Sequence[int], password):
seed = self.get_hex_seed(password)
secexp = self.stretch_key(seed)
self._check_seed(seed, secexp=secexp)
hex_seed = self._get_hex_seed(password)
secexp = self.stretch_key(hex_seed)
self._check_seed(hex_seed, secexp=secexp)
for_change, n = sequence
assert isinstance(for_change, int), type(for_change)
assert isinstance(n, int), type(n)
pk = self._get_private_key_from_stretched_exponent(for_change, n, secexp)
return pk, False
def _check_seed(self, seed: bytes, *, secexp: int = None) -> None:
# FIXME `seed` is bytes that only contain hex characters.
def _check_seed(self, hex_seed: bytes, *, secexp: int = None) -> None:
# FIXME `hex_seed` is bytes that only contain hex characters.
if secexp is None:
secexp = self.stretch_key(seed)
secexp = self.stretch_key(hex_seed)
master_private_key = ecc.ECPrivkey.from_secret_scalar(secexp)
master_public_key = master_private_key.get_public_key_bytes(compressed=False)[1:]
if master_public_key != bfh(self.mpk):
@@ -829,8 +832,8 @@ class Old_KeyStore(MasterPublicKeyMixin, Deterministic_KeyStore):
@also_test_none_password
def check_password(self, password):
seed = self.get_hex_seed(password)
self._check_seed(seed)
hex_seed = self._get_hex_seed(password)
self._check_seed(hex_seed)
def get_master_public_key(self):
return self.mpk