// Copyright (c) 2011 The Chromium OS 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 "chaps/chaps_adaptor.h"

#include <base/files/file_path.h>
#include <base/logging.h>
#include <base/synchronization/lock.h>
#include <dbus/object_path.h>

#include "chaps/chaps.h"
#include "chaps/chaps_interface.h"
#include "chaps/chaps_utility.h"
#include "chaps/dbus_bindings/constants.h"
#include "chaps/token_manager_interface.h"

using base::AutoLock;
using base::FilePath;
using base::Lock;
using brillo::SecureBlob;
using std::string;
using std::vector;

namespace chaps {

ChapsAdaptor::ChapsAdaptor(
      brillo::dbus_utils::ExportedObjectManager* object_manager,
      Lock* lock,
      ChapsInterface* service,
      TokenManagerInterface* token_manager)
    : dbus_object_(object_manager,
                   object_manager->GetBus(),
                   dbus::ObjectPath(kChapsServicePath)),
      lock_(lock),
      service_(service),
      token_manager_(token_manager) {}

ChapsAdaptor::~ChapsAdaptor() {}

void ChapsAdaptor::RegisterAsync(
      const brillo::dbus_utils::AsyncEventSequencer::CompletionAction& cb) {
  brillo::dbus_utils::DBusInterface* interface =
      dbus_object_.AddOrGetInterface(kChapsInterface);
  interface->AddSimpleMethodHandler(kOpenIsolateMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::OpenIsolate);
  interface->AddSimpleMethodHandler(kCloseIsolateMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::CloseIsolate);
  interface->AddSimpleMethodHandler(kLoadTokenMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::LoadToken);
  interface->AddSimpleMethodHandler(kUnloadTokenMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::UnloadToken);
  interface->AddSimpleMethodHandler(kChangeTokenAuthDataMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::ChangeTokenAuthData);
  interface->AddSimpleMethodHandler(kGetTokenPathMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::GetTokenPath);
  interface->AddSimpleMethodHandler(kSetLogLevelMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::SetLogLevel);
  interface->AddSimpleMethodHandler(kGetSlotListMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::GetSlotList);
  interface->AddSimpleMethodHandler(kGetSlotInfoMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::GetSlotInfo);
  interface->AddSimpleMethodHandler(kGetTokenInfoMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::GetTokenInfo);
  interface->AddSimpleMethodHandler(kGetMechanismListMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::GetMechanismList);
  interface->AddSimpleMethodHandler(kGetMechanismInfoMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::GetMechanismInfo);
  interface->AddSimpleMethodHandler(kInitTokenMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::InitToken);
  interface->AddSimpleMethodHandler(kInitPINMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::InitPIN);
  interface->AddSimpleMethodHandler(kSetPINMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::SetPIN);
  interface->AddSimpleMethodHandler(kOpenSessionMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::OpenSession);
  interface->AddSimpleMethodHandler(kCloseSessionMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::CloseSession);
  interface->AddSimpleMethodHandler(kCloseAllSessionsMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::CloseAllSessions);
  interface->AddSimpleMethodHandler(kGetSessionInfoMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::GetSessionInfo);
  interface->AddSimpleMethodHandler(kGetOperationStateMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::GetOperationState);
  interface->AddSimpleMethodHandler(kSetOperationStateMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::SetOperationState);
  interface->AddSimpleMethodHandler(kLoginMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::Login);
  interface->AddSimpleMethodHandler(kLogoutMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::Logout);
  interface->AddSimpleMethodHandler(kCreateObjectMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::CreateObject);
  interface->AddSimpleMethodHandler(kCopyObjectMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::CopyObject);
  interface->AddSimpleMethodHandler(kDestroyObjectMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::DestroyObject);
  interface->AddSimpleMethodHandler(kGetObjectSizeMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::GetObjectSize);
  interface->AddSimpleMethodHandler(kGetAttributeValueMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::GetAttributeValue);
  interface->AddSimpleMethodHandler(kSetAttributeValueMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::SetAttributeValue);
  interface->AddSimpleMethodHandler(kFindObjectsInitMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::FindObjectsInit);
  interface->AddSimpleMethodHandler(kFindObjectsMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::FindObjects);
  interface->AddSimpleMethodHandler(kFindObjectsFinalMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::FindObjectsFinal);
  interface->AddSimpleMethodHandler(kEncryptInitMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::EncryptInit);
  interface->AddSimpleMethodHandler(kEncryptMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::Encrypt);
  interface->AddSimpleMethodHandler(kEncryptUpdateMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::EncryptUpdate);
  interface->AddSimpleMethodHandler(kEncryptFinalMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::EncryptFinal);
  interface->AddSimpleMethodHandler(kEncryptCancelMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::EncryptCancel);
  interface->AddSimpleMethodHandler(kDecryptInitMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::DecryptInit);
  interface->AddSimpleMethodHandler(kDecryptMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::Decrypt);
  interface->AddSimpleMethodHandler(kDecryptUpdateMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::DecryptUpdate);
  interface->AddSimpleMethodHandler(kDecryptFinalMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::DecryptFinal);
  interface->AddSimpleMethodHandler(kDecryptCancelMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::DecryptCancel);
  interface->AddSimpleMethodHandler(kDigestInitMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::DigestInit);
  interface->AddSimpleMethodHandler(kDigestMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::Digest);
  interface->AddSimpleMethodHandler(kDigestUpdateMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::DigestUpdate);
  interface->AddSimpleMethodHandler(kDigestKeyMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::DigestKey);
  interface->AddSimpleMethodHandler(kDigestFinalMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::DigestFinal);
  interface->AddSimpleMethodHandler(kDigestCancelMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::DigestCancel);
  interface->AddSimpleMethodHandler(kSignInitMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::SignInit);
  interface->AddSimpleMethodHandler(kSignMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::Sign);
  interface->AddSimpleMethodHandler(kSignUpdateMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::SignUpdate);
  interface->AddSimpleMethodHandler(kSignFinalMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::SignFinal);
  interface->AddSimpleMethodHandler(kSignCancelMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::SignCancel);
  interface->AddSimpleMethodHandler(kSignRecoverInitMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::SignRecoverInit);
  interface->AddSimpleMethodHandler(kSignRecoverMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::SignRecover);
  interface->AddSimpleMethodHandler(kVerifyInitMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::VerifyInit);
  interface->AddSimpleMethodHandler(kVerifyMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::Verify);
  interface->AddSimpleMethodHandler(kVerifyUpdateMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::VerifyUpdate);
  interface->AddSimpleMethodHandler(kVerifyFinalMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::VerifyFinal);
  interface->AddSimpleMethodHandler(kVerifyCancelMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::VerifyCancel);
  interface->AddSimpleMethodHandler(kVerifyRecoverInitMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::VerifyRecoverInit);
  interface->AddSimpleMethodHandler(kVerifyRecoverMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::VerifyRecover);
  interface->AddSimpleMethodHandler(kDigestEncryptUpdateMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::DigestEncryptUpdate);
  interface->AddSimpleMethodHandler(kDecryptDigestUpdateMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::DecryptDigestUpdate);
  interface->AddSimpleMethodHandler(kSignEncryptUpdateMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::SignEncryptUpdate);
  interface->AddSimpleMethodHandler(kDecryptVerifyUpdateMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::DecryptVerifyUpdate);
  interface->AddSimpleMethodHandler(kGenerateKeyMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::GenerateKey);
  interface->AddSimpleMethodHandler(kGenerateKeyPairMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::GenerateKeyPair);
  interface->AddSimpleMethodHandler(kWrapKeyMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::WrapKey);
  interface->AddSimpleMethodHandler(kUnwrapKeyMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::UnwrapKey);
  interface->AddSimpleMethodHandler(kDeriveKeyMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::DeriveKey);
  interface->AddSimpleMethodHandler(kSeedRandomMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::SeedRandom);
  interface->AddSimpleMethodHandler(kGenerateRandomMethod,
                                    base::Unretained(this),
                                    &ChapsAdaptor::GenerateRandom);
  dbus_object_.RegisterAsync(cb);
}

void ChapsAdaptor::OpenIsolate(
      const std::vector<uint8_t>& isolate_credential_in,
      std::vector<uint8_t>* isolate_credential_out,
      bool* new_isolate_created,
      bool* result) {
  VLOG(1) << "CALL: " << __func__;
  *result = false;
  SecureBlob isolate_credential(isolate_credential_in.begin(),
                                isolate_credential_in.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential_in));
  if (token_manager_)
    *result = token_manager_->OpenIsolate(&isolate_credential,
                                          new_isolate_created);
  isolate_credential_out->swap(isolate_credential);
}

