diff --git a/mmgen/addrfile.py b/mmgen/addrfile.py index 956b3307..165e6f01 100755 --- a/mmgen/addrfile.py +++ b/mmgen/addrfile.py @@ -55,10 +55,12 @@ class AddrFile(MMGenObject): self.parent = parent self.infile = None - def encrypt(self,desc='new key list'): + def encrypt(self): from .crypto import mmgen_encrypt,mmenc_ext from .globalvars import g - self.fmt_data = mmgen_encrypt(self.fmt_data.encode(),desc,'') + self.fmt_data = mmgen_encrypt( + data = self.fmt_data.encode(), + desc = f'new {self.parent.desc} list' ) self.ext += f'.{mmenc_ext}' @property diff --git a/mmgen/crypto.py b/mmgen/crypto.py index 91cfc0dd..4bbec4f6 100755 --- a/mmgen/crypto.py +++ b/mmgen/crypto.py @@ -261,36 +261,38 @@ def get_passphrase(desc,passchg=False): else: return ' '.join(get_words_from_user(f'Enter {pw_desc}: ')) -_salt_len,_sha256_len,_nonce_len = (32,32,32) +mmenc_salt_len = 32 +mmenc_nonce_len = 32 def mmgen_encrypt(data,desc='data',hash_preset=''): - salt = get_random(_salt_len) + salt = get_random(mmenc_salt_len) iv = get_random(g.aesctr_iv_len) - nonce = get_random(_nonce_len) + nonce = get_random(mmenc_nonce_len) hp = hash_preset or opt.hash_preset or get_hash_preset_from_user('3',desc) m = ('user-requested','default')[hp=='3'] vmsg(f'Encrypting {desc}') qmsg(f'Using {m} hash preset of {hp!r}') passwd = get_new_passphrase(desc) key = make_key(passwd,salt,hp) - enc_d = encrypt_data(sha256(nonce+data).digest() + nonce + data, key, iv, desc=desc) + enc_d = encrypt_data( sha256(nonce+data).digest() + nonce + data, key, iv, desc=desc ) return salt+iv+enc_d def mmgen_decrypt(data,desc='data',hash_preset=''): vmsg(f'Preparing to decrypt {desc}') - dstart = _salt_len + g.aesctr_iv_len - salt = data[:_salt_len] - iv = data[_salt_len:dstart] + dstart = mmenc_salt_len + g.aesctr_iv_len + salt = data[:mmenc_salt_len] + iv = data[mmenc_salt_len:dstart] enc_d = data[dstart:] hp = hash_preset or opt.hash_preset or get_hash_preset_from_user('3',desc) m = ('user-requested','default')[hp=='3'] qmsg(f'Using {m} hash preset of {hp!r}') passwd = get_passphrase(desc) key = make_key(passwd,salt,hp) - dec_d = decrypt_data(enc_d,key,iv,desc) - if dec_d[:_sha256_len] == sha256(dec_d[_sha256_len:]).digest(): + dec_d = decrypt_data( enc_d, key, iv, desc ) + sha256_len = 32 + if dec_d[:sha256_len] == sha256(dec_d[sha256_len:]).digest(): vmsg('OK') - return dec_d[_sha256_len+_nonce_len:] + return dec_d[sha256_len+mmenc_nonce_len:] else: msg('Incorrect passphrase or hash preset') return False diff --git a/mmgen/main_passgen.py b/mmgen/main_passgen.py index d6db030f..bbd93654 100755 --- a/mmgen/main_passgen.py +++ b/mmgen/main_passgen.py @@ -172,7 +172,7 @@ af = al.get_file() af.format() if keypress_confirm('Encrypt password list?'): - af.encrypt(desc='password list') + af.encrypt() af.write(binary=True,desc='encrypted password list') else: if g.test_suite_popen_spawn and g.platform == 'win': diff --git a/mmgen/tool.py b/mmgen/tool.py index b3892a06..3caf71f7 100755 --- a/mmgen/tool.py +++ b/mmgen/tool.py @@ -731,7 +731,7 @@ class MMGenToolCmdFileCrypt(MMGenToolCmds): "encrypt a file" data = get_data_from_file(infile,'data for encryption',binary=True) from .crypto import mmgen_encrypt,mmenc_ext - enc_d = mmgen_encrypt(data,'user data',hash_preset) + enc_d = mmgen_encrypt(data,'data',hash_preset) if not outfile: outfile = f'{os.path.basename(infile)}.{mmenc_ext}' write_data_to_file(outfile,enc_d,'encrypted data',binary=True) @@ -742,7 +742,7 @@ class MMGenToolCmdFileCrypt(MMGenToolCmds): enc_d = get_data_from_file(infile,'encrypted data',binary=True) from .crypto import mmgen_decrypt,mmenc_ext while True: - dec_d = mmgen_decrypt(enc_d,'user data',hash_preset) + dec_d = mmgen_decrypt(enc_d,'data',hash_preset) if dec_d: break msg('Trying again...') if not outfile: diff --git a/test/misc/get_passphrase.py b/test/misc/get_passphrase.py index 34ce8721..45728793 100755 --- a/test/misc/get_passphrase.py +++ b/test/misc/get_passphrase.py @@ -25,16 +25,18 @@ from mmgen.crypto import get_passphrase,get_new_passphrase,get_hash_preset_from_ from mmgen.wallet import Wallet def crypto(): - pw = get_new_passphrase(desc='test script') + desc = 'test data' + + pw = get_new_passphrase(desc=desc) msg(f'==> got new passphrase: [{pw}]\n') - pw = get_passphrase(desc='test script') + pw = get_passphrase(desc=desc) msg(f'==> got passphrase: [{pw}]\n') - hp = get_hash_preset_from_user(desc='test script') + hp = get_hash_preset_from_user(desc=desc) msg(f'==> got hash preset: [{hp}]') - hp = get_hash_preset_from_user(desc='test script') + hp = get_hash_preset_from_user(desc=desc) msg(f'==> got hash preset: [{hp}]') def seed(): diff --git a/test/test_py_d/ts_ref.py b/test/test_py_d/ts_ref.py index e0ba6881..f6beaa1a 100755 --- a/test/test_py_d/ts_ref.py +++ b/test/test_py_d/ts_ref.py @@ -289,7 +289,7 @@ class TestSuiteRef(TestSuiteBase,TestSuiteShared): t = self.spawn('mmgen-tool', ['-q','decrypt',f,'outfile='+dec_file,'hash_preset=1']) if not g.debug_utf8: restore_debug() - t.passphrase('user data',tool_enc_passwd) + t.passphrase('data',tool_enc_passwd) t.written_to_file('Decrypted data') dec_txt = read_from_file(dec_file) imsg_r(dec_txt) diff --git a/test/test_py_d/ts_shared.py b/test/test_py_d/ts_shared.py index c8e08ee6..fe99682d 100755 --- a/test/test_py_d/ts_shared.py +++ b/test/test_py_d/ts_shared.py @@ -254,8 +254,8 @@ class TestSuiteShared(object): cmp_or_die(chk,chk_ref,desc='key-address list data checksum') t.expect('Encrypt key list? (y/N): ','y') t.usr_rand(self.usr_rand_chars) - t.hash_preset('new key list','1') - t.passphrase_new('new key list',self.kapasswd) + t.hash_preset('new key-address list','1') + t.passphrase_new('new key-address list',self.kapasswd) t.written_to_file('Encrypted secret keys',oo=True) return t diff --git a/test/test_py_d/ts_tool.py b/test/test_py_d/ts_tool.py index 6ae51066..81d1d045 100755 --- a/test/test_py_d/ts_tool.py +++ b/test/test_py_d/ts_tool.py @@ -53,15 +53,15 @@ class TestSuiteTool(TestSuiteMain,TestSuiteBase): write_to_file(infile,getrand(1033),binary=True) t = self.spawn('mmgen-tool',['-d',self.tmpdir,self.usr_rand_arg,'encrypt',infile]) t.usr_rand(self.usr_rand_chars) - t.hash_preset('user data','1') - t.passphrase_new('user data',tool_enc_passwd) + t.hash_preset('data','1') + t.passphrase_new('data',tool_enc_passwd) t.written_to_file('Encrypted data') return t def tool_decrypt(self,f1): out_fn = 'tool_encrypt.out' t = self.spawn('mmgen-tool',['-d',self.tmpdir,'decrypt',f1,'outfile='+out_fn,'hash_preset=1']) - t.passphrase('user data',tool_enc_passwd) + t.passphrase('data',tool_enc_passwd) t.written_to_file('Decrypted data') d1 = self.read_from_tmpfile(self.enc_infn,binary=True) d2 = self.read_from_tmpfile(out_fn,binary=True)