| // 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"base/base64url.h" |
| |
| #include<fuzzer/FuzzedDataProvider.h> |
| #include<stdint.h> |
| |
| #include<string> |
| #include<tuple> |
| |
| #include"base/check.h" |
| #include"base/check_op.h" |
| |
| namespace base{ |
| |
| extern"C"intLLVMFuzzerTestOneInput(constuint8_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)){ |
| case0: |
| decode_policy=Base64UrlDecodePolicy::REQUIRE_PADDING; |
| break; |
| case1: |
| decode_policy=Base64UrlDecodePolicy::IGNORE_PADDING; |
| break; |
| case2: |
| decode_policy=Base64UrlDecodePolicy::DISALLOW_PADDING; |
| break; |
| } |
| std::ignore=Base64UrlDecode(decoding_input, decode_policy,&decoded); |
| |
| return0; |
| } |
| |
| }// namespace base |