1 // Copyright (c) 2020 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 <crypto/hmac_sha256.h>
6 #include <crypto/hmac_sha512.h>
7 #include <crypto/ripemd160.h>
8 #include <crypto/sha1.h>
9 #include <crypto/sha256.h>
10 #include <crypto/sha3.h>
11 #include <crypto/sha512.h>
12 #include <hash.h>
13 #include <test/fuzz/FuzzedDataProvider.h>
14 #include <test/fuzz/fuzz.h>
15 #include <test/fuzz/util.h>
16 
17 #include <cstdint>
18 #include <vector>
19 
test_one_input(const std::vector<uint8_t> & buffer)20 void test_one_input(const std::vector<uint8_t>& buffer)
21 {
22     FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
23     std::vector<uint8_t> data = ConsumeRandomLengthByteVector(fuzzed_data_provider);
24     if (data.empty()) {
25         data.resize(fuzzed_data_provider.ConsumeIntegralInRange<size_t>(1, 4096), fuzzed_data_provider.ConsumeIntegral<uint8_t>());
26     }
27 
28     CHash160 hash160;
29     CHash256 hash256;
30     CHMAC_SHA256 hmac_sha256{data.data(), data.size()};
31     CHMAC_SHA512 hmac_sha512{data.data(), data.size()};
32     CRIPEMD160 ripemd160;
33     CSHA1 sha1;
34     CSHA256 sha256;
35     CSHA512 sha512;
36     SHA3_256 sha3;
37     CSipHasher sip_hasher{fuzzed_data_provider.ConsumeIntegral<uint64_t>(), fuzzed_data_provider.ConsumeIntegral<uint64_t>()};
38 
39     while (fuzzed_data_provider.ConsumeBool()) {
40         switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 2)) {
41         case 0: {
42             if (fuzzed_data_provider.ConsumeBool()) {
43                 data = ConsumeRandomLengthByteVector(fuzzed_data_provider);
44                 if (data.empty()) {
45                     data.resize(fuzzed_data_provider.ConsumeIntegralInRange<size_t>(1, 4096), fuzzed_data_provider.ConsumeIntegral<uint8_t>());
46                 }
47             }
48 
49             (void)hash160.Write(data);
50             (void)hash256.Write(data);
51             (void)hmac_sha256.Write(data.data(), data.size());
52             (void)hmac_sha512.Write(data.data(), data.size());
53             (void)ripemd160.Write(data.data(), data.size());
54             (void)sha1.Write(data.data(), data.size());
55             (void)sha256.Write(data.data(), data.size());
56             (void)sha3.Write(data);
57             (void)sha512.Write(data.data(), data.size());
58             (void)sip_hasher.Write(data.data(), data.size());
59 
60             (void)Hash(data);
61             (void)Hash160(data);
62             (void)sha512.Size();
63             break;
64         }
65         case 1: {
66             (void)hash160.Reset();
67             (void)hash256.Reset();
68             (void)ripemd160.Reset();
69             (void)sha1.Reset();
70             (void)sha256.Reset();
71             (void)sha3.Reset();
72             (void)sha512.Reset();
73             break;
74         }
75         case 2: {
76             switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 9)) {
77             case 0: {
78                 data.resize(CHash160::OUTPUT_SIZE);
79                 hash160.Finalize(data);
80                 break;
81             }
82             case 1: {
83                 data.resize(CHash256::OUTPUT_SIZE);
84                 hash256.Finalize(data);
85                 break;
86             }
87             case 2: {
88                 data.resize(CHMAC_SHA256::OUTPUT_SIZE);
89                 hmac_sha256.Finalize(data.data());
90                 break;
91             }
92             case 3: {
93                 data.resize(CHMAC_SHA512::OUTPUT_SIZE);
94                 hmac_sha512.Finalize(data.data());
95                 break;
96             }
97             case 4: {
98                 data.resize(CRIPEMD160::OUTPUT_SIZE);
99                 ripemd160.Finalize(data.data());
100                 break;
101             }
102             case 5: {
103                 data.resize(CSHA1::OUTPUT_SIZE);
104                 sha1.Finalize(data.data());
105                 break;
106             }
107             case 6: {
108                 data.resize(CSHA256::OUTPUT_SIZE);
109                 sha256.Finalize(data.data());
110                 break;
111             }
112             case 7: {
113                 data.resize(CSHA512::OUTPUT_SIZE);
114                 sha512.Finalize(data.data());
115                 break;
116             }
117             case 8: {
118                 data.resize(1);
119                 data[0] = sip_hasher.Finalize() % 256;
120                 break;
121             }
122             case 9: {
123                 data.resize(SHA3_256::OUTPUT_SIZE);
124                 sha3.Finalize(data);
125                 break;
126             }
127             }
128             break;
129         }
130         }
131     }
132     if (fuzzed_data_provider.ConsumeBool()) {
133         uint64_t state[25];
134         for (size_t i = 0; i < 25; ++i) {
135             state[i] = fuzzed_data_provider.ConsumeIntegral<uint64_t>();
136         }
137         KeccakF(state);
138     }
139 }
140