diff --git a/duniterpy/key/signing_key.py b/duniterpy/key/signing_key.py index 4f1e444d1bd82a35603de52f438a3a27a2b2d7f0..a36cd80fe9fbfa20a7bb58a107f7a7a0e77d4817 100644 --- a/duniterpy/key/signing_key.py +++ b/duniterpy/key/signing_key.py @@ -46,7 +46,7 @@ class SigningKey(libnacl.sign.Signer): :param salt: Secret salt passphrase credential :param password: Secret password credential - :param scrypt_params: ScryptParams instance + :param scrypt_params: ScryptParams instance or None """ if scrypt_params is None: scrypt_params = ScryptParams() @@ -64,6 +64,28 @@ class SigningKey(libnacl.sign.Signer): return cls(seed) + @classmethod + def from_credentials_file( + cls, path: str, scrypt_params: Optional[ScryptParams] = None + ) -> SigningKeyType: + """ + Create a SigningKey object from a credentials file + + A file with the salt on the first line and the password on the second line + + :param path: Credentials file path + :param scrypt_params: ScryptParams instance or None + :return: + """ + # capture credentials from file + with open(path, "r") as fh: + lines = fh.readlines() + assert len(lines) > 1 + salt = lines[0].strip() + password = lines[1].strip() + + return cls.from_credentials(salt, password, scrypt_params) + def save_seedhex_file(self, path: str) -> None: """ Save hexadecimal seed file from seed diff --git a/examples/load_credentials_file.py b/examples/load_credentials_file.py new file mode 100644 index 0000000000000000000000000000000000000000..a3de26d6b6bcb8da0d8451933bb156a64430d239 --- /dev/null +++ b/examples/load_credentials_file.py @@ -0,0 +1,24 @@ +import sys + +from duniterpy.key import SigningKey + +if __name__ == "__main__": + + if len(sys.argv) < 2: + print( + """ + Usage: + python load_credentials_file.py FILEPATH + """ + ) + + # capture filepath argument + credentials_filepath = sys.argv[1] + + # create SigningKey instance from file + signing_key_instance = SigningKey.from_credentials_file( + credentials_filepath + ) # type: SigningKey + + # print pubkey + print("Public key from credentials file: {}".format(signing_key_instance.pubkey)) diff --git a/tests/key/test_signing_key.py b/tests/key/test_signing_key.py index 25c240ede874fb38346d5b612bcbb0dc9ec45974..58802fb42667ab6a99f48c59b875ed8544537920 100644 --- a/tests/key/test_signing_key.py +++ b/tests/key/test_signing_key.py @@ -77,3 +77,19 @@ class TestSigningKey(unittest.TestCase): sign_key_load = SigningKey.from_wif_or_ewif_file(TEST_FILE_PATH) self.assertEqual(sign_key_save.sk, sign_key_load.sk) + + def test_load_credentials_file(self): + salt = password = "test" + + # create a dummy credentials file + with open(TEST_FILE_PATH, "w") as fh: + fh.write("{}\n{}\n".format(salt, password)) + + # same key from credentials + sign_key_test = SigningKey.from_credentials(salt, password) + + # test load file + sign_key_load = SigningKey.from_credentials_file(TEST_FILE_PATH) + self.assertEqual(sign_key_test.sk, sign_key_load.sk) + self.assertEqual(sign_key_test.pubkey, sign_key_load.pubkey) + self.assertEqual(sign_key_test.vk, sign_key_load.vk)