| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <fuzzer/FuzzedDataProvider.h> |
| #include <stdint.h> |
| |
| #include <string> |
| #include <tuple> |
| |
| #include "base/base64url.h" |
| #include "base/check.h" |
| #include "base/check_op.h" |
| |
| namespace base { |
| |
| extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { |
| FuzzedDataProvider provider(data, size); |
| |
| // Test encoding of a random plaintext. |
| std::string plaintext = provider.ConsumeRandomLengthString(); |
| Base64UrlEncodePolicy encode_policy = |
| provider.ConsumeBool() ? Base64UrlEncodePolicy::INCLUDE_PADDING |
| : Base64UrlEncodePolicy::OMIT_PADDING; |
| std::string encoded; |
| Base64UrlEncode(plaintext, encode_policy, &encoded); |
| |
| // Check decoding of the above gives the original text. |
| std::string decoded; |
| CHECK(Base64UrlDecode(encoded, |
| encode_policy == Base64UrlEncodePolicy::INCLUDE_PADDING |
| ? Base64UrlDecodePolicy::REQUIRE_PADDING |
| : Base64UrlDecodePolicy::DISALLOW_PADDING, |
| &decoded)); |
| CHECK_EQ(decoded, plaintext); |
| // Same result should be when ignoring padding. |
| decoded.clear(); |
| CHECK(Base64UrlDecode(encoded, Base64UrlDecodePolicy::IGNORE_PADDING, |
| &decoded)); |
| CHECK_EQ(decoded, plaintext); |
| |
| // Additionally test decoding of a random input. |
| std::string decoding_input = provider.ConsumeRandomLengthString(); |
| Base64UrlDecodePolicy decode_policy; |
| switch (provider.ConsumeIntegralInRange<int>(0, 2)) { |
| case 0: |
| decode_policy = Base64UrlDecodePolicy::REQUIRE_PADDING; |
| break; |
| case 1: |
| decode_policy = Base64UrlDecodePolicy::IGNORE_PADDING; |
| break; |
| case 2: |
| decode_policy = Base64UrlDecodePolicy::DISALLOW_PADDING; |
| break; |
| } |
| std::ignore = Base64UrlDecode(decoding_input, decode_policy, &decoded); |
| |
| return 0; |
| } |
| |
| } // namespace base |