# Copyright (c) 2013 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.

import("ssl/flags.gni")

crypto_minimal_sources = [
  "hmac.cc",
  "hmac.h",
  "hmac_win.cc",
  "secure_util.cc",
  "secure_util.h",
  "symmetric_key.h",
  "symmetric_key_win.cc",
  "third_party/nss/chromium-sha256.h",
  "third_party/nss/sha512.cc",
]

component("crypto") {
  external = true
  output_name = "crcrypto"  # Avoid colliding with OpenSSL's libcrypto.
  sources = [
    "apple_keychain.h",
    "apple_keychain_ios.mm",
    "apple_keychain_mac.mm",
    "capi_util.cc",
    "capi_util.h",
    "crypto_export.h",
    "crypto_module_blocking_password_delegate.h",
    "cssm_init.cc",
    "cssm_init.h",
    "curve25519.cc",
    "curve25519.h",
    "curve25519-donna.c",
    "ghash.cc",
    "ghash.h",
    "ec_private_key.h",
    "ec_private_key_nss.cc",
    "ec_private_key_openssl.cc",
    "ec_signature_creator.cc",
    "ec_signature_creator.h",
    "ec_signature_creator_impl.h",
    "ec_signature_creator_nss.cc",
    "ec_signature_creator_openssl.cc",
    "encryptor.cc",
    "encryptor.h",
    "encryptor_nss.cc",
    "encryptor_openssl.cc",
    "hkdf.cc",
    "hkdf.h",
    "hmac_nss.cc",
    "hmac_openssl.cc",
    "mac_security_services_lock.cc",
    "mac_security_services_lock.h",
    # TODO(brettw) these mocks should be moved to a test_support_crypto target
    # if possible.
    "mock_apple_keychain.cc",
    "mock_apple_keychain.h",
    "mock_apple_keychain_ios.cc",
    "mock_apple_keychain_mac.cc",
    "p224_spake.cc",
    "p224_spake.h",
    "nss_util.cc",
    "nss_util.h",
    "nss_util_internal.h",
    "openpgp_symmetric_encryption.cc",
    "openpgp_symmetric_encryption.h",
    "openssl_util.cc",
    "openssl_util.h",
    "p224.cc",
    "p224.h",
    "random.h",
    "random.cc",
    "rsa_private_key.cc",
    "rsa_private_key.h",
    "rsa_private_key_nss.cc",
    "rsa_private_key_openssl.cc",
    "scoped_capi_types.h",
    "scoped_nss_types.h",
    "secure_hash.h",
    "secure_hash_default.cc",
    "secure_hash_openssl.cc",
    "sha2.cc",
    "sha2.h",
    "signature_creator.h",
    "signature_creator_nss.cc",
    "signature_creator_openssl.cc",
    "signature_verifier.h",
    "signature_verifier_nss.cc",
    "signature_verifier_openssl.cc",
    "symmetric_key_nss.cc",
    "symmetric_key_openssl.cc",
    "third_party/nss/chromium-blapi.h",
    "third_party/nss/chromium-blapit.h",
    "third_party/nss/chromium-nss.h",
    "third_party/nss/pk11akey.cc",
    "third_party/nss/rsawrapr.c",
    "third_party/nss/secsign.cc",
  ]

  deps = [
    "//base",
    "//base/third_party/dynamic_annotations",
    "//crypto/ssl:metassl",
  ]
  forward_dependent_configs_from = [ "//crypto/ssl:metassl" ]

  if (!is_mac && !is_ios) {
    sources -= [
      "apple_keychain.h",
      "mock_apple_keychain.cc",
      "mock_apple_keychain.h",
    ]
  }

  if (!is_linux) {
    if (use_nss) {  # Removed for non-NSS in all cases below.
      sources -= [
        "openpgp_symmetric_encryption.cc",
        "openpgp_symmetric_encryption.h",
      ]
    }
  }
  if (!is_mac) {
    sources -= [
      "cssm_init.cc",
      "cssm_init.h",
      "mac_security_services_lock.cc",
      "mac_security_services_lock.h",
    ]
  }
  if (!is_win) {
    sources -= [
      "capi_util.cc",
      "capi_util.h",
    ]
  }

  if (use_nss) {
    configs += "//third_party/nss:nss_linux_config"
  } else {
    sources -= [
      "ec_private_key_nss.cc",
      "ec_signature_creator_nss.cc",
      "encryptor_nss.cc",
      "hmac_nss.cc",
      "nss_util.cc",
      "nss_util.h",
      "rsa_private_key_nss.cc",
      "secure_hash_default.cc",
      "signature_creator_nss.cc",
      "signature_verifier_nss.cc",
      "symmetric_key_nss.cc",
      "third_party/nss/chromium-blapi.h",
      "third_party/nss/chromium-blapit.h",
      "third_party/nss/chromium-nss.h",
      "third_party/nss/pk11akey.cc",
      "third_party/nss/rsawrapr.c",
      "third_party/nss/secsign.cc",
    ]
  }
  if (!use_openssl) {
    sources -= [
      "ec_private_key_openssl.cc",
      "ec_signature_creator_openssl.cc",
      "encryptor_openssl.cc",
      "hmac_openssl.cc",
      "openssl_util.cc",
      "openssl_util.h",
      "rsa_private_key_openssl.cc",
      "secure_hash_openssl.cc",
      "signature_creator_openssl.cc",
      "signature_verifier_openssl.cc",
      "symmetric_key_openssl.cc",
    ]
  }

  defines = [ "CRYPTO_IMPLEMENTATION" ]

  # TODO(brettw) once GYP compat is no longer necessary, just move
  # crypto_minimal_sources to the crypto_minimal target and include a
  # dependency on it here.
  sources += crypto_minimal_sources
}

# A minimal crypto subset for core features that small standalone targets can
# use to reduce code size.
static_library("crypto_minimal") {
  external = true
  sources = crypto_minimal_sources

  deps = [
    "//base",
    "//base/third_party/dynamic_annotations",
  ]

  defines = [ "CRYPTO_IMPLEMENTATION" ]
}

test("crypto_unittests") {
  external = true
  sources = [
    # Infrastructure files.
    "run_all_unittests.cc",

    # Tests.
    "curve25519_unittest.cc",
    "ec_private_key_unittest.cc",
    "ec_signature_creator_unittest.cc",
    "encryptor_unittest.cc",
    "ghash_unittest.cc",
    "hkdf_unittest.cc",
    "hmac_unittest.cc",
    "nss_util_unittest.cc",
    "p224_unittest.cc",
    "p224_spake_unittest.cc",
    "random_unittest.cc",
    "rsa_private_key_unittest.cc",
    "rsa_private_key_nss_unittest.cc",
    "secure_hash_unittest.cc",
    "sha2_unittest.cc",
    "signature_creator_unittest.cc",
    "signature_verifier_unittest.cc",
    "symmetric_key_unittest.cc",
    "openpgp_symmetric_encryption_unittest.cc",
  ]

  if (use_openssl) {
    sources -= [
      "nss_util_unittest.cc",
      "openpgp_symmetric_encryption_unittest.cc",
      "rsa_private_key_nss_unittest,cc",
    ]
  }

  deps = [
    ":crypto",
    "//base",
    "//base:test_support_base",
    "//testing:gmock",
    "//testing:gtest",
  ]

  if (is_mac) {
    #deps += "//third_party/nss:nspr"
  }
}