diff --git a/bip-0375.mediawiki b/bip-0375.mediawiki index b81a69ff..401a8a17 100644 --- a/bip-0375.mediawiki +++ b/bip-0375.mediawiki @@ -326,6 +326,9 @@ Use the provided [[bip-0375/test_runner.py|test runner]] to validate each test v | segwit version greater than 1 in transaction inputs with sp output |- | Input Eligibility +| segwit version greater than 1 supplied via PSBT_IN_NON_WITNESS_UTXO with sp output +|- +| Input Eligibility | non-SIGHASH_ALL signature on input with sp output |- | Output Scripts diff --git a/bip-0375/bip375_test_vectors.json b/bip-0375/bip375_test_vectors.json index e05a0c2d..8aa19513 100644 --- a/bip-0375/bip375_test_vectors.json +++ b/bip-0375/bip375_test_vectors.json @@ -389,6 +389,22 @@ "input_eligibility" ] }, + { + "description": "input eligibility: segwit version greater than 1 supplied via PSBT_IN_NON_WITNESS_UTXO with sp output", + "psbt": "cHNidP8B+wQCAAAAAQIEAgAAAAEEAQEBBQEBAQYBAAABDiDJcwwbkl87iv+6mh+VHww4gI7IlcsXC2fRZkcbayYwlgEPBAAAAAAiAgLIF7t1Ia/DXqlvO/snDm61Dd/6VWBie5Yf7ADymWUIv0cwRAIgcvN4hS+4Q3JgcvJQdvDndWDtTC4EcWbuamJsdb/bOdYCICEqrl8JV040H1iG9f/zL1cW6rkDCkpTeeYBa2pNQtwkAQEDBAEAAAAiBgLIF7t1Ia/DXqlvO/snDm61Dd/6VWBie5Yf7ADymWUIvwgAAACAAAAAAAEQBP7///8iHQJ6SH/Bn7dph3uHQtbqGBGPPE5yseqMbeYCp61KQdvgaCED7KT/Ebco4uD2DOYiKUOm/1W52V9ie/mpnQhLyHLVClsiHgJ6SH/Bn7dph3uHQtbqGBGPPE5yseqMbeYCp61KQdvgaECKE7OYVUX3K9bolxSuuQmz41SoQqm7i1bNDt7SHfihmVmLMSKKSeC9fpXOEFP3xbKKy1Q6aHB2AOPOiYIu4yAhAQBSAgAAAAH0whLVrtHn9v9jPyzgnGR8V77dkwMU2Y3ndQPVjpQLMwAAAAAA/////wGghgEAAAAAABZSFCKactNKZFvTSWu79Qu7gckGP0+UAAAAAAABAwgYcwEAAAAAAAEEIlEgMm31D+Cge3rLcgcL6ztjLrmtFbppXMHlqmqgB7YUb9gBCUICekh/wZ+3aYd7h0LW6hgRjzxOcrHqjG3mAqetSkHb4GgDYeGx6d5eQssgB/fKVLng1X7ROTj61W0/GeV1E6j84DkA", + "supplementary": { + "inputs": [ + { + "input_index": 0, + "prevout_txid": "c9730c1b925f3b8affba9a1f951f0c38808ec895cb170b67d166471b6b263096", + "prevout_index": 0, + "prevout_scriptpubkey": "5214229a72d34a645bd3496bbbf50bbb81c9063f4f94", + "amount": 100000, + "non_witness_utxo": "0200000001f4c212d5aed1e7f6ff633f2ce09c647c57bedd930314d98de77503d58e940b330000000000ffffffff01a086010000000000165214229a72d34a645bd3496bbbf50bbb81c9063f4f9400000000" + } + ] + } + }, { "description": "input eligibility: non-SIGHASH_ALL signature on input with sp output", "psbt": "cHNidP8B+wQCAAAAAQIEAgAAAAEEAQEBBQEBAQYBAAABDiAYpxdmOwurFLEqGncTI/8eQHndUy5d0T4o6hCBxwCYSgEPBAAAAAABAR+ghgEAAAAAABYAFCKactNKZFvTSWu79Qu7gckGP0+UIgICyBe7dSGvw16pbzv7Jw5utQ3f+lVgYnuWH+wA8pllCL9HMEQCIHLzeIUvuENyYHLyUHbw53Vg7UwuBHFm7mpibHW/2znWAiAhKq5fCVdONB9YhvX/8y9XFuq5AwpKU3nmAWtqTULcJAEBAwQCAAAAIgYCyBe7dSGvw16pbzv7Jw5utQ3f+lVgYnuWH+wA8pllCL8IAAAAgAAAAAABEAT+////Ih0Cekh/wZ+3aYd7h0LW6hgRjzxOcrHqjG3mAqetSkHb4GghA+yk/xG3KOLg9gzmIilDpv9VudlfYnv5qZ0IS8hy1QpbIh4Cekh/wZ+3aYd7h0LW6hgRjzxOcrHqjG3mAqetSkHb4GhAihOzmFVF9yvW6JcUrrkJs+NUqEKpu4tWzQ7e0h34oZlZizEiikngvX6VzhBT98WyistUOmhwdgDjzomCLuMgIQABAwgYcwEAAAAAAAEEIlEgMm31D+Cge3rLcgcL6ztjLrmtFbppXMHlqmqgB7YUb9gBCUICekh/wZ+3aYd7h0LW6hgRjzxOcrHqjG3mAqetSkHb4GgDYeGx6d5eQssgB/fKVLng1X7ROTj61W0/GeV1E6j84DkA", diff --git a/bip-0375/validator/validate_psbt.py b/bip-0375/validator/validate_psbt.py index b232ec97..f88d83d8 100644 --- a/bip-0375/validator/validate_psbt.py +++ b/bip-0375/validator/validate_psbt.py @@ -16,7 +16,6 @@ from deps.bitcoin_test.psbt import ( PSBT_IN_OUTPUT_INDEX, PSBT_IN_PREVIOUS_TXID, PSBT_IN_SIGHASH_TYPE, - PSBT_IN_WITNESS_UTXO, PSBT_OUT_SCRIPT, ) from deps.dleq import dleq_verify_proof @@ -24,9 +23,9 @@ from secp256k1lab.secp256k1 import GE from .bip352_crypto import compute_silent_payment_output_script from .inputs import ( + _script_pubkey_from_psbt_input, collect_input_ecdh_and_pubkey, is_input_eligible, - parse_witness_utxo, pubkey_from_eligible_input, ) from .psbt_bip375 import ( @@ -284,11 +283,9 @@ def validate_input_eligibility(psbt: PSBT) -> Tuple[bool, str]: # Check segwit version restrictions for i, input_map in enumerate(psbt.i): - if PSBT_IN_WITNESS_UTXO in input_map: - witness_utxo = input_map[PSBT_IN_WITNESS_UTXO] - script = parse_witness_utxo(witness_utxo) - if is_segwit_v2_or_later(script): - return False, f"Input {i} uses segwit version > 1 with silent payments" + script = _script_pubkey_from_psbt_input(input_map) + if script is not None and is_segwit_v2_or_later(script): + return False, f"Input {i} uses segwit version > 1 with silent payments" # Check SIGHASH_ALL requirement - PSBT_IN_SIGHASH_TYPE is optional, but if set it must be SIGHASH_ALL when SP outputs are present for i, input_map in enumerate(psbt.i):