| Index: net/http/http_security_headers_unittest.cc
|
| diff --git a/net/http/http_security_headers_unittest.cc b/net/http/http_security_headers_unittest.cc
|
| index 42a5ee9896062504e21575f23519983d5caa9652..ec17568123730047481299ce2df9c4b31402f3d9 100644
|
| --- a/net/http/http_security_headers_unittest.cc
|
| +++ b/net/http/http_security_headers_unittest.cc
|
| @@ -455,8 +455,8 @@ TEST_F(HttpSecurityHeadersTest, UpdateDynamicPKPOnly) {
|
| // docs.google.com has preloaded pins.
|
| std::string domain = "docs.google.com";
|
| EXPECT_TRUE(state.GetDomainState(domain, true, &domain_state));
|
| - EXPECT_GT(domain_state.static_spki_hashes.size(), 1UL);
|
| - HashValueVector saved_hashes = domain_state.static_spki_hashes;
|
| + EXPECT_GT(domain_state.static_pkp.spki_hashes.size(), 1UL);
|
| + HashValueVector saved_hashes = domain_state.static_pkp.spki_hashes;
|
|
|
| // Add a header, which should only update the dynamic state.
|
| HashValue good_hash = GetTestHashValue(1, HASH_VALUE_SHA1);
|
| @@ -480,40 +480,80 @@ TEST_F(HttpSecurityHeadersTest, UpdateDynamicPKPOnly) {
|
| &static_domain_state));
|
| for (size_t i = 0; i < saved_hashes.size(); ++i) {
|
| EXPECT_TRUE(HashValuesEqual(
|
| - saved_hashes[i])(static_domain_state.static_spki_hashes[i]));
|
| + saved_hashes[i])(static_domain_state.static_pkp.spki_hashes[i]));
|
| }
|
|
|
| // Expect the dynamic state to reflect the header.
|
| TransportSecurityState::DomainState dynamic_domain_state;
|
| EXPECT_TRUE(state.GetDynamicDomainState(domain, &dynamic_domain_state));
|
| - EXPECT_EQ(2UL, dynamic_domain_state.dynamic_spki_hashes.size());
|
| + EXPECT_EQ(2UL, dynamic_domain_state.dynamic_pkp.spki_hashes.size());
|
|
|
| HashValueVector::const_iterator hash = std::find_if(
|
| - dynamic_domain_state.dynamic_spki_hashes.begin(),
|
| - dynamic_domain_state.dynamic_spki_hashes.end(),
|
| + dynamic_domain_state.dynamic_pkp.spki_hashes.begin(),
|
| + dynamic_domain_state.dynamic_pkp.spki_hashes.end(),
|
| HashValuesEqual(good_hash));
|
| - EXPECT_NE(dynamic_domain_state.dynamic_spki_hashes.end(), hash);
|
| + EXPECT_NE(dynamic_domain_state.dynamic_pkp.spki_hashes.end(), hash);
|
|
|
| hash = std::find_if(
|
| - dynamic_domain_state.dynamic_spki_hashes.begin(),
|
| - dynamic_domain_state.dynamic_spki_hashes.end(),
|
| + dynamic_domain_state.dynamic_pkp.spki_hashes.begin(),
|
| + dynamic_domain_state.dynamic_pkp.spki_hashes.end(),
|
| HashValuesEqual(backup_hash));
|
| - EXPECT_NE(dynamic_domain_state.dynamic_spki_hashes.end(), hash);
|
| + EXPECT_NE(dynamic_domain_state.dynamic_pkp.spki_hashes.end(), hash);
|
|
|
| // Expect the overall state to reflect the header, too.
|
| EXPECT_TRUE(state.GetDomainState(domain, true, &domain_state));
|
| - EXPECT_EQ(2UL, domain_state.dynamic_spki_hashes.size());
|
| + EXPECT_EQ(2UL, domain_state.dynamic_pkp.spki_hashes.size());
|
|
|
| - hash = std::find_if(domain_state.dynamic_spki_hashes.begin(),
|
| - domain_state.dynamic_spki_hashes.end(),
|
| + hash = std::find_if(domain_state.dynamic_pkp.spki_hashes.begin(),
|
| + domain_state.dynamic_pkp.spki_hashes.end(),
|
| HashValuesEqual(good_hash));
|
| - EXPECT_NE(domain_state.dynamic_spki_hashes.end(), hash);
|
| + EXPECT_NE(domain_state.dynamic_pkp.spki_hashes.end(), hash);
|
|
|
| hash = std::find_if(
|
| - domain_state.dynamic_spki_hashes.begin(),
|
| - domain_state.dynamic_spki_hashes.end(),
|
| + domain_state.dynamic_pkp.spki_hashes.begin(),
|
| + domain_state.dynamic_pkp.spki_hashes.end(),
|
| HashValuesEqual(backup_hash));
|
| - EXPECT_NE(domain_state.dynamic_spki_hashes.end(), hash);
|
| + EXPECT_NE(domain_state.dynamic_pkp.spki_hashes.end(), hash);
|
| +}
|
| +
|
| +TEST_F(HttpSecurityHeadersTest, NoClobberPins) {
|
| + TransportSecurityState state;
|
| + TransportSecurityState::DomainState domain_state;
|
| +
|
| + std::string domain("accounts.google.com");
|
| +
|
| + // Retrieve the DomainState as it is by default, including its known good
|
| + // pins. Assert sanity.
|
| + EXPECT_TRUE(state.GetDomainState(domain, true, &domain_state));
|
| + HashValueVector saved_hashes = domain_state.static_pkp.spki_hashes;
|
| + EXPECT_TRUE(domain_state.ShouldUpgradeToSSL());
|
| + EXPECT_TRUE(domain_state.HasPublicKeyPins());
|
| +
|
| + // Add a dynamic header. Due to bug crbug.com/29386, this will mask the
|
| + // static pins. However, we temporarily work around that in
|
| + // CheckPublicKeyPins (invoked below). CheckPublicKeyPins should still
|
| + // pass when given the original |saved_hashes|.
|
| + EXPECT_TRUE(state.AddHSTSHeader(domain, "includesubdomains; max-age=10000"));
|
| + EXPECT_TRUE(domain_state.ShouldUpgradeToSSL());
|
| + EXPECT_TRUE(state.GetDomainState(domain, true, &domain_state));
|
| + EXPECT_TRUE(domain_state.CheckPublicKeyPins(saved_hashes));
|
| +
|
| + // Add a header, which should only update the dynamic state.
|
| + HashValue good_hash = GetTestHashValue(1, HASH_VALUE_SHA1);
|
| + std::string good_pin = GetTestPin(1, HASH_VALUE_SHA1);
|
| + std::string backup_pin = GetTestPin(2, HASH_VALUE_SHA1);
|
| + std::string header = "max-age = 10000; " + good_pin + "; " + backup_pin;
|
| +
|
| + // Construct a fake SSLInfo that will pass AddHPKPHeader's checks.
|
| + SSLInfo ssl_info;
|
| + ssl_info.public_key_hashes.push_back(good_hash);
|
| + ssl_info.public_key_hashes.push_back(saved_hashes[0]);
|
| + EXPECT_TRUE(state.AddHPKPHeader(domain, header, ssl_info));
|
| +
|
| + EXPECT_TRUE(state.AddHPKPHeader(domain, header, ssl_info));
|
| + EXPECT_TRUE(domain_state.ShouldUpgradeToSSL());
|
| + EXPECT_TRUE(state.GetDomainState(domain, true, &domain_state));
|
| + EXPECT_TRUE(domain_state.CheckPublicKeyPins(saved_hashes));
|
| }
|
|
|
| }; // namespace net
|
|
|