|
|
|
@ -26,23 +26,27 @@ class TestCryptoSlip39(unittest.TestCase):
|
|
|
|
|
|
|
|
|
|
def test_basic_sharing_random(self):
|
|
|
|
|
ms = random.bytes(32)
|
|
|
|
|
_, mnemonics = slip39.generate_mnemonics_from_data(ms, 1, [(3, 5)])
|
|
|
|
|
identifier = slip39.generate_random_identifier()
|
|
|
|
|
mnemonics = slip39.generate_mnemonics_from_data(ms, identifier, 1, [(3, 5)])
|
|
|
|
|
mnemonics = mnemonics[0]
|
|
|
|
|
self.assertEqual(slip39.combine_mnemonics(mnemonics[:3]), slip39.combine_mnemonics(mnemonics[2:]))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_basic_sharing_fixed(self):
|
|
|
|
|
_, mnemonics = slip39.generate_mnemonics_from_data(self.MS, 1, [(3, 5)])
|
|
|
|
|
generated_identifier = slip39.generate_random_identifier()
|
|
|
|
|
mnemonics = slip39.generate_mnemonics_from_data(self.MS, generated_identifier, 1, [(3, 5)])
|
|
|
|
|
mnemonics = mnemonics[0]
|
|
|
|
|
identifier, exponent, ems = slip39.combine_mnemonics(mnemonics[:3])
|
|
|
|
|
self.assertEqual(slip39.decrypt(identifier, exponent, ems, b""), self.MS)
|
|
|
|
|
self.assertEqual(generated_identifier, identifier)
|
|
|
|
|
self.assertEqual(slip39.combine_mnemonics(mnemonics[1:4])[2], ems)
|
|
|
|
|
with self.assertRaises(slip39.MnemonicError):
|
|
|
|
|
slip39.combine_mnemonics(mnemonics[1:3])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_passphrase(self):
|
|
|
|
|
_, mnemonics = slip39.generate_mnemonics_from_data(self.MS, 1, [(3, 5)], b"TREZOR")
|
|
|
|
|
identifier = slip39.generate_random_identifier()
|
|
|
|
|
mnemonics = slip39.generate_mnemonics_from_data(self.MS, identifier, 1, [(3, 5)], b"TREZOR")
|
|
|
|
|
mnemonics = mnemonics[0]
|
|
|
|
|
identifier, exponent, ems = slip39.combine_mnemonics(mnemonics[1:4])
|
|
|
|
|
self.assertEqual(slip39.decrypt(identifier, exponent, ems, b"TREZOR"), self.MS)
|
|
|
|
@ -50,13 +54,15 @@ class TestCryptoSlip39(unittest.TestCase):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_iteration_exponent(self):
|
|
|
|
|
_, mnemonics = slip39.generate_mnemonics_from_data(self.MS, 1, [(3, 5)], b"TREZOR", 1)
|
|
|
|
|
identifier = slip39.generate_random_identifier()
|
|
|
|
|
mnemonics = slip39.generate_mnemonics_from_data(self.MS, identifier, 1, [(3, 5)], b"TREZOR", 1)
|
|
|
|
|
mnemonics = mnemonics[0]
|
|
|
|
|
identifier, exponent, ems = slip39.combine_mnemonics(mnemonics[1:4])
|
|
|
|
|
self.assertEqual(slip39.decrypt(identifier, exponent, ems, b"TREZOR"), self.MS)
|
|
|
|
|
self.assertNotEqual(slip39.decrypt(identifier, exponent, ems, b""), self.MS)
|
|
|
|
|
|
|
|
|
|
_, mnemonics = slip39.generate_mnemonics_from_data(self.MS, 1, [(3, 5)], b"TREZOR", 2)
|
|
|
|
|
identifier = slip39.generate_random_identifier()
|
|
|
|
|
mnemonics = slip39.generate_mnemonics_from_data(self.MS, identifier, 1, [(3, 5)], b"TREZOR", 2)
|
|
|
|
|
mnemonics = mnemonics[0]
|
|
|
|
|
identifier, exponent, ems = slip39.combine_mnemonics(mnemonics[1:4])
|
|
|
|
|
self.assertEqual(slip39.decrypt(identifier, exponent, ems, b"TREZOR"), self.MS)
|
|
|
|
@ -67,8 +73,9 @@ class TestCryptoSlip39(unittest.TestCase):
|
|
|
|
|
group_threshold = 2
|
|
|
|
|
group_sizes = (5, 3, 5, 1)
|
|
|
|
|
member_thresholds = (3, 2, 2, 1)
|
|
|
|
|
_, mnemonics = slip39.generate_mnemonics_from_data(
|
|
|
|
|
self.MS, group_threshold, list(zip(member_thresholds, group_sizes))
|
|
|
|
|
identifier = slip39.generate_random_identifier()
|
|
|
|
|
mnemonics = slip39.generate_mnemonics_from_data(
|
|
|
|
|
self.MS, identifier, group_threshold, list(zip(member_thresholds, group_sizes))
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# Test all valid combinations of mnemonics.
|
|
|
|
@ -99,8 +106,9 @@ class TestCryptoSlip39(unittest.TestCase):
|
|
|
|
|
group_threshold = 1
|
|
|
|
|
group_sizes = (5, 3, 5, 1)
|
|
|
|
|
member_thresholds = (3, 2, 2, 1)
|
|
|
|
|
_, mnemonics = slip39.generate_mnemonics_from_data(
|
|
|
|
|
self.MS, group_threshold, list(zip(member_thresholds, group_sizes))
|
|
|
|
|
identifier = slip39.generate_random_identifier()
|
|
|
|
|
mnemonics = slip39.generate_mnemonics_from_data(
|
|
|
|
|
self.MS, identifier, group_threshold, list(zip(member_thresholds, group_sizes))
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# Test all valid combinations of mnemonics.
|
|
|
|
@ -114,41 +122,43 @@ class TestCryptoSlip39(unittest.TestCase):
|
|
|
|
|
|
|
|
|
|
def test_all_groups_exist(self):
|
|
|
|
|
for group_threshold in (1, 2, 5):
|
|
|
|
|
_, mnemonics = slip39.generate_mnemonics_from_data(
|
|
|
|
|
self.MS, group_threshold, [(3, 5), (1, 1), (2, 3), (2, 5), (3, 5)]
|
|
|
|
|
identifier = slip39.generate_random_identifier()
|
|
|
|
|
mnemonics = slip39.generate_mnemonics_from_data(
|
|
|
|
|
self.MS, identifier, group_threshold, [(3, 5), (1, 1), (2, 3), (2, 5), (3, 5)]
|
|
|
|
|
)
|
|
|
|
|
self.assertEqual(len(mnemonics), 5)
|
|
|
|
|
self.assertEqual(len(sum(mnemonics, [])), 19)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_invalid_sharing(self):
|
|
|
|
|
identifier = slip39.generate_random_identifier()
|
|
|
|
|
# Short master secret.
|
|
|
|
|
with self.assertRaises(ValueError):
|
|
|
|
|
slip39.generate_mnemonics_from_data(self.MS[:14], 1, [(2, 3)])
|
|
|
|
|
slip39.generate_mnemonics_from_data(self.MS[:14], identifier, 1, [(2, 3)])
|
|
|
|
|
|
|
|
|
|
# Odd length master secret.
|
|
|
|
|
with self.assertRaises(ValueError):
|
|
|
|
|
slip39.generate_mnemonics_from_data(self.MS + b"X", 1, [(2, 3)])
|
|
|
|
|
slip39.generate_mnemonics_from_data(self.MS + b"X", identifier,1, [(2, 3)])
|
|
|
|
|
|
|
|
|
|
# Group threshold exceeds number of groups.
|
|
|
|
|
with self.assertRaises(ValueError):
|
|
|
|
|
slip39.generate_mnemonics_from_data(self.MS, 3, [(3, 5), (2, 5)])
|
|
|
|
|
slip39.generate_mnemonics_from_data(self.MS, identifier, 3, [(3, 5), (2, 5)])
|
|
|
|
|
|
|
|
|
|
# Invalid group threshold.
|
|
|
|
|
with self.assertRaises(ValueError):
|
|
|
|
|
slip39.generate_mnemonics_from_data(self.MS, 0, [(3, 5), (2, 5)])
|
|
|
|
|
slip39.generate_mnemonics_from_data(self.MS, identifier, 0, [(3, 5), (2, 5)])
|
|
|
|
|
|
|
|
|
|
# Member threshold exceeds number of members.
|
|
|
|
|
with self.assertRaises(ValueError):
|
|
|
|
|
slip39.generate_mnemonics_from_data(self.MS, 2, [(3, 2), (2, 5)])
|
|
|
|
|
slip39.generate_mnemonics_from_data(self.MS, identifier, 2, [(3, 2), (2, 5)])
|
|
|
|
|
|
|
|
|
|
# Invalid member threshold.
|
|
|
|
|
with self.assertRaises(ValueError):
|
|
|
|
|
slip39.generate_mnemonics_from_data(self.MS, 2, [(0, 2), (2, 5)])
|
|
|
|
|
slip39.generate_mnemonics_from_data(self.MS, identifier, 2, [(0, 2), (2, 5)])
|
|
|
|
|
|
|
|
|
|
# Group with multiple members and threshold 1.
|
|
|
|
|
with self.assertRaises(ValueError):
|
|
|
|
|
slip39.generate_mnemonics_from_data(self.MS, 2, [(3, 5), (1, 3), (2, 5)])
|
|
|
|
|
slip39.generate_mnemonics_from_data(self.MS, identifier, 2, [(3, 5), (1, 3), (2, 5)])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_vectors(self):
|
|
|
|
|