1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-10-19 14:30:31 +00:00
trezor-firmware/core/tests/test_apps.bitcoin.authorization.py
Andrew Kozlik 473657fd44 chore(core): Tweak validation of pre-authorized GetOwnershipProof.
In pre-authorized GetOwnershipProof requests ensure that the commitment data
starts with a length-prefixed name of the CoinJoin coordinator.

[no changelog]
2022-02-11 13:56:27 +01:00

113 lines
4.0 KiB
Python

from common import unittest, H_
import storage.cache
from trezor.messages import AuthorizeCoinJoin
from trezor.messages import GetOwnershipProof
from trezor.messages import SignTx
from trezor.enums import InputScriptType
from apps.common import coins
from apps.bitcoin.authorization import CoinJoinAuthorization
_ROUND_ID_LEN = 32
class TestAuthorization(unittest.TestCase):
coin = coins.by_name('Bitcoin')
def setUp(self):
self.msg_auth = AuthorizeCoinJoin(
coordinator="www.example.com",
max_total_fee=40000,
fee_per_anonymity=int(0.003 * 10**9),
address_n=[H_(84), H_(0), H_(0)],
coin_name=self.coin.coin_name,
script_type=InputScriptType.SPENDWITNESS,
)
self.authorization = CoinJoinAuthorization(self.msg_auth)
storage.cache.start_session()
def test_ownership_proof_account_depth_mismatch(self):
# Account depth mismatch.
msg = GetOwnershipProof(
address_n=[H_(84), H_(0), H_(0), 1],
coin_name=self.coin.coin_name,
script_type=InputScriptType.SPENDWITNESS,
user_confirmation=True,
commitment_data=b"\x0fwww.example.com" + int.to_bytes(1, _ROUND_ID_LEN, "big"),
)
self.assertFalse(self.authorization.check_get_ownership_proof(msg))
def test_ownership_proof_account_path_mismatch(self):
# Account path mismatch.
msg = GetOwnershipProof(
address_n=[H_(49), H_(0), H_(0), 1, 2],
coin_name=self.coin.coin_name,
script_type=InputScriptType.SPENDWITNESS,
user_confirmation=True,
commitment_data=b"\x0fwww.example.com" + int.to_bytes(1, _ROUND_ID_LEN, "big"),
)
self.assertFalse(self.authorization.check_get_ownership_proof(msg))
def test_ownership_proof_coordinator_mismatch(self):
# Coordinator name mismatch.
msg = GetOwnershipProof(
address_n=[H_(84), H_(0), H_(0), 1, 2],
coin_name=self.coin.coin_name,
script_type=InputScriptType.SPENDWITNESS,
user_confirmation=True,
commitment_data=b"\x0fwww.example.org" + int.to_bytes(1, _ROUND_ID_LEN, "big"),
)
self.assertFalse(self.authorization.check_get_ownership_proof(msg))
def test_ownership_proof_wrong_coordinator_length(self):
msg = GetOwnershipProof(
address_n=[H_(84), H_(0), H_(0), 1, 2],
coin_name=self.coin.coin_name,
script_type=InputScriptType.SPENDWITNESS,
user_confirmation=True,
commitment_data=b"\x0ewww.example.com" + int.to_bytes(1, _ROUND_ID_LEN - 1, "big"),
)
self.assertFalse(self.authorization.check_get_ownership_proof(msg))
msg = GetOwnershipProof(
address_n=[H_(84), H_(0), H_(0), 1, 2],
coin_name=self.coin.coin_name,
script_type=InputScriptType.SPENDWITNESS,
user_confirmation=True,
commitment_data=b"\x10www.example.com" + int.to_bytes(1, _ROUND_ID_LEN + 1, "big"),
)
self.assertFalse(self.authorization.check_get_ownership_proof(msg))
def test_authorize_ownership_proof(self):
msg = GetOwnershipProof(
address_n=[H_(84), H_(0), H_(0), 1, 2],
coin_name=self.coin.coin_name,
script_type=InputScriptType.SPENDWITNESS,
user_confirmation=True,
commitment_data=b"\x0fwww.example.com" + int.to_bytes(1, _ROUND_ID_LEN, "big"),
)
self.assertTrue(self.authorization.check_get_ownership_proof(msg))
def test_approve_sign_tx(self):
msg = SignTx(outputs_count=10, inputs_count=21, coin_name=self.coin.coin_name, lock_time=0)
self.assertTrue(self.authorization.approve_sign_tx(msg, 10000))
self.assertTrue(self.authorization.approve_sign_tx(msg, 20000))
self.assertFalse(self.authorization.approve_sign_tx(msg, 10001))
self.assertTrue(self.authorization.approve_sign_tx(msg, 10000))
if __name__ == '__main__':
unittest.main()