Add handling for 12/13-word seeds (MyMonero style)

This commit is contained in:
Michał Sałaban 2018-05-26 17:42:55 +02:00
parent c9b4a5c7cb
commit 83eca24ce0
2 changed files with 14 additions and 2 deletions

View File

@ -85,6 +85,9 @@ class Seed(object):
self.hex = generate_hex() self.hex = generate_hex()
self.encode_seed() self.encode_seed()
def is_mymonero(self):
"""Returns True if the seed is MyMonero-style (12/13-word)."""
return len(self.hex) == 32
def endian_swap(self, word): def endian_swap(self, word):
"""Given any string, swap bits and return the result. """Given any string, swap bits and return the result.
@ -152,12 +155,19 @@ class Seed(object):
def hex_seed(self): def hex_seed(self):
return self.hex return self.hex
def _hex_seed_keccak(self):
h = keccak_256()
h.update(unhexlify(self.hex))
return h.hexdigest()
def secret_spend_key(self): def secret_spend_key(self):
return self.sc_reduce(self.hex) a = self._hex_seed_keccak() if self.is_mymonero() else self.hex
return self.sc_reduce(a)
def secret_view_key(self): def secret_view_key(self):
b = self._hex_seed_keccak() if self.is_mymonero() else self.secret_spend_key()
h = keccak_256() h = keccak_256()
h.update(unhexlify(self.secret_spend_key())) h.update(unhexlify(b))
return self.sc_reduce(h.hexdigest()) return self.sc_reduce(h.hexdigest())
def public_spend_key(self): def public_spend_key(self):

View File

@ -66,6 +66,7 @@ class SeedTestCase(unittest.TestCase):
seed = Seed("adjust mugged vaults atlas nasty mews damp toenail suddenly toxic possible "\ seed = Seed("adjust mugged vaults atlas nasty mews damp toenail suddenly toxic possible "\
"framed succeed fuzzy return demonstrate nucleus album noises peculiar virtual "\ "framed succeed fuzzy return demonstrate nucleus album noises peculiar virtual "\
"rowboat inorganic jester fuzzy") "rowboat inorganic jester fuzzy")
self.assertFalse(seed.is_mymonero())
self.assertTrue(seed.validate_checksum()) self.assertTrue(seed.validate_checksum())
self.assertEqual( self.assertEqual(
seed.secret_spend_key(), seed.secret_spend_key(),
@ -87,6 +88,7 @@ class SeedTestCase(unittest.TestCase):
'54pZ5jHDGmwNnycvZbUoj44vsbAEmKnx9aNgkjHdjtMsBrSeKiY8J4s2raH7EMawA2Fwo9utaRTV7Aw8EcTMNMxhH6cuARW') '54pZ5jHDGmwNnycvZbUoj44vsbAEmKnx9aNgkjHdjtMsBrSeKiY8J4s2raH7EMawA2Fwo9utaRTV7Aw8EcTMNMxhH6cuARW')
seed = Seed("dwelt idols lopped blender haggled rabbits piloted value swagger taunts toolbox upgrade swagger") seed = Seed("dwelt idols lopped blender haggled rabbits piloted value swagger taunts toolbox upgrade swagger")
self.assertTrue(seed.is_mymonero())
self.assertTrue(seed.validate_checksum()) self.assertTrue(seed.validate_checksum())
# the following fails, #21 addresses that # the following fails, #21 addresses that
self.assertEqual( self.assertEqual(