| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/base/transport_security_state.h" | 5 #include "net/base/transport_security_state.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/base64.h" | 10 #include "base/base64.h" |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 virtual void SetUp() { | 36 virtual void SetUp() { |
| 37 #if defined(USE_OPENSSL) | 37 #if defined(USE_OPENSSL) |
| 38 crypto::EnsureOpenSSLInit(); | 38 crypto::EnsureOpenSSLInit(); |
| 39 #else | 39 #else |
| 40 crypto::EnsureNSSInit(); | 40 crypto::EnsureNSSInit(); |
| 41 #endif | 41 #endif |
| 42 } | 42 } |
| 43 }; | 43 }; |
| 44 | 44 |
| 45 TEST_F(TransportSecurityStateTest, BogusHeaders) { | 45 TEST_F(TransportSecurityStateTest, BogusHeaders) { |
| 46 int max_age = 42; | 46 TransportSecurityState::DomainState state; |
| 47 bool include_subdomains = false; | 47 base::Time now = base::Time::Now(); |
| 48 | 48 |
| 49 EXPECT_FALSE(TransportSecurityState::ParseHeader( | 49 EXPECT_FALSE(state.ParseSTSHeader(now, "")); |
| 50 "", &max_age, &include_subdomains)); | 50 EXPECT_FALSE(state.ParseSTSHeader(now, " ")); |
| 51 EXPECT_FALSE(TransportSecurityState::ParseHeader( | 51 EXPECT_FALSE(state.ParseSTSHeader(now, "abc")); |
| 52 " ", &max_age, &include_subdomains)); | 52 EXPECT_FALSE(state.ParseSTSHeader(now, " abc")); |
| 53 EXPECT_FALSE(TransportSecurityState::ParseHeader( | 53 EXPECT_FALSE(state.ParseSTSHeader(now, " abc ")); |
| 54 "abc", &max_age, &include_subdomains)); | 54 EXPECT_FALSE(state.ParseSTSHeader(now, "max-age")); |
| 55 EXPECT_FALSE(TransportSecurityState::ParseHeader( | 55 EXPECT_FALSE(state.ParseSTSHeader(now, " max-age")); |
| 56 " abc", &max_age, &include_subdomains)); | 56 EXPECT_FALSE(state.ParseSTSHeader(now, " max-age ")); |
| 57 EXPECT_FALSE(TransportSecurityState::ParseHeader( | 57 EXPECT_FALSE(state.ParseSTSHeader(now, "max-age=")); |
| 58 " abc ", &max_age, &include_subdomains)); | 58 EXPECT_FALSE(state.ParseSTSHeader(now, " max-age=")); |
| 59 EXPECT_FALSE(TransportSecurityState::ParseHeader( | 59 EXPECT_FALSE(state.ParseSTSHeader(now, " max-age =")); |
| 60 "max-age", &max_age, &include_subdomains)); | 60 EXPECT_FALSE(state.ParseSTSHeader(now, " max-age= ")); |
| 61 EXPECT_FALSE(TransportSecurityState::ParseHeader( | 61 EXPECT_FALSE(state.ParseSTSHeader(now, " max-age = ")); |
| 62 " max-age", &max_age, &include_subdomains)); | 62 EXPECT_FALSE(state.ParseSTSHeader(now, " max-age = xy")); |
| 63 EXPECT_FALSE(TransportSecurityState::ParseHeader( | 63 EXPECT_FALSE(state.ParseSTSHeader(now, " max-age = 3488a923")); |
| 64 " max-age ", &max_age, &include_subdomains)); | 64 EXPECT_FALSE(state.ParseSTSHeader(now, "max-age=3488a923 ")); |
| 65 EXPECT_FALSE(TransportSecurityState::ParseHeader( | 65 EXPECT_FALSE(state.ParseSTSHeader(now, "max-ag=3488923")); |
| 66 "max-age=", &max_age, &include_subdomains)); | 66 EXPECT_FALSE(state.ParseSTSHeader(now, "max-aged=3488923")); |
| 67 EXPECT_FALSE(TransportSecurityState::ParseHeader( | 67 EXPECT_FALSE(state.ParseSTSHeader(now, "max-age==3488923")); |
| 68 " max-age=", &max_age, &include_subdomains)); | 68 EXPECT_FALSE(state.ParseSTSHeader(now, "amax-age=3488923")); |
| 69 EXPECT_FALSE(TransportSecurityState::ParseHeader( | 69 EXPECT_FALSE(state.ParseSTSHeader(now, "max-age=-3488923")); |
| 70 " max-age =", &max_age, &include_subdomains)); | 70 EXPECT_FALSE(state.ParseSTSHeader(now, "max-age=3488923;")); |
| 71 EXPECT_FALSE(TransportSecurityState::ParseHeader( | 71 EXPECT_FALSE(state.ParseSTSHeader(now, "max-age=3488923 e")); |
| 72 " max-age= ", &max_age, &include_subdomains)); | 72 EXPECT_FALSE(state.ParseSTSHeader( |
| 73 EXPECT_FALSE(TransportSecurityState::ParseHeader( | 73 now, "max-age=3488923 includesubdomain")); |
| 74 " max-age = ", &max_age, &include_subdomains)); | 74 EXPECT_FALSE(state.ParseSTSHeader(now, "max-age=3488923includesubdomains")); |
| 75 EXPECT_FALSE(TransportSecurityState::ParseHeader( | 75 EXPECT_FALSE(state.ParseSTSHeader(now, "max-age=3488923=includesubdomains")); |
| 76 " max-age = xy", &max_age, &include_subdomains)); | 76 EXPECT_FALSE(state.ParseSTSHeader(now, "max-age=3488923 includesubdomainx")); |
| 77 EXPECT_FALSE(TransportSecurityState::ParseHeader( | 77 EXPECT_FALSE(state.ParseSTSHeader(now, "max-age=3488923 includesubdomain=")); |
| 78 " max-age = 3488a923", &max_age, &include_subdomains)); | 78 EXPECT_FALSE(state.ParseSTSHeader( |
| 79 EXPECT_FALSE(TransportSecurityState::ParseHeader( | 79 now, "max-age=3488923 includesubdomain=true")); |
| 80 "max-age=3488a923 ", &max_age, &include_subdomains)); | 80 EXPECT_FALSE(state.ParseSTSHeader(now, "max-age=3488923 includesubdomainsx")); |
| 81 EXPECT_FALSE(TransportSecurityState::ParseHeader( | 81 EXPECT_FALSE(state.ParseSTSHeader( |
| 82 "max-ag=3488923", &max_age, &include_subdomains)); | 82 now, "max-age=3488923 includesubdomains x")); |
| 83 EXPECT_FALSE(TransportSecurityState::ParseHeader( | 83 EXPECT_FALSE(state.ParseSTSHeader(now, "max-age=34889.23 includesubdomains")); |
| 84 "max-aged=3488923", &max_age, &include_subdomains)); | 84 EXPECT_FALSE(state.ParseSTSHeader(now, "max-age=34889 includesubdomains")); |
| 85 EXPECT_FALSE(TransportSecurityState::ParseHeader( | |
| 86 "max-age==3488923", &max_age, &include_subdomains)); | |
| 87 EXPECT_FALSE(TransportSecurityState::ParseHeader( | |
| 88 "amax-age=3488923", &max_age, &include_subdomains)); | |
| 89 EXPECT_FALSE(TransportSecurityState::ParseHeader( | |
| 90 "max-age=-3488923", &max_age, &include_subdomains)); | |
| 91 EXPECT_FALSE(TransportSecurityState::ParseHeader( | |
| 92 "max-age=3488923;", &max_age, &include_subdomains)); | |
| 93 EXPECT_FALSE(TransportSecurityState::ParseHeader( | |
| 94 "max-age=3488923 e", &max_age, &include_subdomains)); | |
| 95 EXPECT_FALSE(TransportSecurityState::ParseHeader( | |
| 96 "max-age=3488923 includesubdomain", &max_age, &include_subdomains)); | |
| 97 EXPECT_FALSE(TransportSecurityState::ParseHeader( | |
| 98 "max-age=3488923includesubdomains", &max_age, &include_subdomains)); | |
| 99 EXPECT_FALSE(TransportSecurityState::ParseHeader( | |
| 100 "max-age=3488923=includesubdomains", &max_age, &include_subdomains)); | |
| 101 EXPECT_FALSE(TransportSecurityState::ParseHeader( | |
| 102 "max-age=3488923 includesubdomainx", &max_age, &include_subdomains)); | |
| 103 EXPECT_FALSE(TransportSecurityState::ParseHeader( | |
| 104 "max-age=3488923 includesubdomain=", &max_age, &include_subdomains)); | |
| 105 EXPECT_FALSE(TransportSecurityState::ParseHeader( | |
| 106 "max-age=3488923 includesubdomain=true", &max_age, &include_subdomains)); | |
| 107 EXPECT_FALSE(TransportSecurityState::ParseHeader( | |
| 108 "max-age=3488923 includesubdomainsx", &max_age, &include_subdomains)); | |
| 109 EXPECT_FALSE(TransportSecurityState::ParseHeader( | |
| 110 "max-age=3488923 includesubdomains x", &max_age, &include_subdomains)); | |
| 111 EXPECT_FALSE(TransportSecurityState::ParseHeader( | |
| 112 "max-age=34889.23 includesubdomains", &max_age, &include_subdomains)); | |
| 113 EXPECT_FALSE(TransportSecurityState::ParseHeader( | |
| 114 "max-age=34889 includesubdomains", &max_age, &include_subdomains)); | |
| 115 | 85 |
| 116 EXPECT_EQ(max_age, 42); | 86 // Check that |state| was not updated by expecting the default |
| 117 EXPECT_FALSE(include_subdomains); | 87 // values for its predictable fields. |
| 88 EXPECT_EQ(state.upgrade_mode, |
| 89 TransportSecurityState::DomainState::MODE_FORCE_HTTPS); |
| 90 EXPECT_FALSE(state.include_subdomains); |
| 118 } | 91 } |
| 119 | 92 |
| 120 static std::string GetPinFromCert(X509Certificate* cert) { | 93 static std::string GetPinFromCert(X509Certificate* cert) { |
| 121 SHA1Fingerprint spki_hash; | 94 SHA1Fingerprint spki_hash; |
| 122 if (!TransportSecurityState::GetPublicKeyHash(*cert, &spki_hash)) | 95 EXPECT_TRUE(X509Certificate::GetPublicKeyHash(cert->os_cert_handle(), |
| 123 return ""; | 96 &spki_hash)); |
| 97 |
| 124 std::string base64; | 98 std::string base64; |
| 125 base::Base64Encode(base::StringPiece(reinterpret_cast<char*>(spki_hash.data), | 99 base::Base64Encode(base::StringPiece(reinterpret_cast<char*>(spki_hash.data), |
| 126 sizeof(spki_hash.data)), | 100 sizeof(spki_hash.data)), |
| 127 &base64); | 101 &base64); |
| 128 return "pin-sha1=" + HttpUtil::Quote(base64); | 102 return "pin-sha1=" + HttpUtil::Quote(base64); |
| 129 } | 103 } |
| 130 | 104 |
| 131 TEST_F(TransportSecurityStateTest, BogusPinsHeaders) { | 105 TEST_F(TransportSecurityStateTest, BogusPinsHeaders) { |
| 132 TransportSecurityState::DomainState state; | 106 TransportSecurityState::DomainState state; |
| 133 state.max_age = 42; | |
| 134 SSLInfo ssl_info; | 107 SSLInfo ssl_info; |
| 135 ssl_info.cert = | 108 ssl_info.cert = |
| 136 ImportCertFromFile(GetTestCertsDirectory(), "test_mail_google_com.pem"); | 109 ImportCertFromFile(GetTestCertsDirectory(), "test_mail_google_com.pem"); |
| 137 std::string good_pin = GetPinFromCert(ssl_info.cert); | 110 std::string good_pin = GetPinFromCert(ssl_info.cert); |
| 111 base::Time now = base::Time::Now(); |
| 138 | 112 |
| 139 // The backup pin is fake --- it just has to not be in the chain. | 113 // The backup pin is fake --- it just has to not be in the chain. |
| 140 std::string backup_pin = "pin-sha1=" + | 114 std::string backup_pin = "pin-sha1=" + |
| 141 HttpUtil::Quote("6dcfXufJLW3J6S/9rRe4vUlBj5g="); | 115 HttpUtil::Quote("6dcfXufJLW3J6S/9rRe4vUlBj5g="); |
| 142 | 116 |
| 143 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | 117 EXPECT_FALSE(state.ParsePinsHeader(now, "", ssl_info)); |
| 144 "", ssl_info, &state)); | 118 EXPECT_FALSE(state.ParsePinsHeader(now, " ", ssl_info)); |
| 145 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | 119 EXPECT_FALSE(state.ParsePinsHeader(now, "abc", ssl_info)); |
| 146 " ", ssl_info, &state)); | 120 EXPECT_FALSE(state.ParsePinsHeader(now, " abc", ssl_info)); |
| 147 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | 121 EXPECT_FALSE(state.ParsePinsHeader(now, " abc ", ssl_info)); |
| 148 "abc", ssl_info, &state)); | 122 EXPECT_FALSE(state.ParsePinsHeader(now, "max-age", ssl_info)); |
| 149 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | 123 EXPECT_FALSE(state.ParsePinsHeader(now, " max-age", ssl_info)); |
| 150 " abc", ssl_info, &state)); | 124 EXPECT_FALSE(state.ParsePinsHeader(now, " max-age ", ssl_info)); |
| 151 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | 125 EXPECT_FALSE(state.ParsePinsHeader(now, "max-age=", ssl_info)); |
| 152 " abc ", ssl_info, &state)); | 126 EXPECT_FALSE(state.ParsePinsHeader(now, " max-age=", ssl_info)); |
| 153 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | 127 EXPECT_FALSE(state.ParsePinsHeader(now, " max-age =", ssl_info)); |
| 154 "max-age", ssl_info, &state)); | 128 EXPECT_FALSE(state.ParsePinsHeader(now, " max-age= ", ssl_info)); |
| 155 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | 129 EXPECT_FALSE(state.ParsePinsHeader(now, " max-age = ", ssl_info)); |
| 156 " max-age", ssl_info, &state)); | 130 EXPECT_FALSE(state.ParsePinsHeader(now, " max-age = xy", ssl_info)); |
| 157 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | 131 EXPECT_FALSE(state.ParsePinsHeader( |
| 158 " max-age ", ssl_info, &state)); | 132 now, |
| 159 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | 133 " max-age = 3488a923", |
| 160 "max-age=", ssl_info, &state)); | 134 ssl_info)); |
| 161 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | 135 EXPECT_FALSE(state.ParsePinsHeader(now, "max-age=3488a923 ", ssl_info)); |
| 162 " max-age=", ssl_info, &state)); | 136 EXPECT_FALSE(state.ParsePinsHeader(now, |
| 163 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | |
| 164 " max-age =", ssl_info, &state)); | |
| 165 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | |
| 166 " max-age= ", ssl_info, &state)); | |
| 167 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | |
| 168 " max-age = ", ssl_info, &state)); | |
| 169 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | |
| 170 " max-age = xy", ssl_info, &state)); | |
| 171 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | |
| 172 " max-age = 3488a923", ssl_info, &state)); | |
| 173 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | |
| 174 "max-age=3488a923 ", ssl_info, &state)); | |
| 175 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | |
| 176 "max-ag=3488923pins=" + good_pin + "," + backup_pin, | 137 "max-ag=3488923pins=" + good_pin + "," + backup_pin, |
| 177 ssl_info, &state)); | 138 ssl_info)); |
| 178 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | 139 EXPECT_FALSE(state.ParsePinsHeader(now, "max-aged=3488923" + backup_pin, |
| 179 "max-aged=3488923" + backup_pin, | 140 ssl_info)); |
| 180 ssl_info, &state)); | 141 EXPECT_FALSE(state.ParsePinsHeader(now, "max-aged=3488923; " + backup_pin, |
| 181 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | 142 ssl_info)); |
| 182 "max-aged=3488923; " + backup_pin, | 143 EXPECT_FALSE(state.ParsePinsHeader(now, |
| 183 ssl_info, &state)); | |
| 184 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | |
| 185 "max-aged=3488923; " + backup_pin + ";" + backup_pin, | 144 "max-aged=3488923; " + backup_pin + ";" + backup_pin, |
| 186 ssl_info, &state)); | 145 ssl_info)); |
| 187 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | 146 EXPECT_FALSE(state.ParsePinsHeader(now, |
| 188 "max-aged=3488923; " + good_pin + ";" + good_pin, | 147 "max-aged=3488923; " + good_pin + ";" + good_pin, |
| 189 ssl_info, &state)); | 148 ssl_info)); |
| 190 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | 149 EXPECT_FALSE(state.ParsePinsHeader(now, "max-aged=3488923; " + good_pin, |
| 191 "max-aged=3488923; " + good_pin, | 150 ssl_info)); |
| 192 ssl_info, &state)); | 151 EXPECT_FALSE(state.ParsePinsHeader(now, "max-age==3488923", ssl_info)); |
| 193 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | 152 EXPECT_FALSE(state.ParsePinsHeader(now, "amax-age=3488923", ssl_info)); |
| 194 "max-age==3488923", ssl_info, &state)); | 153 EXPECT_FALSE(state.ParsePinsHeader(now, "max-age=-3488923", ssl_info)); |
| 195 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | 154 EXPECT_FALSE(state.ParsePinsHeader(now, "max-age=3488923;", ssl_info)); |
| 196 "amax-age=3488923", ssl_info, &state)); | 155 EXPECT_FALSE(state.ParsePinsHeader(now, "max-age=3488923 e", ssl_info)); |
| 197 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | 156 EXPECT_FALSE(state.ParsePinsHeader( |
| 198 "max-age=-3488923", ssl_info, &state)); | 157 now, |
| 199 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | 158 "max-age=3488923 includesubdomain", |
| 200 "max-age=3488923;", ssl_info, &state)); | 159 ssl_info)); |
| 201 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | 160 EXPECT_FALSE(state.ParsePinsHeader(now, "max-age=34889.23", ssl_info)); |
| 202 "max-age=3488923 e", ssl_info, &state)); | |
| 203 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | |
| 204 "max-age=3488923 includesubdomain", ssl_info, &state)); | |
| 205 EXPECT_FALSE(TransportSecurityState::ParsePinsHeader( | |
| 206 "max-age=34889.23", ssl_info, &state)); | |
| 207 | 161 |
| 208 EXPECT_EQ(state.max_age, 42); | 162 // Check that |state| was not updated by expecting the default |
| 163 // values for its predictable fields. |
| 164 EXPECT_EQ(state.upgrade_mode, |
| 165 TransportSecurityState::DomainState::MODE_FORCE_HTTPS); |
| 166 EXPECT_FALSE(state.include_subdomains); |
| 209 } | 167 } |
| 210 | 168 |
| 211 TEST_F(TransportSecurityStateTest, ValidHeaders) { | 169 TEST_F(TransportSecurityStateTest, ValidSTSHeaders) { |
| 212 int max_age = 42; | 170 TransportSecurityState::DomainState state; |
| 213 bool include_subdomains = true; | 171 base::Time expiry; |
| 172 base::Time now = base::Time::Now(); |
| 214 | 173 |
| 215 EXPECT_TRUE(TransportSecurityState::ParseHeader( | 174 EXPECT_TRUE(state.ParseSTSHeader(now, "max-age=243")); |
| 216 "max-age=243", &max_age, &include_subdomains)); | 175 expiry = now + base::TimeDelta::FromSeconds(243); |
| 217 EXPECT_EQ(max_age, 243); | 176 EXPECT_EQ(expiry, state.upgrade_expiry); |
| 218 EXPECT_FALSE(include_subdomains); | 177 EXPECT_FALSE(state.include_subdomains); |
| 219 | 178 |
| 220 EXPECT_TRUE(TransportSecurityState::ParseHeader( | 179 EXPECT_TRUE(state.ParseSTSHeader(now, " Max-agE = 567")); |
| 221 " Max-agE = 567", &max_age, &include_subdomains)); | 180 expiry = now + base::TimeDelta::FromSeconds(567); |
| 222 EXPECT_EQ(max_age, 567); | 181 EXPECT_EQ(expiry, state.upgrade_expiry); |
| 223 EXPECT_FALSE(include_subdomains); | 182 EXPECT_FALSE(state.include_subdomains); |
| 224 | 183 |
| 225 EXPECT_TRUE(TransportSecurityState::ParseHeader( | 184 EXPECT_TRUE(state.ParseSTSHeader(now, " mAx-aGe = 890 ")); |
| 226 " mAx-aGe = 890 ", &max_age, &include_subdomains)); | 185 expiry = now + base::TimeDelta::FromSeconds(890); |
| 227 EXPECT_EQ(max_age, 890); | 186 EXPECT_EQ(expiry, state.upgrade_expiry); |
| 228 EXPECT_FALSE(include_subdomains); | 187 EXPECT_FALSE(state.include_subdomains); |
| 229 | 188 |
| 230 EXPECT_TRUE(TransportSecurityState::ParseHeader( | 189 EXPECT_TRUE(state.ParseSTSHeader(now, "max-age=123;incLudesUbdOmains")); |
| 231 "max-age=123;incLudesUbdOmains", &max_age, &include_subdomains)); | 190 expiry = now + base::TimeDelta::FromSeconds(123); |
| 232 EXPECT_EQ(max_age, 123); | 191 EXPECT_EQ(expiry, state.upgrade_expiry); |
| 233 EXPECT_TRUE(include_subdomains); | 192 EXPECT_TRUE(state.include_subdomains); |
| 234 | 193 |
| 235 EXPECT_TRUE(TransportSecurityState::ParseHeader( | 194 EXPECT_TRUE(state.ParseSTSHeader(now, "max-age=394082; incLudesUbdOmains")); |
| 236 "max-age=394082; incLudesUbdOmains", &max_age, &include_subdomains)); | 195 expiry = now + base::TimeDelta::FromSeconds(394082); |
| 237 EXPECT_EQ(max_age, 394082); | 196 EXPECT_EQ(expiry, state.upgrade_expiry); |
| 238 EXPECT_TRUE(include_subdomains); | 197 EXPECT_TRUE(state.include_subdomains); |
| 239 | 198 |
| 240 EXPECT_TRUE(TransportSecurityState::ParseHeader( | 199 EXPECT_TRUE(state.ParseSTSHeader( |
| 241 "max-age=39408299 ;incLudesUbdOmains", &max_age, &include_subdomains)); | 200 now, "max-age=39408299 ;incLudesUbdOmains")); |
| 242 EXPECT_EQ(max_age, | 201 expiry = now + base::TimeDelta::FromSeconds( |
| 243 std::min(TransportSecurityState::kMaxHSTSAgeSecs, 39408299l)); | 202 std::min(TransportSecurityState::kMaxHSTSAgeSecs, 39408299l)); |
| 244 EXPECT_TRUE(include_subdomains); | 203 EXPECT_EQ(expiry, state.upgrade_expiry); |
| 204 EXPECT_TRUE(state.include_subdomains); |
| 245 | 205 |
| 246 EXPECT_TRUE(TransportSecurityState::ParseHeader( | 206 EXPECT_TRUE(state.ParseSTSHeader( |
| 247 "max-age=394082038 ; incLudesUbdOmains", &max_age, | 207 now, "max-age=394082038 ; incLudesUbdOmains")); |
| 248 &include_subdomains)); | 208 expiry = now + base::TimeDelta::FromSeconds( |
| 249 EXPECT_EQ(max_age, | 209 std::min(TransportSecurityState::kMaxHSTSAgeSecs, 394082038l)); |
| 250 std::min(TransportSecurityState::kMaxHSTSAgeSecs, 394082038l)); | 210 EXPECT_EQ(expiry, state.upgrade_expiry); |
| 251 EXPECT_TRUE(include_subdomains); | 211 EXPECT_TRUE(state.include_subdomains); |
| 252 | 212 |
| 253 EXPECT_TRUE(TransportSecurityState::ParseHeader( | 213 EXPECT_TRUE(state.ParseSTSHeader( |
| 254 " max-age=0 ; incLudesUbdOmains ", &max_age, &include_subdomains)); | 214 now, " max-age=0 ; incLudesUbdOmains ")); |
| 255 EXPECT_EQ(max_age, 0); | 215 expiry = now + base::TimeDelta::FromSeconds(0); |
| 256 EXPECT_TRUE(include_subdomains); | 216 EXPECT_EQ(expiry, state.upgrade_expiry); |
| 217 EXPECT_TRUE(state.include_subdomains); |
| 257 | 218 |
| 258 EXPECT_TRUE(TransportSecurityState::ParseHeader( | 219 EXPECT_TRUE(state.ParseSTSHeader( |
| 220 now, |
| 259 " max-age=999999999999999999999999999999999999999999999 ;" | 221 " max-age=999999999999999999999999999999999999999999999 ;" |
| 260 " incLudesUbdOmains ", | 222 " incLudesUbdOmains ")); |
| 261 &max_age, &include_subdomains)); | 223 expiry = now + base::TimeDelta::FromSeconds( |
| 262 EXPECT_EQ(max_age, TransportSecurityState::kMaxHSTSAgeSecs); | 224 TransportSecurityState::kMaxHSTSAgeSecs); |
| 263 EXPECT_TRUE(include_subdomains); | 225 EXPECT_EQ(expiry, state.upgrade_expiry); |
| 226 EXPECT_TRUE(state.include_subdomains); |
| 264 } | 227 } |
| 265 | 228 |
| 266 TEST_F(TransportSecurityStateTest, ValidPinsHeaders) { | 229 TEST_F(TransportSecurityStateTest, ValidPinsHeaders) { |
| 267 TransportSecurityState::DomainState state; | 230 TransportSecurityState::DomainState state; |
| 268 state.max_age = 42; | 231 base::Time expiry; |
| 232 base::Time now = base::Time::Now(); |
| 269 | 233 |
| 270 // Set up a realistic SSLInfo with a realistic cert chain. | 234 // Set up a realistic SSLInfo with a realistic cert chain. |
| 271 FilePath certs_dir = GetTestCertsDirectory(); | 235 FilePath certs_dir = GetTestCertsDirectory(); |
| 272 scoped_refptr<X509Certificate> ee_cert = | 236 scoped_refptr<X509Certificate> ee_cert = |
| 273 ImportCertFromFile(certs_dir, "2048-rsa-ee-by-2048-rsa-intermediate.pem"); | 237 ImportCertFromFile(certs_dir, "2048-rsa-ee-by-2048-rsa-intermediate.pem"); |
| 274 ASSERT_NE(static_cast<X509Certificate*>(NULL), ee_cert); | 238 ASSERT_NE(static_cast<X509Certificate*>(NULL), ee_cert); |
| 275 scoped_refptr<X509Certificate> intermediate = | 239 scoped_refptr<X509Certificate> intermediate = |
| 276 ImportCertFromFile(certs_dir, "2048-rsa-intermediate.pem"); | 240 ImportCertFromFile(certs_dir, "2048-rsa-intermediate.pem"); |
| 277 ASSERT_NE(static_cast<X509Certificate*>(NULL), intermediate); | 241 ASSERT_NE(static_cast<X509Certificate*>(NULL), intermediate); |
| 278 X509Certificate::OSCertHandles intermediates; | 242 X509Certificate::OSCertHandles intermediates; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 302 // Normally, ssl_client_socket_nss would do this, but for a unit test we | 266 // Normally, ssl_client_socket_nss would do this, but for a unit test we |
| 303 // fake it. | 267 // fake it. |
| 304 ssl_info.public_key_hashes = result.public_key_hashes; | 268 ssl_info.public_key_hashes = result.public_key_hashes; |
| 305 std::string good_pin = GetPinFromCert(ssl_info.cert); | 269 std::string good_pin = GetPinFromCert(ssl_info.cert); |
| 306 | 270 |
| 307 // The backup pin is fake --- we just need an SPKI hash that does not match | 271 // The backup pin is fake --- we just need an SPKI hash that does not match |
| 308 // the hash of any SPKI in the certificate chain. | 272 // the hash of any SPKI in the certificate chain. |
| 309 std::string backup_pin = "pin-sha1=" + | 273 std::string backup_pin = "pin-sha1=" + |
| 310 HttpUtil::Quote("6dcfXufJLW3J6S/9rRe4vUlBj5g="); | 274 HttpUtil::Quote("6dcfXufJLW3J6S/9rRe4vUlBj5g="); |
| 311 | 275 |
| 312 EXPECT_TRUE(TransportSecurityState::ParsePinsHeader( | 276 EXPECT_TRUE(state.ParsePinsHeader( |
| 277 now, |
| 313 "max-age=243; " + good_pin + ";" + backup_pin, | 278 "max-age=243; " + good_pin + ";" + backup_pin, |
| 314 ssl_info, &state)); | 279 ssl_info)); |
| 315 EXPECT_EQ(state.max_age, 243); | 280 expiry = now + base::TimeDelta::FromSeconds(243); |
| 281 EXPECT_EQ(expiry, state.dynamic_spki_hashes_expiry); |
| 316 | 282 |
| 317 EXPECT_TRUE(TransportSecurityState::ParsePinsHeader( | 283 EXPECT_TRUE(state.ParsePinsHeader( |
| 284 now, |
| 318 " " + good_pin + "; " + backup_pin + " ; Max-agE = 567", | 285 " " + good_pin + "; " + backup_pin + " ; Max-agE = 567", |
| 319 ssl_info, &state)); | 286 ssl_info)); |
| 320 EXPECT_EQ(state.max_age, 567); | 287 expiry = now + base::TimeDelta::FromSeconds(567); |
| 288 EXPECT_EQ(expiry, state.dynamic_spki_hashes_expiry); |
| 321 | 289 |
| 322 EXPECT_TRUE(TransportSecurityState::ParsePinsHeader( | 290 EXPECT_TRUE(state.ParsePinsHeader( |
| 291 now, |
| 323 good_pin + ";" + backup_pin + " ; mAx-aGe = 890 ", | 292 good_pin + ";" + backup_pin + " ; mAx-aGe = 890 ", |
| 324 ssl_info, &state)); | 293 ssl_info)); |
| 325 EXPECT_EQ(state.max_age, 890); | 294 expiry = now + base::TimeDelta::FromSeconds(890); |
| 295 EXPECT_EQ(expiry, state.dynamic_spki_hashes_expiry); |
| 326 | 296 |
| 327 EXPECT_TRUE(TransportSecurityState::ParsePinsHeader( | 297 EXPECT_TRUE(state.ParsePinsHeader( |
| 298 now, |
| 328 good_pin + ";" + backup_pin + "; max-age=123;IGNORED;", | 299 good_pin + ";" + backup_pin + "; max-age=123;IGNORED;", |
| 329 ssl_info, &state)); | 300 ssl_info)); |
| 330 EXPECT_EQ(state.max_age, 123); | 301 expiry = now + base::TimeDelta::FromSeconds(123); |
| 302 EXPECT_EQ(expiry, state.dynamic_spki_hashes_expiry); |
| 331 | 303 |
| 332 EXPECT_TRUE(TransportSecurityState::ParsePinsHeader( | 304 EXPECT_TRUE(state.ParsePinsHeader( |
| 305 now, |
| 333 "max-age=394082;" + backup_pin + ";" + good_pin + "; ", | 306 "max-age=394082;" + backup_pin + ";" + good_pin + "; ", |
| 334 ssl_info, &state)); | 307 ssl_info)); |
| 335 EXPECT_EQ(state.max_age, 394082); | 308 expiry = now + base::TimeDelta::FromSeconds(394082); |
| 309 EXPECT_EQ(expiry, state.dynamic_spki_hashes_expiry); |
| 336 | 310 |
| 337 EXPECT_TRUE(TransportSecurityState::ParsePinsHeader( | 311 EXPECT_TRUE(state.ParsePinsHeader( |
| 312 now, |
| 338 "max-age=39408299 ;" + backup_pin + ";" + good_pin + "; ", | 313 "max-age=39408299 ;" + backup_pin + ";" + good_pin + "; ", |
| 339 ssl_info, &state)); | 314 ssl_info)); |
| 340 EXPECT_EQ(state.max_age, | 315 expiry = now + base::TimeDelta::FromSeconds( |
| 341 std::min(TransportSecurityState::kMaxHSTSAgeSecs, 39408299l)); | 316 std::min(TransportSecurityState::kMaxHSTSAgeSecs, 39408299l)); |
| 317 EXPECT_EQ(expiry, state.dynamic_spki_hashes_expiry); |
| 342 | 318 |
| 343 EXPECT_TRUE(TransportSecurityState::ParsePinsHeader( | 319 EXPECT_TRUE(state.ParsePinsHeader( |
| 320 now, |
| 344 "max-age=39408038 ; cybers=39408038 ; " + | 321 "max-age=39408038 ; cybers=39408038 ; " + |
| 345 good_pin + ";" + backup_pin + "; ", | 322 good_pin + ";" + backup_pin + "; ", |
| 346 ssl_info, &state)); | 323 ssl_info)); |
| 347 EXPECT_EQ(state.max_age, | 324 expiry = now + base::TimeDelta::FromSeconds( |
| 348 std::min(TransportSecurityState::kMaxHSTSAgeSecs, 394082038l)); | 325 std::min(TransportSecurityState::kMaxHSTSAgeSecs, 394082038l)); |
| 326 EXPECT_EQ(expiry, state.dynamic_spki_hashes_expiry); |
| 349 | 327 |
| 350 EXPECT_TRUE(TransportSecurityState::ParsePinsHeader( | 328 EXPECT_TRUE(state.ParsePinsHeader( |
| 329 now, |
| 351 " max-age=0 ; " + good_pin + ";" + backup_pin, | 330 " max-age=0 ; " + good_pin + ";" + backup_pin, |
| 352 ssl_info, &state)); | 331 ssl_info)); |
| 353 EXPECT_EQ(state.max_age, 0); | 332 expiry = now + base::TimeDelta::FromSeconds(0); |
| 333 EXPECT_EQ(expiry, state.dynamic_spki_hashes_expiry); |
| 354 | 334 |
| 355 EXPECT_TRUE(TransportSecurityState::ParsePinsHeader( | 335 EXPECT_TRUE(state.ParsePinsHeader( |
| 336 now, |
| 356 " max-age=999999999999999999999999999999999999999999999 ; " + | 337 " max-age=999999999999999999999999999999999999999999999 ; " + |
| 357 backup_pin + ";" + good_pin + "; ", | 338 backup_pin + ";" + good_pin + "; ", |
| 358 ssl_info, &state)); | 339 ssl_info)); |
| 359 EXPECT_EQ(state.max_age, TransportSecurityState::kMaxHSTSAgeSecs); | 340 expiry = now + |
| 341 base::TimeDelta::FromSeconds(TransportSecurityState::kMaxHSTSAgeSecs); |
| 342 EXPECT_EQ(expiry, state.dynamic_spki_hashes_expiry); |
| 360 } | 343 } |
| 361 | 344 |
| 362 TEST_F(TransportSecurityStateTest, SimpleMatches) { | 345 TEST_F(TransportSecurityStateTest, SimpleMatches) { |
| 363 TransportSecurityState state(""); | 346 TransportSecurityState state; |
| 364 TransportSecurityState::DomainState domain_state; | 347 TransportSecurityState::DomainState domain_state; |
| 365 const base::Time current_time(base::Time::Now()); | 348 const base::Time current_time(base::Time::Now()); |
| 366 const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000); | 349 const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000); |
| 367 | 350 |
| 368 EXPECT_FALSE(state.GetDomainState(&domain_state, "yahoo.com", true)); | 351 EXPECT_FALSE(state.GetDomainState("yahoo.com", true, &domain_state)); |
| 369 domain_state.expiry = expiry; | 352 domain_state.upgrade_expiry = expiry; |
| 370 state.EnableHost("yahoo.com", domain_state); | 353 state.EnableHost("yahoo.com", domain_state); |
| 371 EXPECT_TRUE(state.GetDomainState(&domain_state, "yahoo.com", true)); | 354 EXPECT_TRUE(state.GetDomainState("yahoo.com", true, &domain_state)); |
| 372 } | 355 } |
| 373 | 356 |
| 374 TEST_F(TransportSecurityStateTest, MatchesCase1) { | 357 TEST_F(TransportSecurityStateTest, MatchesCase1) { |
| 375 TransportSecurityState state(""); | 358 TransportSecurityState state; |
| 376 TransportSecurityState::DomainState domain_state; | 359 TransportSecurityState::DomainState domain_state; |
| 377 const base::Time current_time(base::Time::Now()); | 360 const base::Time current_time(base::Time::Now()); |
| 378 const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000); | 361 const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000); |
| 379 | 362 |
| 380 EXPECT_FALSE(state.GetDomainState(&domain_state, "yahoo.com", true)); | 363 EXPECT_FALSE(state.GetDomainState("yahoo.com", true, &domain_state)); |
| 381 domain_state.expiry = expiry; | 364 domain_state.upgrade_expiry = expiry; |
| 382 state.EnableHost("YAhoo.coM", domain_state); | 365 state.EnableHost("YAhoo.coM", domain_state); |
| 383 EXPECT_TRUE(state.GetDomainState(&domain_state, "yahoo.com", true)); | 366 EXPECT_TRUE(state.GetDomainState("yahoo.com", true, &domain_state)); |
| 384 } | 367 } |
| 385 | 368 |
| 386 TEST_F(TransportSecurityStateTest, MatchesCase2) { | 369 TEST_F(TransportSecurityStateTest, MatchesCase2) { |
| 387 TransportSecurityState state(""); | 370 TransportSecurityState state; |
| 388 TransportSecurityState::DomainState domain_state; | 371 TransportSecurityState::DomainState domain_state; |
| 389 const base::Time current_time(base::Time::Now()); | 372 const base::Time current_time(base::Time::Now()); |
| 390 const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000); | 373 const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000); |
| 391 | 374 |
| 392 EXPECT_FALSE(state.GetDomainState(&domain_state, "YAhoo.coM", true)); | 375 EXPECT_FALSE(state.GetDomainState("YAhoo.coM", true, &domain_state)); |
| 393 domain_state.expiry = expiry; | 376 domain_state.upgrade_expiry = expiry; |
| 394 state.EnableHost("yahoo.com", domain_state); | 377 state.EnableHost("yahoo.com", domain_state); |
| 395 EXPECT_TRUE(state.GetDomainState(&domain_state, "YAhoo.coM", true)); | 378 EXPECT_TRUE(state.GetDomainState("YAhoo.coM", true, &domain_state)); |
| 396 } | 379 } |
| 397 | 380 |
| 398 TEST_F(TransportSecurityStateTest, SubdomainMatches) { | 381 TEST_F(TransportSecurityStateTest, SubdomainMatches) { |
| 399 TransportSecurityState state(""); | 382 TransportSecurityState state; |
| 400 TransportSecurityState::DomainState domain_state; | 383 TransportSecurityState::DomainState domain_state; |
| 401 const base::Time current_time(base::Time::Now()); | 384 const base::Time current_time(base::Time::Now()); |
| 402 const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000); | 385 const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000); |
| 403 | 386 |
| 404 EXPECT_FALSE(state.GetDomainState(&domain_state, "yahoo.com", true)); | 387 EXPECT_FALSE(state.GetDomainState("yahoo.com", true, &domain_state)); |
| 405 domain_state.expiry = expiry; | 388 domain_state.upgrade_expiry = expiry; |
| 406 domain_state.include_subdomains = true; | 389 domain_state.include_subdomains = true; |
| 407 state.EnableHost("yahoo.com", domain_state); | 390 state.EnableHost("yahoo.com", domain_state); |
| 408 EXPECT_TRUE(state.GetDomainState(&domain_state, "yahoo.com", true)); | 391 EXPECT_TRUE(state.GetDomainState("yahoo.com", true, &domain_state)); |
| 409 EXPECT_TRUE(state.GetDomainState(&domain_state, "foo.yahoo.com", true)); | 392 EXPECT_TRUE(state.GetDomainState("foo.yahoo.com", true, &domain_state)); |
| 410 EXPECT_TRUE(state.GetDomainState(&domain_state, | 393 EXPECT_TRUE(state.GetDomainState("foo.bar.yahoo.com", true, &domain_state)); |
| 411 "foo.bar.yahoo.com", | 394 EXPECT_TRUE(state.GetDomainState("foo.bar.baz.yahoo.com", true, |
| 412 true)); | 395 &domain_state)); |
| 413 EXPECT_TRUE(state.GetDomainState(&domain_state, | 396 EXPECT_FALSE(state.GetDomainState("com", true, &domain_state)); |
| 414 "foo.bar.baz.yahoo.com", | |
| 415 true)); | |
| 416 EXPECT_FALSE(state.GetDomainState(&domain_state, "com", true)); | |
| 417 } | |
| 418 | |
| 419 TEST_F(TransportSecurityStateTest, Serialise1) { | |
| 420 TransportSecurityState state(""); | |
| 421 std::string output; | |
| 422 bool dirty; | |
| 423 state.Serialise(&output); | |
| 424 EXPECT_TRUE(state.LoadEntries(output, &dirty)); | |
| 425 EXPECT_FALSE(dirty); | |
| 426 } | |
| 427 | |
| 428 TEST_F(TransportSecurityStateTest, Serialise2) { | |
| 429 TransportSecurityState state(""); | |
| 430 TransportSecurityState::DomainState domain_state; | |
| 431 const base::Time current_time(base::Time::Now()); | |
| 432 const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000); | |
| 433 | |
| 434 EXPECT_FALSE(state.GetDomainState(&domain_state, "yahoo.com", true)); | |
| 435 domain_state.mode = TransportSecurityState::DomainState::MODE_STRICT; | |
| 436 domain_state.expiry = expiry; | |
| 437 domain_state.include_subdomains = true; | |
| 438 state.EnableHost("yahoo.com", domain_state); | |
| 439 | |
| 440 std::string output; | |
| 441 bool dirty; | |
| 442 state.Serialise(&output); | |
| 443 EXPECT_TRUE(state.LoadEntries(output, &dirty)); | |
| 444 | |
| 445 EXPECT_TRUE(state.GetDomainState(&domain_state, "yahoo.com", true)); | |
| 446 EXPECT_EQ(domain_state.mode, | |
| 447 TransportSecurityState::DomainState::MODE_STRICT); | |
| 448 EXPECT_TRUE(state.GetDomainState(&domain_state, "foo.yahoo.com", true)); | |
| 449 EXPECT_EQ(domain_state.mode, | |
| 450 TransportSecurityState::DomainState::MODE_STRICT); | |
| 451 EXPECT_TRUE(state.GetDomainState(&domain_state, | |
| 452 "foo.bar.yahoo.com", | |
| 453 true)); | |
| 454 EXPECT_EQ(domain_state.mode, | |
| 455 TransportSecurityState::DomainState::MODE_STRICT); | |
| 456 EXPECT_TRUE(state.GetDomainState(&domain_state, | |
| 457 "foo.bar.baz.yahoo.com", | |
| 458 true)); | |
| 459 EXPECT_EQ(domain_state.mode, | |
| 460 TransportSecurityState::DomainState::MODE_STRICT); | |
| 461 EXPECT_FALSE(state.GetDomainState(&domain_state, "com", true)); | |
| 462 } | 397 } |
| 463 | 398 |
| 464 TEST_F(TransportSecurityStateTest, DeleteSince) { | 399 TEST_F(TransportSecurityStateTest, DeleteSince) { |
| 465 TransportSecurityState state(""); | 400 TransportSecurityState state; |
| 466 TransportSecurityState::DomainState domain_state; | 401 TransportSecurityState::DomainState domain_state; |
| 467 const base::Time current_time(base::Time::Now()); | 402 const base::Time current_time(base::Time::Now()); |
| 468 const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000); | 403 const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000); |
| 469 const base::Time older = current_time - base::TimeDelta::FromSeconds(1000); | 404 const base::Time older = current_time - base::TimeDelta::FromSeconds(1000); |
| 470 | 405 |
| 471 EXPECT_FALSE(state.GetDomainState(&domain_state, "yahoo.com", true)); | 406 EXPECT_FALSE(state.GetDomainState("yahoo.com", true, &domain_state)); |
| 472 domain_state.mode = TransportSecurityState::DomainState::MODE_STRICT; | 407 domain_state.upgrade_mode = |
| 473 domain_state.expiry = expiry; | 408 TransportSecurityState::DomainState::MODE_FORCE_HTTPS; |
| 409 domain_state.upgrade_expiry = expiry; |
| 474 state.EnableHost("yahoo.com", domain_state); | 410 state.EnableHost("yahoo.com", domain_state); |
| 475 | 411 |
| 476 state.DeleteSince(expiry); | 412 state.DeleteSince(expiry); |
| 477 EXPECT_TRUE(state.GetDomainState(&domain_state, "yahoo.com", true)); | 413 EXPECT_TRUE(state.GetDomainState("yahoo.com", true, &domain_state)); |
| 478 state.DeleteSince(older); | 414 state.DeleteSince(older); |
| 479 EXPECT_FALSE(state.GetDomainState(&domain_state, "yahoo.com", true)); | 415 EXPECT_FALSE(state.GetDomainState("yahoo.com", true, &domain_state)); |
| 480 } | 416 } |
| 481 | 417 |
| 482 TEST_F(TransportSecurityStateTest, DeleteHost) { | 418 TEST_F(TransportSecurityStateTest, DeleteHost) { |
| 483 TransportSecurityState state(""); | 419 TransportSecurityState state; |
| 484 TransportSecurityState::DomainState domain_state; | 420 TransportSecurityState::DomainState domain_state; |
| 485 const base::Time current_time(base::Time::Now()); | 421 const base::Time current_time(base::Time::Now()); |
| 486 const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000); | 422 const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000); |
| 487 domain_state.mode = TransportSecurityState::DomainState::MODE_STRICT; | 423 domain_state.upgrade_mode = |
| 488 domain_state.expiry = expiry; | 424 TransportSecurityState::DomainState::MODE_FORCE_HTTPS; |
| 425 domain_state.upgrade_expiry = expiry; |
| 489 state.EnableHost("yahoo.com", domain_state); | 426 state.EnableHost("yahoo.com", domain_state); |
| 490 | 427 |
| 491 EXPECT_TRUE(state.GetDomainState(&domain_state, "yahoo.com", true)); | 428 EXPECT_TRUE(state.GetDomainState("yahoo.com", true, &domain_state)); |
| 492 EXPECT_FALSE(state.GetDomainState(&domain_state, "example.com", true)); | 429 EXPECT_FALSE(state.GetDomainState("example.com", true, &domain_state)); |
| 493 EXPECT_TRUE(state.DeleteHost("yahoo.com")); | 430 EXPECT_TRUE(state.DeleteHost("yahoo.com")); |
| 494 EXPECT_FALSE(state.GetDomainState(&domain_state, "yahoo.com", true)); | 431 EXPECT_FALSE(state.GetDomainState("yahoo.com", true, &domain_state)); |
| 495 } | |
| 496 | |
| 497 TEST_F(TransportSecurityStateTest, SerialiseOld) { | |
| 498 TransportSecurityState state(""); | |
| 499 // This is an old-style piece of transport state JSON, which has no creation | |
| 500 // date. | |
| 501 std::string output = | |
| 502 "{ " | |
| 503 "\"NiyD+3J1r6z1wjl2n1ALBu94Zj9OsEAMo0kCN8js0Uk=\": {" | |
| 504 "\"expiry\": 1266815027.983453, " | |
| 505 "\"include_subdomains\": false, " | |
| 506 "\"mode\": \"strict\" " | |
| 507 "}" | |
| 508 "}"; | |
| 509 bool dirty; | |
| 510 EXPECT_TRUE(state.LoadEntries(output, &dirty)); | |
| 511 EXPECT_TRUE(dirty); | |
| 512 } | 432 } |
| 513 | 433 |
| 514 TEST_F(TransportSecurityStateTest, IsPreloaded) { | 434 TEST_F(TransportSecurityStateTest, IsPreloaded) { |
| 515 TransportSecurityState state(""); | |
| 516 | |
| 517 const std::string paypal = | 435 const std::string paypal = |
| 518 TransportSecurityState::CanonicalizeHost("paypal.com"); | 436 TransportSecurityState::CanonicalizeHost("paypal.com"); |
| 519 const std::string www_paypal = | 437 const std::string www_paypal = |
| 520 TransportSecurityState::CanonicalizeHost("www.paypal.com"); | 438 TransportSecurityState::CanonicalizeHost("www.paypal.com"); |
| 521 const std::string a_www_paypal = | 439 const std::string a_www_paypal = |
| 522 TransportSecurityState::CanonicalizeHost("a.www.paypal.com"); | 440 TransportSecurityState::CanonicalizeHost("a.www.paypal.com"); |
| 523 const std::string abc_paypal = | 441 const std::string abc_paypal = |
| 524 TransportSecurityState::CanonicalizeHost("a.b.c.paypal.com"); | 442 TransportSecurityState::CanonicalizeHost("a.b.c.paypal.com"); |
| 525 const std::string example = | 443 const std::string example = |
| 526 TransportSecurityState::CanonicalizeHost("example.com"); | 444 TransportSecurityState::CanonicalizeHost("example.com"); |
| 527 const std::string aypal = | 445 const std::string aypal = |
| 528 TransportSecurityState::CanonicalizeHost("aypal.com"); | 446 TransportSecurityState::CanonicalizeHost("aypal.com"); |
| 529 | 447 |
| 448 TransportSecurityState state; |
| 530 TransportSecurityState::DomainState domain_state; | 449 TransportSecurityState::DomainState domain_state; |
| 531 EXPECT_FALSE(state.IsPreloadedSTS(paypal, true, &domain_state)); | 450 |
| 532 EXPECT_TRUE(state.IsPreloadedSTS(www_paypal, true, &domain_state)); | 451 EXPECT_FALSE(state.GetStaticDomainState(paypal, true, &domain_state)); |
| 452 EXPECT_TRUE(state.GetStaticDomainState(www_paypal, true, &domain_state)); |
| 533 EXPECT_FALSE(domain_state.include_subdomains); | 453 EXPECT_FALSE(domain_state.include_subdomains); |
| 534 EXPECT_FALSE(state.IsPreloadedSTS(a_www_paypal, true, &domain_state)); | 454 EXPECT_FALSE(state.GetStaticDomainState(a_www_paypal, true, &domain_state)); |
| 535 EXPECT_FALSE(state.IsPreloadedSTS(abc_paypal, true, &domain_state)); | 455 EXPECT_FALSE(state.GetStaticDomainState(abc_paypal, true, &domain_state)); |
| 536 EXPECT_FALSE(state.IsPreloadedSTS(example, true, &domain_state)); | 456 EXPECT_FALSE(state.GetStaticDomainState(example, true, &domain_state)); |
| 537 EXPECT_FALSE(state.IsPreloadedSTS(aypal, true, &domain_state)); | 457 EXPECT_FALSE(state.GetStaticDomainState(aypal, true, &domain_state)); |
| 538 } | 458 } |
| 539 | 459 |
| 540 TEST_F(TransportSecurityStateTest, PreloadedDomainSet) { | 460 TEST_F(TransportSecurityStateTest, PreloadedDomainSet) { |
| 541 TransportSecurityState state(""); | 461 TransportSecurityState state; |
| 542 TransportSecurityState::DomainState domain_state; | 462 TransportSecurityState::DomainState domain_state; |
| 543 | 463 |
| 544 // The domain wasn't being set, leading to a blank string in the | 464 // The domain wasn't being set, leading to a blank string in the |
| 545 // chrome://net-internals/#hsts UI. So test that. | 465 // chrome://net-internals/#hsts UI. So test that. |
| 546 EXPECT_TRUE(state.GetDomainState(&domain_state, | 466 EXPECT_TRUE(state.GetDomainState("market.android.com", true, &domain_state)); |
| 547 "market.android.com", | |
| 548 true)); | |
| 549 EXPECT_EQ(domain_state.domain, "market.android.com"); | 467 EXPECT_EQ(domain_state.domain, "market.android.com"); |
| 550 EXPECT_TRUE(state.GetDomainState(&domain_state, | 468 EXPECT_TRUE(state.GetDomainState("sub.market.android.com", true, |
| 551 "sub.market.android.com", | 469 &domain_state)); |
| 552 true)); | |
| 553 EXPECT_EQ(domain_state.domain, "market.android.com"); | 470 EXPECT_EQ(domain_state.domain, "market.android.com"); |
| 554 } | 471 } |
| 555 | 472 |
| 556 static bool ShouldRedirect(const char* hostname) { | 473 static bool ShouldRedirect(const char* hostname) { |
| 557 TransportSecurityState state(""); | 474 TransportSecurityState state; |
| 558 TransportSecurityState::DomainState domain_state; | 475 TransportSecurityState::DomainState domain_state; |
| 559 return state.GetDomainState(&domain_state, hostname, true /* SNI ok */) && | 476 return state.GetDomainState(hostname, true /* SNI ok */, &domain_state) && |
| 560 domain_state.ShouldRedirectHTTPToHTTPS(); | 477 domain_state.ShouldRedirectHTTPToHTTPS(); |
| 561 } | 478 } |
| 562 | 479 |
| 563 static bool HasState(const char *hostname) { | 480 static bool HasState(const char* hostname) { |
| 564 TransportSecurityState state(""); | 481 TransportSecurityState state; |
| 565 TransportSecurityState::DomainState domain_state; | 482 TransportSecurityState::DomainState domain_state; |
| 566 return state.GetDomainState(&domain_state, hostname, true /* SNI ok */); | 483 return state.GetDomainState(hostname, true /* SNI ok */, &domain_state); |
| 567 } | 484 } |
| 568 | 485 |
| 569 static bool HasPins(const char *hostname) { | 486 static bool HasPins(const TransportSecurityState::DomainState& state) { |
| 570 TransportSecurityState state(""); | 487 return state.static_spki_hashes.size() > 0 || |
| 488 state.bad_static_spki_hashes.size() > 0 || |
| 489 state.dynamic_spki_hashes.size() > 0; |
| 490 } |
| 491 |
| 492 static bool HasPins(const char* hostname, bool sni_enabled) { |
| 493 TransportSecurityState state; |
| 571 TransportSecurityState::DomainState domain_state; | 494 TransportSecurityState::DomainState domain_state; |
| 572 return state.HasPinsForHost(&domain_state, hostname, true /* SNI ok */); | 495 if (!state.GetDomainState(hostname, sni_enabled, &domain_state)) |
| 496 return false; |
| 497 |
| 498 return HasPins(domain_state); |
| 499 } |
| 500 |
| 501 static bool HasPins(const char* hostname) { |
| 502 return HasPins(hostname, true); |
| 573 } | 503 } |
| 574 | 504 |
| 575 static bool OnlyPinning(const char *hostname) { | 505 static bool OnlyPinning(const char *hostname) { |
| 576 TransportSecurityState state(""); | 506 TransportSecurityState state; |
| 577 TransportSecurityState::DomainState domain_state; | 507 TransportSecurityState::DomainState domain_state; |
| 578 return state.HasPinsForHost(&domain_state, hostname, true /* SNI ok */) && | 508 if (!state.GetDomainState(hostname, true /* SNI ok */, &domain_state)) |
| 509 return false; |
| 510 |
| 511 return (domain_state.static_spki_hashes.size() > 0 || |
| 512 domain_state.bad_static_spki_hashes.size() > 0 || |
| 513 domain_state.dynamic_spki_hashes.size() > 0) && |
| 579 !domain_state.ShouldRedirectHTTPToHTTPS(); | 514 !domain_state.ShouldRedirectHTTPToHTTPS(); |
| 580 } | 515 } |
| 581 | 516 |
| 582 TEST_F(TransportSecurityStateTest, Preloaded) { | 517 TEST_F(TransportSecurityStateTest, Preloaded) { |
| 583 TransportSecurityState state(""); | 518 TransportSecurityState state; |
| 584 TransportSecurityState::DomainState domain_state; | 519 TransportSecurityState::DomainState domain_state; |
| 585 | 520 |
| 586 // We do more extensive checks for the first domain. | 521 // We do more extensive checks for the first domain. |
| 587 EXPECT_TRUE(state.GetDomainState(&domain_state, "www.paypal.com", true)); | 522 EXPECT_TRUE(state.GetDomainState("www.paypal.com", true, &domain_state)); |
| 588 EXPECT_EQ(domain_state.mode, | 523 EXPECT_EQ(domain_state.upgrade_mode, |
| 589 TransportSecurityState::DomainState::MODE_STRICT); | 524 TransportSecurityState::DomainState::MODE_FORCE_HTTPS); |
| 590 EXPECT_TRUE(domain_state.preloaded); | |
| 591 EXPECT_FALSE(domain_state.include_subdomains); | 525 EXPECT_FALSE(domain_state.include_subdomains); |
| 592 | 526 |
| 593 EXPECT_FALSE(HasState("paypal.com")); | 527 EXPECT_FALSE(HasState("paypal.com")); |
| 594 EXPECT_FALSE(HasState("www2.paypal.com")); | 528 EXPECT_FALSE(HasState("www2.paypal.com")); |
| 595 EXPECT_FALSE(HasState("www2.paypal.com")); | 529 EXPECT_FALSE(HasState("www2.paypal.com")); |
| 596 | 530 |
| 597 // Google hosts: | 531 // Google hosts: |
| 598 | 532 |
| 599 EXPECT_TRUE(ShouldRedirect("chrome.google.com")); | 533 EXPECT_TRUE(ShouldRedirect("chrome.google.com")); |
| 600 EXPECT_TRUE(ShouldRedirect("checkout.google.com")); | 534 EXPECT_TRUE(ShouldRedirect("checkout.google.com")); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 639 EXPECT_TRUE(OnlyPinning("www.google-analytics.com")); | 573 EXPECT_TRUE(OnlyPinning("www.google-analytics.com")); |
| 640 EXPECT_TRUE(OnlyPinning("googleapis.com")); | 574 EXPECT_TRUE(OnlyPinning("googleapis.com")); |
| 641 EXPECT_TRUE(OnlyPinning("googleadservices.com")); | 575 EXPECT_TRUE(OnlyPinning("googleadservices.com")); |
| 642 EXPECT_TRUE(OnlyPinning("googlecode.com")); | 576 EXPECT_TRUE(OnlyPinning("googlecode.com")); |
| 643 EXPECT_TRUE(OnlyPinning("appspot.com")); | 577 EXPECT_TRUE(OnlyPinning("appspot.com")); |
| 644 EXPECT_TRUE(OnlyPinning("googlesyndication.com")); | 578 EXPECT_TRUE(OnlyPinning("googlesyndication.com")); |
| 645 EXPECT_TRUE(OnlyPinning("doubleclick.net")); | 579 EXPECT_TRUE(OnlyPinning("doubleclick.net")); |
| 646 EXPECT_TRUE(OnlyPinning("googlegroups.com")); | 580 EXPECT_TRUE(OnlyPinning("googlegroups.com")); |
| 647 | 581 |
| 648 // Tests for domains that don't work without SNI. | 582 // Tests for domains that don't work without SNI. |
| 649 EXPECT_FALSE(state.GetDomainState(&domain_state, "gmail.com", false)); | 583 EXPECT_FALSE(state.GetDomainState("gmail.com", false, &domain_state)); |
| 650 EXPECT_FALSE(state.GetDomainState(&domain_state, "www.gmail.com", false)); | 584 EXPECT_FALSE(state.GetDomainState("www.gmail.com", false, &domain_state)); |
| 651 EXPECT_FALSE(state.GetDomainState(&domain_state, "m.gmail.com", false)); | 585 EXPECT_FALSE(state.GetDomainState("m.gmail.com", false, &domain_state)); |
| 652 EXPECT_FALSE(state.GetDomainState(&domain_state, "googlemail.com", false)); | 586 EXPECT_FALSE(state.GetDomainState("googlemail.com", false, &domain_state)); |
| 653 EXPECT_FALSE(state.GetDomainState(&domain_state, | 587 EXPECT_FALSE(state.GetDomainState("www.googlemail.com", false, |
| 654 "www.googlemail.com", | 588 &domain_state)); |
| 655 false)); | 589 EXPECT_FALSE(state.GetDomainState("m.googlemail.com", false, &domain_state)); |
| 656 EXPECT_FALSE(state.GetDomainState(&domain_state, | |
| 657 "m.googlemail.com", | |
| 658 false)); | |
| 659 | 590 |
| 660 // Other hosts: | 591 // Other hosts: |
| 661 | 592 |
| 662 EXPECT_TRUE(ShouldRedirect("aladdinschools.appspot.com")); | 593 EXPECT_TRUE(ShouldRedirect("aladdinschools.appspot.com")); |
| 663 | 594 |
| 664 EXPECT_TRUE(ShouldRedirect("ottospora.nl")); | 595 EXPECT_TRUE(ShouldRedirect("ottospora.nl")); |
| 665 EXPECT_TRUE(ShouldRedirect("www.ottospora.nl")); | 596 EXPECT_TRUE(ShouldRedirect("www.ottospora.nl")); |
| 666 | 597 |
| 667 EXPECT_TRUE(ShouldRedirect("www.paycheckrecords.com")); | 598 EXPECT_TRUE(ShouldRedirect("www.paycheckrecords.com")); |
| 668 | 599 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 746 EXPECT_TRUE(ShouldRedirect("simon.butcher.name")); | 677 EXPECT_TRUE(ShouldRedirect("simon.butcher.name")); |
| 747 EXPECT_TRUE(ShouldRedirect("foo.simon.butcher.name")); | 678 EXPECT_TRUE(ShouldRedirect("foo.simon.butcher.name")); |
| 748 | 679 |
| 749 EXPECT_TRUE(ShouldRedirect("linx.net")); | 680 EXPECT_TRUE(ShouldRedirect("linx.net")); |
| 750 EXPECT_TRUE(ShouldRedirect("foo.linx.net")); | 681 EXPECT_TRUE(ShouldRedirect("foo.linx.net")); |
| 751 | 682 |
| 752 EXPECT_TRUE(ShouldRedirect("dropcam.com")); | 683 EXPECT_TRUE(ShouldRedirect("dropcam.com")); |
| 753 EXPECT_TRUE(ShouldRedirect("www.dropcam.com")); | 684 EXPECT_TRUE(ShouldRedirect("www.dropcam.com")); |
| 754 EXPECT_FALSE(HasState("foo.dropcam.com")); | 685 EXPECT_FALSE(HasState("foo.dropcam.com")); |
| 755 | 686 |
| 756 EXPECT_TRUE(state.GetDomainState(&domain_state, | 687 EXPECT_TRUE(state.GetDomainState("torproject.org", false, &domain_state)); |
| 757 "torproject.org", | 688 EXPECT_FALSE(domain_state.static_spki_hashes.empty()); |
| 758 false)); | 689 EXPECT_TRUE(state.GetDomainState("www.torproject.org", false, |
| 759 EXPECT_FALSE(domain_state.preloaded_spki_hashes.empty()); | 690 &domain_state)); |
| 760 EXPECT_TRUE(state.GetDomainState(&domain_state, | 691 EXPECT_FALSE(domain_state.static_spki_hashes.empty()); |
| 761 "www.torproject.org", | 692 EXPECT_TRUE(state.GetDomainState("check.torproject.org", false, |
| 762 false)); | 693 &domain_state)); |
| 763 EXPECT_FALSE(domain_state.preloaded_spki_hashes.empty()); | 694 EXPECT_FALSE(domain_state.static_spki_hashes.empty()); |
| 764 EXPECT_TRUE(state.GetDomainState(&domain_state, | 695 EXPECT_TRUE(state.GetDomainState("blog.torproject.org", false, |
| 765 "check.torproject.org", | 696 &domain_state)); |
| 766 false)); | 697 EXPECT_FALSE(domain_state.static_spki_hashes.empty()); |
| 767 EXPECT_FALSE(domain_state.preloaded_spki_hashes.empty()); | |
| 768 EXPECT_TRUE(state.GetDomainState(&domain_state, | |
| 769 "blog.torproject.org", | |
| 770 false)); | |
| 771 EXPECT_FALSE(domain_state.preloaded_spki_hashes.empty()); | |
| 772 EXPECT_TRUE(ShouldRedirect("ebanking.indovinabank.com.vn")); | 698 EXPECT_TRUE(ShouldRedirect("ebanking.indovinabank.com.vn")); |
| 773 EXPECT_TRUE(ShouldRedirect("foo.ebanking.indovinabank.com.vn")); | 699 EXPECT_TRUE(ShouldRedirect("foo.ebanking.indovinabank.com.vn")); |
| 774 | 700 |
| 775 EXPECT_TRUE(ShouldRedirect("epoxate.com")); | 701 EXPECT_TRUE(ShouldRedirect("epoxate.com")); |
| 776 EXPECT_FALSE(HasState("foo.epoxate.com")); | 702 EXPECT_FALSE(HasState("foo.epoxate.com")); |
| 777 | 703 |
| 778 EXPECT_TRUE(HasPins("torproject.org")); | 704 EXPECT_TRUE(HasPins("torproject.org")); |
| 779 EXPECT_TRUE(HasPins("www.torproject.org")); | 705 EXPECT_TRUE(HasPins("www.torproject.org")); |
| 780 EXPECT_TRUE(HasPins("check.torproject.org")); | 706 EXPECT_TRUE(HasPins("check.torproject.org")); |
| 781 EXPECT_TRUE(HasPins("blog.torproject.org")); | 707 EXPECT_TRUE(HasPins("blog.torproject.org")); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 838 #else | 764 #else |
| 839 static const bool kTwitterHSTS = false; | 765 static const bool kTwitterHSTS = false; |
| 840 #endif | 766 #endif |
| 841 | 767 |
| 842 EXPECT_EQ(kTwitterHSTS, ShouldRedirect("twitter.com")); | 768 EXPECT_EQ(kTwitterHSTS, ShouldRedirect("twitter.com")); |
| 843 EXPECT_EQ(kTwitterHSTS, ShouldRedirect("www.twitter.com")); | 769 EXPECT_EQ(kTwitterHSTS, ShouldRedirect("www.twitter.com")); |
| 844 EXPECT_TRUE(HasPins("www.twitter.com")); | 770 EXPECT_TRUE(HasPins("www.twitter.com")); |
| 845 } | 771 } |
| 846 | 772 |
| 847 TEST_F(TransportSecurityStateTest, LongNames) { | 773 TEST_F(TransportSecurityStateTest, LongNames) { |
| 848 TransportSecurityState state(""); | 774 TransportSecurityState state; |
| 849 const char kLongName[] = | 775 const char kLongName[] = |
| 850 "lookupByWaveIdHashAndWaveIdIdAndWaveIdDomainAndWaveletIdIdAnd" | 776 "lookupByWaveIdHashAndWaveIdIdAndWaveIdDomainAndWaveletIdIdAnd" |
| 851 "WaveletIdDomainAndBlipBlipid"; | 777 "WaveletIdDomainAndBlipBlipid"; |
| 852 TransportSecurityState::DomainState domain_state; | 778 TransportSecurityState::DomainState domain_state; |
| 853 // Just checks that we don't hit a NOTREACHED. | 779 // Just checks that we don't hit a NOTREACHED. |
| 854 EXPECT_FALSE(state.GetDomainState(&domain_state, kLongName, true)); | 780 EXPECT_FALSE(state.GetDomainState(kLongName, true, &domain_state)); |
| 855 } | |
| 856 | |
| 857 TEST_F(TransportSecurityStateTest, PublicKeyHashes) { | |
| 858 TransportSecurityState state(""); | |
| 859 TransportSecurityState::DomainState domain_state; | |
| 860 EXPECT_FALSE(state.GetDomainState(&domain_state, "example.com", false)); | |
| 861 FingerprintVector hashes; | |
| 862 EXPECT_TRUE(domain_state.IsChainOfPublicKeysPermitted(hashes)); | |
| 863 | |
| 864 SHA1Fingerprint hash; | |
| 865 memset(hash.data, '1', sizeof(hash.data)); | |
| 866 domain_state.preloaded_spki_hashes.push_back(hash); | |
| 867 | |
| 868 EXPECT_FALSE(domain_state.IsChainOfPublicKeysPermitted(hashes)); | |
| 869 hashes.push_back(hash); | |
| 870 EXPECT_TRUE(domain_state.IsChainOfPublicKeysPermitted(hashes)); | |
| 871 hashes[0].data[0] = '2'; | |
| 872 EXPECT_FALSE(domain_state.IsChainOfPublicKeysPermitted(hashes)); | |
| 873 | |
| 874 const base::Time current_time(base::Time::Now()); | |
| 875 const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000); | |
| 876 domain_state.expiry = expiry; | |
| 877 state.EnableHost("example.com", domain_state); | |
| 878 std::string ser; | |
| 879 EXPECT_TRUE(state.Serialise(&ser)); | |
| 880 bool dirty; | |
| 881 EXPECT_TRUE(state.LoadEntries(ser, &dirty)); | |
| 882 EXPECT_TRUE(state.GetDomainState(&domain_state, "example.com", false)); | |
| 883 EXPECT_EQ(1u, domain_state.preloaded_spki_hashes.size()); | |
| 884 EXPECT_EQ(0, memcmp(domain_state.preloaded_spki_hashes[0].data, hash.data, | |
| 885 sizeof(hash.data))); | |
| 886 } | 781 } |
| 887 | 782 |
| 888 TEST_F(TransportSecurityStateTest, BuiltinCertPins) { | 783 TEST_F(TransportSecurityStateTest, BuiltinCertPins) { |
| 889 TransportSecurityState state(""); | 784 TransportSecurityState state; |
| 890 TransportSecurityState::DomainState domain_state; | 785 TransportSecurityState::DomainState domain_state; |
| 891 EXPECT_TRUE(state.GetDomainState(&domain_state, | 786 |
| 892 "chrome.google.com", | 787 EXPECT_TRUE(state.GetDomainState("chrome.google.com", true, &domain_state)); |
| 893 true)); | 788 EXPECT_TRUE(HasPins("chrome.google.com")); |
| 894 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "chrome.google.com", true)); | 789 |
| 895 FingerprintVector hashes; | 790 FingerprintVector hashes; |
| 896 // This essential checks that a built-in list does exist. | 791 // Checks that a built-in list does exist. |
| 897 EXPECT_FALSE(domain_state.IsChainOfPublicKeysPermitted(hashes)); | 792 EXPECT_FALSE(domain_state.IsChainOfPublicKeysPermitted(hashes)); |
| 898 EXPECT_FALSE(state.HasPinsForHost(&domain_state, "www.paypal.com", true)); | 793 EXPECT_FALSE(HasPins("www.paypal.com")); |
| 899 | 794 |
| 900 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "docs.google.com", true)); | 795 EXPECT_TRUE(HasPins("docs.google.com")); |
| 901 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "1.docs.google.com", true)); | 796 EXPECT_TRUE(HasPins("1.docs.google.com")); |
| 902 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "sites.google.com", true)); | 797 EXPECT_TRUE(HasPins("sites.google.com")); |
| 903 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "drive.google.com", true)); | 798 EXPECT_TRUE(HasPins("drive.google.com")); |
| 904 EXPECT_TRUE(state.HasPinsForHost(&domain_state, | 799 EXPECT_TRUE(HasPins("spreadsheets.google.com")); |
| 905 "spreadsheets.google.com", | 800 EXPECT_TRUE(HasPins("health.google.com")); |
| 906 true)); | 801 EXPECT_TRUE(HasPins("checkout.google.com")); |
| 907 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "health.google.com", true)); | 802 EXPECT_TRUE(HasPins("appengine.google.com")); |
| 908 EXPECT_TRUE(state.HasPinsForHost(&domain_state, | 803 EXPECT_TRUE(HasPins("market.android.com")); |
| 909 "checkout.google.com", | 804 EXPECT_TRUE(HasPins("encrypted.google.com")); |
| 910 true)); | 805 EXPECT_TRUE(HasPins("accounts.google.com")); |
| 911 EXPECT_TRUE(state.HasPinsForHost(&domain_state, | 806 EXPECT_TRUE(HasPins("profiles.google.com")); |
| 912 "appengine.google.com", | 807 EXPECT_TRUE(HasPins("mail.google.com")); |
| 913 true)); | 808 EXPECT_TRUE(HasPins("chatenabled.mail.google.com")); |
| 914 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "market.android.com", true)); | 809 EXPECT_TRUE(HasPins("talkgadget.google.com")); |
| 915 EXPECT_TRUE(state.HasPinsForHost(&domain_state, | 810 EXPECT_TRUE(HasPins("hostedtalkgadget.google.com")); |
| 916 "encrypted.google.com", | 811 EXPECT_TRUE(HasPins("talk.google.com")); |
| 917 true)); | 812 EXPECT_TRUE(HasPins("plus.google.com")); |
| 918 EXPECT_TRUE(state.HasPinsForHost(&domain_state, | 813 EXPECT_TRUE(HasPins("groups.google.com")); |
| 919 "accounts.google.com", | 814 EXPECT_TRUE(HasPins("apis.google.com")); |
| 920 true)); | |
| 921 EXPECT_TRUE(state.HasPinsForHost(&domain_state, | |
| 922 "profiles.google.com", | |
| 923 true)); | |
| 924 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "mail.google.com", true)); | |
| 925 EXPECT_TRUE(state.HasPinsForHost(&domain_state, | |
| 926 "chatenabled.mail.google.com", | |
| 927 true)); | |
| 928 EXPECT_TRUE(state.HasPinsForHost(&domain_state, | |
| 929 "talkgadget.google.com", | |
| 930 true)); | |
| 931 EXPECT_TRUE(state.HasPinsForHost(&domain_state, | |
| 932 "hostedtalkgadget.google.com", | |
| 933 true)); | |
| 934 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "talk.google.com", true)); | |
| 935 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "plus.google.com", true)); | |
| 936 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "groups.google.com", true)); | |
| 937 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "apis.google.com", true)); | |
| 938 | 815 |
| 939 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "ssl.gstatic.com", true)); | 816 EXPECT_TRUE(HasPins("ssl.gstatic.com")); |
| 940 EXPECT_FALSE(state.HasPinsForHost(&domain_state, "www.gstatic.com", true)); | 817 EXPECT_FALSE(HasPins("www.gstatic.com")); |
| 941 EXPECT_TRUE(state.HasPinsForHost(&domain_state, | 818 EXPECT_TRUE(HasPins("ssl.google-analytics.com")); |
| 942 "ssl.google-analytics.com", | 819 EXPECT_TRUE(HasPins("www.googleplex.com")); |
| 943 true)); | |
| 944 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "www.googleplex.com", true)); | |
| 945 | 820 |
| 946 // Disabled in order to help track down pinning failures --agl | 821 // Disabled in order to help track down pinning failures --agl |
| 947 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "twitter.com", true)); | 822 EXPECT_TRUE(HasPins("twitter.com")); |
| 948 EXPECT_FALSE(state.HasPinsForHost(&domain_state, "foo.twitter.com", true)); | 823 EXPECT_FALSE(HasPins("foo.twitter.com")); |
| 949 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "www.twitter.com", true)); | 824 EXPECT_TRUE(HasPins("www.twitter.com")); |
| 950 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "api.twitter.com", true)); | 825 EXPECT_TRUE(HasPins("api.twitter.com")); |
| 951 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "oauth.twitter.com", true)); | 826 EXPECT_TRUE(HasPins("oauth.twitter.com")); |
| 952 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "mobile.twitter.com", true)); | 827 EXPECT_TRUE(HasPins("mobile.twitter.com")); |
| 953 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "dev.twitter.com", true)); | 828 EXPECT_TRUE(HasPins("dev.twitter.com")); |
| 954 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "business.twitter.com", | 829 EXPECT_TRUE(HasPins("business.twitter.com")); |
| 955 true)); | 830 EXPECT_TRUE(HasPins("platform.twitter.com")); |
| 956 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "platform.twitter.com", | 831 EXPECT_TRUE(HasPins("si0.twimg.com")); |
| 957 true)); | 832 EXPECT_TRUE(HasPins("twimg0-a.akamaihd.net")); |
| 958 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "si0.twimg.com", true)); | |
| 959 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "twimg0-a.akamaihd.net", | |
| 960 true)); | |
| 961 } | 833 } |
| 962 | 834 |
| 963 static bool AddHash(const std::string& type_and_base64, | 835 static bool AddHash(const std::string& type_and_base64, |
| 964 FingerprintVector* out) { | 836 FingerprintVector* out) { |
| 965 std::string hash_str; | 837 std::string hash_str; |
| 966 if (type_and_base64.find("sha1/") == 0 && | 838 if (type_and_base64.find("sha1/") == 0 && |
| 967 base::Base64Decode(type_and_base64.substr(5, type_and_base64.size() - 5), | 839 base::Base64Decode(type_and_base64.substr(5, type_and_base64.size() - 5), |
| 968 &hash_str) && | 840 &hash_str) && |
| 969 hash_str.size() == base::kSHA1Length) { | 841 hash_str.size() == base::kSHA1Length) { |
| 970 SHA1Fingerprint hash; | 842 SHA1Fingerprint hash; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 996 | 868 |
| 997 std::vector<net::SHA1Fingerprint> good_hashes, bad_hashes; | 869 std::vector<net::SHA1Fingerprint> good_hashes, bad_hashes; |
| 998 | 870 |
| 999 for (size_t i = 0; kGoodPath[i]; i++) { | 871 for (size_t i = 0; kGoodPath[i]; i++) { |
| 1000 EXPECT_TRUE(AddHash(kGoodPath[i], &good_hashes)); | 872 EXPECT_TRUE(AddHash(kGoodPath[i], &good_hashes)); |
| 1001 } | 873 } |
| 1002 for (size_t i = 0; kBadPath[i]; i++) { | 874 for (size_t i = 0; kBadPath[i]; i++) { |
| 1003 EXPECT_TRUE(AddHash(kBadPath[i], &bad_hashes)); | 875 EXPECT_TRUE(AddHash(kBadPath[i], &bad_hashes)); |
| 1004 } | 876 } |
| 1005 | 877 |
| 1006 TransportSecurityState state(""); | 878 TransportSecurityState state; |
| 1007 TransportSecurityState::DomainState domain_state; | 879 TransportSecurityState::DomainState domain_state; |
| 1008 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "plus.google.com", true)); | 880 EXPECT_TRUE(state.GetDomainState("plus.google.com", true, &domain_state)); |
| 881 EXPECT_TRUE(HasPins(domain_state)); |
| 1009 | 882 |
| 1010 EXPECT_TRUE(domain_state.IsChainOfPublicKeysPermitted(good_hashes)); | 883 EXPECT_TRUE(domain_state.IsChainOfPublicKeysPermitted(good_hashes)); |
| 1011 EXPECT_FALSE(domain_state.IsChainOfPublicKeysPermitted(bad_hashes)); | 884 EXPECT_FALSE(domain_state.IsChainOfPublicKeysPermitted(bad_hashes)); |
| 1012 } | 885 } |
| 1013 | 886 |
| 1014 TEST_F(TransportSecurityStateTest, PinValidationWithoutRejectedCerts) { | 887 TEST_F(TransportSecurityStateTest, PinValidationWithoutRejectedCerts) { |
| 1015 // kGoodPath is blog.torproject.org. | 888 // kGoodPath is blog.torproject.org. |
| 1016 static const char* kGoodPath[] = { | 889 static const char* kGoodPath[] = { |
| 1017 "sha1/m9lHYJYke9k0GtVZ+bXSQYE8nDI=", | 890 "sha1/m9lHYJYke9k0GtVZ+bXSQYE8nDI=", |
| 1018 "sha1/o5OZxATDsgmwgcIfIWIneMJ0jkw=", | 891 "sha1/o5OZxATDsgmwgcIfIWIneMJ0jkw=", |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1031 | 904 |
| 1032 std::vector<net::SHA1Fingerprint> good_hashes, bad_hashes; | 905 std::vector<net::SHA1Fingerprint> good_hashes, bad_hashes; |
| 1033 | 906 |
| 1034 for (size_t i = 0; kGoodPath[i]; i++) { | 907 for (size_t i = 0; kGoodPath[i]; i++) { |
| 1035 EXPECT_TRUE(AddHash(kGoodPath[i], &good_hashes)); | 908 EXPECT_TRUE(AddHash(kGoodPath[i], &good_hashes)); |
| 1036 } | 909 } |
| 1037 for (size_t i = 0; kBadPath[i]; i++) { | 910 for (size_t i = 0; kBadPath[i]; i++) { |
| 1038 EXPECT_TRUE(AddHash(kBadPath[i], &bad_hashes)); | 911 EXPECT_TRUE(AddHash(kBadPath[i], &bad_hashes)); |
| 1039 } | 912 } |
| 1040 | 913 |
| 1041 TransportSecurityState state(""); | 914 TransportSecurityState state; |
| 1042 TransportSecurityState::DomainState domain_state; | 915 TransportSecurityState::DomainState domain_state; |
| 1043 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "blog.torproject.org", true)); | 916 EXPECT_TRUE(state.GetDomainState("blog.torproject.org", true, &domain_state)); |
| 917 EXPECT_TRUE(HasPins(domain_state)); |
| 1044 | 918 |
| 1045 EXPECT_TRUE(domain_state.IsChainOfPublicKeysPermitted(good_hashes)); | 919 EXPECT_TRUE(domain_state.IsChainOfPublicKeysPermitted(good_hashes)); |
| 1046 EXPECT_FALSE(domain_state.IsChainOfPublicKeysPermitted(bad_hashes)); | 920 EXPECT_FALSE(domain_state.IsChainOfPublicKeysPermitted(bad_hashes)); |
| 1047 } | 921 } |
| 1048 | 922 |
| 1049 TEST_F(TransportSecurityStateTest, OptionalHSTSCertPins) { | 923 TEST_F(TransportSecurityStateTest, OptionalHSTSCertPins) { |
| 1050 TransportSecurityState state(""); | 924 TransportSecurityState state; |
| 1051 TransportSecurityState::DomainState domain_state; | 925 TransportSecurityState::DomainState domain_state; |
| 926 |
| 1052 EXPECT_FALSE(ShouldRedirect("www.google-analytics.com")); | 927 EXPECT_FALSE(ShouldRedirect("www.google-analytics.com")); |
| 1053 EXPECT_FALSE(state.HasPinsForHost(&domain_state, | |
| 1054 "www.google-analytics.com", | |
| 1055 false)); | |
| 1056 EXPECT_TRUE(state.HasPinsForHost(&domain_state, | |
| 1057 "www.google-analytics.com", | |
| 1058 true)); | |
| 1059 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "google.com", true)); | |
| 1060 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "www.google.com", true)); | |
| 1061 EXPECT_TRUE(state.HasPinsForHost(&domain_state, | |
| 1062 "mail-attachment.googleusercontent.com", | |
| 1063 true)); | |
| 1064 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "www.youtube.com", true)); | |
| 1065 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "i.ytimg.com", true)); | |
| 1066 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "googleapis.com", true)); | |
| 1067 EXPECT_TRUE(state.HasPinsForHost(&domain_state, | |
| 1068 "ajax.googleapis.com", | |
| 1069 true)); | |
| 1070 EXPECT_TRUE(state.HasPinsForHost(&domain_state, | |
| 1071 "googleadservices.com", | |
| 1072 true)); | |
| 1073 EXPECT_TRUE(state.HasPinsForHost(&domain_state, | |
| 1074 "pagead2.googleadservices.com", | |
| 1075 true)); | |
| 1076 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "googlecode.com", true)); | |
| 1077 EXPECT_TRUE(state.HasPinsForHost(&domain_state, | |
| 1078 "kibbles.googlecode.com", | |
| 1079 true)); | |
| 1080 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "appspot.com", true)); | |
| 1081 EXPECT_TRUE(state.HasPinsForHost(&domain_state, | |
| 1082 "googlesyndication.com", | |
| 1083 true)); | |
| 1084 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "doubleclick.net", true)); | |
| 1085 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "ad.doubleclick.net", true)); | |
| 1086 EXPECT_FALSE(state.HasPinsForHost(&domain_state, | |
| 1087 "learn.doubleclick.net", | |
| 1088 true)); | |
| 1089 EXPECT_TRUE(state.HasPinsForHost(&domain_state, "a.googlegroups.com", true)); | |
| 1090 EXPECT_FALSE(state.HasPinsForHost(&domain_state, | |
| 1091 "a.googlegroups.com", | |
| 1092 false)); | |
| 1093 } | |
| 1094 | 928 |
| 1095 TEST_F(TransportSecurityStateTest, ForcePreloads) { | 929 EXPECT_FALSE(HasPins("www.google-analytics.com", false)); |
| 1096 // This is a docs.google.com override. | 930 EXPECT_TRUE(HasPins("www.google-analytics.com")); |
| 1097 std::string preload("{" | 931 EXPECT_TRUE(HasPins("google.com")); |
| 1098 "\"4AGT3lHihuMSd5rUj7B4u6At0jlSH3HFePovjPR+oLE=\": {" | 932 EXPECT_TRUE(HasPins("www.google.com")); |
| 1099 "\"created\": 0.0," | 933 EXPECT_TRUE(HasPins("mail-attachment.googleusercontent.com")); |
| 1100 "\"expiry\": 2000000000.0," | 934 EXPECT_TRUE(HasPins("www.youtube.com")); |
| 1101 "\"include_subdomains\": false," | 935 EXPECT_TRUE(HasPins("i.ytimg.com")); |
| 1102 "\"mode\": \"pinning-only\"" | 936 EXPECT_TRUE(HasPins("googleapis.com")); |
| 1103 "}}"); | 937 EXPECT_TRUE(HasPins("ajax.googleapis.com")); |
| 1104 | 938 EXPECT_TRUE(HasPins("googleadservices.com")); |
| 1105 TransportSecurityState state(preload); | 939 EXPECT_TRUE(HasPins("pagead2.googleadservices.com")); |
| 1106 TransportSecurityState::DomainState domain_state; | 940 EXPECT_TRUE(HasPins("googlecode.com")); |
| 1107 EXPECT_FALSE(state.HasPinsForHost(&domain_state, "docs.google.com", true)); | 941 EXPECT_TRUE(HasPins("kibbles.googlecode.com")); |
| 1108 EXPECT_TRUE(state.GetDomainState(&domain_state, "docs.google.com", true)); | 942 EXPECT_TRUE(HasPins("appspot.com")); |
| 1109 EXPECT_FALSE(domain_state.ShouldRedirectHTTPToHTTPS()); | 943 EXPECT_TRUE(HasPins("googlesyndication.com")); |
| 944 EXPECT_TRUE(HasPins("doubleclick.net")); |
| 945 EXPECT_TRUE(HasPins("ad.doubleclick.net")); |
| 946 EXPECT_FALSE(HasPins("learn.doubleclick.net")); |
| 947 EXPECT_TRUE(HasPins("a.googlegroups.com")); |
| 948 EXPECT_FALSE(HasPins("a.googlegroups.com", false)); |
| 1110 } | 949 } |
| 1111 | 950 |
| 1112 TEST_F(TransportSecurityStateTest, OverrideBuiltins) { | 951 TEST_F(TransportSecurityStateTest, OverrideBuiltins) { |
| 1113 EXPECT_TRUE(HasPins("google.com")); | 952 EXPECT_TRUE(HasPins("google.com")); |
| 1114 EXPECT_FALSE(ShouldRedirect("google.com")); | 953 EXPECT_FALSE(ShouldRedirect("google.com")); |
| 1115 EXPECT_FALSE(ShouldRedirect("www.google.com")); | 954 EXPECT_FALSE(ShouldRedirect("www.google.com")); |
| 1116 | 955 |
| 1117 TransportSecurityState state(""); | 956 TransportSecurityState state; |
| 1118 TransportSecurityState::DomainState domain_state; | 957 TransportSecurityState::DomainState domain_state; |
| 1119 const base::Time current_time(base::Time::Now()); | 958 const base::Time current_time(base::Time::Now()); |
| 1120 const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000); | 959 const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000); |
| 1121 domain_state.expiry = expiry; | 960 domain_state.upgrade_expiry = expiry; |
| 1122 state.EnableHost("www.google.com", domain_state); | 961 state.EnableHost("www.google.com", domain_state); |
| 1123 | 962 |
| 1124 EXPECT_TRUE(state.GetDomainState(&domain_state, "www.google.com", true)); | 963 EXPECT_TRUE(state.GetDomainState("www.google.com", true, &domain_state)); |
| 1125 } | 964 } |
| 1126 | 965 |
| 1127 static const uint8 kSidePinLeafSPKI[] = { | 966 static const uint8 kSidePinLeafSPKI[] = { |
| 1128 0x30, 0x5c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, | 967 0x30, 0x5c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, |
| 1129 0x01, 0x01, 0x05, 0x00, 0x03, 0x4b, 0x00, 0x30, 0x48, 0x02, 0x41, 0x00, 0xe4, | 968 0x01, 0x01, 0x05, 0x00, 0x03, 0x4b, 0x00, 0x30, 0x48, 0x02, 0x41, 0x00, 0xe4, |
| 1130 0x1d, 0xcc, 0xf2, 0x92, 0xe7, 0x7a, 0xc6, 0x36, 0xf7, 0x1a, 0x62, 0x31, 0x7d, | 969 0x1d, 0xcc, 0xf2, 0x92, 0xe7, 0x7a, 0xc6, 0x36, 0xf7, 0x1a, 0x62, 0x31, 0x7d, |
| 1131 0x37, 0xea, 0x0d, 0xa2, 0xa8, 0x12, 0x2b, 0xc2, 0x1c, 0x82, 0x3e, 0xa5, 0x70, | 970 0x37, 0xea, 0x0d, 0xa2, 0xa8, 0x12, 0x2b, 0xc2, 0x1c, 0x82, 0x3e, 0xa5, 0x70, |
| 1132 0x4a, 0x83, 0x5d, 0x9b, 0x84, 0x82, 0x70, 0xa4, 0x88, 0x98, 0x98, 0x41, 0x29, | 971 0x4a, 0x83, 0x5d, 0x9b, 0x84, 0x82, 0x70, 0xa4, 0x88, 0x98, 0x98, 0x41, 0x29, |
| 1133 0x31, 0xcb, 0x6e, 0x2a, 0x54, 0x65, 0x14, 0x60, 0xcc, 0x00, 0xe8, 0x10, 0x30, | 972 0x31, 0xcb, 0x6e, 0x2a, 0x54, 0x65, 0x14, 0x60, 0xcc, 0x00, 0xe8, 0x10, 0x30, |
| 1134 0x0a, 0x4a, 0xd1, 0xa7, 0x52, 0xfe, 0x2d, 0x31, 0x2a, 0x1d, 0x0d, 0x02, 0x03, | 973 0x0a, 0x4a, 0xd1, 0xa7, 0x52, 0xfe, 0x2d, 0x31, 0x2a, 0x1d, 0x0d, 0x02, 0x03, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1149 0xc3, 0x6e, 0x18, 0xdf, 0x79, 0xc0, 0x59, 0xab, 0xd6, 0x77, 0x37, 0x6a, 0x94, | 988 0xc3, 0x6e, 0x18, 0xdf, 0x79, 0xc0, 0x59, 0xab, 0xd6, 0x77, 0x37, 0x6a, 0x94, |
| 1150 0x5a, 0x7e, 0xfb, 0xa9, 0xc5, 0x54, 0x14, 0x3a, 0x7b, 0x97, 0x17, 0x2a, 0xb6, | 989 0x5a, 0x7e, 0xfb, 0xa9, 0xc5, 0x54, 0x14, 0x3a, 0x7b, 0x97, 0x17, 0x2a, 0xb6, |
| 1151 0x1e, 0x59, 0x4f, 0x2f, 0xb1, 0x15, 0x1a, 0x34, 0x50, 0x32, 0x35, 0x36, | 990 0x1e, 0x59, 0x4f, 0x2f, 0xb1, 0x15, 0x1a, 0x34, 0x50, 0x32, 0x35, 0x36, |
| 1152 }; | 991 }; |
| 1153 | 992 |
| 1154 static const uint8 kSidePinExpectedHash[20] = { | 993 static const uint8 kSidePinExpectedHash[20] = { |
| 1155 0xb5, 0x91, 0x66, 0x47, 0x43, 0x16, 0x62, 0x86, 0xd4, 0x1e, 0x5d, 0x36, 0xe1, | 994 0xb5, 0x91, 0x66, 0x47, 0x43, 0x16, 0x62, 0x86, 0xd4, 0x1e, 0x5d, 0x36, 0xe1, |
| 1156 0xc4, 0x09, 0x3d, 0x2d, 0x1d, 0xea, 0x1e, | 995 0xc4, 0x09, 0x3d, 0x2d, 0x1d, 0xea, 0x1e, |
| 1157 }; | 996 }; |
| 1158 | 997 |
| 1159 TEST_F(TransportSecurityStateTest, ParseSidePins) { | |
| 1160 base::StringPiece leaf_spki(reinterpret_cast<const char*>(kSidePinLeafSPKI), | |
| 1161 sizeof(kSidePinLeafSPKI)); | |
| 1162 base::StringPiece side_info(reinterpret_cast<const char*>(kSidePinInfo), | |
| 1163 sizeof(kSidePinInfo)); | |
| 1164 | |
| 1165 FingerprintVector pub_key_hashes; | |
| 1166 EXPECT_TRUE(TransportSecurityState::ParseSidePin( | |
| 1167 leaf_spki, side_info, &pub_key_hashes)); | |
| 1168 ASSERT_EQ(1u, pub_key_hashes.size()); | |
| 1169 EXPECT_EQ(0, memcmp(pub_key_hashes[0].data, kSidePinExpectedHash, | |
| 1170 sizeof(kSidePinExpectedHash))); | |
| 1171 } | |
| 1172 | |
| 1173 TEST_F(TransportSecurityStateTest, ParseSidePinsFailsWithBadData) { | |
| 1174 uint8 leaf_spki_copy[sizeof(kSidePinLeafSPKI)]; | |
| 1175 memcpy(leaf_spki_copy, kSidePinLeafSPKI, sizeof(leaf_spki_copy)); | |
| 1176 | |
| 1177 uint8 side_info_copy[sizeof(kSidePinInfo)]; | |
| 1178 memcpy(side_info_copy, kSidePinInfo, sizeof(kSidePinInfo)); | |
| 1179 | |
| 1180 base::StringPiece leaf_spki(reinterpret_cast<const char*>(leaf_spki_copy), | |
| 1181 sizeof(leaf_spki_copy)); | |
| 1182 base::StringPiece side_info(reinterpret_cast<const char*>(side_info_copy), | |
| 1183 sizeof(side_info_copy)); | |
| 1184 FingerprintVector pub_key_hashes; | |
| 1185 | |
| 1186 // Tweak |leaf_spki| and expect a failure. | |
| 1187 leaf_spki_copy[10] ^= 1; | |
| 1188 EXPECT_FALSE(TransportSecurityState::ParseSidePin( | |
| 1189 leaf_spki, side_info, &pub_key_hashes)); | |
| 1190 ASSERT_EQ(0u, pub_key_hashes.size()); | |
| 1191 | |
| 1192 // Undo the change to |leaf_spki| and tweak |side_info|. | |
| 1193 leaf_spki_copy[10] ^= 1; | |
| 1194 side_info_copy[30] ^= 1; | |
| 1195 EXPECT_FALSE(TransportSecurityState::ParseSidePin( | |
| 1196 leaf_spki, side_info, &pub_key_hashes)); | |
| 1197 ASSERT_EQ(0u, pub_key_hashes.size()); | |
| 1198 } | |
| 1199 | |
| 1200 TEST_F(TransportSecurityStateTest, DISABLED_ParseSidePinsFuzz) { | |
| 1201 // Disabled because it's too slow for normal tests. Run manually when | |
| 1202 // changing the underlying code. | |
| 1203 | |
| 1204 base::StringPiece leaf_spki(reinterpret_cast<const char*>(kSidePinLeafSPKI), | |
| 1205 sizeof(kSidePinLeafSPKI)); | |
| 1206 uint8 side_info_copy[sizeof(kSidePinInfo)]; | |
| 1207 base::StringPiece side_info(reinterpret_cast<const char*>(side_info_copy), | |
| 1208 sizeof(side_info_copy)); | |
| 1209 FingerprintVector pub_key_hashes; | |
| 1210 static const size_t bit_length = sizeof(kSidePinInfo) * 8; | |
| 1211 | |
| 1212 for (size_t bit_to_flip = 0; bit_to_flip < bit_length; bit_to_flip++) { | |
| 1213 memcpy(side_info_copy, kSidePinInfo, sizeof(kSidePinInfo)); | |
| 1214 | |
| 1215 size_t byte = bit_to_flip >> 3; | |
| 1216 size_t bit = bit_to_flip & 7; | |
| 1217 side_info_copy[byte] ^= (1 << bit); | |
| 1218 | |
| 1219 EXPECT_FALSE(TransportSecurityState::ParseSidePin( | |
| 1220 leaf_spki, side_info, &pub_key_hashes)); | |
| 1221 ASSERT_EQ(0u, pub_key_hashes.size()); | |
| 1222 } | |
| 1223 } | |
| 1224 | |
| 1225 TEST_F(TransportSecurityStateTest, GooglePinnedProperties) { | 998 TEST_F(TransportSecurityStateTest, GooglePinnedProperties) { |
| 1226 EXPECT_FALSE(TransportSecurityState::IsGooglePinnedProperty( | 999 EXPECT_FALSE(TransportSecurityState::IsGooglePinnedProperty( |
| 1227 "www.example.com", true)); | 1000 "www.example.com", true)); |
| 1228 EXPECT_FALSE(TransportSecurityState::IsGooglePinnedProperty( | 1001 EXPECT_FALSE(TransportSecurityState::IsGooglePinnedProperty( |
| 1229 "www.paypal.com", true)); | 1002 "www.paypal.com", true)); |
| 1230 EXPECT_FALSE(TransportSecurityState::IsGooglePinnedProperty( | 1003 EXPECT_FALSE(TransportSecurityState::IsGooglePinnedProperty( |
| 1231 "mail.twitter.com", true)); | 1004 "mail.twitter.com", true)); |
| 1232 EXPECT_FALSE(TransportSecurityState::IsGooglePinnedProperty( | 1005 EXPECT_FALSE(TransportSecurityState::IsGooglePinnedProperty( |
| 1233 "www.google.com.int", true)); | 1006 "www.google.com.int", true)); |
| 1234 EXPECT_FALSE(TransportSecurityState::IsGooglePinnedProperty( | 1007 EXPECT_FALSE(TransportSecurityState::IsGooglePinnedProperty( |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1279 // Expect to fail for SNI hosts when not searching the SNI list: | 1052 // Expect to fail for SNI hosts when not searching the SNI list: |
| 1280 EXPECT_FALSE(TransportSecurityState::IsGooglePinnedProperty( | 1053 EXPECT_FALSE(TransportSecurityState::IsGooglePinnedProperty( |
| 1281 "gmail.com", false)); | 1054 "gmail.com", false)); |
| 1282 EXPECT_FALSE(TransportSecurityState::IsGooglePinnedProperty( | 1055 EXPECT_FALSE(TransportSecurityState::IsGooglePinnedProperty( |
| 1283 "googlegroups.com", false)); | 1056 "googlegroups.com", false)); |
| 1284 EXPECT_FALSE(TransportSecurityState::IsGooglePinnedProperty( | 1057 EXPECT_FALSE(TransportSecurityState::IsGooglePinnedProperty( |
| 1285 "www.googlegroups.com", false)); | 1058 "www.googlegroups.com", false)); |
| 1286 } | 1059 } |
| 1287 | 1060 |
| 1288 } // namespace net | 1061 } // namespace net |
| OLD | NEW |