From 97bc53c6f4cbda89117c6350e17749a8ac480b4f Mon Sep 17 00:00:00 2001 From: ilyas585 Date: Mon, 10 Feb 2025 20:32:26 +0300 Subject: [PATCH] [#1] Add method get_private_key_from_wif Signed-off-by: ilyas585 --- frostfs_api/__init__.py | 0 frostfs_api/crypto/key_extension.py | 11 +++++++++++ requirements.txt | 3 +++ tests/conftest.py | 20 ++++++++++++++++++++ tests/crypto/test_key_extension.py | 16 ++++++++++++++++ tests/helpers/convert.py | 18 ++++++++++++++++++ 6 files changed, 68 insertions(+) create mode 100644 frostfs_api/__init__.py create mode 100644 frostfs_api/crypto/key_extension.py create mode 100644 requirements.txt create mode 100644 tests/conftest.py create mode 100644 tests/crypto/test_key_extension.py create mode 100644 tests/helpers/convert.py diff --git a/frostfs_api/__init__.py b/frostfs_api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/frostfs_api/crypto/key_extension.py b/frostfs_api/crypto/key_extension.py new file mode 100644 index 0000000..8f27946 --- /dev/null +++ b/frostfs_api/crypto/key_extension.py @@ -0,0 +1,11 @@ +import base58 + + +class KeyExtension: + def get_private_key_from_wif(self, wif: str): + decoded = base58.b58decode_check(wif) + if len(decoded) != 34 or decoded[0] != 0x80 or decoded[-1] != 0x01: + raise ValueError("Incorrect WIF private key") + + private_key = decoded[1:-1] + return private_key diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..ee58f94 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +base58==2.1.1 +ecdsa==0.19.0 +pytest==8.3.4 diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..d3ab117 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,20 @@ +import pytest + +from frostfs_api.crypto.key_extension import KeyExtension +from frostfs_api.client.verifier import Verifier +from frostfs_api.client.signer import Signer + + +@pytest.fixture(scope="session") +def client_key_extension(): + return KeyExtension() + + +@pytest.fixture(scope="session") +def client_signer(): + return Signer() + + +@pytest.fixture(scope="session") +def client_verifier(): + return Verifier() diff --git a/tests/crypto/test_key_extension.py b/tests/crypto/test_key_extension.py new file mode 100644 index 0000000..6fc1681 --- /dev/null +++ b/tests/crypto/test_key_extension.py @@ -0,0 +1,16 @@ +from frostfs_api.crypto.key_extension import KeyExtension +from tests.helpers.convert import convert_bytes_format_127_to_256 + + +class TestKeyExtension: + WIF = "L1YS4myg3xHPvi3FHeLaEt7G8upwJaWL5YLV7huviuUtXFpzBMqZ" + PRIVATE_KEY = [ + -128, -5, 30, -36, -118, 85, -67, -6, 81, 43, 93, -38, 106, 21, -88, 127, 15, 125, -79, -17, -40, 77, -15, + 122, -88, 72, 109, -47, 125, -80, -40, -38 + ] + + def test_get_private_key_from_wif_success(self, client_key_extension: KeyExtension): + private_key = client_key_extension.get_private_key_from_wif(self.WIF) + + assert len(private_key) == 32, f"Not correct len of private key, expected: 32 Actual: {len(private_key)} " + assert private_key == bytes(convert_bytes_format_127_to_256(self.PRIVATE_KEY)), f"Not match private key, Expected: {self.PRIVATE_KEY}, Actual: {private_key}" diff --git a/tests/helpers/convert.py b/tests/helpers/convert.py new file mode 100644 index 0000000..79f4c63 --- /dev/null +++ b/tests/helpers/convert.py @@ -0,0 +1,18 @@ +def convert_bytes_format_127_to_256(numbers: list[int]): + new_list = [] + for num in numbers: + if num > 0: + new_list.append(num) + else: + new_list.append(num + 256) + return new_list + + +def convert_bytes_format_256_to_127(numbers: list[int]): + new_list = [] + for num in numbers: + if num < 128: + new_list.append(num) + else: + new_list.append(num - 256) + return new_list