From cbe952a7742108f176f83c5393cdb54b2ebfea26 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Thu, 7 Dec 2023 16:48:01 +0000 Subject: [PATCH] bip39.py: add `generate_seed(mnemonic,passwd)` method --- mmgen/bip39.py | 13 +++++++++++++ mmgen/data/release_date | 2 +- mmgen/data/version | 2 +- test/unit_tests_d/ut_bip39.py | 25 +++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/mmgen/bip39.py b/mmgen/bip39.py index e21ba74b..9e86bdda 100755 --- a/mmgen/bip39.py +++ b/mmgen/bip39.py @@ -128,3 +128,16 @@ class bip39(baseconv): res = seed_bin + chk_bin return tuple(wl[int(res[i*11:(i+1)*11],2)] for i in range(c.mn_len)) + + def generate_seed(self,words_arg,passwd=''): + + self.tohex(words_arg) # validate + + from cryptography.hazmat.primitives import hashes + from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC + return PBKDF2HMAC( + algorithm = hashes.SHA512(), + length = 64, + salt = b'mnemonic' + passwd.encode(), + iterations = 2048 + ).derive(' '.join(words_arg).encode()) diff --git a/mmgen/data/release_date b/mmgen/data/release_date index f53c8cf6..86ebfd1e 100644 --- a/mmgen/data/release_date +++ b/mmgen/data/release_date @@ -1 +1 @@ -November 2023 +December 2023 diff --git a/mmgen/data/version b/mmgen/data/version index aba498b3..2381aa2a 100644 --- a/mmgen/data/version +++ b/mmgen/data/version @@ -1 +1 @@ -14.1.dev0 +14.1.dev1 diff --git a/test/unit_tests_d/ut_bip39.py b/test/unit_tests_d/ut_bip39.py index a38db359..d4d4a125 100755 --- a/test/unit_tests_d/ut_bip39.py +++ b/test/unit_tests_d/ut_bip39.py @@ -149,3 +149,28 @@ class unit_tests: vmsg('') return True + + def genseed(self,name,ut): + + vmsg('') + qmsg(blue('Testing seed generation with password')) + fn = 'test/ref/98831F3A.bip39' + + vmsg(f'Seed source: {purple(fn)}') + vmsg('KDF: PBKDF2-SHA512, 2048 rounds') + with open(fn) as fh: + mnemonic = fh.read().strip() + + seed_hex = bip39().generate_seed(mnemonic.split()).hex() + vmsg(f' Password: {orange("(null)")}\n {seed_hex}') + assert seed_hex == '3c30b98d3d9a713cf5a7a42f5dd27b3bf7f4d792d2b9225f6f519a0da978e13c6f36989ef2123b12a96d6ad5a443a95d61022ffaa9fbce8f946da7b67f75d339' + + passwd = 'passw0rd' + seed_hex = bip39().generate_seed(mnemonic.split(),passwd).hex() + vmsg(f' Password: {orange(passwd)}\n {seed_hex}') + assert seed_hex == '7eb773bf60f1a5071f96736b6ddbe5c544a7b7740182a80493e29577e58b7cde011d4e38d26f65dab6c9fdebe5594e523447a1427ffd60746e6d04b4daa42eb1' + + qmsg('OK') + vmsg('') + + return True