// Copyright (c) 2020 The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include #include #include #include #include #include void test_one_input(const std::vector& buffer) { FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()}; ChaCha20 chacha20; if (fuzzed_data_provider.ConsumeBool()) { const std::vector key = ConsumeFixedLengthByteVector(fuzzed_data_provider, fuzzed_data_provider.ConsumeIntegralInRange(16, 32)); chacha20 = ChaCha20{key.data(), key.size()}; } while (fuzzed_data_provider.ConsumeBool()) { switch (fuzzed_data_provider.ConsumeIntegralInRange(0, 4)) { case 0: { const std::vector key = ConsumeFixedLengthByteVector(fuzzed_data_provider, fuzzed_data_provider.ConsumeIntegralInRange(16, 32)); chacha20.SetKey(key.data(), key.size()); break; } case 1: { chacha20.SetIV(fuzzed_data_provider.ConsumeIntegral()); break; } case 2: { chacha20.Seek(fuzzed_data_provider.ConsumeIntegral()); break; } case 3: { std::vector output(fuzzed_data_provider.ConsumeIntegralInRange(0, 4096)); chacha20.Keystream(output.data(), output.size()); break; } case 4: { std::vector output(fuzzed_data_provider.ConsumeIntegralInRange(0, 4096)); const std::vector input = ConsumeFixedLengthByteVector(fuzzed_data_provider, output.size()); chacha20.Crypt(input.data(), output.data(), input.size()); break; } } } }