// Copyright (c) 2011 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 "net/cert/test_root_certs.h"

#include <openssl/err.h>
#include <openssl/x509v3.h>

#include "base/location.h"
#include "base/logging.h"
#include "crypto/openssl_util.h"
#include "net/cert/x509_certificate.h"

namespace net {

bool TestRootCerts::Add(X509Certificate* certificate) {
  if (!X509_STORE_add_cert(X509Certificate::cert_store(),
                           certificate->os_cert_handle())) {
    unsigned long error_code = ERR_peek_error();
    if (ERR_GET_LIB(error_code) != ERR_LIB_X509 ||
        ERR_GET_REASON(error_code) != X509_R_CERT_ALREADY_IN_HASH_TABLE) {
      crypto::ClearOpenSSLERRStack(FROM_HERE);
      return false;
    }
    ERR_clear_error();
  }

  temporary_roots_.push_back(certificate);
  return true;
}

void TestRootCerts::Clear() {
  if (temporary_roots_.empty())
    return;

  temporary_roots_.clear();
  X509Certificate::ResetCertStore();
}

bool TestRootCerts::IsEmpty() const {
  return temporary_roots_.empty();
}

bool TestRootCerts::Contains(X509* cert) const {
  for (std::vector<scoped_refptr<X509Certificate> >::const_iterator it =
           temporary_roots_.begin();
       it != temporary_roots_.end(); ++it) {
    if (X509Certificate::IsSameOSCert(cert, (*it)->os_cert_handle()))
      return true;
  }
  return false;
}

TestRootCerts::~TestRootCerts() {}

void TestRootCerts::Init() {}

}  // namespace net