void ChapsAdaptor::CloseIsolate(const vector<uint8_t>& isolate_credential) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  if (token_manager_)
    token_manager_->CloseIsolate(isolate_credential_blob);
}

void ChapsAdaptor::LoadToken(const vector<uint8_t>& isolate_credential,
                             const string& path,
                             const vector<uint8_t>& auth_data,
                             const string& label,
                             uint64_t* slot_id,
                             bool* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  SecureBlob auth_data_blob(auth_data.begin(), auth_data.end());
  if (token_manager_)
    *result = token_manager_->LoadToken(isolate_credential_blob,
                                        FilePath(path),
                                        auth_data_blob,
                                        label,
                                        PreservedValue<uint64_t, int>(slot_id));
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  ClearVector(const_cast<vector<uint8_t>*>(&auth_data));
}

void ChapsAdaptor::UnloadToken(const vector<uint8_t>& isolate_credential,
                               const string& path) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  if (token_manager_)
    token_manager_->UnloadToken(isolate_credential_blob, FilePath(path));
}

void ChapsAdaptor::ChangeTokenAuthData(const string& path,
                                       const vector<uint8_t>& old_auth_data,
                                       const vector<uint8_t>& new_auth_data) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  if (token_manager_)
    token_manager_->ChangeTokenAuthData(
        FilePath(path),
        SecureBlob(old_auth_data.begin(), old_auth_data.end()),
        SecureBlob(new_auth_data.begin(), new_auth_data.end()));
  ClearVector(const_cast<vector<uint8_t>*>(&old_auth_data));
  ClearVector(const_cast<vector<uint8_t>*>(&new_auth_data));
}

