xref: /aosp_15_r20/external/cronet/net/cookies/canonical_cookie_fuzzer.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2019 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
6*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <fuzzer/FuzzedDataProvider.h>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include <limits>
11*6777b538SAndroid Build Coastguard Worker #include <memory>
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include "net/cookies/canonical_cookie.h"
14*6777b538SAndroid Build Coastguard Worker #include "net/cookies/cookie_constants.h"
15*6777b538SAndroid Build Coastguard Worker #include "net/cookies/cookie_util.h"
16*6777b538SAndroid Build Coastguard Worker #include "net/cookies/parsed_cookie.h"
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker namespace net {
getRandomTime(FuzzedDataProvider * data_provider)19*6777b538SAndroid Build Coastguard Worker const base::Time getRandomTime(FuzzedDataProvider* data_provider) {
20*6777b538SAndroid Build Coastguard Worker   const uint64_t max = std::numeric_limits<uint64_t>::max();
21*6777b538SAndroid Build Coastguard Worker   return base::Time::FromTimeT(
22*6777b538SAndroid Build Coastguard Worker       data_provider->ConsumeIntegralInRange<uint64_t>(0, max));
23*6777b538SAndroid Build Coastguard Worker }
24*6777b538SAndroid Build Coastguard Worker 
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)25*6777b538SAndroid Build Coastguard Worker extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
26*6777b538SAndroid Build Coastguard Worker   FuzzedDataProvider data_provider(data, size);
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker   const std::string name = data_provider.ConsumeRandomLengthString(
29*6777b538SAndroid Build Coastguard Worker       net::ParsedCookie::kMaxCookieNamePlusValueSize + 10);
30*6777b538SAndroid Build Coastguard Worker   const std::string value = data_provider.ConsumeRandomLengthString(
31*6777b538SAndroid Build Coastguard Worker       net::ParsedCookie::kMaxCookieNamePlusValueSize + 10);
32*6777b538SAndroid Build Coastguard Worker   const std::string domain = data_provider.ConsumeRandomLengthString(
33*6777b538SAndroid Build Coastguard Worker       net::ParsedCookie::kMaxCookieAttributeValueSize + 10);
34*6777b538SAndroid Build Coastguard Worker   const std::string path = data_provider.ConsumeRandomLengthString(
35*6777b538SAndroid Build Coastguard Worker       net::ParsedCookie::kMaxCookieAttributeValueSize + 10);
36*6777b538SAndroid Build Coastguard Worker 
37*6777b538SAndroid Build Coastguard Worker   const GURL url(data_provider.ConsumeRandomLengthString(800));
38*6777b538SAndroid Build Coastguard Worker   if (!url.is_valid())
39*6777b538SAndroid Build Coastguard Worker     return 0;
40*6777b538SAndroid Build Coastguard Worker 
41*6777b538SAndroid Build Coastguard Worker   const base::Time creation = getRandomTime(&data_provider);
42*6777b538SAndroid Build Coastguard Worker   const base::Time expiration = getRandomTime(&data_provider);
43*6777b538SAndroid Build Coastguard Worker   const base::Time last_access = getRandomTime(&data_provider);
44*6777b538SAndroid Build Coastguard Worker 
45*6777b538SAndroid Build Coastguard Worker   const CookieSameSite same_site =
46*6777b538SAndroid Build Coastguard Worker       data_provider.PickValueInArray<CookieSameSite>({
47*6777b538SAndroid Build Coastguard Worker           CookieSameSite::UNSPECIFIED,
48*6777b538SAndroid Build Coastguard Worker           CookieSameSite::NO_RESTRICTION,
49*6777b538SAndroid Build Coastguard Worker           CookieSameSite::LAX_MODE,
50*6777b538SAndroid Build Coastguard Worker           CookieSameSite::STRICT_MODE,
51*6777b538SAndroid Build Coastguard Worker       });
52*6777b538SAndroid Build Coastguard Worker 
53*6777b538SAndroid Build Coastguard Worker   const CookiePriority priority =
54*6777b538SAndroid Build Coastguard Worker       data_provider.PickValueInArray<CookiePriority>({
55*6777b538SAndroid Build Coastguard Worker           CookiePriority::COOKIE_PRIORITY_LOW,
56*6777b538SAndroid Build Coastguard Worker           CookiePriority::COOKIE_PRIORITY_MEDIUM,
57*6777b538SAndroid Build Coastguard Worker           CookiePriority::COOKIE_PRIORITY_HIGH,
58*6777b538SAndroid Build Coastguard Worker       });
59*6777b538SAndroid Build Coastguard Worker 
60*6777b538SAndroid Build Coastguard Worker   const auto partition_key = std::make_optional<CookiePartitionKey>(
61*6777b538SAndroid Build Coastguard Worker       CookiePartitionKey::FromURLForTesting(
62*6777b538SAndroid Build Coastguard Worker           GURL(data_provider.ConsumeRandomLengthString(800))));
63*6777b538SAndroid Build Coastguard Worker 
64*6777b538SAndroid Build Coastguard Worker   const std::unique_ptr<const CanonicalCookie> sanitized_cookie =
65*6777b538SAndroid Build Coastguard Worker       CanonicalCookie::CreateSanitizedCookie(
66*6777b538SAndroid Build Coastguard Worker           url, name, value, domain, path, creation, expiration, last_access,
67*6777b538SAndroid Build Coastguard Worker           data_provider.ConsumeBool() /* secure */,
68*6777b538SAndroid Build Coastguard Worker           data_provider.ConsumeBool() /* httponly */, same_site, priority,
69*6777b538SAndroid Build Coastguard Worker           partition_key, /*status=*/nullptr);
70*6777b538SAndroid Build Coastguard Worker 
71*6777b538SAndroid Build Coastguard Worker   if (sanitized_cookie) {
72*6777b538SAndroid Build Coastguard Worker     CHECK(sanitized_cookie->IsCanonical());
73*6777b538SAndroid Build Coastguard Worker 
74*6777b538SAndroid Build Coastguard Worker     // Check identity property of various comparison functions
75*6777b538SAndroid Build Coastguard Worker     const CanonicalCookie copied_cookie = *sanitized_cookie;
76*6777b538SAndroid Build Coastguard Worker     CHECK(sanitized_cookie->IsEquivalent(copied_cookie));
77*6777b538SAndroid Build Coastguard Worker     CHECK(sanitized_cookie->IsEquivalentForSecureCookieMatching(copied_cookie));
78*6777b538SAndroid Build Coastguard Worker     CHECK(!sanitized_cookie->PartialCompare(copied_cookie));
79*6777b538SAndroid Build Coastguard Worker   }
80*6777b538SAndroid Build Coastguard Worker 
81*6777b538SAndroid Build Coastguard Worker   return 0;
82*6777b538SAndroid Build Coastguard Worker }
83*6777b538SAndroid Build Coastguard Worker }  // namespace net
84