Branch data Line data Source code
1 : : // Copyright (c) 2012-2021 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 <script/script.h>
6 : : #include <test/util/setup_common.h>
7 : :
8 : : #include <boost/test/unit_test.hpp>
9 : :
10 : 0 : BOOST_FIXTURE_TEST_SUITE(script_segwit_tests, BasicTestingSetup)
11 : :
12 : 0 : BOOST_AUTO_TEST_CASE(IsPayToWitnessScriptHash_Valid)
13 : : {
14 : 0 : uint256 dummy;
15 : 0 : CScript p2wsh;
16 : 0 : p2wsh << OP_0 << ToByteVector(dummy);
17 : 0 : BOOST_CHECK(p2wsh.IsPayToWitnessScriptHash());
18 : :
19 : 0 : std::vector<unsigned char> bytes = {OP_0, 32};
20 : 0 : bytes.insert(bytes.end(), 32, 0);
21 : 0 : BOOST_CHECK(CScript(bytes.begin(), bytes.end()).IsPayToWitnessScriptHash());
22 : 0 : }
23 : :
24 : 0 : BOOST_AUTO_TEST_CASE(IsPayToWitnessScriptHash_Invalid_NotOp0)
25 : : {
26 : 0 : uint256 dummy;
27 : 0 : CScript notp2wsh;
28 : 0 : notp2wsh << OP_1 << ToByteVector(dummy);
29 : 0 : BOOST_CHECK(!notp2wsh.IsPayToWitnessScriptHash());
30 : 0 : }
31 : :
32 : 0 : BOOST_AUTO_TEST_CASE(IsPayToWitnessScriptHash_Invalid_Size)
33 : : {
34 : 0 : uint160 dummy;
35 : 0 : CScript notp2wsh;
36 : 0 : notp2wsh << OP_0 << ToByteVector(dummy);
37 : 0 : BOOST_CHECK(!notp2wsh.IsPayToWitnessScriptHash());
38 : 0 : }
39 : :
40 : 0 : BOOST_AUTO_TEST_CASE(IsPayToWitnessScriptHash_Invalid_Nop)
41 : : {
42 : 0 : uint256 dummy;
43 : 0 : CScript notp2wsh;
44 : 0 : notp2wsh << OP_0 << OP_NOP << ToByteVector(dummy);
45 : 0 : BOOST_CHECK(!notp2wsh.IsPayToWitnessScriptHash());
46 : 0 : }
47 : :
48 : 0 : BOOST_AUTO_TEST_CASE(IsPayToWitnessScriptHash_Invalid_EmptyScript)
49 : : {
50 : 0 : CScript notp2wsh;
51 : 0 : BOOST_CHECK(!notp2wsh.IsPayToWitnessScriptHash());
52 : 0 : }
53 : :
54 : 0 : BOOST_AUTO_TEST_CASE(IsPayToWitnessScriptHash_Invalid_Pushdata)
55 : : {
56 : : // A script is not P2WSH if OP_PUSHDATA is used to push the hash.
57 : 0 : std::vector<unsigned char> bytes = {OP_0, OP_PUSHDATA1, 32};
58 : 0 : bytes.insert(bytes.end(), 32, 0);
59 : 0 : BOOST_CHECK(!CScript(bytes.begin(), bytes.end()).IsPayToWitnessScriptHash());
60 : :
61 : 0 : bytes = {OP_0, OP_PUSHDATA2, 32, 0};
62 : 0 : bytes.insert(bytes.end(), 32, 0);
63 : 0 : BOOST_CHECK(!CScript(bytes.begin(), bytes.end()).IsPayToWitnessScriptHash());
64 : :
65 : 0 : bytes = {OP_0, OP_PUSHDATA4, 32, 0, 0, 0};
66 : 0 : bytes.insert(bytes.end(), 32, 0);
67 : 0 : BOOST_CHECK(!CScript(bytes.begin(), bytes.end()).IsPayToWitnessScriptHash());
68 : 0 : }
69 : :
70 : : namespace {
71 : :
72 : 0 : bool IsExpectedWitnessProgram(const CScript& script, const int expectedVersion, const std::vector<unsigned char>& expectedProgram)
73 : : {
74 : 0 : int actualVersion;
75 : 0 : std::vector<unsigned char> actualProgram;
76 : 0 : if (!script.IsWitnessProgram(actualVersion, actualProgram)) {
77 : 0 : return false;
78 : : }
79 : 0 : BOOST_CHECK_EQUAL(actualVersion, expectedVersion);
80 : 0 : BOOST_CHECK(actualProgram == expectedProgram);
81 : 0 : return true;
82 : 0 : }
83 : :
84 : 0 : bool IsNoWitnessProgram(const CScript& script)
85 : : {
86 : : int dummyVersion;
87 : 0 : std::vector<unsigned char> dummyProgram;
88 : 0 : return !script.IsWitnessProgram(dummyVersion, dummyProgram);
89 : 0 : }
90 : :
91 : : } // anonymous namespace
92 : :
93 : 0 : BOOST_AUTO_TEST_CASE(IsWitnessProgram_Valid)
94 : : {
95 : : // Witness programs have a minimum data push of 2 bytes.
96 : 0 : std::vector<unsigned char> program = {42, 18};
97 : 0 : CScript wit;
98 : 0 : wit << OP_0 << program;
99 : 0 : BOOST_CHECK(IsExpectedWitnessProgram(wit, 0, program));
100 : :
101 : 0 : wit.clear();
102 : : // Witness programs have a maximum data push of 40 bytes.
103 : 0 : program.resize(40);
104 : 0 : wit << OP_16 << program;
105 : 0 : BOOST_CHECK(IsExpectedWitnessProgram(wit, 16, program));
106 : :
107 : 0 : program.resize(32);
108 : 0 : std::vector<unsigned char> bytes = {OP_5, static_cast<unsigned char>(program.size())};
109 : 0 : bytes.insert(bytes.end(), program.begin(), program.end());
110 : 0 : BOOST_CHECK(IsExpectedWitnessProgram(CScript(bytes.begin(), bytes.end()), 5, program));
111 : 0 : }
112 : :
113 : 0 : BOOST_AUTO_TEST_CASE(IsWitnessProgram_Invalid_Version)
114 : : {
115 : 0 : std::vector<unsigned char> program(10);
116 : 0 : CScript nowit;
117 : 0 : nowit << OP_1NEGATE << program;
118 : 0 : BOOST_CHECK(IsNoWitnessProgram(nowit));
119 : 0 : }
120 : :
121 : 0 : BOOST_AUTO_TEST_CASE(IsWitnessProgram_Invalid_Size)
122 : : {
123 : 0 : std::vector<unsigned char> program(1);
124 : 0 : CScript nowit;
125 : 0 : nowit << OP_0 << program;
126 : 0 : BOOST_CHECK(IsNoWitnessProgram(nowit));
127 : :
128 : 0 : nowit.clear();
129 : 0 : program.resize(41);
130 : 0 : nowit << OP_0 << program;
131 : 0 : BOOST_CHECK(IsNoWitnessProgram(nowit));
132 : 0 : }
133 : :
134 : 0 : BOOST_AUTO_TEST_CASE(IsWitnessProgram_Invalid_Nop)
135 : : {
136 : 0 : std::vector<unsigned char> program(10);
137 : 0 : CScript nowit;
138 : 0 : nowit << OP_0 << OP_NOP << program;
139 : 0 : BOOST_CHECK(IsNoWitnessProgram(nowit));
140 : 0 : }
141 : :
142 : 0 : BOOST_AUTO_TEST_CASE(IsWitnessProgram_Invalid_EmptyScript)
143 : : {
144 : 0 : CScript nowit;
145 : 0 : BOOST_CHECK(IsNoWitnessProgram(nowit));
146 : 0 : }
147 : :
148 : 0 : BOOST_AUTO_TEST_CASE(IsWitnessProgram_Invalid_Pushdata)
149 : : {
150 : : // A script is no witness program if OP_PUSHDATA is used to push the hash.
151 : 0 : std::vector<unsigned char> bytes = {OP_0, OP_PUSHDATA1, 32};
152 : 0 : bytes.insert(bytes.end(), 32, 0);
153 : 0 : BOOST_CHECK(IsNoWitnessProgram(CScript(bytes.begin(), bytes.end())));
154 : :
155 : 0 : bytes = {OP_0, OP_PUSHDATA2, 32, 0};
156 : 0 : bytes.insert(bytes.end(), 32, 0);
157 : 0 : BOOST_CHECK(IsNoWitnessProgram(CScript(bytes.begin(), bytes.end())));
158 : :
159 : 0 : bytes = {OP_0, OP_PUSHDATA4, 32, 0, 0, 0};
160 : 0 : bytes.insert(bytes.end(), 32, 0);
161 : 0 : BOOST_CHECK(IsNoWitnessProgram(CScript(bytes.begin(), bytes.end())));
162 : 0 : }
163 : :
164 : 0 : BOOST_AUTO_TEST_SUITE_END()
|