Index: content/child/webcrypto/webcrypto_impl.cc |
diff --git a/content/child/webcrypto/webcrypto_impl.cc b/content/child/webcrypto/webcrypto_impl.cc |
deleted file mode 100644 |
index 3270fbc006398b1e38669f75550be8e2b5007d2a..0000000000000000000000000000000000000000 |
--- a/content/child/webcrypto/webcrypto_impl.cc |
+++ /dev/null |
@@ -1,791 +0,0 @@ |
-// Copyright 2014 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 "content/child/webcrypto/webcrypto_impl.h" |
- |
-#include "base/bind.h" |
-#include "base/lazy_instance.h" |
-#include "base/location.h" |
-#include "base/logging.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/single_thread_task_runner.h" |
-#include "base/stl_util.h" |
-#include "base/task_runner.h" |
-#include "base/thread_task_runner_handle.h" |
-#include "base/threading/sequenced_worker_pool.h" |
-#include "base/threading/worker_pool.h" |
-#include "content/child/webcrypto/algorithm_dispatch.h" |
-#include "content/child/webcrypto/crypto_data.h" |
-#include "content/child/webcrypto/generate_key_result.h" |
-#include "content/child/webcrypto/status.h" |
-#include "content/child/webcrypto/webcrypto_util.h" |
-#include "third_party/WebKit/public/platform/WebCryptoKeyAlgorithm.h" |
-#include "third_party/WebKit/public/platform/WebString.h" |
- |
-namespace content { |
- |
-using webcrypto::Status; |
- |
-namespace { |
- |
-// --------------------- |
-// Threading |
-// --------------------- |
-// |
-// WebCrypto operations can be slow. For instance generating an RSA key can |
-// seconds. |
-// |
-// Moreover the underlying crypto libraries are not threadsafe when operating |
-// on the same key. |
-// |
-// The strategy used here is to run a sequenced worker pool for all WebCrypto |
-// operations (except structured cloning). This same pool is also used by |
-// requests started from Blink Web Workers. |
-// |
-// A few notes to keep in mind: |
-// |
-// * PostTaskAndReply() cannot be used for two reasons: |
-// |
-// (1) Blink web worker threads do not have an associated message loop so |
-// construction of the reply callback will crash. |
-// |
-// (2) PostTaskAndReply() handles failure posting the reply by leaking the |
-// callback, rather than destroying it. In the case of Web Workers this |
-// condition is reachable via normal execution, since Web Workers can |
-// be stopped before the WebCrypto operation has finished. A policy of |
-// leaking would therefore be problematic. |
-// |
-// * blink::WebArrayBuffer is NOT threadsafe, and should therefore be allocated |
-// on the target Blink thread. |
-// |
-// TODO(eroman): Is there any way around this? Copying the result between |
-// threads is silly. |
-// |
-// * WebCryptoAlgorithm and WebCryptoKey are threadsafe (however the key's |
-// handle(), which wraps an NSS/OpenSSL type, may not be and should only be |
-// used from the webcrypto thread). |
-// |
-// * blink::WebCryptoResult is not threadsafe and should only be operated on |
-// the target Blink thread. HOWEVER, it is safe to delete it from any thread. |
-// This can happen if by the time the operation has completed in the crypto |
-// worker pool, the Blink worker thread that initiated the request is gone. |
-// Posting back to the origin thread will fail, and the WebCryptoResult will |
-// be deleted while running in the crypto worker pool. |
-class CryptoThreadPool { |
- public: |
- CryptoThreadPool() |
- : worker_pool_(new base::SequencedWorkerPool(1, "WebCrypto")), |
- task_runner_(worker_pool_->GetSequencedTaskRunnerWithShutdownBehavior( |
- worker_pool_->GetSequenceToken(), |
- base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN)) {} |
- |
- static bool PostTask(const tracked_objects::Location& from_here, |
- const base::Closure& task); |
- |
- private: |
- scoped_refptr<base::SequencedWorkerPool> worker_pool_; |
- scoped_refptr<base::SequencedTaskRunner> task_runner_; |
-}; |
- |
-base::LazyInstance<CryptoThreadPool>::Leaky crypto_thread_pool = |
- LAZY_INSTANCE_INITIALIZER; |
- |
-bool CryptoThreadPool::PostTask(const tracked_objects::Location& from_here, |
- const base::Closure& task) { |
- return crypto_thread_pool.Get().task_runner_->PostTask(from_here, task); |
-} |
- |
-void CompleteWithThreadPoolError(blink::WebCryptoResult* result) { |
- result->completeWithError(blink::WebCryptoErrorTypeOperation, |
- "Failed posting to crypto worker pool"); |
-} |
- |
-void CompleteWithError(const Status& status, blink::WebCryptoResult* result) { |
- DCHECK(status.IsError()); |
- |
- result->completeWithError(status.error_type(), |
- blink::WebString::fromUTF8(status.error_details())); |
-} |
- |
-void CompleteWithBufferOrError(const Status& status, |
- const std::vector<uint8_t>& buffer, |
- blink::WebCryptoResult* result) { |
- if (status.IsError()) { |
- CompleteWithError(status, result); |
- } else { |
- if (buffer.size() > UINT_MAX) { |
- // WebArrayBuffers have a smaller range than std::vector<>, so |
- // theoretically this could overflow. |
- CompleteWithError(Status::ErrorUnexpected(), result); |
- } else { |
- result->completeWithBuffer(vector_as_array(&buffer), buffer.size()); |
- } |
- } |
-} |
- |
-void CompleteWithKeyOrError(const Status& status, |
- const blink::WebCryptoKey& key, |
- blink::WebCryptoResult* result) { |
- if (status.IsError()) { |
- CompleteWithError(status, result); |
- } else { |
- result->completeWithKey(key); |
- } |
-} |
- |
-// Gets a task runner for the current thread. |
-scoped_refptr<base::TaskRunner> GetCurrentBlinkThread() { |
- DCHECK(base::ThreadTaskRunnerHandle::IsSet()); |
- return base::ThreadTaskRunnerHandle::Get(); |
-} |
- |
-// -------------------------------------------------------------------- |
-// State |
-// -------------------------------------------------------------------- |
-// |
-// Explicit state classes are used rather than base::Bind(). This is done |
-// both for clarity, but also to avoid extraneous allocations for things |
-// like passing buffers and result objects between threads. |
-// |
-// BaseState is the base class common to all of the async operations, and |
-// keeps track of the thread to complete on, the error state, and the |
-// callback into Blink. |
-// |
-// Ownership of the State object is passed between the crypto thread and the |
-// Blink thread. Under normal completion it is destroyed on the Blink thread. |
-// However it may also be destroyed on the crypto thread if the Blink thread |
-// has vanished (which can happen for Blink web worker threads). |
- |
-struct BaseState { |
- explicit BaseState(const blink::WebCryptoResult& result) |
- : origin_thread(GetCurrentBlinkThread()), result(result) {} |
- |
- bool cancelled() { return result.cancelled(); } |
- |
- scoped_refptr<base::TaskRunner> origin_thread; |
- |
- webcrypto::Status status; |
- blink::WebCryptoResult result; |
- |
- protected: |
- // Since there is no virtual destructor, must not delete directly as a |
- // BaseState. |
- ~BaseState() {} |
-}; |
- |
-struct EncryptState : public BaseState { |
- EncryptState(const blink::WebCryptoAlgorithm& algorithm, |
- const blink::WebCryptoKey& key, |
- const unsigned char* data, |
- unsigned int data_size, |
- const blink::WebCryptoResult& result) |
- : BaseState(result), |
- algorithm(algorithm), |
- key(key), |
- data(data, data + data_size) {} |
- |
- const blink::WebCryptoAlgorithm algorithm; |
- const blink::WebCryptoKey key; |
- const std::vector<uint8_t> data; |
- |
- std::vector<uint8_t> buffer; |
-}; |
- |
-typedef EncryptState DecryptState; |
-typedef EncryptState DigestState; |
- |
-struct GenerateKeyState : public BaseState { |
- GenerateKeyState(const blink::WebCryptoAlgorithm& algorithm, |
- bool extractable, |
- blink::WebCryptoKeyUsageMask usages, |
- const blink::WebCryptoResult& result) |
- : BaseState(result), |
- algorithm(algorithm), |
- extractable(extractable), |
- usages(usages) {} |
- |
- const blink::WebCryptoAlgorithm algorithm; |
- const bool extractable; |
- const blink::WebCryptoKeyUsageMask usages; |
- |
- webcrypto::GenerateKeyResult generate_key_result; |
-}; |
- |
-struct ImportKeyState : public BaseState { |
- ImportKeyState(blink::WebCryptoKeyFormat format, |
- const unsigned char* key_data, |
- unsigned int key_data_size, |
- const blink::WebCryptoAlgorithm& algorithm, |
- bool extractable, |
- blink::WebCryptoKeyUsageMask usages, |
- const blink::WebCryptoResult& result) |
- : BaseState(result), |
- format(format), |
- key_data(key_data, key_data + key_data_size), |
- algorithm(algorithm), |
- extractable(extractable), |
- usages(usages) {} |
- |
- const blink::WebCryptoKeyFormat format; |
- const std::vector<uint8_t> key_data; |
- const blink::WebCryptoAlgorithm algorithm; |
- const bool extractable; |
- const blink::WebCryptoKeyUsageMask usages; |
- |
- blink::WebCryptoKey key; |
-}; |
- |
-struct ExportKeyState : public BaseState { |
- ExportKeyState(blink::WebCryptoKeyFormat format, |
- const blink::WebCryptoKey& key, |
- const blink::WebCryptoResult& result) |
- : BaseState(result), format(format), key(key) {} |
- |
- const blink::WebCryptoKeyFormat format; |
- const blink::WebCryptoKey key; |
- |
- std::vector<uint8_t> buffer; |
-}; |
- |
-typedef EncryptState SignState; |
- |
-struct VerifySignatureState : public BaseState { |
- VerifySignatureState(const blink::WebCryptoAlgorithm& algorithm, |
- const blink::WebCryptoKey& key, |
- const unsigned char* signature, |
- unsigned int signature_size, |
- const unsigned char* data, |
- unsigned int data_size, |
- const blink::WebCryptoResult& result) |
- : BaseState(result), |
- algorithm(algorithm), |
- key(key), |
- signature(signature, signature + signature_size), |
- data(data, data + data_size), |
- verify_result(false) {} |
- |
- const blink::WebCryptoAlgorithm algorithm; |
- const blink::WebCryptoKey key; |
- const std::vector<uint8_t> signature; |
- const std::vector<uint8_t> data; |
- |
- bool verify_result; |
-}; |
- |
-struct WrapKeyState : public BaseState { |
- WrapKeyState(blink::WebCryptoKeyFormat format, |
- const blink::WebCryptoKey& key, |
- const blink::WebCryptoKey& wrapping_key, |
- const blink::WebCryptoAlgorithm& wrap_algorithm, |
- const blink::WebCryptoResult& result) |
- : BaseState(result), |
- format(format), |
- key(key), |
- wrapping_key(wrapping_key), |
- wrap_algorithm(wrap_algorithm) {} |
- |
- const blink::WebCryptoKeyFormat format; |
- const blink::WebCryptoKey key; |
- const blink::WebCryptoKey wrapping_key; |
- const blink::WebCryptoAlgorithm wrap_algorithm; |
- |
- std::vector<uint8_t> buffer; |
-}; |
- |
-struct UnwrapKeyState : public BaseState { |
- UnwrapKeyState(blink::WebCryptoKeyFormat format, |
- const unsigned char* wrapped_key, |
- unsigned wrapped_key_size, |
- const blink::WebCryptoKey& wrapping_key, |
- const blink::WebCryptoAlgorithm& unwrap_algorithm, |
- const blink::WebCryptoAlgorithm& unwrapped_key_algorithm, |
- bool extractable, |
- blink::WebCryptoKeyUsageMask usages, |
- const blink::WebCryptoResult& result) |
- : BaseState(result), |
- format(format), |
- wrapped_key(wrapped_key, wrapped_key + wrapped_key_size), |
- wrapping_key(wrapping_key), |
- unwrap_algorithm(unwrap_algorithm), |
- unwrapped_key_algorithm(unwrapped_key_algorithm), |
- extractable(extractable), |
- usages(usages) {} |
- |
- const blink::WebCryptoKeyFormat format; |
- const std::vector<uint8_t> wrapped_key; |
- const blink::WebCryptoKey wrapping_key; |
- const blink::WebCryptoAlgorithm unwrap_algorithm; |
- const blink::WebCryptoAlgorithm unwrapped_key_algorithm; |
- const bool extractable; |
- const blink::WebCryptoKeyUsageMask usages; |
- |
- blink::WebCryptoKey unwrapped_key; |
-}; |
- |
-struct DeriveBitsState : public BaseState { |
- DeriveBitsState(const blink::WebCryptoAlgorithm& algorithm, |
- const blink::WebCryptoKey& base_key, |
- unsigned int length_bits, |
- const blink::WebCryptoResult& result) |
- : BaseState(result), |
- algorithm(algorithm), |
- base_key(base_key), |
- length_bits(length_bits) {} |
- |
- const blink::WebCryptoAlgorithm algorithm; |
- const blink::WebCryptoKey base_key; |
- const unsigned int length_bits; |
- |
- std::vector<uint8_t> derived_bytes; |
-}; |
- |
-struct DeriveKeyState : public BaseState { |
- DeriveKeyState(const blink::WebCryptoAlgorithm& algorithm, |
- const blink::WebCryptoKey& base_key, |
- const blink::WebCryptoAlgorithm& import_algorithm, |
- const blink::WebCryptoAlgorithm& key_length_algorithm, |
- bool extractable, |
- blink::WebCryptoKeyUsageMask usages, |
- const blink::WebCryptoResult& result) |
- : BaseState(result), |
- algorithm(algorithm), |
- base_key(base_key), |
- import_algorithm(import_algorithm), |
- key_length_algorithm(key_length_algorithm), |
- extractable(extractable), |
- usages(usages) {} |
- |
- const blink::WebCryptoAlgorithm algorithm; |
- const blink::WebCryptoKey base_key; |
- const blink::WebCryptoAlgorithm import_algorithm; |
- const blink::WebCryptoAlgorithm key_length_algorithm; |
- bool extractable; |
- blink::WebCryptoKeyUsageMask usages; |
- |
- blink::WebCryptoKey derived_key; |
-}; |
- |
-// -------------------------------------------------------------------- |
-// Wrapper functions |
-// -------------------------------------------------------------------- |
-// |
-// * The methods named Do*() run on the crypto thread. |
-// * The methods named Do*Reply() run on the target Blink thread |
- |
-void DoEncryptReply(scoped_ptr<EncryptState> state) { |
- CompleteWithBufferOrError(state->status, state->buffer, &state->result); |
-} |
- |
-void DoEncrypt(scoped_ptr<EncryptState> passed_state) { |
- EncryptState* state = passed_state.get(); |
- if (state->cancelled()) |
- return; |
- state->status = |
- webcrypto::Encrypt(state->algorithm, state->key, |
- webcrypto::CryptoData(state->data), &state->buffer); |
- state->origin_thread->PostTask( |
- FROM_HERE, base::Bind(DoEncryptReply, Passed(&passed_state))); |
-} |
- |
-void DoDecryptReply(scoped_ptr<DecryptState> state) { |
- CompleteWithBufferOrError(state->status, state->buffer, &state->result); |
-} |
- |
-void DoDecrypt(scoped_ptr<DecryptState> passed_state) { |
- DecryptState* state = passed_state.get(); |
- if (state->cancelled()) |
- return; |
- state->status = |
- webcrypto::Decrypt(state->algorithm, state->key, |
- webcrypto::CryptoData(state->data), &state->buffer); |
- state->origin_thread->PostTask( |
- FROM_HERE, base::Bind(DoDecryptReply, Passed(&passed_state))); |
-} |
- |
-void DoDigestReply(scoped_ptr<DigestState> state) { |
- CompleteWithBufferOrError(state->status, state->buffer, &state->result); |
-} |
- |
-void DoDigest(scoped_ptr<DigestState> passed_state) { |
- DigestState* state = passed_state.get(); |
- if (state->cancelled()) |
- return; |
- state->status = webcrypto::Digest( |
- state->algorithm, webcrypto::CryptoData(state->data), &state->buffer); |
- state->origin_thread->PostTask( |
- FROM_HERE, base::Bind(DoDigestReply, Passed(&passed_state))); |
-} |
- |
-void DoGenerateKeyReply(scoped_ptr<GenerateKeyState> state) { |
- if (state->status.IsError()) { |
- CompleteWithError(state->status, &state->result); |
- } else { |
- state->generate_key_result.Complete(&state->result); |
- } |
-} |
- |
-void DoGenerateKey(scoped_ptr<GenerateKeyState> passed_state) { |
- GenerateKeyState* state = passed_state.get(); |
- if (state->cancelled()) |
- return; |
- state->status = |
- webcrypto::GenerateKey(state->algorithm, state->extractable, |
- state->usages, &state->generate_key_result); |
- state->origin_thread->PostTask( |
- FROM_HERE, base::Bind(DoGenerateKeyReply, Passed(&passed_state))); |
-} |
- |
-void DoImportKeyReply(scoped_ptr<ImportKeyState> state) { |
- CompleteWithKeyOrError(state->status, state->key, &state->result); |
-} |
- |
-void DoImportKey(scoped_ptr<ImportKeyState> passed_state) { |
- ImportKeyState* state = passed_state.get(); |
- if (state->cancelled()) |
- return; |
- state->status = webcrypto::ImportKey( |
- state->format, webcrypto::CryptoData(state->key_data), state->algorithm, |
- state->extractable, state->usages, &state->key); |
- if (state->status.IsSuccess()) { |
- DCHECK(state->key.handle()); |
- DCHECK(!state->key.algorithm().isNull()); |
- DCHECK_EQ(state->extractable, state->key.extractable()); |
- } |
- |
- state->origin_thread->PostTask( |
- FROM_HERE, base::Bind(DoImportKeyReply, Passed(&passed_state))); |
-} |
- |
-void DoExportKeyReply(scoped_ptr<ExportKeyState> state) { |
- if (state->format != blink::WebCryptoKeyFormatJwk) { |
- CompleteWithBufferOrError(state->status, state->buffer, &state->result); |
- return; |
- } |
- |
- if (state->status.IsError()) { |
- CompleteWithError(state->status, &state->result); |
- } else { |
- state->result.completeWithJson( |
- reinterpret_cast<const char*>(vector_as_array(&state->buffer)), |
- state->buffer.size()); |
- } |
-} |
- |
-void DoExportKey(scoped_ptr<ExportKeyState> passed_state) { |
- ExportKeyState* state = passed_state.get(); |
- if (state->cancelled()) |
- return; |
- state->status = |
- webcrypto::ExportKey(state->format, state->key, &state->buffer); |
- state->origin_thread->PostTask( |
- FROM_HERE, base::Bind(DoExportKeyReply, Passed(&passed_state))); |
-} |
- |
-void DoSignReply(scoped_ptr<SignState> state) { |
- CompleteWithBufferOrError(state->status, state->buffer, &state->result); |
-} |
- |
-void DoSign(scoped_ptr<SignState> passed_state) { |
- SignState* state = passed_state.get(); |
- if (state->cancelled()) |
- return; |
- state->status = |
- webcrypto::Sign(state->algorithm, state->key, |
- webcrypto::CryptoData(state->data), &state->buffer); |
- |
- state->origin_thread->PostTask( |
- FROM_HERE, base::Bind(DoSignReply, Passed(&passed_state))); |
-} |
- |
-void DoVerifyReply(scoped_ptr<VerifySignatureState> state) { |
- if (state->status.IsError()) { |
- CompleteWithError(state->status, &state->result); |
- } else { |
- state->result.completeWithBoolean(state->verify_result); |
- } |
-} |
- |
-void DoVerify(scoped_ptr<VerifySignatureState> passed_state) { |
- VerifySignatureState* state = passed_state.get(); |
- if (state->cancelled()) |
- return; |
- state->status = webcrypto::Verify( |
- state->algorithm, state->key, webcrypto::CryptoData(state->signature), |
- webcrypto::CryptoData(state->data), &state->verify_result); |
- |
- state->origin_thread->PostTask( |
- FROM_HERE, base::Bind(DoVerifyReply, Passed(&passed_state))); |
-} |
- |
-void DoWrapKeyReply(scoped_ptr<WrapKeyState> state) { |
- CompleteWithBufferOrError(state->status, state->buffer, &state->result); |
-} |
- |
-void DoWrapKey(scoped_ptr<WrapKeyState> passed_state) { |
- WrapKeyState* state = passed_state.get(); |
- if (state->cancelled()) |
- return; |
- state->status = |
- webcrypto::WrapKey(state->format, state->key, state->wrapping_key, |
- state->wrap_algorithm, &state->buffer); |
- |
- state->origin_thread->PostTask( |
- FROM_HERE, base::Bind(DoWrapKeyReply, Passed(&passed_state))); |
-} |
- |
-void DoUnwrapKeyReply(scoped_ptr<UnwrapKeyState> state) { |
- CompleteWithKeyOrError(state->status, state->unwrapped_key, &state->result); |
-} |
- |
-void DoUnwrapKey(scoped_ptr<UnwrapKeyState> passed_state) { |
- UnwrapKeyState* state = passed_state.get(); |
- if (state->cancelled()) |
- return; |
- state->status = webcrypto::UnwrapKey( |
- state->format, webcrypto::CryptoData(state->wrapped_key), |
- state->wrapping_key, state->unwrap_algorithm, |
- state->unwrapped_key_algorithm, state->extractable, state->usages, |
- &state->unwrapped_key); |
- |
- state->origin_thread->PostTask( |
- FROM_HERE, base::Bind(DoUnwrapKeyReply, Passed(&passed_state))); |
-} |
- |
-void DoDeriveBitsReply(scoped_ptr<DeriveBitsState> state) { |
- CompleteWithBufferOrError(state->status, state->derived_bytes, |
- &state->result); |
-} |
- |
-void DoDeriveBits(scoped_ptr<DeriveBitsState> passed_state) { |
- DeriveBitsState* state = passed_state.get(); |
- if (state->cancelled()) |
- return; |
- state->status = |
- webcrypto::DeriveBits(state->algorithm, state->base_key, |
- state->length_bits, &state->derived_bytes); |
- state->origin_thread->PostTask( |
- FROM_HERE, base::Bind(DoDeriveBitsReply, Passed(&passed_state))); |
-} |
- |
-void DoDeriveKeyReply(scoped_ptr<DeriveKeyState> state) { |
- CompleteWithKeyOrError(state->status, state->derived_key, &state->result); |
-} |
- |
-void DoDeriveKey(scoped_ptr<DeriveKeyState> passed_state) { |
- DeriveKeyState* state = passed_state.get(); |
- if (state->cancelled()) |
- return; |
- state->status = webcrypto::DeriveKey( |
- state->algorithm, state->base_key, state->import_algorithm, |
- state->key_length_algorithm, state->extractable, state->usages, |
- &state->derived_key); |
- state->origin_thread->PostTask( |
- FROM_HERE, base::Bind(DoDeriveKeyReply, Passed(&passed_state))); |
-} |
- |
-} // namespace |
- |
-WebCryptoImpl::WebCryptoImpl() { |
-} |
- |
-WebCryptoImpl::~WebCryptoImpl() { |
-} |
- |
-void WebCryptoImpl::encrypt(const blink::WebCryptoAlgorithm& algorithm, |
- const blink::WebCryptoKey& key, |
- const unsigned char* data, |
- unsigned int data_size, |
- blink::WebCryptoResult result) { |
- DCHECK(!algorithm.isNull()); |
- |
- scoped_ptr<EncryptState> state( |
- new EncryptState(algorithm, key, data, data_size, result)); |
- if (!CryptoThreadPool::PostTask(FROM_HERE, |
- base::Bind(DoEncrypt, Passed(&state)))) { |
- CompleteWithThreadPoolError(&result); |
- } |
-} |
- |
-void WebCryptoImpl::decrypt(const blink::WebCryptoAlgorithm& algorithm, |
- const blink::WebCryptoKey& key, |
- const unsigned char* data, |
- unsigned int data_size, |
- blink::WebCryptoResult result) { |
- DCHECK(!algorithm.isNull()); |
- |
- scoped_ptr<DecryptState> state( |
- new DecryptState(algorithm, key, data, data_size, result)); |
- if (!CryptoThreadPool::PostTask(FROM_HERE, |
- base::Bind(DoDecrypt, Passed(&state)))) { |
- CompleteWithThreadPoolError(&result); |
- } |
-} |
- |
-void WebCryptoImpl::digest(const blink::WebCryptoAlgorithm& algorithm, |
- const unsigned char* data, |
- unsigned int data_size, |
- blink::WebCryptoResult result) { |
- DCHECK(!algorithm.isNull()); |
- |
- scoped_ptr<DigestState> state(new DigestState( |
- algorithm, blink::WebCryptoKey::createNull(), data, data_size, result)); |
- if (!CryptoThreadPool::PostTask(FROM_HERE, |
- base::Bind(DoDigest, Passed(&state)))) { |
- CompleteWithThreadPoolError(&result); |
- } |
-} |
- |
-void WebCryptoImpl::generateKey(const blink::WebCryptoAlgorithm& algorithm, |
- bool extractable, |
- blink::WebCryptoKeyUsageMask usages, |
- blink::WebCryptoResult result) { |
- DCHECK(!algorithm.isNull()); |
- |
- scoped_ptr<GenerateKeyState> state( |
- new GenerateKeyState(algorithm, extractable, usages, result)); |
- if (!CryptoThreadPool::PostTask(FROM_HERE, |
- base::Bind(DoGenerateKey, Passed(&state)))) { |
- CompleteWithThreadPoolError(&result); |
- } |
-} |
- |
-void WebCryptoImpl::importKey(blink::WebCryptoKeyFormat format, |
- const unsigned char* key_data, |
- unsigned int key_data_size, |
- const blink::WebCryptoAlgorithm& algorithm, |
- bool extractable, |
- blink::WebCryptoKeyUsageMask usages, |
- blink::WebCryptoResult result) { |
- scoped_ptr<ImportKeyState> state(new ImportKeyState( |
- format, key_data, key_data_size, algorithm, extractable, usages, result)); |
- if (!CryptoThreadPool::PostTask(FROM_HERE, |
- base::Bind(DoImportKey, Passed(&state)))) { |
- CompleteWithThreadPoolError(&result); |
- } |
-} |
- |
-void WebCryptoImpl::exportKey(blink::WebCryptoKeyFormat format, |
- const blink::WebCryptoKey& key, |
- blink::WebCryptoResult result) { |
- scoped_ptr<ExportKeyState> state(new ExportKeyState(format, key, result)); |
- if (!CryptoThreadPool::PostTask(FROM_HERE, |
- base::Bind(DoExportKey, Passed(&state)))) { |
- CompleteWithThreadPoolError(&result); |
- } |
-} |
- |
-void WebCryptoImpl::sign(const blink::WebCryptoAlgorithm& algorithm, |
- const blink::WebCryptoKey& key, |
- const unsigned char* data, |
- unsigned int data_size, |
- blink::WebCryptoResult result) { |
- scoped_ptr<SignState> state( |
- new SignState(algorithm, key, data, data_size, result)); |
- if (!CryptoThreadPool::PostTask(FROM_HERE, |
- base::Bind(DoSign, Passed(&state)))) { |
- CompleteWithThreadPoolError(&result); |
- } |
-} |
- |
-void WebCryptoImpl::verifySignature(const blink::WebCryptoAlgorithm& algorithm, |
- const blink::WebCryptoKey& key, |
- const unsigned char* signature, |
- unsigned int signature_size, |
- const unsigned char* data, |
- unsigned int data_size, |
- blink::WebCryptoResult result) { |
- scoped_ptr<VerifySignatureState> state(new VerifySignatureState( |
- algorithm, key, signature, signature_size, data, data_size, result)); |
- if (!CryptoThreadPool::PostTask(FROM_HERE, |
- base::Bind(DoVerify, Passed(&state)))) { |
- CompleteWithThreadPoolError(&result); |
- } |
-} |
- |
-void WebCryptoImpl::wrapKey(blink::WebCryptoKeyFormat format, |
- const blink::WebCryptoKey& key, |
- const blink::WebCryptoKey& wrapping_key, |
- const blink::WebCryptoAlgorithm& wrap_algorithm, |
- blink::WebCryptoResult result) { |
- scoped_ptr<WrapKeyState> state( |
- new WrapKeyState(format, key, wrapping_key, wrap_algorithm, result)); |
- if (!CryptoThreadPool::PostTask(FROM_HERE, |
- base::Bind(DoWrapKey, Passed(&state)))) { |
- CompleteWithThreadPoolError(&result); |
- } |
-} |
- |
-void WebCryptoImpl::unwrapKey( |
- blink::WebCryptoKeyFormat format, |
- const unsigned char* wrapped_key, |
- unsigned wrapped_key_size, |
- const blink::WebCryptoKey& wrapping_key, |
- const blink::WebCryptoAlgorithm& unwrap_algorithm, |
- const blink::WebCryptoAlgorithm& unwrapped_key_algorithm, |
- bool extractable, |
- blink::WebCryptoKeyUsageMask usages, |
- blink::WebCryptoResult result) { |
- scoped_ptr<UnwrapKeyState> state(new UnwrapKeyState( |
- format, wrapped_key, wrapped_key_size, wrapping_key, unwrap_algorithm, |
- unwrapped_key_algorithm, extractable, usages, result)); |
- if (!CryptoThreadPool::PostTask(FROM_HERE, |
- base::Bind(DoUnwrapKey, Passed(&state)))) { |
- CompleteWithThreadPoolError(&result); |
- } |
-} |
- |
-void WebCryptoImpl::deriveBits(const blink::WebCryptoAlgorithm& algorithm, |
- const blink::WebCryptoKey& base_key, |
- unsigned int length_bits, |
- blink::WebCryptoResult result) { |
- scoped_ptr<DeriveBitsState> state( |
- new DeriveBitsState(algorithm, base_key, length_bits, result)); |
- if (!CryptoThreadPool::PostTask(FROM_HERE, |
- base::Bind(DoDeriveBits, Passed(&state)))) { |
- CompleteWithThreadPoolError(&result); |
- } |
-} |
- |
-void WebCryptoImpl::deriveKey( |
- const blink::WebCryptoAlgorithm& algorithm, |
- const blink::WebCryptoKey& base_key, |
- const blink::WebCryptoAlgorithm& import_algorithm, |
- const blink::WebCryptoAlgorithm& key_length_algorithm, |
- bool extractable, |
- blink::WebCryptoKeyUsageMask usages, |
- blink::WebCryptoResult result) { |
- scoped_ptr<DeriveKeyState> state( |
- new DeriveKeyState(algorithm, base_key, import_algorithm, |
- key_length_algorithm, extractable, usages, result)); |
- if (!CryptoThreadPool::PostTask(FROM_HERE, |
- base::Bind(DoDeriveKey, Passed(&state)))) { |
- CompleteWithThreadPoolError(&result); |
- } |
-} |
- |
-blink::WebCryptoDigestor* WebCryptoImpl::createDigestor( |
- blink::WebCryptoAlgorithmId algorithm_id) { |
- return webcrypto::CreateDigestor(algorithm_id).release(); |
-} |
- |
-bool WebCryptoImpl::deserializeKeyForClone( |
- const blink::WebCryptoKeyAlgorithm& algorithm, |
- blink::WebCryptoKeyType type, |
- bool extractable, |
- blink::WebCryptoKeyUsageMask usages, |
- const unsigned char* key_data, |
- unsigned key_data_size, |
- blink::WebCryptoKey& key) { |
- return webcrypto::DeserializeKeyForClone( |
- algorithm, type, extractable, usages, |
- webcrypto::CryptoData(key_data, key_data_size), &key); |
-} |
- |
-bool WebCryptoImpl::serializeKeyForClone( |
- const blink::WebCryptoKey& key, |
- blink::WebVector<unsigned char>& key_data) { |
- return webcrypto::SerializeKeyForClone(key, &key_data); |
-} |
- |
-} // namespace content |