test_signing_key.py 6.21 KiB
"""
Copyright 2014-2021 Vincent Texier <vit@free.fr>
DuniterPy is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DuniterPy is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
import base64
import os
from duniterpy.key import VerifyingKey, SigningKey, PublicKey
from duniterpy.key.scrypt_params import ScryptParams
import unittest
TEST_FILE_PATH = "/tmp/test_file.txt"
class TestSigningKey(unittest.TestCase):
def tearDown(self) -> None:
super()
# remove test file from disk
if os.path.exists(TEST_FILE_PATH):
os.unlink(TEST_FILE_PATH)
def test_decrypt_seal(self):
sign_key = SigningKey.from_credentials("alice", "password", ScryptParams())
public_key = PublicKey(sign_key.pubkey)
message = "Hello world with utf-8 chars like éàè !"
encrypted_message = public_key.encrypt_seal(bytes(message, "utf-8"))
decrypted_message = sign_key.decrypt_seal(encrypted_message)
self.assertEqual(message, decrypted_message.decode("utf-8"))
def test_from_credentials(self):
sign_key = SigningKey.from_credentials("alice", "password", ScryptParams())
verify_key = VerifyingKey(sign_key.pubkey)
self.assertEqual(verify_key.vk, sign_key.vk)
def test_save_and_load_from_seedhex_file(self):
sign_key_save = SigningKey.from_credentials("alice", "password", ScryptParams())
sign_key_save.save_seedhex_file(TEST_FILE_PATH)
sign_key_load = SigningKey.from_seedhex_file(TEST_FILE_PATH)
self.assertEqual(sign_key_save.sk, sign_key_load.sk)
def test_save_and_load_from_pubsec_file(self):
sign_key_save = SigningKey.from_credentials("alice", "password", ScryptParams())
sign_key_save.save_pubsec_file(TEST_FILE_PATH)
sign_key_load = SigningKey.from_pubsec_file(TEST_FILE_PATH)
self.assertEqual(sign_key_save.sk, sign_key_load.sk)
def test_save_and_load_from_wif_file(self):
sign_key_save = SigningKey.from_credentials("alice", "password", ScryptParams())
sign_key_save.save_wif_file(TEST_FILE_PATH)
sign_key_load = SigningKey.from_wif_file(TEST_FILE_PATH)
self.assertEqual(sign_key_save.sk, sign_key_load.sk)
def test_save_and_load_from_private_key_file(self):
sign_key_save = SigningKey.from_credentials("alice", "password", ScryptParams())
sign_key_save.save_private_key(TEST_FILE_PATH)
sign_key_load = SigningKey.from_private_key(TEST_FILE_PATH)
self.assertEqual(sign_key_save.sk, sign_key_load.sk)
def test_save_and_load_from_ewif_file(self):
sign_key_save = SigningKey.from_credentials("alice", "password", ScryptParams())
sign_key_save.save_ewif_file(TEST_FILE_PATH, "password")
sign_key_load = SigningKey.from_ewif_file(TEST_FILE_PATH, "password")
self.assertEqual(sign_key_save.sk, sign_key_load.sk)
def test_save_ewif_and_load_from_ewif_or_wif_file(self):
sign_key_save = SigningKey.from_credentials("alice", "password", ScryptParams())
sign_key_save.save_ewif_file(TEST_FILE_PATH, "password")
sign_key_load = SigningKey.from_wif_or_ewif_file(TEST_FILE_PATH, "password")
self.assertEqual(sign_key_save.sk, sign_key_load.sk)
def test_save_wif_and_load_from_ewif_or_wif_file(self):
sign_key_save = SigningKey.from_credentials("alice", "password", ScryptParams())
sign_key_save.save_wif_file(TEST_FILE_PATH)
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)
def test_load_ssb_file(self):
dummy_content = """
# comments
#
#
{
"curve": "ed25519",
"public": "dGVzdHRlc3R0ZXN0dGV0c3RldHN0dGV0c3RldGV0ZXRldHN0ZXR0c3RldHN0dGV0c3Q=.ed25519",
"private": "dGVzdHRlc3R0ZXN0dGV0c3RldHN0dGV0c3RldGV0ZXRldHN0ZXR0c3RldHN0dGV0c3Q==.ed25519",
"id": "@qJ8qVfXU2mIWG9WfKIRsd6GDscQlErzPHsxzHcyQMWQ=.ed25519"
}
#
# comments
"""
# create dummy .ssb/secret file
with open(TEST_FILE_PATH, "w") as fh:
fh.write(dummy_content)
# test load file
sign_key_load = SigningKey.from_credentials_file(TEST_FILE_PATH)
self.assertEqual(
sign_key_load.pubkey, "FAhCeyWq2Ni2xZS3hmYk5w95f8ELxNhUVvU5VB2LXy49"
)
self.assertEqual(
sign_key_load.sk.hex(),
"f2f7ae68635dba3455390a74ca0811e4c06142229bb58556aaa37d5598548c9ed27f4cb2bfadbaf45b61714b896d4639ab90db035aee746611cdd342bdaa8996",
)
self.assertEqual(
sign_key_load.vk.hex(),
"d27f4cb2bfadbaf45b61714b896d4639ab90db035aee746611cdd342bdaa8996",
)
def test_dubp_mnemonic(self):
mnemonic = (
"tongue cute mail fossil great frozen same social weasel impact brush kind"
)
keypair = SigningKey.from_dubp_mnemonic(mnemonic)
self.assertEqual(
base64.b64encode(keypair.seed).decode("utf-8"),
"qGdvpbP9lJe7ZG4ZUSyu33KFeAEs/KkshAp9gEI4ReY=",
)
self.assertEqual(keypair.pubkey, "732SSfuwjB7jkt9th1zerGhphs6nknaCBCTozxUcPWPU")