// Copyright 2011 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chaps/chaps_proxy.h"

#include <utility>

#include <base/logging.h>
#include <base/memory/ptr_util.h>
#include <base/memory/ref_counted.h>
#include <brillo/dbus/dbus_method_invoker.h>
#include <dbus/message.h>
#include <dbus/object_path.h>

#include "base/functional/callback_helpers.h"
#include "chaps/chaps.h"
#include "chaps/chaps_utility.h"
#include "chaps/isolate.h"
#include "pkcs11/cryptoki.h"

using brillo::Blob;
using brillo::SecureBlob;
using brillo::dbus_utils::ExtractMethodCallResults;
using std::string;
using std::vector;

namespace {

// 5 minutes, since some security element operations can take a while.
constexpr base::TimeDelta kDBusTimeout = base::Minutes(5);

// TODO(yich): We should remove this after chromeos-dbus-binding support
// SecureBlob.
inline const Blob ToBlob(const SecureBlob& blob) {
  return Blob(blob.begin(), blob.end());
}

// We need to be able to shadow AtExitManagers because we don't know if the
// caller has an AtExitManager already or not (on Chrome it might, but on Linux
// it probably won't).
class ProxyAtExitManager : public base::AtExitManager {
 public:
  ProxyAtExitManager() : AtExitManager(true) {}
  ProxyAtExitManager(const ProxyAtExitManager&) = delete;
  ProxyAtExitManager& operator=(const ProxyAtExitManager&) = delete;
};

}  // namespace

namespace chaps {

// Below is the real implementation.

ChapsProxyImpl::ChapsProxyImpl(std::unique_ptr<base::AtExitManager> at_exit)
    : at_exit_(std::move(at_exit)) {}

ChapsProxyImpl::~ChapsProxyImpl() {}

// static
std::unique_ptr<ChapsProxyImpl> ChapsProxyImpl::Create(bool shadow_at_exit,
                                                       ThreadingMode mode) {
  std::unique_ptr<base::AtExitManager> at_exit;
  if (shadow_at_exit) {
    at_exit = std::make_unique<ProxyAtExitManager>();
  }

  auto chaps_proxy_impl =
      base::WrapUnique(new ChapsProxyImpl(std::move(at_exit)));

  bool connected = false;

  if (mode == ThreadingMode::kStandaloneWorkerThread) {
    base::Thread::Options options(base::MessagePumpType::IO, 0);
    chaps_proxy_impl->dbus_thread_ =
        std::make_unique<ChapsProxyThread>(chaps_proxy_impl.get());
    chaps_proxy_impl->dbus_thread_->StartWithOptions(std::move(options));

    base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
                              base::WaitableEvent::InitialState::NOT_SIGNALED);
    chaps_proxy_impl->dbus_thread_->task_runner()->PostTask(
        FROM_HERE, base::BindOnce(&ChapsProxyImpl::InitializationTask,
                                  base::Unretained(chaps_proxy_impl.get()),
                                  base::BindOnce(&base::WaitableEvent::Signal,
                                                 base::Unretained(&event)),
                                  &connected));
    event.Wait();
  } else {
    chaps_proxy_impl->InitializationTask(base::DoNothing(), &connected);
  }

  if (!connected) {
    // We should return nullptr when failed to connect to system D-Bus, and let
    // C_Initialize return CKR_GENERAL_ERROR.
    LOG(ERROR) << "Failed to connect to system D-Bus";
    return nullptr;
  }

  return chaps_proxy_impl;
}

void ChapsProxyImpl::InitializationTask(base::OnceClosure callback,
                                        bool* connected) {
  dbus::Bus::Options options;
  options.bus_type = dbus::Bus::SYSTEM;
  bus_ = base::MakeRefCounted<dbus::Bus>(options);

  *connected = bus_->Connect();

  default_proxy_ = std::make_unique<org::chromium::ChapsProxy>(bus_);

  proxy_ = default_proxy_.get();

  std::move(callback).Run();
}

void ChapsProxyImpl::ShutdownTask() {
  default_proxy_.reset();
  bus_->ShutdownAndBlock();
  bus_.reset();
}

