Branch data Line data Source code
1 : : // Copyright (c) 2019-2022 The Bitcoin Core developers 2 : : // Distributed under the MIT software license, see the accompanying 3 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 : : 5 : : #include <test/fuzz/FuzzedDataProvider.h> 6 : : #include <test/fuzz/fuzz.h> 7 : : 8 : : #include <node/psbt.h> 9 : : #include <psbt.h> 10 : : #include <pubkey.h> 11 : : #include <script/script.h> 12 : : #include <streams.h> 13 : : #include <util/check.h> 14 : : #include <version.h> 15 : : 16 : : #include <cstdint> 17 [ + - ]: 173 : #include <optional> 18 [ + - ]: 173 : #include <string> 19 : : #include <vector> 20 : : 21 : : using node::AnalyzePSBT; 22 : : using node::PSBTAnalysis; 23 : : using node::PSBTInputAnalysis; 24 : : 25 [ + - - + ]: 2696 : FUZZ_TARGET(psbt) 26 : : { 27 : 2523 : FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()}; 28 : 2350 : PartiallySignedTransaction psbt_mut; 29 : 2350 : std::string error; 30 [ + - ]: 2350 : auto str = fuzzed_data_provider.ConsumeRandomLengthString(); 31 [ + - + + ]: 2350 : if (!DecodeRawPSBT(psbt_mut, MakeByteSpan(str), error)) { 32 : 590 : return; 33 : : } 34 [ + - ]: 1760 : const PartiallySignedTransaction psbt = psbt_mut; 35 : : 36 [ + - + - ]: 1760 : const PSBTAnalysis analysis = AnalyzePSBT(psbt); 37 [ + - ]: 1760 : (void)PSBTRoleName(analysis.next); 38 [ + + ]: 4226 : for (const PSBTInputAnalysis& input_analysis : analysis.inputs) { 39 [ + - ]: 2466 : (void)PSBTRoleName(input_analysis.next); 40 : : } 41 : : 42 [ + - ]: 1760 : (void)psbt.IsNull(); 43 : : 44 [ + - ]: 1760 : std::optional<CMutableTransaction> tx = psbt.tx; 45 [ + - ]: 1760 : if (tx) { 46 [ + - ]: 1760 : const CMutableTransaction& mtx = *tx; 47 [ + - ]: 1760 : const PartiallySignedTransaction psbt_from_tx{mtx}; 48 : 1760 : } 49 : : 50 [ + + ]: 5230 : for (const PSBTInput& input : psbt.inputs) { 51 [ + - ]: 3470 : (void)PSBTInputSigned(input); 52 [ + - ]: 3470 : (void)input.IsNull(); 53 : : } 54 [ + - ]: 1760 : (void)CountPSBTUnsignedInputs(psbt); 55 : : 56 [ + + ]: 7447 : for (const PSBTOutput& output : psbt.outputs) { 57 [ + - ]: 5687 : (void)output.IsNull(); 58 : : } 59 : : 60 [ + - + + ]: 5230 : for (size_t i = 0; i < psbt.tx->vin.size(); ++i) { 61 [ + - ]: 3470 : CTxOut tx_out; 62 [ + - + + ]: 3470 : if (psbt.GetInputUTXO(tx_out, i)) { 63 [ + - ]: 1755 : (void)tx_out.IsNull(); 64 [ + - ]: 1755 : (void)tx_out.ToString(); 65 : 1755 : } 66 : 3470 : } 67 : : 68 [ + - ]: 1760 : psbt_mut = psbt; 69 [ + - ]: 1760 : (void)FinalizePSBT(psbt_mut); 70 : : 71 [ + - ]: 1760 : psbt_mut = psbt; 72 [ + - ]: 1760 : CMutableTransaction result; 73 [ + - + + ]: 1760 : if (FinalizeAndExtractPSBT(psbt_mut, result)) { 74 [ + - ]: 406 : const PartiallySignedTransaction psbt_from_tx{result}; 75 : 406 : } 76 : : 77 [ + - ]: 1760 : PartiallySignedTransaction psbt_merge; 78 [ + - ]: 1760 : str = fuzzed_data_provider.ConsumeRandomLengthString(); 79 [ + - + + ]: 1760 : if (!DecodeRawPSBT(psbt_merge, MakeByteSpan(str), error)) { 80 [ + - ]: 1485 : psbt_merge = psbt; 81 : 1485 : } 82 [ + - ]: 1760 : psbt_mut = psbt; 83 [ + - ]: 1760 : (void)psbt_mut.Merge(psbt_merge); 84 [ + - ]: 1760 : psbt_mut = psbt; 85 [ + - + - : 1760 : (void)CombinePSBTs(psbt_mut, {psbt_mut, psbt_merge}); + - + - ] 86 [ + - ]: 1760 : psbt_mut = psbt; 87 [ + - + + ]: 5326 : for (unsigned int i = 0; i < psbt_merge.tx->vin.size(); ++i) { 88 [ + - + - ]: 3566 : (void)psbt_mut.AddInput(psbt_merge.tx->vin[i], psbt_merge.inputs[i]); 89 : 3566 : } 90 [ + - + + ]: 7560 : for (unsigned int i = 0; i < psbt_merge.tx->vout.size(); ++i) { 91 [ + - + - : 5800 : Assert(psbt_mut.AddOutput(psbt_merge.tx->vout[i], psbt_merge.outputs[i])); + - ] 92 : 5800 : } 93 [ + - ]: 1760 : psbt_mut.unknown.insert(psbt_merge.unknown.begin(), psbt_merge.unknown.end()); 94 [ - + ]: 2350 : }