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/chacha20.h>
6 #include <test/fuzz/FuzzedDataProvider.h>
7 #include <test/fuzz/fuzz.h>
8 #include <test/fuzz/util.h>
9 
10 #include <cstdint>
11 #include <vector>
12 
test_one_input(const std::vector<uint8_t> & buffer)13 void test_one_input(const std::vector<uint8_t>& buffer)
14 {
15     FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
16 
17     ChaCha20 chacha20;
18     if (fuzzed_data_provider.ConsumeBool()) {
19         const std::vector<unsigned char> key = ConsumeFixedLengthByteVector(fuzzed_data_provider, fuzzed_data_provider.ConsumeIntegralInRange<size_t>(16, 32));
20         chacha20 = ChaCha20{key.data(), key.size()};
21     }
22     while (fuzzed_data_provider.ConsumeBool()) {
23         switch (fuzzed_data_provider.ConsumeIntegralInRange(0, 4)) {
24         case 0: {
25             const std::vector<unsigned char> key = ConsumeFixedLengthByteVector(fuzzed_data_provider, fuzzed_data_provider.ConsumeIntegralInRange<size_t>(16, 32));
26             chacha20.SetKey(key.data(), key.size());
27             break;
28         }
29         case 1: {
30             chacha20.SetIV(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
31             break;
32         }
33         case 2: {
34             chacha20.Seek(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
35             break;
36         }
37         case 3: {
38             std::vector<uint8_t> output(fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096));
39             chacha20.Keystream(output.data(), output.size());
40             break;
41         }
42         case 4: {
43             std::vector<uint8_t> output(fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096));
44             const std::vector<uint8_t> input = ConsumeFixedLengthByteVector(fuzzed_data_provider, output.size());
45             chacha20.Crypt(input.data(), output.data(), input.size());
46             break;
47         }
48         }
49     }
50 }
51