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..29dd6f388f4654259033d813d182f2a9ed19971e 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"); |
Ryan Sleevi
2014/03/07 01:39:19
Use the same form as the other tests? See line 456
palmer
2014/03/14 21:33:39
Done.
|
+ |
+ // Retrieve the DomainState as it is by default, including its known good |
+ // pins. Assert sanity. |
Ryan Sleevi
2014/03/07 01:39:19
"Assert sanity" is superflous.
palmer
2014/03/14 21:33:39
Done.
|
+ 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. CheckPublicKeyPins (invoked below). |
+ // CheckPublicKeyPins should still pass when given the original |
+ // |saved_hashes|, indicating that CheckPublicKeyPins can still access and |
+ // check the static_pkp data. |
Ryan Sleevi
2014/03/07 01:39:19
Rework this comment:
// Add a dynamic HSTS header
palmer
2014/03/14 21:33:39
Done.
|
+ 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; |
Ryan Sleevi
2014/03/07 01:39:19
// Add a HPKP header, which should only update the
palmer
2014/03/14 21:33:39
Done.
|
+ |
+ // 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()); |
Ryan Sleevi
2014/03/07 01:39:19
// HSTS should still be configured for this domain
palmer
2014/03/14 21:33:39
Done.
|
+ EXPECT_TRUE(state.GetDomainState(domain, true, &domain_state)); |
+ EXPECT_TRUE(domain_state.CheckPublicKeyPins(saved_hashes)); |
Ryan Sleevi
2014/03/07 01:39:19
What are you testing here? Add a comment.
1) Shou
palmer
2014/03/14 21:33:39
It's to check that a good pin is still valid. Adde
|
} |
}; // namespace net |