diff --git a/tests/test_wallet.py b/tests/test_wallet.py index 3f4f7354f..03a655609 100644 --- a/tests/test_wallet.py +++ b/tests/test_wallet.py @@ -605,3 +605,61 @@ def test_hsm_secret_encryption(node_factory): os.write(master_fd, password.encode("utf-8")) l1.daemon.wait_for_log("Server started with public key") assert id == l1.rpc.getinfo()["id"] + + +@unittest.skipIf(VALGRIND, "It does not play well with prompt and key derivation.") +def test_hsmtool_secret_decryption(node_factory): + l1 = node_factory.get_node() + password = "reckless\n" + hsm_path = os.path.join(l1.daemon.lightning_dir, "hsm_secret") + # We need to simulate a terminal to use termios in `lightningd`. + master_fd, slave_fd = os.openpty() + + # Encrypt the master seed + l1.rpc.stop() + l1.daemon.opts.update({"encrypted-hsm": None}) + l1.daemon.start(stdin=slave_fd, wait_for_initialized=False) + time.sleep(3 if SLOW_MACHINE else 1) + os.write(master_fd, password.encode("utf-8")) + l1.daemon.wait_for_log("Server started with public key") + node_id = l1.rpc.getinfo()["id"] + l1.stop() + + # We can't use a wrong password ! + cmd_line = ["tools/hsmtool", "decrypt", hsm_path, "A wrong pass"] + assert subprocess.Popen(cmd_line).wait() != 0 + + # Decrypt it with hsmtool + cmd_line[3] = password[:-1] + assert subprocess.Popen(cmd_line).wait() == 0 + # Then test we can now start it without password + l1.daemon.opts.pop("encrypted-hsm") + l1.daemon.start(stdin=slave_fd, wait_for_initialized=True) + assert node_id == l1.rpc.getinfo()["id"] + l1.stop() + + # Test we can encrypt it offline + cmd_line[1] = "encrypt" + assert subprocess.Popen(cmd_line).wait() == 0 + # Now we need to pass the encrypted-hsm startup option + l1.stop() + l1.daemon.start(stdin=slave_fd, stderr=subprocess.STDOUT, + wait_for_initialized=False) + time.sleep(3 if SLOW_MACHINE else 1) + err = "hsm_secret is encrypted, you need to pass the --encrypted-hsm startup option." + assert l1.daemon.is_in_log(err) + l1.daemon.opts.update({"encrypted-hsm": None}) + l1.daemon.start(stdin=slave_fd, stderr=subprocess.STDOUT, + wait_for_initialized=False) + time.sleep(3 if SLOW_MACHINE else 1) + os.write(master_fd, password.encode("utf-8")) + l1.daemon.wait_for_log("Server started with public key") + assert node_id == l1.rpc.getinfo()["id"] + l1.stop() + + # And finally test that we can also decrypt if encrypted with hsmtool + cmd_line[1] = "decrypt" + assert subprocess.Popen(cmd_line).wait() == 0 + l1.daemon.opts.pop("encrypted-hsm") + l1.daemon.start(stdin=slave_fd, wait_for_initialized=True) + assert node_id == l1.rpc.getinfo()["id"]