void ChapsAdaptor::GetTokenPath(const std::vector<uint8_t>& isolate_credential,
                                uint64_t slot_id,
                                std::string* path,
                                bool* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  if (token_manager_) {
    FilePath tmp;
    *result = token_manager_->GetTokenPath(isolate_credential_blob,
                                           slot_id,
                                           &tmp);
    *path = tmp.value();
  }
}

void ChapsAdaptor::SetLogLevel(const int32_t& level) {
  logging::SetMinLogLevel(level);
}

void ChapsAdaptor::GetSlotList(const vector<uint8_t>& isolate_credential,
                               bool token_present,
                               vector<uint64_t>* slot_list,
                               uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "token_present=" << token_present;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->GetSlotList(isolate_credential_blob, token_present,
                                  slot_list);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "slot_list="
                                << PrintIntVector(*slot_list);
}

void ChapsAdaptor::GetSlotInfo(const vector<uint8_t>& isolate_credential,
                               uint64_t slot_id,
                               SlotInfo* slot_info,
                               uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "slot_id=" << slot_id;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->GetSlotInfo(isolate_credential_blob,
                                  slot_id,
                                  slot_info);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "slot_description="
                                << slot_info->slot_description();
}

void ChapsAdaptor::GetTokenInfo(const vector<uint8_t>& isolate_credential,
                                uint64_t slot_id,
                                TokenInfo* token_info,
                                uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "slot_id=" << slot_id;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->GetTokenInfo(isolate_credential_blob,
                                   slot_id,
                                   token_info);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "label=" << token_info->label();
}

void ChapsAdaptor::GetMechanismList(const vector<uint8_t>& isolate_credential,
                                    uint64_t slot_id,
                                    vector<uint64_t>* mechanism_list,
                                    uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "slot_id=" << slot_id;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->GetMechanismList(isolate_credential_blob,
                                       slot_id,
                                       mechanism_list);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "mechanism_list="
                                << PrintIntVector(*mechanism_list);
}

void ChapsAdaptor::GetMechanismInfo(const vector<uint8_t>& isolate_credential,
                                    uint64_t slot_id,
                                    uint64_t mechanism_type,
                                    MechanismInfo* mechanism_info,
                                    uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "slot_id=" << slot_id;
  VLOG(2) << "IN: " << "mechanism_type=" << mechanism_type;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->GetMechanismInfo(isolate_credential_blob,
                                       slot_id,
                                       mechanism_type,
                                       mechanism_info);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "min_key_size="
                                << mechanism_info->min_key_size();
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "max_key_size="
                                << mechanism_info->max_key_size();
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "flags="
                                << mechanism_info->flags();
}

uint32_t ChapsAdaptor::InitToken(const vector<uint8_t>& isolate_credential,
                                 uint64_t slot_id,
                                 bool use_null_pin,
                                 const string& optional_so_pin,
                                 const vector<uint8_t>& new_token_label) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "slot_id=" << slot_id;
  VLOG(2) << "IN: " << "new_token_label="
                    << ConvertByteVectorToString(new_token_label);
  const string* tmp_pin = use_null_pin ? NULL : &optional_so_pin;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->InitToken(isolate_credential_blob,
                             slot_id,
                             tmp_pin,
                             new_token_label);
}

uint32_t ChapsAdaptor::InitPIN(const vector<uint8_t>& isolate_credential,
                               uint64_t session_id,
                               bool use_null_pin,
                               const string& optional_user_pin) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "use_null_pin=" << use_null_pin;
  const string* tmp_pin = use_null_pin ? NULL : &optional_user_pin;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->InitPIN(isolate_credential_blob,
                           session_id,
                           tmp_pin);
}

uint32_t ChapsAdaptor::SetPIN(const vector<uint8_t>& isolate_credential,
                              uint64_t session_id,
                              bool use_null_old_pin,
                              const string& optional_old_pin,
                              bool use_null_new_pin,
                              const string& optional_new_pin) {
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "use_null_old_pin=" << use_null_old_pin;
  VLOG(2) << "IN: " << "use_null_new_pin=" << use_null_new_pin;
  const string* tmp_old_pin = use_null_old_pin ? NULL : &optional_old_pin;
  const string* tmp_new_pin = use_null_new_pin ? NULL : &optional_new_pin;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->SetPIN(isolate_credential_blob,
                          session_id,
                          tmp_old_pin,
                          tmp_new_pin);
}

