canonical_cookie_fuzzer.cc 3.1 KB

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