1// Copyright (c) 2010 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/base/test_root_certs.h"
6
7#include <string>
8
9#include "base/file_path.h"
10#include "base/file_util.h"
11#include "base/logging.h"
12#include "net/base/x509_certificate.h"
13
14namespace net {
15
16namespace {
17
18bool g_has_instance = false;
19
20base::LazyInstance<TestRootCerts,
21                   base::LeakyLazyInstanceTraits<TestRootCerts> >
22    g_test_root_certs(base::LINKER_INITIALIZED);
23
24CertificateList LoadCertificates(const FilePath& filename) {
25  std::string raw_cert;
26  if (!file_util::ReadFileToString(filename, &raw_cert)) {
27    LOG(ERROR) << "Can't load certificate " << filename.value();
28    return CertificateList();
29  }
30
31  return X509Certificate::CreateCertificateListFromBytes(
32      raw_cert.data(), raw_cert.length(), X509Certificate::FORMAT_AUTO);
33}
34
35}  // namespace
36
37// static
38TestRootCerts* TestRootCerts::GetInstance() {
39  return g_test_root_certs.Pointer();
40}
41
42bool TestRootCerts::HasInstance() {
43  return g_has_instance;
44}
45
46bool TestRootCerts::AddFromFile(const FilePath& file) {
47  CertificateList root_certs = LoadCertificates(file);
48  if (root_certs.empty() || root_certs.size() > 1)
49    return false;
50
51  return Add(root_certs.front());
52}
53
54TestRootCerts::TestRootCerts() {
55  Init();
56  g_has_instance = true;
57}
58
59}  // namespace net
60