Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1224)

Unified Diff: content/child/webcrypto/webcrypto_impl.cc

Issue 1077273002: html_viewer: Move webcrypto to a place where html_viewer can use it. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase to ToT Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/child/webcrypto/webcrypto_impl.h ('k') | content/child/webcrypto/webcrypto_util.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « content/child/webcrypto/webcrypto_impl.h ('k') | content/child/webcrypto/webcrypto_util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698