diff --git a/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_master-daemon-00-get_transactions.json b/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_master-daemon-00-get_transactions.json new file mode 100644 index 0000000..bb05c3d --- /dev/null +++ b/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_master-daemon-00-get_transactions.json @@ -0,0 +1,30 @@ +{ + "credits": 0, + "status": "OK", + "top_hash": "", + "txs": [ + { + "as_hex": "", + "as_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 4325102, 464564, 19546, 7828, 15534, 180, 1645, 763, 454, 2046, 9\n ], \n \"k_image\": \"235fa321338a6317a6064fc13b9917c5b9e36dc929b0d3f01d19a6ff9a1d9169\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"key\": \"4cd1c255c3247d2c2324fb580dd66f1158acc0ba352a4bddf9bb5d724f2b9d4a\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"72a976004da61eabbe7ef1f074ac1ad960347f18b63e79c0b4075c70c6faa71a\"\n }\n }\n ], \n \"extra\": [ 1, 147, 181, 21, 141, 147, 122, 16, 161, 230, 64, 52, 218, 173, 173, 125, 69, 35, 14, 168, 251, 151, 140, 33, 64, 2, 68, 15, 75, 31, 24, 59, 150, 2, 9, 1, 56, 181, 21, 158, 240, 73, 6, 247\n ], \n \"rct_signatures\": {\n \"type\": 5, \n \"txnFee\": 44760000, \n \"ecdhInfo\": [ {\n \"amount\": \"bb400d3177c30ab5\"\n }, {\n \"amount\": \"c284adb69f34912c\"\n }], \n \"outPk\": [ \"2b63045a7fc922e73eb74cf179ca1640f36ba97ce8f27137dc30ca8e407d99c1\", \"a25db81bcfaf13950d9a353c6c2a55f45e103fa91d3dadad19cb1087f425fa96\"]\n }\n}", + "block_height": 1079424, + "block_timestamp": 1650936396, + "double_spend_seen": false, + "in_pool": false, + "output_indices": [ + 4837766, + 4837767 + ], + "prunable_as_hex": "", + "prunable_hash": "ab173d3c08a7251cfd9ca58c67345368828f6f5f1d92972b79d080489956c154", + "pruned_as_hex": "02000102000beefd8702b4ad1cda9801943dae79b401ed0cfb05c603fe0f09235fa321338a6317a6064fc13b9917c5b9e36dc929b0d3f01d19a6ff9a1d91690200024cd1c255c3247d2c2324fb580dd66f1158acc0ba352a4bddf9bb5d724f2b9d4a000272a976004da61eabbe7ef1f074ac1ad960347f18b63e79c0b4075c70c6faa71a2c0193b5158d937a10a1e64034daadad7d45230ea8fb978c214002440f4b1f183b9602090138b5159ef04906f705c0f7ab15bb400d3177c30ab5c284adb69f34912c2b63045a7fc922e73eb74cf179ca1640f36ba97ce8f27137dc30ca8e407d99c1a25db81bcfaf13950d9a353c6c2a55f45e103fa91d3dadad19cb1087f425fa96", + "tx_hash": "f7e60d07c8e201b779871e3817edf8388e6ea775922def5758aef231d3ced36a" + } + ], + "txs_as_hex": [ + "" + ], + "txs_as_json": [ + "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 4325102, 464564, 19546, 7828, 15534, 180, 1645, 763, 454, 2046, 9\n ], \n \"k_image\": \"235fa321338a6317a6064fc13b9917c5b9e36dc929b0d3f01d19a6ff9a1d9169\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"key\": \"4cd1c255c3247d2c2324fb580dd66f1158acc0ba352a4bddf9bb5d724f2b9d4a\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"72a976004da61eabbe7ef1f074ac1ad960347f18b63e79c0b4075c70c6faa71a\"\n }\n }\n ], \n \"extra\": [ 1, 147, 181, 21, 141, 147, 122, 16, 161, 230, 64, 52, 218, 173, 173, 125, 69, 35, 14, 168, 251, 151, 140, 33, 64, 2, 68, 15, 75, 31, 24, 59, 150, 2, 9, 1, 56, 181, 21, 158, 240, 73, 6, 247\n ], \n \"rct_signatures\": {\n \"type\": 5, \n \"txnFee\": 44760000, \n \"ecdhInfo\": [ {\n \"amount\": \"bb400d3177c30ab5\"\n }, {\n \"amount\": \"c284adb69f34912c\"\n }], \n \"outPk\": [ \"2b63045a7fc922e73eb74cf179ca1640f36ba97ce8f27137dc30ca8e407d99c1\", \"a25db81bcfaf13950d9a353c6c2a55f45e103fa91d3dadad19cb1087f425fa96\"]\n }\n}" + ], + "untrusted": false +} diff --git a/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_master-wallet-00-get_accounts.json b/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_master-wallet-00-get_accounts.json new file mode 100644 index 0000000..208947e --- /dev/null +++ b/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_master-wallet-00-get_accounts.json @@ -0,0 +1,18 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": { + "subaddress_accounts": [ + { + "account_index": 0, + "balance": 11709717332048, + "base_address": "54LUsTyVL2haFdvkUVngGCiacaRYkjrUvfhvnF6JS2fXNL6twQUQf7PEPtf9MvRYXvhVmtzcV2MUefinDjjwVcH56xm3AHx", + "label": "Primary account", + "tag": "", + "unlocked_balance": 11709717332048 + } + ], + "total_balance": 11709717332048, + "total_unlocked_balance": 11709717332048 + } +} diff --git a/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_master-wallet-01-query_key.json b/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_master-wallet-01-query_key.json new file mode 100644 index 0000000..1280bac --- /dev/null +++ b/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_master-wallet-01-query_key.json @@ -0,0 +1,7 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": { + "key": "a759f8631116a607e0d905c09c633e320825d3a05e2b5fc54ab5f812f01a1d04" + } +} diff --git a/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_master-wallet-02-addresses-account-0.json b/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_master-wallet-02-addresses-account-0.json new file mode 100644 index 0000000..0d4083a --- /dev/null +++ b/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_master-wallet-02-addresses-account-0.json @@ -0,0 +1,69 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": { + "address": "54LUsTyVL2haFdvkUVngGCiacaRYkjrUvfhvnF6JS2fXNL6twQUQf7PEPtf9MvRYXvhVmtzcV2MUefinDjjwVcH56xm3AHx", + "addresses": [ + { + "address": "54LUsTyVL2haFdvkUVngGCiacaRYkjrUvfhvnF6JS2fXNL6twQUQf7PEPtf9MvRYXvhVmtzcV2MUefinDjjwVcH56xm3AHx", + "address_index": 0, + "label": "Primary account", + "used": true + }, + { + "address": "74fu2Uiveqg8XwxtLK4kdMPkCZNuW8gGC7nWgB8kJF1rACfbGvPKirrSaKFnxtUJePfnGTPRQ1Tp3jR2PKAavqQ7RNrsJbb", + "address_index": 1, + "label": "(Untitled address)", + "used": true + }, + { + "address": "72KSFPEUK5MDvo716tgRrndsRgB3UtWczAXVBjqDZCvRitvUKKA8saNH9LCD1ExCM5VAKuZJTtnH495vEupxRn7EEYbUrGV", + "address_index": 2, + "label": "(Untitled address)", + "used": true + }, + { + "address": "7As2Hf3RwGWSCJAPFFHXDyLg5qywN8MiqcmpWPiM3Mc7bmuoA1V78HWEf3GctXtveHSH35hk6NVGK7TAQoyXpy3ATvEYgPz", + "address_index": 3, + "label": "(Untitled address)", + "used": true + }, + { + "address": "771dkwjPR1UDTMM7NVbJ6LDX2pQdBaHqDZKSzViPTDaxVjG7idfF9uP2i8xftcV1JfZYESDzvFvAUJ1ym89uPy7VQ9Nd9BA", + "address_index": 4, + "label": "(Untitled address)", + "used": true + }, + { + "address": "798wHkYNUqc5UWYdeYiFmrYeXV7Rd23MqasV3YWAYLbeieYb3ogLEkB9TugZkP72qMMtnhxAuyr62P9GLk3Ai5EMS6mCTdu", + "address_index": 5, + "label": "(Untitled address)", + "used": true + }, + { + "address": "7AVgqHzSLu227tv2HGvPAYcbVqTzbbNsAC99QpPZwZzudGsEypD4ZjrQQcansdaQGDLtUbdEhqHfeNjgEWPFAUoVGq1dnbE", + "address_index": 6, + "label": "(Untitled address)", + "used": true + }, + { + "address": "77xBMPG3k5qEmQmreBbeqJYwcx9kkEz2y2abCFvRRrjKZVr2LVois3kGRM4kzXUqmj7PtTkiUza6rXnNZ5HM17pd2AbsVEA", + "address_index": 7, + "label": "(Untitled address)", + "used": true + }, + { + "address": "72barfe7Sp9JZkyLCYLn3wfGhysUUQJqgJPp7DtjStjFdFUXR376ypzYKyxgMcXNE3AStjFmaSKAq6pv78jKPsbTTLq3uNb", + "address_index": 8, + "label": "(Untitled address)", + "used": true + }, + { + "address": "77a1kZkpr9uZMD2kcunkE67JiNN6dZhXAUa6ACFtP8j4MqTipM1QW5FSLkeEJZ5jzaMYNauPcavyPMF2VCVr8i5XEFizNkv", + "address_index": 9, + "label": "(Untitled address)", + "used": false + } + ] + } +} diff --git a/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_subaddr-daemon-00-get_transactions.json b/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_subaddr-daemon-00-get_transactions.json new file mode 100644 index 0000000..5a12d16 --- /dev/null +++ b/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_subaddr-daemon-00-get_transactions.json @@ -0,0 +1,30 @@ +{ + "credits": 0, + "status": "OK", + "top_hash": "", + "txs": [ + { + "as_hex": "", + "as_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 4675357, 101625, 27510, 10864, 17256, 2990, 745, 369, 17, 654, 290\n ], \n \"k_image\": \"8d07ba16fd1bcc8eeb2fa485eb293baafe4a06f6096f948fedb6679606c7ea9c\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"key\": \"5c09c39a189d1ceb7bceb1929a4fc676642d4277fdd3abaec2a3f7c0368e8077\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"1a8b5aa09c1ccfb310ad913a6b577a7e723a53619fb4fd1d9b5e831fc1694be0\"\n }\n }\n ], \n \"extra\": [ 1, 65, 88, 164, 63, 169, 150, 146, 177, 47, 124, 96, 195, 68, 227, 158, 193, 234, 47, 182, 8, 160, 78, 94, 188, 2, 231, 225, 89, 49, 186, 237, 123, 2, 9, 1, 130, 171, 128, 151, 207, 6, 115, 252\n ], \n \"rct_signatures\": {\n \"type\": 5, \n \"txnFee\": 44790000, \n \"ecdhInfo\": [ {\n \"amount\": \"1ad451cc41a9baf7\"\n }, {\n \"amount\": \"0a6ded7a1104d184\"\n }], \n \"outPk\": [ \"9338cbbdc552ac770797da8af3a589b02e9ad5928d439875760d89dfae1de4ba\", \"05e5685aa757e6420ef889107c7d4c0fc64c698f8bbaa7192ba7164c88ce8b46\"]\n }\n}", + "block_height": 1079424, + "block_timestamp": 1650936396, + "double_spend_seen": false, + "in_pool": false, + "output_indices": [ + 4837768, + 4837769 + ], + "prunable_as_hex": "", + "prunable_hash": "7c4eccf0c4f947280645e3aa18f250b90d8466bdedc9371bcca780321fa1e00b", + "pruned_as_hex": "02000102000b9dae9d02f99906f6d601f054e88601ae17e905f102118e05a2028d07ba16fd1bcc8eeb2fa485eb293baafe4a06f6096f948fedb6679606c7ea9c0200025c09c39a189d1ceb7bceb1929a4fc676642d4277fdd3abaec2a3f7c0368e807700021a8b5aa09c1ccfb310ad913a6b577a7e723a53619fb4fd1d9b5e831fc1694be02c014158a43fa99692b12f7c60c344e39ec1ea2fb608a04e5ebc02e7e15931baed7b02090182ab8097cf0673fc05f0e1ad151ad451cc41a9baf70a6ded7a1104d1849338cbbdc552ac770797da8af3a589b02e9ad5928d439875760d89dfae1de4ba05e5685aa757e6420ef889107c7d4c0fc64c698f8bbaa7192ba7164c88ce8b46", + "tx_hash": "54731f9263e92c9e249d8eb677f7c8f1c7edb9812092479f026062139842e0e0" + } + ], + "txs_as_hex": [ + "" + ], + "txs_as_json": [ + "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 4675357, 101625, 27510, 10864, 17256, 2990, 745, 369, 17, 654, 290\n ], \n \"k_image\": \"8d07ba16fd1bcc8eeb2fa485eb293baafe4a06f6096f948fedb6679606c7ea9c\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"key\": \"5c09c39a189d1ceb7bceb1929a4fc676642d4277fdd3abaec2a3f7c0368e8077\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"1a8b5aa09c1ccfb310ad913a6b577a7e723a53619fb4fd1d9b5e831fc1694be0\"\n }\n }\n ], \n \"extra\": [ 1, 65, 88, 164, 63, 169, 150, 146, 177, 47, 124, 96, 195, 68, 227, 158, 193, 234, 47, 182, 8, 160, 78, 94, 188, 2, 231, 225, 89, 49, 186, 237, 123, 2, 9, 1, 130, 171, 128, 151, 207, 6, 115, 252\n ], \n \"rct_signatures\": {\n \"type\": 5, \n \"txnFee\": 44790000, \n \"ecdhInfo\": [ {\n \"amount\": \"1ad451cc41a9baf7\"\n }, {\n \"amount\": \"0a6ded7a1104d184\"\n }], \n \"outPk\": [ \"9338cbbdc552ac770797da8af3a589b02e9ad5928d439875760d89dfae1de4ba\", \"05e5685aa757e6420ef889107c7d4c0fc64c698f8bbaa7192ba7164c88ce8b46\"]\n }\n}" + ], + "untrusted": false +} diff --git a/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_subaddr-wallet-00-get_accounts.json b/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_subaddr-wallet-00-get_accounts.json new file mode 120000 index 0000000..a535d7d --- /dev/null +++ b/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_subaddr-wallet-00-get_accounts.json @@ -0,0 +1 @@ +test_v2_single_output_with_fake_amount_to_master-wallet-00-get_accounts.json \ No newline at end of file diff --git a/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_subaddr-wallet-01-query_key.json b/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_subaddr-wallet-01-query_key.json new file mode 120000 index 0000000..f658646 --- /dev/null +++ b/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_subaddr-wallet-01-query_key.json @@ -0,0 +1 @@ +test_v2_single_output_with_fake_amount_to_master-wallet-01-query_key.json \ No newline at end of file diff --git a/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_subaddr-wallet-02-addresses-account-0.json b/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_subaddr-wallet-02-addresses-account-0.json new file mode 120000 index 0000000..3bf3844 --- /dev/null +++ b/tests/data/test_outputs/test_v2_single_output_with_fake_amount_to_subaddr-wallet-02-addresses-account-0.json @@ -0,0 +1 @@ +test_v2_single_output_with_fake_amount_to_master-wallet-02-addresses-account-0.json \ No newline at end of file diff --git a/tests/test_outputs.py b/tests/test_outputs.py index bf1350f..69ddacb 100644 --- a/tests/test_outputs.py +++ b/tests/test_outputs.py @@ -157,6 +157,108 @@ class OutputTestCase(JSONTestCase): "to [76Qt2x]", ) + @responses.activate + def test_v2_single_output_with_fake_amount_to_master(self): + """ + Tests a transaction with real amount of 5.0 XMR and faked amount of ~2^24 XMR + through a forged value of "ecdhInfo" field. + """ + responses.add( + responses.POST, + self.wallet_jsonrpc_url, + json=self._read( + "test_v2_single_output_with_fake_amount_to_master-wallet-00-get_accounts.json" + ), + status=200, + ) + responses.add( + responses.POST, + self.wallet_jsonrpc_url, + json=self._read( + "test_v2_single_output_with_fake_amount_to_master-wallet-01-query_key.json" + ), + status=200, + ) + responses.add( + responses.POST, + self.wallet_jsonrpc_url, + json=self._read( + "test_v2_single_output_with_fake_amount_to_master-wallet-02-addresses-account-0.json" + ), + status=200, + ) + responses.add( + responses.POST, + self.daemon_transactions_url, + json=self._read( + "test_v2_single_output_with_fake_amount_to_master-daemon-00-get_transactions.json" + ), + status=200, + ) + wallet = Wallet(JSONRPCWallet(host="127.0.0.1", port=38083)) + daemon = Daemon(JSONRPCDaemon(host="127.0.0.1", port=38081)) + tx = daemon.transactions( + "f7e60d07c8e201b779871e3817edf8388e6ea775922def5758aef231d3ced36a" + )[0] + outs = tx.outputs(wallet=wallet) + self.assertEqual(len(outs), 2) + for n, out in enumerate(outs): + self.assertIsNone( + out.payment, + f"Output {n} contains a payment with incorrect ecdhInfo", + ) + + @responses.activate + def test_v2_single_output_with_fake_amount_to_subaddr(self): + """ + Tests a transaction with real amount of 3.0 XMR and faked amount of ~2^24 XMR + through a forged value of "ecdhInfo" field. + """ + responses.add( + responses.POST, + self.wallet_jsonrpc_url, + json=self._read( + "test_v2_single_output_with_fake_amount_to_subaddr-wallet-00-get_accounts.json" + ), + status=200, + ) + responses.add( + responses.POST, + self.wallet_jsonrpc_url, + json=self._read( + "test_v2_single_output_with_fake_amount_to_subaddr-wallet-01-query_key.json" + ), + status=200, + ) + responses.add( + responses.POST, + self.wallet_jsonrpc_url, + json=self._read( + "test_v2_single_output_with_fake_amount_to_subaddr-wallet-02-addresses-account-0.json" + ), + status=200, + ) + responses.add( + responses.POST, + self.daemon_transactions_url, + json=self._read( + "test_v2_single_output_with_fake_amount_to_subaddr-daemon-00-get_transactions.json" + ), + status=200, + ) + wallet = Wallet(JSONRPCWallet(host="127.0.0.1", port=38083)) + daemon = Daemon(JSONRPCDaemon(host="127.0.0.1", port=38081)) + tx = daemon.transactions( + "54731f9263e92c9e249d8eb677f7c8f1c7edb9812092479f026062139842e0e0" + )[0] + outs = tx.outputs(wallet=wallet) + self.assertEqual(len(outs), 2) + for n, out in enumerate(outs): + self.assertIsNone( + out.payment, + f"Output {n} contains a payment with incorrect ecdhInfo", + ) + def test_coinbase_no_own_output(self): txdata = self._read("test_coinbase_no_own_output-26dcb5.json") tx = Transaction(