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