template <typename MethodType, typename... Args>
bool ChapsProxyImpl::SendRequestAndWait(const MethodType& method,
                                        Args... args) {
  bool success = true;
  if (dbus_thread_) {
    base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
                              base::WaitableEvent::InitialState::NOT_SIGNALED);
    dbus_thread_->task_runner()->PostTask(
        FROM_HERE, base::BindOnce(
                       [](org::chromium::ChapsProxyInterface* proxy,
                          base::WaitableEvent* completion, bool* success,
                          const MethodType& method, Args... args) {
                         brillo::ErrorPtr error = nullptr;
                         if (!(proxy->*method)(args..., &error,
                                               kDBusTimeout.InMilliseconds()) ||
                             error) {
                           *success = false;
                         }
                         completion->Signal();
                       },
                       proxy_, &event, &success, method, args...));

    event.Wait();
  } else {
    brillo::ErrorPtr error = nullptr;
    if (!(proxy_->*method)(args..., &error, kDBusTimeout.InMilliseconds()) ||
        error) {
      success = false;
    }
  }
  return success;
}

bool ChapsProxyImpl::OpenIsolate(SecureBlob* isolate_credential,
                                 bool* new_isolate_created) {
  Blob isolate_credential_out;
  bool result = false;
  bool success =
      SendRequestAndWait(&org::chromium::ChapsProxyInterface::OpenIsolate,
                         ToBlob(*isolate_credential), &isolate_credential_out,
                         new_isolate_created, &result);
  *isolate_credential = SecureBlob(isolate_credential_out);
  return success && result;
}

void ChapsProxyImpl::CloseIsolate(const SecureBlob& isolate_credential) {
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::CloseIsolate,
                     ToBlob(isolate_credential));
}

bool ChapsProxyImpl::LoadToken(const SecureBlob& isolate_credential,
                               const string& path,
                               const SecureBlob& auth_data,
                               const string& label,
                               uint64_t* slot_id) {
  bool result = false;
  bool success =
      SendRequestAndWait(&org::chromium::ChapsProxyInterface::LoadToken,
                         ToBlob(isolate_credential), path, ToBlob(auth_data),
                         label, slot_id, &result);
  return success && result;
}

bool ChapsProxyImpl::UnloadToken(const SecureBlob& isolate_credential,
                                 const string& path) {
  bool result = false;
  bool success =
      SendRequestAndWait(&org::chromium::ChapsProxyInterface::UnloadToken,
                         ToBlob(isolate_credential), path, &result);
  return success && result;
}

bool ChapsProxyImpl::GetTokenPath(const SecureBlob& isolate_credential,
                                  uint64_t slot_id,
                                  string* path) {
  bool result = false;
  bool success =
      SendRequestAndWait(&org::chromium::ChapsProxyInterface::GetTokenPath,
                         ToBlob(isolate_credential), slot_id, path, &result);
  return success && result;
}

void ChapsProxyImpl::SetLogLevel(const int32_t& level) {
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::SetLogLevel, level);
}

uint32_t ChapsProxyImpl::GetSlotList(const SecureBlob& isolate_credential,
                                     bool token_present,
                                     vector<uint64_t>* slot_list) {
  LOG_CK_RV_AND_RETURN_IF(!slot_list, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;

  SendRequestAndWait(&org::chromium::ChapsProxyInterface::GetSlotList,
                     ToBlob(isolate_credential), token_present, slot_list,
                     &result);
  return result;
}

uint32_t ChapsProxyImpl::GetSlotInfo(const SecureBlob& isolate_credential,
                                     uint64_t slot_id,
                                     SlotInfo* slot_info) {
  LOG_CK_RV_AND_RETURN_IF(!slot_info, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::GetSlotInfo,
                     ToBlob(isolate_credential), slot_id, slot_info, &result);
  return result;
}

uint32_t ChapsProxyImpl::GetTokenInfo(const SecureBlob& isolate_credential,
                                      uint64_t slot_id,
                                      TokenInfo* token_info) {
  LOG_CK_RV_AND_RETURN_IF(!token_info, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::GetTokenInfo,
                     ToBlob(isolate_credential), slot_id, token_info, &result);
  return result;
}

uint32_t ChapsProxyImpl::GetMechanismList(const SecureBlob& isolate_credential,
                                          uint64_t slot_id,
                                          vector<uint64_t>* mechanism_list) {
  LOG_CK_RV_AND_RETURN_IF(!mechanism_list, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::GetMechanismList,
                     ToBlob(isolate_credential), slot_id, mechanism_list,
                     &result);
  return result;
}

uint32_t ChapsProxyImpl::GetMechanismInfo(const SecureBlob& isolate_credential,
                                          uint64_t slot_id,
                                          uint64_t mechanism_type,
                                          MechanismInfo* mechanism_info) {
  LOG_CK_RV_AND_RETURN_IF(!mechanism_info, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::GetMechanismInfo,
                     ToBlob(isolate_credential), slot_id, mechanism_type,
                     mechanism_info, &result);
  return result;
}

uint32_t ChapsProxyImpl::InitToken(const SecureBlob& isolate_credential,
                                   uint64_t slot_id,
                                   const string* so_pin,
                                   const vector<uint8_t>& label) {
  uint32_t result = CKR_GENERAL_ERROR;
  string tmp_pin;
  if (so_pin)
    tmp_pin = *so_pin;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::InitToken,
                     ToBlob(isolate_credential), slot_id, (so_pin == nullptr),
                     tmp_pin, label, &result);
  return result;
}

