// Copyright (c) 2012 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/ev_root_ca_metadata.h"

#include "build/build_config.h"
#include "net/cert/x509_cert_types.h"
#include "net/der/input.h"
#include "net/test/cert_test_util.h"
#include "testing/gtest/include/gtest/gtest.h"

#if defined(USE_NSS_CERTS)
#include "crypto/nss_util.h"
#include "crypto/scoped_nss_types.h"
#include "starboard/memory.h"
#endif

namespace net {

namespace {

#if defined(USE_NSS_CERTS) || defined(OS_WIN)
const char kVerisignPolicyStr[] = "2.16.840.1.113733.1.7.23.6";
const char kThawtePolicyStr[] = "2.16.840.1.113733.1.7.48.1";
const char kFakePolicyStr[] = "2.16.840.1.42";
const char kCabEvPolicyStr[] = "2.23.140.1.1";
#elif defined(OS_MACOSX)
const char kFakePolicyStr[] = "2.16.840.1.42";
#endif

#if defined(USE_NSS_CERTS) || defined(OS_WIN) || defined(OS_MACOSX)
// DER OID values (no tag or length).
const uint8_t kVerisignPolicyBytes[] = {0x60, 0x86, 0x48, 0x01, 0x86, 0xf8,
                                        0x45, 0x01, 0x07, 0x17, 0x06};
const uint8_t kThawtePolicyBytes[] = {0x60, 0x86, 0x48, 0x01, 0x86, 0xf8,
                                      0x45, 0x01, 0x07, 0x30, 0x01};
const uint8_t kFakePolicyBytes[] = {0x60, 0x86, 0x48, 0x01, 0x2a};
const uint8_t kCabEvPolicyBytes[] = {0x67, 0x81, 0x0c, 0x01, 0x01};

const SHA256HashValue kVerisignFingerprint = {
    {0xe7, 0x68, 0x56, 0x34, 0xef, 0xac, 0xf6, 0x9a, 0xce, 0x93, 0x9a,
     0x6b, 0x25, 0x5b, 0x7b, 0x4f, 0xab, 0xef, 0x42, 0x93, 0x5b, 0x50,
     0xa2, 0x65, 0xac, 0xb5, 0xcb, 0x60, 0x27, 0xe4, 0x4e, 0x70}};
const SHA256HashValue kFakeFingerprint = {
    {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa,
     0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55,
     0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}};

class EVOidData {
 public:
  EVOidData();
  bool Init();

  EVRootCAMetadata::PolicyOID verisign_policy;
  der::Input verisign_policy_bytes;

  EVRootCAMetadata::PolicyOID thawte_policy;
  der::Input thawte_policy_bytes;

  EVRootCAMetadata::PolicyOID fake_policy;
  der::Input fake_policy_bytes;

  EVRootCAMetadata::PolicyOID cab_ev_policy;
  der::Input cab_ev_policy_bytes;
};

#endif  // defined(USE_NSS_CERTS) || defined(OS_WIN) || defined(OS_MACOSX)

#if defined(USE_NSS_CERTS)

SECOidTag RegisterOID(PLArenaPool* arena, const char* oid_string) {
  SECOidData oid_data;
  SbMemorySet(&oid_data, 0, sizeof(oid_data));
  oid_data.offset = SEC_OID_UNKNOWN;
  oid_data.desc = oid_string;
  oid_data.mechanism = CKM_INVALID_MECHANISM;
  oid_data.supportedExtension = INVALID_CERT_EXTENSION;

  SECStatus rv = SEC_StringToOID(arena, &oid_data.oid, oid_string, 0);
  if (rv != SECSuccess)
    return SEC_OID_UNKNOWN;

  return SECOID_AddEntry(&oid_data);
}

EVOidData::EVOidData()
    : verisign_policy(SEC_OID_UNKNOWN),
      verisign_policy_bytes(kVerisignPolicyBytes),
      thawte_policy(SEC_OID_UNKNOWN),
      thawte_policy_bytes(kThawtePolicyBytes),
      fake_policy(SEC_OID_UNKNOWN),
      fake_policy_bytes(kFakePolicyBytes),
      cab_ev_policy(SEC_OID_UNKNOWN),
      cab_ev_policy_bytes(kCabEvPolicyBytes) {}

bool EVOidData::Init() {
  crypto::EnsureNSSInit();
  crypto::ScopedPLArenaPool pool(PORT_NewArena(DER_DEFAULT_CHUNKSIZE));
  if (!pool.get())
    return false;

  verisign_policy = RegisterOID(pool.get(), kVerisignPolicyStr);
  thawte_policy = RegisterOID(pool.get(), kThawtePolicyStr);
  fake_policy = RegisterOID(pool.get(), kFakePolicyStr);
  cab_ev_policy = RegisterOID(pool.get(), kCabEvPolicyStr);

  return verisign_policy != SEC_OID_UNKNOWN &&
         thawte_policy != SEC_OID_UNKNOWN && fake_policy != SEC_OID_UNKNOWN &&
         cab_ev_policy != SEC_OID_UNKNOWN;
}

#elif defined(OS_WIN)

EVOidData::EVOidData()
    : verisign_policy(kVerisignPolicyStr),
      verisign_policy_bytes(kVerisignPolicyBytes),
      thawte_policy(kThawtePolicyStr),
      thawte_policy_bytes(kThawtePolicyBytes),
      fake_policy(kFakePolicyStr),
      fake_policy_bytes(kFakePolicyBytes),
      cab_ev_policy(kCabEvPolicyStr),
      cab_ev_policy_bytes(kCabEvPolicyBytes) {}

bool EVOidData::Init() {
  return true;
}

#elif defined(OS_MACOSX)

EVOidData::EVOidData()
    : verisign_policy(kVerisignPolicyBytes),
      verisign_policy_bytes(kVerisignPolicyBytes),
      thawte_policy(kThawtePolicyBytes),
      thawte_policy_bytes(kThawtePolicyBytes),
      fake_policy(kFakePolicyBytes),
      fake_policy_bytes(kFakePolicyBytes),
      cab_ev_policy(kCabEvPolicyBytes),
      cab_ev_policy_bytes(kCabEvPolicyBytes) {}

bool EVOidData::Init() {
  return true;
}

#endif

#if defined(USE_NSS_CERTS) || defined(OS_WIN) || defined(OS_MACOSX)

class EVRootCAMetadataTest : public testing::Test {
 protected:
  void SetUp() override { ASSERT_TRUE(ev_oid_data.Init()); }