void ChapsAdaptor::OpenSession(const vector<uint8_t>& isolate_credential,
                               uint64_t slot_id,
                               uint64_t flags,
                               uint64_t* session_id,
                               uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "slot_id=" << slot_id;
  VLOG(2) << "IN: " << "flags=" << flags;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->OpenSession(isolate_credential_blob,
                                  slot_id,
                                  flags,
                                  session_id);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "session_id=" << session_id;
}

uint32_t ChapsAdaptor::CloseSession(const vector<uint8_t>& isolate_credential,
                                    uint64_t session_id) {
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->CloseSession(isolate_credential_blob,
                                session_id);
}

uint32_t ChapsAdaptor::CloseAllSessions(
    const vector<uint8_t>& isolate_credential,
    uint64_t slot_id) {
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "slot_id=" << slot_id;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->CloseAllSessions(
      isolate_credential_blob,
      slot_id);
}

void ChapsAdaptor::GetSessionInfo(const vector<uint8_t>& isolate_credential,
                                  uint64_t session_id,
                                  SessionInfo* session_info,
                                  uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->GetSessionInfo(isolate_credential_blob,
                                     session_id,
                                     session_info);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "slot_id="
                                << session_info->slot_id();
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "state=" << session_info->state();
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "flags=" << session_info->flags();
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "device_error="
                                << session_info->device_error();
}

void ChapsAdaptor::GetOperationState(const vector<uint8_t>& isolate_credential,
                                     uint64_t session_id,
                                     vector<uint8_t>* operation_state,
                                     uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->GetOperationState(isolate_credential_blob,
                                        session_id,
                                        operation_state);
}

uint32_t ChapsAdaptor::SetOperationState(
      const vector<uint8_t>& isolate_credential,
      uint64_t session_id,
      const vector<uint8_t>& operation_state,
      uint64_t encryption_key_handle,
      uint64_t authentication_key_handle) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->SetOperationState(isolate_credential_blob,
                                     session_id,
                                     operation_state,
                                     encryption_key_handle,
                                     authentication_key_handle);
}

uint32_t ChapsAdaptor::Login(const vector<uint8_t>& isolate_credential,
                             uint64_t session_id,
                             uint64_t user_type,
                             bool use_null_pin,
                             const string& optional_pin) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "user_type=" << user_type;
  VLOG(2) << "IN: " << "use_null_pin=" << use_null_pin;
  const string* pin = use_null_pin ? NULL : &optional_pin;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->Login(isolate_credential_blob,
                         session_id,
                         user_type,
                         pin);
}

uint32_t ChapsAdaptor::Logout(const vector<uint8_t>& isolate_credential,
                              uint64_t session_id) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->Logout(isolate_credential_blob,
                          session_id);
}

void ChapsAdaptor::CreateObject(
      const vector<uint8_t>& isolate_credential,
      uint64_t session_id,
      const vector<uint8_t>& attributes,
      uint64_t* new_object_handle,
      uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "attributes=" << PrintAttributes(attributes, true);
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->CreateObject(isolate_credential_blob,
                                   session_id,
                                   attributes,
                                   new_object_handle);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "new_object_handle="
                                << new_object_handle;
}

void ChapsAdaptor::CopyObject(
      const vector<uint8_t>& isolate_credential,
      uint64_t session_id,
      uint64_t object_handle,
      const vector<uint8_t>& attributes,
      uint64_t* new_object_handle,
      uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "object_handle=" << object_handle;
  VLOG(2) << "IN: " << "attributes=" << PrintAttributes(attributes, true);
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->CopyObject(isolate_credential_blob,
                                 session_id,
                                 object_handle,
                                 attributes,
                                 new_object_handle);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "new_object_handle="
                                << new_object_handle;
}

uint32_t ChapsAdaptor::DestroyObject(const vector<uint8_t>& isolate_credential,
                                     uint64_t session_id,
                                     uint64_t object_handle) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "object_handle=" << object_handle;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->DestroyObject(isolate_credential_blob,
                                 session_id,
                                 object_handle);
}

void ChapsAdaptor::GetObjectSize(const vector<uint8_t>& isolate_credential,
                                 uint64_t session_id,
                                 uint64_t object_handle,
                                 uint64_t* object_size,
                                 uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "object_handle=" << object_handle;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->GetObjectSize(isolate_credential_blob,
                                    session_id,
                                    object_handle,
                                    object_size);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "object_size=" << object_size;
}

void ChapsAdaptor::GetAttributeValue(const vector<uint8_t>& isolate_credential,
                                     uint64_t session_id,
                                     uint64_t object_handle,
                                     const vector<uint8_t>& attributes_in,
                                     vector<uint8_t>* attributes_out,
                                     uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "object_handle=" << object_handle;
  VLOG(2) << "IN: " << "attributes_in="
                    << PrintAttributes(attributes_in, false);
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->GetAttributeValue(isolate_credential_blob,
                                        session_id,
                                        object_handle,
                                        attributes_in,
                                        attributes_out);
  VLOG_IF(2, *result == CKR_OK || *result == CKR_ATTRIBUTE_TYPE_INVALID)
      << "OUT: " << "attributes_out=" << PrintAttributes(*attributes_out, true);
}