uint32_t ChapsProxyImpl::InitPIN(const SecureBlob& isolate_credential,
                                 uint64_t session_id,
                                 const string* pin) {
  uint32_t result = CKR_GENERAL_ERROR;
  string tmp_pin;
  if (pin)
    tmp_pin = *pin;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::InitPIN,
                     ToBlob(isolate_credential), session_id, (pin == nullptr),
                     tmp_pin, &result);
  return result;
}

uint32_t ChapsProxyImpl::SetPIN(const SecureBlob& isolate_credential,
                                uint64_t session_id,
                                const string* old_pin,
                                const string* new_pin) {
  uint32_t result = CKR_GENERAL_ERROR;
  string tmp_old_pin;
  if (old_pin)
    tmp_old_pin = *old_pin;
  string tmp_new_pin;
  if (new_pin)
    tmp_new_pin = *new_pin;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::SetPIN,
                     ToBlob(isolate_credential), session_id,
                     (old_pin == nullptr), tmp_old_pin, (new_pin == nullptr),
                     tmp_new_pin, &result);
  return result;
}

uint32_t ChapsProxyImpl::OpenSession(const SecureBlob& isolate_credential,
                                     uint64_t slot_id,
                                     uint64_t flags,
                                     uint64_t* session_id) {
  LOG_CK_RV_AND_RETURN_IF(!session_id, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::OpenSession,
                     ToBlob(isolate_credential), slot_id, flags, session_id,
                     &result);
  return result;
}

uint32_t ChapsProxyImpl::CloseSession(const SecureBlob& isolate_credential,
                                      uint64_t session_id) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::CloseSession,
                     ToBlob(isolate_credential), session_id, &result);
  return result;
}

uint32_t ChapsProxyImpl::GetSessionInfo(const SecureBlob& isolate_credential,
                                        uint64_t session_id,
                                        SessionInfo* session_info) {
  LOG_CK_RV_AND_RETURN_IF(!session_info, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::GetSessionInfo,
                     ToBlob(isolate_credential), session_id, session_info,
                     &result);
  return result;
}

uint32_t ChapsProxyImpl::GetOperationState(const SecureBlob& isolate_credential,
                                           uint64_t session_id,
                                           vector<uint8_t>* operation_state) {
  LOG_CK_RV_AND_RETURN_IF(!operation_state, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::GetOperationState,
                     ToBlob(isolate_credential), session_id, operation_state,
                     &result);
  return result;
}

uint32_t ChapsProxyImpl::SetOperationState(
    const SecureBlob& isolate_credential,
    uint64_t session_id,
    const vector<uint8_t>& operation_state,
    uint64_t encryption_key_handle,
    uint64_t authentication_key_handle) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::SetOperationState,
                     ToBlob(isolate_credential), session_id, operation_state,
                     encryption_key_handle, authentication_key_handle, &result);
  return result;
}

uint32_t ChapsProxyImpl::Login(const SecureBlob& isolate_credential,
                               uint64_t session_id,
                               uint64_t user_type,
                               const string* pin) {
  uint32_t result = CKR_GENERAL_ERROR;
  string tmp_pin;
  if (pin)
    tmp_pin = *pin;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::Login,
                     ToBlob(isolate_credential), session_id, user_type,
                     (pin == nullptr), tmp_pin, &result);
  return result;
}

