Skip to content

Commit 8aa9e6f

Browse files
MHHukiewitzhoh
authored andcommitted
increase test coverage on SOL and ETH, fix ETH verification on checksummed addresses
1 parent 6148040 commit 8aa9e6f

File tree

3 files changed

+53
-2
lines changed

3 files changed

+53
-2
lines changed

src/aleph/sdk/chains/ethereum.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def verify_signature(
5454
Verifies a signature.
5555
Args:
5656
signature: The signature to verify. Can be a hex encoded string or bytes.
57-
public_key: The sender's public key to use for verification. Can be a checksummed, hex encoded string or bytes.
57+
public_key: The sender's public key to use for verification. Can be a checksum, hex encoded string or bytes.
5858
message: The message to verify. Can be an utf-8 string or bytes.
5959
Raises:
6060
BadSignatureError: If the signature is invalid.
@@ -75,7 +75,7 @@ def verify_signature(
7575
message_hash = encode_defunct(text=message)
7676
try:
7777
address = Account.recover_message(message_hash, signature=signature)
78-
if address != public_key:
78+
if address.casefold() != public_key.casefold():
7979
raise BadSignatureError
8080
except (EthBadSignatureError, BadSignatureError) as e:
8181
raise BadSignatureError from e

tests/unit/test_chain_ethereum.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,23 @@ async def test_verify_signature(ethereum_account):
6363
message["signature"], message["sender"], get_verification_buffer(message)
6464
)
6565

66+
# cover all branching options
67+
verify_signature(
68+
message["signature"][2:],
69+
message["sender"],
70+
get_verification_buffer(message),
71+
)
72+
verify_signature(
73+
bytes(message["signature"], "utf-8"),
74+
bytes.fromhex(message["sender"][2:]),
75+
get_verification_buffer(message).decode("utf-8"),
76+
)
77+
verify_signature(
78+
bytes(message["signature"], "utf-8")[2:],
79+
message["sender"],
80+
get_verification_buffer(message),
81+
)
82+
6683

6784
@pytest.mark.asyncio
6885
async def test_verify_signature_with_forged_signature(ethereum_account):
@@ -98,3 +115,26 @@ async def test_decrypt_secp256k1(ethereum_account):
98115
decrypted = await account.decrypt(encrypted)
99116
assert type(decrypted) == bytes
100117
assert content == decrypted
118+
119+
120+
@pytest.mark.asyncio
121+
async def test_verify_signature_wrong_public_key(ethereum_account):
122+
account = ethereum_account
123+
124+
message = asdict(
125+
Message(
126+
"ETH",
127+
account.get_address(),
128+
"POST",
129+
"SomeHash",
130+
)
131+
)
132+
133+
await account.sign_message(message)
134+
assert message["signature"]
135+
136+
wrong_public_key: str = "0x" + "0" * 130
137+
with pytest.raises(BadSignatureError):
138+
verify_signature(
139+
message["signature"], wrong_public_key, get_verification_buffer(message)
140+
)

tests/unit/test_chain_solana.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ async def test_SOLAccount(solana_account):
6060
assert verif == verification_buffer
6161
assert message["sender"] == signature["publicKey"]
6262

63+
pubkey = solana_account.get_public_key()
64+
assert type(pubkey) == str
65+
assert len(pubkey) == 64
66+
6367

6468
@pytest.mark.asyncio
6569
async def test_decrypt_curve25516(solana_account):
@@ -90,6 +94,13 @@ async def test_verify_signature(solana_account):
9094

9195
verify_signature(raw_signature, message["sender"], get_verification_buffer(message))
9296

97+
# as bytes
98+
verify_signature(
99+
base58.b58decode(raw_signature),
100+
base58.b58decode(message["sender"]),
101+
get_verification_buffer(message).decode("utf-8"),
102+
)
103+
93104

94105
@pytest.mark.asyncio
95106
async def test_verify_signature_with_forged_signature(solana_account):

0 commit comments

Comments
 (0)