// 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 <string>
#include <utility>

#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<ThreadedSSLPrivateKey>& key,
                SSLPrivateKey::SignCallback callback,
                std::vector<uint8_t>* signature,
                Error error) {
  if (!key)
    return;
  std::move(callback).Run(error, *signature);
}

}  // anonymous namespace

class ThreadedSSLPrivateKey::Core
    : public base::RefCountedThreadSafe<ThreadedSSLPrivateKey::Core> {
 public:
  Core(std::unique_ptr<ThreadedSSLPrivateKey::Delegate> delegate)
      : delegate_(std::move(delegate)) {}

  ThreadedSSLPrivateKey::Delegate* delegate() { return delegate_.get(); }

  Error Sign(uint16_t algorithm,
#if defined(STARBOARD)
             const std::vector<uint8_t>& input,
             std::vector<uint8_t>* signature) {
    return delegate_->Sign(
        algorithm, base::span<const uint8_t>(input.data(), input.size()),
        signature);
#else
             base::span<const uint8_t> input,
             std::vector<uint8_t>* signature) {
    return delegate_->Sign(algorithm, input, signature);
#endif
  }

 private:
  friend class base::RefCountedThreadSafe<Core>;
  ~Core() = default;

  std::unique_ptr<ThreadedSSLPrivateKey::Delegate> delegate_;
};

ThreadedSSLPrivateKey::ThreadedSSLPrivateKey(
    std::unique_ptr<ThreadedSSLPrivateKey::Delegate> delegate,
    scoped_refptr<base::SingleThreadTaskRunner> task_runner)
    : core_(new Core(std::move(delegate))),
      task_runner_(std::move(task_runner)),
      weak_factory_(this) {}

std::vector<uint16_t> ThreadedSSLPrivateKey::GetAlgorithmPreferences() {
  return core_->delegate()->GetAlgorithmPreferences();
}

void ThreadedSSLPrivateKey::Sign(uint16_t algorithm,
                                 base::span<const uint8_t> input,
                                 SSLPrivateKey::SignCallback callback) {
  std::vector<uint8_t>* signature = new std::vector<uint8_t>;
  base::PostTaskAndReplyWithResult(
      task_runner_.get(), FROM_HERE,
      base::BindOnce(&ThreadedSSLPrivateKey::Core::Sign, core_, algorithm,
                     std::vector<uint8_t>(input.begin(), input.end()),
                     base::Unretained(signature)),
      base::BindOnce(&DoCallback, weak_factory_.GetWeakPtr(),
                     std::move(callback), base::Owned(signature)));
}

ThreadedSSLPrivateKey::~ThreadedSSLPrivateKey() = default;

}  // namespace net
