Fenced Frames: Add nonce to CookiePartitionKey
This is in preparation for consumers like fenced frames and anonymous
iframes that require a nonce based unique and transient cookie
partition.
Design doc:
https://docs.google.com/document/d/1APHYxQD5inFv0gpMCIF7ukkEWqAOwFSA3JZp3J8Do88/edit#heading=h.mhmmceq0bsxf
Bug: 1229638
Change-Id: I4b2e12dee27018675b1cf9fa5d97bfe1a6170b94
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3285244
Reviewed-by: Nasko Oskov <[email protected]>
Reviewed-by: Dylan Cutler <[email protected]>
Reviewed-by: Maksim Orlovich <[email protected]>
Commit-Queue: Shivani Sharma <[email protected]>
Cr-Commit-Position: refs/heads/main@{#943198}
diff --git a/net/cookies/cookie_partition_key_unittest.cc b/net/cookies/cookie_partition_key_unittest.cc
index b3215de..83b6d33 100644
--- a/net/cookies/cookie_partition_key_unittest.cc
+++ b/net/cookies/cookie_partition_key_unittest.cc
@@ -33,6 +33,7 @@
testing::Bool());
TEST_P(CookiePartitionKeyTest, Serialization) {
+ base::UnguessableToken nonce = base::UnguessableToken::Create();
struct {
absl::optional<CookiePartitionKey> input;
bool expected_ret;
@@ -55,6 +56,11 @@
// Opaque origin
{absl::make_optional(CookiePartitionKey::FromURLForTesting(GURL())),
false, ""},
+ // With nonce
+ {CookiePartitionKey::FromNetworkIsolationKey(NetworkIsolationKey(
+ SchemefulSite(GURL("https://toplevelsite.com")),
+ SchemefulSite(GURL("https://cookiesite.com")), &nonce)),
+ false, ""},
// Invalid partition key
{absl::make_optional(
CookiePartitionKey::FromURLForTesting(GURL("abc123foobar!!"))),
@@ -127,9 +133,43 @@
}
}
+TEST_P(CookiePartitionKeyTest, FromNetworkIsolationKeyWithNonce) {
+ SchemefulSite top_level_site =
+ SchemefulSite(GURL("https://toplevelsite.com"));
+ base::UnguessableToken nonce = base::UnguessableToken::Create();
+ absl::optional<CookiePartitionKey> got =
+ CookiePartitionKey::FromNetworkIsolationKey(NetworkIsolationKey(
+ top_level_site, SchemefulSite(GURL("https://cookiesite.com")),
+ &nonce));
+ bool partitioned_cookies_enabled = PartitionedCookiesEnabled();
+ EXPECT_EQ(partitioned_cookies_enabled, got.has_value());
+ if (!partitioned_cookies_enabled)
+ return;
+
+ EXPECT_TRUE(got.has_value());
+ EXPECT_FALSE(got->from_script());
+ EXPECT_TRUE(got->nonce().has_value());
+ EXPECT_EQ(nonce, got->nonce().value());
+}
+
TEST_P(CookiePartitionKeyTest, FromWire) {
auto want = CookiePartitionKey::FromURLForTesting(GURL("https://foo.com"));
- auto got = CookiePartitionKey::FromWire(want.site());
+ auto got = CookiePartitionKey::FromWire(want.site(), want.nonce());
+ EXPECT_EQ(want, got);
+ EXPECT_FALSE(got.from_script());
+}
+
+TEST_P(CookiePartitionKeyTest, FromWireWithNonce) {
+ SchemefulSite top_level_site =
+ SchemefulSite(GURL("https://toplevelsite.com"));
+ base::UnguessableToken nonce = base::UnguessableToken::Create();
+ auto want = CookiePartitionKey::FromNetworkIsolationKey(NetworkIsolationKey(
+ top_level_site, SchemefulSite(GURL("https://cookiesite.com")), &nonce));
+ bool partitioned_cookies_enabled = PartitionedCookiesEnabled();
+ EXPECT_EQ(partitioned_cookies_enabled, want.has_value());
+ if (!partitioned_cookies_enabled)
+ return;
+ auto got = CookiePartitionKey::FromWire(want->site(), want->nonce());
EXPECT_EQ(want, got);
EXPECT_FALSE(got.from_script());
}
@@ -148,6 +188,30 @@
.IsSerializeable());
}
+TEST_P(CookiePartitionKeyTest, EqualityWithNonce) {
+ SchemefulSite top_level_site =
+ SchemefulSite(GURL("https://toplevelsite.com"));
+ SchemefulSite frame_site = SchemefulSite(GURL("https://cookiesite.com"));
+ base::UnguessableToken nonce1 = base::UnguessableToken::Create();
+ base::UnguessableToken nonce2 = base::UnguessableToken::Create();
+ EXPECT_NE(nonce1, nonce2);
+ auto key1 = CookiePartitionKey::FromNetworkIsolationKey(
+ NetworkIsolationKey(top_level_site, frame_site, &nonce1));
+ bool partitioned_cookies_enabled = PartitionedCookiesEnabled();
+ EXPECT_EQ(partitioned_cookies_enabled, key1.has_value());
+ if (!partitioned_cookies_enabled)
+ return;
+
+ auto key2 = CookiePartitionKey::FromNetworkIsolationKey(
+ NetworkIsolationKey(top_level_site, frame_site, &nonce2));
+ EXPECT_TRUE(key1.has_value() && key2.has_value());
+ EXPECT_NE(key1, key2);
+
+ auto key3 = CookiePartitionKey::FromNetworkIsolationKey(
+ NetworkIsolationKey(top_level_site, frame_site, &nonce1));
+ EXPECT_EQ(key1, key3);
+}
+
} // namespace net
#endif // NET_COOKIES_COOKIE_PARTITION_KEY_UNITTEST_H_