uint32_t ChapsProxyImpl::Logout(const SecureBlob& isolate_credential,
                                uint64_t session_id) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::Logout,
                     ToBlob(isolate_credential), session_id, &result);
  return result;
}

uint32_t ChapsProxyImpl::CreateObject(const SecureBlob& isolate_credential,
                                      uint64_t session_id,
                                      const vector<uint8_t>& attributes,
                                      uint64_t* new_object_handle) {
  LOG_CK_RV_AND_RETURN_IF(!new_object_handle, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::CreateObject,
                     ToBlob(isolate_credential), session_id, attributes,
                     new_object_handle, &result);
  return result;
}

uint32_t ChapsProxyImpl::CopyObject(const SecureBlob& isolate_credential,
                                    uint64_t session_id,
                                    uint64_t object_handle,
                                    const vector<uint8_t>& attributes,
                                    uint64_t* new_object_handle) {
  LOG_CK_RV_AND_RETURN_IF(!new_object_handle, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::CopyObject,
                     ToBlob(isolate_credential), session_id, object_handle,
                     attributes, new_object_handle, &result);
  return result;
}

uint32_t ChapsProxyImpl::DestroyObject(const SecureBlob& isolate_credential,
                                       uint64_t session_id,
                                       uint64_t object_handle) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::DestroyObject,
                     ToBlob(isolate_credential), session_id, object_handle,
                     &result);
  return result;
}

uint32_t ChapsProxyImpl::GetObjectSize(const SecureBlob& isolate_credential,
                                       uint64_t session_id,
                                       uint64_t object_handle,
                                       uint64_t* object_size) {
  LOG_CK_RV_AND_RETURN_IF(!object_size, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::GetObjectSize,
                     ToBlob(isolate_credential), session_id, object_handle,
                     object_size, &result);
  return result;
}

uint32_t ChapsProxyImpl::GetAttributeValue(const SecureBlob& isolate_credential,
                                           uint64_t session_id,
                                           uint64_t object_handle,
                                           const vector<uint8_t>& attributes_in,
                                           vector<uint8_t>* attributes_out) {
  LOG_CK_RV_AND_RETURN_IF(!attributes_out, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::GetAttributeValue,
                     ToBlob(isolate_credential), session_id, object_handle,
                     attributes_in, attributes_out, &result);
  return result;
}

uint32_t ChapsProxyImpl::SetAttributeValue(const SecureBlob& isolate_credential,
                                           uint64_t session_id,
                                           uint64_t object_handle,
                                           const vector<uint8_t>& attributes) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::SetAttributeValue,
                     ToBlob(isolate_credential), session_id, object_handle,
                     attributes, &result);
  return result;
}

uint32_t ChapsProxyImpl::FindObjectsInit(const SecureBlob& isolate_credential,
                                         uint64_t session_id,
                                         const vector<uint8_t>& attributes) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::FindObjectsInit,
                     ToBlob(isolate_credential), session_id, attributes,
                     &result);
  return result;
}

uint32_t ChapsProxyImpl::FindObjects(const SecureBlob& isolate_credential,
                                     uint64_t session_id,
                                     uint64_t max_object_count,
                                     vector<uint64_t>* object_list) {
  if (!object_list || object_list->size() > 0)
    LOG_CK_RV_AND_RETURN(CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::FindObjects,
                     ToBlob(isolate_credential), session_id, max_object_count,
                     object_list, &result);
  return result;
}

uint32_t ChapsProxyImpl::FindObjectsFinal(const SecureBlob& isolate_credential,
                                          uint64_t session_id) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::FindObjectsFinal,
                     ToBlob(isolate_credential), session_id, &result);
  return result;
}

uint32_t ChapsProxyImpl::EncryptInit(const SecureBlob& isolate_credential,
                                     uint64_t session_id,
                                     uint64_t mechanism_type,
                                     const vector<uint8_t>& mechanism_parameter,
                                     uint64_t key_handle) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::EncryptInit,
                     ToBlob(isolate_credential), session_id, mechanism_type,
                     mechanism_parameter, key_handle, &result);
  return result;
}

uint32_t ChapsProxyImpl::Encrypt(const SecureBlob& isolate_credential,
                                 uint64_t session_id,
                                 const vector<uint8_t>& data_in,
                                 uint64_t max_out_length,
                                 uint64_t* actual_out_length,
                                 vector<uint8_t>* data_out) {
  LOG_CK_RV_AND_RETURN_IF(!actual_out_length || !data_out, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::Encrypt,
                     ToBlob(isolate_credential), session_id, data_in,
                     max_out_length, actual_out_length, data_out, &result);
  return result;
}

