15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/test_root_certs.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/x509_certificate.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool g_has_instance = false;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::LazyInstance<TestRootCerts>::Leaky
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    g_test_root_certs = LAZY_INSTANCE_INITIALIZER;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CertificateList LoadCertificates(const base::FilePath& filename) {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string raw_cert;
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!base::ReadFileToString(filename, &raw_cert)) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Can't load certificate " << filename.value();
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return CertificateList();
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return X509Certificate::CreateCertificateListFromBytes(
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      raw_cert.data(), raw_cert.length(), X509Certificate::FORMAT_AUTO);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestRootCerts* TestRootCerts::GetInstance() {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return g_test_root_certs.Pointer();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestRootCerts::HasInstance() {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return g_has_instance;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TestRootCerts::AddFromFile(const base::FilePath& file) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CertificateList root_certs = LoadCertificates(file);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (root_certs.empty() || root_certs.size() > 1)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return Add(root_certs.front().get());
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestRootCerts::TestRootCerts() {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Init();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_has_instance = true;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScopedTestRoot::ScopedTestRoot() {}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScopedTestRoot::ScopedTestRoot(X509Certificate* cert) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Reset(cert);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScopedTestRoot::~ScopedTestRoot() {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Reset(NULL);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ScopedTestRoot::Reset(X509Certificate* cert) {
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (cert_.get())
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestRootCerts::GetInstance()->Clear();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cert)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestRootCerts::GetInstance()->Add(cert);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cert_ = cert;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
77