uint32_t ChapsAdaptor::SetAttributeValue(
    const vector<uint8_t>& isolate_credential,
    uint64_t session_id,
    uint64_t object_handle,
    const vector<uint8_t>& attributes) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "object_handle=" << object_handle;
  VLOG(2) << "IN: " << "attributes=" << PrintAttributes(attributes, true);
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->SetAttributeValue(isolate_credential_blob,
                                     session_id,
                                     object_handle,
                                     attributes);
}

uint32_t ChapsAdaptor::FindObjectsInit(
    const vector<uint8_t>& isolate_credential,
    uint64_t session_id,
    const vector<uint8_t>& attributes) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "attributes=" << PrintAttributes(attributes, true);
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->FindObjectsInit(isolate_credential_blob,
                                   session_id,
                                   attributes);
}

void ChapsAdaptor::FindObjects(const vector<uint8_t>& isolate_credential,
                               uint64_t session_id,
                               uint64_t max_object_count,
                               vector<uint64_t>* object_list,
                               uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "max_object_count=" << max_object_count;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->FindObjects(isolate_credential_blob,
                                  session_id,
                                  max_object_count,
                                  object_list);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "object_list="
                                << PrintIntVector(*object_list);
}

uint32_t ChapsAdaptor::FindObjectsFinal(
    const vector<uint8_t>& isolate_credential,
    uint64_t session_id) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->FindObjectsFinal(isolate_credential_blob, session_id);
}

uint32_t ChapsAdaptor::EncryptInit(
    const vector<uint8_t>& isolate_credential,
    uint64_t session_id,
    uint64_t mechanism_type,
    const vector<uint8_t>& mechanism_parameter,
    uint64_t key_handle) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "mechanism_type=" << mechanism_type;
  VLOG(2) << "IN: " << "mechanism_parameter="
          << PrintIntVector(mechanism_parameter);
  VLOG(2) << "IN: " << "key_handle=" << key_handle;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->EncryptInit(isolate_credential_blob,
                               session_id,
                               mechanism_type,
                               mechanism_parameter,
                               key_handle);
}

void ChapsAdaptor::Encrypt(const vector<uint8_t>& 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,
                           uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "max_out_length=" << max_out_length;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->Encrypt(isolate_credential_blob,
                              session_id,
                              data_in,
                              max_out_length,
                              actual_out_length,
                              data_out);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "actual_out_length="
                                << actual_out_length;
}

void ChapsAdaptor::EncryptUpdate(const vector<uint8_t>& 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,
                                 uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "max_out_length=" << max_out_length;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->EncryptUpdate(isolate_credential_blob,
                                    session_id,
                                    data_in,
                                    max_out_length,
                                    actual_out_length,
                                    data_out);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "actual_out_length="
                                << actual_out_length;
}

void ChapsAdaptor::EncryptFinal(const vector<uint8_t>& isolate_credential,
                                uint64_t session_id,
                                uint64_t max_out_length,
                                uint64_t* actual_out_length,
                                vector<uint8_t>* data_out,
                                uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "max_out_length=" << max_out_length;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->EncryptFinal(isolate_credential_blob,
                                   session_id,
                                   max_out_length,
                                   actual_out_length,
                                   data_out);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "actual_out_length="
                                << actual_out_length;
}

void ChapsAdaptor::EncryptCancel(const vector<uint8_t>& isolate_credential,
                                 uint64_t session_id) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  service_->EncryptCancel(isolate_credential_blob, session_id);
}

uint32_t ChapsAdaptor::DecryptInit(
    const vector<uint8_t>& isolate_credential,
    uint64_t session_id,
    uint64_t mechanism_type,
    const vector<uint8_t>& mechanism_parameter,
    uint64_t key_handle) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "mechanism_type=" << mechanism_type;
  VLOG(2) << "IN: " << "mechanism_parameter="
          << PrintIntVector(mechanism_parameter);
  VLOG(2) << "IN: " << "key_handle=" << key_handle;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->DecryptInit(isolate_credential_blob,
                               session_id,
                               mechanism_type,
                               mechanism_parameter,
                               key_handle);
}

void ChapsAdaptor::Decrypt(const vector<uint8_t>& 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,
                           uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "max_out_length=" << max_out_length;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->Decrypt(isolate_credential_blob,
                              session_id,
                              data_in,
                              max_out_length,
                              actual_out_length,
                              data_out);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "actual_out_length="
                                << actual_out_length;
}

void ChapsAdaptor::DecryptUpdate(const vector<uint8_t>& 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,
                                 uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "max_out_length=" << max_out_length;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->DecryptUpdate(isolate_credential_blob,
                                    session_id,
                                    data_in,
                                    max_out_length,
                                    actual_out_length,
                                    data_out);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "actual_out_length="
                                << actual_out_length;
}

