| // Copyright 2019 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <cstddef> |
| #include <cstdint> |
| #include <cstdio> |
| |
| #include <brillo/data_encoding.h> |
| |
| #include <base/logging.h> |
| #include <fuzzer/FuzzedDataProvider.h> |
| |
| namespace { |
| constexpr int kMaxStringLength = 256; |
| constexpr int kMaxParamsSize = 8; |
| |
| void FuzzUrlEncodeDecode(FuzzedDataProvider* provider) { |
| brillo::data_encoding::UrlEncode( |
| provider->ConsumeRandomLengthString(kMaxStringLength).c_str(), |
| provider->ConsumeBool()); |
| |
| brillo::data_encoding::UrlDecode( |
| provider->ConsumeRandomLengthString(kMaxStringLength).c_str()); |
| } |
| |
| void FuzzWebParamsEncodeDecode(FuzzedDataProvider* provider) { |
| brillo::data_encoding::WebParamList param_list; |
| const auto num_params = provider->ConsumeIntegralInRange(0, kMaxParamsSize); |
| for (auto i = 0; i < num_params; i++) { |
| param_list.push_back(std::pair<std::string, std::string>( |
| provider->ConsumeRandomLengthString(kMaxStringLength), |
| provider->ConsumeRandomLengthString(kMaxStringLength))); |
| } |
| brillo::data_encoding::WebParamsEncode(param_list, provider->ConsumeBool()); |
| |
| brillo::data_encoding::WebParamsDecode( |
| provider->ConsumeRandomLengthString(kMaxStringLength)); |
| } |
| |
| void FuzzBase64EncodeDecode(FuzzedDataProvider* provider) { |
| brillo::data_encoding::Base64Encode( |
| provider->ConsumeRandomLengthString(kMaxStringLength)); |
| brillo::Blob output; |
| brillo::data_encoding::Base64Decode( |
| provider->ConsumeRandomLengthString(kMaxStringLength), &output); |
| } |
| |
| bool IgnoreLogging(int, const char*, int, size_t, const std::string&) { |
| return true; |
| } |
| |
| } // namespace |
| |
| class Environment { |
| public: |
| Environment() { |
| // Disable logging. Normally this would be done with logging::SetMinLogLevel |
| // but that doesn't work for brillo::Error because it's not using the |
| // LOG(ERROR) macro which is where the actual log level check occurs. |
| logging::SetLogMessageHandler(&IgnoreLogging); |
| } |
| }; |
| |
| extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { |
| static Environment env; |
| FuzzedDataProvider data_provider(data, size); |
| FuzzUrlEncodeDecode(&data_provider); |
| FuzzWebParamsEncodeDecode(&data_provider); |
| FuzzBase64EncodeDecode(&data_provider); |
| return 0; |
| } |