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