// 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. #include "net/ssl/threaded_ssl_private_key.h" #include #include #include "base/bind.h" #include "base/location.h" #include "base/single_thread_task_runner.h" #include "base/task_runner_util.h" #include "base/threading/thread_task_runner_handle.h" namespace net { namespace { void DoCallback(const base::WeakPtr& key, const ThreadedSSLPrivateKey::SignCallback& callback, std::vector* signature, Error error) { if (!key) return; callback.Run(error, *signature); } } // anonymous namespace class ThreadedSSLPrivateKey::Core : public base::RefCountedThreadSafe { public: Core(std::unique_ptr delegate) : delegate_(std::move(delegate)) {} ThreadedSSLPrivateKey::Delegate* delegate() { return delegate_.get(); } Error Sign(uint16_t algorithm, base::span input, std::vector* signature) { return delegate_->Sign(algorithm, input, signature); } private: friend class base::RefCountedThreadSafe; ~Core() = default; std::unique_ptr delegate_; }; ThreadedSSLPrivateKey::ThreadedSSLPrivateKey( std::unique_ptr delegate, scoped_refptr task_runner) : core_(new Core(std::move(delegate))), task_runner_(std::move(task_runner)), weak_factory_(this) {} std::vector ThreadedSSLPrivateKey::GetAlgorithmPreferences() { return core_->delegate()->GetAlgorithmPreferences(); } void ThreadedSSLPrivateKey::Sign(uint16_t algorithm, base::span input, const SSLPrivateKey::SignCallback& callback) { std::vector* signature = new std::vector; base::PostTaskAndReplyWithResult( task_runner_.get(), FROM_HERE, base::Bind(&ThreadedSSLPrivateKey::Core::Sign, core_, algorithm, std::vector(input.begin(), input.end()), base::Unretained(signature)), base::Bind(&DoCallback, weak_factory_.GetWeakPtr(), callback, base::Owned(signature))); } ThreadedSSLPrivateKey::~ThreadedSSLPrivateKey() = default; } // namespace net