PIVX Core  5.6.99
P2P Digital Currency
deserialize.cpp
Go to the documentation of this file.
1 // Copyright (c) 2009-2015 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or https://www.opensource.org/licenses/mit-license.php.
4 
5 #include "addrdb.h"
6 #include "addrman.h"
7 #include "primitives/block.h"
8 #include "chain.h"
9 #include "coins.h"
10 #include "compressor.h"
11 #include "consensus/merkle.h"
12 #include "policy/feerate.h"
13 #include "key.h"
14 #include "script/keyorigin.h"
15 #include "merkleblock.h"
16 #include "net.h"
17 #include "protocol.h"
18 #include "streams.h"
19 #include "undo.h"
20 #include "version.h"
21 #include "pubkey.h"
22 
23 #include <exception>
24 #include <stdexcept>
25 #include <stdint.h>
26 #include <unistd.h>
27 
28 #include <algorithm>
29 #include <vector>
30 
31 #include "test/fuzz/fuzz.h"
32 
33 namespace {
34 
35 struct invalid_fuzzing_input_exception : public std::exception {
36 };
37 
38 template <typename T>
39 CDataStream Serialize(const T& obj)
40 {
41  CDataStream ds(SER_NETWORK, INIT_PROTO_VERSION);
42  ds << obj;
43  return ds;
44 }
45 
46 template <typename T>
47 T Deserialize(CDataStream ds)
48 {
49  T obj;
50  ds >> obj;
51  return obj;
52 }
53 
54 template <typename T>
55 void DeserializeFromFuzzingInput(const std::vector<uint8_t>& buffer, T& obj)
56 {
57  CDataStream ds(buffer, SER_NETWORK, INIT_PROTO_VERSION);
58  try {
59  int version;
60  ds >> version;
61  ds.SetVersion(version);
62  } catch (const std::ios_base::failure&) {
63  throw invalid_fuzzing_input_exception();
64  }
65  try {
66  ds >> obj;
67  } catch (const std::ios_base::failure&) {
68  throw invalid_fuzzing_input_exception();
69  }
70  assert(buffer.empty() || !Serialize(obj).empty());
71 }
72 
73 template <typename T>
74 void AssertEqualAfterSerializeDeserialize(const T& obj)
75 {
76  assert(Deserialize<T>(Serialize(obj)) == obj);
77 }
78 
79 } // namespace
80 
81 void test_one_input(std::vector<uint8_t> buffer)
82 {
83  try {
84 #if ADDR_INFO_DESERIALIZE
85  CAddrInfo addr_info;
86  DeserializeFromFuzzingInput(buffer, addr_info);
87 #elif BLOCK_FILE_INFO_DESERIALIZE
88  CBlockFileInfo block_file_info;
89  DeserializeFromFuzzingInput(buffer, block_file_info);
90 #elif FEE_RATE_DESERIALIZE
91  CFeeRate fee_rate;
92  DeserializeFromFuzzingInput(buffer, fee_rate);
93  AssertEqualAfterSerializeDeserialize(fee_rate);
94 #elif MERKLE_BLOCK_DESERIALIZE
95  CMerkleBlock merkle_block;
96  DeserializeFromFuzzingInput(buffer, merkle_block);
97 #elif OUT_POINT_DESERIALIZE
98  COutPoint out_point;
99  DeserializeFromFuzzingInput(buffer, out_point);
100  AssertEqualAfterSerializeDeserialize(out_point);
101 #elif PUB_KEY_DESERIALIZE
102  CPubKey pub_key;
103  DeserializeFromFuzzingInput(buffer, pub_key);
104  // TODO: The following equivalence should hold for CPubKey? Fix.
105  // AssertEqualAfterSerializeDeserialize(pub_key);
106 #elif SCRIPT_DESERIALIZE
107  CScript script;
108  DeserializeFromFuzzingInput(buffer, script);
109 #elif SUB_NET_DESERIALIZE
110  CSubNet sub_net;
111  DeserializeFromFuzzingInput(buffer, sub_net);
112  AssertEqualAfterSerializeDeserialize(sub_net);
113 #elif TX_IN_DESERIALIZE
114  CTxIn tx_in;
115  DeserializeFromFuzzingInput(buffer, tx_in);
116  AssertEqualAfterSerializeDeserialize(tx_in);
117 #elif KEY_ORIGIN_INFO_DESERIALIZE
118  KeyOriginInfo key_origin_info;
119  DeserializeFromFuzzingInput(buffer, key_origin_info);
120  AssertEqualAfterSerializeDeserialize(key_origin_info);
121 #elif BLOCK_DESERIALIZE
122  CBlock block;
123  DeserializeFromFuzzingInput(buffer, block);
124 #elif BLOCKLOCATOR_DESERIALIZE
125  CBlockLocator bl;
126  DeserializeFromFuzzingInput(buffer, bl);
127 #elif BLOCKMERKLEROOT
128  CBlock block;
129  DeserializeFromFuzzingInput(buffer, block);
130  bool mutated;
131  BlockMerkleRoot(block, &mutated);
132 #elif ADDRMAN_DESERIALIZE
133  CAddrMan am;
134  DeserializeFromFuzzingInput(buffer, am);
135 #elif BLOCKHEADER_DESERIALIZE
136  CBlockHeader bh;
137  DeserializeFromFuzzingInput(buffer, bh);
138 #elif BANENTRY_DESERIALIZE
139  CBanEntry be;
140  DeserializeFromFuzzingInput(buffer, be);
141 #elif TXUNDO_DESERIALIZE
142  CTxUndo tu;
143  DeserializeFromFuzzingInput(buffer, tu);
144 #elif BLOCKUNDO_DESERIALIZE
145  CBlockUndo bu;
146  DeserializeFromFuzzingInput(buffer, bu);
147 #elif COINS_DESERIALIZE
148  Coin coin;
149  DeserializeFromFuzzingInput(buffer, coin);
150 #elif NETADDR_DESERIALIZE
151  CNetAddr na;
152  DeserializeFromFuzzingInput(buffer, na);
153  AssertEqualAfterSerializeDeserialize(na);
154 #elif SERVICE_DESERIALIZE
155  CService s;
156  DeserializeFromFuzzingInput(buffer, s);
157  AssertEqualAfterSerializeDeserialize(s);
158 #elif MESSAGEHEADER_DESERIALIZE
159  const CMessageHeader::MessageStartChars pchMessageStart = {0x00, 0x00, 0x00, 0x00};
160  CMessageHeader mh(pchMessageStart);
161  DeserializeFromFuzzingInput(buffer, mh);
162  (void)mh.IsValid(pchMessageStart);
163 #elif ADDRESS_DESERIALIZE
164  CAddress a;
165  DeserializeFromFuzzingInput(buffer, a);
166 #elif INV_DESERIALIZE
167  CInv i;
168  DeserializeFromFuzzingInput(buffer, i);
169 #elif BLOOMFILTER_DESERIALIZE
170  CBloomFilter bf;
171  DeserializeFromFuzzingInput(buffer, bf);
172 #elif DISKBLOCKINDEX_DESERIALIZE
173  CDiskBlockIndex dbi;
174  DeserializeFromFuzzingInput(buffer, dbi);
175 #elif TXOUTCOMPRESSOR_DESERIALIZE
176  CTxOut to;
177  auto toc = Using<TxOutCompression>(to);
178  DeserializeFromFuzzingInput(buffer, toc);
179 #else
180 #error Need at least one fuzz target to compile
181 #endif
182  } catch (const invalid_fuzzing_input_exception&) {
183  }
184 }
Extended statistics about a CAddress.
Definition: addrman.h:37
Stochastical (IP) address manager.
Definition: addrman.h:178
A CService with information about it as peer.
Definition: protocol.h:338
Definition: addrdb.h:29
Nodes collect new transactions into a block, hash them into a hash tree, and scan through nonce value...
Definition: block.h:23
Definition: block.h:80
Undo information for a CBlock.
Definition: undo.h:66
BloomFilter is a probabilistic filter which SPV clients provide so that we can filter the transaction...
Definition: bloom.h:45
Fee rate in PIV per kilobyte: CAmount / kB.
Definition: feerate.h:20
inv message data
Definition: protocol.h:466
Used to relay blocks as header + vector<merkle branch> to filtered nodes.
Definition: merkleblock.h:118
Message header.
Definition: protocol.h:31
unsigned char MessageStartChars[MESSAGE_START_SIZE]
Definition: protocol.h:40
bool IsValid(const MessageStartChars &messageStart) const
Definition: protocol.cpp:165
Network address.
Definition: netaddress.h:120
An outpoint - a combination of a transaction hash and an index n into its vout.
Definition: transaction.h:72
An encapsulated public key.
Definition: pubkey.h:44
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:381
A combination of a network address (CNetAddr) and a (TCP) port.
Definition: netaddress.h:484
An input of a transaction.
Definition: transaction.h:94
An output of a transaction.
Definition: transaction.h:137
Undo information for a CTransaction.
Definition: undo.h:56
A UTXO entry.
Definition: coins.h:32
void test_one_input(std::vector< uint8_t > buffer)
Definition: deserialize.cpp:81
std::vector< uint8_t > buffer
Definition: fuzz.cpp:71
#define T(expected, seed, data)
uint256 BlockMerkleRoot(const CBlock &block, bool *mutated)
Definition: merkle.cpp:154
@ SER_NETWORK
Definition: serialize.h:174
void Serialize(Stream &s, char a)
Definition: serialize.h:237
Describes a place in the block chain to another node such that if the other node doesn't have the sam...
Definition: block.h:154