void ChapsAdaptor::DecryptFinal(const vector<uint8_t>& isolate_credential,
                                uint64_t session_id,
                                uint64_t max_out_length,
                                uint64_t* actual_out_length,
                                vector<uint8_t>* data_out,
                                uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "max_out_length=" << max_out_length;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->DecryptFinal(isolate_credential_blob,
                                   session_id,
                                   max_out_length,
                                   actual_out_length,
                                   data_out);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "actual_out_length="
                                << actual_out_length;
}

void ChapsAdaptor::DecryptCancel(const vector<uint8_t>& isolate_credential,
                                 uint64_t session_id) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  service_->DecryptCancel(isolate_credential_blob, session_id);
}

uint32_t ChapsAdaptor::DigestInit(
    const vector<uint8_t>& isolate_credential,
    uint64_t session_id,
    uint64_t mechanism_type,
    const vector<uint8_t>& mechanism_parameter) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "mechanism_type=" << mechanism_type;
  VLOG(2) << "IN: " << "mechanism_parameter="
          << PrintIntVector(mechanism_parameter);
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->DigestInit(isolate_credential_blob,
                              session_id,
                              mechanism_type,
                              mechanism_parameter);
}

void ChapsAdaptor::Digest(const vector<uint8_t>& 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) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "max_out_length=" << max_out_length;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->Digest(isolate_credential_blob,
                             session_id,
                             data_in,
                             max_out_length,
                             actual_out_length,
                             digest);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "actual_out_length="
                                << actual_out_length;
}

uint32_t ChapsAdaptor::DigestUpdate(const vector<uint8_t>& isolate_credential,
                                    uint64_t session_id,
                                    const vector<uint8_t>& data_in) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->DigestUpdate(isolate_credential_blob,
                                session_id,
                                data_in);
}

uint32_t ChapsAdaptor::DigestKey(const vector<uint8_t>& isolate_credential,
                                 uint64_t session_id,
                                 uint64_t key_handle) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "key_handle=" << key_handle;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->DigestKey(isolate_credential_blob,
                             session_id,
                             key_handle);
}

void ChapsAdaptor::DigestFinal(const vector<uint8_t>& isolate_credential,
                               uint64_t session_id,
                               uint64_t max_out_length,
                               uint64_t* actual_out_length,
                               vector<uint8_t>* digest,
                               uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "max_out_length=" << max_out_length;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->DigestFinal(isolate_credential_blob,
                                  session_id,
                                  max_out_length,
                                  actual_out_length,
                                  digest);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "actual_out_length="
                                << actual_out_length;
}

void ChapsAdaptor::DigestCancel(const vector<uint8_t>& isolate_credential,
                                uint64_t session_id) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  service_->DigestCancel(isolate_credential_blob, session_id);
}

uint32_t ChapsAdaptor::SignInit(const vector<uint8_t>& isolate_credential,
                                uint64_t session_id,
                                uint64_t mechanism_type,
                                const vector<uint8_t>& mechanism_parameter,
                                uint64_t key_handle) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "mechanism_type=" << mechanism_type;
  VLOG(2) << "IN: " << "mechanism_parameter="
          << PrintIntVector(mechanism_parameter);
  VLOG(2) << "IN: " << "key_handle=" << key_handle;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->SignInit(isolate_credential_blob,
                            session_id,
                            mechanism_type,
                            mechanism_parameter,
                            key_handle);
}

void ChapsAdaptor::Sign(const vector<uint8_t>& 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) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "max_out_length=" << max_out_length;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->Sign(isolate_credential_blob,
                           session_id,
                           data,
                           max_out_length,
                           actual_out_length,
                           signature);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "actual_out_length="
                               << actual_out_length;
}

uint32_t ChapsAdaptor::SignUpdate(const vector<uint8_t>& isolate_credential,
                                  uint64_t session_id,
                                  const vector<uint8_t>& data_part) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->SignUpdate(isolate_credential_blob,
                              session_id,
                              data_part);
}

void ChapsAdaptor::SignFinal(const vector<uint8_t>& isolate_credential,
                             uint64_t session_id,
                             uint64_t max_out_length,
                             uint64_t* actual_out_length,
                             vector<uint8_t>* signature,
                             uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "max_out_length=" << max_out_length;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->SignFinal(isolate_credential_blob,
                                session_id,
                                max_out_length,
                                actual_out_length,
                                signature);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "actual_out_length="
                                << actual_out_length;
}

void ChapsAdaptor::SignCancel(const vector<uint8_t>& isolate_credential,
                              uint64_t session_id) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  service_->SignCancel(isolate_credential_blob, session_id);
}

uint32_t ChapsAdaptor::SignRecoverInit(
      const vector<uint8_t>& isolate_credential,
      uint64_t session_id,
      uint64_t mechanism_type,
      const vector<uint8_t>& mechanism_parameter,
      uint64_t key_handle) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "mechanism_type=" << mechanism_type;
  VLOG(2) << "IN: " << "mechanism_parameter="
          << PrintIntVector(mechanism_parameter);
  VLOG(2) << "IN: " << "key_handle=" << key_handle;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->SignRecoverInit(isolate_credential_blob,
                                   session_id,
                                   mechanism_type,
                                   mechanism_parameter,
                                   key_handle);
}