  EVOidData ev_oid_data;
};

TEST_F(EVRootCAMetadataTest, Basic) {
  EVRootCAMetadata* ev_metadata(EVRootCAMetadata::GetInstance());

  EXPECT_TRUE(ev_metadata->IsEVPolicyOID(ev_oid_data.verisign_policy));
  EXPECT_TRUE(
      ev_metadata->IsEVPolicyOIDGivenBytes(ev_oid_data.verisign_policy_bytes));

  EXPECT_FALSE(ev_metadata->IsEVPolicyOID(ev_oid_data.fake_policy));
  EXPECT_FALSE(
      ev_metadata->IsEVPolicyOIDGivenBytes(ev_oid_data.fake_policy_bytes));

  EXPECT_TRUE(ev_metadata->HasEVPolicyOID(kVerisignFingerprint,
                                          ev_oid_data.verisign_policy));
  EXPECT_TRUE(ev_metadata->HasEVPolicyOIDGivenBytes(
      kVerisignFingerprint, ev_oid_data.verisign_policy_bytes));

  EXPECT_FALSE(ev_metadata->HasEVPolicyOID(kFakeFingerprint,
                                           ev_oid_data.verisign_policy));
  EXPECT_FALSE(ev_metadata->HasEVPolicyOIDGivenBytes(
      kFakeFingerprint, ev_oid_data.verisign_policy_bytes));

  EXPECT_FALSE(ev_metadata->HasEVPolicyOID(kVerisignFingerprint,
                                           ev_oid_data.fake_policy));
  EXPECT_FALSE(ev_metadata->HasEVPolicyOIDGivenBytes(
      kVerisignFingerprint, ev_oid_data.fake_policy_bytes));

  EXPECT_FALSE(ev_metadata->HasEVPolicyOID(kVerisignFingerprint,
                                           ev_oid_data.thawte_policy));
  EXPECT_FALSE(ev_metadata->HasEVPolicyOIDGivenBytes(
      kVerisignFingerprint, ev_oid_data.thawte_policy_bytes));

  // Test a completely bogus OID given bytes.
  const uint8_t bad_oid[] = {0};
  EXPECT_FALSE(ev_metadata->HasEVPolicyOIDGivenBytes(kVerisignFingerprint,
                                                     der::Input(bad_oid)));
}

TEST_F(EVRootCAMetadataTest, AddRemove) {
  EVRootCAMetadata* ev_metadata(EVRootCAMetadata::GetInstance());

  EXPECT_FALSE(ev_metadata->IsEVPolicyOID(ev_oid_data.fake_policy));
  EXPECT_FALSE(
      ev_metadata->IsEVPolicyOIDGivenBytes(ev_oid_data.fake_policy_bytes));

  EXPECT_FALSE(
      ev_metadata->HasEVPolicyOID(kFakeFingerprint, ev_oid_data.fake_policy));
  EXPECT_FALSE(ev_metadata->HasEVPolicyOIDGivenBytes(
      kFakeFingerprint, ev_oid_data.fake_policy_bytes));

  {
    ScopedTestEVPolicy test_ev_policy(ev_metadata, kFakeFingerprint,
                                      kFakePolicyStr);

    EXPECT_TRUE(ev_metadata->IsEVPolicyOID(ev_oid_data.fake_policy));
    EXPECT_TRUE(
        ev_metadata->IsEVPolicyOIDGivenBytes(ev_oid_data.fake_policy_bytes));

    EXPECT_TRUE(
        ev_metadata->HasEVPolicyOID(kFakeFingerprint, ev_oid_data.fake_policy));
    EXPECT_TRUE(ev_metadata->HasEVPolicyOIDGivenBytes(
        kFakeFingerprint, ev_oid_data.fake_policy_bytes));
  }

  EXPECT_FALSE(ev_metadata->IsEVPolicyOID(ev_oid_data.fake_policy));
  EXPECT_FALSE(
      ev_metadata->IsEVPolicyOIDGivenBytes(ev_oid_data.fake_policy_bytes));

  EXPECT_FALSE(
      ev_metadata->HasEVPolicyOID(kFakeFingerprint, ev_oid_data.fake_policy));
  EXPECT_FALSE(ev_metadata->HasEVPolicyOIDGivenBytes(
      kFakeFingerprint, ev_oid_data.fake_policy_bytes));
}

TEST_F(EVRootCAMetadataTest, IsCaBrowserForumEvOid) {
  EXPECT_TRUE(
      EVRootCAMetadata::IsCaBrowserForumEvOid(ev_oid_data.cab_ev_policy));

  EXPECT_FALSE(
      EVRootCAMetadata::IsCaBrowserForumEvOid(ev_oid_data.fake_policy));
  EXPECT_FALSE(
      EVRootCAMetadata::IsCaBrowserForumEvOid(ev_oid_data.verisign_policy));
}

#endif  // defined(USE_NSS_CERTS) || defined(OS_WIN) || defined(OS_MACOSX)

}  // namespace

}  // namespace net