uint32_t ChapsProxyImpl::EncryptUpdate(const SecureBlob& isolate_credential,
                                       uint64_t session_id,
                                       const vector<uint8_t>& data_in,
                                       uint64_t max_out_length,
                                       uint64_t* actual_out_length,
                                       vector<uint8_t>* data_out) {
  LOG_CK_RV_AND_RETURN_IF(!actual_out_length || !data_out, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::EncryptUpdate,
                     ToBlob(isolate_credential), session_id, data_in,
                     max_out_length, actual_out_length, data_out, &result);
  return result;
}

uint32_t ChapsProxyImpl::EncryptFinal(const SecureBlob& isolate_credential,
                                      uint64_t session_id,
                                      uint64_t max_out_length,
                                      uint64_t* actual_out_length,
                                      vector<uint8_t>* data_out) {
  LOG_CK_RV_AND_RETURN_IF(!actual_out_length || !data_out, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::EncryptFinal,
                     ToBlob(isolate_credential), session_id, max_out_length,
                     actual_out_length, data_out, &result);
  return result;
}

void ChapsProxyImpl::EncryptCancel(const SecureBlob& isolate_credential,
                                   uint64_t session_id) {
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::EncryptCancel,
                     ToBlob(isolate_credential), session_id);
}

uint32_t ChapsProxyImpl::DecryptInit(const SecureBlob& isolate_credential,
                                     uint64_t session_id,
                                     uint64_t mechanism_type,
                                     const vector<uint8_t>& mechanism_parameter,
                                     uint64_t key_handle) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::DecryptInit,
                     ToBlob(isolate_credential), session_id, mechanism_type,
                     mechanism_parameter, key_handle, &result);
  return result;
}

uint32_t ChapsProxyImpl::Decrypt(const SecureBlob& isolate_credential,
                                 uint64_t session_id,
                                 const vector<uint8_t>& data_in,
                                 uint64_t max_out_length,
                                 uint64_t* actual_out_length,
                                 vector<uint8_t>* data_out) {
  LOG_CK_RV_AND_RETURN_IF(!actual_out_length || !data_out, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::Decrypt,
                     ToBlob(isolate_credential), session_id, data_in,
                     max_out_length, actual_out_length, data_out, &result);
  return result;
}

uint32_t ChapsProxyImpl::DecryptUpdate(const SecureBlob& isolate_credential,
                                       uint64_t session_id,
                                       const vector<uint8_t>& data_in,
                                       uint64_t max_out_length,
                                       uint64_t* actual_out_length,
                                       vector<uint8_t>* data_out) {
  LOG_CK_RV_AND_RETURN_IF(!actual_out_length || !data_out, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::DecryptUpdate,
                     ToBlob(isolate_credential), session_id, data_in,
                     max_out_length, actual_out_length, data_out, &result);
  return result;
}

uint32_t ChapsProxyImpl::DecryptFinal(const SecureBlob& isolate_credential,
                                      uint64_t session_id,
                                      uint64_t max_out_length,
                                      uint64_t* actual_out_length,
                                      vector<uint8_t>* data_out) {
  LOG_CK_RV_AND_RETURN_IF(!actual_out_length || !data_out, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::DecryptFinal,
                     ToBlob(isolate_credential), session_id, max_out_length,
                     actual_out_length, data_out, &result);
  return result;
}

void ChapsProxyImpl::DecryptCancel(const SecureBlob& isolate_credential,
                                   uint64_t session_id) {
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::DecryptCancel,
                     ToBlob(isolate_credential), session_id);
}

uint32_t ChapsProxyImpl::DigestInit(
    const SecureBlob& isolate_credential,
    uint64_t session_id,
    uint64_t mechanism_type,
    const vector<uint8_t>& mechanism_parameter) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::DigestInit,
                     ToBlob(isolate_credential), session_id, mechanism_type,
                     mechanism_parameter, &result);
  return result;
}

uint32_t ChapsProxyImpl::Digest(const SecureBlob& isolate_credential,
                                uint64_t session_id,
                                const vector<uint8_t>& data_in,
                                uint64_t max_out_length,
                                uint64_t* actual_out_length,
                                vector<uint8_t>* digest) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::Digest,
                     ToBlob(isolate_credential), session_id, data_in,
                     max_out_length, actual_out_length, digest, &result);
  return result;
}

