Index: components/webcrypto/fuzzer_support.cc |
diff --git a/components/webcrypto/fuzzer_support.cc b/components/webcrypto/fuzzer_support.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f44f8bc3f228f9c614c94dec5fdea1b112dd0061 |
--- /dev/null |
+++ b/components/webcrypto/fuzzer_support.cc |
@@ -0,0 +1,131 @@ |
+// Copyright 2016 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 "components/webcrypto/fuzzer_support.h" |
+ |
+#include "base/command_line.h" |
+#include "base/lazy_instance.h" |
+#include "components/test_runner/test_common.h" |
+#include "components/webcrypto/algorithm_dispatch.h" |
+#include "components/webcrypto/crypto_data.h" |
+#include "components/webcrypto/status.h" |
+#include "third_party/WebKit/public/platform/WebCryptoAlgorithmParams.h" |
+ |
+namespace webcrypto { |
+ |
+namespace { |
+ |
+// This mock is used to initialize blink. |
+class InitOnce { |
+ public: |
+ InitOnce() { |
+ // EnsureBlinkInitialized() depends on the command line singleton being |
+ // initialized. |
+ base::CommandLine::Init(0, nullptr); |
+ test_runner::EnsureBlinkInitialized(); |
+ } |
+}; |
+ |
+base::LazyInstance<InitOnce>::Leaky g_once = LAZY_INSTANCE_INITIALIZER; |
+ |
+void EnsureInitialized() { |
+ g_once.Get(); |
+} |
+ |
+blink::WebCryptoAlgorithm CreateRsaHashedImportAlgorithm( |
+ blink::WebCryptoAlgorithmId id, |
+ blink::WebCryptoAlgorithmId hash_id) { |
+ DCHECK(blink::WebCryptoAlgorithm::isHash(hash_id)); |
+ return blink::WebCryptoAlgorithm::adoptParamsAndCreate( |
+ id, |
+ new blink::WebCryptoRsaHashedImportParams( |
+ blink::WebCryptoAlgorithm::adoptParamsAndCreate(hash_id, nullptr))); |
+} |
+ |
+blink::WebCryptoAlgorithm CreateEcImportAlgorithm( |
+ blink::WebCryptoAlgorithmId id, |
+ blink::WebCryptoNamedCurve named_curve) { |
+ return blink::WebCryptoAlgorithm::adoptParamsAndCreate( |
+ id, new blink::WebCryptoEcKeyImportParams(named_curve)); |
+} |
+ |
+} // namespace |
+ |
+blink::WebCryptoKeyUsageMask GetCompatibleKeyUsages( |
+ blink::WebCryptoKeyFormat format) { |
+ // SPKI format implies import of a public key, whereas PKCS8 implies import |
+ // of a private key. Pick usages that are compatible with a signature |
+ // algorithm. |
+ return format == blink::WebCryptoKeyFormatSpki |
+ ? blink::WebCryptoKeyUsageVerify |
+ : blink::WebCryptoKeyUsageSign; |
+} |
+ |
+void ImportEcKeyFromDerFuzzData(const uint8_t* data, |
+ size_t size, |
+ blink::WebCryptoKeyFormat format) { |
+ DCHECK(format == blink::WebCryptoKeyFormatSpki || |
+ format == blink::WebCryptoKeyFormatPkcs8); |
+ EnsureInitialized(); |
+ |
+ // There are 3 possible EC named curves. Fix this parameter. It shouldn't |
+ // matter based on the current implementation for PKCS8 or SPKI. But it |
+ // will have an impact when parsing JWK format. |
+ blink::WebCryptoNamedCurve curve = blink::WebCryptoNamedCurveP384; |
+ |
+ // Always use ECDSA as the algorithm. Shouldn't make much difference for |
+ // non-JWK formats. |
+ blink::WebCryptoAlgorithmId algorithm_id = blink::WebCryptoAlgorithmIdEcdsa; |
+ |
+ // Use key usages that are compatible with the chosen algorithm and key type. |
+ blink::WebCryptoKeyUsageMask usages = GetCompatibleKeyUsages(format); |
+ |
+ blink::WebCryptoKey key; |
+ webcrypto::Status status = webcrypto::ImportKey( |
+ format, webcrypto::CryptoData(data, size), |
+ CreateEcImportAlgorithm(algorithm_id, curve), true, usages, &key); |
+ |
+ // These errors imply a bad setup of parameters, and means ImportKey() may not |
+ // be testing the actual parsing. |
+ DCHECK_NE(status.error_details(), |
+ Status::ErrorUnsupportedImportKeyFormat().error_details()); |
+ DCHECK_NE(status.error_details(), |
+ Status::ErrorCreateKeyBadUsages().error_details()); |
+} |
+ |
+void ImportRsaKeyFromDerFuzzData(const uint8_t* data, |
+ size_t size, |
+ blink::WebCryptoKeyFormat format) { |
+ DCHECK(format == blink::WebCryptoKeyFormatSpki || |
+ format == blink::WebCryptoKeyFormatPkcs8); |
+ EnsureInitialized(); |
+ |
+ // There are several possible hash functions. Fix this parameter. It shouldn't |
+ // matter based on the current implementation for PKCS8 or SPKI. But it |
+ // will have an impact when parsing JWK format. |
+ blink::WebCryptoAlgorithmId hash_id = blink::WebCryptoAlgorithmIdSha256; |
+ |
+ // Always use RSA-SSA PKCS#1 as the algorithm. Shouldn't make much difference |
+ // for non-JWK formats. |
+ blink::WebCryptoAlgorithmId algorithm_id = |
+ blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5; |
+ |
+ // Use key usages that are compatible with the chosen algorithm and key type. |
+ blink::WebCryptoKeyUsageMask usages = GetCompatibleKeyUsages(format); |
+ |
+ blink::WebCryptoKey key; |
+ webcrypto::Status status = webcrypto::ImportKey( |
+ format, webcrypto::CryptoData(data, size), |
+ CreateRsaHashedImportAlgorithm(algorithm_id, hash_id), true, usages, |
+ &key); |
+ |
+ // These errors imply a bad setup of parameters, and means ImportKey() may not |
+ // be testing the actual parsing. |
+ DCHECK_NE(status.error_details(), |
+ Status::ErrorUnsupportedImportKeyFormat().error_details()); |
+ DCHECK_NE(status.error_details(), |
+ Status::ErrorCreateKeyBadUsages().error_details()); |
+} |
+ |
+} // namespace webcrypto |