Skip to content

Commit 8bfb599

Browse files
Merge pull request #5 from rubixchain/develop
release: v0.2
2 parents 14bf34f + 0c3028c commit 8bfb599

File tree

4 files changed

+94
-4
lines changed

4 files changed

+94
-4
lines changed

.github/workflows/test.yml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
name: Test
2+
3+
on:
4+
pull_request:
5+
branches: [ main, develop ]
6+
workflow_dispatch:
7+
8+
jobs:
9+
test:
10+
runs-on: ${{ matrix.os }}
11+
strategy:
12+
fail-fast: false
13+
matrix:
14+
os: [ubuntu-latest, macos-latest, windows-latest]
15+
python-version: ["3.10"]
16+
17+
steps:
18+
- name: Checkout code
19+
uses: actions/checkout@v4
20+
21+
- name: Set up Python ${{ matrix.python-version }}
22+
uses: actions/setup-python@v5
23+
with:
24+
python-version: ${{ matrix.python-version }}
25+
cache: 'pip'
26+
27+
- name: Install dependencies
28+
run: |
29+
python -m pip install --upgrade pip
30+
pip install pytest pytest-cov
31+
pip install -e .
32+
33+
- name: Run tests
34+
run: |
35+
pytest tests/

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "rubix-py"
7-
version = "0.1.0"
7+
version = "0.2.0"
88
description = "Rubix Client SDK for Python"
99
requires-python = ">=3.10"
1010
license = { text = "MIT" }

rubix/crypto/secp256k1.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,13 @@ def public_key(self) -> str:
6060
return self.__public_key
6161

6262
def sign(self, message: bytes) -> bytes:
63-
"""Signs a message using the private key.
63+
"""Signs a message using secp256k1 private key.
6464
6565
Args:
6666
message (bytes): The message to sign.
6767
6868
Returns:
69-
str: The hexadecimal signature.
69+
bytes: The generated signature in bytes.
7070
"""
7171
cv = Curve.get_curve('secp256k1')
7272
pv_key = ECPrivateKey(int(self.__private_key, 16), cv)
@@ -77,3 +77,24 @@ def sign(self, message: bytes) -> bytes:
7777
raise ValueError("Failed to sign the message.")
7878

7979
return sig
80+
81+
def verify(self, message: bytes, signature: bytes) -> bool:
82+
"""Verifies secp256k1 signature.
83+
84+
Args:
85+
message (bytes): The original message that was signed.
86+
signature (bytes): The signature to verify.
87+
88+
Returns:
89+
bool: True if signature is valid, False otherwise.
90+
"""
91+
cv = Curve.get_curve('secp256k1')
92+
priv_key = ECPrivateKey(int(self.__private_key, 16), cv)
93+
94+
pub_key = priv_key.get_public_key()
95+
signer = ECDSA()
96+
97+
try:
98+
return signer.verify(message, signature, pub_key)
99+
except Exception:
100+
return False

tests/crypto/test_secp256k1.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,38 @@ def test_secp256k1_keypair_from_mnemonic_seed():
2323
assert isinstance(keypair, Secp256k1Keypair)
2424
assert keypair.public_key is not None
2525
assert isinstance(keypair.public_key, str)
26-
assert len(keypair.public_key) == 66, f"expected compressed public key length of 66 hex characters, got {len(keypair.public_key)}"
26+
assert len(keypair.public_key) == 66, f"expected compressed public key length of 66 hex characters, got {len(keypair.public_key)}"
27+
28+
def test_secp256k1_verify_valid_message():
29+
"""Test signing and verifying a message using Secp256k1 keypair where both messages
30+
used for signing and verifying are the same."""
31+
32+
private_key_hex = "1e99423a4edf5c3d2e8f6b8c3f4e5d6c7b8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c"
33+
private_key_bytes = bytes.fromhex(private_key_hex)
34+
35+
message = b"Test message for signing"
36+
37+
keypair = Secp256k1Keypair.from_private_key(private_key_bytes)
38+
signature = keypair.sign(message)
39+
assert isinstance(signature, bytes)
40+
41+
is_valid = keypair.verify(message, signature)
42+
assert is_valid is True
43+
44+
def test_secp256k1_verify_invalid_message():
45+
"""Test signing and verifying a message using Secp256k1 keypair where both messages
46+
used for signing and verifying are different."""
47+
48+
private_key_hex = "1e99423a4edf5c3d2e8f6b8c3f4e5d6c7b8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c"
49+
private_key_bytes = bytes.fromhex(private_key_hex)
50+
51+
message_1 = b"Test message for signing"
52+
message_2 = b"Test message for signing "
53+
54+
keypair = Secp256k1Keypair.from_private_key(private_key_bytes)
55+
signature = keypair.sign(message_1)
56+
assert isinstance(signature, bytes)
57+
58+
is_valid = keypair.verify(message_2, signature)
59+
assert is_valid is False
60+

0 commit comments

Comments
 (0)