uint32_t ChapsProxyImpl::DigestUpdate(const SecureBlob& isolate_credential,
                                      uint64_t session_id,
                                      const vector<uint8_t>& data_in) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::DigestUpdate,
                     ToBlob(isolate_credential), session_id, data_in, &result);
  return result;
}

uint32_t ChapsProxyImpl::DigestKey(const SecureBlob& isolate_credential,
                                   uint64_t session_id,
                                   uint64_t key_handle) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::DigestKey,
                     ToBlob(isolate_credential), session_id, key_handle,
                     &result);
  return result;
}

uint32_t ChapsProxyImpl::DigestFinal(const SecureBlob& isolate_credential,
                                     uint64_t session_id,
                                     uint64_t max_out_length,
                                     uint64_t* actual_out_length,
                                     vector<uint8_t>* digest) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::DigestFinal,
                     ToBlob(isolate_credential), session_id, max_out_length,
                     actual_out_length, digest, &result);
  return result;
}

void ChapsProxyImpl::DigestCancel(const SecureBlob& isolate_credential,
                                  uint64_t session_id) {
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::DigestCancel,
                     ToBlob(isolate_credential), session_id);
}

uint32_t ChapsProxyImpl::SignInit(const SecureBlob& isolate_credential,
                                  uint64_t session_id,
                                  uint64_t mechanism_type,
                                  const vector<uint8_t>& mechanism_parameter,
                                  uint64_t key_handle) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::SignInit,
                     ToBlob(isolate_credential), session_id, mechanism_type,
                     mechanism_parameter, key_handle, &result);
  return result;
}

uint32_t ChapsProxyImpl::Sign(const SecureBlob& isolate_credential,
                              uint64_t session_id,
                              const vector<uint8_t>& data,
                              uint64_t max_out_length,
                              uint64_t* actual_out_length,
                              vector<uint8_t>* signature) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::Sign,
                     ToBlob(isolate_credential), session_id, data,
                     max_out_length, actual_out_length, signature, &result);
  return result;
}

uint32_t ChapsProxyImpl::SignUpdate(const SecureBlob& isolate_credential,
                                    uint64_t session_id,
                                    const vector<uint8_t>& data_part) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::SignUpdate,
                     ToBlob(isolate_credential), session_id, data_part,
                     &result);
  return result;
}

uint32_t ChapsProxyImpl::SignFinal(const SecureBlob& isolate_credential,
                                   uint64_t session_id,
                                   uint64_t max_out_length,
                                   uint64_t* actual_out_length,
                                   vector<uint8_t>* signature) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::SignFinal,
                     ToBlob(isolate_credential), session_id, max_out_length,
                     actual_out_length, signature, &result);
  return result;
}

void ChapsProxyImpl::SignCancel(const SecureBlob& isolate_credential,
                                uint64_t session_id) {
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::SignCancel,
                     ToBlob(isolate_credential), session_id);
}

uint32_t ChapsProxyImpl::SignRecoverInit(
    const SecureBlob& isolate_credential,
    uint64_t session_id,
    uint64_t mechanism_type,
    const vector<uint8_t>& mechanism_parameter,
    uint64_t key_handle) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::SignRecoverInit,
                     ToBlob(isolate_credential), session_id, mechanism_type,
                     mechanism_parameter, key_handle, &result);
  return result;
}

uint32_t ChapsProxyImpl::SignRecover(const SecureBlob& isolate_credential,
                                     uint64_t session_id,
                                     const vector<uint8_t>& data,
                                     uint64_t max_out_length,
                                     uint64_t* actual_out_length,
                                     vector<uint8_t>* signature) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::SignRecover,
                     ToBlob(isolate_credential), session_id, data,
                     max_out_length, actual_out_length, signature, &result);
  return result;
}

uint32_t ChapsProxyImpl::VerifyInit(const SecureBlob& isolate_credential,
                                    uint64_t session_id,
                                    uint64_t mechanism_type,
                                    const vector<uint8_t>& mechanism_parameter,
                                    uint64_t key_handle) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::VerifyInit,
                     ToBlob(isolate_credential), session_id, mechanism_type,
                     mechanism_parameter, key_handle, &result);
  return result;
}

