| 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/cert/cert_verify_proc.h" | 5 #include "net/cert/cert_verify_proc.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/callback_helpers.h" | 9 #include "base/callback_helpers.h" |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 const std::string& ocsp_response, | 93 const std::string& ocsp_response, |
| 94 int flags, | 94 int flags, |
| 95 CRLSet* crl_set, | 95 CRLSet* crl_set, |
| 96 const CertificateList& additional_trust_anchors, | 96 const CertificateList& additional_trust_anchors, |
| 97 CertVerifyResult* verify_result) { | 97 CertVerifyResult* verify_result) { |
| 98 *verify_result = result_; | 98 *verify_result = result_; |
| 99 verify_result->verified_cert = cert; | 99 verify_result->verified_cert = cert; |
| 100 return OK; | 100 return OK; |
| 101 } | 101 } |
| 102 | 102 |
| 103 bool SupportsReturningVerifiedChain() { | 103 // This enum identifies a concrete implemenation of CertVerifyProc. |
| 104 #if defined(OS_ANDROID) | 104 // |
| 105 // Before API level 17, Android does not expose the APIs necessary to get at | 105 // The type is erased by CertVerifyProc::CreateDefault(), however |
| 106 // the verified certificate chain. | 106 // needs to be known for some of the test expectations. |
| 107 if (base::android::BuildInfo::GetInstance()->sdk_int() < 17) | 107 enum CertVerifyProcType { |
| 108 return false; | 108 CERT_VERIFY_PROC_NSS, |
| 109 #endif | 109 CERT_VERIFY_PROC_OPENSSL, |
| 110 return true; | 110 CERT_VERIFY_PROC_ANDROID, |
| 111 } | 111 CERT_VERIFY_PROC_IOS, |
| 112 CERT_VERIFY_PROC_MAC, |
| 113 CERT_VERIFY_PROC_WIN, |
| 114 }; |
| 112 | 115 |
| 113 bool SupportsDetectingKnownRoots() { | 116 // Returns the CertVerifyProcType corresponding to what |
| 114 #if defined(OS_ANDROID) | 117 // CertVerifyProc::CreateDefault() returns. This needs to be kept in sync with |
| 115 // Before API level 17, Android does not expose the APIs necessary to get at | 118 // CreateDefault(). |
| 116 // the verified certificate chain and detect known roots. | 119 CertVerifyProcType GetDefaultCertVerifyProcType() { |
| 117 if (base::android::BuildInfo::GetInstance()->sdk_int() < 17) | 120 #if defined(USE_NSS_CERTS) |
| 118 return false; | 121 return CERT_VERIFY_PROC_NSS; |
| 122 #elif defined(USE_OPENSSL_CERTS) && !defined(OS_ANDROID) |
| 123 return CERT_VERIFY_PROC_OPENSSL; |
| 124 #elif defined(OS_ANDROID) |
| 125 return CERT_VERIFY_PROC_ANDROID; |
| 119 #elif defined(OS_IOS) | 126 #elif defined(OS_IOS) |
| 120 // iOS does not expose the APIs necessary to get the known system roots. | 127 return CERT_VERIFY_PROC_IOS; |
| 121 return false; | 128 #elif defined(OS_MACOSX) |
| 122 #endif | 129 return CERT_VERIFY_PROC_MAC; |
| 123 return true; | 130 #elif defined(OS_WIN) |
| 124 } | 131 return CERT_VERIFY_PROC_WIN; |
| 125 | |
| 126 bool WeakKeysAreInvalid() { | |
| 127 #if defined(OS_MACOSX) && !defined(OS_IOS) | |
| 128 // Starting with Mac OS 10.12, certs with weak keys are treated as | |
| 129 // (recoverable) invalid certificate errors. | |
| 130 return base::mac::IsAtLeastOS10_12(); | |
| 131 #else | 132 #else |
| 132 return false; | 133 // Will fail to compile. |
| 133 #endif | 134 #endif |
| 134 } | 135 } |
| 135 | 136 |
| 137 // Whether the test is running within the iphone simulator. |
| 138 const bool kTargetIsIphoneSimulator = |
| 139 #if TARGET_IPHONE_SIMULATOR |
| 140 true; |
| 141 #else |
| 142 false; |
| 143 #endif |
| 144 |
| 136 // Template helper to load a series of certificate files into a CertificateList. | 145 // Template helper to load a series of certificate files into a CertificateList. |
| 137 // Like CertTestUtil's CreateCertificateListFromFile, except it can load a | 146 // Like CertTestUtil's CreateCertificateListFromFile, except it can load a |
| 138 // series of individual certificates (to make the tests clearer). | 147 // series of individual certificates (to make the tests clearer). |
| 139 template <size_t N> | 148 template <size_t N> |
| 140 void LoadCertificateFiles(const char* const (&cert_files)[N], | 149 void LoadCertificateFiles(const char* const (&cert_files)[N], |
| 141 CertificateList* certs) { | 150 CertificateList* certs) { |
| 142 certs->clear(); | 151 certs->clear(); |
| 143 for (size_t i = 0; i < N; ++i) { | 152 for (size_t i = 0; i < N; ++i) { |
| 144 SCOPED_TRACE(cert_files[i]); | 153 SCOPED_TRACE(cert_files[i]); |
| 145 scoped_refptr<X509Certificate> cert = CreateCertificateChainFromFile( | 154 scoped_refptr<X509Certificate> cert = CreateCertificateChainFromFile( |
| 146 GetTestCertsDirectory(), cert_files[i], X509Certificate::FORMAT_AUTO); | 155 GetTestCertsDirectory(), cert_files[i], X509Certificate::FORMAT_AUTO); |
| 147 ASSERT_TRUE(cert); | 156 ASSERT_TRUE(cert); |
| 148 certs->push_back(cert); | 157 certs->push_back(cert); |
| 149 } | 158 } |
| 150 } | 159 } |
| 151 | 160 |
| 161 // Returns a textual description of the CertVerifyProc implementation |
| 162 // that is being tested, used to give better names to parameterized |
| 163 // tests. |
| 164 std::string VerifyProcTypeToName( |
| 165 const testing::TestParamInfo<CertVerifyProcType>& params) { |
| 166 switch (params.param) { |
| 167 case CERT_VERIFY_PROC_NSS: |
| 168 return "CertVerifyProcNSS"; |
| 169 case CERT_VERIFY_PROC_OPENSSL: |
| 170 return "CertVerifyProcOpenSSL"; |
| 171 case CERT_VERIFY_PROC_ANDROID: |
| 172 return "CertVerifyProcAndroid"; |
| 173 case CERT_VERIFY_PROC_IOS: |
| 174 return "CertVerifyProcIOS"; |
| 175 case CERT_VERIFY_PROC_MAC: |
| 176 return "CertVerifyProcMac"; |
| 177 case CERT_VERIFY_PROC_WIN: |
| 178 return "CertVerifyProcWin"; |
| 179 } |
| 180 |
| 181 return nullptr; |
| 182 } |
| 183 |
| 184 // The set of all CertVerifyProcTypes that tests should be |
| 185 // parameterized on. |
| 186 const std::vector<CertVerifyProcType> kAllCertVerifiers = { |
| 187 GetDefaultCertVerifyProcType()}; |
| 188 |
| 152 } // namespace | 189 } // namespace |
| 153 | 190 |
| 154 class CertVerifyProcTest : public testing::Test { | 191 // This fixture is for tests that apply to concrete implementations of |
| 155 public: | 192 // CertVerifyProc. It will be run for all of the concrete |
| 156 CertVerifyProcTest() | 193 // CertVerifyProc types. |
| 157 : verify_proc_(CertVerifyProc::CreateDefault()) { | 194 // |
| 158 } | 195 // It is called "Internal" as it tests the internal methods like |
| 159 ~CertVerifyProcTest() override {} | 196 // "VerifyInternal()". |
| 160 | 197 class CertVerifyProcInternalTest |
| 198 : public testing::TestWithParam<CertVerifyProcType> { |
| 161 protected: | 199 protected: |
| 162 bool SupportsAdditionalTrustAnchors() { | 200 void SetUp() override { |
| 163 return verify_proc_->SupportsAdditionalTrustAnchors(); | 201 EXPECT_EQ(verify_proc_type(), GetDefaultCertVerifyProcType()); |
| 164 } | 202 verify_proc_ = CertVerifyProc::CreateDefault(); |
| 165 | |
| 166 // Returns true if the underlying CertVerifyProc supports integrating CRLSets | |
| 167 // into path building logic, such as allowing the selection of alternatively | |
| 168 // valid paths when one or more are revoked. As the goal is to integrate this | |
| 169 // into all platforms, this is a temporary, test-only flag to centralize the | |
| 170 // conditionals in tests. | |
| 171 bool SupportsCRLSetsInPathBuilding() { | |
| 172 #if defined(OS_WIN) || defined(USE_NSS_CERTS) | |
| 173 return true; | |
| 174 #else | |
| 175 return false; | |
| 176 #endif | |
| 177 } | 203 } |
| 178 | 204 |
| 179 int Verify(X509Certificate* cert, | 205 int Verify(X509Certificate* cert, |
| 180 const std::string& hostname, | 206 const std::string& hostname, |
| 181 int flags, | 207 int flags, |
| 182 CRLSet* crl_set, | 208 CRLSet* crl_set, |
| 183 const CertificateList& additional_trust_anchors, | 209 const CertificateList& additional_trust_anchors, |
| 184 CertVerifyResult* verify_result) { | 210 CertVerifyResult* verify_result) { |
| 185 return verify_proc_->Verify(cert, hostname, std::string(), flags, crl_set, | 211 return verify_proc_->Verify(cert, hostname, std::string(), flags, crl_set, |
| 186 additional_trust_anchors, verify_result); | 212 additional_trust_anchors, verify_result); |
| 187 } | 213 } |
| 188 | 214 |
| 189 int VerifyWithOCSPResponse(X509Certificate* cert, | 215 CertVerifyProcType verify_proc_type() const { return GetParam(); } |
| 190 const std::string& hostname, | 216 |
| 191 const std::string& ocsp_response, | 217 bool SupportsAdditionalTrustAnchors() const { |
| 192 int flags, | 218 return verify_proc_->SupportsAdditionalTrustAnchors(); |
| 193 CRLSet* crl_set, | |
| 194 const CertificateList& additional_trust_anchors, | |
| 195 CertVerifyResult* verify_result) { | |
| 196 return verify_proc_->Verify(cert, hostname, ocsp_response, flags, crl_set, | |
| 197 additional_trust_anchors, verify_result); | |
| 198 } | 219 } |
| 199 | 220 |
| 200 const CertificateList empty_cert_list_; | 221 bool SupportsReturningVerifiedChain() const { |
| 222 #if defined(OS_ANDROID) |
| 223 // Before API level 17, Android does not expose the APIs necessary to get at |
| 224 // the verified certificate chain. |
| 225 if (verify_proc_type() == CERT_VERIFY_PROC_ANDROID && |
| 226 base::android::BuildInfo::GetInstance()->sdk_int() < 17) |
| 227 return false; |
| 228 #endif |
| 229 return true; |
| 230 } |
| 231 |
| 232 bool SupportsDetectingKnownRoots() const { |
| 233 #if defined(OS_ANDROID) |
| 234 // Before API level 17, Android does not expose the APIs necessary to get at |
| 235 // the verified certificate chain and detect known roots. |
| 236 if (verify_proc_type() == CERT_VERIFY_PROC_ANDROID) |
| 237 return base::android::BuildInfo::GetInstance()->sdk_int() >= 17; |
| 238 #endif |
| 239 |
| 240 // iOS does not expose the APIs necessary to get the known system roots. |
| 241 if (verify_proc_type() == CERT_VERIFY_PROC_IOS) |
| 242 return false; |
| 243 |
| 244 return true; |
| 245 } |
| 246 |
| 247 bool WeakKeysAreInvalid() const { |
| 248 #if defined(OS_MACOSX) && !defined(OS_IOS) |
| 249 // Starting with Mac OS 10.12, certs with weak keys are treated as |
| 250 // (recoverable) invalid certificate errors. |
| 251 if (verify_proc_type() == CERT_VERIFY_PROC_MAC && |
| 252 base::mac::IsAtLeastOS10_12()) { |
| 253 return true; |
| 254 } |
| 255 #endif |
| 256 return false; |
| 257 } |
| 258 |
| 259 bool SupportsCRLSet() const { |
| 260 return verify_proc_type() == CERT_VERIFY_PROC_NSS || |
| 261 verify_proc_type() == CERT_VERIFY_PROC_WIN || |
| 262 verify_proc_type() == CERT_VERIFY_PROC_MAC; |
| 263 } |
| 264 |
| 265 bool SupportsCRLSetsInPathBuilding() const { |
| 266 return verify_proc_type() == CERT_VERIFY_PROC_WIN || |
| 267 verify_proc_type() == CERT_VERIFY_PROC_NSS; |
| 268 } |
| 269 |
| 270 CertVerifyProc* verify_proc() const { return verify_proc_.get(); } |
| 271 |
| 272 private: |
| 201 scoped_refptr<CertVerifyProc> verify_proc_; | 273 scoped_refptr<CertVerifyProc> verify_proc_; |
| 202 }; | 274 }; |
| 203 | 275 |
| 204 #if defined(OS_ANDROID) || defined(USE_OPENSSL_CERTS) | 276 INSTANTIATE_TEST_CASE_P(, |
| 205 // TODO(jnd): http://crbug.com/117478 - EV verification is not yet supported. | 277 CertVerifyProcInternalTest, |
| 206 #define MAYBE_EVVerification DISABLED_EVVerification | 278 testing::ValuesIn(kAllCertVerifiers), |
| 207 #else | 279 VerifyProcTypeToName); |
| 280 |
| 208 // TODO(rsleevi): Reenable this test once comodo.chaim.pem is no longer | 281 // TODO(rsleevi): Reenable this test once comodo.chaim.pem is no longer |
| 209 // expired, http://crbug.com/502818 | 282 // expired, http://crbug.com/502818 |
| 210 #define MAYBE_EVVerification DISABLED_EVVerification | 283 TEST_P(CertVerifyProcInternalTest, DISABLED_EVVerification) { |
| 211 #endif | 284 if (verify_proc_type() == CERT_VERIFY_PROC_ANDROID || |
| 212 TEST_F(CertVerifyProcTest, MAYBE_EVVerification) { | 285 verify_proc_type() == CERT_VERIFY_PROC_OPENSSL) { |
| 213 CertificateList certs = CreateCertificateListFromFile( | 286 // TODO(jnd): http://crbug.com/117478 - EV verification is not yet |
| 214 GetTestCertsDirectory(), | 287 // supported. |
| 215 "comodo.chain.pem", | 288 LOG(INFO) << "Skipping test as EV verification is not yet supported"; |
| 216 X509Certificate::FORMAT_PEM_CERT_SEQUENCE); | 289 return; |
| 290 } |
| 291 |
| 292 CertificateList certs = |
| 293 CreateCertificateListFromFile(GetTestCertsDirectory(), "comodo.chain.pem", |
| 294 X509Certificate::FORMAT_PEM_CERT_SEQUENCE); |
| 217 ASSERT_EQ(3U, certs.size()); | 295 ASSERT_EQ(3U, certs.size()); |
| 218 | 296 |
| 219 X509Certificate::OSCertHandles intermediates; | 297 X509Certificate::OSCertHandles intermediates; |
| 220 intermediates.push_back(certs[1]->os_cert_handle()); | 298 intermediates.push_back(certs[1]->os_cert_handle()); |
| 221 intermediates.push_back(certs[2]->os_cert_handle()); | 299 intermediates.push_back(certs[2]->os_cert_handle()); |
| 222 | 300 |
| 223 scoped_refptr<X509Certificate> comodo_chain = | 301 scoped_refptr<X509Certificate> comodo_chain = |
| 224 X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(), | 302 X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(), |
| 225 intermediates); | 303 intermediates); |
| 226 | 304 |
| 227 scoped_refptr<CRLSet> crl_set(CRLSet::ForTesting(false, NULL, "")); | 305 scoped_refptr<CRLSet> crl_set(CRLSet::ForTesting(false, NULL, "")); |
| 228 CertVerifyResult verify_result; | 306 CertVerifyResult verify_result; |
| 229 int flags = CertVerifier::VERIFY_EV_CERT; | 307 int flags = CertVerifier::VERIFY_EV_CERT; |
| 230 int error = Verify(comodo_chain.get(), | 308 int error = Verify(comodo_chain.get(), "comodo.com", flags, crl_set.get(), |
| 231 "comodo.com", | 309 CertificateList(), &verify_result); |
| 232 flags, | |
| 233 crl_set.get(), | |
| 234 empty_cert_list_, | |
| 235 &verify_result); | |
| 236 EXPECT_THAT(error, IsOk()); | 310 EXPECT_THAT(error, IsOk()); |
| 237 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_IS_EV); | 311 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_IS_EV); |
| 238 } | 312 } |
| 239 | 313 |
| 240 // TODO(crbug.com/605457): the test expectation was incorrect on some | 314 // TODO(crbug.com/605457): the test expectation was incorrect on some |
| 241 // configurations, so disable the test until it is fixed (better to have | 315 // configurations, so disable the test until it is fixed (better to have |
| 242 // a bug to track a failing test than a false sense of security due to | 316 // a bug to track a failing test than a false sense of security due to |
| 243 // false positive). | 317 // false positive). |
| 244 TEST_F(CertVerifyProcTest, DISABLED_PaypalNullCertParsing) { | 318 TEST_P(CertVerifyProcInternalTest, DISABLED_PaypalNullCertParsing) { |
| 245 // A certificate for www.paypal.com with a NULL byte in the common name. | 319 // A certificate for www.paypal.com with a NULL byte in the common name. |
| 246 // From http://www.gossamer-threads.com/lists/fulldisc/full-disclosure/70363 | 320 // From http://www.gossamer-threads.com/lists/fulldisc/full-disclosure/70363 |
| 247 SHA256HashValue paypal_null_fingerprint = {{0x00}}; | 321 SHA256HashValue paypal_null_fingerprint = {{0x00}}; |
| 248 | 322 |
| 249 scoped_refptr<X509Certificate> paypal_null_cert( | 323 scoped_refptr<X509Certificate> paypal_null_cert( |
| 250 X509Certificate::CreateFromBytes( | 324 X509Certificate::CreateFromBytes( |
| 251 reinterpret_cast<const char*>(paypal_null_der), | 325 reinterpret_cast<const char*>(paypal_null_der), |
| 252 sizeof(paypal_null_der))); | 326 sizeof(paypal_null_der))); |
| 253 | 327 |
| 254 ASSERT_NE(static_cast<X509Certificate*>(NULL), paypal_null_cert.get()); | 328 ASSERT_NE(static_cast<X509Certificate*>(NULL), paypal_null_cert.get()); |
| 255 | 329 |
| 256 EXPECT_EQ(paypal_null_fingerprint, X509Certificate::CalculateFingerprint256( | 330 EXPECT_EQ(paypal_null_fingerprint, X509Certificate::CalculateFingerprint256( |
| 257 paypal_null_cert->os_cert_handle())); | 331 paypal_null_cert->os_cert_handle())); |
| 258 | 332 |
| 259 int flags = 0; | 333 int flags = 0; |
| 260 CertVerifyResult verify_result; | 334 CertVerifyResult verify_result; |
| 261 int error = Verify(paypal_null_cert.get(), | 335 int error = Verify(paypal_null_cert.get(), "www.paypal.com", flags, NULL, |
| 262 "www.paypal.com", | 336 CertificateList(), &verify_result); |
| 263 flags, | 337 |
| 264 NULL, | 338 if (verify_proc_type() == CERT_VERIFY_PROC_NSS || |
| 265 empty_cert_list_, | 339 verify_proc_type() == CERT_VERIFY_PROC_ANDROID) { |
| 266 &verify_result); | 340 EXPECT_THAT(error, IsError(ERR_CERT_COMMON_NAME_INVALID)); |
| 267 #if defined(USE_NSS_CERTS) || defined(OS_ANDROID) | 341 } else if (verify_proc_type() == CERT_VERIFY_PROC_IOS && |
| 268 EXPECT_THAT(error, IsError(ERR_CERT_COMMON_NAME_INVALID)); | 342 kTargetIsIphoneSimulator) { |
| 269 #elif defined(OS_IOS) && TARGET_IPHONE_SIMULATOR | 343 // iOS returns a ERR_CERT_INVALID error on the simulator, while returning |
| 270 // iOS returns a ERR_CERT_INVALID error on the simulator, while returning | 344 // ERR_CERT_AUTHORITY_INVALID on the real device. |
| 271 // ERR_CERT_AUTHORITY_INVALID on the real device. | 345 EXPECT_THAT(error, IsError(ERR_CERT_INVALID)); |
| 272 EXPECT_THAT(error, IsError(ERR_CERT_INVALID)); | 346 } else { |
| 273 #else | 347 // TOOD(bulach): investigate why macosx and win aren't returning |
| 274 // TOOD(bulach): investigate why macosx and win aren't returning | 348 // ERR_CERT_INVALID or ERR_CERT_COMMON_NAME_INVALID. |
| 275 // ERR_CERT_INVALID or ERR_CERT_COMMON_NAME_INVALID. | 349 EXPECT_THAT(error, IsError(ERR_CERT_AUTHORITY_INVALID)); |
| 276 EXPECT_THAT(error, IsError(ERR_CERT_AUTHORITY_INVALID)); | 350 } |
| 277 #endif | 351 |
| 278 // Either the system crypto library should correctly report a certificate | 352 // Either the system crypto library should correctly report a certificate |
| 279 // name mismatch, or our certificate blacklist should cause us to report an | 353 // name mismatch, or our certificate blacklist should cause us to report an |
| 280 // invalid certificate. | 354 // invalid certificate. |
| 281 #if defined(USE_NSS_CERTS) || defined(OS_WIN) | 355 if (verify_proc_type() == CERT_VERIFY_PROC_NSS || |
| 282 EXPECT_TRUE(verify_result.cert_status & | 356 verify_proc_type() == CERT_VERIFY_PROC_WIN) { |
| 283 (CERT_STATUS_COMMON_NAME_INVALID | CERT_STATUS_INVALID)); | 357 EXPECT_TRUE(verify_result.cert_status & |
| 284 #endif | 358 (CERT_STATUS_COMMON_NAME_INVALID | CERT_STATUS_INVALID)); |
| 359 } |
| 360 |
| 361 // TODO(crbug.com/649017): What expectations to use for the other verifiers? |
| 285 } | 362 } |
| 286 | 363 |
| 287 // A regression test for http://crbug.com/31497. | 364 // A regression test for http://crbug.com/31497. |
| 288 #if defined(OS_ANDROID) | 365 TEST_P(CertVerifyProcInternalTest, IntermediateCARequireExplicitPolicy) { |
| 289 // Disabled on Android, as the Android verification libraries require an | 366 if (verify_proc_type() == CERT_VERIFY_PROC_ANDROID) { |
| 290 // explicit policy to be specified, even when anyPolicy is permitted. | 367 // Disabled on Android, as the Android verification libraries require an |
| 291 #define MAYBE_IntermediateCARequireExplicitPolicy \ | 368 // explicit policy to be specified, even when anyPolicy is permitted. |
| 292 DISABLED_IntermediateCARequireExplicitPolicy | 369 LOG(INFO) << "Skipping test on Android"; |
| 293 #else | 370 return; |
| 294 #define MAYBE_IntermediateCARequireExplicitPolicy \ | 371 } |
| 295 IntermediateCARequireExplicitPolicy | 372 |
| 296 #endif | |
| 297 TEST_F(CertVerifyProcTest, MAYBE_IntermediateCARequireExplicitPolicy) { | |
| 298 base::FilePath certs_dir = GetTestCertsDirectory(); | 373 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 299 | 374 |
| 300 CertificateList certs = CreateCertificateListFromFile( | 375 CertificateList certs = CreateCertificateListFromFile( |
| 301 certs_dir, "explicit-policy-chain.pem", | 376 certs_dir, "explicit-policy-chain.pem", X509Certificate::FORMAT_AUTO); |
| 302 X509Certificate::FORMAT_AUTO); | |
| 303 ASSERT_EQ(3U, certs.size()); | 377 ASSERT_EQ(3U, certs.size()); |
| 304 | 378 |
| 305 X509Certificate::OSCertHandles intermediates; | 379 X509Certificate::OSCertHandles intermediates; |
| 306 intermediates.push_back(certs[1]->os_cert_handle()); | 380 intermediates.push_back(certs[1]->os_cert_handle()); |
| 307 | 381 |
| 308 scoped_refptr<X509Certificate> cert = | 382 scoped_refptr<X509Certificate> cert = X509Certificate::CreateFromHandle( |
| 309 X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(), | 383 certs[0]->os_cert_handle(), intermediates); |
| 310 intermediates); | |
| 311 ASSERT_TRUE(cert.get()); | 384 ASSERT_TRUE(cert.get()); |
| 312 | 385 |
| 313 ScopedTestRoot scoped_root(certs[2].get()); | 386 ScopedTestRoot scoped_root(certs[2].get()); |
| 314 | 387 |
| 315 int flags = 0; | 388 int flags = 0; |
| 316 CertVerifyResult verify_result; | 389 CertVerifyResult verify_result; |
| 317 int error = Verify(cert.get(), | 390 int error = Verify(cert.get(), "policy_test.example", flags, NULL, |
| 318 "policy_test.example", | 391 CertificateList(), &verify_result); |
| 319 flags, | |
| 320 NULL, | |
| 321 empty_cert_list_, | |
| 322 &verify_result); | |
| 323 EXPECT_THAT(error, IsOk()); | 392 EXPECT_THAT(error, IsOk()); |
| 324 EXPECT_EQ(0u, verify_result.cert_status); | 393 EXPECT_EQ(0u, verify_result.cert_status); |
| 325 } | 394 } |
| 326 | 395 |
| 327 TEST_F(CertVerifyProcTest, RejectExpiredCert) { | 396 TEST_P(CertVerifyProcInternalTest, RejectExpiredCert) { |
| 328 base::FilePath certs_dir = GetTestCertsDirectory(); | 397 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 329 | 398 |
| 330 // Load root_ca_cert.pem into the test root store. | 399 // Load root_ca_cert.pem into the test root store. |
| 331 ScopedTestRoot test_root( | 400 ScopedTestRoot test_root( |
| 332 ImportCertFromFile(certs_dir, "root_ca_cert.pem").get()); | 401 ImportCertFromFile(certs_dir, "root_ca_cert.pem").get()); |
| 333 | 402 |
| 334 CertificateList certs = CreateCertificateListFromFile( | 403 CertificateList certs = CreateCertificateListFromFile( |
| 335 certs_dir, "expired_cert.pem", X509Certificate::FORMAT_AUTO); | 404 certs_dir, "expired_cert.pem", X509Certificate::FORMAT_AUTO); |
| 336 ASSERT_EQ(1U, certs.size()); | 405 ASSERT_EQ(1U, certs.size()); |
| 337 | 406 |
| 338 X509Certificate::OSCertHandles intermediates; | 407 X509Certificate::OSCertHandles intermediates; |
| 339 scoped_refptr<X509Certificate> cert = X509Certificate::CreateFromHandle( | 408 scoped_refptr<X509Certificate> cert = X509Certificate::CreateFromHandle( |
| 340 certs[0]->os_cert_handle(), intermediates); | 409 certs[0]->os_cert_handle(), intermediates); |
| 341 | 410 |
| 342 int flags = 0; | 411 int flags = 0; |
| 343 CertVerifyResult verify_result; | 412 CertVerifyResult verify_result; |
| 344 int error = Verify(cert.get(), "127.0.0.1", flags, NULL, empty_cert_list_, | 413 int error = Verify(cert.get(), "127.0.0.1", flags, NULL, CertificateList(), |
| 345 &verify_result); | 414 &verify_result); |
| 346 EXPECT_THAT(error, IsError(ERR_CERT_DATE_INVALID)); | 415 EXPECT_THAT(error, IsError(ERR_CERT_DATE_INVALID)); |
| 347 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_DATE_INVALID); | 416 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_DATE_INVALID); |
| 348 } | 417 } |
| 349 | 418 |
| 350 // Currently, only RSA and DSA keys are checked for weakness, and our example | 419 // Currently, only RSA and DSA keys are checked for weakness, and our example |
| 351 // weak size is 768. These could change in the future. | 420 // weak size is 768. These could change in the future. |
| 352 // | 421 // |
| 353 // Note that this means there may be false negatives: keys for other | 422 // Note that this means there may be false negatives: keys for other |
| 354 // algorithms and which are weak will pass this test. | 423 // algorithms and which are weak will pass this test. |
| 355 static bool IsWeakKeyType(const std::string& key_type) { | 424 static bool IsWeakKeyType(const std::string& key_type) { |
| 356 size_t pos = key_type.find("-"); | 425 size_t pos = key_type.find("-"); |
| 357 std::string size = key_type.substr(0, pos); | 426 std::string size = key_type.substr(0, pos); |
| 358 std::string type = key_type.substr(pos + 1); | 427 std::string type = key_type.substr(pos + 1); |
| 359 | 428 |
| 360 if (type == "rsa" || type == "dsa") | 429 if (type == "rsa" || type == "dsa") |
| 361 return size == "768"; | 430 return size == "768"; |
| 362 | 431 |
| 363 return false; | 432 return false; |
| 364 } | 433 } |
| 365 | 434 |
| 366 TEST_F(CertVerifyProcTest, RejectWeakKeys) { | 435 TEST_P(CertVerifyProcInternalTest, RejectWeakKeys) { |
| 367 base::FilePath certs_dir = GetTestCertsDirectory(); | 436 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 368 typedef std::vector<std::string> Strings; | 437 typedef std::vector<std::string> Strings; |
| 369 Strings key_types; | 438 Strings key_types; |
| 370 | 439 |
| 371 // generate-weak-test-chains.sh currently has: | 440 // generate-weak-test-chains.sh currently has: |
| 372 // key_types="768-rsa 1024-rsa 2048-rsa prime256v1-ecdsa" | 441 // key_types="768-rsa 1024-rsa 2048-rsa prime256v1-ecdsa" |
| 373 // We must use the same key types here. The filenames generated look like: | 442 // We must use the same key types here. The filenames generated look like: |
| 374 // 2048-rsa-ee-by-768-rsa-intermediate.pem | 443 // 2048-rsa-ee-by-768-rsa-intermediate.pem |
| 375 key_types.push_back("768-rsa"); | 444 key_types.push_back("768-rsa"); |
| 376 key_types.push_back("1024-rsa"); | 445 key_types.push_back("1024-rsa"); |
| 377 key_types.push_back("2048-rsa"); | 446 key_types.push_back("2048-rsa"); |
| 378 key_types.push_back("prime256v1-ecdsa"); | 447 key_types.push_back("prime256v1-ecdsa"); |
| 379 | 448 |
| 380 // Add the root that signed the intermediates for this test. | 449 // Add the root that signed the intermediates for this test. |
| 381 scoped_refptr<X509Certificate> root_cert = | 450 scoped_refptr<X509Certificate> root_cert = |
| 382 ImportCertFromFile(certs_dir, "2048-rsa-root.pem"); | 451 ImportCertFromFile(certs_dir, "2048-rsa-root.pem"); |
| 383 ASSERT_NE(static_cast<X509Certificate*>(NULL), root_cert.get()); | 452 ASSERT_NE(static_cast<X509Certificate*>(NULL), root_cert.get()); |
| 384 ScopedTestRoot scoped_root(root_cert.get()); | 453 ScopedTestRoot scoped_root(root_cert.get()); |
| 385 | 454 |
| 386 // Now test each chain. | 455 // Now test each chain. |
| 387 for (Strings::const_iterator ee_type = key_types.begin(); | 456 for (Strings::const_iterator ee_type = key_types.begin(); |
| 388 ee_type != key_types.end(); ++ee_type) { | 457 ee_type != key_types.end(); ++ee_type) { |
| 389 for (Strings::const_iterator signer_type = key_types.begin(); | 458 for (Strings::const_iterator signer_type = key_types.begin(); |
| 390 signer_type != key_types.end(); ++signer_type) { | 459 signer_type != key_types.end(); ++signer_type) { |
| 391 std::string basename = *ee_type + "-ee-by-" + *signer_type + | 460 std::string basename = |
| 392 "-intermediate.pem"; | 461 *ee_type + "-ee-by-" + *signer_type + "-intermediate.pem"; |
| 393 SCOPED_TRACE(basename); | 462 SCOPED_TRACE(basename); |
| 394 scoped_refptr<X509Certificate> ee_cert = | 463 scoped_refptr<X509Certificate> ee_cert = |
| 395 ImportCertFromFile(certs_dir, basename); | 464 ImportCertFromFile(certs_dir, basename); |
| 396 ASSERT_NE(static_cast<X509Certificate*>(NULL), ee_cert.get()); | 465 ASSERT_NE(static_cast<X509Certificate*>(NULL), ee_cert.get()); |
| 397 | 466 |
| 398 basename = *signer_type + "-intermediate.pem"; | 467 basename = *signer_type + "-intermediate.pem"; |
| 399 scoped_refptr<X509Certificate> intermediate = | 468 scoped_refptr<X509Certificate> intermediate = |
| 400 ImportCertFromFile(certs_dir, basename); | 469 ImportCertFromFile(certs_dir, basename); |
| 401 ASSERT_NE(static_cast<X509Certificate*>(NULL), intermediate.get()); | 470 ASSERT_NE(static_cast<X509Certificate*>(NULL), intermediate.get()); |
| 402 | 471 |
| 403 X509Certificate::OSCertHandles intermediates; | 472 X509Certificate::OSCertHandles intermediates; |
| 404 intermediates.push_back(intermediate->os_cert_handle()); | 473 intermediates.push_back(intermediate->os_cert_handle()); |
| 405 scoped_refptr<X509Certificate> cert_chain = | 474 scoped_refptr<X509Certificate> cert_chain = |
| 406 X509Certificate::CreateFromHandle(ee_cert->os_cert_handle(), | 475 X509Certificate::CreateFromHandle(ee_cert->os_cert_handle(), |
| 407 intermediates); | 476 intermediates); |
| 408 | 477 |
| 409 CertVerifyResult verify_result; | 478 CertVerifyResult verify_result; |
| 410 int error = Verify(cert_chain.get(), | 479 int error = Verify(cert_chain.get(), "127.0.0.1", 0, NULL, |
| 411 "127.0.0.1", | 480 CertificateList(), &verify_result); |
| 412 0, | |
| 413 NULL, | |
| 414 empty_cert_list_, | |
| 415 &verify_result); | |
| 416 | 481 |
| 417 if (IsWeakKeyType(*ee_type) || IsWeakKeyType(*signer_type)) { | 482 if (IsWeakKeyType(*ee_type) || IsWeakKeyType(*signer_type)) { |
| 418 EXPECT_NE(OK, error); | 483 EXPECT_NE(OK, error); |
| 419 EXPECT_EQ(CERT_STATUS_WEAK_KEY, | 484 EXPECT_EQ(CERT_STATUS_WEAK_KEY, |
| 420 verify_result.cert_status & CERT_STATUS_WEAK_KEY); | 485 verify_result.cert_status & CERT_STATUS_WEAK_KEY); |
| 421 EXPECT_EQ(WeakKeysAreInvalid() ? CERT_STATUS_INVALID : 0, | 486 EXPECT_EQ(WeakKeysAreInvalid() ? CERT_STATUS_INVALID : 0, |
| 422 verify_result.cert_status & CERT_STATUS_INVALID); | 487 verify_result.cert_status & CERT_STATUS_INVALID); |
| 423 } else { | 488 } else { |
| 424 EXPECT_THAT(error, IsOk()); | 489 EXPECT_THAT(error, IsOk()); |
| 425 EXPECT_EQ(0U, verify_result.cert_status & CERT_STATUS_WEAK_KEY); | 490 EXPECT_EQ(0U, verify_result.cert_status & CERT_STATUS_WEAK_KEY); |
| 426 } | 491 } |
| 427 } | 492 } |
| 428 } | 493 } |
| 429 } | 494 } |
| 430 | 495 |
| 431 // Regression test for http://crbug.com/108514. | 496 // Regression test for http://crbug.com/108514. |
| 432 #if defined(OS_MACOSX) && !defined(OS_IOS) | 497 TEST_P(CertVerifyProcInternalTest, ExtraneousMD5RootCert) { |
| 433 // Disabled on OS X - Security.framework doesn't ignore superflous certificates | |
| 434 // provided by servers. See CertVerifyProcTest.CybertrustGTERoot for further | |
| 435 // details. | |
| 436 #define MAYBE_ExtraneousMD5RootCert DISABLED_ExtraneousMD5RootCert | |
| 437 #else | |
| 438 #define MAYBE_ExtraneousMD5RootCert ExtraneousMD5RootCert | |
| 439 #endif | |
| 440 TEST_F(CertVerifyProcTest, MAYBE_ExtraneousMD5RootCert) { | |
| 441 if (!SupportsReturningVerifiedChain()) { | 498 if (!SupportsReturningVerifiedChain()) { |
| 442 LOG(INFO) << "Skipping this test in this platform."; | 499 LOG(INFO) << "Skipping this test in this platform."; |
| 443 return; | 500 return; |
| 444 } | 501 } |
| 445 | 502 |
| 503 if (verify_proc_type() == CERT_VERIFY_PROC_MAC) { |
| 504 // Disabled on OS X - Security.framework doesn't ignore superflous |
| 505 // certificates provided by servers. |
| 506 // TODO(eroman): Is this still needed? |
| 507 LOG(INFO) << "Skipping this test as Security.framework doesn't ignore " |
| 508 "superflous certificates provided by servers."; |
| 509 return; |
| 510 } |
| 511 |
| 446 base::FilePath certs_dir = GetTestCertsDirectory(); | 512 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 447 | 513 |
| 448 scoped_refptr<X509Certificate> server_cert = | 514 scoped_refptr<X509Certificate> server_cert = |
| 449 ImportCertFromFile(certs_dir, "cross-signed-leaf.pem"); | 515 ImportCertFromFile(certs_dir, "cross-signed-leaf.pem"); |
| 450 ASSERT_NE(static_cast<X509Certificate*>(NULL), server_cert.get()); | 516 ASSERT_NE(static_cast<X509Certificate*>(NULL), server_cert.get()); |
| 451 | 517 |
| 452 scoped_refptr<X509Certificate> extra_cert = | 518 scoped_refptr<X509Certificate> extra_cert = |
| 453 ImportCertFromFile(certs_dir, "cross-signed-root-md5.pem"); | 519 ImportCertFromFile(certs_dir, "cross-signed-root-md5.pem"); |
| 454 ASSERT_NE(static_cast<X509Certificate*>(NULL), extra_cert.get()); | 520 ASSERT_NE(static_cast<X509Certificate*>(NULL), extra_cert.get()); |
| 455 | 521 |
| 456 scoped_refptr<X509Certificate> root_cert = | 522 scoped_refptr<X509Certificate> root_cert = |
| 457 ImportCertFromFile(certs_dir, "cross-signed-root-sha256.pem"); | 523 ImportCertFromFile(certs_dir, "cross-signed-root-sha256.pem"); |
| 458 ASSERT_NE(static_cast<X509Certificate*>(NULL), root_cert.get()); | 524 ASSERT_NE(static_cast<X509Certificate*>(NULL), root_cert.get()); |
| 459 | 525 |
| 460 ScopedTestRoot scoped_root(root_cert.get()); | 526 ScopedTestRoot scoped_root(root_cert.get()); |
| 461 | 527 |
| 462 X509Certificate::OSCertHandles intermediates; | 528 X509Certificate::OSCertHandles intermediates; |
| 463 intermediates.push_back(extra_cert->os_cert_handle()); | 529 intermediates.push_back(extra_cert->os_cert_handle()); |
| 464 scoped_refptr<X509Certificate> cert_chain = | 530 scoped_refptr<X509Certificate> cert_chain = X509Certificate::CreateFromHandle( |
| 465 X509Certificate::CreateFromHandle(server_cert->os_cert_handle(), | 531 server_cert->os_cert_handle(), intermediates); |
| 466 intermediates); | |
| 467 | 532 |
| 468 CertVerifyResult verify_result; | 533 CertVerifyResult verify_result; |
| 469 int flags = 0; | 534 int flags = 0; |
| 470 int error = Verify(cert_chain.get(), | 535 int error = Verify(cert_chain.get(), "127.0.0.1", flags, NULL, |
| 471 "127.0.0.1", | 536 CertificateList(), &verify_result); |
| 472 flags, | |
| 473 NULL, | |
| 474 empty_cert_list_, | |
| 475 &verify_result); | |
| 476 EXPECT_THAT(error, IsOk()); | 537 EXPECT_THAT(error, IsOk()); |
| 477 | 538 |
| 478 // The extra MD5 root should be discarded | 539 // The extra MD5 root should be discarded |
| 479 ASSERT_TRUE(verify_result.verified_cert.get()); | 540 ASSERT_TRUE(verify_result.verified_cert.get()); |
| 480 ASSERT_EQ(1u, | 541 ASSERT_EQ(1u, |
| 481 verify_result.verified_cert->GetIntermediateCertificates().size()); | 542 verify_result.verified_cert->GetIntermediateCertificates().size()); |
| 482 EXPECT_TRUE(X509Certificate::IsSameOSCert( | 543 EXPECT_TRUE(X509Certificate::IsSameOSCert( |
| 483 verify_result.verified_cert->GetIntermediateCertificates().front(), | 544 verify_result.verified_cert->GetIntermediateCertificates().front(), |
| 484 root_cert->os_cert_handle())); | 545 root_cert->os_cert_handle())); |
| 485 | 546 |
| 486 EXPECT_FALSE(verify_result.has_md5); | 547 EXPECT_FALSE(verify_result.has_md5); |
| 487 } | 548 } |
| 488 | 549 |
| 489 // Test for bug 94673. | 550 // Test for bug 94673. |
| 490 TEST_F(CertVerifyProcTest, GoogleDigiNotarTest) { | 551 TEST_P(CertVerifyProcInternalTest, GoogleDigiNotarTest) { |
| 491 base::FilePath certs_dir = GetTestCertsDirectory(); | 552 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 492 | 553 |
| 493 scoped_refptr<X509Certificate> server_cert = | 554 scoped_refptr<X509Certificate> server_cert = |
| 494 ImportCertFromFile(certs_dir, "google_diginotar.pem"); | 555 ImportCertFromFile(certs_dir, "google_diginotar.pem"); |
| 495 ASSERT_NE(static_cast<X509Certificate*>(NULL), server_cert.get()); | 556 ASSERT_NE(static_cast<X509Certificate*>(NULL), server_cert.get()); |
| 496 | 557 |
| 497 scoped_refptr<X509Certificate> intermediate_cert = | 558 scoped_refptr<X509Certificate> intermediate_cert = |
| 498 ImportCertFromFile(certs_dir, "diginotar_public_ca_2025.pem"); | 559 ImportCertFromFile(certs_dir, "diginotar_public_ca_2025.pem"); |
| 499 ASSERT_NE(static_cast<X509Certificate*>(NULL), intermediate_cert.get()); | 560 ASSERT_NE(static_cast<X509Certificate*>(NULL), intermediate_cert.get()); |
| 500 | 561 |
| 501 X509Certificate::OSCertHandles intermediates; | 562 X509Certificate::OSCertHandles intermediates; |
| 502 intermediates.push_back(intermediate_cert->os_cert_handle()); | 563 intermediates.push_back(intermediate_cert->os_cert_handle()); |
| 503 scoped_refptr<X509Certificate> cert_chain = | 564 scoped_refptr<X509Certificate> cert_chain = X509Certificate::CreateFromHandle( |
| 504 X509Certificate::CreateFromHandle(server_cert->os_cert_handle(), | 565 server_cert->os_cert_handle(), intermediates); |
| 505 intermediates); | |
| 506 | 566 |
| 507 CertVerifyResult verify_result; | 567 CertVerifyResult verify_result; |
| 508 int flags = CertVerifier::VERIFY_REV_CHECKING_ENABLED; | 568 int flags = CertVerifier::VERIFY_REV_CHECKING_ENABLED; |
| 509 int error = Verify(cert_chain.get(), | 569 int error = Verify(cert_chain.get(), "mail.google.com", flags, NULL, |
| 510 "mail.google.com", | 570 CertificateList(), &verify_result); |
| 511 flags, | |
| 512 NULL, | |
| 513 empty_cert_list_, | |
| 514 &verify_result); | |
| 515 EXPECT_NE(OK, error); | 571 EXPECT_NE(OK, error); |
| 516 | 572 |
| 517 // Now turn off revocation checking. Certificate verification should still | 573 // Now turn off revocation checking. Certificate verification should still |
| 518 // fail. | 574 // fail. |
| 519 flags = 0; | 575 flags = 0; |
| 520 error = Verify(cert_chain.get(), | 576 error = Verify(cert_chain.get(), "mail.google.com", flags, NULL, |
| 521 "mail.google.com", | 577 CertificateList(), &verify_result); |
| 522 flags, | |
| 523 NULL, | |
| 524 empty_cert_list_, | |
| 525 &verify_result); | |
| 526 EXPECT_NE(OK, error); | 578 EXPECT_NE(OK, error); |
| 527 } | 579 } |
| 528 | 580 |
| 529 // Ensures the CertVerifyProc blacklist remains in sorted order, so that it | 581 // Ensures the CertVerifyProc blacklist remains in sorted order, so that it |
| 530 // can be binary-searched. | 582 // can be binary-searched. |
| 531 TEST_F(CertVerifyProcTest, BlacklistIsSorted) { | 583 TEST(CertVerifyProcTest, BlacklistIsSorted) { |
| 532 // Defines kBlacklistedSPKIs. | 584 // Defines kBlacklistedSPKIs. |
| 533 #include "net/cert/cert_verify_proc_blacklist.inc" | 585 #include "net/cert/cert_verify_proc_blacklist.inc" |
| 534 for (size_t i = 0; i < arraysize(kBlacklistedSPKIs) - 1; ++i) { | 586 for (size_t i = 0; i < arraysize(kBlacklistedSPKIs) - 1; ++i) { |
| 535 EXPECT_GT(0, memcmp(kBlacklistedSPKIs[i], kBlacklistedSPKIs[i + 1], | 587 EXPECT_GT(0, memcmp(kBlacklistedSPKIs[i], kBlacklistedSPKIs[i + 1], |
| 536 crypto::kSHA256Length)) | 588 crypto::kSHA256Length)) |
| 537 << " at index " << i; | 589 << " at index " << i; |
| 538 } | 590 } |
| 539 } | 591 } |
| 540 | 592 |
| 541 TEST_F(CertVerifyProcTest, DigiNotarCerts) { | 593 TEST(CertVerifyProcTest, DigiNotarCerts) { |
| 542 static const char* const kDigiNotarFilenames[] = { | 594 static const char* const kDigiNotarFilenames[] = { |
| 543 "diginotar_root_ca.pem", | 595 "diginotar_root_ca.pem", "diginotar_cyber_ca.pem", |
| 544 "diginotar_cyber_ca.pem", | 596 "diginotar_services_1024_ca.pem", "diginotar_pkioverheid.pem", |
| 545 "diginotar_services_1024_ca.pem", | 597 "diginotar_pkioverheid_g2.pem", NULL, |
| 546 "diginotar_pkioverheid.pem", | |
| 547 "diginotar_pkioverheid_g2.pem", | |
| 548 NULL, | |
| 549 }; | 598 }; |
| 550 | 599 |
| 551 base::FilePath certs_dir = GetTestCertsDirectory(); | 600 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 552 | 601 |
| 553 for (size_t i = 0; kDigiNotarFilenames[i]; i++) { | 602 for (size_t i = 0; kDigiNotarFilenames[i]; i++) { |
| 554 scoped_refptr<X509Certificate> diginotar_cert = | 603 scoped_refptr<X509Certificate> diginotar_cert = |
| 555 ImportCertFromFile(certs_dir, kDigiNotarFilenames[i]); | 604 ImportCertFromFile(certs_dir, kDigiNotarFilenames[i]); |
| 556 std::string der_bytes; | 605 std::string der_bytes; |
| 557 ASSERT_TRUE(X509Certificate::GetDEREncoded( | 606 ASSERT_TRUE(X509Certificate::GetDEREncoded(diginotar_cert->os_cert_handle(), |
| 558 diginotar_cert->os_cert_handle(), &der_bytes)); | 607 &der_bytes)); |
| 559 | 608 |
| 560 base::StringPiece spki; | 609 base::StringPiece spki; |
| 561 ASSERT_TRUE(asn1::ExtractSPKIFromDERCert(der_bytes, &spki)); | 610 ASSERT_TRUE(asn1::ExtractSPKIFromDERCert(der_bytes, &spki)); |
| 562 | 611 |
| 563 std::string spki_sha256 = crypto::SHA256HashString(spki.as_string()); | 612 std::string spki_sha256 = crypto::SHA256HashString(spki.as_string()); |
| 564 | 613 |
| 565 HashValueVector public_keys; | 614 HashValueVector public_keys; |
| 566 HashValue hash(HASH_VALUE_SHA256); | 615 HashValue hash(HASH_VALUE_SHA256); |
| 567 ASSERT_EQ(hash.size(), spki_sha256.size()); | 616 ASSERT_EQ(hash.size(), spki_sha256.size()); |
| 568 memcpy(hash.data(), spki_sha256.data(), spki_sha256.size()); | 617 memcpy(hash.data(), spki_sha256.data(), spki_sha256.size()); |
| 569 public_keys.push_back(hash); | 618 public_keys.push_back(hash); |
| 570 | 619 |
| 571 EXPECT_TRUE(CertVerifyProc::IsPublicKeyBlacklisted(public_keys)) << | 620 EXPECT_TRUE(CertVerifyProc::IsPublicKeyBlacklisted(public_keys)) |
| 572 "Public key not blocked for " << kDigiNotarFilenames[i]; | 621 << "Public key not blocked for " << kDigiNotarFilenames[i]; |
| 573 } | 622 } |
| 574 } | 623 } |
| 575 | 624 |
| 576 TEST_F(CertVerifyProcTest, NameConstraintsOk) { | 625 TEST_P(CertVerifyProcInternalTest, NameConstraintsOk) { |
| 577 CertificateList ca_cert_list = | 626 CertificateList ca_cert_list = |
| 578 CreateCertificateListFromFile(GetTestCertsDirectory(), | 627 CreateCertificateListFromFile(GetTestCertsDirectory(), "root_ca_cert.pem", |
| 579 "root_ca_cert.pem", | |
| 580 X509Certificate::FORMAT_AUTO); | 628 X509Certificate::FORMAT_AUTO); |
| 581 ASSERT_EQ(1U, ca_cert_list.size()); | 629 ASSERT_EQ(1U, ca_cert_list.size()); |
| 582 ScopedTestRoot test_root(ca_cert_list[0].get()); | 630 ScopedTestRoot test_root(ca_cert_list[0].get()); |
| 583 | 631 |
| 584 CertificateList cert_list = CreateCertificateListFromFile( | 632 CertificateList cert_list = CreateCertificateListFromFile( |
| 585 GetTestCertsDirectory(), "name_constraint_good.pem", | 633 GetTestCertsDirectory(), "name_constraint_good.pem", |
| 586 X509Certificate::FORMAT_AUTO); | 634 X509Certificate::FORMAT_AUTO); |
| 587 ASSERT_EQ(1U, cert_list.size()); | 635 ASSERT_EQ(1U, cert_list.size()); |
| 588 | 636 |
| 589 X509Certificate::OSCertHandles intermediates; | 637 X509Certificate::OSCertHandles intermediates; |
| 590 scoped_refptr<X509Certificate> leaf = | 638 scoped_refptr<X509Certificate> leaf = X509Certificate::CreateFromHandle( |
| 591 X509Certificate::CreateFromHandle(cert_list[0]->os_cert_handle(), | 639 cert_list[0]->os_cert_handle(), intermediates); |
| 592 intermediates); | |
| 593 | 640 |
| 594 int flags = 0; | 641 int flags = 0; |
| 595 CertVerifyResult verify_result; | 642 CertVerifyResult verify_result; |
| 596 int error = Verify(leaf.get(), | 643 int error = Verify(leaf.get(), "test.example.com", flags, NULL, |
| 597 "test.example.com", | 644 CertificateList(), &verify_result); |
| 598 flags, | |
| 599 NULL, | |
| 600 empty_cert_list_, | |
| 601 &verify_result); | |
| 602 EXPECT_THAT(error, IsOk()); | 645 EXPECT_THAT(error, IsOk()); |
| 603 EXPECT_EQ(0U, verify_result.cert_status); | 646 EXPECT_EQ(0U, verify_result.cert_status); |
| 604 | 647 |
| 605 error = Verify(leaf.get(), "foo.test2.example.com", flags, NULL, | 648 error = Verify(leaf.get(), "foo.test2.example.com", flags, NULL, |
| 606 empty_cert_list_, &verify_result); | 649 CertificateList(), &verify_result); |
| 607 EXPECT_THAT(error, IsOk()); | 650 EXPECT_THAT(error, IsOk()); |
| 608 EXPECT_EQ(0U, verify_result.cert_status); | 651 EXPECT_EQ(0U, verify_result.cert_status); |
| 609 } | 652 } |
| 610 | 653 |
| 611 TEST_F(CertVerifyProcTest, NameConstraintsFailure) { | 654 TEST_P(CertVerifyProcInternalTest, NameConstraintsFailure) { |
| 612 if (!SupportsReturningVerifiedChain()) { | 655 if (!SupportsReturningVerifiedChain()) { |
| 613 LOG(INFO) << "Skipping this test in this platform."; | 656 LOG(INFO) << "Skipping this test in this platform."; |
| 614 return; | 657 return; |
| 615 } | 658 } |
| 616 | 659 |
| 617 CertificateList ca_cert_list = | 660 CertificateList ca_cert_list = |
| 618 CreateCertificateListFromFile(GetTestCertsDirectory(), | 661 CreateCertificateListFromFile(GetTestCertsDirectory(), "root_ca_cert.pem", |
| 619 "root_ca_cert.pem", | |
| 620 X509Certificate::FORMAT_AUTO); | 662 X509Certificate::FORMAT_AUTO); |
| 621 ASSERT_EQ(1U, ca_cert_list.size()); | 663 ASSERT_EQ(1U, ca_cert_list.size()); |
| 622 ScopedTestRoot test_root(ca_cert_list[0].get()); | 664 ScopedTestRoot test_root(ca_cert_list[0].get()); |
| 623 | 665 |
| 624 CertificateList cert_list = CreateCertificateListFromFile( | 666 CertificateList cert_list = CreateCertificateListFromFile( |
| 625 GetTestCertsDirectory(), "name_constraint_bad.pem", | 667 GetTestCertsDirectory(), "name_constraint_bad.pem", |
| 626 X509Certificate::FORMAT_AUTO); | 668 X509Certificate::FORMAT_AUTO); |
| 627 ASSERT_EQ(1U, cert_list.size()); | 669 ASSERT_EQ(1U, cert_list.size()); |
| 628 | 670 |
| 629 X509Certificate::OSCertHandles intermediates; | 671 X509Certificate::OSCertHandles intermediates; |
| 630 scoped_refptr<X509Certificate> leaf = | 672 scoped_refptr<X509Certificate> leaf = X509Certificate::CreateFromHandle( |
| 631 X509Certificate::CreateFromHandle(cert_list[0]->os_cert_handle(), | 673 cert_list[0]->os_cert_handle(), intermediates); |
| 632 intermediates); | |
| 633 | 674 |
| 634 int flags = 0; | 675 int flags = 0; |
| 635 CertVerifyResult verify_result; | 676 CertVerifyResult verify_result; |
| 636 int error = Verify(leaf.get(), | 677 int error = Verify(leaf.get(), "test.example.com", flags, NULL, |
| 637 "test.example.com", | 678 CertificateList(), &verify_result); |
| 638 flags, | |
| 639 NULL, | |
| 640 empty_cert_list_, | |
| 641 &verify_result); | |
| 642 EXPECT_THAT(error, IsError(ERR_CERT_NAME_CONSTRAINT_VIOLATION)); | 679 EXPECT_THAT(error, IsError(ERR_CERT_NAME_CONSTRAINT_VIOLATION)); |
| 643 EXPECT_EQ(CERT_STATUS_NAME_CONSTRAINT_VIOLATION, | 680 EXPECT_EQ(CERT_STATUS_NAME_CONSTRAINT_VIOLATION, |
| 644 verify_result.cert_status & CERT_STATUS_NAME_CONSTRAINT_VIOLATION); | 681 verify_result.cert_status & CERT_STATUS_NAME_CONSTRAINT_VIOLATION); |
| 645 } | 682 } |
| 646 | 683 |
| 647 TEST_F(CertVerifyProcTest, TestHasTooLongValidity) { | 684 TEST(CertVerifyProcTest, TestHasTooLongValidity) { |
| 648 struct { | 685 struct { |
| 649 const char* const file; | 686 const char* const file; |
| 650 bool is_valid_too_long; | 687 bool is_valid_too_long; |
| 651 } tests[] = { | 688 } tests[] = { |
| 652 {"twitter-chain.pem", false}, | 689 {"twitter-chain.pem", false}, |
| 653 {"start_after_expiry.pem", true}, | 690 {"start_after_expiry.pem", true}, |
| 654 {"pre_br_validity_ok.pem", false}, | 691 {"pre_br_validity_ok.pem", false}, |
| 655 {"pre_br_validity_bad_121.pem", true}, | 692 {"pre_br_validity_bad_121.pem", true}, |
| 656 {"pre_br_validity_bad_2020.pem", true}, | 693 {"pre_br_validity_bad_2020.pem", true}, |
| 657 {"10_year_validity.pem", false}, | 694 {"10_year_validity.pem", false}, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 668 scoped_refptr<X509Certificate> certificate = | 705 scoped_refptr<X509Certificate> certificate = |
| 669 ImportCertFromFile(certs_dir, tests[i].file); | 706 ImportCertFromFile(certs_dir, tests[i].file); |
| 670 SCOPED_TRACE(tests[i].file); | 707 SCOPED_TRACE(tests[i].file); |
| 671 ASSERT_TRUE(certificate); | 708 ASSERT_TRUE(certificate); |
| 672 EXPECT_EQ(tests[i].is_valid_too_long, | 709 EXPECT_EQ(tests[i].is_valid_too_long, |
| 673 CertVerifyProc::HasTooLongValidity(*certificate)); | 710 CertVerifyProc::HasTooLongValidity(*certificate)); |
| 674 } | 711 } |
| 675 } | 712 } |
| 676 | 713 |
| 677 // TODO(crbug.com/610546): Fix and re-enable this test. | 714 // TODO(crbug.com/610546): Fix and re-enable this test. |
| 678 TEST_F(CertVerifyProcTest, DISABLED_TestKnownRoot) { | 715 TEST_P(CertVerifyProcInternalTest, DISABLED_TestKnownRoot) { |
| 679 if (!SupportsDetectingKnownRoots()) { | 716 if (!SupportsDetectingKnownRoots()) { |
| 680 LOG(INFO) << "Skipping this test on this platform."; | 717 LOG(INFO) << "Skipping this test on this platform."; |
| 681 return; | 718 return; |
| 682 } | 719 } |
| 683 | 720 |
| 684 base::FilePath certs_dir = GetTestCertsDirectory(); | 721 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 685 CertificateList certs = CreateCertificateListFromFile( | 722 CertificateList certs = CreateCertificateListFromFile( |
| 686 certs_dir, "twitter-chain.pem", X509Certificate::FORMAT_AUTO); | 723 certs_dir, "twitter-chain.pem", X509Certificate::FORMAT_AUTO); |
| 687 ASSERT_EQ(3U, certs.size()); | 724 ASSERT_EQ(3U, certs.size()); |
| 688 | 725 |
| 689 X509Certificate::OSCertHandles intermediates; | 726 X509Certificate::OSCertHandles intermediates; |
| 690 intermediates.push_back(certs[1]->os_cert_handle()); | 727 intermediates.push_back(certs[1]->os_cert_handle()); |
| 691 | 728 |
| 692 scoped_refptr<X509Certificate> cert_chain = | 729 scoped_refptr<X509Certificate> cert_chain = X509Certificate::CreateFromHandle( |
| 693 X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(), | 730 certs[0]->os_cert_handle(), intermediates); |
| 694 intermediates); | |
| 695 | 731 |
| 696 int flags = 0; | 732 int flags = 0; |
| 697 CertVerifyResult verify_result; | 733 CertVerifyResult verify_result; |
| 698 // This will blow up, May 9th, 2016. Sorry! Please disable and file a bug | 734 // This will blow up, May 9th, 2016. Sorry! Please disable and file a bug |
| 699 // against agl. See also PublicKeyHashes. | 735 // against agl. See also PublicKeyHashes. |
| 700 int error = Verify(cert_chain.get(), "twitter.com", flags, NULL, | 736 int error = Verify(cert_chain.get(), "twitter.com", flags, NULL, |
| 701 empty_cert_list_, &verify_result); | 737 CertificateList(), &verify_result); |
| 702 EXPECT_THAT(error, IsOk()); | 738 EXPECT_THAT(error, IsOk()); |
| 703 EXPECT_TRUE(verify_result.is_issued_by_known_root); | 739 EXPECT_TRUE(verify_result.is_issued_by_known_root); |
| 704 } | 740 } |
| 705 | 741 |
| 706 // TODO(crbug.com/610546): Fix and re-enable this test. | 742 // TODO(crbug.com/610546): Fix and re-enable this test. |
| 707 TEST_F(CertVerifyProcTest, DISABLED_PublicKeyHashes) { | 743 TEST_P(CertVerifyProcInternalTest, DISABLED_PublicKeyHashes) { |
| 708 if (!SupportsReturningVerifiedChain()) { | 744 if (!SupportsReturningVerifiedChain()) { |
| 709 LOG(INFO) << "Skipping this test in this platform."; | 745 LOG(INFO) << "Skipping this test in this platform."; |
| 710 return; | 746 return; |
| 711 } | 747 } |
| 712 | 748 |
| 713 base::FilePath certs_dir = GetTestCertsDirectory(); | 749 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 714 CertificateList certs = CreateCertificateListFromFile( | 750 CertificateList certs = CreateCertificateListFromFile( |
| 715 certs_dir, "twitter-chain.pem", X509Certificate::FORMAT_AUTO); | 751 certs_dir, "twitter-chain.pem", X509Certificate::FORMAT_AUTO); |
| 716 ASSERT_EQ(3U, certs.size()); | 752 ASSERT_EQ(3U, certs.size()); |
| 717 | 753 |
| 718 X509Certificate::OSCertHandles intermediates; | 754 X509Certificate::OSCertHandles intermediates; |
| 719 intermediates.push_back(certs[1]->os_cert_handle()); | 755 intermediates.push_back(certs[1]->os_cert_handle()); |
| 720 | 756 |
| 721 scoped_refptr<X509Certificate> cert_chain = | 757 scoped_refptr<X509Certificate> cert_chain = X509Certificate::CreateFromHandle( |
| 722 X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(), | 758 certs[0]->os_cert_handle(), intermediates); |
| 723 intermediates); | |
| 724 int flags = 0; | 759 int flags = 0; |
| 725 CertVerifyResult verify_result; | 760 CertVerifyResult verify_result; |
| 726 | 761 |
| 727 // This will blow up, May 9th, 2016. Sorry! Please disable and file a bug | 762 // This will blow up, May 9th, 2016. Sorry! Please disable and file a bug |
| 728 // against agl. See also TestKnownRoot. | 763 // against agl. See also TestKnownRoot. |
| 729 int error = Verify(cert_chain.get(), "twitter.com", flags, NULL, | 764 int error = Verify(cert_chain.get(), "twitter.com", flags, NULL, |
| 730 empty_cert_list_, &verify_result); | 765 CertificateList(), &verify_result); |
| 731 EXPECT_THAT(error, IsOk()); | 766 EXPECT_THAT(error, IsOk()); |
| 732 ASSERT_LE(3U, verify_result.public_key_hashes.size()); | 767 ASSERT_LE(3U, verify_result.public_key_hashes.size()); |
| 733 | 768 |
| 734 HashValueVector sha1_hashes; | 769 HashValueVector sha1_hashes; |
| 735 for (size_t i = 0; i < verify_result.public_key_hashes.size(); ++i) { | 770 for (size_t i = 0; i < verify_result.public_key_hashes.size(); ++i) { |
| 736 if (verify_result.public_key_hashes[i].tag != HASH_VALUE_SHA1) | 771 if (verify_result.public_key_hashes[i].tag != HASH_VALUE_SHA1) |
| 737 continue; | 772 continue; |
| 738 sha1_hashes.push_back(verify_result.public_key_hashes[i]); | 773 sha1_hashes.push_back(verify_result.public_key_hashes[i]); |
| 739 } | 774 } |
| 740 ASSERT_LE(3u, sha1_hashes.size()); | 775 ASSERT_LE(3u, sha1_hashes.size()); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 754 | 789 |
| 755 for (size_t i = 0; i < 3; ++i) { | 790 for (size_t i = 0; i < 3; ++i) { |
| 756 EXPECT_EQ(HexEncode(kTwitterSPKIsSHA256[i], crypto::kSHA256Length), | 791 EXPECT_EQ(HexEncode(kTwitterSPKIsSHA256[i], crypto::kSHA256Length), |
| 757 HexEncode(sha256_hashes[i].data(), crypto::kSHA256Length)); | 792 HexEncode(sha256_hashes[i].data(), crypto::kSHA256Length)); |
| 758 } | 793 } |
| 759 } | 794 } |
| 760 | 795 |
| 761 // A regression test for http://crbug.com/70293. | 796 // A regression test for http://crbug.com/70293. |
| 762 // The Key Usage extension in this RSA SSL server certificate does not have | 797 // The Key Usage extension in this RSA SSL server certificate does not have |
| 763 // the keyEncipherment bit. | 798 // the keyEncipherment bit. |
| 764 TEST_F(CertVerifyProcTest, InvalidKeyUsage) { | 799 TEST_P(CertVerifyProcInternalTest, InvalidKeyUsage) { |
| 765 base::FilePath certs_dir = GetTestCertsDirectory(); | 800 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 766 | 801 |
| 767 scoped_refptr<X509Certificate> server_cert = | 802 scoped_refptr<X509Certificate> server_cert = |
| 768 ImportCertFromFile(certs_dir, "invalid_key_usage_cert.der"); | 803 ImportCertFromFile(certs_dir, "invalid_key_usage_cert.der"); |
| 769 ASSERT_NE(static_cast<X509Certificate*>(NULL), server_cert.get()); | 804 ASSERT_NE(static_cast<X509Certificate*>(NULL), server_cert.get()); |
| 770 | 805 |
| 771 int flags = 0; | 806 int flags = 0; |
| 772 CertVerifyResult verify_result; | 807 CertVerifyResult verify_result; |
| 773 int error = Verify(server_cert.get(), | 808 int error = Verify(server_cert.get(), "jira.aquameta.com", flags, NULL, |
| 774 "jira.aquameta.com", | 809 CertificateList(), &verify_result); |
| 775 flags, | 810 |
| 776 NULL, | 811 // TODO(eroman): Change the test data so results are consistent across |
| 777 empty_cert_list_, | 812 // verifiers. |
| 778 &verify_result); | 813 if (verify_proc_type() == CERT_VERIFY_PROC_OPENSSL) { |
| 779 #if defined(USE_OPENSSL_CERTS) && !defined(OS_ANDROID) | 814 // This certificate has two errors: "invalid key usage" and "untrusted CA". |
| 780 // This certificate has two errors: "invalid key usage" and "untrusted CA". | 815 // However, OpenSSL returns only one (the latter), and we can't detect |
| 781 // However, OpenSSL returns only one (the latter), and we can't detect | 816 // the other errors. |
| 782 // the other errors. | 817 EXPECT_THAT(error, IsError(ERR_CERT_AUTHORITY_INVALID)); |
| 783 EXPECT_THAT(error, IsError(ERR_CERT_AUTHORITY_INVALID)); | 818 } else { |
| 784 #else | 819 EXPECT_THAT(error, IsError(ERR_CERT_INVALID)); |
| 785 EXPECT_THAT(error, IsError(ERR_CERT_INVALID)); | 820 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_INVALID); |
| 786 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_INVALID); | 821 } |
| 787 #endif | |
| 788 // TODO(wtc): fix http://crbug.com/75520 to get all the certificate errors | 822 // TODO(wtc): fix http://crbug.com/75520 to get all the certificate errors |
| 789 // from NSS. | 823 // from NSS. |
| 790 #if !defined(USE_NSS_CERTS) && !defined(OS_IOS) && !defined(OS_ANDROID) | 824 if (verify_proc_type() != CERT_VERIFY_PROC_NSS && |
| 791 // The certificate is issued by an unknown CA. | 825 verify_proc_type() != CERT_VERIFY_PROC_IOS && |
| 792 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_AUTHORITY_INVALID); | 826 verify_proc_type() != CERT_VERIFY_PROC_ANDROID) { |
| 793 #endif | 827 // The certificate is issued by an unknown CA. |
| 828 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_AUTHORITY_INVALID); |
| 829 } |
| 794 } | 830 } |
| 795 | 831 |
| 796 // Basic test for returning the chain in CertVerifyResult. Note that the | 832 // Basic test for returning the chain in CertVerifyResult. Note that the |
| 797 // returned chain may just be a reflection of the originally supplied chain; | 833 // returned chain may just be a reflection of the originally supplied chain; |
| 798 // that is, if any errors occur, the default chain returned is an exact copy | 834 // that is, if any errors occur, the default chain returned is an exact copy |
| 799 // of the certificate to be verified. The remaining VerifyReturn* tests are | 835 // of the certificate to be verified. The remaining VerifyReturn* tests are |
| 800 // used to ensure that the actual, verified chain is being returned by | 836 // used to ensure that the actual, verified chain is being returned by |
| 801 // Verify(). | 837 // Verify(). |
| 802 TEST_F(CertVerifyProcTest, VerifyReturnChainBasic) { | 838 TEST_P(CertVerifyProcInternalTest, VerifyReturnChainBasic) { |
| 803 if (!SupportsReturningVerifiedChain()) { | 839 if (!SupportsReturningVerifiedChain()) { |
| 804 LOG(INFO) << "Skipping this test in this platform."; | 840 LOG(INFO) << "Skipping this test in this platform."; |
| 805 return; | 841 return; |
| 806 } | 842 } |
| 807 | 843 |
| 808 base::FilePath certs_dir = GetTestCertsDirectory(); | 844 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 809 CertificateList certs = CreateCertificateListFromFile( | 845 CertificateList certs = CreateCertificateListFromFile( |
| 810 certs_dir, "x509_verify_results.chain.pem", | 846 certs_dir, "x509_verify_results.chain.pem", X509Certificate::FORMAT_AUTO); |
| 811 X509Certificate::FORMAT_AUTO); | |
| 812 ASSERT_EQ(3U, certs.size()); | 847 ASSERT_EQ(3U, certs.size()); |
| 813 | 848 |
| 814 X509Certificate::OSCertHandles intermediates; | 849 X509Certificate::OSCertHandles intermediates; |
| 815 intermediates.push_back(certs[1]->os_cert_handle()); | 850 intermediates.push_back(certs[1]->os_cert_handle()); |
| 816 intermediates.push_back(certs[2]->os_cert_handle()); | 851 intermediates.push_back(certs[2]->os_cert_handle()); |
| 817 | 852 |
| 818 ScopedTestRoot scoped_root(certs[2].get()); | 853 ScopedTestRoot scoped_root(certs[2].get()); |
| 819 | 854 |
| 820 scoped_refptr<X509Certificate> google_full_chain = | 855 scoped_refptr<X509Certificate> google_full_chain = |
| 821 X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(), | 856 X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(), |
| 822 intermediates); | 857 intermediates); |
| 823 ASSERT_NE(static_cast<X509Certificate*>(NULL), google_full_chain.get()); | 858 ASSERT_NE(static_cast<X509Certificate*>(NULL), google_full_chain.get()); |
| 824 ASSERT_EQ(2U, google_full_chain->GetIntermediateCertificates().size()); | 859 ASSERT_EQ(2U, google_full_chain->GetIntermediateCertificates().size()); |
| 825 | 860 |
| 826 CertVerifyResult verify_result; | 861 CertVerifyResult verify_result; |
| 827 EXPECT_EQ(static_cast<X509Certificate*>(NULL), | 862 EXPECT_EQ(static_cast<X509Certificate*>(NULL), |
| 828 verify_result.verified_cert.get()); | 863 verify_result.verified_cert.get()); |
| 829 int error = Verify(google_full_chain.get(), | 864 int error = Verify(google_full_chain.get(), "127.0.0.1", 0, NULL, |
| 830 "127.0.0.1", | 865 CertificateList(), &verify_result); |
| 831 0, | |
| 832 NULL, | |
| 833 empty_cert_list_, | |
| 834 &verify_result); | |
| 835 EXPECT_THAT(error, IsOk()); | 866 EXPECT_THAT(error, IsOk()); |
| 836 ASSERT_NE(static_cast<X509Certificate*>(NULL), | 867 ASSERT_NE(static_cast<X509Certificate*>(NULL), |
| 837 verify_result.verified_cert.get()); | 868 verify_result.verified_cert.get()); |
| 838 | 869 |
| 839 EXPECT_NE(google_full_chain, verify_result.verified_cert); | 870 EXPECT_NE(google_full_chain, verify_result.verified_cert); |
| 840 EXPECT_TRUE(X509Certificate::IsSameOSCert( | 871 EXPECT_TRUE(X509Certificate::IsSameOSCert( |
| 841 google_full_chain->os_cert_handle(), | 872 google_full_chain->os_cert_handle(), |
| 842 verify_result.verified_cert->os_cert_handle())); | 873 verify_result.verified_cert->os_cert_handle())); |
| 843 const X509Certificate::OSCertHandles& return_intermediates = | 874 const X509Certificate::OSCertHandles& return_intermediates = |
| 844 verify_result.verified_cert->GetIntermediateCertificates(); | 875 verify_result.verified_cert->GetIntermediateCertificates(); |
| 845 ASSERT_EQ(2U, return_intermediates.size()); | 876 ASSERT_EQ(2U, return_intermediates.size()); |
| 846 EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[0], | 877 EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[0], |
| 847 certs[1]->os_cert_handle())); | 878 certs[1]->os_cert_handle())); |
| 848 EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[1], | 879 EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[1], |
| 849 certs[2]->os_cert_handle())); | 880 certs[2]->os_cert_handle())); |
| 850 } | 881 } |
| 851 | 882 |
| 852 // Test that certificates issued for 'intranet' names (that is, containing no | 883 // Test that certificates issued for 'intranet' names (that is, containing no |
| 853 // known public registry controlled domain information) issued by well-known | 884 // known public registry controlled domain information) issued by well-known |
| 854 // CAs are flagged appropriately, while certificates that are issued by | 885 // CAs are flagged appropriately, while certificates that are issued by |
| 855 // internal CAs are not flagged. | 886 // internal CAs are not flagged. |
| 856 TEST_F(CertVerifyProcTest, IntranetHostsRejected) { | 887 TEST(CertVerifyProcTest, IntranetHostsRejected) { |
| 857 if (!SupportsDetectingKnownRoots()) { | |
| 858 LOG(INFO) << "Skipping this test in this platform."; | |
| 859 return; | |
| 860 } | |
| 861 | |
| 862 CertificateList cert_list = CreateCertificateListFromFile( | 888 CertificateList cert_list = CreateCertificateListFromFile( |
| 863 GetTestCertsDirectory(), "reject_intranet_hosts.pem", | 889 GetTestCertsDirectory(), "reject_intranet_hosts.pem", |
| 864 X509Certificate::FORMAT_AUTO); | 890 X509Certificate::FORMAT_AUTO); |
| 865 ASSERT_EQ(1U, cert_list.size()); | 891 ASSERT_EQ(1U, cert_list.size()); |
| 866 scoped_refptr<X509Certificate> cert(cert_list[0]); | 892 scoped_refptr<X509Certificate> cert(cert_list[0]); |
| 867 | 893 |
| 868 CertVerifyResult verify_result; | 894 CertVerifyResult verify_result; |
| 869 int error = 0; | 895 int error = 0; |
| 870 | 896 |
| 871 // Intranet names for public CAs should be flagged: | 897 // Intranet names for public CAs should be flagged: |
| 872 CertVerifyResult dummy_result; | 898 CertVerifyResult dummy_result; |
| 873 dummy_result.is_issued_by_known_root = true; | 899 dummy_result.is_issued_by_known_root = true; |
| 874 verify_proc_ = new MockCertVerifyProc(dummy_result); | 900 scoped_refptr<CertVerifyProc> verify_proc = |
| 875 error = | 901 new MockCertVerifyProc(dummy_result); |
| 876 Verify(cert.get(), "intranet", 0, NULL, empty_cert_list_, &verify_result); | 902 error = verify_proc->Verify(cert.get(), "intranet", std::string(), 0, NULL, |
| 903 CertificateList(), &verify_result); |
| 877 EXPECT_THAT(error, IsOk()); | 904 EXPECT_THAT(error, IsOk()); |
| 878 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_NON_UNIQUE_NAME); | 905 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_NON_UNIQUE_NAME); |
| 879 | 906 |
| 880 // However, if the CA is not well known, these should not be flagged: | 907 // However, if the CA is not well known, these should not be flagged: |
| 881 dummy_result.Reset(); | 908 dummy_result.Reset(); |
| 882 dummy_result.is_issued_by_known_root = false; | 909 dummy_result.is_issued_by_known_root = false; |
| 883 verify_proc_ = new MockCertVerifyProc(dummy_result); | 910 verify_proc = make_scoped_refptr(new MockCertVerifyProc(dummy_result)); |
| 884 error = | 911 error = verify_proc->Verify(cert.get(), "intranet", std::string(), 0, NULL, |
| 885 Verify(cert.get(), "intranet", 0, NULL, empty_cert_list_, &verify_result); | 912 CertificateList(), &verify_result); |
| 886 EXPECT_THAT(error, IsOk()); | 913 EXPECT_THAT(error, IsOk()); |
| 887 EXPECT_FALSE(verify_result.cert_status & CERT_STATUS_NON_UNIQUE_NAME); | 914 EXPECT_FALSE(verify_result.cert_status & CERT_STATUS_NON_UNIQUE_NAME); |
| 888 } | 915 } |
| 889 | 916 |
| 890 // While all SHA-1 certificates should be rejected, in the event that there | 917 // While all SHA-1 certificates should be rejected, in the event that there |
| 891 // emerges some unexpected bug, test that the 'legacy' behaviour works | 918 // emerges some unexpected bug, test that the 'legacy' behaviour works |
| 892 // correctly - rejecting all SHA-1 certificates from publicly trusted CAs | 919 // correctly - rejecting all SHA-1 certificates from publicly trusted CAs |
| 893 // that were issued after 1 January 2016, while still allowing those from | 920 // that were issued after 1 January 2016, while still allowing those from |
| 894 // before that date, with SHA-1 in the intermediate, or from an enterprise | 921 // before that date, with SHA-1 in the intermediate, or from an enterprise |
| 895 // CA. | 922 // CA. |
| 896 TEST_F(CertVerifyProcTest, VerifyRejectsSHA1AfterDeprecationLegacyMode) { | 923 TEST(CertVerifyProcTest, VerifyRejectsSHA1AfterDeprecationLegacyMode) { |
| 897 base::test::ScopedFeatureList scoped_feature_list; | 924 base::test::ScopedFeatureList scoped_feature_list; |
| 898 scoped_feature_list.InitAndEnableFeature(CertVerifyProc::kSHA1LegacyMode); | 925 scoped_feature_list.InitAndEnableFeature(CertVerifyProc::kSHA1LegacyMode); |
| 899 | 926 |
| 900 CertVerifyResult dummy_result; | 927 CertVerifyResult dummy_result; |
| 901 CertVerifyResult verify_result; | 928 CertVerifyResult verify_result; |
| 902 int error = 0; | 929 int error = 0; |
| 903 scoped_refptr<X509Certificate> cert; | 930 scoped_refptr<X509Certificate> cert; |
| 904 | 931 |
| 905 // Publicly trusted SHA-1 leaf certificates issued before 1 January 2016 | 932 // Publicly trusted SHA-1 leaf certificates issued before 1 January 2016 |
| 906 // are accepted. | 933 // are accepted. |
| 907 verify_result.Reset(); | 934 verify_result.Reset(); |
| 908 dummy_result.Reset(); | 935 dummy_result.Reset(); |
| 909 dummy_result.is_issued_by_known_root = true; | 936 dummy_result.is_issued_by_known_root = true; |
| 910 dummy_result.has_sha1 = true; | 937 dummy_result.has_sha1 = true; |
| 911 dummy_result.has_sha1_leaf = true; | 938 dummy_result.has_sha1_leaf = true; |
| 912 verify_proc_ = new MockCertVerifyProc(dummy_result); | 939 scoped_refptr<CertVerifyProc> verify_proc = |
| 940 new MockCertVerifyProc(dummy_result); |
| 913 cert = CreateCertificateChainFromFile(GetTestCertsDirectory(), | 941 cert = CreateCertificateChainFromFile(GetTestCertsDirectory(), |
| 914 "sha1_dec_2015.pem", | 942 "sha1_dec_2015.pem", |
| 915 X509Certificate::FORMAT_AUTO); | 943 X509Certificate::FORMAT_AUTO); |
| 916 ASSERT_TRUE(cert); | 944 ASSERT_TRUE(cert); |
| 917 error = Verify(cert.get(), "127.0.0.1", 0, NULL, empty_cert_list_, | 945 error = verify_proc->Verify(cert.get(), "127.0.0.1", std::string(), 0, NULL, |
| 918 &verify_result); | 946 CertificateList(), &verify_result); |
| 919 EXPECT_THAT(error, IsOk()); | 947 EXPECT_THAT(error, IsOk()); |
| 920 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_SHA1_SIGNATURE_PRESENT); | 948 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_SHA1_SIGNATURE_PRESENT); |
| 921 | 949 |
| 922 // Publicly trusted SHA-1 leaf certificates issued on/after 1 January 2016 | 950 // Publicly trusted SHA-1 leaf certificates issued on/after 1 January 2016 |
| 923 // are rejected. | 951 // are rejected. |
| 924 verify_result.Reset(); | 952 verify_result.Reset(); |
| 925 dummy_result.Reset(); | 953 dummy_result.Reset(); |
| 926 dummy_result.is_issued_by_known_root = true; | 954 dummy_result.is_issued_by_known_root = true; |
| 927 dummy_result.has_sha1 = true; | 955 dummy_result.has_sha1 = true; |
| 928 dummy_result.has_sha1_leaf = true; | 956 dummy_result.has_sha1_leaf = true; |
| 929 verify_proc_ = new MockCertVerifyProc(dummy_result); | 957 verify_proc = make_scoped_refptr(new MockCertVerifyProc(dummy_result)); |
| 930 cert = CreateCertificateChainFromFile(GetTestCertsDirectory(), | 958 cert = CreateCertificateChainFromFile(GetTestCertsDirectory(), |
| 931 "sha1_jan_2016.pem", | 959 "sha1_jan_2016.pem", |
| 932 X509Certificate::FORMAT_AUTO); | 960 X509Certificate::FORMAT_AUTO); |
| 933 ASSERT_TRUE(cert); | 961 ASSERT_TRUE(cert); |
| 934 error = Verify(cert.get(), "127.0.0.1", 0, NULL, empty_cert_list_, | 962 error = verify_proc->Verify(cert.get(), "127.0.0.1", std::string(), 0, NULL, |
| 935 &verify_result); | 963 CertificateList(), &verify_result); |
| 936 EXPECT_THAT(error, IsError(ERR_CERT_WEAK_SIGNATURE_ALGORITHM)); | 964 EXPECT_THAT(error, IsError(ERR_CERT_WEAK_SIGNATURE_ALGORITHM)); |
| 937 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_WEAK_SIGNATURE_ALGORITHM); | 965 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_WEAK_SIGNATURE_ALGORITHM); |
| 938 | 966 |
| 939 // Enterprise issued SHA-1 leaf certificates issued on/after 1 January 2016 | 967 // Enterprise issued SHA-1 leaf certificates issued on/after 1 January 2016 |
| 940 // remain accepted. | 968 // remain accepted. |
| 941 verify_result.Reset(); | 969 verify_result.Reset(); |
| 942 dummy_result.Reset(); | 970 dummy_result.Reset(); |
| 943 dummy_result.is_issued_by_known_root = false; | 971 dummy_result.is_issued_by_known_root = false; |
| 944 dummy_result.has_sha1 = true; | 972 dummy_result.has_sha1 = true; |
| 945 dummy_result.has_sha1_leaf = true; | 973 dummy_result.has_sha1_leaf = true; |
| 946 verify_proc_ = new MockCertVerifyProc(dummy_result); | 974 verify_proc = make_scoped_refptr(new MockCertVerifyProc(dummy_result)); |
| 947 cert = CreateCertificateChainFromFile(GetTestCertsDirectory(), | 975 cert = CreateCertificateChainFromFile(GetTestCertsDirectory(), |
| 948 "sha1_jan_2016.pem", | 976 "sha1_jan_2016.pem", |
| 949 X509Certificate::FORMAT_AUTO); | 977 X509Certificate::FORMAT_AUTO); |
| 950 ASSERT_TRUE(cert); | 978 ASSERT_TRUE(cert); |
| 951 error = Verify(cert.get(), "127.0.0.1", 0, NULL, empty_cert_list_, | 979 error = verify_proc->Verify(cert.get(), "127.0.0.1", std::string(), 0, NULL, |
| 952 &verify_result); | 980 CertificateList(), &verify_result); |
| 953 EXPECT_THAT(error, IsOk()); | 981 EXPECT_THAT(error, IsOk()); |
| 954 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_SHA1_SIGNATURE_PRESENT); | 982 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_SHA1_SIGNATURE_PRESENT); |
| 955 | 983 |
| 956 // Publicly trusted SHA-1 intermediates issued on/after 1 January 2016 are, | 984 // Publicly trusted SHA-1 intermediates issued on/after 1 January 2016 are, |
| 957 // unfortunately, accepted. This can arise due to OS path building quirks. | 985 // unfortunately, accepted. This can arise due to OS path building quirks. |
| 958 verify_result.Reset(); | 986 verify_result.Reset(); |
| 959 dummy_result.Reset(); | 987 dummy_result.Reset(); |
| 960 dummy_result.is_issued_by_known_root = true; | 988 dummy_result.is_issued_by_known_root = true; |
| 961 dummy_result.has_sha1 = true; | 989 dummy_result.has_sha1 = true; |
| 962 dummy_result.has_sha1_leaf = false; | 990 dummy_result.has_sha1_leaf = false; |
| 963 verify_proc_ = new MockCertVerifyProc(dummy_result); | 991 verify_proc = make_scoped_refptr(new MockCertVerifyProc(dummy_result)); |
| 964 cert = CreateCertificateChainFromFile(GetTestCertsDirectory(), | 992 cert = CreateCertificateChainFromFile(GetTestCertsDirectory(), |
| 965 "sha1_jan_2016.pem", | 993 "sha1_jan_2016.pem", |
| 966 X509Certificate::FORMAT_AUTO); | 994 X509Certificate::FORMAT_AUTO); |
| 967 ASSERT_TRUE(cert); | 995 ASSERT_TRUE(cert); |
| 968 error = Verify(cert.get(), "127.0.0.1", 0, NULL, empty_cert_list_, | 996 error = verify_proc->Verify(cert.get(), "127.0.0.1", std::string(), 0, NULL, |
| 969 &verify_result); | 997 CertificateList(), &verify_result); |
| 970 EXPECT_THAT(error, IsOk()); | 998 EXPECT_THAT(error, IsOk()); |
| 971 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_SHA1_SIGNATURE_PRESENT); | 999 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_SHA1_SIGNATURE_PRESENT); |
| 972 } | 1000 } |
| 973 | 1001 |
| 974 // Test that the certificate returned in CertVerifyResult is able to reorder | 1002 // Test that the certificate returned in CertVerifyResult is able to reorder |
| 975 // certificates that are not ordered from end-entity to root. While this is | 1003 // certificates that are not ordered from end-entity to root. While this is |
| 976 // a protocol violation if sent during a TLS handshake, if multiple sources | 1004 // a protocol violation if sent during a TLS handshake, if multiple sources |
| 977 // of intermediate certificates are combined, it's possible that order may | 1005 // of intermediate certificates are combined, it's possible that order may |
| 978 // not be maintained. | 1006 // not be maintained. |
| 979 TEST_F(CertVerifyProcTest, VerifyReturnChainProperlyOrdered) { | 1007 TEST_P(CertVerifyProcInternalTest, VerifyReturnChainProperlyOrdered) { |
| 980 if (!SupportsReturningVerifiedChain()) { | 1008 if (!SupportsReturningVerifiedChain()) { |
| 981 LOG(INFO) << "Skipping this test in this platform."; | 1009 LOG(INFO) << "Skipping this test in this platform."; |
| 982 return; | 1010 return; |
| 983 } | 1011 } |
| 984 | 1012 |
| 985 base::FilePath certs_dir = GetTestCertsDirectory(); | 1013 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 986 CertificateList certs = CreateCertificateListFromFile( | 1014 CertificateList certs = CreateCertificateListFromFile( |
| 987 certs_dir, "x509_verify_results.chain.pem", | 1015 certs_dir, "x509_verify_results.chain.pem", X509Certificate::FORMAT_AUTO); |
| 988 X509Certificate::FORMAT_AUTO); | |
| 989 ASSERT_EQ(3U, certs.size()); | 1016 ASSERT_EQ(3U, certs.size()); |
| 990 | 1017 |
| 991 // Construct the chain out of order. | 1018 // Construct the chain out of order. |
| 992 X509Certificate::OSCertHandles intermediates; | 1019 X509Certificate::OSCertHandles intermediates; |
| 993 intermediates.push_back(certs[2]->os_cert_handle()); | 1020 intermediates.push_back(certs[2]->os_cert_handle()); |
| 994 intermediates.push_back(certs[1]->os_cert_handle()); | 1021 intermediates.push_back(certs[1]->os_cert_handle()); |
| 995 | 1022 |
| 996 ScopedTestRoot scoped_root(certs[2].get()); | 1023 ScopedTestRoot scoped_root(certs[2].get()); |
| 997 | 1024 |
| 998 scoped_refptr<X509Certificate> google_full_chain = | 1025 scoped_refptr<X509Certificate> google_full_chain = |
| 999 X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(), | 1026 X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(), |
| 1000 intermediates); | 1027 intermediates); |
| 1001 ASSERT_NE(static_cast<X509Certificate*>(NULL), google_full_chain.get()); | 1028 ASSERT_NE(static_cast<X509Certificate*>(NULL), google_full_chain.get()); |
| 1002 ASSERT_EQ(2U, google_full_chain->GetIntermediateCertificates().size()); | 1029 ASSERT_EQ(2U, google_full_chain->GetIntermediateCertificates().size()); |
| 1003 | 1030 |
| 1004 CertVerifyResult verify_result; | 1031 CertVerifyResult verify_result; |
| 1005 EXPECT_EQ(static_cast<X509Certificate*>(NULL), | 1032 EXPECT_EQ(static_cast<X509Certificate*>(NULL), |
| 1006 verify_result.verified_cert.get()); | 1033 verify_result.verified_cert.get()); |
| 1007 int error = Verify(google_full_chain.get(), | 1034 int error = Verify(google_full_chain.get(), "127.0.0.1", 0, NULL, |
| 1008 "127.0.0.1", | 1035 CertificateList(), &verify_result); |
| 1009 0, | |
| 1010 NULL, | |
| 1011 empty_cert_list_, | |
| 1012 &verify_result); | |
| 1013 EXPECT_THAT(error, IsOk()); | 1036 EXPECT_THAT(error, IsOk()); |
| 1014 ASSERT_NE(static_cast<X509Certificate*>(NULL), | 1037 ASSERT_NE(static_cast<X509Certificate*>(NULL), |
| 1015 verify_result.verified_cert.get()); | 1038 verify_result.verified_cert.get()); |
| 1016 | 1039 |
| 1017 EXPECT_NE(google_full_chain, verify_result.verified_cert); | 1040 EXPECT_NE(google_full_chain, verify_result.verified_cert); |
| 1018 EXPECT_TRUE(X509Certificate::IsSameOSCert( | 1041 EXPECT_TRUE(X509Certificate::IsSameOSCert( |
| 1019 google_full_chain->os_cert_handle(), | 1042 google_full_chain->os_cert_handle(), |
| 1020 verify_result.verified_cert->os_cert_handle())); | 1043 verify_result.verified_cert->os_cert_handle())); |
| 1021 const X509Certificate::OSCertHandles& return_intermediates = | 1044 const X509Certificate::OSCertHandles& return_intermediates = |
| 1022 verify_result.verified_cert->GetIntermediateCertificates(); | 1045 verify_result.verified_cert->GetIntermediateCertificates(); |
| 1023 ASSERT_EQ(2U, return_intermediates.size()); | 1046 ASSERT_EQ(2U, return_intermediates.size()); |
| 1024 EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[0], | 1047 EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[0], |
| 1025 certs[1]->os_cert_handle())); | 1048 certs[1]->os_cert_handle())); |
| 1026 EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[1], | 1049 EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[1], |
| 1027 certs[2]->os_cert_handle())); | 1050 certs[2]->os_cert_handle())); |
| 1028 } | 1051 } |
| 1029 | 1052 |
| 1030 // Test that Verify() filters out certificates which are not related to | 1053 // Test that Verify() filters out certificates which are not related to |
| 1031 // or part of the certificate chain being verified. | 1054 // or part of the certificate chain being verified. |
| 1032 TEST_F(CertVerifyProcTest, VerifyReturnChainFiltersUnrelatedCerts) { | 1055 TEST_P(CertVerifyProcInternalTest, VerifyReturnChainFiltersUnrelatedCerts) { |
| 1033 if (!SupportsReturningVerifiedChain()) { | 1056 if (!SupportsReturningVerifiedChain()) { |
| 1034 LOG(INFO) << "Skipping this test in this platform."; | 1057 LOG(INFO) << "Skipping this test in this platform."; |
| 1035 return; | 1058 return; |
| 1036 } | 1059 } |
| 1037 | 1060 |
| 1038 base::FilePath certs_dir = GetTestCertsDirectory(); | 1061 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 1039 CertificateList certs = CreateCertificateListFromFile( | 1062 CertificateList certs = CreateCertificateListFromFile( |
| 1040 certs_dir, "x509_verify_results.chain.pem", | 1063 certs_dir, "x509_verify_results.chain.pem", X509Certificate::FORMAT_AUTO); |
| 1041 X509Certificate::FORMAT_AUTO); | |
| 1042 ASSERT_EQ(3U, certs.size()); | 1064 ASSERT_EQ(3U, certs.size()); |
| 1043 ScopedTestRoot scoped_root(certs[2].get()); | 1065 ScopedTestRoot scoped_root(certs[2].get()); |
| 1044 | 1066 |
| 1045 scoped_refptr<X509Certificate> unrelated_certificate = | 1067 scoped_refptr<X509Certificate> unrelated_certificate = |
| 1046 ImportCertFromFile(certs_dir, "duplicate_cn_1.pem"); | 1068 ImportCertFromFile(certs_dir, "duplicate_cn_1.pem"); |
| 1047 scoped_refptr<X509Certificate> unrelated_certificate2 = | 1069 scoped_refptr<X509Certificate> unrelated_certificate2 = |
| 1048 ImportCertFromFile(certs_dir, "aia-cert.pem"); | 1070 ImportCertFromFile(certs_dir, "aia-cert.pem"); |
| 1049 ASSERT_NE(static_cast<X509Certificate*>(NULL), unrelated_certificate.get()); | 1071 ASSERT_NE(static_cast<X509Certificate*>(NULL), unrelated_certificate.get()); |
| 1050 ASSERT_NE(static_cast<X509Certificate*>(NULL), unrelated_certificate2.get()); | 1072 ASSERT_NE(static_cast<X509Certificate*>(NULL), unrelated_certificate2.get()); |
| 1051 | 1073 |
| 1052 // Interject unrelated certificates into the list of intermediates. | 1074 // Interject unrelated certificates into the list of intermediates. |
| 1053 X509Certificate::OSCertHandles intermediates; | 1075 X509Certificate::OSCertHandles intermediates; |
| 1054 intermediates.push_back(unrelated_certificate->os_cert_handle()); | 1076 intermediates.push_back(unrelated_certificate->os_cert_handle()); |
| 1055 intermediates.push_back(certs[1]->os_cert_handle()); | 1077 intermediates.push_back(certs[1]->os_cert_handle()); |
| 1056 intermediates.push_back(unrelated_certificate2->os_cert_handle()); | 1078 intermediates.push_back(unrelated_certificate2->os_cert_handle()); |
| 1057 intermediates.push_back(certs[2]->os_cert_handle()); | 1079 intermediates.push_back(certs[2]->os_cert_handle()); |
| 1058 | 1080 |
| 1059 scoped_refptr<X509Certificate> google_full_chain = | 1081 scoped_refptr<X509Certificate> google_full_chain = |
| 1060 X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(), | 1082 X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(), |
| 1061 intermediates); | 1083 intermediates); |
| 1062 ASSERT_NE(static_cast<X509Certificate*>(NULL), google_full_chain.get()); | 1084 ASSERT_NE(static_cast<X509Certificate*>(NULL), google_full_chain.get()); |
| 1063 ASSERT_EQ(4U, google_full_chain->GetIntermediateCertificates().size()); | 1085 ASSERT_EQ(4U, google_full_chain->GetIntermediateCertificates().size()); |
| 1064 | 1086 |
| 1065 CertVerifyResult verify_result; | 1087 CertVerifyResult verify_result; |
| 1066 EXPECT_EQ(static_cast<X509Certificate*>(NULL), | 1088 EXPECT_EQ(static_cast<X509Certificate*>(NULL), |
| 1067 verify_result.verified_cert.get()); | 1089 verify_result.verified_cert.get()); |
| 1068 int error = Verify(google_full_chain.get(), | 1090 int error = Verify(google_full_chain.get(), "127.0.0.1", 0, NULL, |
| 1069 "127.0.0.1", | 1091 CertificateList(), &verify_result); |
| 1070 0, | |
| 1071 NULL, | |
| 1072 empty_cert_list_, | |
| 1073 &verify_result); | |
| 1074 EXPECT_THAT(error, IsOk()); | 1092 EXPECT_THAT(error, IsOk()); |
| 1075 ASSERT_NE(static_cast<X509Certificate*>(NULL), | 1093 ASSERT_NE(static_cast<X509Certificate*>(NULL), |
| 1076 verify_result.verified_cert.get()); | 1094 verify_result.verified_cert.get()); |
| 1077 | 1095 |
| 1078 EXPECT_NE(google_full_chain, verify_result.verified_cert); | 1096 EXPECT_NE(google_full_chain, verify_result.verified_cert); |
| 1079 EXPECT_TRUE(X509Certificate::IsSameOSCert( | 1097 EXPECT_TRUE(X509Certificate::IsSameOSCert( |
| 1080 google_full_chain->os_cert_handle(), | 1098 google_full_chain->os_cert_handle(), |
| 1081 verify_result.verified_cert->os_cert_handle())); | 1099 verify_result.verified_cert->os_cert_handle())); |
| 1082 const X509Certificate::OSCertHandles& return_intermediates = | 1100 const X509Certificate::OSCertHandles& return_intermediates = |
| 1083 verify_result.verified_cert->GetIntermediateCertificates(); | 1101 verify_result.verified_cert->GetIntermediateCertificates(); |
| 1084 ASSERT_EQ(2U, return_intermediates.size()); | 1102 ASSERT_EQ(2U, return_intermediates.size()); |
| 1085 EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[0], | 1103 EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[0], |
| 1086 certs[1]->os_cert_handle())); | 1104 certs[1]->os_cert_handle())); |
| 1087 EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[1], | 1105 EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[1], |
| 1088 certs[2]->os_cert_handle())); | 1106 certs[2]->os_cert_handle())); |
| 1089 } | 1107 } |
| 1090 | 1108 |
| 1091 TEST_F(CertVerifyProcTest, AdditionalTrustAnchors) { | 1109 TEST_P(CertVerifyProcInternalTest, AdditionalTrustAnchors) { |
| 1092 if (!SupportsAdditionalTrustAnchors()) { | 1110 if (!SupportsAdditionalTrustAnchors()) { |
| 1093 LOG(INFO) << "Skipping this test in this platform."; | 1111 LOG(INFO) << "Skipping this test in this platform."; |
| 1094 return; | 1112 return; |
| 1095 } | 1113 } |
| 1096 | 1114 |
| 1097 // |ca_cert| is the issuer of |cert|. | 1115 // |ca_cert| is the issuer of |cert|. |
| 1098 CertificateList ca_cert_list = CreateCertificateListFromFile( | 1116 CertificateList ca_cert_list = |
| 1099 GetTestCertsDirectory(), "root_ca_cert.pem", | 1117 CreateCertificateListFromFile(GetTestCertsDirectory(), "root_ca_cert.pem", |
| 1100 X509Certificate::FORMAT_AUTO); | 1118 X509Certificate::FORMAT_AUTO); |
| 1101 ASSERT_EQ(1U, ca_cert_list.size()); | 1119 ASSERT_EQ(1U, ca_cert_list.size()); |
| 1102 scoped_refptr<X509Certificate> ca_cert(ca_cert_list[0]); | 1120 scoped_refptr<X509Certificate> ca_cert(ca_cert_list[0]); |
| 1103 | 1121 |
| 1104 CertificateList cert_list = CreateCertificateListFromFile( | 1122 CertificateList cert_list = CreateCertificateListFromFile( |
| 1105 GetTestCertsDirectory(), "ok_cert.pem", | 1123 GetTestCertsDirectory(), "ok_cert.pem", X509Certificate::FORMAT_AUTO); |
| 1106 X509Certificate::FORMAT_AUTO); | |
| 1107 ASSERT_EQ(1U, cert_list.size()); | 1124 ASSERT_EQ(1U, cert_list.size()); |
| 1108 scoped_refptr<X509Certificate> cert(cert_list[0]); | 1125 scoped_refptr<X509Certificate> cert(cert_list[0]); |
| 1109 | 1126 |
| 1110 // Verification of |cert| fails when |ca_cert| is not in the trust anchors | 1127 // Verification of |cert| fails when |ca_cert| is not in the trust anchors |
| 1111 // list. | 1128 // list. |
| 1112 int flags = 0; | 1129 int flags = 0; |
| 1113 CertVerifyResult verify_result; | 1130 CertVerifyResult verify_result; |
| 1114 int error = Verify( | 1131 int error = Verify(cert.get(), "127.0.0.1", flags, NULL, CertificateList(), |
| 1115 cert.get(), "127.0.0.1", flags, NULL, empty_cert_list_, &verify_result); | 1132 &verify_result); |
| 1116 EXPECT_THAT(error, IsError(ERR_CERT_AUTHORITY_INVALID)); | 1133 EXPECT_THAT(error, IsError(ERR_CERT_AUTHORITY_INVALID)); |
| 1117 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, verify_result.cert_status); | 1134 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, verify_result.cert_status); |
| 1118 EXPECT_FALSE(verify_result.is_issued_by_additional_trust_anchor); | 1135 EXPECT_FALSE(verify_result.is_issued_by_additional_trust_anchor); |
| 1119 | 1136 |
| 1120 // Now add the |ca_cert| to the |trust_anchors|, and verification should pass. | 1137 // Now add the |ca_cert| to the |trust_anchors|, and verification should pass. |
| 1121 CertificateList trust_anchors; | 1138 CertificateList trust_anchors; |
| 1122 trust_anchors.push_back(ca_cert); | 1139 trust_anchors.push_back(ca_cert); |
| 1123 error = Verify( | 1140 error = Verify(cert.get(), "127.0.0.1", flags, NULL, trust_anchors, |
| 1124 cert.get(), "127.0.0.1", flags, NULL, trust_anchors, &verify_result); | 1141 &verify_result); |
| 1125 EXPECT_THAT(error, IsOk()); | 1142 EXPECT_THAT(error, IsOk()); |
| 1126 EXPECT_EQ(0U, verify_result.cert_status); | 1143 EXPECT_EQ(0U, verify_result.cert_status); |
| 1127 EXPECT_TRUE(verify_result.is_issued_by_additional_trust_anchor); | 1144 EXPECT_TRUE(verify_result.is_issued_by_additional_trust_anchor); |
| 1128 | 1145 |
| 1129 // Clearing the |trust_anchors| makes verification fail again (the cache | 1146 // Clearing the |trust_anchors| makes verification fail again (the cache |
| 1130 // should be skipped). | 1147 // should be skipped). |
| 1131 error = Verify( | 1148 error = Verify(cert.get(), "127.0.0.1", flags, NULL, CertificateList(), |
| 1132 cert.get(), "127.0.0.1", flags, NULL, empty_cert_list_, &verify_result); | 1149 &verify_result); |
| 1133 EXPECT_THAT(error, IsError(ERR_CERT_AUTHORITY_INVALID)); | 1150 EXPECT_THAT(error, IsError(ERR_CERT_AUTHORITY_INVALID)); |
| 1134 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, verify_result.cert_status); | 1151 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, verify_result.cert_status); |
| 1135 EXPECT_FALSE(verify_result.is_issued_by_additional_trust_anchor); | 1152 EXPECT_FALSE(verify_result.is_issued_by_additional_trust_anchor); |
| 1136 } | 1153 } |
| 1137 | 1154 |
| 1138 // Tests that certificates issued by user-supplied roots are not flagged as | 1155 // Tests that certificates issued by user-supplied roots are not flagged as |
| 1139 // issued by a known root. This should pass whether or not the platform supports | 1156 // issued by a known root. This should pass whether or not the platform supports |
| 1140 // detecting known roots. | 1157 // detecting known roots. |
| 1141 TEST_F(CertVerifyProcTest, IsIssuedByKnownRootIgnoresTestRoots) { | 1158 TEST_P(CertVerifyProcInternalTest, IsIssuedByKnownRootIgnoresTestRoots) { |
| 1142 // Load root_ca_cert.pem into the test root store. | 1159 // Load root_ca_cert.pem into the test root store. |
| 1143 ScopedTestRoot test_root( | 1160 ScopedTestRoot test_root( |
| 1144 ImportCertFromFile(GetTestCertsDirectory(), "root_ca_cert.pem").get()); | 1161 ImportCertFromFile(GetTestCertsDirectory(), "root_ca_cert.pem").get()); |
| 1145 | 1162 |
| 1146 scoped_refptr<X509Certificate> cert( | 1163 scoped_refptr<X509Certificate> cert( |
| 1147 ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); | 1164 ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); |
| 1148 | 1165 |
| 1149 // Verification should pass. | 1166 // Verification should pass. |
| 1150 int flags = 0; | 1167 int flags = 0; |
| 1151 CertVerifyResult verify_result; | 1168 CertVerifyResult verify_result; |
| 1152 int error = Verify( | 1169 int error = Verify(cert.get(), "127.0.0.1", flags, NULL, CertificateList(), |
| 1153 cert.get(), "127.0.0.1", flags, NULL, empty_cert_list_, &verify_result); | 1170 &verify_result); |
| 1154 EXPECT_THAT(error, IsOk()); | 1171 EXPECT_THAT(error, IsOk()); |
| 1155 EXPECT_EQ(0U, verify_result.cert_status); | 1172 EXPECT_EQ(0U, verify_result.cert_status); |
| 1156 // But should not be marked as a known root. | 1173 // But should not be marked as a known root. |
| 1157 EXPECT_FALSE(verify_result.is_issued_by_known_root); | 1174 EXPECT_FALSE(verify_result.is_issued_by_known_root); |
| 1158 } | 1175 } |
| 1159 | 1176 |
| 1160 #if defined(USE_NSS_CERTS) || defined(OS_WIN) || \ | |
| 1161 (defined(OS_MACOSX) && !defined(OS_IOS)) | |
| 1162 // Test that CRLSets are effective in making a certificate appear to be | 1177 // Test that CRLSets are effective in making a certificate appear to be |
| 1163 // revoked. | 1178 // revoked. |
| 1164 TEST_F(CertVerifyProcTest, CRLSet) { | 1179 TEST_P(CertVerifyProcInternalTest, CRLSet) { |
| 1180 if (!SupportsCRLSet()) { |
| 1181 LOG(INFO) << "Skipping test as verifier doesn't support CRLSet"; |
| 1182 return; |
| 1183 } |
| 1184 |
| 1165 CertificateList ca_cert_list = | 1185 CertificateList ca_cert_list = |
| 1166 CreateCertificateListFromFile(GetTestCertsDirectory(), | 1186 CreateCertificateListFromFile(GetTestCertsDirectory(), "root_ca_cert.pem", |
| 1167 "root_ca_cert.pem", | |
| 1168 X509Certificate::FORMAT_AUTO); | 1187 X509Certificate::FORMAT_AUTO); |
| 1169 ASSERT_EQ(1U, ca_cert_list.size()); | 1188 ASSERT_EQ(1U, ca_cert_list.size()); |
| 1170 ScopedTestRoot test_root(ca_cert_list[0].get()); | 1189 ScopedTestRoot test_root(ca_cert_list[0].get()); |
| 1171 | 1190 |
| 1172 CertificateList cert_list = CreateCertificateListFromFile( | 1191 CertificateList cert_list = CreateCertificateListFromFile( |
| 1173 GetTestCertsDirectory(), "ok_cert.pem", X509Certificate::FORMAT_AUTO); | 1192 GetTestCertsDirectory(), "ok_cert.pem", X509Certificate::FORMAT_AUTO); |
| 1174 ASSERT_EQ(1U, cert_list.size()); | 1193 ASSERT_EQ(1U, cert_list.size()); |
| 1175 scoped_refptr<X509Certificate> cert(cert_list[0]); | 1194 scoped_refptr<X509Certificate> cert(cert_list[0]); |
| 1176 | 1195 |
| 1177 int flags = 0; | 1196 int flags = 0; |
| 1178 CertVerifyResult verify_result; | 1197 CertVerifyResult verify_result; |
| 1179 int error = Verify( | 1198 int error = Verify(cert.get(), "127.0.0.1", flags, NULL, CertificateList(), |
| 1180 cert.get(), "127.0.0.1", flags, NULL, empty_cert_list_, &verify_result); | 1199 &verify_result); |
| 1181 EXPECT_THAT(error, IsOk()); | 1200 EXPECT_THAT(error, IsOk()); |
| 1182 EXPECT_EQ(0U, verify_result.cert_status); | 1201 EXPECT_EQ(0U, verify_result.cert_status); |
| 1183 | 1202 |
| 1184 scoped_refptr<CRLSet> crl_set; | 1203 scoped_refptr<CRLSet> crl_set; |
| 1185 std::string crl_set_bytes; | 1204 std::string crl_set_bytes; |
| 1186 | 1205 |
| 1187 // First test blocking by SPKI. | 1206 // First test blocking by SPKI. |
| 1188 EXPECT_TRUE(base::ReadFileToString( | 1207 EXPECT_TRUE(base::ReadFileToString( |
| 1189 GetTestCertsDirectory().AppendASCII("crlset_by_leaf_spki.raw"), | 1208 GetTestCertsDirectory().AppendASCII("crlset_by_leaf_spki.raw"), |
| 1190 &crl_set_bytes)); | 1209 &crl_set_bytes)); |
| 1191 ASSERT_TRUE(CRLSetStorage::Parse(crl_set_bytes, &crl_set)); | 1210 ASSERT_TRUE(CRLSetStorage::Parse(crl_set_bytes, &crl_set)); |
| 1192 | 1211 |
| 1193 error = Verify(cert.get(), | 1212 error = Verify(cert.get(), "127.0.0.1", flags, crl_set.get(), |
| 1194 "127.0.0.1", | 1213 CertificateList(), &verify_result); |
| 1195 flags, | |
| 1196 crl_set.get(), | |
| 1197 empty_cert_list_, | |
| 1198 &verify_result); | |
| 1199 EXPECT_THAT(error, IsError(ERR_CERT_REVOKED)); | 1214 EXPECT_THAT(error, IsError(ERR_CERT_REVOKED)); |
| 1200 | 1215 |
| 1201 // Second, test revocation by serial number of a cert directly under the | 1216 // Second, test revocation by serial number of a cert directly under the |
| 1202 // root. | 1217 // root. |
| 1203 crl_set_bytes.clear(); | 1218 crl_set_bytes.clear(); |
| 1204 EXPECT_TRUE(base::ReadFileToString( | 1219 EXPECT_TRUE(base::ReadFileToString( |
| 1205 GetTestCertsDirectory().AppendASCII("crlset_by_root_serial.raw"), | 1220 GetTestCertsDirectory().AppendASCII("crlset_by_root_serial.raw"), |
| 1206 &crl_set_bytes)); | 1221 &crl_set_bytes)); |
| 1207 ASSERT_TRUE(CRLSetStorage::Parse(crl_set_bytes, &crl_set)); | 1222 ASSERT_TRUE(CRLSetStorage::Parse(crl_set_bytes, &crl_set)); |
| 1208 | 1223 |
| 1209 error = Verify(cert.get(), | 1224 error = Verify(cert.get(), "127.0.0.1", flags, crl_set.get(), |
| 1210 "127.0.0.1", | 1225 CertificateList(), &verify_result); |
| 1211 flags, | |
| 1212 crl_set.get(), | |
| 1213 empty_cert_list_, | |
| 1214 &verify_result); | |
| 1215 EXPECT_THAT(error, IsError(ERR_CERT_REVOKED)); | 1226 EXPECT_THAT(error, IsError(ERR_CERT_REVOKED)); |
| 1216 } | 1227 } |
| 1217 | 1228 |
| 1218 TEST_F(CertVerifyProcTest, CRLSetLeafSerial) { | 1229 TEST_P(CertVerifyProcInternalTest, CRLSetLeafSerial) { |
| 1230 if (!SupportsCRLSet()) { |
| 1231 LOG(INFO) << "Skipping test as verifier doesn't support CRLSet"; |
| 1232 return; |
| 1233 } |
| 1234 |
| 1219 CertificateList ca_cert_list = | 1235 CertificateList ca_cert_list = |
| 1220 CreateCertificateListFromFile(GetTestCertsDirectory(), "root_ca_cert.pem", | 1236 CreateCertificateListFromFile(GetTestCertsDirectory(), "root_ca_cert.pem", |
| 1221 X509Certificate::FORMAT_AUTO); | 1237 X509Certificate::FORMAT_AUTO); |
| 1222 ASSERT_EQ(1U, ca_cert_list.size()); | 1238 ASSERT_EQ(1U, ca_cert_list.size()); |
| 1223 ScopedTestRoot test_root(ca_cert_list[0].get()); | 1239 ScopedTestRoot test_root(ca_cert_list[0].get()); |
| 1224 | 1240 |
| 1225 CertificateList intermediate_cert_list = CreateCertificateListFromFile( | 1241 CertificateList intermediate_cert_list = CreateCertificateListFromFile( |
| 1226 GetTestCertsDirectory(), "intermediate_ca_cert.pem", | 1242 GetTestCertsDirectory(), "intermediate_ca_cert.pem", |
| 1227 X509Certificate::FORMAT_AUTO); | 1243 X509Certificate::FORMAT_AUTO); |
| 1228 ASSERT_EQ(1U, intermediate_cert_list.size()); | 1244 ASSERT_EQ(1U, intermediate_cert_list.size()); |
| 1229 X509Certificate::OSCertHandles intermediates; | 1245 X509Certificate::OSCertHandles intermediates; |
| 1230 intermediates.push_back(intermediate_cert_list[0]->os_cert_handle()); | 1246 intermediates.push_back(intermediate_cert_list[0]->os_cert_handle()); |
| 1231 | 1247 |
| 1232 CertificateList cert_list = CreateCertificateListFromFile( | 1248 CertificateList cert_list = CreateCertificateListFromFile( |
| 1233 GetTestCertsDirectory(), "ok_cert_by_intermediate.pem", | 1249 GetTestCertsDirectory(), "ok_cert_by_intermediate.pem", |
| 1234 X509Certificate::FORMAT_AUTO); | 1250 X509Certificate::FORMAT_AUTO); |
| 1235 ASSERT_EQ(1U, cert_list.size()); | 1251 ASSERT_EQ(1U, cert_list.size()); |
| 1236 | 1252 |
| 1237 scoped_refptr<X509Certificate> leaf = X509Certificate::CreateFromHandle( | 1253 scoped_refptr<X509Certificate> leaf = X509Certificate::CreateFromHandle( |
| 1238 cert_list[0]->os_cert_handle(), intermediates); | 1254 cert_list[0]->os_cert_handle(), intermediates); |
| 1239 ASSERT_TRUE(leaf); | 1255 ASSERT_TRUE(leaf); |
| 1240 | 1256 |
| 1241 int flags = 0; | 1257 int flags = 0; |
| 1242 CertVerifyResult verify_result; | 1258 CertVerifyResult verify_result; |
| 1243 int error = Verify(leaf.get(), "127.0.0.1", flags, NULL, empty_cert_list_, | 1259 int error = Verify(leaf.get(), "127.0.0.1", flags, NULL, CertificateList(), |
| 1244 &verify_result); | 1260 &verify_result); |
| 1245 EXPECT_THAT(error, IsOk()); | 1261 EXPECT_THAT(error, IsOk()); |
| 1246 | 1262 |
| 1247 // Test revocation by serial number of a certificate not under the root. | 1263 // Test revocation by serial number of a certificate not under the root. |
| 1248 scoped_refptr<CRLSet> crl_set; | 1264 scoped_refptr<CRLSet> crl_set; |
| 1249 std::string crl_set_bytes; | 1265 std::string crl_set_bytes; |
| 1250 ASSERT_TRUE(base::ReadFileToString( | 1266 ASSERT_TRUE(base::ReadFileToString( |
| 1251 GetTestCertsDirectory().AppendASCII("crlset_by_intermediate_serial.raw"), | 1267 GetTestCertsDirectory().AppendASCII("crlset_by_intermediate_serial.raw"), |
| 1252 &crl_set_bytes)); | 1268 &crl_set_bytes)); |
| 1253 ASSERT_TRUE(CRLSetStorage::Parse(crl_set_bytes, &crl_set)); | 1269 ASSERT_TRUE(CRLSetStorage::Parse(crl_set_bytes, &crl_set)); |
| 1254 | 1270 |
| 1255 error = Verify(leaf.get(), "127.0.0.1", flags, crl_set.get(), | 1271 error = Verify(leaf.get(), "127.0.0.1", flags, crl_set.get(), |
| 1256 empty_cert_list_, &verify_result); | 1272 CertificateList(), &verify_result); |
| 1257 EXPECT_THAT(error, IsError(ERR_CERT_REVOKED)); | 1273 EXPECT_THAT(error, IsError(ERR_CERT_REVOKED)); |
| 1258 } | 1274 } |
| 1259 | 1275 |
| 1260 // Tests that CRLSets participate in path building functions, and that as | 1276 // Tests that CRLSets participate in path building functions, and that as |
| 1261 // long as a valid path exists within the verification graph, verification | 1277 // long as a valid path exists within the verification graph, verification |
| 1262 // succeeds. | 1278 // succeeds. |
| 1263 // | 1279 // |
| 1264 // In this test, there are two roots (D and E), and three possible paths | 1280 // In this test, there are two roots (D and E), and three possible paths |
| 1265 // to validate a leaf (A): | 1281 // to validate a leaf (A): |
| 1266 // 1. A(B) -> B(C) -> C(D) -> D(D) | 1282 // 1. A(B) -> B(C) -> C(D) -> D(D) |
| 1267 // 2. A(B) -> B(C) -> C(E) -> E(E) | 1283 // 2. A(B) -> B(C) -> C(E) -> E(E) |
| 1268 // 3. A(B) -> B(F) -> F(E) -> E(E) | 1284 // 3. A(B) -> B(F) -> F(E) -> E(E) |
| 1269 // | 1285 // |
| 1270 // Each permutation of revocation is tried: | 1286 // Each permutation of revocation is tried: |
| 1271 // 1. Revoking E by SPKI, so that only Path 1 is valid (as E is in Paths 2 & 3) | 1287 // 1. Revoking E by SPKI, so that only Path 1 is valid (as E is in Paths 2 & 3) |
| 1272 // 2. Revoking C(D) and F(E) by serial, so that only Path 2 is valid. | 1288 // 2. Revoking C(D) and F(E) by serial, so that only Path 2 is valid. |
| 1273 // 3. Revoking C by SPKI, so that only Path 3 is valid (as C is in Paths 1 & 2) | 1289 // 3. Revoking C by SPKI, so that only Path 3 is valid (as C is in Paths 1 & 2) |
| 1274 TEST_F(CertVerifyProcTest, CRLSetDuringPathBuilding) { | 1290 TEST_P(CertVerifyProcInternalTest, CRLSetDuringPathBuilding) { |
| 1275 if (!SupportsCRLSetsInPathBuilding()) { | 1291 if (!SupportsCRLSetsInPathBuilding()) { |
| 1276 LOG(INFO) << "Skipping this test on this platform."; | 1292 LOG(INFO) << "Skipping this test on this platform."; |
| 1277 return; | 1293 return; |
| 1278 } | 1294 } |
| 1279 | 1295 |
| 1280 const char* const kPath1Files[] = { | 1296 const char* const kPath1Files[] = { |
| 1281 "multi-root-A-by-B.pem", "multi-root-B-by-C.pem", "multi-root-C-by-D.pem", | 1297 "multi-root-A-by-B.pem", "multi-root-B-by-C.pem", "multi-root-C-by-D.pem", |
| 1282 "multi-root-D-by-D.pem"}; | 1298 "multi-root-D-by-D.pem"}; |
| 1283 const char* const kPath2Files[] = { | 1299 const char* const kPath2Files[] = { |
| 1284 "multi-root-A-by-B.pem", "multi-root-B-by-C.pem", "multi-root-C-by-E.pem", | 1300 "multi-root-A-by-B.pem", "multi-root-B-by-C.pem", "multi-root-C-by-E.pem", |
| 1285 "multi-root-E-by-E.pem"}; | 1301 "multi-root-E-by-E.pem"}; |
| 1286 const char* const kPath3Files[] = { | 1302 const char* const kPath3Files[] = { |
| 1287 "multi-root-A-by-B.pem", "multi-root-B-by-F.pem", "multi-root-F-by-E.pem", | 1303 "multi-root-A-by-B.pem", "multi-root-B-by-F.pem", "multi-root-F-by-E.pem", |
| 1288 "multi-root-E-by-E.pem"}; | 1304 "multi-root-E-by-E.pem"}; |
| 1289 | 1305 |
| 1290 CertificateList path_1_certs; | 1306 CertificateList path_1_certs; |
| 1291 ASSERT_NO_FATAL_FAILURE(LoadCertificateFiles(kPath1Files, &path_1_certs)); | 1307 ASSERT_NO_FATAL_FAILURE(LoadCertificateFiles(kPath1Files, &path_1_certs)); |
| 1292 | 1308 |
| 1293 CertificateList path_2_certs; | 1309 CertificateList path_2_certs; |
| 1294 ASSERT_NO_FATAL_FAILURE(LoadCertificateFiles(kPath2Files, &path_2_certs)); | 1310 ASSERT_NO_FATAL_FAILURE(LoadCertificateFiles(kPath2Files, &path_2_certs)); |
| 1295 | 1311 |
| 1296 CertificateList path_3_certs; | 1312 CertificateList path_3_certs; |
| 1297 ASSERT_NO_FATAL_FAILURE(LoadCertificateFiles(kPath3Files, &path_3_certs)); | 1313 ASSERT_NO_FATAL_FAILURE(LoadCertificateFiles(kPath3Files, &path_3_certs)); |
| 1298 | 1314 |
| 1299 // Add D and E as trust anchors. | 1315 // Add D and E as trust anchors. |
| 1300 ScopedTestRoot test_root_D(path_1_certs[3].get()); // D-by-D | 1316 ScopedTestRoot test_root_D(path_1_certs[3].get()); // D-by-D |
| 1301 ScopedTestRoot test_root_E(path_2_certs[3].get()); // E-by-E | 1317 ScopedTestRoot test_root_E(path_2_certs[3].get()); // E-by-E |
| 1302 | 1318 |
| 1303 // Create a chain that contains all the certificate paths possible. | 1319 // Create a chain that contains all the certificate paths possible. |
| 1304 // CertVerifyProcTest.VerifyReturnChainFiltersUnrelatedCerts already | 1320 // CertVerifyProcInternalTest.VerifyReturnChainFiltersUnrelatedCerts already |
| 1305 // ensures that it's safe to send additional certificates as inputs, and | 1321 // ensures that it's safe to send additional certificates as inputs, and |
| 1306 // that they're ignored if not necessary. | 1322 // that they're ignored if not necessary. |
| 1307 // This is to avoid relying on AIA or internal object caches when | 1323 // This is to avoid relying on AIA or internal object caches when |
| 1308 // interacting with the underlying library. | 1324 // interacting with the underlying library. |
| 1309 X509Certificate::OSCertHandles intermediates; | 1325 X509Certificate::OSCertHandles intermediates; |
| 1310 intermediates.push_back(path_1_certs[1]->os_cert_handle()); // B-by-C | 1326 intermediates.push_back(path_1_certs[1]->os_cert_handle()); // B-by-C |
| 1311 intermediates.push_back(path_1_certs[2]->os_cert_handle()); // C-by-D | 1327 intermediates.push_back(path_1_certs[2]->os_cert_handle()); // C-by-D |
| 1312 intermediates.push_back(path_2_certs[2]->os_cert_handle()); // C-by-E | 1328 intermediates.push_back(path_2_certs[2]->os_cert_handle()); // C-by-E |
| 1313 intermediates.push_back(path_3_certs[1]->os_cert_handle()); // B-by-F | 1329 intermediates.push_back(path_3_certs[1]->os_cert_handle()); // B-by-F |
| 1314 intermediates.push_back(path_3_certs[2]->os_cert_handle()); // F-by-E | 1330 intermediates.push_back(path_3_certs[2]->os_cert_handle()); // F-by-E |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1331 SCOPED_TRACE(testcase.crlset); | 1347 SCOPED_TRACE(testcase.crlset); |
| 1332 scoped_refptr<CRLSet> crl_set; | 1348 scoped_refptr<CRLSet> crl_set; |
| 1333 std::string crl_set_bytes; | 1349 std::string crl_set_bytes; |
| 1334 EXPECT_TRUE(base::ReadFileToString( | 1350 EXPECT_TRUE(base::ReadFileToString( |
| 1335 GetTestCertsDirectory().AppendASCII(testcase.crlset), &crl_set_bytes)); | 1351 GetTestCertsDirectory().AppendASCII(testcase.crlset), &crl_set_bytes)); |
| 1336 ASSERT_TRUE(CRLSetStorage::Parse(crl_set_bytes, &crl_set)); | 1352 ASSERT_TRUE(CRLSetStorage::Parse(crl_set_bytes, &crl_set)); |
| 1337 | 1353 |
| 1338 int flags = 0; | 1354 int flags = 0; |
| 1339 CertVerifyResult verify_result; | 1355 CertVerifyResult verify_result; |
| 1340 int error = Verify(cert.get(), "127.0.0.1", flags, crl_set.get(), | 1356 int error = Verify(cert.get(), "127.0.0.1", flags, crl_set.get(), |
| 1341 empty_cert_list_, &verify_result); | 1357 CertificateList(), &verify_result); |
| 1342 | 1358 |
| 1343 if (!testcase.expect_valid) { | 1359 if (!testcase.expect_valid) { |
| 1344 EXPECT_NE(OK, error); | 1360 EXPECT_NE(OK, error); |
| 1345 EXPECT_NE(0U, verify_result.cert_status); | 1361 EXPECT_NE(0U, verify_result.cert_status); |
| 1346 continue; | 1362 continue; |
| 1347 } | 1363 } |
| 1348 | 1364 |
| 1349 ASSERT_THAT(error, IsOk()); | 1365 ASSERT_THAT(error, IsOk()); |
| 1350 ASSERT_EQ(0U, verify_result.cert_status); | 1366 ASSERT_EQ(0U, verify_result.cert_status); |
| 1351 ASSERT_TRUE(verify_result.verified_cert.get()); | 1367 ASSERT_TRUE(verify_result.verified_cert.get()); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1363 ASSERT_TRUE(intermediate); | 1379 ASSERT_TRUE(intermediate); |
| 1364 | 1380 |
| 1365 EXPECT_TRUE(testcase.expected_intermediate->Equals(intermediate.get())) | 1381 EXPECT_TRUE(testcase.expected_intermediate->Equals(intermediate.get())) |
| 1366 << "Expected: " << testcase.expected_intermediate->subject().common_name | 1382 << "Expected: " << testcase.expected_intermediate->subject().common_name |
| 1367 << " issued by " << testcase.expected_intermediate->issuer().common_name | 1383 << " issued by " << testcase.expected_intermediate->issuer().common_name |
| 1368 << "; Got: " << intermediate->subject().common_name << " issued by " | 1384 << "; Got: " << intermediate->subject().common_name << " issued by " |
| 1369 << intermediate->issuer().common_name; | 1385 << intermediate->issuer().common_name; |
| 1370 } | 1386 } |
| 1371 } | 1387 } |
| 1372 | 1388 |
| 1373 #endif | |
| 1374 | |
| 1375 #if defined(OS_MACOSX) && !defined(OS_IOS) | 1389 #if defined(OS_MACOSX) && !defined(OS_IOS) |
| 1376 // Test that a CRLSet blocking one of the intermediates supplied by the server | 1390 // Test that a CRLSet blocking one of the intermediates supplied by the server |
| 1377 // can be worked around by the chopping workaround for path building. (Once the | 1391 // can be worked around by the chopping workaround for path building. (Once the |
| 1378 // supplied chain is chopped back to just the target, a better path can be | 1392 // supplied chain is chopped back to just the target, a better path can be |
| 1379 // found out-of-band. Normally that would be by AIA fetching, for the purposes | 1393 // found out-of-band. Normally that would be by AIA fetching, for the purposes |
| 1380 // of this test the better path is supplied by a test keychain.) | 1394 // of this test the better path is supplied by a test keychain.) |
| 1381 // | 1395 // |
| 1382 // In this test, there are two possible paths to validate a leaf (A): | 1396 // In this test, there are two possible paths to validate a leaf (A): |
| 1383 // 1. A(B) -> B(C) -> C(E) -> E(E) | 1397 // 1. A(B) -> B(C) -> C(E) -> E(E) |
| 1384 // 2. A(B) -> B(F) -> F(E) -> E(E) | 1398 // 2. A(B) -> B(F) -> F(E) -> E(E) |
| 1385 // | 1399 // |
| 1386 // A(B) -> B(C) -> C(E) is supplied to the verifier. | 1400 // A(B) -> B(C) -> C(E) is supplied to the verifier. |
| 1387 // B(F) and F(E) are supplied in a test keychain. | 1401 // B(F) and F(E) are supplied in a test keychain. |
| 1388 // C is blocked by a CRLset. | 1402 // C is blocked by a CRLset. |
| 1389 // | 1403 // |
| 1390 // The verifier should rollback until it just tries A(B) alone, at which point | 1404 // The verifier should rollback until it just tries A(B) alone, at which point |
| 1391 // it will pull B(F) & F(E) from the keychain and succeed. | 1405 // it will pull B(F) & F(E) from the keychain and succeed. |
| 1392 TEST_F(CertVerifyProcTest, MacCRLIntermediate) { | 1406 TEST(CertVerifyProcMacTest, MacCRLIntermediate) { |
| 1393 if (base::mac::IsAtLeastOS10_12()) { | 1407 if (base::mac::IsAtLeastOS10_12()) { |
| 1394 // TODO(crbug.com/671889): Investigate SecTrustSetKeychains issue on Sierra. | 1408 // TODO(crbug.com/671889): Investigate SecTrustSetKeychains issue on Sierra. |
| 1395 LOG(INFO) << "Skipping test, SecTrustSetKeychains does not work on 10.12"; | 1409 LOG(INFO) << "Skipping test, SecTrustSetKeychains does not work on 10.12"; |
| 1396 return; | 1410 return; |
| 1397 } | 1411 } |
| 1398 const char* const kPath2Files[] = { | 1412 const char* const kPath2Files[] = { |
| 1399 "multi-root-A-by-B.pem", "multi-root-B-by-C.pem", "multi-root-C-by-E.pem", | 1413 "multi-root-A-by-B.pem", "multi-root-B-by-C.pem", "multi-root-C-by-E.pem", |
| 1400 "multi-root-E-by-E.pem"}; | 1414 "multi-root-E-by-E.pem"}; |
| 1401 CertificateList path_2_certs; | 1415 CertificateList path_2_certs; |
| 1402 ASSERT_NO_FATAL_FAILURE(LoadCertificateFiles(kPath2Files, &path_2_certs)); | 1416 ASSERT_NO_FATAL_FAILURE(LoadCertificateFiles(kPath2Files, &path_2_certs)); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1438 scoped_refptr<CRLSet> crl_set; | 1452 scoped_refptr<CRLSet> crl_set; |
| 1439 std::string crl_set_bytes; | 1453 std::string crl_set_bytes; |
| 1440 // CRL which blocks C by SPKI. | 1454 // CRL which blocks C by SPKI. |
| 1441 EXPECT_TRUE(base::ReadFileToString( | 1455 EXPECT_TRUE(base::ReadFileToString( |
| 1442 GetTestCertsDirectory().AppendASCII("multi-root-crlset-C.raw"), | 1456 GetTestCertsDirectory().AppendASCII("multi-root-crlset-C.raw"), |
| 1443 &crl_set_bytes)); | 1457 &crl_set_bytes)); |
| 1444 ASSERT_TRUE(CRLSetStorage::Parse(crl_set_bytes, &crl_set)); | 1458 ASSERT_TRUE(CRLSetStorage::Parse(crl_set_bytes, &crl_set)); |
| 1445 | 1459 |
| 1446 int flags = 0; | 1460 int flags = 0; |
| 1447 CertVerifyResult verify_result; | 1461 CertVerifyResult verify_result; |
| 1448 int error = Verify(cert.get(), "127.0.0.1", flags, crl_set.get(), | 1462 |
| 1449 empty_cert_list_, &verify_result); | 1463 scoped_refptr<CertVerifyProc> verify_proc = CertVerifyProc::CreateDefault(); |
| 1464 int error = |
| 1465 verify_proc->Verify(cert.get(), "127.0.0.1", std::string(), flags, |
| 1466 crl_set.get(), CertificateList(), &verify_result); |
| 1450 | 1467 |
| 1451 ASSERT_EQ(OK, error); | 1468 ASSERT_EQ(OK, error); |
| 1452 ASSERT_EQ(0U, verify_result.cert_status); | 1469 ASSERT_EQ(0U, verify_result.cert_status); |
| 1453 ASSERT_TRUE(verify_result.verified_cert.get()); | 1470 ASSERT_TRUE(verify_result.verified_cert.get()); |
| 1454 | 1471 |
| 1455 const X509Certificate::OSCertHandles& verified_intermediates = | 1472 const X509Certificate::OSCertHandles& verified_intermediates = |
| 1456 verify_result.verified_cert->GetIntermediateCertificates(); | 1473 verify_result.verified_cert->GetIntermediateCertificates(); |
| 1457 ASSERT_EQ(3U, verified_intermediates.size()); | 1474 ASSERT_EQ(3U, verified_intermediates.size()); |
| 1458 | 1475 |
| 1459 scoped_refptr<X509Certificate> intermediate = | 1476 scoped_refptr<X509Certificate> intermediate = |
| 1460 X509Certificate::CreateFromHandle(verified_intermediates[1], | 1477 X509Certificate::CreateFromHandle(verified_intermediates[1], |
| 1461 X509Certificate::OSCertHandles()); | 1478 X509Certificate::OSCertHandles()); |
| 1462 ASSERT_TRUE(intermediate); | 1479 ASSERT_TRUE(intermediate); |
| 1463 | 1480 |
| 1464 scoped_refptr<X509Certificate> expected_intermediate = path_3_certs[2]; | 1481 scoped_refptr<X509Certificate> expected_intermediate = path_3_certs[2]; |
| 1465 EXPECT_TRUE(expected_intermediate->Equals(intermediate.get())) | 1482 EXPECT_TRUE(expected_intermediate->Equals(intermediate.get())) |
| 1466 << "Expected: " << expected_intermediate->subject().common_name | 1483 << "Expected: " << expected_intermediate->subject().common_name |
| 1467 << " issued by " << expected_intermediate->issuer().common_name | 1484 << " issued by " << expected_intermediate->issuer().common_name |
| 1468 << "; Got: " << intermediate->subject().common_name << " issued by " | 1485 << "; Got: " << intermediate->subject().common_name << " issued by " |
| 1469 << intermediate->issuer().common_name; | 1486 << intermediate->issuer().common_name; |
| 1470 } | 1487 } |
| 1471 | 1488 |
| 1472 // Test that if a keychain is present which trusts a less-desirable root (ex, | 1489 // Test that if a keychain is present which trusts a less-desirable root (ex, |
| 1473 // one using SHA1), that the keychain reordering hack will cause the better | 1490 // one using SHA1), that the keychain reordering hack will cause the better |
| 1474 // root in the System Roots to be used instead. | 1491 // root in the System Roots to be used instead. |
| 1475 TEST_F(CertVerifyProcTest, MacKeychainReordering) { | 1492 TEST(CertVerifyProcMacTest, MacKeychainReordering) { |
| 1476 // Note: target cert expires Apr 2 23:59:59 2018 GMT | 1493 // Note: target cert expires Apr 2 23:59:59 2018 GMT |
| 1477 scoped_refptr<X509Certificate> cert = CreateCertificateChainFromFile( | 1494 scoped_refptr<X509Certificate> cert = CreateCertificateChainFromFile( |
| 1478 GetTestCertsDirectory(), "tripadvisor-verisign-chain.pem", | 1495 GetTestCertsDirectory(), "tripadvisor-verisign-chain.pem", |
| 1479 X509Certificate::FORMAT_AUTO); | 1496 X509Certificate::FORMAT_AUTO); |
| 1480 ASSERT_TRUE(cert); | 1497 ASSERT_TRUE(cert); |
| 1481 | 1498 |
| 1482 // Create a test keychain search list that will Always Trust the SHA1 | 1499 // Create a test keychain search list that will Always Trust the SHA1 |
| 1483 // cross-signed VeriSign Class 3 Public Primary Certification Authority - G5 | 1500 // cross-signed VeriSign Class 3 Public Primary Certification Authority - G5 |
| 1484 std::unique_ptr<TestKeychainSearchList> test_keychain_search_list( | 1501 std::unique_ptr<TestKeychainSearchList> test_keychain_search_list( |
| 1485 TestKeychainSearchList::Create()); | 1502 TestKeychainSearchList::Create()); |
| 1486 ASSERT_TRUE(test_keychain_search_list); | 1503 ASSERT_TRUE(test_keychain_search_list); |
| 1487 | 1504 |
| 1488 base::FilePath keychain_path(GetTestCertsDirectory().AppendASCII( | 1505 base::FilePath keychain_path(GetTestCertsDirectory().AppendASCII( |
| 1489 "verisign_class3_g5_crosssigned-trusted.keychain")); | 1506 "verisign_class3_g5_crosssigned-trusted.keychain")); |
| 1490 // SecKeychainOpen does not fail if the file doesn't exist, so assert it here | 1507 // SecKeychainOpen does not fail if the file doesn't exist, so assert it here |
| 1491 // for easier debugging. | 1508 // for easier debugging. |
| 1492 ASSERT_TRUE(base::PathExists(keychain_path)); | 1509 ASSERT_TRUE(base::PathExists(keychain_path)); |
| 1493 SecKeychainRef keychain; | 1510 SecKeychainRef keychain; |
| 1494 OSStatus status = | 1511 OSStatus status = |
| 1495 SecKeychainOpen(keychain_path.MaybeAsASCII().c_str(), &keychain); | 1512 SecKeychainOpen(keychain_path.MaybeAsASCII().c_str(), &keychain); |
| 1496 ASSERT_EQ(errSecSuccess, status); | 1513 ASSERT_EQ(errSecSuccess, status); |
| 1497 ASSERT_TRUE(keychain); | 1514 ASSERT_TRUE(keychain); |
| 1498 base::ScopedCFTypeRef<SecKeychainRef> scoped_keychain(keychain); | 1515 base::ScopedCFTypeRef<SecKeychainRef> scoped_keychain(keychain); |
| 1499 test_keychain_search_list->AddKeychain(keychain); | 1516 test_keychain_search_list->AddKeychain(keychain); |
| 1500 | 1517 |
| 1501 int flags = 0; | 1518 int flags = 0; |
| 1502 CertVerifyResult verify_result; | 1519 CertVerifyResult verify_result; |
| 1503 int error = Verify(cert.get(), "www.tripadvisor.com", flags, | 1520 scoped_refptr<CertVerifyProc> verify_proc = CertVerifyProc::CreateDefault(); |
| 1504 nullptr /* crl_set */, empty_cert_list_, &verify_result); | 1521 int error = verify_proc->Verify(cert.get(), "www.tripadvisor.com", |
| 1522 std::string(), flags, nullptr /* crl_set */, |
| 1523 CertificateList(), &verify_result); |
| 1505 | 1524 |
| 1506 ASSERT_EQ(OK, error); | 1525 ASSERT_EQ(OK, error); |
| 1507 EXPECT_EQ(0U, verify_result.cert_status); | 1526 EXPECT_EQ(0U, verify_result.cert_status); |
| 1508 EXPECT_FALSE(verify_result.has_sha1); | 1527 EXPECT_FALSE(verify_result.has_sha1); |
| 1509 ASSERT_TRUE(verify_result.verified_cert.get()); | 1528 ASSERT_TRUE(verify_result.verified_cert.get()); |
| 1510 | 1529 |
| 1511 const X509Certificate::OSCertHandles& verified_intermediates = | 1530 const X509Certificate::OSCertHandles& verified_intermediates = |
| 1512 verify_result.verified_cert->GetIntermediateCertificates(); | 1531 verify_result.verified_cert->GetIntermediateCertificates(); |
| 1513 ASSERT_EQ(2U, verified_intermediates.size()); | 1532 ASSERT_EQ(2U, verified_intermediates.size()); |
| 1514 } | 1533 } |
| 1515 | 1534 |
| 1516 // Test that the system root certificate keychain is in the expected location | 1535 // Test that the system root certificate keychain is in the expected location |
| 1517 // and can be opened. Other tests would fail if this was not true, but this | 1536 // and can be opened. Other tests would fail if this was not true, but this |
| 1518 // test makes the reason for the failure obvious. | 1537 // test makes the reason for the failure obvious. |
| 1519 TEST_F(CertVerifyProcTest, MacSystemRootCertificateKeychainLocation) { | 1538 TEST(CertVerifyProcMacTest, MacSystemRootCertificateKeychainLocation) { |
| 1520 const char* root_keychain_path = | 1539 const char* root_keychain_path = |
| 1521 "/System/Library/Keychains/SystemRootCertificates.keychain"; | 1540 "/System/Library/Keychains/SystemRootCertificates.keychain"; |
| 1522 ASSERT_TRUE(base::PathExists(base::FilePath(root_keychain_path))); | 1541 ASSERT_TRUE(base::PathExists(base::FilePath(root_keychain_path))); |
| 1523 | 1542 |
| 1524 SecKeychainRef keychain; | 1543 SecKeychainRef keychain; |
| 1525 OSStatus status = SecKeychainOpen(root_keychain_path, &keychain); | 1544 OSStatus status = SecKeychainOpen(root_keychain_path, &keychain); |
| 1526 ASSERT_EQ(errSecSuccess, status); | 1545 ASSERT_EQ(errSecSuccess, status); |
| 1527 CFRelease(keychain); | 1546 CFRelease(keychain); |
| 1528 } | 1547 } |
| 1529 #endif | 1548 #endif // defined(OS_MACOSX) && !defined(OS_IOS) |
| 1530 | 1549 |
| 1550 // TODO(crbug.com/649017): This is not parameterized by the CertVerifyProc |
| 1551 // because the CertVerifyProc::Verify() does this unconditionally based on the |
| 1552 // platform. |
| 1531 bool AreSHA1IntermediatesAllowed() { | 1553 bool AreSHA1IntermediatesAllowed() { |
| 1532 #if defined(OS_WIN) | 1554 #if defined(OS_WIN) |
| 1533 // TODO(rsleevi): Remove this once https://crbug.com/588789 is resolved | 1555 // TODO(rsleevi): Remove this once https://crbug.com/588789 is resolved |
| 1534 // for Windows 7/2008 users. | 1556 // for Windows 7/2008 users. |
| 1535 // Note: This must be kept in sync with cert_verify_proc.cc | 1557 // Note: This must be kept in sync with cert_verify_proc.cc |
| 1536 return base::win::GetVersion() < base::win::VERSION_WIN8; | 1558 return base::win::GetVersion() < base::win::VERSION_WIN8; |
| 1537 #else | 1559 #else |
| 1538 return false; | 1560 return false; |
| 1539 #endif | 1561 #endif |
| 1540 } | 1562 } |
| 1541 | 1563 |
| 1542 TEST_F(CertVerifyProcTest, RejectsMD2) { | 1564 TEST(CertVerifyProcTest, RejectsMD2) { |
| 1543 scoped_refptr<X509Certificate> cert( | 1565 scoped_refptr<X509Certificate> cert( |
| 1544 ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); | 1566 ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); |
| 1545 ASSERT_TRUE(cert); | 1567 ASSERT_TRUE(cert); |
| 1546 | 1568 |
| 1547 CertVerifyResult result; | 1569 CertVerifyResult result; |
| 1548 result.has_md2 = true; | 1570 result.has_md2 = true; |
| 1549 verify_proc_ = new MockCertVerifyProc(result); | 1571 scoped_refptr<CertVerifyProc> verify_proc = new MockCertVerifyProc(result); |
| 1550 | 1572 |
| 1551 int flags = 0; | 1573 int flags = 0; |
| 1552 CertVerifyResult verify_result; | 1574 CertVerifyResult verify_result; |
| 1553 int error = Verify(cert.get(), "127.0.0.1", flags, nullptr /* crl_set */, | 1575 int error = verify_proc->Verify(cert.get(), "127.0.0.1", std::string(), flags, |
| 1554 empty_cert_list_, &verify_result); | 1576 nullptr /* crl_set */, CertificateList(), |
| 1577 &verify_result); |
| 1555 EXPECT_THAT(error, IsError(ERR_CERT_INVALID)); | 1578 EXPECT_THAT(error, IsError(ERR_CERT_INVALID)); |
| 1556 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_INVALID); | 1579 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_INVALID); |
| 1557 } | 1580 } |
| 1558 | 1581 |
| 1559 TEST_F(CertVerifyProcTest, RejectsMD4) { | 1582 TEST(CertVerifyProcTest, RejectsMD4) { |
| 1560 scoped_refptr<X509Certificate> cert( | 1583 scoped_refptr<X509Certificate> cert( |
| 1561 ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); | 1584 ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); |
| 1562 ASSERT_TRUE(cert); | 1585 ASSERT_TRUE(cert); |
| 1563 | 1586 |
| 1564 CertVerifyResult result; | 1587 CertVerifyResult result; |
| 1565 result.has_md4 = true; | 1588 result.has_md4 = true; |
| 1566 verify_proc_ = new MockCertVerifyProc(result); | 1589 scoped_refptr<CertVerifyProc> verify_proc = new MockCertVerifyProc(result); |
| 1567 | 1590 |
| 1568 int flags = 0; | 1591 int flags = 0; |
| 1569 CertVerifyResult verify_result; | 1592 CertVerifyResult verify_result; |
| 1570 int error = Verify(cert.get(), "127.0.0.1", flags, nullptr /* crl_set */, | 1593 int error = verify_proc->Verify(cert.get(), "127.0.0.1", std::string(), flags, |
| 1571 empty_cert_list_, &verify_result); | 1594 nullptr /* crl_set */, CertificateList(), |
| 1595 &verify_result); |
| 1572 EXPECT_THAT(error, IsError(ERR_CERT_INVALID)); | 1596 EXPECT_THAT(error, IsError(ERR_CERT_INVALID)); |
| 1573 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_INVALID); | 1597 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_INVALID); |
| 1574 } | 1598 } |
| 1575 | 1599 |
| 1576 TEST_F(CertVerifyProcTest, RejectsMD5) { | 1600 TEST(CertVerifyProcTest, RejectsMD5) { |
| 1577 scoped_refptr<X509Certificate> cert( | 1601 scoped_refptr<X509Certificate> cert( |
| 1578 ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); | 1602 ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); |
| 1579 ASSERT_TRUE(cert); | 1603 ASSERT_TRUE(cert); |
| 1580 | 1604 |
| 1581 CertVerifyResult result; | 1605 CertVerifyResult result; |
| 1582 result.has_md5 = true; | 1606 result.has_md5 = true; |
| 1583 verify_proc_ = new MockCertVerifyProc(result); | 1607 scoped_refptr<CertVerifyProc> verify_proc = new MockCertVerifyProc(result); |
| 1584 | 1608 |
| 1585 int flags = 0; | 1609 int flags = 0; |
| 1586 CertVerifyResult verify_result; | 1610 CertVerifyResult verify_result; |
| 1587 int error = Verify(cert.get(), "127.0.0.1", flags, nullptr /* crl_set */, | 1611 int error = verify_proc->Verify(cert.get(), "127.0.0.1", std::string(), flags, |
| 1588 empty_cert_list_, &verify_result); | 1612 nullptr /* crl_set */, CertificateList(), |
| 1613 &verify_result); |
| 1589 EXPECT_THAT(error, IsError(ERR_CERT_WEAK_SIGNATURE_ALGORITHM)); | 1614 EXPECT_THAT(error, IsError(ERR_CERT_WEAK_SIGNATURE_ALGORITHM)); |
| 1590 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_WEAK_SIGNATURE_ALGORITHM); | 1615 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_WEAK_SIGNATURE_ALGORITHM); |
| 1591 } | 1616 } |
| 1592 | 1617 |
| 1593 TEST_F(CertVerifyProcTest, RejectsPublicSHA1Leaves) { | 1618 TEST(CertVerifyProcTest, RejectsPublicSHA1Leaves) { |
| 1594 scoped_refptr<X509Certificate> cert( | 1619 scoped_refptr<X509Certificate> cert( |
| 1595 ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); | 1620 ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); |
| 1596 ASSERT_TRUE(cert); | 1621 ASSERT_TRUE(cert); |
| 1597 | 1622 |
| 1598 CertVerifyResult result; | 1623 CertVerifyResult result; |
| 1599 result.has_sha1 = true; | 1624 result.has_sha1 = true; |
| 1600 result.has_sha1_leaf = true; | 1625 result.has_sha1_leaf = true; |
| 1601 result.is_issued_by_known_root = true; | 1626 result.is_issued_by_known_root = true; |
| 1602 verify_proc_ = new MockCertVerifyProc(result); | 1627 scoped_refptr<CertVerifyProc> verify_proc = new MockCertVerifyProc(result); |
| 1603 | 1628 |
| 1604 int flags = 0; | 1629 int flags = 0; |
| 1605 CertVerifyResult verify_result; | 1630 CertVerifyResult verify_result; |
| 1606 int error = Verify(cert.get(), "127.0.0.1", flags, nullptr /* crl_set */, | 1631 int error = verify_proc->Verify(cert.get(), "127.0.0.1", std::string(), flags, |
| 1607 empty_cert_list_, &verify_result); | 1632 nullptr /* crl_set */, CertificateList(), |
| 1633 &verify_result); |
| 1608 EXPECT_THAT(error, IsError(ERR_CERT_WEAK_SIGNATURE_ALGORITHM)); | 1634 EXPECT_THAT(error, IsError(ERR_CERT_WEAK_SIGNATURE_ALGORITHM)); |
| 1609 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_WEAK_SIGNATURE_ALGORITHM); | 1635 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_WEAK_SIGNATURE_ALGORITHM); |
| 1610 } | 1636 } |
| 1611 | 1637 |
| 1612 TEST_F(CertVerifyProcTest, RejectsPublicSHA1IntermediatesUnlessAllowed) { | 1638 TEST(CertVerifyProcTest, RejectsPublicSHA1IntermediatesUnlessAllowed) { |
| 1613 scoped_refptr<X509Certificate> cert(ImportCertFromFile( | 1639 scoped_refptr<X509Certificate> cert(ImportCertFromFile( |
| 1614 GetTestCertsDirectory(), "39_months_after_2015_04.pem")); | 1640 GetTestCertsDirectory(), "39_months_after_2015_04.pem")); |
| 1615 ASSERT_TRUE(cert); | 1641 ASSERT_TRUE(cert); |
| 1616 | 1642 |
| 1617 CertVerifyResult result; | 1643 CertVerifyResult result; |
| 1618 result.has_sha1 = true; | 1644 result.has_sha1 = true; |
| 1619 result.has_sha1_leaf = false; | 1645 result.has_sha1_leaf = false; |
| 1620 result.is_issued_by_known_root = true; | 1646 result.is_issued_by_known_root = true; |
| 1621 verify_proc_ = new MockCertVerifyProc(result); | 1647 scoped_refptr<CertVerifyProc> verify_proc = new MockCertVerifyProc(result); |
| 1622 | 1648 |
| 1623 int flags = 0; | 1649 int flags = 0; |
| 1624 CertVerifyResult verify_result; | 1650 CertVerifyResult verify_result; |
| 1625 int error = Verify(cert.get(), "127.0.0.1", flags, nullptr /* crl_set */, | 1651 int error = verify_proc->Verify(cert.get(), "127.0.0.1", std::string(), flags, |
| 1626 empty_cert_list_, &verify_result); | 1652 nullptr /* crl_set */, CertificateList(), |
| 1653 &verify_result); |
| 1627 if (AreSHA1IntermediatesAllowed()) { | 1654 if (AreSHA1IntermediatesAllowed()) { |
| 1628 EXPECT_THAT(error, IsOk()); | 1655 EXPECT_THAT(error, IsOk()); |
| 1629 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_SHA1_SIGNATURE_PRESENT); | 1656 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_SHA1_SIGNATURE_PRESENT); |
| 1630 } else { | 1657 } else { |
| 1631 EXPECT_THAT(error, IsError(ERR_CERT_WEAK_SIGNATURE_ALGORITHM)); | 1658 EXPECT_THAT(error, IsError(ERR_CERT_WEAK_SIGNATURE_ALGORITHM)); |
| 1632 EXPECT_TRUE(verify_result.cert_status & | 1659 EXPECT_TRUE(verify_result.cert_status & |
| 1633 CERT_STATUS_WEAK_SIGNATURE_ALGORITHM); | 1660 CERT_STATUS_WEAK_SIGNATURE_ALGORITHM); |
| 1634 } | 1661 } |
| 1635 } | 1662 } |
| 1636 | 1663 |
| 1637 TEST_F(CertVerifyProcTest, RejectsPrivateSHA1UnlessFlag) { | 1664 TEST(CertVerifyProcTest, RejectsPrivateSHA1UnlessFlag) { |
| 1638 scoped_refptr<X509Certificate> cert( | 1665 scoped_refptr<X509Certificate> cert( |
| 1639 ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); | 1666 ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); |
| 1640 ASSERT_TRUE(cert); | 1667 ASSERT_TRUE(cert); |
| 1641 | 1668 |
| 1642 CertVerifyResult result; | 1669 CertVerifyResult result; |
| 1643 result.has_sha1 = true; | 1670 result.has_sha1 = true; |
| 1644 result.has_sha1_leaf = true; | 1671 result.has_sha1_leaf = true; |
| 1645 result.is_issued_by_known_root = false; | 1672 result.is_issued_by_known_root = false; |
| 1646 verify_proc_ = new MockCertVerifyProc(result); | 1673 scoped_refptr<CertVerifyProc> verify_proc = new MockCertVerifyProc(result); |
| 1647 | 1674 |
| 1648 // SHA-1 should be rejected by default for private roots... | 1675 // SHA-1 should be rejected by default for private roots... |
| 1649 int flags = 0; | 1676 int flags = 0; |
| 1650 CertVerifyResult verify_result; | 1677 CertVerifyResult verify_result; |
| 1651 int error = Verify(cert.get(), "127.0.0.1", flags, nullptr /* crl_set */, | 1678 int error = verify_proc->Verify(cert.get(), "127.0.0.1", std::string(), flags, |
| 1652 empty_cert_list_, &verify_result); | 1679 nullptr /* crl_set */, CertificateList(), |
| 1680 &verify_result); |
| 1653 EXPECT_THAT(error, IsError(ERR_CERT_WEAK_SIGNATURE_ALGORITHM)); | 1681 EXPECT_THAT(error, IsError(ERR_CERT_WEAK_SIGNATURE_ALGORITHM)); |
| 1654 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_SHA1_SIGNATURE_PRESENT); | 1682 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_SHA1_SIGNATURE_PRESENT); |
| 1655 | 1683 |
| 1656 // ... unless VERIFY_ENABLE_SHA1_LOCAL_ANCHORS was supplied. | 1684 // ... unless VERIFY_ENABLE_SHA1_LOCAL_ANCHORS was supplied. |
| 1657 flags = CertVerifier::VERIFY_ENABLE_SHA1_LOCAL_ANCHORS; | 1685 flags = CertVerifier::VERIFY_ENABLE_SHA1_LOCAL_ANCHORS; |
| 1658 verify_result.Reset(); | 1686 verify_result.Reset(); |
| 1659 error = Verify(cert.get(), "127.0.0.1", flags, nullptr /* crl_set */, | 1687 error = verify_proc->Verify(cert.get(), "127.0.0.1", std::string(), flags, |
| 1660 empty_cert_list_, &verify_result); | 1688 nullptr /* crl_set */, CertificateList(), |
| 1689 &verify_result); |
| 1661 EXPECT_THAT(error, IsOk()); | 1690 EXPECT_THAT(error, IsOk()); |
| 1662 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_SHA1_SIGNATURE_PRESENT); | 1691 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_SHA1_SIGNATURE_PRESENT); |
| 1663 } | 1692 } |
| 1664 | 1693 |
| 1665 enum ExpectedAlgorithms { | 1694 enum ExpectedAlgorithms { |
| 1666 EXPECT_MD2 = 1 << 0, | 1695 EXPECT_MD2 = 1 << 0, |
| 1667 EXPECT_MD4 = 1 << 1, | 1696 EXPECT_MD4 = 1 << 1, |
| 1668 EXPECT_MD5 = 1 << 2, | 1697 EXPECT_MD5 = 1 << 2, |
| 1669 EXPECT_SHA1 = 1 << 3, | 1698 EXPECT_SHA1 = 1 << 3, |
| 1670 EXPECT_SHA1_LEAF = 1 << 4, | 1699 EXPECT_SHA1_LEAF = 1 << 4, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1688 // attempt to print out the first twenty bytes of the object, which depending | 1717 // attempt to print out the first twenty bytes of the object, which depending |
| 1689 // on platform and alignment, may result in an invalid read. | 1718 // on platform and alignment, may result in an invalid read. |
| 1690 void PrintTo(const WeakDigestTestData& data, std::ostream* os) { | 1719 void PrintTo(const WeakDigestTestData& data, std::ostream* os) { |
| 1691 *os << "root: " << StringOrDefault(data.root_cert_filename, "none") | 1720 *os << "root: " << StringOrDefault(data.root_cert_filename, "none") |
| 1692 << "; intermediate: " | 1721 << "; intermediate: " |
| 1693 << StringOrDefault(data.intermediate_cert_filename, "none") | 1722 << StringOrDefault(data.intermediate_cert_filename, "none") |
| 1694 << "; end-entity: " << data.ee_cert_filename; | 1723 << "; end-entity: " << data.ee_cert_filename; |
| 1695 } | 1724 } |
| 1696 | 1725 |
| 1697 class CertVerifyProcWeakDigestTest | 1726 class CertVerifyProcWeakDigestTest |
| 1698 : public CertVerifyProcTest, | 1727 : public testing::TestWithParam<WeakDigestTestData> { |
| 1699 public testing::WithParamInterface<WeakDigestTestData> { | |
| 1700 public: | 1728 public: |
| 1701 CertVerifyProcWeakDigestTest() {} | 1729 CertVerifyProcWeakDigestTest() {} |
| 1702 virtual ~CertVerifyProcWeakDigestTest() {} | 1730 virtual ~CertVerifyProcWeakDigestTest() {} |
| 1703 }; | 1731 }; |
| 1704 | 1732 |
| 1705 // Test that the CertVerifyProc::Verify() properly surfaces the (weak) hashing | 1733 // Tests that the CertVerifyProc::Verify() properly surfaces the (weak) hash |
| 1706 // algorithms used in the chain. | 1734 // algorithms used in the chain. |
| 1707 TEST_P(CertVerifyProcWeakDigestTest, VerifyDetectsAlgorithm) { | 1735 TEST_P(CertVerifyProcWeakDigestTest, VerifyDetectsAlgorithm) { |
| 1708 WeakDigestTestData data = GetParam(); | 1736 WeakDigestTestData data = GetParam(); |
| 1709 base::FilePath certs_dir = GetTestCertsDirectory(); | 1737 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 1710 | 1738 |
| 1711 scoped_refptr<X509Certificate> intermediate_cert; | 1739 scoped_refptr<X509Certificate> intermediate_cert; |
| 1712 scoped_refptr<X509Certificate> root_cert; | 1740 scoped_refptr<X509Certificate> root_cert; |
| 1713 | 1741 |
| 1714 // Build |intermediates| as the full chain (including trust anchor). | 1742 // Build |intermediates| as the full chain (including trust anchor). |
| 1715 X509Certificate::OSCertHandles intermediates; | 1743 X509Certificate::OSCertHandles intermediates; |
| 1716 | 1744 |
| 1717 if (data.intermediate_cert_filename) { | 1745 if (data.intermediate_cert_filename) { |
| 1718 intermediate_cert = | 1746 intermediate_cert = |
| 1719 ImportCertFromFile(certs_dir, data.intermediate_cert_filename); | 1747 ImportCertFromFile(certs_dir, data.intermediate_cert_filename); |
| 1720 ASSERT_TRUE(intermediate_cert); | 1748 ASSERT_TRUE(intermediate_cert); |
| 1721 intermediates.push_back(intermediate_cert->os_cert_handle()); | 1749 intermediates.push_back(intermediate_cert->os_cert_handle()); |
| 1722 } | 1750 } |
| 1723 | 1751 |
| 1724 if (data.root_cert_filename) { | 1752 if (data.root_cert_filename) { |
| 1725 root_cert = ImportCertFromFile(certs_dir, data.root_cert_filename); | 1753 root_cert = ImportCertFromFile(certs_dir, data.root_cert_filename); |
| 1726 ASSERT_TRUE(root_cert); | 1754 ASSERT_TRUE(root_cert); |
| 1727 intermediates.push_back(root_cert->os_cert_handle()); | 1755 intermediates.push_back(root_cert->os_cert_handle()); |
| 1728 } | 1756 } |
| 1729 | 1757 |
| 1730 scoped_refptr<X509Certificate> ee_cert = | 1758 scoped_refptr<X509Certificate> ee_cert = |
| 1731 ImportCertFromFile(certs_dir, data.ee_cert_filename); | 1759 ImportCertFromFile(certs_dir, data.ee_cert_filename); |
| 1732 ASSERT_TRUE(ee_cert); | 1760 ASSERT_TRUE(ee_cert); |
| 1733 | 1761 |
| 1734 scoped_refptr<X509Certificate> ee_chain = | 1762 scoped_refptr<X509Certificate> ee_chain = X509Certificate::CreateFromHandle( |
| 1735 X509Certificate::CreateFromHandle(ee_cert->os_cert_handle(), | 1763 ee_cert->os_cert_handle(), intermediates); |
| 1736 intermediates); | |
| 1737 ASSERT_TRUE(ee_chain); | 1764 ASSERT_TRUE(ee_chain); |
| 1738 | 1765 |
| 1739 int flags = 0; | 1766 int flags = 0; |
| 1740 CertVerifyResult verify_result; | 1767 CertVerifyResult verify_result; |
| 1741 | 1768 |
| 1742 // Use a mock CertVerifyProc that returns success with a verified_cert of | 1769 // Use a mock CertVerifyProc that returns success with a verified_cert of |
| 1743 // |ee_chain|. | 1770 // |ee_chain|. |
| 1744 // | 1771 // |
| 1745 // This is sufficient for the purposes of this test, as the checking for weak | 1772 // This is sufficient for the purposes of this test, as the checking for weak |
| 1746 // hashing algorithms is done by CertVerifyProc::Verify(). | 1773 // hash algorithms is done by CertVerifyProc::Verify(). |
| 1747 scoped_refptr<CertVerifyProc> proc = | 1774 scoped_refptr<CertVerifyProc> proc = |
| 1748 new MockCertVerifyProc(CertVerifyResult()); | 1775 new MockCertVerifyProc(CertVerifyResult()); |
| 1749 proc->Verify(ee_chain.get(), "127.0.0.1", std::string(), flags, nullptr, | 1776 proc->Verify(ee_chain.get(), "127.0.0.1", std::string(), flags, nullptr, |
| 1750 empty_cert_list_, &verify_result); | 1777 CertificateList(), &verify_result); |
| 1751 EXPECT_EQ(!!(data.expected_algorithms & EXPECT_MD2), verify_result.has_md2); | 1778 EXPECT_EQ(!!(data.expected_algorithms & EXPECT_MD2), verify_result.has_md2); |
| 1752 EXPECT_EQ(!!(data.expected_algorithms & EXPECT_MD4), verify_result.has_md4); | 1779 EXPECT_EQ(!!(data.expected_algorithms & EXPECT_MD4), verify_result.has_md4); |
| 1753 EXPECT_EQ(!!(data.expected_algorithms & EXPECT_MD5), verify_result.has_md5); | 1780 EXPECT_EQ(!!(data.expected_algorithms & EXPECT_MD5), verify_result.has_md5); |
| 1754 EXPECT_EQ(!!(data.expected_algorithms & EXPECT_SHA1), verify_result.has_sha1); | 1781 EXPECT_EQ(!!(data.expected_algorithms & EXPECT_SHA1), verify_result.has_sha1); |
| 1755 EXPECT_EQ(!!(data.expected_algorithms & EXPECT_SHA1_LEAF), | 1782 EXPECT_EQ(!!(data.expected_algorithms & EXPECT_SHA1_LEAF), |
| 1756 verify_result.has_sha1_leaf); | 1783 verify_result.has_sha1_leaf); |
| 1757 } | 1784 } |
| 1758 | 1785 |
| 1759 // The signature algorithm of the root CA should not matter. | 1786 // The signature algorithm of the root CA should not matter. |
| 1760 const WeakDigestTestData kVerifyRootCATestData[] = { | 1787 const WeakDigestTestData kVerifyRootCATestData[] = { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1778 {"weak_digest_sha1_root.pem", "weak_digest_md2_intermediate.pem", | 1805 {"weak_digest_sha1_root.pem", "weak_digest_md2_intermediate.pem", |
| 1779 "weak_digest_sha1_ee.pem", EXPECT_MD2 | EXPECT_SHA1 | EXPECT_SHA1_LEAF}, | 1806 "weak_digest_sha1_ee.pem", EXPECT_MD2 | EXPECT_SHA1 | EXPECT_SHA1_LEAF}, |
| 1780 }; | 1807 }; |
| 1781 | 1808 |
| 1782 INSTANTIATE_TEST_CASE_P(VerifyIntermediate, | 1809 INSTANTIATE_TEST_CASE_P(VerifyIntermediate, |
| 1783 CertVerifyProcWeakDigestTest, | 1810 CertVerifyProcWeakDigestTest, |
| 1784 testing::ValuesIn(kVerifyIntermediateCATestData)); | 1811 testing::ValuesIn(kVerifyIntermediateCATestData)); |
| 1785 | 1812 |
| 1786 // The signature algorithm of end-entity should be properly detected. | 1813 // The signature algorithm of end-entity should be properly detected. |
| 1787 const WeakDigestTestData kVerifyEndEntityTestData[] = { | 1814 const WeakDigestTestData kVerifyEndEntityTestData[] = { |
| 1788 { "weak_digest_sha1_root.pem", "weak_digest_sha1_intermediate.pem", | 1815 {"weak_digest_sha1_root.pem", "weak_digest_sha1_intermediate.pem", |
| 1789 "weak_digest_md5_ee.pem", EXPECT_MD5 | EXPECT_SHA1 }, | 1816 "weak_digest_md5_ee.pem", EXPECT_MD5 | EXPECT_SHA1}, |
| 1790 { "weak_digest_sha1_root.pem", "weak_digest_sha1_intermediate.pem", | 1817 {"weak_digest_sha1_root.pem", "weak_digest_sha1_intermediate.pem", |
| 1791 "weak_digest_md4_ee.pem", EXPECT_MD4 | EXPECT_SHA1 }, | 1818 "weak_digest_md4_ee.pem", EXPECT_MD4 | EXPECT_SHA1}, |
| 1792 { "weak_digest_sha1_root.pem", "weak_digest_sha1_intermediate.pem", | 1819 {"weak_digest_sha1_root.pem", "weak_digest_sha1_intermediate.pem", |
| 1793 "weak_digest_md2_ee.pem", EXPECT_MD2 | EXPECT_SHA1 }, | 1820 "weak_digest_md2_ee.pem", EXPECT_MD2 | EXPECT_SHA1}, |
| 1794 }; | 1821 }; |
| 1795 | 1822 |
| 1796 INSTANTIATE_TEST_CASE_P(VerifyEndEntity, | 1823 INSTANTIATE_TEST_CASE_P(VerifyEndEntity, |
| 1797 CertVerifyProcWeakDigestTest, | 1824 CertVerifyProcWeakDigestTest, |
| 1798 testing::ValuesIn(kVerifyEndEntityTestData)); | 1825 testing::ValuesIn(kVerifyEndEntityTestData)); |
| 1799 | 1826 |
| 1800 // Incomplete chains do not report the status of the intermediate. | 1827 // Incomplete chains do not report the status of the intermediate. |
| 1801 // Note: really each of these tests should also expect the digest algorithm of | 1828 // Note: really each of these tests should also expect the digest algorithm of |
| 1802 // the intermediate (included as a comment). However CertVerifyProc::Verify() is | 1829 // the intermediate (included as a comment). However CertVerifyProc::Verify() is |
| 1803 // unable to distinguish that this is an intermediate and not a trust anchor, so | 1830 // unable to distinguish that this is an intermediate and not a trust anchor, so |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1830 /*EXPECT_SHA1 |*/ EXPECT_MD2}, | 1857 /*EXPECT_SHA1 |*/ EXPECT_MD2}, |
| 1831 }; | 1858 }; |
| 1832 | 1859 |
| 1833 INSTANTIATE_TEST_CASE_P(VerifyIncompleteEndEntity, | 1860 INSTANTIATE_TEST_CASE_P(VerifyIncompleteEndEntity, |
| 1834 CertVerifyProcWeakDigestTest, | 1861 CertVerifyProcWeakDigestTest, |
| 1835 testing::ValuesIn(kVerifyIncompleteEETestData)); | 1862 testing::ValuesIn(kVerifyIncompleteEETestData)); |
| 1836 | 1863 |
| 1837 // Differing algorithms between the intermediate and the EE should still be | 1864 // Differing algorithms between the intermediate and the EE should still be |
| 1838 // reported. | 1865 // reported. |
| 1839 const WeakDigestTestData kVerifyMixedTestData[] = { | 1866 const WeakDigestTestData kVerifyMixedTestData[] = { |
| 1840 { "weak_digest_sha1_root.pem", "weak_digest_md5_intermediate.pem", | 1867 {"weak_digest_sha1_root.pem", "weak_digest_md5_intermediate.pem", |
| 1841 "weak_digest_md2_ee.pem", EXPECT_MD2 | EXPECT_MD5 }, | 1868 "weak_digest_md2_ee.pem", EXPECT_MD2 | EXPECT_MD5}, |
| 1842 { "weak_digest_sha1_root.pem", "weak_digest_md2_intermediate.pem", | 1869 {"weak_digest_sha1_root.pem", "weak_digest_md2_intermediate.pem", |
| 1843 "weak_digest_md5_ee.pem", EXPECT_MD2 | EXPECT_MD5 }, | 1870 "weak_digest_md5_ee.pem", EXPECT_MD2 | EXPECT_MD5}, |
| 1844 { "weak_digest_sha1_root.pem", "weak_digest_md4_intermediate.pem", | 1871 {"weak_digest_sha1_root.pem", "weak_digest_md4_intermediate.pem", |
| 1845 "weak_digest_md2_ee.pem", EXPECT_MD2 | EXPECT_MD4 }, | 1872 "weak_digest_md2_ee.pem", EXPECT_MD2 | EXPECT_MD4}, |
| 1846 }; | 1873 }; |
| 1847 | 1874 |
| 1848 INSTANTIATE_TEST_CASE_P(VerifyMixed, | 1875 INSTANTIATE_TEST_CASE_P(VerifyMixed, |
| 1849 CertVerifyProcWeakDigestTest, | 1876 CertVerifyProcWeakDigestTest, |
| 1850 testing::ValuesIn(kVerifyMixedTestData)); | 1877 testing::ValuesIn(kVerifyMixedTestData)); |
| 1851 | 1878 |
| 1852 // The EE is a trusted certificate. Even though it uses weak hashes, these | 1879 // The EE is a trusted certificate. Even though it uses weak hashes, these |
| 1853 // should not be reported. | 1880 // should not be reported. |
| 1854 const WeakDigestTestData kVerifyTrustedEETestData[] = { | 1881 const WeakDigestTestData kVerifyTrustedEETestData[] = { |
| 1855 {NULL, NULL, "weak_digest_md5_ee.pem", 0}, | 1882 {NULL, NULL, "weak_digest_md5_ee.pem", 0}, |
| 1856 {NULL, NULL, "weak_digest_md4_ee.pem", 0}, | 1883 {NULL, NULL, "weak_digest_md4_ee.pem", 0}, |
| 1857 {NULL, NULL, "weak_digest_md2_ee.pem", 0}, | 1884 {NULL, NULL, "weak_digest_md2_ee.pem", 0}, |
| 1858 {NULL, NULL, "weak_digest_sha1_ee.pem", 0}, | 1885 {NULL, NULL, "weak_digest_sha1_ee.pem", 0}, |
| 1859 }; | 1886 }; |
| 1860 | 1887 |
| 1861 INSTANTIATE_TEST_CASE_P(VerifyTrustedEE, | 1888 INSTANTIATE_TEST_CASE_P(VerifyTrustedEE, |
| 1862 CertVerifyProcWeakDigestTest, | 1889 CertVerifyProcWeakDigestTest, |
| 1863 testing::ValuesIn(kVerifyTrustedEETestData)); | 1890 testing::ValuesIn(kVerifyTrustedEETestData)); |
| 1864 | 1891 |
| 1865 // For the list of valid hostnames, see | 1892 // For the list of valid hostnames, see |
| 1866 // net/cert/data/ssl/certificates/subjectAltName_sanity_check.pem | 1893 // net/cert/data/ssl/certificates/subjectAltName_sanity_check.pem |
| 1867 static const struct CertVerifyProcNameData { | 1894 struct CertVerifyProcNameData { |
| 1868 const char* hostname; | 1895 const char* hostname; |
| 1869 bool valid; // Whether or not |hostname| matches a subjectAltName. | 1896 bool valid; // Whether or not |hostname| matches a subjectAltName. |
| 1870 } kVerifyNameData[] = { | |
| 1871 { "127.0.0.1", false }, // Don't match the common name | |
| 1872 { "127.0.0.2", true }, // Matches the iPAddress SAN (IPv4) | |
| 1873 { "FE80:0:0:0:0:0:0:1", true }, // Matches the iPAddress SAN (IPv6) | |
| 1874 { "[FE80:0:0:0:0:0:0:1]", false }, // Should not match the iPAddress SAN | |
| 1875 { "FE80::1", true }, // Compressed form matches the iPAddress SAN (IPv6) | |
| 1876 { "::127.0.0.2", false }, // IPv6 mapped form should NOT match iPAddress SAN | |
| 1877 { "test.example", true }, // Matches the dNSName SAN | |
| 1878 { "test.example.", true }, // Matches the dNSName SAN (trailing . ignored) | |
| 1879 { "www.test.example", false }, // Should not match the dNSName SAN | |
| 1880 { "test..example", false }, // Should not match the dNSName SAN | |
| 1881 { "test.example..", false }, // Should not match the dNSName SAN | |
| 1882 { ".test.example.", false }, // Should not match the dNSName SAN | |
| 1883 { ".test.example", false }, // Should not match the dNSName SAN | |
| 1884 }; | 1897 }; |
| 1885 | 1898 |
| 1886 // GTest 'magic' pretty-printer, so that if/when a test fails, it knows how | 1899 // Test fixture for verifying certificate names. These tests are run for each |
| 1887 // to output the parameter that was passed. Without this, it will simply | 1900 // of the CertVerify implementations. |
| 1888 // attempt to print out the first twenty bytes of the object, which depending | 1901 class CertVerifyProcNameTest : public CertVerifyProcInternalTest { |
| 1889 // on platform and alignment, may result in an invalid read. | |
| 1890 void PrintTo(const CertVerifyProcNameData& data, std::ostream* os) { | |
| 1891 *os << "Hostname: " << data.hostname << "; valid=" << data.valid; | |
| 1892 } | |
| 1893 | |
| 1894 class CertVerifyProcNameTest | |
| 1895 : public CertVerifyProcTest, | |
| 1896 public testing::WithParamInterface<CertVerifyProcNameData> { | |
| 1897 public: | 1902 public: |
| 1898 CertVerifyProcNameTest() {} | 1903 CertVerifyProcNameTest() {} |
| 1899 virtual ~CertVerifyProcNameTest() {} | 1904 virtual ~CertVerifyProcNameTest() {} |
| 1905 |
| 1906 protected: |
| 1907 void VerifyCertName(const char* hostname, bool valid) { |
| 1908 CertificateList cert_list = CreateCertificateListFromFile( |
| 1909 GetTestCertsDirectory(), "subjectAltName_sanity_check.pem", |
| 1910 X509Certificate::FORMAT_AUTO); |
| 1911 ASSERT_EQ(1U, cert_list.size()); |
| 1912 scoped_refptr<X509Certificate> cert(cert_list[0]); |
| 1913 |
| 1914 ScopedTestRoot scoped_root(cert.get()); |
| 1915 |
| 1916 CertVerifyResult verify_result; |
| 1917 int error = Verify(cert.get(), hostname, 0, NULL, CertificateList(), |
| 1918 &verify_result); |
| 1919 if (valid) { |
| 1920 EXPECT_THAT(error, IsOk()); |
| 1921 EXPECT_FALSE(verify_result.cert_status & CERT_STATUS_COMMON_NAME_INVALID); |
| 1922 } else { |
| 1923 EXPECT_THAT(error, IsError(ERR_CERT_COMMON_NAME_INVALID)); |
| 1924 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_COMMON_NAME_INVALID); |
| 1925 } |
| 1926 } |
| 1900 }; | 1927 }; |
| 1901 | 1928 |
| 1902 TEST_P(CertVerifyProcNameTest, VerifyCertName) { | 1929 // Don't match the common name |
| 1903 CertVerifyProcNameData data = GetParam(); | 1930 TEST_P(CertVerifyProcNameTest, DontMatchCommonName) { |
| 1931 VerifyCertName("127.0.0.1", false); |
| 1932 } |
| 1904 | 1933 |
| 1905 CertificateList cert_list = CreateCertificateListFromFile( | 1934 // Matches the iPAddress SAN (IPv4) |
| 1906 GetTestCertsDirectory(), "subjectAltName_sanity_check.pem", | 1935 TEST_P(CertVerifyProcNameTest, MatchesIpSanIpv4) { |
| 1907 X509Certificate::FORMAT_AUTO); | 1936 VerifyCertName("127.0.0.2", true); |
| 1908 ASSERT_EQ(1U, cert_list.size()); | 1937 } |
| 1909 scoped_refptr<X509Certificate> cert(cert_list[0]); | |
| 1910 | 1938 |
| 1911 ScopedTestRoot scoped_root(cert.get()); | 1939 // Matches the iPAddress SAN (IPv6) |
| 1940 TEST_P(CertVerifyProcNameTest, MatchesIpSanIpv6) { |
| 1941 VerifyCertName("FE80:0:0:0:0:0:0:1", true); |
| 1942 } |
| 1912 | 1943 |
| 1913 CertVerifyResult verify_result; | 1944 // Should not match the iPAddress SAN |
| 1914 int error = Verify(cert.get(), data.hostname, 0, NULL, empty_cert_list_, | 1945 TEST_P(CertVerifyProcNameTest, DoesntMatchIpSanIpv6) { |
| 1915 &verify_result); | 1946 VerifyCertName("[FE80:0:0:0:0:0:0:1]", false); |
| 1916 if (data.valid) { | 1947 } |
| 1917 EXPECT_THAT(error, IsOk()); | 1948 |
| 1918 EXPECT_FALSE(verify_result.cert_status & CERT_STATUS_COMMON_NAME_INVALID); | 1949 // Compressed form matches the iPAddress SAN (IPv6) |
| 1919 } else { | 1950 TEST_P(CertVerifyProcNameTest, MatchesIpSanCompressedIpv6) { |
| 1920 EXPECT_THAT(error, IsError(ERR_CERT_COMMON_NAME_INVALID)); | 1951 VerifyCertName("FE80::1", true); |
| 1921 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_COMMON_NAME_INVALID); | 1952 } |
| 1922 } | 1953 |
| 1954 // IPv6 mapped form should NOT match iPAddress SAN |
| 1955 TEST_P(CertVerifyProcNameTest, DoesntMatchIpSanIPv6Mapped) { |
| 1956 VerifyCertName("::127.0.0.2", false); |
| 1957 } |
| 1958 |
| 1959 // Matches the dNSName SAN |
| 1960 TEST_P(CertVerifyProcNameTest, MatchesDnsSan) { |
| 1961 VerifyCertName("test.example", true); |
| 1962 } |
| 1963 |
| 1964 // Matches the dNSName SAN (trailing . ignored) |
| 1965 TEST_P(CertVerifyProcNameTest, MatchesDnsSanTrailingDot) { |
| 1966 VerifyCertName("test.example.", true); |
| 1967 } |
| 1968 |
| 1969 // Should not match the dNSName SAN |
| 1970 TEST_P(CertVerifyProcNameTest, DoesntMatchDnsSan) { |
| 1971 VerifyCertName("www.test.example", false); |
| 1972 } |
| 1973 |
| 1974 // Should not match the dNSName SAN |
| 1975 TEST_P(CertVerifyProcNameTest, DoesntMatchDnsSanInvalid) { |
| 1976 VerifyCertName("test..example", false); |
| 1977 } |
| 1978 |
| 1979 // Should not match the dNSName SAN |
| 1980 TEST_P(CertVerifyProcNameTest, DoesntMatchDnsSanTwoTrailingDots) { |
| 1981 VerifyCertName("test.example..", false); |
| 1982 } |
| 1983 |
| 1984 // Should not match the dNSName SAN |
| 1985 TEST_P(CertVerifyProcNameTest, DoesntMatchDnsSanLeadingAndTrailingDot) { |
| 1986 VerifyCertName(".test.example.", false); |
| 1987 } |
| 1988 |
| 1989 // Should not match the dNSName SAN |
| 1990 TEST_P(CertVerifyProcNameTest, DoesntMatchDnsSanTrailingDot) { |
| 1991 VerifyCertName(".test.example", false); |
| 1923 } | 1992 } |
| 1924 | 1993 |
| 1925 INSTANTIATE_TEST_CASE_P(VerifyName, | 1994 INSTANTIATE_TEST_CASE_P(VerifyName, |
| 1926 CertVerifyProcNameTest, | 1995 CertVerifyProcNameTest, |
| 1927 testing::ValuesIn(kVerifyNameData)); | 1996 testing::ValuesIn(kAllCertVerifiers), |
| 1997 VerifyProcTypeToName); |
| 1928 | 1998 |
| 1929 #if defined(OS_MACOSX) && !defined(OS_IOS) | 1999 #if defined(OS_MACOSX) && !defined(OS_IOS) |
| 1930 // Test that CertVerifyProcMac reacts appropriately when Apple's certificate | 2000 // Test that CertVerifyProcMac reacts appropriately when Apple's certificate |
| 1931 // verifier rejects a certificate with a fatal error. This is a regression | 2001 // verifier rejects a certificate with a fatal error. This is a regression |
| 1932 // test for https://crbug.com/472291. | 2002 // test for https://crbug.com/472291. |
| 1933 // (Since 10.12, this causes a recoverable error instead of a fatal one.) | 2003 // (Since 10.12, this causes a recoverable error instead of a fatal one.) |
| 1934 // TODO(mattm): Try to find a different way to cause a fatal error that works | 2004 // TODO(mattm): Try to find a different way to cause a fatal error that works |
| 1935 // on 10.12. | 2005 // on 10.12. |
| 1936 TEST_F(CertVerifyProcTest, LargeKey) { | 2006 TEST(CertVerifyProcMacTest, LargeKey) { |
| 1937 // Load root_ca_cert.pem into the test root store. | 2007 // Load root_ca_cert.pem into the test root store. |
| 1938 ScopedTestRoot test_root( | 2008 ScopedTestRoot test_root( |
| 1939 ImportCertFromFile(GetTestCertsDirectory(), "root_ca_cert.pem").get()); | 2009 ImportCertFromFile(GetTestCertsDirectory(), "root_ca_cert.pem").get()); |
| 1940 | 2010 |
| 1941 scoped_refptr<X509Certificate> cert( | 2011 scoped_refptr<X509Certificate> cert( |
| 1942 ImportCertFromFile(GetTestCertsDirectory(), "large_key.pem")); | 2012 ImportCertFromFile(GetTestCertsDirectory(), "large_key.pem")); |
| 1943 | 2013 |
| 1944 // Apple's verifier rejects this certificate as invalid because the | 2014 // Apple's verifier rejects this certificate as invalid because the |
| 1945 // RSA key is too large. If a future version of OS X changes this, | 2015 // RSA key is too large. If a future version of OS X changes this, |
| 1946 // large_key.pem may need to be regenerated with a larger key. | 2016 // large_key.pem may need to be regenerated with a larger key. |
| 1947 int flags = 0; | 2017 int flags = 0; |
| 1948 CertVerifyResult verify_result; | 2018 CertVerifyResult verify_result; |
| 1949 int error = Verify(cert.get(), "127.0.0.1", flags, NULL, empty_cert_list_, | 2019 scoped_refptr<CertVerifyProc> verify_proc = CertVerifyProc::CreateDefault(); |
| 1950 &verify_result); | 2020 int error = verify_proc->Verify(cert.get(), "127.0.0.1", std::string(), flags, |
| 2021 NULL, CertificateList(), &verify_result); |
| 1951 EXPECT_THAT(error, IsError(ERR_CERT_INVALID)); | 2022 EXPECT_THAT(error, IsError(ERR_CERT_INVALID)); |
| 1952 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_INVALID); | 2023 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_INVALID); |
| 1953 } | 2024 } |
| 1954 #endif // defined(OS_MACOSX) && !defined(OS_IOS) | 2025 #endif // defined(OS_MACOSX) && !defined(OS_IOS) |
| 1955 | 2026 |
| 1956 // Tests that CertVerifyProc records a histogram correctly when a | 2027 // Tests that CertVerifyProc records a histogram correctly when a |
| 1957 // certificate chaining to a private root contains the TLS feature | 2028 // certificate chaining to a private root contains the TLS feature |
| 1958 // extension and does not have a stapled OCSP response. | 2029 // extension and does not have a stapled OCSP response. |
| 1959 TEST_F(CertVerifyProcTest, HasTLSFeatureExtensionUMA) { | 2030 TEST(CertVerifyProcTest, HasTLSFeatureExtensionUMA) { |
| 1960 base::HistogramTester histograms; | 2031 base::HistogramTester histograms; |
| 1961 scoped_refptr<X509Certificate> cert( | 2032 scoped_refptr<X509Certificate> cert( |
| 1962 ImportCertFromFile(GetTestCertsDirectory(), "tls_feature_extension.pem")); | 2033 ImportCertFromFile(GetTestCertsDirectory(), "tls_feature_extension.pem")); |
| 1963 ASSERT_TRUE(cert); | 2034 ASSERT_TRUE(cert); |
| 1964 CertVerifyResult result; | 2035 CertVerifyResult result; |
| 1965 result.is_issued_by_known_root = false; | 2036 result.is_issued_by_known_root = false; |
| 1966 verify_proc_ = new MockCertVerifyProc(result); | 2037 scoped_refptr<CertVerifyProc> verify_proc = new MockCertVerifyProc(result); |
| 1967 | 2038 |
| 1968 histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 0); | 2039 histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 0); |
| 1969 histograms.ExpectTotalCount(kTLSFeatureExtensionOCSPHistogram, 0); | 2040 histograms.ExpectTotalCount(kTLSFeatureExtensionOCSPHistogram, 0); |
| 1970 | 2041 |
| 1971 int flags = 0; | 2042 int flags = 0; |
| 1972 CertVerifyResult verify_result; | 2043 CertVerifyResult verify_result; |
| 1973 int error = Verify(cert.get(), "127.0.0.1", flags, NULL, empty_cert_list_, | 2044 int error = verify_proc->Verify(cert.get(), "127.0.0.1", std::string(), flags, |
| 1974 &verify_result); | 2045 NULL, CertificateList(), &verify_result); |
| 1975 EXPECT_EQ(OK, error); | 2046 EXPECT_EQ(OK, error); |
| 1976 histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 1); | 2047 histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 1); |
| 1977 histograms.ExpectBucketCount(kTLSFeatureExtensionHistogram, true, 1); | 2048 histograms.ExpectBucketCount(kTLSFeatureExtensionHistogram, true, 1); |
| 1978 histograms.ExpectTotalCount(kTLSFeatureExtensionOCSPHistogram, 1); | 2049 histograms.ExpectTotalCount(kTLSFeatureExtensionOCSPHistogram, 1); |
| 1979 histograms.ExpectBucketCount(kTLSFeatureExtensionOCSPHistogram, false, 1); | 2050 histograms.ExpectBucketCount(kTLSFeatureExtensionOCSPHistogram, false, 1); |
| 1980 } | 2051 } |
| 1981 | 2052 |
| 1982 // Tests that CertVerifyProc records a histogram correctly when a | 2053 // Tests that CertVerifyProc records a histogram correctly when a |
| 1983 // certificate chaining to a private root contains the TLS feature | 2054 // certificate chaining to a private root contains the TLS feature |
| 1984 // extension and does have a stapled OCSP response. | 2055 // extension and does have a stapled OCSP response. |
| 1985 TEST_F(CertVerifyProcTest, HasTLSFeatureExtensionWithStapleUMA) { | 2056 TEST(CertVerifyProcTest, HasTLSFeatureExtensionWithStapleUMA) { |
| 1986 base::HistogramTester histograms; | 2057 base::HistogramTester histograms; |
| 1987 scoped_refptr<X509Certificate> cert( | 2058 scoped_refptr<X509Certificate> cert( |
| 1988 ImportCertFromFile(GetTestCertsDirectory(), "tls_feature_extension.pem")); | 2059 ImportCertFromFile(GetTestCertsDirectory(), "tls_feature_extension.pem")); |
| 1989 ASSERT_TRUE(cert); | 2060 ASSERT_TRUE(cert); |
| 1990 CertVerifyResult result; | 2061 CertVerifyResult result; |
| 1991 result.is_issued_by_known_root = false; | 2062 result.is_issued_by_known_root = false; |
| 1992 verify_proc_ = new MockCertVerifyProc(result); | 2063 scoped_refptr<CertVerifyProc> verify_proc = new MockCertVerifyProc(result); |
| 1993 | 2064 |
| 1994 histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 0); | 2065 histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 0); |
| 1995 histograms.ExpectTotalCount(kTLSFeatureExtensionOCSPHistogram, 0); | 2066 histograms.ExpectTotalCount(kTLSFeatureExtensionOCSPHistogram, 0); |
| 1996 | 2067 |
| 1997 int flags = 0; | 2068 int flags = 0; |
| 1998 CertVerifyResult verify_result; | 2069 CertVerifyResult verify_result; |
| 1999 int error = | 2070 int error = |
| 2000 VerifyWithOCSPResponse(cert.get(), "127.0.0.1", "dummy response", flags, | 2071 verify_proc->Verify(cert.get(), "127.0.0.1", "dummy response", flags, |
| 2001 NULL, empty_cert_list_, &verify_result); | 2072 nullptr, CertificateList(), &verify_result); |
| 2002 EXPECT_EQ(OK, error); | 2073 EXPECT_EQ(OK, error); |
| 2003 histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 1); | 2074 histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 1); |
| 2004 histograms.ExpectBucketCount(kTLSFeatureExtensionHistogram, true, 1); | 2075 histograms.ExpectBucketCount(kTLSFeatureExtensionHistogram, true, 1); |
| 2005 histograms.ExpectTotalCount(kTLSFeatureExtensionOCSPHistogram, 1); | 2076 histograms.ExpectTotalCount(kTLSFeatureExtensionOCSPHistogram, 1); |
| 2006 histograms.ExpectBucketCount(kTLSFeatureExtensionOCSPHistogram, true, 1); | 2077 histograms.ExpectBucketCount(kTLSFeatureExtensionOCSPHistogram, true, 1); |
| 2007 } | 2078 } |
| 2008 | 2079 |
| 2009 // Tests that CertVerifyProc records a histogram correctly when a | 2080 // Tests that CertVerifyProc records a histogram correctly when a |
| 2010 // certificate chaining to a private root does not contain the TLS feature | 2081 // certificate chaining to a private root does not contain the TLS feature |
| 2011 // extension. | 2082 // extension. |
| 2012 TEST_F(CertVerifyProcTest, DoesNotHaveTLSFeatureExtensionUMA) { | 2083 TEST(CertVerifyProcTest, DoesNotHaveTLSFeatureExtensionUMA) { |
| 2013 base::HistogramTester histograms; | 2084 base::HistogramTester histograms; |
| 2014 scoped_refptr<X509Certificate> cert( | 2085 scoped_refptr<X509Certificate> cert( |
| 2015 ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); | 2086 ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); |
| 2016 ASSERT_TRUE(cert); | 2087 ASSERT_TRUE(cert); |
| 2017 CertVerifyResult result; | 2088 CertVerifyResult result; |
| 2018 result.is_issued_by_known_root = false; | 2089 result.is_issued_by_known_root = false; |
| 2019 verify_proc_ = new MockCertVerifyProc(result); | 2090 scoped_refptr<CertVerifyProc> verify_proc = new MockCertVerifyProc(result); |
| 2020 | 2091 |
| 2021 histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 0); | 2092 histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 0); |
| 2022 histograms.ExpectTotalCount(kTLSFeatureExtensionOCSPHistogram, 0); | 2093 histograms.ExpectTotalCount(kTLSFeatureExtensionOCSPHistogram, 0); |
| 2023 | 2094 |
| 2024 int flags = 0; | 2095 int flags = 0; |
| 2025 CertVerifyResult verify_result; | 2096 CertVerifyResult verify_result; |
| 2026 int error = Verify(cert.get(), "127.0.0.1", flags, NULL, empty_cert_list_, | 2097 int error = verify_proc->Verify(cert.get(), "127.0.0.1", std::string(), flags, |
| 2027 &verify_result); | 2098 NULL, CertificateList(), &verify_result); |
| 2028 EXPECT_EQ(OK, error); | 2099 EXPECT_EQ(OK, error); |
| 2029 histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 1); | 2100 histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 1); |
| 2030 histograms.ExpectBucketCount(kTLSFeatureExtensionHistogram, false, 1); | 2101 histograms.ExpectBucketCount(kTLSFeatureExtensionHistogram, false, 1); |
| 2031 histograms.ExpectTotalCount(kTLSFeatureExtensionOCSPHistogram, 0); | 2102 histograms.ExpectTotalCount(kTLSFeatureExtensionOCSPHistogram, 0); |
| 2032 } | 2103 } |
| 2033 | 2104 |
| 2034 // Tests that CertVerifyProc does not record a histogram when a | 2105 // Tests that CertVerifyProc does not record a histogram when a |
| 2035 // certificate contains the TLS feature extension but chains to a public | 2106 // certificate contains the TLS feature extension but chains to a public |
| 2036 // root. | 2107 // root. |
| 2037 TEST_F(CertVerifyProcTest, HasTLSFeatureExtensionWithPublicRootUMA) { | 2108 TEST(CertVerifyProcTest, HasTLSFeatureExtensionWithPublicRootUMA) { |
| 2038 base::HistogramTester histograms; | 2109 base::HistogramTester histograms; |
| 2039 scoped_refptr<X509Certificate> cert( | 2110 scoped_refptr<X509Certificate> cert( |
| 2040 ImportCertFromFile(GetTestCertsDirectory(), "tls_feature_extension.pem")); | 2111 ImportCertFromFile(GetTestCertsDirectory(), "tls_feature_extension.pem")); |
| 2041 ASSERT_TRUE(cert); | 2112 ASSERT_TRUE(cert); |
| 2042 CertVerifyResult result; | 2113 CertVerifyResult result; |
| 2043 result.is_issued_by_known_root = true; | 2114 result.is_issued_by_known_root = true; |
| 2044 verify_proc_ = new MockCertVerifyProc(result); | 2115 scoped_refptr<CertVerifyProc> verify_proc = new MockCertVerifyProc(result); |
| 2045 | 2116 |
| 2046 histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 0); | 2117 histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 0); |
| 2047 | 2118 |
| 2048 int flags = 0; | 2119 int flags = 0; |
| 2049 CertVerifyResult verify_result; | 2120 CertVerifyResult verify_result; |
| 2050 int error = Verify(cert.get(), "127.0.0.1", flags, NULL, empty_cert_list_, | 2121 int error = verify_proc->Verify(cert.get(), "127.0.0.1", std::string(), flags, |
| 2051 &verify_result); | 2122 NULL, CertificateList(), &verify_result); |
| 2052 EXPECT_EQ(OK, error); | 2123 EXPECT_EQ(OK, error); |
| 2053 histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 0); | 2124 histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 0); |
| 2054 histograms.ExpectTotalCount(kTLSFeatureExtensionOCSPHistogram, 0); | 2125 histograms.ExpectTotalCount(kTLSFeatureExtensionOCSPHistogram, 0); |
| 2055 } | 2126 } |
| 2056 | 2127 |
| 2057 } // namespace net | 2128 } // namespace net |
| OLD | NEW |