| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/internal/path_builder.h" | 5 #include "net/cert/internal/path_builder.h" |
| 6 | 6 |
| 7 #include "base/base_paths.h" | 7 #include "base/base_paths.h" |
| 8 #include "base/cancelable_callback.h" | 8 #include "base/cancelable_callback.h" |
| 9 #include "base/files/file_util.h" | 9 #include "base/files/file_util.h" |
| 10 #include "base/location.h" | 10 #include "base/location.h" |
| 11 #include "base/path_service.h" | 11 #include "base/path_service.h" |
| 12 #include "base/threading/thread_task_runner_handle.h" | 12 #include "base/threading/thread_task_runner_handle.h" |
| 13 #include "net/base/net_errors.h" | |
| 14 #include "net/base/test_completion_callback.h" | 13 #include "net/base/test_completion_callback.h" |
| 15 #include "net/cert/internal/cert_issuer_source_static.h" | 14 #include "net/cert/internal/cert_issuer_source_static.h" |
| 16 #include "net/cert/internal/parsed_certificate.h" | 15 #include "net/cert/internal/parsed_certificate.h" |
| 17 #include "net/cert/internal/signature_policy.h" | 16 #include "net/cert/internal/signature_policy.h" |
| 18 #include "net/cert/internal/test_helpers.h" | 17 #include "net/cert/internal/test_helpers.h" |
| 19 #include "net/cert/internal/trust_store_in_memory.h" | 18 #include "net/cert/internal/trust_store_in_memory.h" |
| 20 #include "net/cert/internal/trust_store_test_helpers.h" | 19 #include "net/cert/internal/trust_store_test_helpers.h" |
| 21 #include "net/cert/internal/verify_certificate_chain.h" | 20 #include "net/cert/internal/verify_certificate_chain.h" |
| 22 #include "net/cert/pem_tokenizer.h" | 21 #include "net/cert/pem_tokenizer.h" |
| 23 #include "net/der/input.h" | 22 #include "net/der/input.h" |
| 24 #include "net/test/cert_test_util.h" | 23 #include "net/test/cert_test_util.h" |
| 25 #include "net/test/test_certificate_data.h" | 24 #include "net/test/test_certificate_data.h" |
| 26 #include "testing/gmock/include/gmock/gmock.h" | 25 #include "testing/gmock/include/gmock/gmock.h" |
| 27 #include "testing/gtest/include/gtest/gtest.h" | 26 #include "testing/gtest/include/gtest/gtest.h" |
| 28 | 27 |
| 29 namespace net { | 28 namespace net { |
| 30 | 29 |
| 30 // TODO(crbug.com/634443): Assert the errors for each ResultPath. |
| 31 |
| 31 namespace { | 32 namespace { |
| 32 | 33 |
| 33 using ::testing::_; | 34 using ::testing::_; |
| 34 using ::testing::Invoke; | 35 using ::testing::Invoke; |
| 35 using ::testing::NiceMock; | 36 using ::testing::NiceMock; |
| 36 using ::testing::Return; | 37 using ::testing::Return; |
| 37 using ::testing::SaveArg; | 38 using ::testing::SaveArg; |
| 38 using ::testing::SetArgPointee; | 39 using ::testing::SetArgPointee; |
| 39 using ::testing::StrictMock; | 40 using ::testing::StrictMock; |
| 40 | 41 |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 TrustStoreInMemory trust_store; | 185 TrustStoreInMemory trust_store; |
| 185 AddTrustedCertificate(a_by_b_, &trust_store); | 186 AddTrustedCertificate(a_by_b_, &trust_store); |
| 186 AddTrustedCertificate(b_by_f_, &trust_store); | 187 AddTrustedCertificate(b_by_f_, &trust_store); |
| 187 | 188 |
| 188 CertPathBuilder::Result result; | 189 CertPathBuilder::Result result; |
| 189 CertPathBuilder path_builder(a_by_b_, &trust_store, &signature_policy_, time_, | 190 CertPathBuilder path_builder(a_by_b_, &trust_store, &signature_policy_, time_, |
| 190 &result); | 191 &result); |
| 191 | 192 |
| 192 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); | 193 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); |
| 193 | 194 |
| 194 EXPECT_EQ(OK, result.error()); | 195 ASSERT_TRUE(result.HasValidPath()); |
| 195 ASSERT_FALSE(result.paths.empty()); | 196 const auto& path = result.GetBestValidPath()->path; |
| 196 const auto& path = result.paths[result.best_result_index]->path; | |
| 197 ASSERT_EQ(1U, path.certs.size()); | 197 ASSERT_EQ(1U, path.certs.size()); |
| 198 EXPECT_EQ(a_by_b_, path.certs[0]); | 198 EXPECT_EQ(a_by_b_, path.certs[0]); |
| 199 EXPECT_EQ(b_by_f_, path.trust_anchor->cert()); | 199 EXPECT_EQ(b_by_f_, path.trust_anchor->cert()); |
| 200 } | 200 } |
| 201 | 201 |
| 202 // If the target cert is has the same name and key as a trust anchor, however | 202 // If the target cert is has the same name and key as a trust anchor, however |
| 203 // is NOT itself signed by a trust anchor, it fails. Although the provided SPKI | 203 // is NOT itself signed by a trust anchor, it fails. Although the provided SPKI |
| 204 // is trusted, the certificate contents cannot be verified. | 204 // is trusted, the certificate contents cannot be verified. |
| 205 TEST_F(PathBuilderMultiRootTest, TargetWithSameNameAsTrustAnchorFails) { | 205 TEST_F(PathBuilderMultiRootTest, TargetWithSameNameAsTrustAnchorFails) { |
| 206 TrustStoreInMemory trust_store; | 206 TrustStoreInMemory trust_store; |
| 207 AddTrustedCertificate(a_by_b_, &trust_store); | 207 AddTrustedCertificate(a_by_b_, &trust_store); |
| 208 | 208 |
| 209 CertPathBuilder::Result result; | 209 CertPathBuilder::Result result; |
| 210 CertPathBuilder path_builder(a_by_b_, &trust_store, &signature_policy_, time_, | 210 CertPathBuilder path_builder(a_by_b_, &trust_store, &signature_policy_, time_, |
| 211 &result); | 211 &result); |
| 212 | 212 |
| 213 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); | 213 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); |
| 214 | 214 |
| 215 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, result.error()); | 215 EXPECT_FALSE(result.HasValidPath()); |
| 216 } | 216 } |
| 217 | 217 |
| 218 // Test a failed path building when the trust anchor is provided as a | 218 // Test a failed path building when the trust anchor is provided as a |
| 219 // supplemental certificate. Conceptually the following paths can be built: | 219 // supplemental certificate. Conceptually the following paths can be built: |
| 220 // | 220 // |
| 221 // B(C) <- C(D) <- [Trust anchor D] | 221 // B(C) <- C(D) <- [Trust anchor D] |
| 222 // B(C) <- C(D) <- D(D) <- [Trust anchor D] | 222 // B(C) <- C(D) <- D(D) <- [Trust anchor D] |
| 223 // | 223 // |
| 224 // The second one is extraneous given the shorter one, however path building | 224 // The second one is extraneous given the shorter one, however path building |
| 225 // will enumerate it if the shorter one failed validation. | 225 // will enumerate it if the shorter one failed validation. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 236 // C(D) is not valid at this time, so path building will fail. | 236 // C(D) is not valid at this time, so path building will fail. |
| 237 der::GeneralizedTime expired_time = {2016, 1, 1, 0, 0, 0}; | 237 der::GeneralizedTime expired_time = {2016, 1, 1, 0, 0, 0}; |
| 238 | 238 |
| 239 CertPathBuilder::Result result; | 239 CertPathBuilder::Result result; |
| 240 CertPathBuilder path_builder(b_by_c_, &trust_store, &signature_policy_, | 240 CertPathBuilder path_builder(b_by_c_, &trust_store, &signature_policy_, |
| 241 expired_time, &result); | 241 expired_time, &result); |
| 242 path_builder.AddCertIssuerSource(&sync_certs); | 242 path_builder.AddCertIssuerSource(&sync_certs); |
| 243 | 243 |
| 244 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); | 244 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); |
| 245 | 245 |
| 246 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, result.error()); | 246 EXPECT_FALSE(result.HasValidPath()); |
| 247 ASSERT_EQ(2U, result.paths.size()); | 247 ASSERT_EQ(2U, result.paths.size()); |
| 248 | 248 |
| 249 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, result.paths[0]->error); | 249 EXPECT_FALSE(result.paths[0]->valid); |
| 250 const auto& path0 = result.paths[0]->path; | 250 const auto& path0 = result.paths[0]->path; |
| 251 ASSERT_EQ(2U, path0.certs.size()); | 251 ASSERT_EQ(2U, path0.certs.size()); |
| 252 EXPECT_EQ(b_by_c_, path0.certs[0]); | 252 EXPECT_EQ(b_by_c_, path0.certs[0]); |
| 253 EXPECT_EQ(c_by_d_, path0.certs[1]); | 253 EXPECT_EQ(c_by_d_, path0.certs[1]); |
| 254 EXPECT_EQ(d_by_d_, path0.trust_anchor->cert()); | 254 EXPECT_EQ(d_by_d_, path0.trust_anchor->cert()); |
| 255 | 255 |
| 256 const auto& path1 = result.paths[1]->path; | 256 const auto& path1 = result.paths[1]->path; |
| 257 ASSERT_EQ(3U, path1.certs.size()); | 257 ASSERT_EQ(3U, path1.certs.size()); |
| 258 EXPECT_EQ(b_by_c_, path1.certs[0]); | 258 EXPECT_EQ(b_by_c_, path1.certs[0]); |
| 259 EXPECT_EQ(c_by_d_, path1.certs[1]); | 259 EXPECT_EQ(c_by_d_, path1.certs[1]); |
| 260 EXPECT_EQ(d_by_d_, path1.certs[2]); | 260 EXPECT_EQ(d_by_d_, path1.certs[2]); |
| 261 EXPECT_EQ(d_by_d_, path1.trust_anchor->cert()); | 261 EXPECT_EQ(d_by_d_, path1.trust_anchor->cert()); |
| 262 } | 262 } |
| 263 | 263 |
| 264 // If the target cert is a self-signed cert whose key is a trust anchor, it | 264 // If the target cert is a self-signed cert whose key is a trust anchor, it |
| 265 // should verify. | 265 // should verify. |
| 266 TEST_F(PathBuilderMultiRootTest, TargetIsSelfSignedTrustAnchor) { | 266 TEST_F(PathBuilderMultiRootTest, TargetIsSelfSignedTrustAnchor) { |
| 267 TrustStoreInMemory trust_store; | 267 TrustStoreInMemory trust_store; |
| 268 AddTrustedCertificate(e_by_e_, &trust_store); | 268 AddTrustedCertificate(e_by_e_, &trust_store); |
| 269 // This is not necessary for the test, just an extra... | 269 // This is not necessary for the test, just an extra... |
| 270 AddTrustedCertificate(f_by_e_, &trust_store); | 270 AddTrustedCertificate(f_by_e_, &trust_store); |
| 271 | 271 |
| 272 CertPathBuilder::Result result; | 272 CertPathBuilder::Result result; |
| 273 CertPathBuilder path_builder(e_by_e_, &trust_store, &signature_policy_, time_, | 273 CertPathBuilder path_builder(e_by_e_, &trust_store, &signature_policy_, time_, |
| 274 &result); | 274 &result); |
| 275 | 275 |
| 276 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); | 276 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); |
| 277 | 277 |
| 278 EXPECT_EQ(OK, result.error()); | 278 ASSERT_TRUE(result.HasValidPath()); |
| 279 ASSERT_FALSE(result.paths.empty()); | 279 const auto& path = result.GetBestValidPath()->path; |
| 280 const auto& path = result.paths[result.best_result_index]->path; | |
| 281 ASSERT_EQ(1U, path.certs.size()); | 280 ASSERT_EQ(1U, path.certs.size()); |
| 282 EXPECT_EQ(e_by_e_, path.certs[0]); | 281 EXPECT_EQ(e_by_e_, path.certs[0]); |
| 283 EXPECT_EQ(e_by_e_, path.trust_anchor->cert()); | 282 EXPECT_EQ(e_by_e_, path.trust_anchor->cert()); |
| 284 } | 283 } |
| 285 | 284 |
| 286 // If the target cert is directly issued by a trust anchor, it should verify | 285 // If the target cert is directly issued by a trust anchor, it should verify |
| 287 // without any intermediate certs being provided. | 286 // without any intermediate certs being provided. |
| 288 TEST_F(PathBuilderMultiRootTest, TargetDirectlySignedByTrustAnchor) { | 287 TEST_F(PathBuilderMultiRootTest, TargetDirectlySignedByTrustAnchor) { |
| 289 TrustStoreInMemory trust_store; | 288 TrustStoreInMemory trust_store; |
| 290 AddTrustedCertificate(b_by_f_, &trust_store); | 289 AddTrustedCertificate(b_by_f_, &trust_store); |
| 291 | 290 |
| 292 CertPathBuilder::Result result; | 291 CertPathBuilder::Result result; |
| 293 CertPathBuilder path_builder(a_by_b_, &trust_store, &signature_policy_, time_, | 292 CertPathBuilder path_builder(a_by_b_, &trust_store, &signature_policy_, time_, |
| 294 &result); | 293 &result); |
| 295 | 294 |
| 296 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); | 295 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); |
| 297 | 296 |
| 298 ASSERT_EQ(OK, result.error()); | 297 ASSERT_TRUE(result.HasValidPath()); |
| 299 ASSERT_FALSE(result.paths.empty()); | 298 const auto& path = result.GetBestValidPath()->path; |
| 300 const auto& path = result.paths[result.best_result_index]->path; | |
| 301 ASSERT_EQ(1U, path.certs.size()); | 299 ASSERT_EQ(1U, path.certs.size()); |
| 302 EXPECT_EQ(a_by_b_, path.certs[0]); | 300 EXPECT_EQ(a_by_b_, path.certs[0]); |
| 303 EXPECT_EQ(b_by_f_, path.trust_anchor->cert()); | 301 EXPECT_EQ(b_by_f_, path.trust_anchor->cert()); |
| 304 } | 302 } |
| 305 | 303 |
| 306 // Test that async cert queries are not made if the path can be successfully | 304 // Test that async cert queries are not made if the path can be successfully |
| 307 // built with synchronously available certs. | 305 // built with synchronously available certs. |
| 308 TEST_F(PathBuilderMultiRootTest, TriesSyncFirst) { | 306 TEST_F(PathBuilderMultiRootTest, TriesSyncFirst) { |
| 309 TrustStoreInMemory trust_store; | 307 TrustStoreInMemory trust_store; |
| 310 AddTrustedCertificate(e_by_e_, &trust_store); | 308 AddTrustedCertificate(e_by_e_, &trust_store); |
| 311 | 309 |
| 312 CertIssuerSourceStatic sync_certs; | 310 CertIssuerSourceStatic sync_certs; |
| 313 sync_certs.AddCert(b_by_f_); | 311 sync_certs.AddCert(b_by_f_); |
| 314 sync_certs.AddCert(f_by_e_); | 312 sync_certs.AddCert(f_by_e_); |
| 315 | 313 |
| 316 AsyncCertIssuerSourceStatic async_certs; | 314 AsyncCertIssuerSourceStatic async_certs; |
| 317 async_certs.AddCert(b_by_c_); | 315 async_certs.AddCert(b_by_c_); |
| 318 async_certs.AddCert(c_by_e_); | 316 async_certs.AddCert(c_by_e_); |
| 319 | 317 |
| 320 CertPathBuilder::Result result; | 318 CertPathBuilder::Result result; |
| 321 CertPathBuilder path_builder(a_by_b_, &trust_store, &signature_policy_, time_, | 319 CertPathBuilder path_builder(a_by_b_, &trust_store, &signature_policy_, time_, |
| 322 &result); | 320 &result); |
| 323 path_builder.AddCertIssuerSource(&async_certs); | 321 path_builder.AddCertIssuerSource(&async_certs); |
| 324 path_builder.AddCertIssuerSource(&sync_certs); | 322 path_builder.AddCertIssuerSource(&sync_certs); |
| 325 | 323 |
| 326 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); | 324 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); |
| 327 | 325 |
| 328 EXPECT_EQ(OK, result.error()); | 326 EXPECT_TRUE(result.HasValidPath()); |
| 329 EXPECT_EQ(0, async_certs.num_async_gets()); | 327 EXPECT_EQ(0, async_certs.num_async_gets()); |
| 330 } | 328 } |
| 331 | 329 |
| 332 // Test that async cert queries are not made if no callback is provided. | 330 // Test that async cert queries are not made if no callback is provided. |
| 333 TEST_F(PathBuilderMultiRootTest, SychronousOnlyMode) { | 331 TEST_F(PathBuilderMultiRootTest, SychronousOnlyMode) { |
| 334 TrustStoreInMemory trust_store; | 332 TrustStoreInMemory trust_store; |
| 335 AddTrustedCertificate(e_by_e_, &trust_store); | 333 AddTrustedCertificate(e_by_e_, &trust_store); |
| 336 | 334 |
| 337 CertIssuerSourceStatic sync_certs; | 335 CertIssuerSourceStatic sync_certs; |
| 338 sync_certs.AddCert(f_by_e_); | 336 sync_certs.AddCert(f_by_e_); |
| 339 | 337 |
| 340 AsyncCertIssuerSourceStatic async_certs; | 338 AsyncCertIssuerSourceStatic async_certs; |
| 341 async_certs.AddCert(b_by_f_); | 339 async_certs.AddCert(b_by_f_); |
| 342 | 340 |
| 343 CertPathBuilder::Result result; | 341 CertPathBuilder::Result result; |
| 344 CertPathBuilder path_builder(a_by_b_, &trust_store, &signature_policy_, time_, | 342 CertPathBuilder path_builder(a_by_b_, &trust_store, &signature_policy_, time_, |
| 345 &result); | 343 &result); |
| 346 path_builder.AddCertIssuerSource(&async_certs); | 344 path_builder.AddCertIssuerSource(&async_certs); |
| 347 path_builder.AddCertIssuerSource(&sync_certs); | 345 path_builder.AddCertIssuerSource(&sync_certs); |
| 348 | 346 |
| 349 EXPECT_EQ(CompletionStatus::SYNC, path_builder.Run(base::Closure())); | 347 EXPECT_EQ(CompletionStatus::SYNC, path_builder.Run(base::Closure())); |
| 350 | 348 |
| 351 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, result.error()); | 349 EXPECT_FALSE(result.HasValidPath()); |
| 352 EXPECT_EQ(0, async_certs.num_async_gets()); | 350 EXPECT_EQ(0, async_certs.num_async_gets()); |
| 353 } | 351 } |
| 354 | 352 |
| 355 // If async queries are needed, all async sources will be queried | 353 // If async queries are needed, all async sources will be queried |
| 356 // simultaneously. | 354 // simultaneously. |
| 357 TEST_F(PathBuilderMultiRootTest, TestAsyncSimultaneous) { | 355 TEST_F(PathBuilderMultiRootTest, TestAsyncSimultaneous) { |
| 358 TrustStoreInMemory trust_store; | 356 TrustStoreInMemory trust_store; |
| 359 AddTrustedCertificate(e_by_e_, &trust_store); | 357 AddTrustedCertificate(e_by_e_, &trust_store); |
| 360 | 358 |
| 361 CertIssuerSourceStatic sync_certs; | 359 CertIssuerSourceStatic sync_certs; |
| 362 sync_certs.AddCert(b_by_c_); | 360 sync_certs.AddCert(b_by_c_); |
| 363 sync_certs.AddCert(b_by_f_); | 361 sync_certs.AddCert(b_by_f_); |
| 364 | 362 |
| 365 AsyncCertIssuerSourceStatic async_certs1; | 363 AsyncCertIssuerSourceStatic async_certs1; |
| 366 async_certs1.AddCert(c_by_e_); | 364 async_certs1.AddCert(c_by_e_); |
| 367 | 365 |
| 368 AsyncCertIssuerSourceStatic async_certs2; | 366 AsyncCertIssuerSourceStatic async_certs2; |
| 369 async_certs2.AddCert(f_by_e_); | 367 async_certs2.AddCert(f_by_e_); |
| 370 | 368 |
| 371 CertPathBuilder::Result result; | 369 CertPathBuilder::Result result; |
| 372 CertPathBuilder path_builder(a_by_b_, &trust_store, &signature_policy_, time_, | 370 CertPathBuilder path_builder(a_by_b_, &trust_store, &signature_policy_, time_, |
| 373 &result); | 371 &result); |
| 374 path_builder.AddCertIssuerSource(&async_certs1); | 372 path_builder.AddCertIssuerSource(&async_certs1); |
| 375 path_builder.AddCertIssuerSource(&async_certs2); | 373 path_builder.AddCertIssuerSource(&async_certs2); |
| 376 path_builder.AddCertIssuerSource(&sync_certs); | 374 path_builder.AddCertIssuerSource(&sync_certs); |
| 377 | 375 |
| 378 EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder)); | 376 EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder)); |
| 379 | 377 |
| 380 EXPECT_EQ(OK, result.error()); | 378 EXPECT_TRUE(result.HasValidPath()); |
| 381 EXPECT_EQ(1, async_certs1.num_async_gets()); | 379 EXPECT_EQ(1, async_certs1.num_async_gets()); |
| 382 EXPECT_EQ(1, async_certs2.num_async_gets()); | 380 EXPECT_EQ(1, async_certs2.num_async_gets()); |
| 383 } | 381 } |
| 384 | 382 |
| 385 // Test that PathBuilder does not generate longer paths than necessary if one of | 383 // Test that PathBuilder does not generate longer paths than necessary if one of |
| 386 // the supplied certs is itself a trust anchor. | 384 // the supplied certs is itself a trust anchor. |
| 387 TEST_F(PathBuilderMultiRootTest, TestLongChain) { | 385 TEST_F(PathBuilderMultiRootTest, TestLongChain) { |
| 388 // Both D(D) and C(D) are trusted roots. | 386 // Both D(D) and C(D) are trusted roots. |
| 389 TrustStoreInMemory trust_store; | 387 TrustStoreInMemory trust_store; |
| 390 AddTrustedCertificate(d_by_d_, &trust_store); | 388 AddTrustedCertificate(d_by_d_, &trust_store); |
| 391 AddTrustedCertificate(c_by_d_, &trust_store); | 389 AddTrustedCertificate(c_by_d_, &trust_store); |
| 392 | 390 |
| 393 // Certs B(C), and C(D) are all supplied. | 391 // Certs B(C), and C(D) are all supplied. |
| 394 CertIssuerSourceStatic sync_certs; | 392 CertIssuerSourceStatic sync_certs; |
| 395 sync_certs.AddCert(b_by_c_); | 393 sync_certs.AddCert(b_by_c_); |
| 396 sync_certs.AddCert(c_by_d_); | 394 sync_certs.AddCert(c_by_d_); |
| 397 | 395 |
| 398 CertPathBuilder::Result result; | 396 CertPathBuilder::Result result; |
| 399 CertPathBuilder path_builder(a_by_b_, &trust_store, &signature_policy_, time_, | 397 CertPathBuilder path_builder(a_by_b_, &trust_store, &signature_policy_, time_, |
| 400 &result); | 398 &result); |
| 401 path_builder.AddCertIssuerSource(&sync_certs); | 399 path_builder.AddCertIssuerSource(&sync_certs); |
| 402 | 400 |
| 403 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); | 401 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); |
| 404 | 402 |
| 405 EXPECT_EQ(OK, result.error()); | 403 ASSERT_TRUE(result.HasValidPath()); |
| 406 | 404 |
| 407 // The result path should be A(B) <- B(C) <- C(D) | 405 // The result path should be A(B) <- B(C) <- C(D) |
| 408 // not the longer but also valid A(B) <- B(C) <- C(D) <- D(D) | 406 // not the longer but also valid A(B) <- B(C) <- C(D) <- D(D) |
| 409 ASSERT_FALSE(result.paths.empty()); | 407 EXPECT_EQ(2U, result.GetBestValidPath()->path.certs.size()); |
| 410 const auto& path = result.paths[result.best_result_index]->path; | |
| 411 EXPECT_EQ(2U, path.certs.size()); | |
| 412 } | 408 } |
| 413 | 409 |
| 414 // Test that PathBuilder will backtrack and try a different path if the first | 410 // Test that PathBuilder will backtrack and try a different path if the first |
| 415 // one doesn't work out. | 411 // one doesn't work out. |
| 416 TEST_F(PathBuilderMultiRootTest, TestBacktracking) { | 412 TEST_F(PathBuilderMultiRootTest, TestBacktracking) { |
| 417 // Only D(D) is a trusted root. | 413 // Only D(D) is a trusted root. |
| 418 TrustStoreInMemory trust_store; | 414 TrustStoreInMemory trust_store; |
| 419 AddTrustedCertificate(d_by_d_, &trust_store); | 415 AddTrustedCertificate(d_by_d_, &trust_store); |
| 420 | 416 |
| 421 // Certs B(F) and F(E) are supplied synchronously, thus the path | 417 // Certs B(F) and F(E) are supplied synchronously, thus the path |
| 422 // A(B) <- B(F) <- F(E) should be built first, though it won't verify. | 418 // A(B) <- B(F) <- F(E) should be built first, though it won't verify. |
| 423 CertIssuerSourceStatic sync_certs; | 419 CertIssuerSourceStatic sync_certs; |
| 424 sync_certs.AddCert(b_by_f_); | 420 sync_certs.AddCert(b_by_f_); |
| 425 sync_certs.AddCert(f_by_e_); | 421 sync_certs.AddCert(f_by_e_); |
| 426 | 422 |
| 427 // Certs B(C), and C(D) are supplied asynchronously, so the path | 423 // Certs B(C), and C(D) are supplied asynchronously, so the path |
| 428 // A(B) <- B(C) <- C(D) <- D(D) should be tried second. | 424 // A(B) <- B(C) <- C(D) <- D(D) should be tried second. |
| 429 AsyncCertIssuerSourceStatic async_certs; | 425 AsyncCertIssuerSourceStatic async_certs; |
| 430 async_certs.AddCert(b_by_c_); | 426 async_certs.AddCert(b_by_c_); |
| 431 async_certs.AddCert(c_by_d_); | 427 async_certs.AddCert(c_by_d_); |
| 432 | 428 |
| 433 CertPathBuilder::Result result; | 429 CertPathBuilder::Result result; |
| 434 CertPathBuilder path_builder(a_by_b_, &trust_store, &signature_policy_, time_, | 430 CertPathBuilder path_builder(a_by_b_, &trust_store, &signature_policy_, time_, |
| 435 &result); | 431 &result); |
| 436 path_builder.AddCertIssuerSource(&sync_certs); | 432 path_builder.AddCertIssuerSource(&sync_certs); |
| 437 path_builder.AddCertIssuerSource(&async_certs); | 433 path_builder.AddCertIssuerSource(&async_certs); |
| 438 | 434 |
| 439 EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder)); | 435 EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder)); |
| 440 | 436 |
| 441 EXPECT_EQ(OK, result.error()); | 437 ASSERT_TRUE(result.HasValidPath()); |
| 442 | 438 |
| 443 // The result path should be A(B) <- B(C) <- C(D) <- D(D) | 439 // The result path should be A(B) <- B(C) <- C(D) <- D(D) |
| 444 ASSERT_FALSE(result.paths.empty()); | 440 const auto& path = result.GetBestValidPath()->path; |
| 445 const auto& path = result.paths[result.best_result_index]->path; | |
| 446 ASSERT_EQ(3U, path.certs.size()); | 441 ASSERT_EQ(3U, path.certs.size()); |
| 447 EXPECT_EQ(a_by_b_, path.certs[0]); | 442 EXPECT_EQ(a_by_b_, path.certs[0]); |
| 448 EXPECT_EQ(b_by_c_, path.certs[1]); | 443 EXPECT_EQ(b_by_c_, path.certs[1]); |
| 449 EXPECT_EQ(c_by_d_, path.certs[2]); | 444 EXPECT_EQ(c_by_d_, path.certs[2]); |
| 450 EXPECT_EQ(d_by_d_, path.trust_anchor->cert()); | 445 EXPECT_EQ(d_by_d_, path.trust_anchor->cert()); |
| 451 } | 446 } |
| 452 | 447 |
| 453 // Test that whichever order CertIssuerSource returns the issuers, the path | 448 // Test that whichever order CertIssuerSource returns the issuers, the path |
| 454 // building still succeeds. | 449 // building still succeeds. |
| 455 TEST_F(PathBuilderMultiRootTest, TestCertIssuerOrdering) { | 450 TEST_F(PathBuilderMultiRootTest, TestCertIssuerOrdering) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 470 sync_certs.AddCert(cert); | 465 sync_certs.AddCert(cert); |
| 471 } | 466 } |
| 472 | 467 |
| 473 CertPathBuilder::Result result; | 468 CertPathBuilder::Result result; |
| 474 CertPathBuilder path_builder(a_by_b_, &trust_store, &signature_policy_, | 469 CertPathBuilder path_builder(a_by_b_, &trust_store, &signature_policy_, |
| 475 time_, &result); | 470 time_, &result); |
| 476 path_builder.AddCertIssuerSource(&sync_certs); | 471 path_builder.AddCertIssuerSource(&sync_certs); |
| 477 | 472 |
| 478 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); | 473 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); |
| 479 | 474 |
| 480 EXPECT_EQ(OK, result.error()); | 475 ASSERT_TRUE(result.HasValidPath()); |
| 481 | 476 |
| 482 // The result path should be A(B) <- B(C) <- C(D) <- D(D) | 477 // The result path should be A(B) <- B(C) <- C(D) <- D(D) |
| 483 ASSERT_FALSE(result.paths.empty()); | 478 const auto& path = result.GetBestValidPath()->path; |
| 484 const auto& path = result.paths[result.best_result_index]->path; | |
| 485 ASSERT_EQ(3U, path.certs.size()); | 479 ASSERT_EQ(3U, path.certs.size()); |
| 486 EXPECT_EQ(a_by_b_, path.certs[0]); | 480 EXPECT_EQ(a_by_b_, path.certs[0]); |
| 487 EXPECT_EQ(b_by_c_, path.certs[1]); | 481 EXPECT_EQ(b_by_c_, path.certs[1]); |
| 488 EXPECT_EQ(c_by_d_, path.certs[2]); | 482 EXPECT_EQ(c_by_d_, path.certs[2]); |
| 489 EXPECT_EQ(d_by_d_, path.trust_anchor->cert()); | 483 EXPECT_EQ(d_by_d_, path.trust_anchor->cert()); |
| 490 } | 484 } |
| 491 } | 485 } |
| 492 | 486 |
| 493 class PathBuilderKeyRolloverTest : public ::testing::Test { | 487 class PathBuilderKeyRolloverTest : public ::testing::Test { |
| 494 public: | 488 public: |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 554 sync_certs.AddCert(newintermediate_); | 548 sync_certs.AddCert(newintermediate_); |
| 555 sync_certs.AddCert(newrootrollover_); | 549 sync_certs.AddCert(newrootrollover_); |
| 556 | 550 |
| 557 CertPathBuilder::Result result; | 551 CertPathBuilder::Result result; |
| 558 CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_, | 552 CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_, |
| 559 &result); | 553 &result); |
| 560 path_builder.AddCertIssuerSource(&sync_certs); | 554 path_builder.AddCertIssuerSource(&sync_certs); |
| 561 | 555 |
| 562 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); | 556 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); |
| 563 | 557 |
| 564 EXPECT_EQ(OK, result.error()); | 558 EXPECT_TRUE(result.HasValidPath()); |
| 565 | 559 |
| 566 // Path builder will first attempt: target <- newintermediate <- oldroot | 560 // Path builder will first attempt: target <- newintermediate <- oldroot |
| 567 // but it will fail since newintermediate is signed by newroot. | 561 // but it will fail since newintermediate is signed by newroot. |
| 568 ASSERT_EQ(2U, result.paths.size()); | 562 ASSERT_EQ(2U, result.paths.size()); |
| 569 const auto& path0 = result.paths[0]->path; | 563 const auto& path0 = result.paths[0]->path; |
| 570 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, result.paths[0]->error); | 564 EXPECT_FALSE(result.paths[0]->valid); |
| 571 ASSERT_EQ(2U, path0.certs.size()); | 565 ASSERT_EQ(2U, path0.certs.size()); |
| 572 EXPECT_EQ(target_, path0.certs[0]); | 566 EXPECT_EQ(target_, path0.certs[0]); |
| 573 EXPECT_EQ(newintermediate_, path0.certs[1]); | 567 EXPECT_EQ(newintermediate_, path0.certs[1]); |
| 574 EXPECT_EQ(oldroot_, path0.trust_anchor); | 568 EXPECT_EQ(oldroot_, path0.trust_anchor); |
| 575 | 569 |
| 576 // Path builder will next attempt: | 570 // Path builder will next attempt: |
| 577 // target <- newintermediate <- newrootrollover <- oldroot | 571 // target <- newintermediate <- newrootrollover <- oldroot |
| 578 // which will succeed. | 572 // which will succeed. |
| 579 const auto& path1 = result.paths[1]->path; | 573 const auto& path1 = result.paths[1]->path; |
| 580 EXPECT_EQ(1U, result.best_result_index); | 574 EXPECT_EQ(1U, result.best_result_index); |
| 581 EXPECT_EQ(OK, result.paths[1]->error); | 575 EXPECT_TRUE(result.paths[1]->valid); |
| 582 ASSERT_EQ(3U, path1.certs.size()); | 576 ASSERT_EQ(3U, path1.certs.size()); |
| 583 EXPECT_EQ(target_, path1.certs[0]); | 577 EXPECT_EQ(target_, path1.certs[0]); |
| 584 EXPECT_EQ(newintermediate_, path1.certs[1]); | 578 EXPECT_EQ(newintermediate_, path1.certs[1]); |
| 585 EXPECT_EQ(newrootrollover_, path1.certs[2]); | 579 EXPECT_EQ(newrootrollover_, path1.certs[2]); |
| 586 EXPECT_EQ(oldroot_, path1.trust_anchor); | 580 EXPECT_EQ(oldroot_, path1.trust_anchor); |
| 587 } | 581 } |
| 588 | 582 |
| 589 // Tests that if both old and new roots are trusted it can build a path through | 583 // Tests that if both old and new roots are trusted it can build a path through |
| 590 // either. | 584 // either. |
| 591 // TODO(mattm): Once prioritization is implemented, it should test that it | 585 // TODO(mattm): Once prioritization is implemented, it should test that it |
| (...skipping 10 matching lines...) Expand all Loading... |
| 602 sync_certs.AddCert(newintermediate_); | 596 sync_certs.AddCert(newintermediate_); |
| 603 sync_certs.AddCert(newrootrollover_); | 597 sync_certs.AddCert(newrootrollover_); |
| 604 | 598 |
| 605 CertPathBuilder::Result result; | 599 CertPathBuilder::Result result; |
| 606 CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_, | 600 CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_, |
| 607 &result); | 601 &result); |
| 608 path_builder.AddCertIssuerSource(&sync_certs); | 602 path_builder.AddCertIssuerSource(&sync_certs); |
| 609 | 603 |
| 610 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); | 604 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); |
| 611 | 605 |
| 612 EXPECT_EQ(OK, result.error()); | 606 EXPECT_TRUE(result.HasValidPath()); |
| 613 | 607 |
| 614 // Path builder willattempt one of: | 608 // Path builder willattempt one of: |
| 615 // target <- oldintermediate <- oldroot | 609 // target <- oldintermediate <- oldroot |
| 616 // target <- newintermediate <- newroot | 610 // target <- newintermediate <- newroot |
| 617 // either will succeed. | 611 // either will succeed. |
| 618 ASSERT_EQ(1U, result.paths.size()); | 612 ASSERT_EQ(1U, result.paths.size()); |
| 619 const auto& path = result.paths[0]->path; | 613 const auto& path = result.paths[0]->path; |
| 620 EXPECT_EQ(OK, result.paths[0]->error); | 614 EXPECT_TRUE(result.paths[0]->valid); |
| 621 ASSERT_EQ(2U, path.certs.size()); | 615 ASSERT_EQ(2U, path.certs.size()); |
| 622 EXPECT_EQ(target_, path.certs[0]); | 616 EXPECT_EQ(target_, path.certs[0]); |
| 623 if (path.certs[1] != newintermediate_) { | 617 if (path.certs[1] != newintermediate_) { |
| 624 DVLOG(1) << "USED OLD"; | 618 DVLOG(1) << "USED OLD"; |
| 625 EXPECT_EQ(oldintermediate_, path.certs[1]); | 619 EXPECT_EQ(oldintermediate_, path.certs[1]); |
| 626 EXPECT_EQ(oldroot_, path.trust_anchor); | 620 EXPECT_EQ(oldroot_, path.trust_anchor); |
| 627 } else { | 621 } else { |
| 628 DVLOG(1) << "USED NEW"; | 622 DVLOG(1) << "USED NEW"; |
| 629 EXPECT_EQ(newintermediate_, path.certs[1]); | 623 EXPECT_EQ(newintermediate_, path.certs[1]); |
| 630 EXPECT_EQ(newroot_, path.trust_anchor->cert()); | 624 EXPECT_EQ(newroot_, path.trust_anchor->cert()); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 642 TrustAnchor::CreateFromCertificateNoConstraints(oldintermediate_)); | 636 TrustAnchor::CreateFromCertificateNoConstraints(oldintermediate_)); |
| 643 trust_store.AddAsyncTrustAnchor( | 637 trust_store.AddAsyncTrustAnchor( |
| 644 TrustAnchor::CreateFromCertificateNoConstraints(newintermediate_)); | 638 TrustAnchor::CreateFromCertificateNoConstraints(newintermediate_)); |
| 645 | 639 |
| 646 CertPathBuilder::Result result; | 640 CertPathBuilder::Result result; |
| 647 CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_, | 641 CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_, |
| 648 &result); | 642 &result); |
| 649 | 643 |
| 650 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); | 644 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); |
| 651 | 645 |
| 652 EXPECT_EQ(OK, result.error()); | 646 EXPECT_TRUE(result.HasValidPath()); |
| 653 | 647 |
| 654 ASSERT_EQ(1U, result.paths.size()); | 648 ASSERT_EQ(1U, result.paths.size()); |
| 655 const auto& path = result.paths[0]->path; | 649 const auto& path = result.paths[0]->path; |
| 656 EXPECT_EQ(OK, result.paths[0]->error); | 650 EXPECT_TRUE(result.paths[0]->valid); |
| 657 ASSERT_EQ(1U, path.certs.size()); | 651 ASSERT_EQ(1U, path.certs.size()); |
| 658 EXPECT_EQ(target_, path.certs[0]); | 652 EXPECT_EQ(target_, path.certs[0]); |
| 659 EXPECT_EQ(oldintermediate_, path.trust_anchor->cert()); | 653 EXPECT_EQ(oldintermediate_, path.trust_anchor->cert()); |
| 660 } | 654 } |
| 661 | 655 |
| 662 // Async trust anchor checks should be done before synchronous issuer checks are | 656 // Async trust anchor checks should be done before synchronous issuer checks are |
| 663 // considered. (Avoiding creating unnecessarily long paths.) | 657 // considered. (Avoiding creating unnecessarily long paths.) |
| 664 // | 658 // |
| 665 // Two valid paths could be built: | 659 // Two valid paths could be built: |
| 666 // newintermediate <- newrootrollover <- oldroot | 660 // newintermediate <- newrootrollover <- oldroot |
| (...skipping 15 matching lines...) Expand all Loading... |
| 682 CertIssuerSourceStatic sync_certs; | 676 CertIssuerSourceStatic sync_certs; |
| 683 sync_certs.AddCert(newrootrollover_); | 677 sync_certs.AddCert(newrootrollover_); |
| 684 | 678 |
| 685 CertPathBuilder::Result result; | 679 CertPathBuilder::Result result; |
| 686 CertPathBuilder path_builder(newintermediate_, &trust_store, | 680 CertPathBuilder path_builder(newintermediate_, &trust_store, |
| 687 &signature_policy_, time_, &result); | 681 &signature_policy_, time_, &result); |
| 688 path_builder.AddCertIssuerSource(&sync_certs); | 682 path_builder.AddCertIssuerSource(&sync_certs); |
| 689 | 683 |
| 690 EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder)); | 684 EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder)); |
| 691 | 685 |
| 692 EXPECT_EQ(OK, result.error()); | 686 EXPECT_TRUE(result.HasValidPath()); |
| 693 | 687 |
| 694 ASSERT_EQ(2U, result.paths.size()); | 688 ASSERT_EQ(2U, result.paths.size()); |
| 695 { | 689 { |
| 696 const auto& path = result.paths[0]->path; | 690 const auto& path = result.paths[0]->path; |
| 697 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, result.paths[0]->error); | 691 EXPECT_FALSE(result.paths[0]->valid); |
| 698 ASSERT_EQ(1U, path.certs.size()); | 692 ASSERT_EQ(1U, path.certs.size()); |
| 699 EXPECT_EQ(newintermediate_, path.certs[0]); | 693 EXPECT_EQ(newintermediate_, path.certs[0]); |
| 700 EXPECT_EQ(oldroot_, path.trust_anchor); | 694 EXPECT_EQ(oldroot_, path.trust_anchor); |
| 701 } | 695 } |
| 702 { | 696 { |
| 703 const auto& path = result.paths[1]->path; | 697 const auto& path = result.paths[1]->path; |
| 704 EXPECT_EQ(OK, result.paths[1]->error); | 698 EXPECT_TRUE(result.paths[1]->valid); |
| 705 ASSERT_EQ(1U, path.certs.size()); | 699 ASSERT_EQ(1U, path.certs.size()); |
| 706 EXPECT_EQ(newintermediate_, path.certs[0]); | 700 EXPECT_EQ(newintermediate_, path.certs[0]); |
| 707 EXPECT_EQ(newroot_, path.trust_anchor->cert()); | 701 EXPECT_EQ(newroot_, path.trust_anchor->cert()); |
| 708 } | 702 } |
| 709 } | 703 } |
| 710 | 704 |
| 711 // If async trust anchor query returned no results, and there are no issuer | 705 // If async trust anchor query returned no results, and there are no issuer |
| 712 // sources, path building should fail at that point. | 706 // sources, path building should fail at that point. |
| 713 TEST_F(PathBuilderKeyRolloverTest, TestAsyncAnchorsNoMatchAndNoIssuerSources) { | 707 TEST_F(PathBuilderKeyRolloverTest, TestAsyncAnchorsNoMatchAndNoIssuerSources) { |
| 714 TrustStoreInMemoryAsync trust_store; | 708 TrustStoreInMemoryAsync trust_store; |
| 715 trust_store.AddAsyncTrustAnchor( | 709 trust_store.AddAsyncTrustAnchor( |
| 716 TrustAnchor::CreateFromCertificateNoConstraints(newroot_)); | 710 TrustAnchor::CreateFromCertificateNoConstraints(newroot_)); |
| 717 | 711 |
| 718 CertPathBuilder::Result result; | 712 CertPathBuilder::Result result; |
| 719 CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_, | 713 CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_, |
| 720 &result); | 714 &result); |
| 721 | 715 |
| 722 EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder)); | 716 EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder)); |
| 723 | 717 |
| 724 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, result.error()); | 718 EXPECT_FALSE(result.HasValidPath()); |
| 725 | 719 |
| 726 ASSERT_EQ(0U, result.paths.size()); | 720 ASSERT_EQ(0U, result.paths.size()); |
| 727 } | 721 } |
| 728 | 722 |
| 729 // Both trust store and issuer source are async. Should successfully build a | 723 // Both trust store and issuer source are async. Should successfully build a |
| 730 // path. | 724 // path. |
| 731 TEST_F(PathBuilderKeyRolloverTest, TestAsyncAnchorsAndAsyncIssuers) { | 725 TEST_F(PathBuilderKeyRolloverTest, TestAsyncAnchorsAndAsyncIssuers) { |
| 732 TrustStoreInMemoryAsync trust_store; | 726 TrustStoreInMemoryAsync trust_store; |
| 733 trust_store.AddAsyncTrustAnchor( | 727 trust_store.AddAsyncTrustAnchor( |
| 734 TrustAnchor::CreateFromCertificateNoConstraints(newroot_)); | 728 TrustAnchor::CreateFromCertificateNoConstraints(newroot_)); |
| 735 | 729 |
| 736 AsyncCertIssuerSourceStatic async_certs; | 730 AsyncCertIssuerSourceStatic async_certs; |
| 737 async_certs.AddCert(newintermediate_); | 731 async_certs.AddCert(newintermediate_); |
| 738 | 732 |
| 739 CertPathBuilder::Result result; | 733 CertPathBuilder::Result result; |
| 740 CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_, | 734 CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_, |
| 741 &result); | 735 &result); |
| 742 path_builder.AddCertIssuerSource(&async_certs); | 736 path_builder.AddCertIssuerSource(&async_certs); |
| 743 | 737 |
| 744 EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder)); | 738 EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder)); |
| 745 | 739 |
| 746 EXPECT_EQ(OK, result.error()); | 740 EXPECT_TRUE(result.HasValidPath()); |
| 747 | 741 |
| 748 ASSERT_EQ(1U, result.paths.size()); | 742 ASSERT_EQ(1U, result.paths.size()); |
| 749 const auto& path = result.paths[0]->path; | 743 const auto& path = result.paths[0]->path; |
| 750 EXPECT_EQ(OK, result.paths[0]->error); | 744 EXPECT_TRUE(result.paths[0]->valid); |
| 751 ASSERT_EQ(2U, path.certs.size()); | 745 ASSERT_EQ(2U, path.certs.size()); |
| 752 EXPECT_EQ(target_, path.certs[0]); | 746 EXPECT_EQ(target_, path.certs[0]); |
| 753 EXPECT_EQ(newintermediate_, path.certs[1]); | 747 EXPECT_EQ(newintermediate_, path.certs[1]); |
| 754 EXPECT_EQ(newroot_, path.trust_anchor->cert()); | 748 EXPECT_EQ(newroot_, path.trust_anchor->cert()); |
| 755 } | 749 } |
| 756 | 750 |
| 757 // Tests that multiple trust root matches on a single path will be considered. | 751 // Tests that multiple trust root matches on a single path will be considered. |
| 758 // Both roots have the same subject but different keys. Only one of them will | 752 // Both roots have the same subject but different keys. Only one of them will |
| 759 // verify. | 753 // verify. |
| 760 TEST_F(PathBuilderKeyRolloverTest, TestMultipleRootMatchesOnlyOneWorks) { | 754 TEST_F(PathBuilderKeyRolloverTest, TestMultipleRootMatchesOnlyOneWorks) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 772 CertIssuerSourceStatic sync_certs; | 766 CertIssuerSourceStatic sync_certs; |
| 773 sync_certs.AddCert(oldintermediate_); | 767 sync_certs.AddCert(oldintermediate_); |
| 774 | 768 |
| 775 CertPathBuilder::Result result; | 769 CertPathBuilder::Result result; |
| 776 CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_, | 770 CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_, |
| 777 &result); | 771 &result); |
| 778 path_builder.AddCertIssuerSource(&sync_certs); | 772 path_builder.AddCertIssuerSource(&sync_certs); |
| 779 | 773 |
| 780 EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder)); | 774 EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder)); |
| 781 | 775 |
| 782 EXPECT_EQ(OK, result.error()); | 776 EXPECT_TRUE(result.HasValidPath()); |
| 783 ASSERT_EQ(2U, result.paths.size()); | 777 ASSERT_EQ(2U, result.paths.size()); |
| 784 | 778 |
| 785 { | 779 { |
| 786 // Path builder may first attempt: target <- oldintermediate <- newroot | 780 // Path builder may first attempt: target <- oldintermediate <- newroot |
| 787 // but it will fail since oldintermediate is signed by oldroot. | 781 // but it will fail since oldintermediate is signed by oldroot. |
| 788 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, result.paths[0]->error); | 782 EXPECT_FALSE(result.paths[0]->valid); |
| 789 const auto& path = result.paths[0]->path; | 783 const auto& path = result.paths[0]->path; |
| 790 ASSERT_EQ(2U, path.certs.size()); | 784 ASSERT_EQ(2U, path.certs.size()); |
| 791 EXPECT_EQ(target_, path.certs[0]); | 785 EXPECT_EQ(target_, path.certs[0]); |
| 792 EXPECT_EQ(oldintermediate_, path.certs[1]); | 786 EXPECT_EQ(oldintermediate_, path.certs[1]); |
| 793 EXPECT_EQ(newroot_, path.trust_anchor->cert()); | 787 EXPECT_EQ(newroot_, path.trust_anchor->cert()); |
| 794 } | 788 } |
| 795 | 789 |
| 796 { | 790 { |
| 797 // Path builder will next attempt: | 791 // Path builder will next attempt: |
| 798 // target <- old intermediate <- oldroot | 792 // target <- old intermediate <- oldroot |
| 799 // which should succeed. | 793 // which should succeed. |
| 800 EXPECT_EQ(OK, result.paths[result.best_result_index]->error); | 794 EXPECT_TRUE(result.paths[result.best_result_index]->valid); |
| 801 const auto& path = result.paths[result.best_result_index]->path; | 795 const auto& path = result.paths[result.best_result_index]->path; |
| 802 ASSERT_EQ(2U, path.certs.size()); | 796 ASSERT_EQ(2U, path.certs.size()); |
| 803 EXPECT_EQ(target_, path.certs[0]); | 797 EXPECT_EQ(target_, path.certs[0]); |
| 804 EXPECT_EQ(oldintermediate_, path.certs[1]); | 798 EXPECT_EQ(oldintermediate_, path.certs[1]); |
| 805 EXPECT_EQ(oldroot_, path.trust_anchor); | 799 EXPECT_EQ(oldroot_, path.trust_anchor); |
| 806 } | 800 } |
| 807 } | 801 } |
| 808 | 802 |
| 809 // Tests that the path builder doesn't build longer than necessary paths. | 803 // Tests that the path builder doesn't build longer than necessary paths. |
| 810 TEST_F(PathBuilderKeyRolloverTest, TestRolloverLongChain) { | 804 TEST_F(PathBuilderKeyRolloverTest, TestRolloverLongChain) { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 823 async_certs.AddCert(newrootrollover_); | 817 async_certs.AddCert(newrootrollover_); |
| 824 | 818 |
| 825 CertPathBuilder::Result result; | 819 CertPathBuilder::Result result; |
| 826 CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_, | 820 CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_, |
| 827 &result); | 821 &result); |
| 828 path_builder.AddCertIssuerSource(&sync_certs); | 822 path_builder.AddCertIssuerSource(&sync_certs); |
| 829 path_builder.AddCertIssuerSource(&async_certs); | 823 path_builder.AddCertIssuerSource(&async_certs); |
| 830 | 824 |
| 831 EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder)); | 825 EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder)); |
| 832 | 826 |
| 833 EXPECT_EQ(OK, result.error()); | 827 EXPECT_TRUE(result.HasValidPath()); |
| 834 ASSERT_EQ(3U, result.paths.size()); | 828 ASSERT_EQ(3U, result.paths.size()); |
| 835 | 829 |
| 836 // Path builder will first attempt: target <- newintermediate <- oldroot | 830 // Path builder will first attempt: target <- newintermediate <- oldroot |
| 837 // but it will fail since newintermediate is signed by newroot. | 831 // but it will fail since newintermediate is signed by newroot. |
| 838 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, result.paths[0]->error); | 832 EXPECT_FALSE(result.paths[0]->valid); |
| 839 const auto& path0 = result.paths[0]->path; | 833 const auto& path0 = result.paths[0]->path; |
| 840 ASSERT_EQ(2U, path0.certs.size()); | 834 ASSERT_EQ(2U, path0.certs.size()); |
| 841 EXPECT_EQ(target_, path0.certs[0]); | 835 EXPECT_EQ(target_, path0.certs[0]); |
| 842 EXPECT_EQ(newintermediate_, path0.certs[1]); | 836 EXPECT_EQ(newintermediate_, path0.certs[1]); |
| 843 EXPECT_EQ(oldroot_, path0.trust_anchor); | 837 EXPECT_EQ(oldroot_, path0.trust_anchor); |
| 844 | 838 |
| 845 // Path builder will next attempt: | 839 // Path builder will next attempt: |
| 846 // target <- newintermediate <- newroot <- oldroot | 840 // target <- newintermediate <- newroot <- oldroot |
| 847 // but it will fail since newroot is self-signed. | 841 // but it will fail since newroot is self-signed. |
| 848 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, result.paths[1]->error); | 842 EXPECT_FALSE(result.paths[1]->valid); |
| 849 const auto& path1 = result.paths[1]->path; | 843 const auto& path1 = result.paths[1]->path; |
| 850 ASSERT_EQ(3U, path1.certs.size()); | 844 ASSERT_EQ(3U, path1.certs.size()); |
| 851 EXPECT_EQ(target_, path1.certs[0]); | 845 EXPECT_EQ(target_, path1.certs[0]); |
| 852 EXPECT_EQ(newintermediate_, path1.certs[1]); | 846 EXPECT_EQ(newintermediate_, path1.certs[1]); |
| 853 EXPECT_EQ(newroot_, path1.certs[2]); | 847 EXPECT_EQ(newroot_, path1.certs[2]); |
| 854 EXPECT_EQ(oldroot_, path1.trust_anchor); | 848 EXPECT_EQ(oldroot_, path1.trust_anchor); |
| 855 | 849 |
| 856 // Path builder will skip: | 850 // Path builder will skip: |
| 857 // target <- newintermediate <- newroot <- newrootrollover <- ... | 851 // target <- newintermediate <- newroot <- newrootrollover <- ... |
| 858 // Since newroot and newrootrollover have the same Name+SAN+SPKI. | 852 // Since newroot and newrootrollover have the same Name+SAN+SPKI. |
| 859 | 853 |
| 860 // Finally path builder will use: | 854 // Finally path builder will use: |
| 861 // target <- newintermediate <- newrootrollover <- oldroot | 855 // target <- newintermediate <- newrootrollover <- oldroot |
| 862 EXPECT_EQ(2U, result.best_result_index); | 856 EXPECT_EQ(2U, result.best_result_index); |
| 863 EXPECT_EQ(OK, result.paths[2]->error); | 857 EXPECT_TRUE(result.paths[2]->valid); |
| 864 const auto& path2 = result.paths[2]->path; | 858 const auto& path2 = result.paths[2]->path; |
| 865 ASSERT_EQ(3U, path2.certs.size()); | 859 ASSERT_EQ(3U, path2.certs.size()); |
| 866 EXPECT_EQ(target_, path2.certs[0]); | 860 EXPECT_EQ(target_, path2.certs[0]); |
| 867 EXPECT_EQ(newintermediate_, path2.certs[1]); | 861 EXPECT_EQ(newintermediate_, path2.certs[1]); |
| 868 EXPECT_EQ(newrootrollover_, path2.certs[2]); | 862 EXPECT_EQ(newrootrollover_, path2.certs[2]); |
| 869 EXPECT_EQ(oldroot_, path2.trust_anchor); | 863 EXPECT_EQ(oldroot_, path2.trust_anchor); |
| 870 } | 864 } |
| 871 | 865 |
| 872 // If the target cert is a trust anchor, however is not itself *signed* by a | 866 // If the target cert is a trust anchor, however is not itself *signed* by a |
| 873 // trust anchor, then it is not considered valid (the SPKI and name of the | 867 // trust anchor, then it is not considered valid (the SPKI and name of the |
| 874 // trust anchor matches the SPKI and subject of the targe certificate, but the | 868 // trust anchor matches the SPKI and subject of the targe certificate, but the |
| 875 // rest of the certificate cannot be verified). | 869 // rest of the certificate cannot be verified). |
| 876 TEST_F(PathBuilderKeyRolloverTest, TestEndEntityIsTrustRoot) { | 870 TEST_F(PathBuilderKeyRolloverTest, TestEndEntityIsTrustRoot) { |
| 877 // Trust newintermediate. | 871 // Trust newintermediate. |
| 878 TrustStoreInMemory trust_store; | 872 TrustStoreInMemory trust_store; |
| 879 AddTrustedCertificate(newintermediate_, &trust_store); | 873 AddTrustedCertificate(newintermediate_, &trust_store); |
| 880 | 874 |
| 881 CertPathBuilder::Result result; | 875 CertPathBuilder::Result result; |
| 882 // Newintermediate is also the target cert. | 876 // Newintermediate is also the target cert. |
| 883 CertPathBuilder path_builder(newintermediate_, &trust_store, | 877 CertPathBuilder path_builder(newintermediate_, &trust_store, |
| 884 &signature_policy_, time_, &result); | 878 &signature_policy_, time_, &result); |
| 885 | 879 |
| 886 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); | 880 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); |
| 887 | 881 |
| 888 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, result.error()); | 882 EXPECT_FALSE(result.HasValidPath()); |
| 889 } | 883 } |
| 890 | 884 |
| 891 // If target has same Name+SAN+SPKI as a necessary intermediate, test if a path | 885 // If target has same Name+SAN+SPKI as a necessary intermediate, test if a path |
| 892 // can still be built. | 886 // can still be built. |
| 893 // Since LoopChecker will prevent the intermediate from being included, this | 887 // Since LoopChecker will prevent the intermediate from being included, this |
| 894 // currently does NOT verify. This case shouldn't occur in the web PKI. | 888 // currently does NOT verify. This case shouldn't occur in the web PKI. |
| 895 TEST_F(PathBuilderKeyRolloverTest, | 889 TEST_F(PathBuilderKeyRolloverTest, |
| 896 TestEndEntityHasSameNameAndSpkiAsIntermediate) { | 890 TestEndEntityHasSameNameAndSpkiAsIntermediate) { |
| 897 // Trust oldroot. | 891 // Trust oldroot. |
| 898 TrustStoreInMemory trust_store; | 892 TrustStoreInMemory trust_store; |
| 899 trust_store.AddTrustAnchor(oldroot_); | 893 trust_store.AddTrustAnchor(oldroot_); |
| 900 | 894 |
| 901 // New root rollover is provided synchronously. | 895 // New root rollover is provided synchronously. |
| 902 CertIssuerSourceStatic sync_certs; | 896 CertIssuerSourceStatic sync_certs; |
| 903 sync_certs.AddCert(newrootrollover_); | 897 sync_certs.AddCert(newrootrollover_); |
| 904 | 898 |
| 905 CertPathBuilder::Result result; | 899 CertPathBuilder::Result result; |
| 906 // Newroot is the target cert. | 900 // Newroot is the target cert. |
| 907 CertPathBuilder path_builder(newroot_, &trust_store, &signature_policy_, | 901 CertPathBuilder path_builder(newroot_, &trust_store, &signature_policy_, |
| 908 time_, &result); | 902 time_, &result); |
| 909 path_builder.AddCertIssuerSource(&sync_certs); | 903 path_builder.AddCertIssuerSource(&sync_certs); |
| 910 | 904 |
| 911 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); | 905 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); |
| 912 | 906 |
| 913 // This could actually be OK, but CertPathBuilder does not build the | 907 // This could actually be OK, but CertPathBuilder does not build the |
| 914 // newroot <- newrootrollover <- oldroot path. | 908 // newroot <- newrootrollover <- oldroot path. |
| 915 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, result.error()); | 909 EXPECT_FALSE(result.HasValidPath()); |
| 916 } | 910 } |
| 917 | 911 |
| 918 // If target has same Name+SAN+SPKI as the trust root, test that a (trivial) | 912 // If target has same Name+SAN+SPKI as the trust root, test that a (trivial) |
| 919 // path can still be built. | 913 // path can still be built. |
| 920 TEST_F(PathBuilderKeyRolloverTest, | 914 TEST_F(PathBuilderKeyRolloverTest, |
| 921 TestEndEntityHasSameNameAndSpkiAsTrustAnchor) { | 915 TestEndEntityHasSameNameAndSpkiAsTrustAnchor) { |
| 922 // Trust newrootrollover. | 916 // Trust newrootrollover. |
| 923 TrustStoreInMemory trust_store; | 917 TrustStoreInMemory trust_store; |
| 924 AddTrustedCertificate(newrootrollover_, &trust_store); | 918 AddTrustedCertificate(newrootrollover_, &trust_store); |
| 925 | 919 |
| 926 CertPathBuilder::Result result; | 920 CertPathBuilder::Result result; |
| 927 // Newroot is the target cert. | 921 // Newroot is the target cert. |
| 928 CertPathBuilder path_builder(newroot_, &trust_store, &signature_policy_, | 922 CertPathBuilder path_builder(newroot_, &trust_store, &signature_policy_, |
| 929 time_, &result); | 923 time_, &result); |
| 930 | 924 |
| 931 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); | 925 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); |
| 932 | 926 |
| 933 EXPECT_EQ(OK, result.error()); | 927 ASSERT_TRUE(result.HasValidPath()); |
| 934 | 928 |
| 935 ASSERT_FALSE(result.paths.empty()); | 929 const CertPathBuilder::ResultPath* best_result = result.GetBestValidPath(); |
| 936 const CertPathBuilder::ResultPath* best_result = | |
| 937 result.paths[result.best_result_index].get(); | |
| 938 | 930 |
| 939 // Newroot has same name+SPKI as newrootrollover, thus the path is valid and | 931 // Newroot has same name+SPKI as newrootrollover, thus the path is valid and |
| 940 // only contains newroot. | 932 // only contains newroot. |
| 941 EXPECT_EQ(OK, best_result->error); | 933 EXPECT_TRUE(best_result->valid); |
| 942 ASSERT_EQ(1U, best_result->path.certs.size()); | 934 ASSERT_EQ(1U, best_result->path.certs.size()); |
| 943 EXPECT_EQ(newroot_, best_result->path.certs[0]); | 935 EXPECT_EQ(newroot_, best_result->path.certs[0]); |
| 944 EXPECT_EQ(newrootrollover_, best_result->path.trust_anchor->cert()); | 936 EXPECT_EQ(newrootrollover_, best_result->path.trust_anchor->cert()); |
| 945 } | 937 } |
| 946 | 938 |
| 947 // Test that PathBuilder will not try the same path twice if multiple | 939 // Test that PathBuilder will not try the same path twice if multiple |
| 948 // CertIssuerSources provide the same certificate. | 940 // CertIssuerSources provide the same certificate. |
| 949 TEST_F(PathBuilderKeyRolloverTest, TestDuplicateIntermediates) { | 941 TEST_F(PathBuilderKeyRolloverTest, TestDuplicateIntermediates) { |
| 950 // Create a separate copy of oldintermediate. | 942 // Create a separate copy of oldintermediate. |
| 951 scoped_refptr<ParsedCertificate> oldintermediate_dupe( | 943 scoped_refptr<ParsedCertificate> oldintermediate_dupe( |
| (...skipping 21 matching lines...) Expand all Loading... |
| 973 | 965 |
| 974 CertPathBuilder::Result result; | 966 CertPathBuilder::Result result; |
| 975 CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_, | 967 CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_, |
| 976 &result); | 968 &result); |
| 977 path_builder.AddCertIssuerSource(&sync_certs1); | 969 path_builder.AddCertIssuerSource(&sync_certs1); |
| 978 path_builder.AddCertIssuerSource(&sync_certs2); | 970 path_builder.AddCertIssuerSource(&sync_certs2); |
| 979 path_builder.AddCertIssuerSource(&async_certs); | 971 path_builder.AddCertIssuerSource(&async_certs); |
| 980 | 972 |
| 981 EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder)); | 973 EXPECT_EQ(CompletionStatus::ASYNC, RunPathBuilder(&path_builder)); |
| 982 | 974 |
| 983 EXPECT_EQ(OK, result.error()); | 975 EXPECT_TRUE(result.HasValidPath()); |
| 984 ASSERT_EQ(2U, result.paths.size()); | 976 ASSERT_EQ(2U, result.paths.size()); |
| 985 | 977 |
| 986 // Path builder will first attempt: target <- oldintermediate <- newroot | 978 // Path builder will first attempt: target <- oldintermediate <- newroot |
| 987 // but it will fail since oldintermediate is signed by oldroot. | 979 // but it will fail since oldintermediate is signed by oldroot. |
| 988 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, result.paths[0]->error); | 980 EXPECT_FALSE(result.paths[0]->valid); |
| 989 const auto& path0 = result.paths[0]->path; | 981 const auto& path0 = result.paths[0]->path; |
| 990 | 982 |
| 991 ASSERT_EQ(2U, path0.certs.size()); | 983 ASSERT_EQ(2U, path0.certs.size()); |
| 992 EXPECT_EQ(target_, path0.certs[0]); | 984 EXPECT_EQ(target_, path0.certs[0]); |
| 993 // Compare the DER instead of ParsedCertificate pointer, don't care which copy | 985 // Compare the DER instead of ParsedCertificate pointer, don't care which copy |
| 994 // of oldintermediate was used in the path. | 986 // of oldintermediate was used in the path. |
| 995 EXPECT_EQ(oldintermediate_->der_cert(), path0.certs[1]->der_cert()); | 987 EXPECT_EQ(oldintermediate_->der_cert(), path0.certs[1]->der_cert()); |
| 996 EXPECT_EQ(newroot_, path0.trust_anchor->cert()); | 988 EXPECT_EQ(newroot_, path0.trust_anchor->cert()); |
| 997 | 989 |
| 998 // Path builder will next attempt: target <- newintermediate <- newroot | 990 // Path builder will next attempt: target <- newintermediate <- newroot |
| 999 // which will succeed. | 991 // which will succeed. |
| 1000 EXPECT_EQ(1U, result.best_result_index); | 992 EXPECT_EQ(1U, result.best_result_index); |
| 1001 EXPECT_EQ(OK, result.paths[1]->error); | 993 EXPECT_TRUE(result.paths[1]->valid); |
| 1002 const auto& path1 = result.paths[1]->path; | 994 const auto& path1 = result.paths[1]->path; |
| 1003 ASSERT_EQ(2U, path1.certs.size()); | 995 ASSERT_EQ(2U, path1.certs.size()); |
| 1004 EXPECT_EQ(target_, path1.certs[0]); | 996 EXPECT_EQ(target_, path1.certs[0]); |
| 1005 EXPECT_EQ(newintermediate_, path1.certs[1]); | 997 EXPECT_EQ(newintermediate_, path1.certs[1]); |
| 1006 EXPECT_EQ(newroot_, path1.trust_anchor->cert()); | 998 EXPECT_EQ(newroot_, path1.trust_anchor->cert()); |
| 1007 } | 999 } |
| 1008 | 1000 |
| 1009 // Test when PathBuilder is given a cert CertIssuerSources that has the same | 1001 // Test when PathBuilder is given a cert CertIssuerSources that has the same |
| 1010 // SPKI as a TrustAnchor. | 1002 // SPKI as a TrustAnchor. |
| 1011 TEST_F(PathBuilderKeyRolloverTest, TestDuplicateIntermediateAndRoot) { | 1003 TEST_F(PathBuilderKeyRolloverTest, TestDuplicateIntermediateAndRoot) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1023 sync_certs.AddCert(oldintermediate_); | 1015 sync_certs.AddCert(oldintermediate_); |
| 1024 sync_certs.AddCert(newroot_dupe); | 1016 sync_certs.AddCert(newroot_dupe); |
| 1025 | 1017 |
| 1026 CertPathBuilder::Result result; | 1018 CertPathBuilder::Result result; |
| 1027 CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_, | 1019 CertPathBuilder path_builder(target_, &trust_store, &signature_policy_, time_, |
| 1028 &result); | 1020 &result); |
| 1029 path_builder.AddCertIssuerSource(&sync_certs); | 1021 path_builder.AddCertIssuerSource(&sync_certs); |
| 1030 | 1022 |
| 1031 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); | 1023 EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder)); |
| 1032 | 1024 |
| 1033 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, result.error()); | 1025 EXPECT_FALSE(result.HasValidPath()); |
| 1034 ASSERT_EQ(2U, result.paths.size()); | 1026 ASSERT_EQ(2U, result.paths.size()); |
| 1035 // TODO(eroman): Is this right? | 1027 // TODO(eroman): Is this right? |
| 1036 | 1028 |
| 1037 // Path builder attempt: target <- oldintermediate <- newroot | 1029 // Path builder attempt: target <- oldintermediate <- newroot |
| 1038 // but it will fail since oldintermediate is signed by oldroot. | 1030 // but it will fail since oldintermediate is signed by oldroot. |
| 1039 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, result.paths[0]->error); | 1031 EXPECT_FALSE(result.paths[0]->valid); |
| 1040 const auto& path = result.paths[0]->path; | 1032 const auto& path = result.paths[0]->path; |
| 1041 ASSERT_EQ(2U, path.certs.size()); | 1033 ASSERT_EQ(2U, path.certs.size()); |
| 1042 EXPECT_EQ(target_, path.certs[0]); | 1034 EXPECT_EQ(target_, path.certs[0]); |
| 1043 EXPECT_EQ(oldintermediate_, path.certs[1]); | 1035 EXPECT_EQ(oldintermediate_, path.certs[1]); |
| 1044 // Compare the DER instead of ParsedCertificate pointer, don't care which copy | 1036 // Compare the DER instead of ParsedCertificate pointer, don't care which copy |
| 1045 // of newroot was used in the path. | 1037 // of newroot was used in the path. |
| 1046 EXPECT_EQ(newroot_->der_cert(), path.trust_anchor->cert()->der_cert()); | 1038 EXPECT_EQ(newroot_->der_cert(), path.trust_anchor->cert()->der_cert()); |
| 1047 } | 1039 } |
| 1048 | 1040 |
| 1049 class MockCertIssuerSourceRequest : public CertIssuerSource::Request { | 1041 class MockCertIssuerSourceRequest : public CertIssuerSource::Request { |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1150 EXPECT_CALL(cert_issuer_source, SyncGetIssuersOf(newintermediate_.get(), _)); | 1142 EXPECT_CALL(cert_issuer_source, SyncGetIssuersOf(newintermediate_.get(), _)); |
| 1151 target_issuers_callback.Run(target_issuers_req); | 1143 target_issuers_callback.Run(target_issuers_req); |
| 1152 // Note that VerifyAndClearExpectations(target_issuers_req) is not called | 1144 // Note that VerifyAndClearExpectations(target_issuers_req) is not called |
| 1153 // here. PathBuilder could have destroyed it already, so just let the | 1145 // here. PathBuilder could have destroyed it already, so just let the |
| 1154 // expectations get checked by the destructor. | 1146 // expectations get checked by the destructor. |
| 1155 ::testing::Mock::VerifyAndClearExpectations(&cert_issuer_source); | 1147 ::testing::Mock::VerifyAndClearExpectations(&cert_issuer_source); |
| 1156 | 1148 |
| 1157 // Ensure pathbuilder finished and filled result. | 1149 // Ensure pathbuilder finished and filled result. |
| 1158 callback.WaitForResult(); | 1150 callback.WaitForResult(); |
| 1159 | 1151 |
| 1160 EXPECT_EQ(OK, result.error()); | 1152 EXPECT_TRUE(result.HasValidPath()); |
| 1161 ASSERT_EQ(2U, result.paths.size()); | 1153 ASSERT_EQ(2U, result.paths.size()); |
| 1162 | 1154 |
| 1163 // Path builder first attempts: target <- oldintermediate <- newroot | 1155 // Path builder first attempts: target <- oldintermediate <- newroot |
| 1164 // but it will fail since oldintermediate is signed by oldroot. | 1156 // but it will fail since oldintermediate is signed by oldroot. |
| 1165 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, result.paths[0]->error); | 1157 EXPECT_FALSE(result.paths[0]->valid); |
| 1166 const auto& path0 = result.paths[0]->path; | 1158 const auto& path0 = result.paths[0]->path; |
| 1167 ASSERT_EQ(2U, path0.certs.size()); | 1159 ASSERT_EQ(2U, path0.certs.size()); |
| 1168 EXPECT_EQ(target_, path0.certs[0]); | 1160 EXPECT_EQ(target_, path0.certs[0]); |
| 1169 EXPECT_EQ(oldintermediate_, path0.certs[1]); | 1161 EXPECT_EQ(oldintermediate_, path0.certs[1]); |
| 1170 EXPECT_EQ(newroot_, path0.trust_anchor->cert()); | 1162 EXPECT_EQ(newroot_, path0.trust_anchor->cert()); |
| 1171 | 1163 |
| 1172 // After the second batch of async results, path builder will attempt: | 1164 // After the second batch of async results, path builder will attempt: |
| 1173 // target <- newintermediate <- newroot which will succeed. | 1165 // target <- newintermediate <- newroot which will succeed. |
| 1174 EXPECT_EQ(OK, result.paths[1]->error); | 1166 EXPECT_TRUE(result.paths[1]->valid); |
| 1175 const auto& path1 = result.paths[1]->path; | 1167 const auto& path1 = result.paths[1]->path; |
| 1176 ASSERT_EQ(2U, path1.certs.size()); | 1168 ASSERT_EQ(2U, path1.certs.size()); |
| 1177 EXPECT_EQ(target_, path1.certs[0]); | 1169 EXPECT_EQ(target_, path1.certs[0]); |
| 1178 EXPECT_EQ(newintermediate_, path1.certs[1]); | 1170 EXPECT_EQ(newintermediate_, path1.certs[1]); |
| 1179 EXPECT_EQ(newroot_, path1.trust_anchor->cert()); | 1171 EXPECT_EQ(newroot_, path1.trust_anchor->cert()); |
| 1180 } | 1172 } |
| 1181 | 1173 |
| 1182 // Test that PathBuilder will not try the same path twice if CertIssuerSources | 1174 // Test that PathBuilder will not try the same path twice if CertIssuerSources |
| 1183 // asynchronously provide the same certificate multiple times. | 1175 // asynchronously provide the same certificate multiple times. |
| 1184 TEST_F(PathBuilderKeyRolloverTest, TestDuplicateAsyncIntermediates) { | 1176 TEST_F(PathBuilderKeyRolloverTest, TestDuplicateAsyncIntermediates) { |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1265 EXPECT_CALL(cert_issuer_source, SyncGetIssuersOf(newintermediate_.get(), _)); | 1257 EXPECT_CALL(cert_issuer_source, SyncGetIssuersOf(newintermediate_.get(), _)); |
| 1266 target_issuers_callback.Run(target_issuers_req); | 1258 target_issuers_callback.Run(target_issuers_req); |
| 1267 // Note that VerifyAndClearExpectations(target_issuers_req) is not called | 1259 // Note that VerifyAndClearExpectations(target_issuers_req) is not called |
| 1268 // here. PathBuilder could have destroyed it already, so just let the | 1260 // here. PathBuilder could have destroyed it already, so just let the |
| 1269 // expectations get checked by the destructor. | 1261 // expectations get checked by the destructor. |
| 1270 ::testing::Mock::VerifyAndClearExpectations(&cert_issuer_source); | 1262 ::testing::Mock::VerifyAndClearExpectations(&cert_issuer_source); |
| 1271 | 1263 |
| 1272 // Ensure pathbuilder finished and filled result. | 1264 // Ensure pathbuilder finished and filled result. |
| 1273 callback.WaitForResult(); | 1265 callback.WaitForResult(); |
| 1274 | 1266 |
| 1275 EXPECT_EQ(OK, result.error()); | 1267 EXPECT_TRUE(result.HasValidPath()); |
| 1276 ASSERT_EQ(2U, result.paths.size()); | 1268 ASSERT_EQ(2U, result.paths.size()); |
| 1277 | 1269 |
| 1278 // Path builder first attempts: target <- oldintermediate <- newroot | 1270 // Path builder first attempts: target <- oldintermediate <- newroot |
| 1279 // but it will fail since oldintermediate is signed by oldroot. | 1271 // but it will fail since oldintermediate is signed by oldroot. |
| 1280 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, result.paths[0]->error); | 1272 EXPECT_FALSE(result.paths[0]->valid); |
| 1281 const auto& path0 = result.paths[0]->path; | 1273 const auto& path0 = result.paths[0]->path; |
| 1282 ASSERT_EQ(2U, path0.certs.size()); | 1274 ASSERT_EQ(2U, path0.certs.size()); |
| 1283 EXPECT_EQ(target_, path0.certs[0]); | 1275 EXPECT_EQ(target_, path0.certs[0]); |
| 1284 EXPECT_EQ(oldintermediate_, path0.certs[1]); | 1276 EXPECT_EQ(oldintermediate_, path0.certs[1]); |
| 1285 EXPECT_EQ(newroot_, path0.trust_anchor->cert()); | 1277 EXPECT_EQ(newroot_, path0.trust_anchor->cert()); |
| 1286 | 1278 |
| 1287 // The second async result does not generate any path. | 1279 // The second async result does not generate any path. |
| 1288 | 1280 |
| 1289 // After the third batch of async results, path builder will attempt: | 1281 // After the third batch of async results, path builder will attempt: |
| 1290 // target <- newintermediate <- newroot which will succeed. | 1282 // target <- newintermediate <- newroot which will succeed. |
| 1291 EXPECT_EQ(OK, result.paths[1]->error); | 1283 EXPECT_TRUE(result.paths[1]->valid); |
| 1292 const auto& path1 = result.paths[1]->path; | 1284 const auto& path1 = result.paths[1]->path; |
| 1293 ASSERT_EQ(2U, path1.certs.size()); | 1285 ASSERT_EQ(2U, path1.certs.size()); |
| 1294 EXPECT_EQ(target_, path1.certs[0]); | 1286 EXPECT_EQ(target_, path1.certs[0]); |
| 1295 EXPECT_EQ(newintermediate_, path1.certs[1]); | 1287 EXPECT_EQ(newintermediate_, path1.certs[1]); |
| 1296 EXPECT_EQ(newroot_, path1.trust_anchor->cert()); | 1288 EXPECT_EQ(newroot_, path1.trust_anchor->cert()); |
| 1297 } | 1289 } |
| 1298 | 1290 |
| 1299 } // namespace | 1291 } // namespace |
| 1300 | 1292 |
| 1301 } // namespace net | 1293 } // namespace net |
| OLD | NEW |