uint32_t ChapsProxyImpl::Verify(const SecureBlob& isolate_credential,
                                uint64_t session_id,
                                const vector<uint8_t>& data,
                                const vector<uint8_t>& signature) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::Verify,
                     ToBlob(isolate_credential), session_id, data, signature,
                     &result);
  return result;
}

uint32_t ChapsProxyImpl::VerifyUpdate(const SecureBlob& isolate_credential,
                                      uint64_t session_id,
                                      const vector<uint8_t>& data_part) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::VerifyUpdate,
                     ToBlob(isolate_credential), session_id, data_part,
                     &result);
  return result;
}

uint32_t ChapsProxyImpl::VerifyFinal(const SecureBlob& isolate_credential,
                                     uint64_t session_id,
                                     const vector<uint8_t>& signature) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::VerifyFinal,
                     ToBlob(isolate_credential), session_id, signature,
                     &result);
  return result;
}

void ChapsProxyImpl::VerifyCancel(const SecureBlob& isolate_credential,
                                  uint64_t session_id) {
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::VerifyCancel,
                     ToBlob(isolate_credential), session_id);
}

uint32_t ChapsProxyImpl::VerifyRecoverInit(
    const SecureBlob& isolate_credential,
    uint64_t session_id,
    uint64_t mechanism_type,
    const vector<uint8_t>& mechanism_parameter,
    uint64_t key_handle) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::VerifyRecoverInit,
                     ToBlob(isolate_credential), session_id, mechanism_type,
                     mechanism_parameter, key_handle, &result);
  return result;
}

uint32_t ChapsProxyImpl::VerifyRecover(const SecureBlob& isolate_credential,
                                       uint64_t session_id,
                                       const vector<uint8_t>& signature,
                                       uint64_t max_out_length,
                                       uint64_t* actual_out_length,
                                       vector<uint8_t>* data) {
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::VerifyRecover,
                     ToBlob(isolate_credential), session_id, signature,
                     max_out_length, actual_out_length, data, &result);
  return result;
}

uint32_t ChapsProxyImpl::DigestEncryptUpdate(
    const SecureBlob& isolate_credential,
    uint64_t session_id,
    const vector<uint8_t>& data_in,
    uint64_t max_out_length,
    uint64_t* actual_out_length,
    vector<uint8_t>* data_out) {
  LOG_CK_RV_AND_RETURN_IF(!actual_out_length || !data_out, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::DigestEncryptUpdate,
                     ToBlob(isolate_credential), session_id, data_in,
                     max_out_length, actual_out_length, data_out, &result);
  return result;
}

uint32_t ChapsProxyImpl::DecryptDigestUpdate(
    const SecureBlob& isolate_credential,
    uint64_t session_id,
    const vector<uint8_t>& data_in,
    uint64_t max_out_length,
    uint64_t* actual_out_length,
    vector<uint8_t>* data_out) {
  LOG_CK_RV_AND_RETURN_IF(!actual_out_length || !data_out, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::DecryptDigestUpdate,
                     ToBlob(isolate_credential), session_id, data_in,
                     max_out_length, actual_out_length, data_out, &result);
  return result;
}

uint32_t ChapsProxyImpl::SignEncryptUpdate(const SecureBlob& isolate_credential,
                                           uint64_t session_id,
                                           const vector<uint8_t>& data_in,
                                           uint64_t max_out_length,
                                           uint64_t* actual_out_length,
                                           vector<uint8_t>* data_out) {
  LOG_CK_RV_AND_RETURN_IF(!actual_out_length || !data_out, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::SignEncryptUpdate,
                     ToBlob(isolate_credential), session_id, data_in,
                     max_out_length, actual_out_length, data_out, &result);
  return result;
}

uint32_t ChapsProxyImpl::DecryptVerifyUpdate(
    const SecureBlob& isolate_credential,
    uint64_t session_id,
    const vector<uint8_t>& data_in,
    uint64_t max_out_length,
    uint64_t* actual_out_length,
    vector<uint8_t>* data_out) {
  LOG_CK_RV_AND_RETURN_IF(!actual_out_length || !data_out, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::DecryptVerifyUpdate,
                     ToBlob(isolate_credential), session_id, data_in,
                     max_out_length, actual_out_length, data_out, &result);
  return result;
}