void ChapsAdaptor::SignRecover(const vector<uint8_t>& 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) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "max_out_length=" << max_out_length;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->SignRecover(isolate_credential_blob,
                                  session_id,
                                  data,
                                  max_out_length,
                                  actual_out_length,
                                  signature);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "actual_out_length="
                                << actual_out_length;
}

uint32_t ChapsAdaptor::VerifyInit(const vector<uint8_t>& isolate_credential,
                                  uint64_t session_id,
                                  uint64_t mechanism_type,
                                  const vector<uint8_t>& mechanism_parameter,
                                  uint64_t key_handle) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "mechanism_type=" << mechanism_type;
  VLOG(2) << "IN: " << "mechanism_parameter="
          << PrintIntVector(mechanism_parameter);
  VLOG(2) << "IN: " << "key_handle=" << key_handle;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->VerifyInit(isolate_credential_blob,
                              session_id,
                              mechanism_type,
                              mechanism_parameter,
                              key_handle);
}

uint32_t ChapsAdaptor::Verify(const vector<uint8_t>& isolate_credential,
                              uint64_t session_id,
                              const vector<uint8_t>& data,
                              const vector<uint8_t>& signature) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->Verify(isolate_credential_blob,
                          session_id,
                          data,
                          signature);
}

uint32_t ChapsAdaptor::VerifyUpdate(const vector<uint8_t>& isolate_credential,
                                    uint64_t session_id,
                                    const vector<uint8_t>& data_part) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->VerifyUpdate(isolate_credential_blob,
                                session_id,
                                data_part);
}

uint32_t ChapsAdaptor::VerifyFinal(const vector<uint8_t>& isolate_credential,
                                   uint64_t session_id,
                                   const vector<uint8_t>& signature) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->VerifyFinal(isolate_credential_blob,
                               session_id,
                               signature);
}

void ChapsAdaptor::VerifyCancel(const vector<uint8_t>& isolate_credential,
                                uint64_t session_id) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  service_->VerifyCancel(isolate_credential_blob, session_id);
}

uint32_t ChapsAdaptor::VerifyRecoverInit(
      const vector<uint8_t>& isolate_credential,
      uint64_t session_id,
      uint64_t mechanism_type,
      const vector<uint8_t>& mechanism_parameter,
      uint64_t key_handle) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "mechanism_type=" << mechanism_type;
  VLOG(2) << "IN: " << "mechanism_parameter="
          << PrintIntVector(mechanism_parameter);
  VLOG(2) << "IN: " << "key_handle=" << key_handle;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->VerifyRecoverInit(isolate_credential_blob,
                                     session_id,
                                     mechanism_type,
                                     mechanism_parameter,
                                     key_handle);
}

void ChapsAdaptor::VerifyRecover(const vector<uint8_t>& 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) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "max_out_length=" << max_out_length;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->VerifyRecover(isolate_credential_blob,
                                    session_id,
                                    signature,
                                    max_out_length,
                                    actual_out_length,
                                    data);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "actual_out_length="
                                << actual_out_length;
}


void ChapsAdaptor::DigestEncryptUpdate(
    const vector<uint8_t>& 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,
    uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "max_out_length=" << max_out_length;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->DigestEncryptUpdate(isolate_credential_blob,
                                          session_id,
                                          data_in,
                                          max_out_length,
                                          actual_out_length,
                                          data_out);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "actual_out_length="
                                << actual_out_length;
}

void ChapsAdaptor::DecryptDigestUpdate(
    const vector<uint8_t>& 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,
    uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "max_out_length=" << max_out_length;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->DecryptDigestUpdate(isolate_credential_blob,
                                          session_id,
                                          data_in,
                                          max_out_length,
                                          actual_out_length,
                                          data_out);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "actual_out_length="
                                << actual_out_length;
}

void ChapsAdaptor::SignEncryptUpdate(const vector<uint8_t>& 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,
                                     uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "max_out_length=" << max_out_length;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->SignEncryptUpdate(isolate_credential_blob,
                                        session_id,
                                        data_in,
                                        max_out_length,
                                        actual_out_length,
                                        data_out);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "actual_out_length="
                                << actual_out_length;
}

void ChapsAdaptor::DecryptVerifyUpdate(
    const vector<uint8_t>& 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,
    uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "max_out_length=" << max_out_length;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->DecryptVerifyUpdate(isolate_credential_blob,
                                          session_id,
                                          data_in,
                                          max_out_length,
                                          actual_out_length,
                                          data_out);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "actual_out_length="
                                << actual_out_length;
}

