123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528 |
- // Copyright 2020 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "services/cert_verifier/cert_verifier_service_factory.h"
- #include <cstddef>
- #include <memory>
- #include <vector>
- #include "base/bind.h"
- #include "base/check_op.h"
- #include "base/memory/scoped_refptr.h"
- #include "base/run_loop.h"
- #include "base/test/bind.h"
- #include "base/test/task_environment.h"
- #include "base/time/time.h"
- #include "mojo/public/cpp/bindings/pending_receiver.h"
- #include "mojo/public/cpp/bindings/pending_remote.h"
- #include "mojo/public/cpp/bindings/remote.h"
- #include "net/base/net_errors.h"
- #include "net/cert/cert_status_flags.h"
- #include "net/log/net_log_with_source.h"
- #include "net/test/cert_builder.h"
- #include "net/test/cert_test_util.h"
- #include "net/test/test_data_directory.h"
- #include "services/cert_verifier/public/mojom/cert_verifier_service_factory.mojom.h"
- #include "services/network/public/mojom/cert_verifier_service.mojom.h"
- #include "services/network/public/mojom/network_context.mojom.h"
- #include "services/network/public/mojom/url_loader_factory.mojom.h"
- #include "testing/gtest/include/gtest/gtest.h"
- #include "testing/platform_test.h"
- #if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
- #include "mojo/public/cpp/base/big_buffer.h"
- #include "net/cert/internal/trust_store_chrome.h"
- #include "net/cert/pki/parse_name.h"
- #include "net/cert/root_store_proto_lite/root_store.pb.h"
- #include "net/der/input.h"
- #endif
- namespace cert_verifier {
- namespace {
- struct DummyCVServiceRequest : public mojom::CertVerifierRequest {
- explicit DummyCVServiceRequest(base::RepeatingClosure on_finish)
- : on_finish_(std::move(on_finish)) {}
- void Complete(const net::CertVerifyResult& result_param,
- int32_t net_error_param) override {
- is_completed = true;
- result = result_param;
- net_error = net_error_param;
- std::move(on_finish_).Run();
- }
- base::RepeatingClosure on_finish_;
- bool is_completed = false;
- net::CertVerifyResult result;
- int net_error;
- };
- } // namespace
- TEST(CertVerifierServiceFactoryTest, GetNewCertVerifier) {
- base::test::TaskEnvironment task_environment;
- base::FilePath certs_dir = net::GetTestCertsDirectory();
- scoped_refptr<net::X509Certificate> test_cert(
- net::ImportCertFromFile(certs_dir, "ok_cert.pem"));
- ASSERT_NE(nullptr, test_cert.get());
- mojo::Remote<mojom::CertVerifierServiceFactory> cv_service_factory_remote;
- CertVerifierServiceFactoryImpl cv_service_factory_impl(
- cv_service_factory_remote.BindNewPipeAndPassReceiver());
- mojo::Remote<mojom::CertVerifierService> cv_service_remote;
- mojom::CertVerifierCreationParamsPtr cv_creation_params =
- mojom::CertVerifierCreationParams::New();
- cv_service_factory_remote->GetNewCertVerifier(
- cv_service_remote.BindNewPipeAndPassReceiver(),
- std::move(cv_creation_params));
- base::RunLoop request_completed_run_loop;
- DummyCVServiceRequest dummy_cv_service_req(
- request_completed_run_loop.QuitClosure());
- mojo::Receiver<mojom::CertVerifierRequest> dummy_cv_service_req_receiver(
- &dummy_cv_service_req);
- auto net_log(net::NetLogWithSource::Make(
- net::NetLog::Get(), net::NetLogSourceType::CERT_VERIFIER_JOB));
- cv_service_remote->Verify(
- net::CertVerifier::RequestParams(test_cert, "www.example.com", 0,
- /*ocsp_response=*/std::string(),
- /*sct_list=*/std::string()),
- static_cast<uint32_t>(net_log.source().type), net_log.source().id,
- net_log.source().start_time,
- dummy_cv_service_req_receiver.BindNewPipeAndPassRemote());
- request_completed_run_loop.Run();
- ASSERT_EQ(dummy_cv_service_req.net_error, net::ERR_CERT_AUTHORITY_INVALID);
- ASSERT_TRUE(dummy_cv_service_req.result.cert_status &
- net::CERT_STATUS_AUTHORITY_INVALID);
- }
- #if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
- // Test that a new Cert verifier will use an updated Chrome Root Store if
- // one was already passed into CertVerifierServiceFactory.
- TEST(CertVerifierServiceFactoryTest, GetNewCertVerifierWithUpdatedRootStore) {
- // Create leaf and root certs.
- base::test::TaskEnvironment task_environment;
- std::unique_ptr<net::CertBuilder> leaf, root;
- net::CertBuilder::CreateSimpleChain(&leaf, &root);
- base::Time now = base::Time::Now();
- leaf->SetValidity(now - base::Days(1), now + base::Days(1));
- // Create updated Chrome Root Store with just the root cert from above.
- chrome_root_store::RootStore root_store_proto;
- root_store_proto.set_version_major(net::CompiledChromeRootStoreVersion() + 1);
- chrome_root_store::TrustAnchor* anchor = root_store_proto.add_trust_anchors();
- anchor->set_der(root->GetDER());
- std::string proto_serialized;
- root_store_proto.SerializeToString(&proto_serialized);
- cert_verifier::mojom::ChromeRootStorePtr root_store_ptr =
- cert_verifier::mojom::ChromeRootStore::New(
- base::as_bytes(base::make_span(proto_serialized)));
- mojo::Remote<mojom::CertVerifierServiceFactory> cv_service_factory_remote;
- CertVerifierServiceFactoryImpl cv_service_factory_impl(
- cv_service_factory_remote.BindNewPipeAndPassReceiver());
- // Feed factory the new Chrome Root Store.
- cv_service_factory_impl.UpdateChromeRootStore(std::move(root_store_ptr));
- mojo::Remote<mojom::CertVerifierService> cv_service_remote;
- mojom::CertVerifierCreationParamsPtr cv_creation_params =
- mojom::CertVerifierCreationParams::New();
- cv_creation_params->use_chrome_root_store = cert_verifier::mojom::
- CertVerifierCreationParams::ChromeRootImpl::kRootChrome;
- cv_service_factory_remote->GetNewCertVerifier(
- cv_service_remote.BindNewPipeAndPassReceiver(),
- std::move(cv_creation_params));
- base::RunLoop request_completed_run_loop;
- DummyCVServiceRequest dummy_cv_service_req(
- request_completed_run_loop.QuitClosure());
- mojo::Receiver<mojom::CertVerifierRequest> dummy_cv_service_req_receiver(
- &dummy_cv_service_req);
- auto net_log(net::NetLogWithSource::Make(
- net::NetLog::Get(), net::NetLogSourceType::CERT_VERIFIER_JOB));
- cv_service_remote->Verify(
- net::CertVerifier::RequestParams(leaf->GetX509Certificate(),
- "www.example.com", 0,
- /*ocsp_response=*/std::string(),
- /*sct_list=*/std::string()),
- static_cast<uint32_t>(net_log.source().type), net_log.source().id,
- net_log.source().start_time,
- dummy_cv_service_req_receiver.BindNewPipeAndPassRemote());
- request_completed_run_loop.Run();
- ASSERT_EQ(dummy_cv_service_req.net_error, net::OK);
- }
- // Test that an existing CertVerifierService will use an updated Chrome Root
- // Store if one is provided to the CertVerifierServiceFactory
- TEST(CertVerifierServiceFactoryTest, UpdateExistingCertVerifierWithRootStore) {
- // Create leaf and root certs.
- base::test::TaskEnvironment task_environment;
- std::unique_ptr<net::CertBuilder> leaf, root;
- net::CertBuilder::CreateSimpleChain(&leaf, &root);
- base::Time now = base::Time::Now();
- leaf->SetValidity(now - base::Days(1), now + base::Days(1));
- mojo::Remote<mojom::CertVerifierServiceFactory> cv_service_factory_remote;
- CertVerifierServiceFactoryImpl cv_service_factory_impl(
- cv_service_factory_remote.BindNewPipeAndPassReceiver());
- mojo::Remote<mojom::CertVerifierService> cv_service_remote;
- mojom::CertVerifierCreationParamsPtr cv_creation_params =
- mojom::CertVerifierCreationParams::New();
- cv_creation_params->use_chrome_root_store = cert_verifier::mojom::
- CertVerifierCreationParams::ChromeRootImpl::kRootChrome;
- cv_service_factory_remote->GetNewCertVerifier(
- cv_service_remote.BindNewPipeAndPassReceiver(),
- std::move(cv_creation_params));
- // Try request, it should fail because we haven't updated the Root Store yet.
- {
- base::RunLoop request_completed_run_loop;
- DummyCVServiceRequest dummy_cv_service_req(
- request_completed_run_loop.QuitClosure());
- mojo::Receiver<mojom::CertVerifierRequest> dummy_cv_service_req_receiver(
- &dummy_cv_service_req);
- auto net_log(net::NetLogWithSource::Make(
- net::NetLog::Get(), net::NetLogSourceType::CERT_VERIFIER_JOB));
- cv_service_remote->Verify(
- net::CertVerifier::RequestParams(leaf->GetX509Certificate(),
- "www.example.com", 0,
- /*ocsp_response=*/std::string(),
- /*sct_list=*/std::string()),
- static_cast<uint32_t>(net_log.source().type), net_log.source().id,
- net_log.source().start_time,
- dummy_cv_service_req_receiver.BindNewPipeAndPassRemote());
- request_completed_run_loop.Run();
- ASSERT_EQ(dummy_cv_service_req.net_error, net::ERR_CERT_AUTHORITY_INVALID);
- ASSERT_TRUE(dummy_cv_service_req.result.cert_status &
- net::CERT_STATUS_AUTHORITY_INVALID);
- }
- // Create updated Chrome Root Store with just the root cert from above.
- chrome_root_store::RootStore root_store_proto;
- root_store_proto.set_version_major(net::CompiledChromeRootStoreVersion() + 1);
- chrome_root_store::TrustAnchor* anchor = root_store_proto.add_trust_anchors();
- anchor->set_der(root->GetDER());
- std::string proto_serialized;
- root_store_proto.SerializeToString(&proto_serialized);
- cert_verifier::mojom::ChromeRootStorePtr root_store_ptr =
- cert_verifier::mojom::ChromeRootStore::New(
- base::as_bytes(base::make_span(proto_serialized)));
- // Feed factory the new Chrome Root Store.
- cv_service_factory_impl.UpdateChromeRootStore(std::move(root_store_ptr));
- // Try request, it should succeed.
- {
- base::RunLoop request_completed_run_loop;
- DummyCVServiceRequest dummy_cv_service_req(
- request_completed_run_loop.QuitClosure());
- mojo::Receiver<mojom::CertVerifierRequest> dummy_cv_service_req_receiver(
- &dummy_cv_service_req);
- auto net_log(net::NetLogWithSource::Make(
- net::NetLog::Get(), net::NetLogSourceType::CERT_VERIFIER_JOB));
- cv_service_remote->Verify(
- net::CertVerifier::RequestParams(leaf->GetX509Certificate(),
- "www.example.com", 0,
- /*ocsp_response=*/std::string(),
- /*sct_list=*/std::string()),
- static_cast<uint32_t>(net_log.source().type), net_log.source().id,
- net_log.source().start_time,
- dummy_cv_service_req_receiver.BindNewPipeAndPassRemote());
- request_completed_run_loop.Run();
- ASSERT_EQ(dummy_cv_service_req.net_error, net::OK);
- }
- }
- TEST(CertVerifierServiceFactoryTest, OldRootStoreUpdateIgnored) {
- // Create leaf and root certs.
- base::test::TaskEnvironment task_environment;
- std::unique_ptr<net::CertBuilder> leaf, root;
- net::CertBuilder::CreateSimpleChain(&leaf, &root);
- base::Time now = base::Time::Now();
- leaf->SetValidity(now - base::Days(1), now + base::Days(1));
- // Create updated Chrome Root Store with just the root cert from above, but
- // set the version # so that the version is ignored.
- chrome_root_store::RootStore root_store_proto;
- root_store_proto.set_version_major(net::CompiledChromeRootStoreVersion());
- chrome_root_store::TrustAnchor* anchor = root_store_proto.add_trust_anchors();
- anchor->set_der(root->GetDER());
- std::string proto_serialized;
- root_store_proto.SerializeToString(&proto_serialized);
- cert_verifier::mojom::ChromeRootStorePtr root_store_ptr =
- cert_verifier::mojom::ChromeRootStore::New(
- base::as_bytes(base::make_span(proto_serialized)));
- mojo::Remote<mojom::CertVerifierServiceFactory> cv_service_factory_remote;
- CertVerifierServiceFactoryImpl cv_service_factory_impl(
- cv_service_factory_remote.BindNewPipeAndPassReceiver());
- // Feed factory the new Chrome Root Store.
- cv_service_factory_impl.UpdateChromeRootStore(std::move(root_store_ptr));
- mojo::Remote<mojom::CertVerifierService> cv_service_remote;
- mojom::CertVerifierCreationParamsPtr cv_creation_params =
- mojom::CertVerifierCreationParams::New();
- cv_creation_params->use_chrome_root_store = cert_verifier::mojom::
- CertVerifierCreationParams::ChromeRootImpl::kRootChrome;
- cv_service_factory_remote->GetNewCertVerifier(
- cv_service_remote.BindNewPipeAndPassReceiver(),
- std::move(cv_creation_params));
- base::RunLoop request_completed_run_loop;
- DummyCVServiceRequest dummy_cv_service_req(
- request_completed_run_loop.QuitClosure());
- mojo::Receiver<mojom::CertVerifierRequest> dummy_cv_service_req_receiver(
- &dummy_cv_service_req);
- auto net_log(net::NetLogWithSource::Make(
- net::NetLog::Get(), net::NetLogSourceType::CERT_VERIFIER_JOB));
- cv_service_remote->Verify(
- net::CertVerifier::RequestParams(leaf->GetX509Certificate(),
- "www.example.com", 0,
- /*ocsp_response=*/std::string(),
- /*sct_list=*/std::string()),
- static_cast<uint32_t>(net_log.source().type), net_log.source().id,
- net_log.source().start_time,
- dummy_cv_service_req_receiver.BindNewPipeAndPassRemote());
- request_completed_run_loop.Run();
- // Request should result in error because root store update was ignored.
- ASSERT_EQ(dummy_cv_service_req.net_error, net::ERR_CERT_AUTHORITY_INVALID);
- ASSERT_TRUE(dummy_cv_service_req.result.cert_status &
- net::CERT_STATUS_AUTHORITY_INVALID);
- }
- TEST(CertVerifierServiceFactoryTest, BadRootStoreUpdateIgnored) {
- // Create leaf and root certs.
- base::test::TaskEnvironment task_environment;
- std::unique_ptr<net::CertBuilder> leaf, root;
- net::CertBuilder::CreateSimpleChain(&leaf, &root);
- base::Time now = base::Time::Now();
- leaf->SetValidity(now - base::Days(1), now + base::Days(1));
- // Create updated Chrome Root Store with just the root cert from above.
- chrome_root_store::RootStore root_store_proto;
- root_store_proto.set_version_major(net::CompiledChromeRootStoreVersion() + 1);
- chrome_root_store::TrustAnchor* anchor = root_store_proto.add_trust_anchors();
- anchor->set_der(root->GetDER());
- std::string proto_serialized;
- root_store_proto.SerializeToString(&proto_serialized);
- cert_verifier::mojom::ChromeRootStorePtr root_store_ptr =
- cert_verifier::mojom::ChromeRootStore::New(
- base::as_bytes(base::make_span(proto_serialized)));
- mojo::Remote<mojom::CertVerifierServiceFactory> cv_service_factory_remote;
- CertVerifierServiceFactoryImpl cv_service_factory_impl(
- cv_service_factory_remote.BindNewPipeAndPassReceiver());
- // Feed factory the new Chrome Root Store.
- cv_service_factory_impl.UpdateChromeRootStore(std::move(root_store_ptr));
- mojo::Remote<mojom::CertVerifierService> cv_service_remote;
- mojom::CertVerifierCreationParamsPtr cv_creation_params =
- mojom::CertVerifierCreationParams::New();
- cv_creation_params->use_chrome_root_store = cert_verifier::mojom::
- CertVerifierCreationParams::ChromeRootImpl::kRootChrome;
- cv_service_factory_remote->GetNewCertVerifier(
- cv_service_remote.BindNewPipeAndPassReceiver(),
- std::move(cv_creation_params));
- // Initial request should succeed.
- {
- base::RunLoop request_completed_run_loop;
- DummyCVServiceRequest dummy_cv_service_req(
- request_completed_run_loop.QuitClosure());
- mojo::Receiver<mojom::CertVerifierRequest> dummy_cv_service_req_receiver(
- &dummy_cv_service_req);
- auto net_log(net::NetLogWithSource::Make(
- net::NetLog::Get(), net::NetLogSourceType::CERT_VERIFIER_JOB));
- cv_service_remote->Verify(
- net::CertVerifier::RequestParams(leaf->GetX509Certificate(),
- "www.example.com", 0,
- /*ocsp_response=*/std::string(),
- /*sct_list=*/std::string()),
- static_cast<uint32_t>(net_log.source().type), net_log.source().id,
- net_log.source().start_time,
- dummy_cv_service_req_receiver.BindNewPipeAndPassRemote());
- request_completed_run_loop.Run();
- // Request should be OK.
- ASSERT_EQ(dummy_cv_service_req.net_error, net::OK);
- }
- // Create updated Chrome Root Store with an invalid cert; update should be
- // ignored.
- chrome_root_store::RootStore invalid_root_store_proto;
- invalid_root_store_proto.set_version_major(
- net::CompiledChromeRootStoreVersion() + 2);
- chrome_root_store::TrustAnchor* invalid_anchor =
- invalid_root_store_proto.add_trust_anchors();
- invalid_anchor->set_der("gibberishcert");
- invalid_root_store_proto.SerializeToString(&proto_serialized);
- cert_verifier::mojom::ChromeRootStorePtr invalid_root_store_ptr =
- cert_verifier::mojom::ChromeRootStore::New(
- base::as_bytes(base::make_span(proto_serialized)));
- // Feed factory the new Chrome Root Store.
- cv_service_factory_impl.UpdateChromeRootStore(
- std::move(invalid_root_store_ptr));
- {
- base::RunLoop request_completed_run_loop;
- DummyCVServiceRequest dummy_cv_service_req(
- request_completed_run_loop.QuitClosure());
- mojo::Receiver<mojom::CertVerifierRequest> dummy_cv_service_req_receiver(
- &dummy_cv_service_req);
- auto net_log(net::NetLogWithSource::Make(
- net::NetLog::Get(), net::NetLogSourceType::CERT_VERIFIER_JOB));
- cv_service_remote->Verify(
- net::CertVerifier::RequestParams(leaf->GetX509Certificate(),
- "www.example.com", 0,
- /*ocsp_response=*/std::string(),
- /*sct_list=*/std::string()),
- static_cast<uint32_t>(net_log.source().type), net_log.source().id,
- net_log.source().start_time,
- dummy_cv_service_req_receiver.BindNewPipeAndPassRemote());
- request_completed_run_loop.Run();
- // Request should be OK because root store update was ignored.
- ASSERT_EQ(dummy_cv_service_req.net_error, net::OK);
- }
- // Clear all certs from the proto
- root_store_proto.clear_trust_anchors();
- root_store_proto.SerializeToString(&proto_serialized);
- cert_verifier::mojom::ChromeRootStorePtr empty_root_store_ptr =
- cert_verifier::mojom::ChromeRootStore::New(
- base::as_bytes(base::make_span(proto_serialized)));
- // Feed factory the new Chrome Root Store.
- cv_service_factory_impl.UpdateChromeRootStore(
- std::move(empty_root_store_ptr));
- {
- base::RunLoop request_completed_run_loop;
- DummyCVServiceRequest dummy_cv_service_req(
- request_completed_run_loop.QuitClosure());
- mojo::Receiver<mojom::CertVerifierRequest> dummy_cv_service_req_receiver(
- &dummy_cv_service_req);
- auto net_log(net::NetLogWithSource::Make(
- net::NetLog::Get(), net::NetLogSourceType::CERT_VERIFIER_JOB));
- cv_service_remote->Verify(
- net::CertVerifier::RequestParams(leaf->GetX509Certificate(),
- "www.example.com", 0,
- /*ocsp_response=*/std::string(),
- /*sct_list=*/std::string()),
- static_cast<uint32_t>(net_log.source().type), net_log.source().id,
- net_log.source().start_time,
- dummy_cv_service_req_receiver.BindNewPipeAndPassRemote());
- request_completed_run_loop.Run();
- // Request should be OK because root store update was ignored.
- ASSERT_EQ(dummy_cv_service_req.net_error, net::OK);
- }
- }
- void GetRootStoreInfo(cert_verifier::mojom::ChromeRootStoreInfoPtr* return_ptr,
- base::RepeatingClosure quit_closure,
- cert_verifier::mojom::ChromeRootStoreInfoPtr info) {
- *return_ptr = std::move(info);
- quit_closure.Run();
- }
- TEST(CertVerifierServiceFactoryTest, RootStoreInfoWithUpdatedRootStore) {
- // Create leaf and root certs.
- base::test::TaskEnvironment task_environment;
- std::unique_ptr<net::CertBuilder> leaf, root;
- net::CertBuilder::CreateSimpleChain(&leaf, &root);
- ASSERT_TRUE(leaf && root);
- base::Time now = base::Time::Now();
- leaf->SetValidity(now - base::Days(1), now + base::Days(1));
- // Create updated Chrome Root Store with just the root cert from above.
- chrome_root_store::RootStore root_store_proto;
- root_store_proto.set_version_major(net::CompiledChromeRootStoreVersion() + 1);
- chrome_root_store::TrustAnchor* anchor = root_store_proto.add_trust_anchors();
- anchor->set_der(root->GetDER());
- std::string proto_serialized;
- root_store_proto.SerializeToString(&proto_serialized);
- cert_verifier::mojom::ChromeRootStorePtr root_store_ptr =
- cert_verifier::mojom::ChromeRootStore::New(
- base::as_bytes(base::make_span(proto_serialized)));
- mojo::Remote<mojom::CertVerifierServiceFactory> cv_service_factory_remote;
- CertVerifierServiceFactoryImpl cv_service_factory_impl(
- cv_service_factory_remote.BindNewPipeAndPassReceiver());
- // Feed factory the new Chrome Root Store.
- cv_service_factory_impl.UpdateChromeRootStore(std::move(root_store_ptr));
- cert_verifier::mojom::ChromeRootStoreInfoPtr info_ptr;
- base::RunLoop request_completed_run_loop;
- cv_service_factory_remote->GetChromeRootStoreInfo(base::BindOnce(
- &GetRootStoreInfo, &info_ptr, request_completed_run_loop.QuitClosure()));
- request_completed_run_loop.Run();
- ASSERT_TRUE(info_ptr);
- EXPECT_EQ(info_ptr->version, root_store_proto.version_major());
- ASSERT_EQ(info_ptr->root_cert_info.size(), static_cast<std::size_t>(1));
- net::der::Input subject_tlv(&root->GetSubject());
- net::RDNSequence subject_rdn;
- ASSERT_TRUE(net::ParseName(subject_tlv, &subject_rdn));
- std::string subject_string;
- ASSERT_TRUE(net::ConvertToRFC2253(subject_rdn, &subject_string));
- EXPECT_EQ(info_ptr->root_cert_info[0]->name, subject_string);
- net::SHA256HashValue root_hash =
- net::X509Certificate::CalculateFingerprint256(root->GetCertBuffer());
- EXPECT_EQ(info_ptr->root_cert_info[0]->sha256hash_hex,
- base::HexEncode(root_hash.data, std::size(root_hash.data)));
- }
- TEST(CertVerifierServiceFactoryTest, RootStoreInfoWithCompiledRootStore) {
- base::test::TaskEnvironment task_environment;
- net::ParsedCertificateList anchors = net::CompiledChromeRootStoreAnchors();
- mojo::Remote<mojom::CertVerifierServiceFactory> cv_service_factory_remote;
- CertVerifierServiceFactoryImpl cv_service_factory_impl(
- cv_service_factory_remote.BindNewPipeAndPassReceiver());
- cert_verifier::mojom::ChromeRootStoreInfoPtr info_ptr;
- base::RunLoop request_completed_run_loop;
- cv_service_factory_remote->GetChromeRootStoreInfo(base::BindOnce(
- &GetRootStoreInfo, &info_ptr, request_completed_run_loop.QuitClosure()));
- request_completed_run_loop.Run();
- ASSERT_TRUE(info_ptr);
- EXPECT_EQ(info_ptr->version, net::CompiledChromeRootStoreVersion());
- EXPECT_EQ(info_ptr->root_cert_info.size(), anchors.size());
- }
- #endif
- } // namespace cert_verifier
|