• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "net/cert/test_root_certs.h"
6 
7 #include <string>
8 
9 #include "base/file_util.h"
10 #include "base/files/file_path.h"
11 #include "base/logging.h"
12 #include "net/cert/x509_certificate.h"
13 
14 namespace net {
15 
16 namespace {
17 
18 bool g_has_instance = false;
19 
20 base::LazyInstance<TestRootCerts>::Leaky
21     g_test_root_certs = LAZY_INSTANCE_INITIALIZER;
22 
LoadCertificates(const base::FilePath & filename)23 CertificateList LoadCertificates(const base::FilePath& filename) {
24   std::string raw_cert;
25   if (!base::ReadFileToString(filename, &raw_cert)) {
26     LOG(ERROR) << "Can't load certificate " << filename.value();
27     return CertificateList();
28   }
29 
30   return X509Certificate::CreateCertificateListFromBytes(
31       raw_cert.data(), raw_cert.length(), X509Certificate::FORMAT_AUTO);
32 }
33 
34 }  // namespace
35 
36 // static
GetInstance()37 TestRootCerts* TestRootCerts::GetInstance() {
38   return g_test_root_certs.Pointer();
39 }
40 
HasInstance()41 bool TestRootCerts::HasInstance() {
42   return g_has_instance;
43 }
44 
AddFromFile(const base::FilePath & file)45 bool TestRootCerts::AddFromFile(const base::FilePath& file) {
46   CertificateList root_certs = LoadCertificates(file);
47   if (root_certs.empty() || root_certs.size() > 1)
48     return false;
49 
50   return Add(root_certs.front().get());
51 }
52 
TestRootCerts()53 TestRootCerts::TestRootCerts() {
54   Init();
55   g_has_instance = true;
56 }
57 
ScopedTestRoot()58 ScopedTestRoot::ScopedTestRoot() {}
59 
ScopedTestRoot(X509Certificate * cert)60 ScopedTestRoot::ScopedTestRoot(X509Certificate* cert) {
61   Reset(cert);
62 }
63 
~ScopedTestRoot()64 ScopedTestRoot::~ScopedTestRoot() {
65   Reset(NULL);
66 }
67 
Reset(X509Certificate * cert)68 void ScopedTestRoot::Reset(X509Certificate* cert) {
69   if (cert_.get())
70     TestRootCerts::GetInstance()->Clear();
71   if (cert)
72     TestRootCerts::GetInstance()->Add(cert);
73   cert_ = cert;
74 }
75 
76 }  // namespace net
77