void ChapsAdaptor::GenerateKey(
    const vector<uint8_t>& 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,
    uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "mechanism_type=" << mechanism_type;
  VLOG(2) << "IN: " << "mechanism_parameter="
          << PrintIntVector(mechanism_parameter);
  VLOG(2) << "IN: " << "attributes=" << PrintAttributes(attributes, true);
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->GenerateKey(isolate_credential_blob,
                                  session_id,
                                  mechanism_type,
                                  mechanism_parameter,
                                  attributes,
                                  key_handle);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "key_handle=" << key_handle;
}

void ChapsAdaptor::GenerateKeyPair(
    const vector<uint8_t>& 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,
    uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "mechanism_type=" << mechanism_type;
  VLOG(2) << "IN: " << "mechanism_parameter="
          << PrintIntVector(mechanism_parameter);
  VLOG(2) << "IN: " << "public_attributes="
          << PrintAttributes(public_attributes, true);
  VLOG(2) << "IN: " << "private_attributes="
          << PrintAttributes(private_attributes, true);
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->GenerateKeyPair(isolate_credential_blob,
                                      session_id,
                                      mechanism_type,
                                      mechanism_parameter,
                                      public_attributes,
                                      private_attributes,
                                      public_key_handle,
                                      private_key_handle);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "public_key_handle="
                                << public_key_handle;
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "private_key_handle="
                                << private_key_handle;
}

void ChapsAdaptor::WrapKey(const vector<uint8_t>& 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,
                           uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "mechanism_type=" << mechanism_type;
  VLOG(2) << "IN: " << "mechanism_parameter="
          << PrintIntVector(mechanism_parameter);
  VLOG(2) << "IN: " << "wrapping_key_handle=" << wrapping_key_handle;
  VLOG(2) << "IN: " << "key_handle=" << key_handle;
  VLOG(2) << "IN: " << "max_out_length=" << max_out_length;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->WrapKey(isolate_credential_blob,
                              session_id,
                              mechanism_type,
                              mechanism_parameter,
                              wrapping_key_handle,
                              key_handle,
                              max_out_length,
                              actual_out_length,
                              wrapped_key);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "actual_out_length="
                                << actual_out_length;
}

void ChapsAdaptor::UnwrapKey(const vector<uint8_t>& isolate_credential,
                             uint64_t session_id,
                             uint64_t mechanism_type,
                             const vector<uint8_t>& mechanism_parameter,
                             uint64_t wrapping_key_handle,
                             const vector<uint8_t>& wrapped_key,
                             const vector<uint8_t>& attributes,
                             uint64_t* key_handle,
                             uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "mechanism_type=" << mechanism_type;
  VLOG(2) << "IN: " << "mechanism_parameter="
          << PrintIntVector(mechanism_parameter);
  VLOG(2) << "IN: " << "wrapping_key_handle=" << wrapping_key_handle;
  VLOG(2) << "IN: " << "attributes=" << PrintAttributes(attributes, true);
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->UnwrapKey(isolate_credential_blob,
                                session_id,
                                mechanism_type,
                                mechanism_parameter,
                                wrapping_key_handle,
                                wrapped_key,
                                attributes,
                                key_handle);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "key_handle=" << key_handle;
}

void ChapsAdaptor::DeriveKey(const vector<uint8_t>& 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,
                             uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "mechanism_type=" << mechanism_type;
  VLOG(2) << "IN: " << "mechanism_parameter="
          << PrintIntVector(mechanism_parameter);
  VLOG(2) << "IN: " << "base_key_handle=" << base_key_handle;
  VLOG(2) << "IN: " << "attributes=" << PrintAttributes(attributes, true);
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->DeriveKey(isolate_credential_blob,
                                session_id,
                                mechanism_type,
                                mechanism_parameter,
                                base_key_handle,
                                attributes,
                                key_handle);
  VLOG_IF(2, *result == CKR_OK) << "OUT: " << "key_handle=" << key_handle;
}

uint32_t ChapsAdaptor::SeedRandom(const vector<uint8_t>& isolate_credential,
                                  uint64_t session_id,
                                  const vector<uint8_t>& seed) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "num_bytes=" << seed.size();
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  return service_->SeedRandom(isolate_credential_blob,
                              session_id,
                              seed);
}

void ChapsAdaptor::GenerateRandom(const vector<uint8_t>& isolate_credential,
                                  uint64_t session_id,
                                  uint64_t num_bytes,
                                  vector<uint8_t>* random_data,
                                  uint32_t* result) {
  AutoLock lock(*lock_);
  VLOG(1) << "CALL: " << __func__;
  VLOG(2) << "IN: " << "session_id=" << session_id;
  VLOG(2) << "IN: " << "num_bytes=" << num_bytes;
  SecureBlob isolate_credential_blob(isolate_credential.begin(),
                                     isolate_credential.end());
  ClearVector(const_cast<vector<uint8_t>*>(&isolate_credential));
  *result = service_->GenerateRandom(isolate_credential_blob,
                                     session_id,
                                     num_bytes,
                                     random_data);
}

}  // namespace chaps
