# Copyright 2015 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("//testing/test.gni")
import("//testing/libfuzzer/fuzzer_test.gni")

static_library("webcrypto") {
  sources = [
    "algorithm_dispatch.cc",
    "algorithm_dispatch.h",
    "algorithm_implementation.cc",
    "algorithm_implementation.h",
    "algorithm_implementations.h",
    "algorithm_registry.cc",
    "algorithm_registry.h",
    "algorithms/aes.cc",
    "algorithms/aes.h",
    "algorithms/aes_cbc.cc",
    "algorithms/aes_ctr.cc",
    "algorithms/aes_gcm.cc",
    "algorithms/aes_kw.cc",
    "algorithms/asymmetric_key_util.cc",
    "algorithms/asymmetric_key_util.h",
    "algorithms/ec.cc",
    "algorithms/ec.h",
    "algorithms/ecdh.cc",
    "algorithms/ecdsa.cc",
    "algorithms/hkdf.cc",
    "algorithms/hmac.cc",
    "algorithms/pbkdf2.cc",
    "algorithms/rsa.cc",
    "algorithms/rsa.h",
    "algorithms/rsa_oaep.cc",
    "algorithms/rsa_pss.cc",
    "algorithms/rsa_sign.cc",
    "algorithms/rsa_sign.h",
    "algorithms/rsa_ssa.cc",
    "algorithms/secret_key_util.cc",
    "algorithms/secret_key_util.h",
    "algorithms/sha.cc",
    "algorithms/util.cc",
    "algorithms/util.h",
    "blink_key_handle.cc",
    "blink_key_handle.h",
    "crypto_data.cc",
    "crypto_data.h",
    "generate_key_result.cc",
    "generate_key_result.h",
    "jwk.cc",
    "jwk.h",
    "status.cc",
    "status.h",
    "webcrypto_impl.cc",
    "webcrypto_impl.h",
  ]

  deps = [
    "//base",
    "//crypto",
    "//crypto:platform",
    "//third_party/WebKit/public:blink_headers",
  ]
}

source_set("unit_tests") {
  testonly = true
  sources = [
    "algorithms/aes_cbc_unittest.cc",
    "algorithms/aes_ctr_unittest.cc",
    "algorithms/aes_gcm_unittest.cc",
    "algorithms/aes_kw_unittest.cc",
    "algorithms/ecdh_unittest.cc",
    "algorithms/ecdsa_unittest.cc",
    "algorithms/hmac_unittest.cc",
    "algorithms/rsa_oaep_unittest.cc",
    "algorithms/rsa_pss_unittest.cc",
    "algorithms/rsa_ssa_unittest.cc",
    "algorithms/sha_unittest.cc",
    "algorithms/test_helpers.cc",
    "algorithms/test_helpers.h",
    "status_unittest.cc",
  ]

  deps = [
    ":webcrypto",
    "//base/test:test_support",
    "//crypto",
    "//crypto:platform",
    "//testing/gtest",
    "//testing/perf",
    "//third_party/WebKit/public:blink",
    "//third_party/re2",
  ]
}

# Shared functionality for writing WebCrypto fuzzers at this layer (several
# things need to be done to initialize Blink and pull in the right
# dependencies).
source_set("fuzzer_support") {
  testonly = true

  sources = [
    "fuzzer_support.cc",
    "fuzzer_support.h",
  ]
  deps = [
    ":webcrypto",
    "//base",
    "//crypto",
    "//crypto:platform",
    "//mojo/edk/system",
    "//third_party/WebKit/public:blink",
  ]
}

# Tests the import of PKCS8 formatted EC keys.
fuzzer_test("webcrypto_ec_import_key_pkcs8_fuzzer") {
  sources = [
    "ec_import_key_pkcs8_fuzzer.cc",
  ]
  deps = [
    ":fuzzer_support",
    ":webcrypto",
    "//third_party/WebKit/public:blink_headers",
  ]
}

# Tests the import of SPKI formatted EC keys.
fuzzer_test("webcrypto_ec_import_key_spki_fuzzer") {
  sources = [
    "ec_import_key_spki_fuzzer.cc",
  ]
  deps = [
    ":fuzzer_support",
    ":webcrypto",
    "//third_party/WebKit/public:blink_headers",
  ]
}

# Tests the import of raw (X9.62) formatted EC keys.
fuzzer_test("webcrypto_ec_import_key_raw_fuzzer") {
  sources = [
    "ec_import_key_raw_fuzzer.cc",
  ]
  deps = [
    ":fuzzer_support",
    ":webcrypto",
    "//third_party/WebKit/public:blink_headers",
  ]
}

# Tests the import of PKCS8 formatted RSA keys.
fuzzer_test("webcrypto_rsa_import_key_pkcs8_fuzzer") {
  sources = [
    "rsa_import_key_pkcs8_fuzzer.cc",
  ]
  deps = [
    ":fuzzer_support",
    ":webcrypto",
    "//third_party/WebKit/public:blink_headers",
  ]
}

# Tests the import of SPKI formatted RSA keys.
fuzzer_test("webcrypto_rsa_import_key_spki_fuzzer") {
  sources = [
    "rsa_import_key_spki_fuzzer.cc",
  ]
  deps = [
    ":fuzzer_support",
    ":webcrypto",
    "//third_party/WebKit/public:blink_headers",
  ]
}