uint32_t ChapsProxyImpl::GenerateKey(const SecureBlob& isolate_credential,
                                     uint64_t session_id,
                                     uint64_t mechanism_type,
                                     const vector<uint8_t>& mechanism_parameter,
                                     const vector<uint8_t>& attributes,
                                     uint64_t* key_handle) {
  LOG_CK_RV_AND_RETURN_IF(!key_handle, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::GenerateKey,
                     ToBlob(isolate_credential), session_id, mechanism_type,
                     mechanism_parameter, attributes, key_handle, &result);
  return result;
}

uint32_t ChapsProxyImpl::GenerateKeyPair(
    const SecureBlob& isolate_credential,
    uint64_t session_id,
    uint64_t mechanism_type,
    const vector<uint8_t>& mechanism_parameter,
    const vector<uint8_t>& public_attributes,
    const vector<uint8_t>& private_attributes,
    uint64_t* public_key_handle,
    uint64_t* private_key_handle) {
  LOG_CK_RV_AND_RETURN_IF(!public_key_handle || !private_key_handle,
                          CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::GenerateKeyPair,
                     ToBlob(isolate_credential), session_id, mechanism_type,
                     mechanism_parameter, public_attributes, private_attributes,
                     public_key_handle, private_key_handle, &result);
  return result;
}

uint32_t ChapsProxyImpl::WrapKey(const SecureBlob& isolate_credential,
                                 uint64_t session_id,
                                 uint64_t mechanism_type,
                                 const vector<uint8_t>& mechanism_parameter,
                                 uint64_t wrapping_key_handle,
                                 uint64_t key_handle,
                                 uint64_t max_out_length,
                                 uint64_t* actual_out_length,
                                 vector<uint8_t>* wrapped_key) {
  LOG_CK_RV_AND_RETURN_IF(!actual_out_length || !wrapped_key,
                          CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::WrapKey,
                     ToBlob(isolate_credential), session_id, mechanism_type,
                     mechanism_parameter, wrapping_key_handle, key_handle,
                     max_out_length, actual_out_length, wrapped_key, &result);
  return result;
}

uint32_t ChapsProxyImpl::UnwrapKey(const SecureBlob& isolate_credential,
                                   uint64_t session_id,
                                   uint64_t mechanism_type,
                                   const vector<uint8_t>& mechanism_parameter,
                                   uint64_t unwrapping_key_handle,
                                   const vector<uint8_t>& wrapped_key,
                                   const vector<uint8_t>& attributes,
                                   uint64_t* key_handle) {
  LOG_CK_RV_AND_RETURN_IF(!key_handle, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::UnwrapKey,
                     ToBlob(isolate_credential), session_id, mechanism_type,
                     mechanism_parameter, unwrapping_key_handle, wrapped_key,
                     attributes, key_handle, &result);
  return result;
}

uint32_t ChapsProxyImpl::DeriveKey(const SecureBlob& isolate_credential,
                                   uint64_t session_id,
                                   uint64_t mechanism_type,
                                   const vector<uint8_t>& mechanism_parameter,
                                   uint64_t base_key_handle,
                                   const vector<uint8_t>& attributes,
                                   uint64_t* key_handle) {
  LOG_CK_RV_AND_RETURN_IF(!key_handle, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::DeriveKey,
                     ToBlob(isolate_credential), session_id, mechanism_type,
                     mechanism_parameter, base_key_handle, attributes,
                     key_handle, &result);
  return result;
}

uint32_t ChapsProxyImpl::SeedRandom(const SecureBlob& isolate_credential,
                                    uint64_t session_id,
                                    const vector<uint8_t>& seed) {
  LOG_CK_RV_AND_RETURN_IF(seed.size() == 0, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::SeedRandom,
                     ToBlob(isolate_credential), session_id, seed, &result);
  return result;
}

uint32_t ChapsProxyImpl::GenerateRandom(const SecureBlob& isolate_credential,
                                        uint64_t session_id,
                                        uint64_t num_bytes,
                                        vector<uint8_t>* random_data) {
  LOG_CK_RV_AND_RETURN_IF(!random_data || num_bytes == 0, CKR_ARGUMENTS_BAD);
  uint32_t result = CKR_GENERAL_ERROR;
  SendRequestAndWait(&org::chromium::ChapsProxyInterface::GenerateRandom,
                     ToBlob(isolate_credential), session_id, num_bytes,
                     random_data, &result);
  return result;
}

}  // namespace chaps
